From 8abffb421939fe787dad921e8027f0269639e5fc Mon Sep 17 00:00:00 2001 From: pjshy Date: Thu, 26 Dec 2019 18:44:50 +0800 Subject: [PATCH 1/4] chore: upgrade dev tools --- .eslintignore | 3 + .eslintrc.yml | 51 + .gitignore | 1 + babel.config.js | 5 +- commitlint.config.js | 3 + example/demo.js | 38 + index.html => example/index.html | 0 package.json | 51 +- src/cm/keymap_vim.js | 5696 ++++++++++++++++-------------- src/cm_adapter.js | 969 ++--- src/demo.js | 38 - src/index.js | 53 - src/index.ts | 53 + src/statusbar.js | 148 +- tools/eslint-pre-commit.js | 0 tsconfig.json | 50 + webpack.config.js | 119 +- yarn.lock | 3095 ++++++++++------ 18 files changed, 6005 insertions(+), 4368 deletions(-) create mode 100644 .eslintignore create mode 100644 .eslintrc.yml create mode 100644 commitlint.config.js create mode 100644 example/demo.js rename index.html => example/index.html (100%) delete mode 100644 src/demo.js delete mode 100644 src/index.js create mode 100644 src/index.ts create mode 100644 tools/eslint-pre-commit.js create mode 100644 tsconfig.json diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..468bb89 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,3 @@ +node_modules +dist +lib diff --git a/.eslintrc.yml b/.eslintrc.yml new file mode 100644 index 0000000..6f7c658 --- /dev/null +++ b/.eslintrc.yml @@ -0,0 +1,51 @@ +parser: '@typescript-eslint/parser' + +parserOptions: + ecmaVersion: 2018 + sourceType: module + +env: + browser: true + es6: true + node: true + mocha: true + +plugins: + - import + +extends: + - eslint:recommended + - plugin:prettier/recommended + +globals: + monaco: readonly + +rules: + # 0 = off, 1 = warn, 2 = error + 'space-before-function-paren': 0 + 'no-useless-constructor': 2 + 'no-undef': 2 + 'no-console': [2, { allow: ['error', 'warn', 'info']}] + 'comma-dangle': ['error', 'only-multiline'] + 'no-unused-vars': 0 + 'no-var': 2 + 'one-var-declaration-per-line': 2 + 'prefer-const': 2 + 'no-const-assign': 2 + 'no-duplicate-imports': 2 + 'no-use-before-define': [2, { 'functions': false, 'classes': false }] + 'eqeqeq': [2, 'always', { 'null': 'ignore' }] + 'no-case-declarations': 0 + 'no-restricted-syntax': [2, { + 'selector': 'BinaryExpression[operator=/(==|===|!=|!==)/][left.raw=true], BinaryExpression[operator=/(==|===|!=|!==)/][right.raw=true]', + 'message': Don't compare for equality against boolean literals + }] + + 'import/first': 2 + 'import/newline-after-import': 2 + + 'sonarjs/cognitive-complexity': 0 + 'sonarjs/no-duplicate-string': 0 + 'sonarjs/no-big-function': 0 + 'sonarjs/no-identical-functions': 0 + 'sonarjs/no-small-switch': 0 diff --git a/.gitignore b/.gitignore index cabff5e..54cf279 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ dist/ *.log lib/ local/ +.cache-eslint/ diff --git a/babel.config.js b/babel.config.js index 566f36d..8ab2e22 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,7 +1,4 @@ module.exports = { presets: ['@babel/preset-env'], - plugins: [ - '@babel/plugin-syntax-dynamic-import', - 'transform-class-properties', - ] + plugins: ['@babel/plugin-syntax-dynamic-import', 'transform-class-properties'], } diff --git a/commitlint.config.js b/commitlint.config.js new file mode 100644 index 0000000..98ee7df --- /dev/null +++ b/commitlint.config.js @@ -0,0 +1,3 @@ +module.exports = { + extends: ['@commitlint/config-conventional'], +} diff --git a/example/demo.js b/example/demo.js new file mode 100644 index 0000000..3971021 --- /dev/null +++ b/example/demo.js @@ -0,0 +1,38 @@ +import * as monaco from 'monaco-editor' + +import { initVimMode } from '../src' + +const editorNode = document.getElementById('editor1') +const statusNode = document.getElementById('status1') +const editor = monaco.editor.create(editorNode, { + value: [1, 2, 3, 4, 5, 6, 7, 8].map((t) => 'import').join('\n'), + minimap: { + enabled: false, + }, + theme: 'vs', + language: 'javascript', + fontSize: 15, + scrollBeyondLastLine: false, +}) +editor.focus() +const vimMode = initVimMode(editor, statusNode) + +const editorNode2 = document.getElementById('editor2') +const statusNode2 = document.getElementById('status2') +const editor2 = monaco.editor.create(editorNode2, { + value: [1, 2, 3, 4, 5, 6, 7, 8].map((t) => 'import').join('\n'), + minimap: { + enabled: false, + }, + theme: 'vs', + language: 'javascript', + fontSize: 15, + scrollBeyondLastLine: false, +}) +editor.focus() +const vimMode2 = initVimMode(editor2, statusNode2) + +window.editor = editor +window.vimMode = vimMode +window.editor2 = editor +window.vimMode2 = vimMode2 diff --git a/index.html b/example/index.html similarity index 100% rename from index.html rename to example/index.html diff --git a/package.json b/package.json index 694f43b..1aab40d 100644 --- a/package.json +++ b/package.json @@ -4,12 +4,12 @@ "description": "Vim keybindings for monaco-editor", "main": "./lib/index.js", "scripts": { - "test": "echo \"No test in this repo\"", "start": "webpack-dev-server --mode development --host=0.0.0.0 --port=8080", + "lint": "eslint . --ext .js,.ts --cache --cache-location ./.cache-eslint/", "clean": "rm -rf lib dist local", "dist": "webpack --mode production", "babel": "NODE_ENV=production babel ./src -d lib --ignore src/demo.js", - "build": "npm run clean && npm run babel && npm run dist", + "build": "npm run clean && tsc && npm run dist", "local": "mkdir -p local && cp -r lib dist package.json local", "prepublishOnly": "npm run build" }, @@ -28,22 +28,51 @@ "author": "Brijesh Bittu (http://bitwiser.in/)", "license": "MIT", "devDependencies": { - "@babel/cli": "^7.7.0", - "@babel/core": "^7.7.2", - "@babel/plugin-syntax-dynamic-import": "^7.2.0", - "@babel/preset-env": "^7.7.1", - "babel-loader": "^8.0.6", - "babel-plugin-transform-class-properties": "^6.24.1", + "@commitlint/cli": "^8.2.0", + "@commitlint/config-conventional": "^8.2.0", + "@typescript-eslint/eslint-plugin": "^2.13.0", + "@typescript-eslint/parser": "^2.13.0", "css-loader": "^3.2.0", + "eslint": "^6.8.0", + "eslint-config-prettier": "^6.8.0", + "eslint-plugin-import": "^2.19.1", + "eslint-plugin-prettier": "^3.1.2", + "file-loader": "^5.0.2", "html-webpack-plugin": "^3.2.0", - "monaco-editor": "0.18.1", - "monaco-editor-webpack-plugin": "^1.7.0", + "husky": "^3.1.0", + "lint-staged": "^9.5.0", + "monaco-editor": "0.19.0", + "monaco-editor-webpack-plugin": "^1.8.1", + "prettier": "^1.19.1", "style-loader": "^1.0.0", + "ts-loader": "^6.2.1", + "typescript": "^3.7.4", "webpack": "^4.41.2", "webpack-cli": "^3.3.10", "webpack-dev-server": "^3.9.0" }, "peerDependencies": { - "monaco-editor": "^0.14.0 || ^0.15.0 || ^0.16.0 || ^0.17.0 || ^0.18.0" + "monaco-editor": "^0.19.0" + }, + "lint-staged": { + "*.@(ts|tsx|js|jsx)": [ + "prettier --write", + "yarn lint -- --fix", + "git add" + ] + }, + "prettier": { + "printWidth": 120, + "semi": false, + "trailingComma": "all", + "singleQuote": true, + "arrowParens": "always", + "parser": "typescript" + }, + "husky": { + "hooks": { + "commit-msg": "commitlint -E HUSKY_GIT_PARAMS", + "pre-commit": "lint-staged" + } } } diff --git a/src/cm/keymap_vim.js b/src/cm/keymap_vim.js index 18346af..6fdc180 100644 --- a/src/cm/keymap_vim.js +++ b/src/cm/keymap_vim.js @@ -38,7 +38,7 @@ * 9. Ex command implementations. */ -import CodeMirror from '../cm_adapter'; +import CodeMirror from '../cm_adapter' var defaultKeymap = [ // Key to key mapping. This goes first to make it possible to override @@ -48,7 +48,7 @@ var defaultKeymap = [ { keys: '', type: 'keyToKey', toKeys: 'k' }, { keys: '', type: 'keyToKey', toKeys: 'j' }, { keys: '', type: 'keyToKey', toKeys: 'l' }, - { keys: '', type: 'keyToKey', toKeys: 'h', context: 'normal'}, + { keys: '', type: 'keyToKey', toKeys: 'h', context: 'normal' }, { keys: '', type: 'keyToKey', toKeys: 'W' }, { keys: '', type: 'keyToKey', toKeys: 'B', context: 'normal' }, { keys: '', type: 'keyToKey', toKeys: 'w' }, @@ -60,7 +60,7 @@ var defaultKeymap = [ { keys: '', type: 'keyToKey', toKeys: '', context: 'insert' }, { keys: '', type: 'keyToKey', toKeys: '', context: 'insert' }, { keys: 's', type: 'keyToKey', toKeys: 'cl', context: 'normal' }, - { keys: 's', type: 'keyToKey', toKeys: 'c', context: 'visual'}, + { keys: 's', type: 'keyToKey', toKeys: 'c', context: 'visual' }, { keys: 'S', type: 'keyToKey', toKeys: 'cc', context: 'normal' }, { keys: 'S', type: 'keyToKey', toKeys: 'VdO', context: 'visual' }, { keys: '', type: 'keyToKey', toKeys: '0' }, @@ -71,139 +71,336 @@ var defaultKeymap = [ { keys: '', type: 'keyToKey', toKeys: 'j^', context: 'visual' }, { keys: '', type: 'action', action: 'toggleOverwrite', context: 'insert' }, // Motions - { keys: 'H', type: 'motion', motion: 'moveToTopLine', motionArgs: { linewise: true, toJumplist: true }}, - { keys: 'M', type: 'motion', motion: 'moveToMiddleLine', motionArgs: { linewise: true, toJumplist: true }}, - { keys: 'L', type: 'motion', motion: 'moveToBottomLine', motionArgs: { linewise: true, toJumplist: true }}, - { keys: 'h', type: 'motion', motion: 'moveByCharacters', motionArgs: { forward: false }}, - { keys: 'l', type: 'motion', motion: 'moveByCharacters', motionArgs: { forward: true }}, - { keys: 'j', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, linewise: true }}, - { keys: 'k', type: 'motion', motion: 'moveByLines', motionArgs: { forward: false, linewise: true }}, - { keys: 'gj', type: 'motion', motion: 'moveByDisplayLines', motionArgs: { forward: true }}, - { keys: 'gk', type: 'motion', motion: 'moveByDisplayLines', motionArgs: { forward: false }}, - { keys: 'w', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: false }}, - { keys: 'W', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: false, bigWord: true }}, - { keys: 'e', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: true, inclusive: true }}, - { keys: 'E', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: true, bigWord: true, inclusive: true }}, - { keys: 'b', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false }}, - { keys: 'B', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false, bigWord: true }}, - { keys: 'ge', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: true, inclusive: true }}, - { keys: 'gE', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: true, bigWord: true, inclusive: true }}, - { keys: '{', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: false, toJumplist: true }}, - { keys: '}', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: true, toJumplist: true }}, - { keys: '(', type: 'motion', motion: 'moveBySentence', motionArgs: { forward: false }}, - { keys: ')', type: 'motion', motion: 'moveBySentence', motionArgs: { forward: true }}, - { keys: '', type: 'motion', motion: 'moveByPage', motionArgs: { forward: true }}, - { keys: '', type: 'motion', motion: 'moveByPage', motionArgs: { forward: false }}, - { keys: '', type: 'motion', motion: 'moveByScroll', motionArgs: { forward: true, explicitRepeat: true }}, - { keys: '', type: 'motion', motion: 'moveByScroll', motionArgs: { forward: false, explicitRepeat: true }}, - { keys: 'gg', type: 'motion', motion: 'moveToLineOrEdgeOfDocument', motionArgs: { forward: false, explicitRepeat: true, linewise: true, toJumplist: true }}, - { keys: 'G', type: 'motion', motion: 'moveToLineOrEdgeOfDocument', motionArgs: { forward: true, explicitRepeat: true, linewise: true, toJumplist: true }}, + { keys: 'H', type: 'motion', motion: 'moveToTopLine', motionArgs: { linewise: true, toJumplist: true } }, + { keys: 'M', type: 'motion', motion: 'moveToMiddleLine', motionArgs: { linewise: true, toJumplist: true } }, + { keys: 'L', type: 'motion', motion: 'moveToBottomLine', motionArgs: { linewise: true, toJumplist: true } }, + { keys: 'h', type: 'motion', motion: 'moveByCharacters', motionArgs: { forward: false } }, + { keys: 'l', type: 'motion', motion: 'moveByCharacters', motionArgs: { forward: true } }, + { keys: 'j', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, linewise: true } }, + { keys: 'k', type: 'motion', motion: 'moveByLines', motionArgs: { forward: false, linewise: true } }, + { keys: 'gj', type: 'motion', motion: 'moveByDisplayLines', motionArgs: { forward: true } }, + { keys: 'gk', type: 'motion', motion: 'moveByDisplayLines', motionArgs: { forward: false } }, + { keys: 'w', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: false } }, + { keys: 'W', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: false, bigWord: true } }, + { keys: 'e', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: true, inclusive: true } }, + { + keys: 'E', + type: 'motion', + motion: 'moveByWords', + motionArgs: { forward: true, wordEnd: true, bigWord: true, inclusive: true }, + }, + { keys: 'b', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false } }, + { keys: 'B', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false, bigWord: true } }, + { keys: 'ge', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: true, inclusive: true } }, + { + keys: 'gE', + type: 'motion', + motion: 'moveByWords', + motionArgs: { forward: false, wordEnd: true, bigWord: true, inclusive: true }, + }, + { keys: '{', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: false, toJumplist: true } }, + { keys: '}', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: true, toJumplist: true } }, + { keys: '(', type: 'motion', motion: 'moveBySentence', motionArgs: { forward: false } }, + { keys: ')', type: 'motion', motion: 'moveBySentence', motionArgs: { forward: true } }, + { keys: '', type: 'motion', motion: 'moveByPage', motionArgs: { forward: true } }, + { keys: '', type: 'motion', motion: 'moveByPage', motionArgs: { forward: false } }, + { keys: '', type: 'motion', motion: 'moveByScroll', motionArgs: { forward: true, explicitRepeat: true } }, + { keys: '', type: 'motion', motion: 'moveByScroll', motionArgs: { forward: false, explicitRepeat: true } }, + { + keys: 'gg', + type: 'motion', + motion: 'moveToLineOrEdgeOfDocument', + motionArgs: { forward: false, explicitRepeat: true, linewise: true, toJumplist: true }, + }, + { + keys: 'G', + type: 'motion', + motion: 'moveToLineOrEdgeOfDocument', + motionArgs: { forward: true, explicitRepeat: true, linewise: true, toJumplist: true }, + }, { keys: '0', type: 'motion', motion: 'moveToStartOfLine' }, { keys: '^', type: 'motion', motion: 'moveToFirstNonWhiteSpaceCharacter' }, - { keys: '+', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, toFirstChar:true }}, - { keys: '-', type: 'motion', motion: 'moveByLines', motionArgs: { forward: false, toFirstChar:true }}, - { keys: '_', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, toFirstChar:true, repeatOffset:-1 }}, - { keys: '$', type: 'motion', motion: 'moveToEol', motionArgs: { inclusive: true }}, - { keys: '%', type: 'motion', motion: 'moveToMatchedSymbol', motionArgs: { inclusive: true, toJumplist: true }}, - { keys: 'f', type: 'motion', motion: 'moveToCharacter', motionArgs: { forward: true , inclusive: true }}, - { keys: 'F', type: 'motion', motion: 'moveToCharacter', motionArgs: { forward: false }}, - { keys: 't', type: 'motion', motion: 'moveTillCharacter', motionArgs: { forward: true, inclusive: true }}, - { keys: 'T', type: 'motion', motion: 'moveTillCharacter', motionArgs: { forward: false }}, - { keys: ';', type: 'motion', motion: 'repeatLastCharacterSearch', motionArgs: { forward: true }}, - { keys: ',', type: 'motion', motion: 'repeatLastCharacterSearch', motionArgs: { forward: false }}, - { keys: '\'', type: 'motion', motion: 'goToMark', motionArgs: {toJumplist: true, linewise: true}}, - { keys: '`', type: 'motion', motion: 'goToMark', motionArgs: {toJumplist: true}}, + { keys: '+', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, toFirstChar: true } }, + { keys: '-', type: 'motion', motion: 'moveByLines', motionArgs: { forward: false, toFirstChar: true } }, + { + keys: '_', + type: 'motion', + motion: 'moveByLines', + motionArgs: { forward: true, toFirstChar: true, repeatOffset: -1 }, + }, + { keys: '$', type: 'motion', motion: 'moveToEol', motionArgs: { inclusive: true } }, + { keys: '%', type: 'motion', motion: 'moveToMatchedSymbol', motionArgs: { inclusive: true, toJumplist: true } }, + { keys: 'f', type: 'motion', motion: 'moveToCharacter', motionArgs: { forward: true, inclusive: true } }, + { keys: 'F', type: 'motion', motion: 'moveToCharacter', motionArgs: { forward: false } }, + { keys: 't', type: 'motion', motion: 'moveTillCharacter', motionArgs: { forward: true, inclusive: true } }, + { keys: 'T', type: 'motion', motion: 'moveTillCharacter', motionArgs: { forward: false } }, + { keys: ';', type: 'motion', motion: 'repeatLastCharacterSearch', motionArgs: { forward: true } }, + { keys: ',', type: 'motion', motion: 'repeatLastCharacterSearch', motionArgs: { forward: false } }, + { keys: "'", type: 'motion', motion: 'goToMark', motionArgs: { toJumplist: true, linewise: true } }, + { keys: '`', type: 'motion', motion: 'goToMark', motionArgs: { toJumplist: true } }, { keys: ']`', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: true } }, { keys: '[`', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: false } }, - { keys: ']\'', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: true, linewise: true } }, - { keys: '[\'', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: false, linewise: true } }, + { keys: "]'", type: 'motion', motion: 'jumpToMark', motionArgs: { forward: true, linewise: true } }, + { keys: "['", type: 'motion', motion: 'jumpToMark', motionArgs: { forward: false, linewise: true } }, // the next two aren't motions but must come before more general motion declarations - { keys: ']p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: true, isEdit: true, matchIndent: true}}, - { keys: '[p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: false, isEdit: true, matchIndent: true}}, - { keys: ']', type: 'motion', motion: 'moveToSymbol', motionArgs: { forward: true, toJumplist: true}}, - { keys: '[', type: 'motion', motion: 'moveToSymbol', motionArgs: { forward: false, toJumplist: true}}, - { keys: '|', type: 'motion', motion: 'moveToColumn'}, - { keys: 'o', type: 'motion', motion: 'moveToOtherHighlightedEnd', context:'visual'}, - { keys: 'O', type: 'motion', motion: 'moveToOtherHighlightedEnd', motionArgs: {sameLine: true}, context:'visual'}, + { + keys: ']p', + type: 'action', + action: 'paste', + isEdit: true, + actionArgs: { after: true, isEdit: true, matchIndent: true }, + }, + { + keys: '[p', + type: 'action', + action: 'paste', + isEdit: true, + actionArgs: { after: false, isEdit: true, matchIndent: true }, + }, + { keys: ']', type: 'motion', motion: 'moveToSymbol', motionArgs: { forward: true, toJumplist: true } }, + { keys: '[', type: 'motion', motion: 'moveToSymbol', motionArgs: { forward: false, toJumplist: true } }, + { keys: '|', type: 'motion', motion: 'moveToColumn' }, + { keys: 'o', type: 'motion', motion: 'moveToOtherHighlightedEnd', context: 'visual' }, + { keys: 'O', type: 'motion', motion: 'moveToOtherHighlightedEnd', motionArgs: { sameLine: true }, context: 'visual' }, // Operators { keys: 'd', type: 'operator', operator: 'delete' }, { keys: 'y', type: 'operator', operator: 'yank' }, { keys: 'c', type: 'operator', operator: 'change' }, - { keys: '>', type: 'operator', operator: 'indent', operatorArgs: { indentRight: true }}, - { keys: '<', type: 'operator', operator: 'indent', operatorArgs: { indentRight: false }}, + { keys: '>', type: 'operator', operator: 'indent', operatorArgs: { indentRight: true } }, + { keys: '<', type: 'operator', operator: 'indent', operatorArgs: { indentRight: false } }, { keys: 'g~', type: 'operator', operator: 'changeCase' }, - { keys: 'gu', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: true}, isEdit: true }, - { keys: 'gU', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: false}, isEdit: true }, - { keys: 'n', type: 'motion', motion: 'findNext', motionArgs: { forward: true, toJumplist: true }}, - { keys: 'N', type: 'motion', motion: 'findNext', motionArgs: { forward: false, toJumplist: true }}, + { keys: 'gu', type: 'operator', operator: 'changeCase', operatorArgs: { toLower: true }, isEdit: true }, + { keys: 'gU', type: 'operator', operator: 'changeCase', operatorArgs: { toLower: false }, isEdit: true }, + { keys: 'n', type: 'motion', motion: 'findNext', motionArgs: { forward: true, toJumplist: true } }, + { keys: 'N', type: 'motion', motion: 'findNext', motionArgs: { forward: false, toJumplist: true } }, // Operator-Motion dual commands - { keys: 'x', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: true }, operatorMotionArgs: { visualLine: false }}, - { keys: 'X', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: false }, operatorMotionArgs: { visualLine: true }}, - { keys: 'D', type: 'operatorMotion', operator: 'delete', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal'}, - { keys: 'D', type: 'operator', operator: 'delete', operatorArgs: { linewise: true }, context: 'visual'}, - { keys: 'Y', type: 'operatorMotion', operator: 'yank', motion: 'expandToLine', motionArgs: { linewise: true }, context: 'normal'}, - { keys: 'Y', type: 'operator', operator: 'yank', operatorArgs: { linewise: true }, context: 'visual'}, - { keys: 'C', type: 'operatorMotion', operator: 'change', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal'}, - { keys: 'C', type: 'operator', operator: 'change', operatorArgs: { linewise: true }, context: 'visual'}, - { keys: '~', type: 'operatorMotion', operator: 'changeCase', motion: 'moveByCharacters', motionArgs: { forward: true }, operatorArgs: { shouldMoveCursor: true }, context: 'normal'}, - { keys: '~', type: 'operator', operator: 'changeCase', context: 'visual'}, - { keys: '', type: 'operatorMotion', operator: 'delete', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false }, context: 'insert' }, + { + keys: 'x', + type: 'operatorMotion', + operator: 'delete', + motion: 'moveByCharacters', + motionArgs: { forward: true }, + operatorMotionArgs: { visualLine: false }, + }, + { + keys: 'X', + type: 'operatorMotion', + operator: 'delete', + motion: 'moveByCharacters', + motionArgs: { forward: false }, + operatorMotionArgs: { visualLine: true }, + }, + { + keys: 'D', + type: 'operatorMotion', + operator: 'delete', + motion: 'moveToEol', + motionArgs: { inclusive: true }, + context: 'normal', + }, + { keys: 'D', type: 'operator', operator: 'delete', operatorArgs: { linewise: true }, context: 'visual' }, + { + keys: 'Y', + type: 'operatorMotion', + operator: 'yank', + motion: 'expandToLine', + motionArgs: { linewise: true }, + context: 'normal', + }, + { keys: 'Y', type: 'operator', operator: 'yank', operatorArgs: { linewise: true }, context: 'visual' }, + { + keys: 'C', + type: 'operatorMotion', + operator: 'change', + motion: 'moveToEol', + motionArgs: { inclusive: true }, + context: 'normal', + }, + { keys: 'C', type: 'operator', operator: 'change', operatorArgs: { linewise: true }, context: 'visual' }, + { + keys: '~', + type: 'operatorMotion', + operator: 'changeCase', + motion: 'moveByCharacters', + motionArgs: { forward: true }, + operatorArgs: { shouldMoveCursor: true }, + context: 'normal', + }, + { keys: '~', type: 'operator', operator: 'changeCase', context: 'visual' }, + { + keys: '', + type: 'operatorMotion', + operator: 'delete', + motion: 'moveByWords', + motionArgs: { forward: false, wordEnd: false }, + context: 'insert', + }, // Actions - { keys: '', type: 'action', action: 'jumpListWalk', actionArgs: { forward: true }}, - { keys: '', type: 'action', action: 'jumpListWalk', actionArgs: { forward: false }}, - { keys: '', type: 'action', action: 'scroll', actionArgs: { forward: true, linewise: true }}, - { keys: '', type: 'action', action: 'scroll', actionArgs: { forward: false, linewise: true }}, - { keys: 'a', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'charAfter' }, context: 'normal' }, - { keys: 'A', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'eol' }, context: 'normal' }, - { keys: 'A', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'endOfSelectedArea' }, context: 'visual' }, - { keys: 'i', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'inplace' }, context: 'normal' }, - { keys: 'I', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'firstNonBlank'}, context: 'normal' }, - { keys: 'I', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'startOfSelectedArea' }, context: 'visual' }, - { keys: 'o', type: 'action', action: 'newLineAndEnterInsertMode', isEdit: true, interlaceInsertRepeat: true, actionArgs: { after: true }, context: 'normal' }, - { keys: 'O', type: 'action', action: 'newLineAndEnterInsertMode', isEdit: true, interlaceInsertRepeat: true, actionArgs: { after: false }, context: 'normal' }, + { keys: '', type: 'action', action: 'jumpListWalk', actionArgs: { forward: true } }, + { keys: '', type: 'action', action: 'jumpListWalk', actionArgs: { forward: false } }, + { keys: '', type: 'action', action: 'scroll', actionArgs: { forward: true, linewise: true } }, + { keys: '', type: 'action', action: 'scroll', actionArgs: { forward: false, linewise: true } }, + { + keys: 'a', + type: 'action', + action: 'enterInsertMode', + isEdit: true, + actionArgs: { insertAt: 'charAfter' }, + context: 'normal', + }, + { + keys: 'A', + type: 'action', + action: 'enterInsertMode', + isEdit: true, + actionArgs: { insertAt: 'eol' }, + context: 'normal', + }, + { + keys: 'A', + type: 'action', + action: 'enterInsertMode', + isEdit: true, + actionArgs: { insertAt: 'endOfSelectedArea' }, + context: 'visual', + }, + { + keys: 'i', + type: 'action', + action: 'enterInsertMode', + isEdit: true, + actionArgs: { insertAt: 'inplace' }, + context: 'normal', + }, + { + keys: 'I', + type: 'action', + action: 'enterInsertMode', + isEdit: true, + actionArgs: { insertAt: 'firstNonBlank' }, + context: 'normal', + }, + { + keys: 'I', + type: 'action', + action: 'enterInsertMode', + isEdit: true, + actionArgs: { insertAt: 'startOfSelectedArea' }, + context: 'visual', + }, + { + keys: 'o', + type: 'action', + action: 'newLineAndEnterInsertMode', + isEdit: true, + interlaceInsertRepeat: true, + actionArgs: { after: true }, + context: 'normal', + }, + { + keys: 'O', + type: 'action', + action: 'newLineAndEnterInsertMode', + isEdit: true, + interlaceInsertRepeat: true, + actionArgs: { after: false }, + context: 'normal', + }, { keys: 'v', type: 'action', action: 'toggleVisualMode' }, - { keys: 'V', type: 'action', action: 'toggleVisualMode', actionArgs: { linewise: true }}, - { keys: '', type: 'action', action: 'toggleVisualMode', actionArgs: { blockwise: true }}, - { keys: '', type: 'action', action: 'toggleVisualMode', actionArgs: { blockwise: true }}, + { keys: 'V', type: 'action', action: 'toggleVisualMode', actionArgs: { linewise: true } }, + { keys: '', type: 'action', action: 'toggleVisualMode', actionArgs: { blockwise: true } }, + { keys: '', type: 'action', action: 'toggleVisualMode', actionArgs: { blockwise: true } }, { keys: 'gv', type: 'action', action: 'reselectLastSelection' }, { keys: 'J', type: 'action', action: 'joinLines', isEdit: true }, - { keys: 'p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: true, isEdit: true }}, - { keys: 'P', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: false, isEdit: true }}, + { keys: 'p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: true, isEdit: true } }, + { keys: 'P', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: false, isEdit: true } }, { keys: 'r', type: 'action', action: 'replace', isEdit: true }, { keys: '@', type: 'action', action: 'replayMacro' }, { keys: 'q', type: 'action', action: 'enterMacroRecordMode' }, // Handle Replace-mode as a special case of insert mode. - { keys: 'R', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { replace: true }}, + { keys: 'R', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { replace: true } }, { keys: 'u', type: 'action', action: 'undo', context: 'normal' }, - { keys: 'u', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: true}, context: 'visual', isEdit: true }, - { keys: 'U', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: false}, context: 'visual', isEdit: true }, + { + keys: 'u', + type: 'operator', + operator: 'changeCase', + operatorArgs: { toLower: true }, + context: 'visual', + isEdit: true, + }, + { + keys: 'U', + type: 'operator', + operator: 'changeCase', + operatorArgs: { toLower: false }, + context: 'visual', + isEdit: true, + }, { keys: '', type: 'action', action: 'redo' }, { keys: 'm', type: 'action', action: 'setMark' }, { keys: '"', type: 'action', action: 'setRegister' }, - { keys: 'zz', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'center' }}, - { keys: 'z.', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'center' }, motion: 'moveToFirstNonWhiteSpaceCharacter' }, - { keys: 'zt', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'top' }}, - { keys: 'z', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'top' }, motion: 'moveToFirstNonWhiteSpaceCharacter' }, - { keys: 'z-', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'bottom' }}, - { keys: 'zb', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'bottom' }, motion: 'moveToFirstNonWhiteSpaceCharacter' }, + { keys: 'zz', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'center' } }, + { + keys: 'z.', + type: 'action', + action: 'scrollToCursor', + actionArgs: { position: 'center' }, + motion: 'moveToFirstNonWhiteSpaceCharacter', + }, + { keys: 'zt', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'top' } }, + { + keys: 'z', + type: 'action', + action: 'scrollToCursor', + actionArgs: { position: 'top' }, + motion: 'moveToFirstNonWhiteSpaceCharacter', + }, + { keys: 'z-', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'bottom' } }, + { + keys: 'zb', + type: 'action', + action: 'scrollToCursor', + actionArgs: { position: 'bottom' }, + motion: 'moveToFirstNonWhiteSpaceCharacter', + }, { keys: '.', type: 'action', action: 'repeatLastEdit' }, - { keys: '', type: 'action', action: 'incrementNumberToken', isEdit: true, actionArgs: {increase: true, backtrack: false}}, - { keys: '', type: 'action', action: 'incrementNumberToken', isEdit: true, actionArgs: {increase: false, backtrack: false}}, + { + keys: '', + type: 'action', + action: 'incrementNumberToken', + isEdit: true, + actionArgs: { increase: true, backtrack: false }, + }, + { + keys: '', + type: 'action', + action: 'incrementNumberToken', + isEdit: true, + actionArgs: { increase: false, backtrack: false }, + }, { keys: '', type: 'action', action: 'indent', actionArgs: { indentRight: true }, context: 'insert' }, { keys: '', type: 'action', action: 'indent', actionArgs: { indentRight: false }, context: 'insert' }, // Text object motions { keys: 'a', type: 'motion', motion: 'textObjectManipulation' }, - { keys: 'i', type: 'motion', motion: 'textObjectManipulation', motionArgs: { textObjectInner: true }}, + { keys: 'i', type: 'motion', motion: 'textObjectManipulation', motionArgs: { textObjectInner: true } }, // Search - { keys: '/', type: 'search', searchArgs: { forward: true, querySrc: 'prompt', toJumplist: true }}, - { keys: '?', type: 'search', searchArgs: { forward: false, querySrc: 'prompt', toJumplist: true }}, - { keys: '*', type: 'search', searchArgs: { forward: true, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true }}, - { keys: '#', type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true }}, - { keys: 'g*', type: 'search', searchArgs: { forward: true, querySrc: 'wordUnderCursor', toJumplist: true }}, - { keys: 'g#', type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', toJumplist: true }}, + { keys: '/', type: 'search', searchArgs: { forward: true, querySrc: 'prompt', toJumplist: true } }, + { keys: '?', type: 'search', searchArgs: { forward: false, querySrc: 'prompt', toJumplist: true } }, + { + keys: '*', + type: 'search', + searchArgs: { forward: true, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true }, + }, + { + keys: '#', + type: 'search', + searchArgs: { forward: false, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true }, + }, + { keys: 'g*', type: 'search', searchArgs: { forward: true, querySrc: 'wordUnderCursor', toJumplist: true } }, + { keys: 'g#', type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', toJumplist: true } }, // Ex command - { keys: ':', type: 'ex' } -]; + { keys: ':', type: 'ex' }, +] /** * Ex commands @@ -231,65 +428,65 @@ var defaultExCommandMap = [ { name: 'yank', shortName: 'y' }, { name: 'delmarks', shortName: 'delm' }, { name: 'registers', shortName: 'reg', excludeFromCommandHistory: true }, - { name: 'global', shortName: 'g' } -]; + { name: 'global', shortName: 'g' }, +] -var Pos = CodeMirror.Pos; +var Pos = CodeMirror.Pos var Vim = function() { function enterVimMode(cm) { - cm.setOption('disableInput', true); - cm.setOption('showCursorWhenSelecting', false); - CodeMirror.signal(cm, "vim-mode-change", {mode: "normal"}); - cm.on('cursorActivity', onCursorActivity); - maybeInitVimState(cm); + cm.setOption('disableInput', true) + cm.setOption('showCursorWhenSelecting', false) + CodeMirror.signal(cm, 'vim-mode-change', { mode: 'normal' }) + cm.on('cursorActivity', onCursorActivity) + maybeInitVimState(cm) // CodeMirror.on(cm.getInputField(), 'paste', getOnPasteFn(cm)); - cm.enterVimMode(); + cm.enterVimMode() } function leaveVimMode(cm) { - cm.setOption('disableInput', false); - cm.off('cursorActivity', onCursorActivity); + cm.setOption('disableInput', false) + cm.off('cursorActivity', onCursorActivity) // CodeMirror.off(cm.getInputField(), 'paste', getOnPasteFn(cm)); - cm.state.vim = null; - cm.leaveVimMode(); + cm.state.vim = null + cm.leaveVimMode() } function detachVimMap(cm, next) { - cm.attached = false; - if (this == CodeMirror.keyMap.vim) { - CodeMirror.rmClass(cm.getWrapperElement(), "cm-fat-cursor"); - // if (cm.getOption("inputStyle") == "contenteditable" && document.body.style.caretColor != null) { + cm.attached = false + if (this === CodeMirror.keyMap.vim) { + CodeMirror.rmClass(cm.getWrapperElement(), 'cm-fat-cursor') + // if (cm.getOption("inputStyle") === "contenteditable" && document.body.style.caretColor != null) { // disableFatCursorMark(cm); // cm.getInputField().style.caretColor = ""; // } } - if (!next || next.attach != attachVimMap) - leaveVimMode(cm); + if (!next || next.attach != attachVimMap) leaveVimMode(cm) } function attachVimMap(cm, prev) { - if (this == CodeMirror.keyMap.vim) { - cm.attached = true; + if (this === CodeMirror.keyMap.vim) { + cm.attached = true } - if (!prev || prev.attach != attachVimMap) - enterVimMode(cm); + if (!prev || prev.attach != attachVimMap) enterVimMode(cm) } function fatCursorMarks(cm) { - var ranges = cm.listSelections(), result = [] + var ranges = cm.listSelections(), + result = [] for (var i = 0; i < ranges.length; i++) { var range = ranges[i] if (range.empty()) { if (range.anchor.ch < cm.getLine(range.anchor.line).length) { - result.push(cm.markText(range.anchor, Pos(range.anchor.line, range.anchor.ch + 1), - {className: "cm-fat-cursor-mark"})) + result.push( + cm.markText(range.anchor, Pos(range.anchor.line, range.anchor.ch + 1), { className: 'cm-fat-cursor-mark' }), + ) } else { - var widget = document.createElement("span") - widget.textContent = "\u00a0" - widget.className = "cm-fat-cursor-mark" - result.push(cm.setBookmark(range.anchor, {widget: widget})) + var widget = document.createElement('span') + widget.textContent = '\u00a0' + widget.className = 'cm-fat-cursor-mark' + result.push(cm.setBookmark(range.anchor, { widget: widget })) } } } @@ -304,290 +501,303 @@ var Vim = function() { function enableFatCursorMark(cm) { cm.state.fatCursorMarks = fatCursorMarks(cm) - cm.on("cursorActivity", updateFatCursorMark) + cm.on('cursorActivity', updateFatCursorMark) } function disableFatCursorMark(cm) { var marks = cm.state.fatCursorMarks if (marks) for (var i = 0; i < marks.length; i++) marks[i].clear() cm.state.fatCursorMarks = null - cm.off("cursorActivity", updateFatCursorMark) + cm.off('cursorActivity', updateFatCursorMark) } // Deprecated, simply setting the keymap works again. CodeMirror.defineOption('vimMode', false, function(cm, val, prev) { - if (val && cm.getOption("keyMap") != "vim") - cm.setOption("keyMap", "vim"); - else if (!val && prev != CodeMirror.Init && /^vim/.test(cm.getOption("keyMap"))) - cm.setOption("keyMap", "default"); - }); + if (val && cm.getOption('keyMap') != 'vim') cm.setOption('keyMap', 'vim') + else if (!val && prev != CodeMirror.Init && /^vim/.test(cm.getOption('keyMap'))) cm.setOption('keyMap', 'default') + }) function cmKey(key, cm) { - if (!cm) { return undefined; } - if (this[key]) { return this[key]; } - var vimKey = cmKeyToVimKey(key); + if (!cm) { + return undefined + } + if (this[key]) { + return this[key] + } + var vimKey = cmKeyToVimKey(key) if (!vimKey) { - return false; + return false } - var cmd = CodeMirror.Vim.findKey(cm, vimKey); - if (typeof cmd == 'function') { - CodeMirror.signal(cm, 'vim-keypress', vimKey); + var cmd = CodeMirror.Vim.findKey(cm, vimKey) + if (typeof cmd === 'function') { + CodeMirror.signal(cm, 'vim-keypress', vimKey) } - return cmd; + return cmd } - var modifiers = {'Shift': 'S', 'Ctrl': 'C', 'Alt': 'A', 'Cmd': 'D', 'Mod': 'A'}; - var specialKeys = {Enter:'CR',Backspace:'BS',Delete:'Del',Insert:'Ins'}; + var modifiers = { Shift: 'S', Ctrl: 'C', Alt: 'A', Cmd: 'D', Mod: 'A' } + var specialKeys = { Enter: 'CR', Backspace: 'BS', Delete: 'Del', Insert: 'Ins' } function cmKeyToVimKey(key) { - if (key.charAt(0) == '\'') { + if (key.charAt(0) === "'") { // Keypress character binding of format "'a'" - return key.charAt(1); + return key.charAt(1) } - var pieces = key.split(/-(?!$)/); - var lastPiece = pieces[pieces.length - 1]; - if (pieces.length == 1 && pieces[0].length == 1) { + var pieces = key.split(/-(?!$)/) + var lastPiece = pieces[pieces.length - 1] + if (pieces.length === 1 && pieces[0].length === 1) { // No-modifier bindings use literal character bindings above. Skip. - return false; - } else if (pieces.length == 2 && pieces[0] == 'Shift' && lastPiece.length == 1) { + return false + } else if (pieces.length === 2 && pieces[0] === 'Shift' && lastPiece.length === 1) { // Ignore Shift+char bindings as they should be handled by literal character. - return false; + return false } - var hasCharacter = false; + var hasCharacter = false for (var i = 0; i < pieces.length; i++) { - var piece = pieces[i]; - if (piece in modifiers) { pieces[i] = modifiers[piece]; } - else { hasCharacter = true; } - if (piece in specialKeys) { pieces[i] = specialKeys[piece]; } + var piece = pieces[i] + if (piece in modifiers) { + pieces[i] = modifiers[piece] + } else { + hasCharacter = true + } + if (piece in specialKeys) { + pieces[i] = specialKeys[piece] + } } if (!hasCharacter) { // Vim does not support modifier only keys. - return false; + return false } // TODO: Current bindings expect the character to be lower case, but // it looks like vim key notation uses upper case. if (isUpperCase(lastPiece)) { - pieces[pieces.length - 1] = lastPiece.toLowerCase(); + pieces[pieces.length - 1] = lastPiece.toLowerCase() } - return '<' + pieces.join('-') + '>'; + return '<' + pieces.join('-') + '>' } function getOnPasteFn(cm) { - var vim = cm.state.vim; + var vim = cm.state.vim if (!vim || !vim.onPasteFn) { vim.onPasteFn = function() { if (!vim.insertMode) { - cm.setCursor(offsetCursor(cm.getCursor(), 0, 1)); - actions.enterInsertMode(cm, {}, vim); + cm.setCursor(offsetCursor(cm.getCursor(), 0, 1)) + actions.enterInsertMode(cm, {}, vim) } - }; + } } - return vim.onPasteFn; + return vim.onPasteFn } - var numberRegex = /[\d]/; - var wordCharTest = [CodeMirror.isWordChar, function(ch) { - return ch && !CodeMirror.isWordChar(ch) && !/\s/.test(ch); - }], bigWordCharTest = [function(ch) { - return /\S/.test(ch); - }]; + var numberRegex = /[\d]/ + var wordCharTest = [ + CodeMirror.isWordChar, + function(ch) { + return ch && !CodeMirror.isWordChar(ch) && !/\s/.test(ch) + }, + ], + bigWordCharTest = [ + function(ch) { + return /\S/.test(ch) + }, + ] function makeKeyRange(start, size) { - var keys = []; + var keys = [] for (var i = start; i < start + size; i++) { - keys.push(String.fromCharCode(i)); + keys.push(String.fromCharCode(i)) } - return keys; + return keys } - var upperCaseAlphabet = makeKeyRange(65, 26); - var lowerCaseAlphabet = makeKeyRange(97, 26); - var numbers = makeKeyRange(48, 10); - var validMarks = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['<', '>']); - var validRegisters = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['-', '"', '.', ':', '/']); + var upperCaseAlphabet = makeKeyRange(65, 26) + var lowerCaseAlphabet = makeKeyRange(97, 26) + var numbers = makeKeyRange(48, 10) + var validMarks = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['<', '>']) + var validRegisters = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['-', '"', '.', ':', '/']) function isLine(cm, line) { - return line >= cm.firstLine() && line <= cm.lastLine(); + return line >= cm.firstLine() && line <= cm.lastLine() } function isLowerCase(k) { - return (/^[a-z]$/).test(k); + return /^[a-z]$/.test(k) } function isMatchableSymbol(k) { - return '()[]{}'.indexOf(k) != -1; + return '()[]{}'.indexOf(k) != -1 } function isNumber(k) { - return numberRegex.test(k); + return numberRegex.test(k) } function isUpperCase(k) { - return (/^[A-Z]$/).test(k); + return /^[A-Z]$/.test(k) } function isWhiteSpaceString(k) { - return (/^\s*$/).test(k); + return /^\s*$/.test(k) } function isEndOfSentenceSymbol(k) { - return '.?!'.indexOf(k) != -1; + return '.?!'.indexOf(k) != -1 } function inArray(val, arr) { for (var i = 0; i < arr.length; i++) { - if (arr[i] == val) { - return true; + if (arr[i] === val) { + return true } } - return false; + return false } - var options = {}; + var options = {} function defineOption(name, defaultValue, type, aliases, callback) { if (defaultValue === undefined && !callback) { - throw Error('defaultValue is required unless callback is provided'); + throw Error('defaultValue is required unless callback is provided') + } + if (!type) { + type = 'string' } - if (!type) { type = 'string'; } options[name] = { type: type, defaultValue: defaultValue, - callback: callback - }; + callback: callback, + } if (aliases) { for (var i = 0; i < aliases.length; i++) { - options[aliases[i]] = options[name]; + options[aliases[i]] = options[name] } } if (defaultValue) { - setOption(name, defaultValue); + setOption(name, defaultValue) } } function setOption(name, value, cm, cfg) { - var option = options[name]; - cfg = cfg || {}; - var scope = cfg.scope; + var option = options[name] + cfg = cfg || {} + var scope = cfg.scope if (!option) { - return new Error('Unknown option: ' + name); + return new Error('Unknown option: ' + name) } - if (option.type == 'boolean') { + if (option.type === 'boolean') { if (value && value !== true) { - return new Error('Invalid argument: ' + name + '=' + value); + return new Error('Invalid argument: ' + name + '=' + value) } else if (value !== false) { // Boolean options are set to true if value is not defined. - value = true; + value = true } } if (option.callback) { if (scope !== 'local') { - option.callback(value, undefined); + option.callback(value, undefined) } if (scope !== 'global' && cm) { - option.callback(value, cm); + option.callback(value, cm) } } else { if (scope !== 'local') { - option.value = option.type == 'boolean' ? !!value : value; + option.value = option.type === 'boolean' ? !!value : value } if (scope !== 'global' && cm) { - cm.state.vim.options[name] = {value: value}; + cm.state.vim.options[name] = { value: value } } } } function getOption(name, cm, cfg) { - var option = options[name]; - cfg = cfg || {}; - var scope = cfg.scope; + var option = options[name] + cfg = cfg || {} + var scope = cfg.scope if (!option) { - return new Error('Unknown option: ' + name); + return new Error('Unknown option: ' + name) } if (option.callback) { - var local = cm && option.callback(undefined, cm); + var local = cm && option.callback(undefined, cm) if (scope !== 'global' && local !== undefined) { - return local; + return local } if (scope !== 'local') { - return option.callback(); + return option.callback() } - return; + return } else { - var local = (scope !== 'global') && (cm && cm.state.vim.options[name]); - return (local || (scope !== 'local') && option || {}).value; + var local = scope !== 'global' && cm && cm.state.vim.options[name] + return (local || (scope !== 'local' && option) || {}).value } } defineOption('filetype', undefined, 'string', ['ft'], function(name, cm) { // Option is local. Do nothing for global. if (cm === undefined) { - return; + return } // The 'filetype' option proxies to the CodeMirror 'mode' option. if (name === undefined) { - var mode = cm.getOption('mode'); - return mode == 'null' ? '' : mode; + var mode = cm.getOption('mode') + return mode === 'null' ? '' : mode } else { - var mode = name == '' ? 'null' : name; - cm.setOption('mode', mode); + var mode = name === '' ? 'null' : name + cm.setOption('mode', mode) } - }); + }) var createCircularJumpList = function() { - var size = 100; - var pointer = -1; - var head = 0; - var tail = 0; - var buffer = new Array(size); + var size = 100 + var pointer = -1 + var head = 0 + var tail = 0 + var buffer = new Array(size) function add(cm, oldCur, newCur) { - var current = pointer % size; - var curMark = buffer[current]; + var current = pointer % size + var curMark = buffer[current] function useNextSlot(cursor) { - var next = ++pointer % size; - var trashMark = buffer[next]; + var next = ++pointer % size + var trashMark = buffer[next] if (trashMark) { - trashMark.clear(); + trashMark.clear() } - buffer[next] = cm.setBookmark(cursor); + buffer[next] = cm.setBookmark(cursor) } if (curMark) { - var markPos = curMark.find(); + var markPos = curMark.find() // avoid recording redundant cursor position if (markPos && !cursorEqual(markPos, oldCur)) { - useNextSlot(oldCur); + useNextSlot(oldCur) } } else { - useNextSlot(oldCur); + useNextSlot(oldCur) } - useNextSlot(newCur); - head = pointer; - tail = pointer - size + 1; + useNextSlot(newCur) + head = pointer + tail = pointer - size + 1 if (tail < 0) { - tail = 0; + tail = 0 } } function move(cm, offset) { - pointer += offset; + pointer += offset if (pointer > head) { - pointer = head; + pointer = head } else if (pointer < tail) { - pointer = tail; + pointer = tail } - var mark = buffer[(size + pointer) % size]; + var mark = buffer[(size + pointer) % size] // skip marks that are temporarily removed from text buffer if (mark && !mark.find()) { - var inc = offset > 0 ? 1 : -1; - var newCur; - var oldCur = cm.getCursor(); + var inc = offset > 0 ? 1 : -1 + var newCur + var oldCur = cm.getCursor() do { - pointer += inc; - mark = buffer[(size + pointer) % size]; + pointer += inc + mark = buffer[(size + pointer) % size] // skip marks that are the same as current position - if (mark && - (newCur = mark.find()) && - !cursorEqual(oldCur, newCur)) { - break; + if (mark && (newCur = mark.find()) && !cursorEqual(oldCur, newCur)) { + break } - } while (pointer < head && pointer > tail); + } while (pointer < head && pointer > tail) } - return mark; + return mark } return { cachedCursor: undefined, //used for # and * jumps add: add, - move: move - }; - }; + move: move, + } + } // Returns an object to track the changes associated insert mode. It // clones the object that is passed in, or creates an empty object one if @@ -597,48 +807,46 @@ var Vim = function() { // Copy construction return { changes: c.changes, - expectCursorActivityForChange: c.expectCursorActivityForChange - }; + expectCursorActivityForChange: c.expectCursorActivityForChange, + } } return { // Change list changes: [], // Set to true on change, false on cursorActivity. - expectCursorActivityForChange: false - }; - }; + expectCursorActivityForChange: false, + } + } function MacroModeState() { - this.latestRegister = undefined; - this.isPlaying = false; - this.isRecording = false; - this.replaySearchQueries = []; - this.onRecordingDone = undefined; - this.lastInsertModeChanges = createInsertModeChanges(); + this.latestRegister = undefined + this.isPlaying = false + this.isRecording = false + this.replaySearchQueries = [] + this.onRecordingDone = undefined + this.lastInsertModeChanges = createInsertModeChanges() } MacroModeState.prototype = { exitMacroRecordMode: function() { - var macroModeState = vimGlobalState.macroModeState; + var macroModeState = vimGlobalState.macroModeState if (macroModeState.onRecordingDone) { - macroModeState.onRecordingDone(); // close dialog + macroModeState.onRecordingDone() // close dialog } - macroModeState.onRecordingDone = undefined; - macroModeState.isRecording = false; + macroModeState.onRecordingDone = undefined + macroModeState.isRecording = false }, enterMacroRecordMode: function(cm, registerName) { - var register = - vimGlobalState.registerController.getRegister(registerName); + var register = vimGlobalState.registerController.getRegister(registerName) if (register) { - register.clear(); - this.latestRegister = registerName; + register.clear() + this.latestRegister = registerName if (cm.openDialog) { - this.onRecordingDone = cm.openDialog( - '(recording)['+registerName+']', null, {bottom:true}); + this.onRecordingDone = cm.openDialog('(recording)[' + registerName + ']', null, { bottom: true }) } - this.isRecording = true; + this.isRecording = true } - } - }; + }, + } function maybeInitVimState(cm) { if (!cm.state.vim) { @@ -677,12 +885,12 @@ var Vim = function() { lastPastedText: null, sel: {}, // Buffer-local/window-local values of vim options. - options: {} - }; + options: {}, + } } - return cm.state.vim; + return cm.state.vim } - var vimGlobalState; + var vimGlobalState function resetVimGlobalState() { vimGlobalState = { // The current search query. @@ -692,37 +900,37 @@ var Vim = function() { // Replace part of the last substituted pattern lastSubstituteReplacePart: undefined, jumpList: createCircularJumpList(), - macroModeState: new MacroModeState, + macroModeState: new MacroModeState(), // Recording latest f, t, F or T motion command. - lastCharacterSearch: {increment:0, forward:true, selectedCharacter:''}, + lastCharacterSearch: { increment: 0, forward: true, selectedCharacter: '' }, registerController: new RegisterController({}), // search history buffer searchHistoryController: new HistoryController(), // ex Command history buffer - exCommandHistoryController : new HistoryController() - }; + exCommandHistoryController: new HistoryController(), + } for (var optionName in options) { - var option = options[optionName]; - option.value = option.defaultValue; + var option = options[optionName] + option.value = option.defaultValue } } - var lastInsertModeKeyTimer; - var vimApi= { + var lastInsertModeKeyTimer + var vimApi = { buildKeyMap: function() { // TODO: Convert keymap into dictionary format for fast lookup. }, // Testing hook, though it might be useful to expose the register // controller anyways. getRegisterController: function() { - return vimGlobalState.registerController; + return vimGlobalState.registerController }, // Testing hook. resetVimGlobalState_: resetVimGlobalState, // Testing hook. getVimGlobalState_: function() { - return vimGlobalState; + return vimGlobalState }, // Testing hook. @@ -733,29 +941,29 @@ var Vim = function() { InsertModeKey: InsertModeKey, map: function(lhs, rhs, ctx) { // Add user defined key bindings. - exCommandDispatcher.map(lhs, rhs, ctx); + exCommandDispatcher.map(lhs, rhs, ctx) }, unmap: function(lhs, ctx) { - exCommandDispatcher.unmap(lhs, ctx); + exCommandDispatcher.unmap(lhs, ctx) }, // TODO: Expose setOption and getOption as instance methods. Need to decide how to namespace // them, or somehow make them work with the existing CodeMirror setOption/getOption API. setOption: setOption, getOption: getOption, defineOption: defineOption, - defineEx: function(name, prefix, func){ + defineEx: function(name, prefix, func) { if (!prefix) { - prefix = name; + prefix = name } else if (name.indexOf(prefix) !== 0) { - throw new Error('(Vim.defineEx) "'+prefix+'" is not a prefix of "'+name+'", command not registered'); + throw new Error('(Vim.defineEx) "' + prefix + '" is not a prefix of "' + name + '", command not registered') } - exCommands[name]=func; - exCommandDispatcher.commandMap_[prefix]={name:name, shortName:prefix, type:'api'}; + exCommands[name] = func + exCommandDispatcher.commandMap_[prefix] = { name: name, shortName: prefix, type: 'api' } }, - handleKey: function (cm, key, origin) { - var command = this.findKey(cm, key, origin); + handleKey: function(cm, key, origin) { + var command = this.findKey(cm, key, origin) if (typeof command === 'function') { - return command(); + return command() } }, /** @@ -769,136 +977,172 @@ var Vim = function() { * returns true. */ findKey: function(cm, key, origin) { - var vim = maybeInitVimState(cm); + var vim = maybeInitVimState(cm) function handleMacroRecording() { - var macroModeState = vimGlobalState.macroModeState; + var macroModeState = vimGlobalState.macroModeState if (macroModeState.isRecording) { - if (key == 'q') { - macroModeState.exitMacroRecordMode(); - clearInputState(cm); - return true; + if (key === 'q') { + macroModeState.exitMacroRecordMode() + clearInputState(cm) + return true } if (origin != 'mapping') { - logKey(macroModeState, key); + logKey(macroModeState, key) } } } function handleEsc() { - if (key == '') { + if (key === '') { // Clear input state and get back to normal mode. - clearInputState(cm); + clearInputState(cm) if (vim.visualMode) { - exitVisualMode(cm); + exitVisualMode(cm) } else if (vim.insertMode) { - exitInsertMode(cm); + exitInsertMode(cm) } - return true; + return true } } function doKeyToKey(keys) { // TODO: prevent infinite recursion. - var match; + var match while (keys) { // Pull off one command key, which is either a single character // or a special sequence wrapped in '<' and '>', e.g. ''. - match = (/<\w+-.+?>|<\w+>|./).exec(keys); - key = match[0]; - keys = keys.substring(match.index + key.length); - CodeMirror.Vim.handleKey(cm, key, 'mapping'); + match = /<\w+-.+?>|<\w+>|./.exec(keys) + key = match[0] + keys = keys.substring(match.index + key.length) + CodeMirror.Vim.handleKey(cm, key, 'mapping') } } function handleKeyInsertMode() { - if (handleEsc()) { return true; } - var keys = vim.inputState.keyBuffer = vim.inputState.keyBuffer + key; - var keysAreChars = key.length == 1; - var match = commandDispatcher.matchCommand(keys, defaultKeymap, vim.inputState, 'insert'); + if (handleEsc()) { + return true + } + var keys = (vim.inputState.keyBuffer = vim.inputState.keyBuffer + key) + var keysAreChars = key.length === 1 + var match = commandDispatcher.matchCommand(keys, defaultKeymap, vim.inputState, 'insert') // Need to check all key substrings in insert mode. while (keys.length > 1 && match.type != 'full') { - var keys = vim.inputState.keyBuffer = keys.slice(1); - var thisMatch = commandDispatcher.matchCommand(keys, defaultKeymap, vim.inputState, 'insert'); - if (thisMatch.type != 'none') { match = thisMatch; } + var keys = (vim.inputState.keyBuffer = keys.slice(1)) + var thisMatch = commandDispatcher.matchCommand(keys, defaultKeymap, vim.inputState, 'insert') + if (thisMatch.type != 'none') { + match = thisMatch + } } - if (match.type == 'none') { clearInputState(cm); return false; } - else if (match.type == 'partial') { - if (lastInsertModeKeyTimer) { window.clearTimeout(lastInsertModeKeyTimer); } - lastInsertModeKeyTimer = window.setTimeout( - function() { if (vim.insertMode && vim.inputState.keyBuffer) { clearInputState(cm); } }, - getOption('insertModeEscKeysTimeout')); - return !keysAreChars; + if (match.type === 'none') { + clearInputState(cm) + return false + } else if (match.type === 'partial') { + if (lastInsertModeKeyTimer) { + window.clearTimeout(lastInsertModeKeyTimer) + } + lastInsertModeKeyTimer = window.setTimeout(function() { + if (vim.insertMode && vim.inputState.keyBuffer) { + clearInputState(cm) + } + }, getOption('insertModeEscKeysTimeout')) + return !keysAreChars } - if (lastInsertModeKeyTimer) { window.clearTimeout(lastInsertModeKeyTimer); } + if (lastInsertModeKeyTimer) { + window.clearTimeout(lastInsertModeKeyTimer) + } if (keysAreChars) { - var selections = cm.listSelections(); + var selections = cm.listSelections() for (var i = 0; i < selections.length; i++) { - var here = selections[i].head; - cm.replaceRange('', offsetCursor(here, 0, -(keys.length - 1)), here, '+input'); + var here = selections[i].head + cm.replaceRange('', offsetCursor(here, 0, -(keys.length - 1)), here, '+input') } - vimGlobalState.macroModeState.lastInsertModeChanges.changes.pop(); + vimGlobalState.macroModeState.lastInsertModeChanges.changes.pop() } - clearInputState(cm); - return match.command; + clearInputState(cm) + return match.command } function handleKeyNonInsertMode() { - if (handleMacroRecording() || handleEsc()) { return true; } + if (handleMacroRecording() || handleEsc()) { + return true + } - var keys = vim.inputState.keyBuffer = vim.inputState.keyBuffer + key; - if (/^[1-9]\d*$/.test(keys)) { return true; } + var keys = (vim.inputState.keyBuffer = vim.inputState.keyBuffer + key) + if (/^[1-9]\d*$/.test(keys)) { + return true + } - var keysMatcher = /^(\d*)(.*)$/.exec(keys); - if (!keysMatcher) { clearInputState(cm); return false; } - var context = vim.visualMode ? 'visual' : - 'normal'; - var match = commandDispatcher.matchCommand(keysMatcher[2] || keysMatcher[1], defaultKeymap, vim.inputState, context); - if (match.type == 'none') { clearInputState(cm); return false; } - else if (match.type == 'partial') { return true; } + var keysMatcher = /^(\d*)(.*)$/.exec(keys) + if (!keysMatcher) { + clearInputState(cm) + return false + } + var context = vim.visualMode ? 'visual' : 'normal' + var match = commandDispatcher.matchCommand( + keysMatcher[2] || keysMatcher[1], + defaultKeymap, + vim.inputState, + context, + ) + if (match.type === 'none') { + clearInputState(cm) + return false + } else if (match.type === 'partial') { + return true + } - vim.inputState.keyBuffer = ''; - var keysMatcher = /^(\d*)(.*)$/.exec(keys); + vim.inputState.keyBuffer = '' + var keysMatcher = /^(\d*)(.*)$/.exec(keys) if (keysMatcher[1] && keysMatcher[1] != '0') { - vim.inputState.pushRepeatDigit(keysMatcher[1]); + vim.inputState.pushRepeatDigit(keysMatcher[1]) } - return match.command; + return match.command } - var command; - if (vim.insertMode) { command = handleKeyInsertMode(); } - else { command = handleKeyNonInsertMode(); } + var command + if (vim.insertMode) { + command = handleKeyInsertMode() + } else { + command = handleKeyNonInsertMode() + } if (command === false) { - return !vim.insertMode && key.length === 1 ? function() { return true; } : undefined; + return !vim.insertMode && key.length === 1 + ? function() { + return true + } + : undefined } else if (command === true) { // TODO: Look into using CodeMirror's multi-key handling. // Return no-op since we are caching the key. Counts as handled, but // don't want act on it just yet. - return function() { return true; }; + return function() { + return true + } } else { return function() { return cm.operation(function() { - cm.curOp.isVimOp = true; + cm.curOp.isVimOp = true try { - if (command.type == 'keyToKey') { - doKeyToKey(command.toKeys); + if (command.type === 'keyToKey') { + doKeyToKey(command.toKeys) } else { - commandDispatcher.processCommand(cm, vim, command); + commandDispatcher.processCommand(cm, vim, command) } } catch (e) { // clear VIM state in case it's in a bad state. - cm.state.vim = undefined; - maybeInitVimState(cm); + cm.state.vim = undefined + maybeInitVimState(cm) if (!CodeMirror.Vim.suppressErrorLogging) { - console['log'](e); + console['log'](e) } - throw e; + throw e } - return true; - }); - }; + return true + }) + } } }, handleEx: function(cm, input) { - exCommandDispatcher.processCommand(cm, input); + exCommandDispatcher.processCommand(cm, input) }, defineMotion: defineMotion, @@ -910,45 +1154,45 @@ var Vim = function() { defineRegister: defineRegister, exitVisualMode: exitVisualMode, - exitInsertMode: exitInsertMode - }; + exitInsertMode: exitInsertMode, + } // Represents the current input state. function InputState() { - this.prefixRepeat = []; - this.motionRepeat = []; - - this.operator = null; - this.operatorArgs = null; - this.motion = null; - this.motionArgs = null; - this.keyBuffer = []; // For matching multi-key commands. - this.registerName = null; // Defaults to the unnamed register. + this.prefixRepeat = [] + this.motionRepeat = [] + + this.operator = null + this.operatorArgs = null + this.motion = null + this.motionArgs = null + this.keyBuffer = [] // For matching multi-key commands. + this.registerName = null // Defaults to the unnamed register. } InputState.prototype.pushRepeatDigit = function(n) { if (!this.operator) { - this.prefixRepeat = this.prefixRepeat.concat(n); + this.prefixRepeat = this.prefixRepeat.concat(n) } else { - this.motionRepeat = this.motionRepeat.concat(n); + this.motionRepeat = this.motionRepeat.concat(n) } - }; + } InputState.prototype.getRepeat = function() { - var repeat = 0; + var repeat = 0 if (this.prefixRepeat.length > 0 || this.motionRepeat.length > 0) { - repeat = 1; + repeat = 1 if (this.prefixRepeat.length > 0) { - repeat *= parseInt(this.prefixRepeat.join(''), 10); + repeat *= parseInt(this.prefixRepeat.join(''), 10) } if (this.motionRepeat.length > 0) { - repeat *= parseInt(this.motionRepeat.join(''), 10); + repeat *= parseInt(this.motionRepeat.join(''), 10) } } - return repeat; - }; + return repeat + } function clearInputState(cm, reason) { - cm.state.vim.inputState = new InputState(); - CodeMirror.signal(cm, 'vim-command-done', reason); + cm.state.vim.inputState = new InputState() + CodeMirror.signal(cm, 'vim-command-done', reason) } /* @@ -958,45 +1202,45 @@ var Vim = function() { * inserted at the cursor position.) */ function Register(text, linewise, blockwise) { - this.clear(); - this.keyBuffer = [text || '']; - this.insertModeChanges = []; - this.searchQueries = []; - this.linewise = !!linewise; - this.blockwise = !!blockwise; + this.clear() + this.keyBuffer = [text || ''] + this.insertModeChanges = [] + this.searchQueries = [] + this.linewise = !!linewise + this.blockwise = !!blockwise } Register.prototype = { setText: function(text, linewise, blockwise) { - this.keyBuffer = [text || '']; - this.linewise = !!linewise; - this.blockwise = !!blockwise; + this.keyBuffer = [text || ''] + this.linewise = !!linewise + this.blockwise = !!blockwise }, pushText: function(text, linewise) { // if this register has ever been set to linewise, use linewise. if (linewise) { if (!this.linewise) { - this.keyBuffer.push('\n'); + this.keyBuffer.push('\n') } - this.linewise = true; + this.linewise = true } - this.keyBuffer.push(text); + this.keyBuffer.push(text) }, pushInsertModeChanges: function(changes) { - this.insertModeChanges.push(createInsertModeChanges(changes)); + this.insertModeChanges.push(createInsertModeChanges(changes)) }, pushSearchQuery: function(query) { - this.searchQueries.push(query); + this.searchQueries.push(query) }, clear: function() { - this.keyBuffer = []; - this.insertModeChanges = []; - this.searchQueries = []; - this.linewise = false; + this.keyBuffer = [] + this.insertModeChanges = [] + this.searchQueries = [] + this.linewise = false }, toString: function() { - return this.keyBuffer.join(''); - } - }; + return this.keyBuffer.join('') + }, + } /** * Defines an external register. @@ -1006,15 +1250,15 @@ var Vim = function() { * for a reference implementation. */ function defineRegister(name, register) { - var registers = vimGlobalState.registerController.registers; + var registers = vimGlobalState.registerController.registers if (!name || name.length != 1) { - throw Error('Register name must be 1 character'); + throw Error('Register name must be 1 character') } if (registers[name]) { - throw Error('Register already defined ' + name); + throw Error('Register already defined ' + name) } - registers[name] = register; - validRegisters.push(name); + registers[name] = register + validRegisters.push(name) } /* @@ -1026,617 +1270,642 @@ var Vim = function() { * overridden. */ function RegisterController(registers) { - this.registers = registers; - this.unnamedRegister = registers['"'] = new Register(); - registers['.'] = new Register(); - registers[':'] = new Register(); - registers['/'] = new Register(); + this.registers = registers + this.unnamedRegister = registers['"'] = new Register() + registers['.'] = new Register() + registers[':'] = new Register() + registers['/'] = new Register() } RegisterController.prototype = { pushText: function(registerName, operator, text, linewise, blockwise) { - if (linewise && text.charAt(text.length - 1) !== '\n'){ - text += '\n'; + if (linewise && text.charAt(text.length - 1) !== '\n') { + text += '\n' } // Lowercase and uppercase registers refer to the same register. // Uppercase just means append. - var register = this.isValidRegister(registerName) ? - this.getRegister(registerName) : null; + var register = this.isValidRegister(registerName) ? this.getRegister(registerName) : null // if no register/an invalid register was specified, things go to the // default registers if (!register) { switch (operator) { case 'yank': // The 0 register contains the text from the most recent yank. - this.registers['0'] = new Register(text, linewise, blockwise); - break; + this.registers['0'] = new Register(text, linewise, blockwise) + break case 'delete': case 'change': - if (text.indexOf('\n') == -1) { + if (text.indexOf('\n') === -1) { // Delete less than 1 line. Update the small delete register. - this.registers['-'] = new Register(text, linewise); + this.registers['-'] = new Register(text, linewise) } else { // Shift down the contents of the numbered registers and put the // deleted text into register 1. - this.shiftNumericRegisters_(); - this.registers['1'] = new Register(text, linewise); + this.shiftNumericRegisters_() + this.registers['1'] = new Register(text, linewise) } - break; + break } // Make sure the unnamed register is set to what just happened - this.unnamedRegister.setText(text, linewise, blockwise); - return; + this.unnamedRegister.setText(text, linewise, blockwise) + return } // If we've gotten to this point, we've actually specified a register - var append = isUpperCase(registerName); + var append = isUpperCase(registerName) if (append) { - register.pushText(text, linewise); + register.pushText(text, linewise) } else { - register.setText(text, linewise, blockwise); + register.setText(text, linewise, blockwise) } // The unnamed register always has the same value as the last used // register. - this.unnamedRegister.setText(register.toString(), linewise); + this.unnamedRegister.setText(register.toString(), linewise) }, // Gets the register named @name. If one of @name doesn't already exist, // create it. If @name is invalid, return the unnamedRegister. getRegister: function(name) { if (!this.isValidRegister(name)) { - return this.unnamedRegister; + return this.unnamedRegister } - name = name.toLowerCase(); + name = name.toLowerCase() if (!this.registers[name]) { - this.registers[name] = new Register(); + this.registers[name] = new Register() } - return this.registers[name]; + return this.registers[name] }, isValidRegister: function(name) { - return name && inArray(name, validRegisters); + return name && inArray(name, validRegisters) }, shiftNumericRegisters_: function() { for (var i = 9; i >= 2; i--) { - this.registers[i] = this.getRegister('' + (i - 1)); + this.registers[i] = this.getRegister('' + (i - 1)) } - } - }; + }, + } function HistoryController() { - this.historyBuffer = []; - this.iterator = 0; - this.initialPrefix = null; + this.historyBuffer = [] + this.iterator = 0 + this.initialPrefix = null } HistoryController.prototype = { // the input argument here acts a user entered prefix for a small time // until we start autocompletion in which case it is the autocompleted. - nextMatch: function (input, up) { - var historyBuffer = this.historyBuffer; - var dir = up ? -1 : 1; - if (this.initialPrefix === null) this.initialPrefix = input; - for (var i = this.iterator + dir; up ? i >= 0 : i < historyBuffer.length; i+= dir) { - var element = historyBuffer[i]; + nextMatch: function(input, up) { + var historyBuffer = this.historyBuffer + var dir = up ? -1 : 1 + if (this.initialPrefix === null) this.initialPrefix = input + for (var i = this.iterator + dir; up ? i >= 0 : i < historyBuffer.length; i += dir) { + var element = historyBuffer[i] for (var j = 0; j <= element.length; j++) { - if (this.initialPrefix == element.substring(0, j)) { - this.iterator = i; - return element; + if (this.initialPrefix === element.substring(0, j)) { + this.iterator = i + return element } } } // should return the user input in case we reach the end of buffer. if (i >= historyBuffer.length) { - this.iterator = historyBuffer.length; - return this.initialPrefix; + this.iterator = historyBuffer.length + return this.initialPrefix } // return the last autocompleted query or exCommand as it is. - if (i < 0 ) return input; + if (i < 0) return input }, pushInput: function(input) { - var index = this.historyBuffer.indexOf(input); - if (index > -1) this.historyBuffer.splice(index, 1); - if (input.length) this.historyBuffer.push(input); + var index = this.historyBuffer.indexOf(input) + if (index > -1) this.historyBuffer.splice(index, 1) + if (input.length) this.historyBuffer.push(input) }, reset: function() { - this.initialPrefix = null; - this.iterator = this.historyBuffer.length; - } - }; + this.initialPrefix = null + this.iterator = this.historyBuffer.length + }, + } var commandDispatcher = { matchCommand: function(keys, keyMap, inputState, context) { - var matches = commandMatches(keys, keyMap, context, inputState); + var matches = commandMatches(keys, keyMap, context, inputState) if (!matches.full && !matches.partial) { - return {type: 'none'}; + return { type: 'none' } } else if (!matches.full && matches.partial) { - return {type: 'partial'}; + return { type: 'partial' } } - var bestMatch; + var bestMatch for (var i = 0; i < matches.full.length; i++) { - var match = matches.full[i]; + var match = matches.full[i] if (!bestMatch) { - bestMatch = match; + bestMatch = match } } - if (bestMatch.keys.slice(-11) == '') { - var character = lastChar(keys); - if (!character) return {type: 'none'}; - inputState.selectedCharacter = character; + if (bestMatch.keys.slice(-11) === '') { + var character = lastChar(keys) + if (!character) return { type: 'none' } + inputState.selectedCharacter = character } - return {type: 'full', command: bestMatch}; + return { type: 'full', command: bestMatch } }, processCommand: function(cm, vim, command) { - vim.inputState.repeatOverride = command.repeatOverride; + vim.inputState.repeatOverride = command.repeatOverride switch (command.type) { case 'motion': - this.processMotion(cm, vim, command); - break; + this.processMotion(cm, vim, command) + break case 'operator': - this.processOperator(cm, vim, command); + this.processOperator(cm, vim, command) // cm.pushUndoStop(); - break; + break case 'operatorMotion': - this.processOperatorMotion(cm, vim, command); + this.processOperatorMotion(cm, vim, command) // cm.pushUndoStop(); - break; + break case 'action': - this.processAction(cm, vim, command); - break; + this.processAction(cm, vim, command) + break case 'search': - this.processSearch(cm, vim, command); - break; + this.processSearch(cm, vim, command) + break case 'ex': case 'keyToEx': - this.processEx(cm, vim, command); - break; + this.processEx(cm, vim, command) + break default: - break; + break } }, processMotion: function(cm, vim, command) { - vim.inputState.motion = command.motion; - vim.inputState.motionArgs = copyArgs(command.motionArgs); - this.evalInput(cm, vim); + vim.inputState.motion = command.motion + vim.inputState.motionArgs = copyArgs(command.motionArgs) + this.evalInput(cm, vim) }, processOperator: function(cm, vim, command) { - var inputState = vim.inputState; + var inputState = vim.inputState if (inputState.operator) { - if (inputState.operator == command.operator) { + if (inputState.operator === command.operator) { // Typing an operator twice like 'dd' makes the operator operate // linewise - inputState.motion = 'expandToLine'; - inputState.motionArgs = { linewise: true }; - this.evalInput(cm, vim); - return; + inputState.motion = 'expandToLine' + inputState.motionArgs = { linewise: true } + this.evalInput(cm, vim) + return } else { // 2 different operators in a row doesn't make sense. - clearInputState(cm); + clearInputState(cm) } } - inputState.operator = command.operator; - inputState.operatorArgs = copyArgs(command.operatorArgs); + inputState.operator = command.operator + inputState.operatorArgs = copyArgs(command.operatorArgs) if (vim.visualMode) { // Operating on a selection in visual mode. We don't need a motion. - this.evalInput(cm, vim); + this.evalInput(cm, vim) } }, processOperatorMotion: function(cm, vim, command) { - var visualMode = vim.visualMode; - var operatorMotionArgs = copyArgs(command.operatorMotionArgs); + var visualMode = vim.visualMode + var operatorMotionArgs = copyArgs(command.operatorMotionArgs) if (operatorMotionArgs) { // Operator motions may have special behavior in visual mode. if (visualMode && operatorMotionArgs.visualLine) { - vim.visualLine = true; + vim.visualLine = true } } - this.processOperator(cm, vim, command); + this.processOperator(cm, vim, command) if (!visualMode) { - this.processMotion(cm, vim, command); + this.processMotion(cm, vim, command) } }, processAction: function(cm, vim, command) { - var inputState = vim.inputState; - var repeat = inputState.getRepeat(); - var repeatIsExplicit = !!repeat; - var actionArgs = copyArgs(command.actionArgs) || {}; + var inputState = vim.inputState + var repeat = inputState.getRepeat() + var repeatIsExplicit = !!repeat + var actionArgs = copyArgs(command.actionArgs) || {} if (inputState.selectedCharacter) { - actionArgs.selectedCharacter = inputState.selectedCharacter; + actionArgs.selectedCharacter = inputState.selectedCharacter } // Actions may or may not have motions and operators. Do these first. if (command.operator) { - this.processOperator(cm, vim, command); + this.processOperator(cm, vim, command) } if (command.motion) { - this.processMotion(cm, vim, command); + this.processMotion(cm, vim, command) } if (command.motion || command.operator) { - this.evalInput(cm, vim); + this.evalInput(cm, vim) } - actionArgs.repeat = repeat || 1; - actionArgs.repeatIsExplicit = repeatIsExplicit; - actionArgs.registerName = inputState.registerName; - clearInputState(cm); - vim.lastMotion = null; + actionArgs.repeat = repeat || 1 + actionArgs.repeatIsExplicit = repeatIsExplicit + actionArgs.registerName = inputState.registerName + clearInputState(cm) + vim.lastMotion = null if (command.isEdit) { - this.recordLastEdit(vim, inputState, command); + this.recordLastEdit(vim, inputState, command) } - actions[command.action](cm, actionArgs, vim); + actions[command.action](cm, actionArgs, vim) }, processSearch: function(cm, vim, command) { if (!cm.getSearchCursor) { // Search depends on SearchCursor. - return; - } - var forward = command.searchArgs.forward; - var wholeWordOnly = command.searchArgs.wholeWordOnly; - getSearchState(cm).setReversed(!forward); - var promptPrefix = (forward) ? '/' : '?'; - var originalQuery = getSearchState(cm).getQuery(); - var originalScrollPos = cm.getScrollInfo(); + return + } + var forward = command.searchArgs.forward + var wholeWordOnly = command.searchArgs.wholeWordOnly + getSearchState(cm).setReversed(!forward) + var promptPrefix = forward ? '/' : '?' + var originalQuery = getSearchState(cm).getQuery() + var originalScrollPos = cm.getScrollInfo() function handleQuery(query, ignoreCase, smartCase) { - vimGlobalState.searchHistoryController.pushInput(query); - vimGlobalState.searchHistoryController.reset(); + vimGlobalState.searchHistoryController.pushInput(query) + vimGlobalState.searchHistoryController.reset() try { - updateSearchQuery(cm, query, ignoreCase, smartCase); + updateSearchQuery(cm, query, ignoreCase, smartCase) } catch (e) { - showConfirm(cm, 'Invalid regex: ' + query); - clearInputState(cm); - return; + showConfirm(cm, 'Invalid regex: ' + query) + clearInputState(cm) + return } commandDispatcher.processMotion(cm, vim, { type: 'motion', motion: 'findNext', - motionArgs: { forward: true, toJumplist: command.searchArgs.toJumplist } - }); + motionArgs: { forward: true, toJumplist: command.searchArgs.toJumplist }, + }) } function onPromptClose(query) { - cm.scrollTo(originalScrollPos.left, originalScrollPos.top); - handleQuery(query, true /** ignoreCase */, true /** smartCase */); - var macroModeState = vimGlobalState.macroModeState; + cm.scrollTo(originalScrollPos.left, originalScrollPos.top) + handleQuery(query, true /** ignoreCase */, true /** smartCase */) + var macroModeState = vimGlobalState.macroModeState if (macroModeState.isRecording) { - logSearchQuery(macroModeState, query); + logSearchQuery(macroModeState, query) } } function onPromptKeyUp(e, query, close) { - var keyName = CodeMirror.keyName(e), up, offset; - if (keyName == 'Up' || keyName == 'Down') { - up = keyName == 'Up' ? true : false; - offset = e.target ? e.target.selectionEnd : 0; - query = vimGlobalState.searchHistoryController.nextMatch(query, up) || ''; - close(query); - if (offset && e.target) e.target.selectionEnd = e.target.selectionStart = Math.min(offset, e.target.value.length); + var keyName = CodeMirror.keyName(e), + up, + offset + if (keyName === 'Up' || keyName === 'Down') { + up = keyName === 'Up' ? true : false + offset = e.target ? e.target.selectionEnd : 0 + query = vimGlobalState.searchHistoryController.nextMatch(query, up) || '' + close(query) + if (offset && e.target) + e.target.selectionEnd = e.target.selectionStart = Math.min(offset, e.target.value.length) } else { - if ( keyName != 'Left' && keyName != 'Right' && keyName != 'Ctrl' && keyName != 'Alt' && keyName != 'Shift') - vimGlobalState.searchHistoryController.reset(); + if (keyName != 'Left' && keyName != 'Right' && keyName != 'Ctrl' && keyName != 'Alt' && keyName != 'Shift') + vimGlobalState.searchHistoryController.reset() } - var parsedQuery; + var parsedQuery try { - parsedQuery = updateSearchQuery(cm, query, - true /** ignoreCase */, true /** smartCase */); + parsedQuery = updateSearchQuery(cm, query, true /** ignoreCase */, true /** smartCase */) } catch (e) { // Swallow bad regexes for incremental search. } if (parsedQuery) { - cm.scrollIntoView(findNext(cm, !forward, parsedQuery), 30); + cm.scrollIntoView(findNext(cm, !forward, parsedQuery), 30) } else { - clearSearchHighlight(cm); - cm.scrollTo(originalScrollPos.left, originalScrollPos.top); + clearSearchHighlight(cm) + cm.scrollTo(originalScrollPos.left, originalScrollPos.top) } } function onPromptKeyDown(e, query, close) { - var keyName = CodeMirror.keyName(e); - if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[' || - (keyName == 'Backspace' && query == '')) { - vimGlobalState.searchHistoryController.pushInput(query); - vimGlobalState.searchHistoryController.reset(); - updateSearchQuery(cm, originalQuery); - clearSearchHighlight(cm); - cm.scrollTo(originalScrollPos.left, originalScrollPos.top); - CodeMirror.e_stop(e); - clearInputState(cm); - close(); - cm.focus(); - } else if (keyName == 'Up' || keyName == 'Down') { - CodeMirror.e_stop(e); - } else if (keyName == 'Ctrl-U') { + var keyName = CodeMirror.keyName(e) + if ( + keyName === 'Esc' || + keyName === 'Ctrl-C' || + keyName === 'Ctrl-[' || + (keyName === 'Backspace' && query === '') + ) { + vimGlobalState.searchHistoryController.pushInput(query) + vimGlobalState.searchHistoryController.reset() + updateSearchQuery(cm, originalQuery) + clearSearchHighlight(cm) + cm.scrollTo(originalScrollPos.left, originalScrollPos.top) + CodeMirror.e_stop(e) + clearInputState(cm) + close() + cm.focus() + } else if (keyName === 'Up' || keyName === 'Down') { + CodeMirror.e_stop(e) + } else if (keyName === 'Ctrl-U') { // Ctrl-U clears input. - CodeMirror.e_stop(e); - close(''); + CodeMirror.e_stop(e) + close('') } } switch (command.searchArgs.querySrc) { case 'prompt': - var macroModeState = vimGlobalState.macroModeState; + var macroModeState = vimGlobalState.macroModeState if (macroModeState.isPlaying) { - var query = macroModeState.replaySearchQueries.shift(); - handleQuery(query, true /** ignoreCase */, false /** smartCase */); + var query = macroModeState.replaySearchQueries.shift() + handleQuery(query, true /** ignoreCase */, false /** smartCase */) } else { showPrompt(cm, { - onClose: onPromptClose, - prefix: promptPrefix, - desc: searchPromptDesc, - onKeyUp: onPromptKeyUp, - onKeyDown: onPromptKeyDown - }); + onClose: onPromptClose, + prefix: promptPrefix, + desc: searchPromptDesc, + onKeyUp: onPromptKeyUp, + onKeyDown: onPromptKeyDown, + }) } - break; + break case 'wordUnderCursor': - var word = expandWordUnderCursor(cm, false /** inclusive */, - true /** forward */, false /** bigWord */, - true /** noSymbol */); - var isKeyword = true; + var word = expandWordUnderCursor( + cm, + false /** inclusive */, + true /** forward */, + false /** bigWord */, + true /** noSymbol */, + ) + var isKeyword = true if (!word) { - word = expandWordUnderCursor(cm, false /** inclusive */, - true /** forward */, false /** bigWord */, - false /** noSymbol */); - isKeyword = false; + word = expandWordUnderCursor( + cm, + false /** inclusive */, + true /** forward */, + false /** bigWord */, + false /** noSymbol */, + ) + isKeyword = false } if (!word) { - return; + return } - var query = cm.getLine(word.start.line).substring(word.start.ch, - word.end.ch); + var query = cm.getLine(word.start.line).substring(word.start.ch, word.end.ch) if (isKeyword && wholeWordOnly) { - query = '\\b' + query + '\\b'; + query = '\\b' + query + '\\b' } else { - query = escapeRegex(query); + query = escapeRegex(query) } // cachedCursor is used to save the old position of the cursor // when * or # causes vim to seek for the nearest word and shift // the cursor before entering the motion. - vimGlobalState.jumpList.cachedCursor = cm.getCursor(); - cm.setCursor(word.start); + vimGlobalState.jumpList.cachedCursor = cm.getCursor() + cm.setCursor(word.start) - handleQuery(query, true /** ignoreCase */, false /** smartCase */); - break; + handleQuery(query, true /** ignoreCase */, false /** smartCase */) + break } }, processEx: function(cm, vim, command) { function onPromptClose(input) { // Give the prompt some time to close so that if processCommand shows // an error, the elements don't overlap. - vimGlobalState.exCommandHistoryController.pushInput(input); - vimGlobalState.exCommandHistoryController.reset(); - exCommandDispatcher.processCommand(cm, input); + vimGlobalState.exCommandHistoryController.pushInput(input) + vimGlobalState.exCommandHistoryController.reset() + exCommandDispatcher.processCommand(cm, input) } function onPromptKeyDown(e, input, close) { - var keyName = CodeMirror.keyName(e), up, offset; - if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[' || - (keyName == 'Backspace' && input == '')) { - vimGlobalState.exCommandHistoryController.pushInput(input); - vimGlobalState.exCommandHistoryController.reset(); - CodeMirror.e_stop(e); - clearInputState(cm); - close(); - cm.focus(); - } - if (keyName == 'Up' || keyName == 'Down') { - CodeMirror.e_stop(e); - up = keyName == 'Up' ? true : false; - offset = e.target ? e.target.selectionEnd : 0; - input = vimGlobalState.exCommandHistoryController.nextMatch(input, up) || ''; - close(input); - if (offset && e.target) e.target.selectionEnd = e.target.selectionStart = Math.min(offset, e.target.value.length); - } else if (keyName == 'Ctrl-U') { + var keyName = CodeMirror.keyName(e), + up, + offset + if ( + keyName === 'Esc' || + keyName === 'Ctrl-C' || + keyName === 'Ctrl-[' || + (keyName === 'Backspace' && input === '') + ) { + vimGlobalState.exCommandHistoryController.pushInput(input) + vimGlobalState.exCommandHistoryController.reset() + CodeMirror.e_stop(e) + clearInputState(cm) + close() + cm.focus() + } + if (keyName === 'Up' || keyName === 'Down') { + CodeMirror.e_stop(e) + up = keyName === 'Up' ? true : false + offset = e.target ? e.target.selectionEnd : 0 + input = vimGlobalState.exCommandHistoryController.nextMatch(input, up) || '' + close(input) + if (offset && e.target) + e.target.selectionEnd = e.target.selectionStart = Math.min(offset, e.target.value.length) + } else if (keyName === 'Ctrl-U') { // Ctrl-U clears input. - CodeMirror.e_stop(e); - close(''); + CodeMirror.e_stop(e) + close('') } else { - if ( keyName != 'Left' && keyName != 'Right' && keyName != 'Ctrl' && keyName != 'Alt' && keyName != 'Shift') - vimGlobalState.exCommandHistoryController.reset(); + if (keyName != 'Left' && keyName != 'Right' && keyName != 'Ctrl' && keyName != 'Alt' && keyName != 'Shift') + vimGlobalState.exCommandHistoryController.reset() } } - if (command.type == 'keyToEx') { + if (command.type === 'keyToEx') { // Handle user defined Ex to Ex mappings - exCommandDispatcher.processCommand(cm, command.exArgs.input); + exCommandDispatcher.processCommand(cm, command.exArgs.input) } else { if (vim.visualMode) { - showPrompt(cm, { onClose: onPromptClose, prefix: ':', value: '\'<,\'>', - onKeyDown: onPromptKeyDown, selectValueOnOpen: false}); + showPrompt(cm, { + onClose: onPromptClose, + prefix: ':', + value: "'<,'>", + onKeyDown: onPromptKeyDown, + selectValueOnOpen: false, + }) } else { - showPrompt(cm, { onClose: onPromptClose, prefix: ':', - onKeyDown: onPromptKeyDown}); + showPrompt(cm, { onClose: onPromptClose, prefix: ':', onKeyDown: onPromptKeyDown }) } } }, evalInput: function(cm, vim) { // If the motion command is set, execute both the operator and motion. // Otherwise return. - var inputState = vim.inputState; - var motion = inputState.motion; - var motionArgs = inputState.motionArgs || {}; - var operator = inputState.operator; - var operatorArgs = inputState.operatorArgs || {}; - var registerName = inputState.registerName; - var sel = vim.sel; + var inputState = vim.inputState + var motion = inputState.motion + var motionArgs = inputState.motionArgs || {} + var operator = inputState.operator + var operatorArgs = inputState.operatorArgs || {} + var registerName = inputState.registerName + var sel = vim.sel // TODO: Make sure cm and vim selections are identical outside visual mode. - var origHead = copyCursor(vim.visualMode ? clipCursorToContent(cm, sel.head): cm.getCursor('head')); - var origAnchor = copyCursor(vim.visualMode ? clipCursorToContent(cm, sel.anchor) : cm.getCursor('anchor')); - var oldHead = copyCursor(origHead); - var oldAnchor = copyCursor(origAnchor); - var newHead, newAnchor; - var repeat; + var origHead = copyCursor(vim.visualMode ? clipCursorToContent(cm, sel.head) : cm.getCursor('head')) + var origAnchor = copyCursor(vim.visualMode ? clipCursorToContent(cm, sel.anchor) : cm.getCursor('anchor')) + var oldHead = copyCursor(origHead) + var oldAnchor = copyCursor(origAnchor) + var newHead, newAnchor + var repeat if (operator) { - this.recordLastEdit(vim, inputState); + this.recordLastEdit(vim, inputState) } if (inputState.repeatOverride !== undefined) { // If repeatOverride is specified, that takes precedence over the // input state's repeat. Used by Ex mode and can be user defined. - repeat = inputState.repeatOverride; + repeat = inputState.repeatOverride } else { - repeat = inputState.getRepeat(); + repeat = inputState.getRepeat() } if (repeat > 0 && motionArgs.explicitRepeat) { - motionArgs.repeatIsExplicit = true; - } else if (motionArgs.noRepeat || - (!motionArgs.explicitRepeat && repeat === 0)) { - repeat = 1; - motionArgs.repeatIsExplicit = false; + motionArgs.repeatIsExplicit = true + } else if (motionArgs.noRepeat || (!motionArgs.explicitRepeat && repeat === 0)) { + repeat = 1 + motionArgs.repeatIsExplicit = false } if (inputState.selectedCharacter) { // If there is a character input, stick it in all of the arg arrays. - motionArgs.selectedCharacter = operatorArgs.selectedCharacter = - inputState.selectedCharacter; + motionArgs.selectedCharacter = operatorArgs.selectedCharacter = inputState.selectedCharacter } - motionArgs.repeat = repeat; - clearInputState(cm); + motionArgs.repeat = repeat + clearInputState(cm) if (motion) { - var motionResult = motions[motion](cm, origHead, motionArgs, vim); - vim.lastMotion = motions[motion]; + var motionResult = motions[motion](cm, origHead, motionArgs, vim) + vim.lastMotion = motions[motion] if (!motionResult) { - return; + return } if (motionArgs.toJumplist) { - var jumpList = vimGlobalState.jumpList; + var jumpList = vimGlobalState.jumpList // if the current motion is # or *, use cachedCursor - var cachedCursor = jumpList.cachedCursor; + var cachedCursor = jumpList.cachedCursor if (cachedCursor) { - recordJumpPosition(cm, cachedCursor, motionResult); - delete jumpList.cachedCursor; + recordJumpPosition(cm, cachedCursor, motionResult) + delete jumpList.cachedCursor } else { - recordJumpPosition(cm, origHead, motionResult); + recordJumpPosition(cm, origHead, motionResult) } } if (motionResult instanceof Array) { - newAnchor = motionResult[0]; - newHead = motionResult[1]; + newAnchor = motionResult[0] + newHead = motionResult[1] } else { - newHead = motionResult; + newHead = motionResult } // TODO: Handle null returns from motion commands better. if (!newHead) { - newHead = copyCursor(origHead); + newHead = copyCursor(origHead) } if (vim.visualMode) { if (!(vim.visualBlock && newHead.ch === Infinity)) { - newHead = clipCursorToContent(cm, newHead, vim.visualBlock); + newHead = clipCursorToContent(cm, newHead, vim.visualBlock) } if (newAnchor) { - newAnchor = clipCursorToContent(cm, newAnchor, true); + newAnchor = clipCursorToContent(cm, newAnchor, true) } - newAnchor = newAnchor || oldAnchor; - sel.anchor = newAnchor; - sel.head = newHead; - updateCmSelection(cm); - updateMark(cm, vim, '<', - cursorIsBefore(newAnchor, newHead) ? newAnchor - : newHead); - updateMark(cm, vim, '>', - cursorIsBefore(newAnchor, newHead) ? newHead - : newAnchor); + newAnchor = newAnchor || oldAnchor + sel.anchor = newAnchor + sel.head = newHead + updateCmSelection(cm) + updateMark(cm, vim, '<', cursorIsBefore(newAnchor, newHead) ? newAnchor : newHead) + updateMark(cm, vim, '>', cursorIsBefore(newAnchor, newHead) ? newHead : newAnchor) } else if (!operator) { - newHead = clipCursorToContent(cm, newHead); - cm.setCursor(newHead.line, newHead.ch); + newHead = clipCursorToContent(cm, newHead) + cm.setCursor(newHead.line, newHead.ch) } } if (operator) { if (operatorArgs.lastSel) { // Replaying a visual mode operation - newAnchor = oldAnchor; - var lastSel = operatorArgs.lastSel; - var lineOffset = Math.abs(lastSel.head.line - lastSel.anchor.line); - var chOffset = Math.abs(lastSel.head.ch - lastSel.anchor.ch); + newAnchor = oldAnchor + var lastSel = operatorArgs.lastSel + var lineOffset = Math.abs(lastSel.head.line - lastSel.anchor.line) + var chOffset = Math.abs(lastSel.head.ch - lastSel.anchor.ch) if (lastSel.visualLine) { // Linewise Visual mode: The same number of lines. - newHead = Pos(oldAnchor.line + lineOffset, oldAnchor.ch); + newHead = Pos(oldAnchor.line + lineOffset, oldAnchor.ch) } else if (lastSel.visualBlock) { // Blockwise Visual mode: The same number of lines and columns. - newHead = Pos(oldAnchor.line + lineOffset, oldAnchor.ch + chOffset); - } else if (lastSel.head.line == lastSel.anchor.line) { + newHead = Pos(oldAnchor.line + lineOffset, oldAnchor.ch + chOffset) + } else if (lastSel.head.line === lastSel.anchor.line) { // Normal Visual mode within one line: The same number of characters. - newHead = Pos(oldAnchor.line, oldAnchor.ch + chOffset); + newHead = Pos(oldAnchor.line, oldAnchor.ch + chOffset) } else { // Normal Visual mode with several lines: The same number of lines, in the // last line the same number of characters as in the last line the last time. - newHead = Pos(oldAnchor.line + lineOffset, oldAnchor.ch); + newHead = Pos(oldAnchor.line + lineOffset, oldAnchor.ch) } - vim.visualMode = true; - vim.visualLine = lastSel.visualLine; - vim.visualBlock = lastSel.visualBlock; + vim.visualMode = true + vim.visualLine = lastSel.visualLine + vim.visualBlock = lastSel.visualBlock sel = vim.sel = { anchor: newAnchor, - head: newHead - }; - updateCmSelection(cm); + head: newHead, + } + updateCmSelection(cm) } else if (vim.visualMode) { operatorArgs.lastSel = { anchor: copyCursor(sel.anchor), head: copyCursor(sel.head), visualBlock: vim.visualBlock, - visualLine: vim.visualLine - }; + visualLine: vim.visualLine, + } } - var curStart, curEnd, linewise, mode; - var cmSel; + var curStart, curEnd, linewise, mode + var cmSel if (vim.visualMode) { // Init visual op - curStart = cursorMin(sel.head, sel.anchor); - curEnd = cursorMax(sel.head, sel.anchor); - linewise = vim.visualLine || operatorArgs.linewise; - mode = vim.visualBlock ? 'block' : - linewise ? 'line' : - 'char'; - cmSel = makeCmSelection(cm, { - anchor: curStart, - head: curEnd - }, mode); + curStart = cursorMin(sel.head, sel.anchor) + curEnd = cursorMax(sel.head, sel.anchor) + linewise = vim.visualLine || operatorArgs.linewise + mode = vim.visualBlock ? 'block' : linewise ? 'line' : 'char' + cmSel = makeCmSelection( + cm, + { + anchor: curStart, + head: curEnd, + }, + mode, + ) if (linewise) { - var ranges = cmSel.ranges; - if (mode == 'block') { + var ranges = cmSel.ranges + if (mode === 'block') { // Linewise operators in visual block mode extend to end of line for (var i = 0; i < ranges.length; i++) { - ranges[i].head.ch = lineLength(cm, ranges[i].head.line); + ranges[i].head.ch = lineLength(cm, ranges[i].head.line) } - } else if (mode == 'line') { - ranges[0].head = Pos(ranges[0].head.line + 1, 0); + } else if (mode === 'line') { + ranges[0].head = Pos(ranges[0].head.line + 1, 0) } } } else { // Init motion op - curStart = copyCursor(newAnchor || oldAnchor); - curEnd = copyCursor(newHead || oldHead); + curStart = copyCursor(newAnchor || oldAnchor) + curEnd = copyCursor(newHead || oldHead) if (cursorIsBefore(curEnd, curStart)) { - var tmp = curStart; - curStart = curEnd; - curEnd = tmp; + var tmp = curStart + curStart = curEnd + curEnd = tmp } - linewise = motionArgs.linewise || operatorArgs.linewise; + linewise = motionArgs.linewise || operatorArgs.linewise if (linewise) { // Expand selection to entire line. - expandSelectionToLine(cm, curStart, curEnd); + expandSelectionToLine(cm, curStart, curEnd) } else if (motionArgs.forward) { // Clip to trailing newlines only if the motion goes forward. - clipToLine(cm, curStart, curEnd); + clipToLine(cm, curStart, curEnd) } - mode = 'char'; - var exclusive = !motionArgs.inclusive || linewise; - cmSel = makeCmSelection(cm, { - anchor: curStart, - head: curEnd - }, mode, exclusive); - } - cm.setSelections(cmSel.ranges, cmSel.primary); - vim.lastMotion = null; - operatorArgs.repeat = repeat; // For indent in visual mode. - operatorArgs.registerName = registerName; + mode = 'char' + var exclusive = !motionArgs.inclusive || linewise + cmSel = makeCmSelection( + cm, + { + anchor: curStart, + head: curEnd, + }, + mode, + exclusive, + ) + } + cm.setSelections(cmSel.ranges, cmSel.primary) + vim.lastMotion = null + operatorArgs.repeat = repeat // For indent in visual mode. + operatorArgs.registerName = registerName // Keep track of linewise as it affects how paste and change behave. - operatorArgs.linewise = linewise; - var operatorMoveTo = operators[operator]( - cm, operatorArgs, cmSel.ranges, oldAnchor, newHead); + operatorArgs.linewise = linewise + var operatorMoveTo = operators[operator](cm, operatorArgs, cmSel.ranges, oldAnchor, newHead) if (vim.visualMode) { - exitVisualMode(cm, operatorMoveTo != null); + exitVisualMode(cm, operatorMoveTo != null) } if (operatorMoveTo) { - cm.setCursor(operatorMoveTo); + cm.setCursor(operatorMoveTo) } } }, recordLastEdit: function(vim, inputState, actionCommand) { - var macroModeState = vimGlobalState.macroModeState; - if (macroModeState.isPlaying) { return; } - vim.lastEditInputState = inputState; - vim.lastEditActionCommand = actionCommand; - macroModeState.lastInsertModeChanges.changes = []; - macroModeState.lastInsertModeChanges.expectCursorActivityForChange = false; - } - }; + var macroModeState = vimGlobalState.macroModeState + if (macroModeState.isPlaying) { + return + } + vim.lastEditInputState = inputState + vim.lastEditActionCommand = actionCommand + macroModeState.lastInsertModeChanges.changes = [] + macroModeState.lastInsertModeChanges.expectCursorActivityForChange = false + }, + } /** * typedef {Object{line:number,ch:number}} Cursor An object containing the @@ -1645,80 +1914,77 @@ var Vim = function() { // All of the functions below return Cursor objects. var motions = { moveToTopLine: function(cm, _head, motionArgs) { - var line = getUserVisibleLines(cm).top + motionArgs.repeat -1; - return Pos(line, cm.findFirstNonWhiteSpaceCharacter(line)); + var line = getUserVisibleLines(cm).top + motionArgs.repeat - 1 + return Pos(line, cm.findFirstNonWhiteSpaceCharacter(line)) }, moveToMiddleLine: function(cm) { - var range = getUserVisibleLines(cm); - var line = Math.floor((range.top + range.bottom) * 0.5); - return Pos(line, cm.findFirstNonWhiteSpaceCharacter(line)); + var range = getUserVisibleLines(cm) + var line = Math.floor((range.top + range.bottom) * 0.5) + return Pos(line, cm.findFirstNonWhiteSpaceCharacter(line)) }, moveToBottomLine: function(cm, _head, motionArgs) { - var line = getUserVisibleLines(cm).bottom - motionArgs.repeat +1; - return Pos(line, cm.findFirstNonWhiteSpaceCharacter(line)); + var line = getUserVisibleLines(cm).bottom - motionArgs.repeat + 1 + return Pos(line, cm.findFirstNonWhiteSpaceCharacter(line)) }, expandToLine: function(_cm, head, motionArgs) { // Expands forward to end of line, and then to next line if repeat is // >1. Does not handle backward motion! - var cur = head; - return Pos(cur.line + motionArgs.repeat - 1, Infinity); + var cur = head + return Pos(cur.line + motionArgs.repeat - 1, Infinity) }, findNext: function(cm, _head, motionArgs) { - var state = getSearchState(cm); - var query = state.getQuery(); + var state = getSearchState(cm) + var query = state.getQuery() if (!query) { - return; + return } - var prev = !motionArgs.forward; + var prev = !motionArgs.forward // If search is initiated with ? instead of /, negate direction. - prev = (state.isReversed()) ? !prev : prev; - highlightSearchMatches(cm, query); - return findNext(cm, prev/** prev */, query, motionArgs.repeat); + prev = state.isReversed() ? !prev : prev + highlightSearchMatches(cm, query) + return findNext(cm, prev /** prev */, query, motionArgs.repeat) }, goToMark: function(cm, _head, motionArgs, vim) { - var pos = getMarkPos(cm, vim, motionArgs.selectedCharacter); + var pos = getMarkPos(cm, vim, motionArgs.selectedCharacter) if (pos) { - return motionArgs.linewise ? { line: pos.line, ch: cm.findFirstNonWhiteSpaceCharacter(pos.line) } : pos; + return motionArgs.linewise ? { line: pos.line, ch: cm.findFirstNonWhiteSpaceCharacter(pos.line) } : pos } - return null; + return null }, moveToOtherHighlightedEnd: function(cm, _head, motionArgs, vim) { if (vim.visualBlock && motionArgs.sameLine) { - var sel = vim.sel; + var sel = vim.sel return [ clipCursorToContent(cm, Pos(sel.anchor.line, sel.head.ch)), - clipCursorToContent(cm, Pos(sel.head.line, sel.anchor.ch)) - ]; + clipCursorToContent(cm, Pos(sel.head.line, sel.anchor.ch)), + ] } else { - return ([vim.sel.head, vim.sel.anchor]); + return [vim.sel.head, vim.sel.anchor] } }, jumpToMark: function(cm, head, motionArgs, vim) { - var best = head; + var best = head for (var i = 0; i < motionArgs.repeat; i++) { - var cursor = best; + var cursor = best for (var key in vim.marks) { if (!isLowerCase(key)) { - continue; + continue } - var mark = vim.marks[key].find(); - var isWrongDirection = (motionArgs.forward) ? - cursorIsBefore(mark, cursor) : cursorIsBefore(cursor, mark); + var mark = vim.marks[key].find() + var isWrongDirection = motionArgs.forward ? cursorIsBefore(mark, cursor) : cursorIsBefore(cursor, mark) if (isWrongDirection) { - continue; + continue } - if (motionArgs.linewise && (mark.line == cursor.line)) { - continue; + if (motionArgs.linewise && mark.line === cursor.line) { + continue } - var equal = cursorEqual(cursor, best); - var between = (motionArgs.forward) ? - cursorIsBetween(cursor, mark, best) : - cursorIsBetween(best, mark, cursor); + var equal = cursorEqual(cursor, best) + var between = motionArgs.forward ? cursorIsBetween(cursor, mark, best) : cursorIsBetween(best, mark, cursor) if (equal || between) { - best = mark; + best = mark } } } @@ -1727,19 +1993,19 @@ var Vim = function() { // Vim places the cursor on the first non-whitespace character of // the line if there is one, else it places the cursor at the end // of the line, regardless of whether a mark was found. - best = Pos(best.line, cm.findFirstNonWhiteSpaceCharacter(best.line)); + best = Pos(best.line, cm.findFirstNonWhiteSpaceCharacter(best.line)) } - return best; + return best }, moveByCharacters: function(_cm, head, motionArgs) { - var cur = head; - var repeat = motionArgs.repeat; - var ch = motionArgs.forward ? cur.ch + repeat : cur.ch - repeat; - return Pos(cur.line, ch); + var cur = head + var repeat = motionArgs.repeat + var ch = motionArgs.forward ? cur.ch + repeat : cur.ch - repeat + return Pos(cur.line, ch) }, moveByLines: function(cm, head, motionArgs, vim) { - var cur = head; - var endCh = cur.ch; + var cur = head + var endCh = cur.ch // Depending what our last motion was, we may want to do different // things. If our last motion was moving vertically, we want to // preserve the HPos from our last horizontal move. If our last motion @@ -1751,143 +2017,138 @@ var Vim = function() { case this.moveByScroll: case this.moveToColumn: case this.moveToEol: - endCh = vim.lastHPos; - break; + endCh = vim.lastHPos + break default: - vim.lastHPos = endCh; + vim.lastHPos = endCh } - var repeat = motionArgs.repeat+(motionArgs.repeatOffset||0); - var line = motionArgs.forward ? cur.line + repeat : cur.line - repeat; - var first = cm.firstLine(); - var last = cm.lastLine(); + var repeat = motionArgs.repeat + (motionArgs.repeatOffset || 0) + var line = motionArgs.forward ? cur.line + repeat : cur.line - repeat + var first = cm.firstLine() + var last = cm.lastLine() // Vim go to line begin or line end when cursor at first/last line and // move to previous/next line is triggered. - if (line < first && cur.line == first){ - return this.moveToStartOfLine(cm, head, motionArgs, vim); - }else if (line > last && cur.line == last){ - return this.moveToEol(cm, head, motionArgs, vim); + if (line < first && cur.line === first) { + return this.moveToStartOfLine(cm, head, motionArgs, vim) + } else if (line > last && cur.line === last) { + return this.moveToEol(cm, head, motionArgs, vim) } - if (motionArgs.toFirstChar){ - endCh=cm.findFirstNonWhiteSpaceCharacter(line); - vim.lastHPos = endCh; + if (motionArgs.toFirstChar) { + endCh = cm.findFirstNonWhiteSpaceCharacter(line) + vim.lastHPos = endCh } - vim.lastHSPos = cm.charCoords(Pos(line, endCh),'div').left; - return Pos(line, endCh); + vim.lastHSPos = cm.charCoords(Pos(line, endCh), 'div').left + return Pos(line, endCh) }, moveByDisplayLines: function(cm, head, motionArgs, vim) { - var cur = head; + var cur = head switch (vim.lastMotion) { case this.moveByDisplayLines: case this.moveByScroll: case this.moveByLines: case this.moveToColumn: case this.moveToEol: - break; + break default: - vim.lastHSPos = cm.charCoords(cur,'div').left; + vim.lastHSPos = cm.charCoords(cur, 'div').left } - var repeat = motionArgs.repeat; - var res=cm.findPosV(cur,(motionArgs.forward ? repeat : -repeat),'line',vim.lastHSPos); + var repeat = motionArgs.repeat + var res = cm.findPosV(cur, motionArgs.forward ? repeat : -repeat, 'line', vim.lastHSPos) if (res.hitSide) { if (motionArgs.forward) { - var lastCharCoords = cm.charCoords(res, 'div'); - var goalCoords = { top: lastCharCoords.top + 8, left: vim.lastHSPos }; - var res = cm.coordsChar(goalCoords, 'div'); + var lastCharCoords = cm.charCoords(res, 'div') + var goalCoords = { top: lastCharCoords.top + 8, left: vim.lastHSPos } + var res = cm.coordsChar(goalCoords, 'div') } else { - var resCoords = cm.charCoords(Pos(cm.firstLine(), 0), 'div'); - resCoords.left = vim.lastHSPos; - res = cm.coordsChar(resCoords, 'div'); + var resCoords = cm.charCoords(Pos(cm.firstLine(), 0), 'div') + resCoords.left = vim.lastHSPos + res = cm.coordsChar(resCoords, 'div') } } - vim.lastHPos = res.ch; - return res; + vim.lastHPos = res.ch + return res }, moveByPage: function(cm, head, motionArgs) { // CodeMirror only exposes functions that move the cursor page down, so // doing this bad hack to move the cursor and move it back. evalInput // will move the cursor to where it should be in the end. - var curStart = head; - var repeat = motionArgs.repeat; - return cm.findPosV(curStart, (motionArgs.forward ? repeat : -repeat), 'page'); + var curStart = head + var repeat = motionArgs.repeat + return cm.findPosV(curStart, motionArgs.forward ? repeat : -repeat, 'page') }, moveByParagraph: function(cm, head, motionArgs) { - var dir = motionArgs.forward ? 1 : -1; - return findParagraph(cm, head, motionArgs.repeat, dir); + var dir = motionArgs.forward ? 1 : -1 + return findParagraph(cm, head, motionArgs.repeat, dir) }, moveBySentence: function(cm, head, motionArgs) { - var dir = motionArgs.forward ? 1 : -1; - return findSentence(cm, head, motionArgs.repeat, dir); + var dir = motionArgs.forward ? 1 : -1 + return findSentence(cm, head, motionArgs.repeat, dir) }, moveByScroll: function(cm, head, motionArgs, vim) { - var scrollbox = cm.getScrollInfo(); - var curEnd = null; - var repeat = motionArgs.repeat; + var scrollbox = cm.getScrollInfo() + var curEnd = null + var repeat = motionArgs.repeat if (!repeat) { - repeat = Math.floor(scrollbox.clientHeight / (2 * cm.defaultTextHeight())); + repeat = Math.floor(scrollbox.clientHeight / (2 * cm.defaultTextHeight())) } - var orig = cm.charCoords(head, 'local'); - motionArgs.repeat = repeat; - var curEnd = motions.moveByDisplayLines(cm, head, motionArgs, vim); + var orig = cm.charCoords(head, 'local') + motionArgs.repeat = repeat + var curEnd = motions.moveByDisplayLines(cm, head, motionArgs, vim) if (!curEnd) { - return null; + return null } - var dest = cm.charCoords(curEnd, 'local'); - cm.scrollTo(null, scrollbox.top + dest.top - orig.top); - return curEnd; + var dest = cm.charCoords(curEnd, 'local') + cm.scrollTo(null, scrollbox.top + dest.top - orig.top) + return curEnd }, moveByWords: function(cm, head, motionArgs) { - return moveToWord(cm, head, motionArgs.repeat, !!motionArgs.forward, - !!motionArgs.wordEnd, !!motionArgs.bigWord); + return moveToWord(cm, head, motionArgs.repeat, !!motionArgs.forward, !!motionArgs.wordEnd, !!motionArgs.bigWord) }, moveTillCharacter: function(cm, _head, motionArgs) { - var repeat = motionArgs.repeat; - var curEnd = moveToCharacter(cm, repeat, motionArgs.forward, - motionArgs.selectedCharacter); - var increment = motionArgs.forward ? -1 : 1; - recordLastCharacterSearch(increment, motionArgs); - if (!curEnd) return null; - curEnd.ch += increment; - return curEnd; + var repeat = motionArgs.repeat + var curEnd = moveToCharacter(cm, repeat, motionArgs.forward, motionArgs.selectedCharacter) + var increment = motionArgs.forward ? -1 : 1 + recordLastCharacterSearch(increment, motionArgs) + if (!curEnd) return null + curEnd.ch += increment + return curEnd }, moveToCharacter: function(cm, head, motionArgs) { - var repeat = motionArgs.repeat; - recordLastCharacterSearch(0, motionArgs); - return moveToCharacter(cm, repeat, motionArgs.forward, - motionArgs.selectedCharacter) || head; + var repeat = motionArgs.repeat + recordLastCharacterSearch(0, motionArgs) + return moveToCharacter(cm, repeat, motionArgs.forward, motionArgs.selectedCharacter) || head }, moveToSymbol: function(cm, head, motionArgs) { - var repeat = motionArgs.repeat; - return findSymbol(cm, repeat, motionArgs.forward, - motionArgs.selectedCharacter) || head; + var repeat = motionArgs.repeat + return findSymbol(cm, repeat, motionArgs.forward, motionArgs.selectedCharacter) || head }, moveToColumn: function(cm, head, motionArgs, vim) { - var repeat = motionArgs.repeat; + var repeat = motionArgs.repeat // repeat is equivalent to which column we want to move to! - vim.lastHPos = repeat - 1; - vim.lastHSPos = cm.charCoords(head,'div').left; - return moveToColumn(cm, repeat); + vim.lastHPos = repeat - 1 + vim.lastHSPos = cm.charCoords(head, 'div').left + return moveToColumn(cm, repeat) }, moveToEol: function(cm, head, motionArgs, vim) { - var cur = head; - vim.lastHPos = Infinity; - var retval= Pos(cur.line + motionArgs.repeat - 1, Infinity); - var end=cm.clipPos(retval); - end.ch--; - vim.lastHSPos = cm.charCoords(end,'div').left; - return retval; + var cur = head + vim.lastHPos = Infinity + var retval = Pos(cur.line + motionArgs.repeat - 1, Infinity) + var end = cm.clipPos(retval) + end.ch-- + vim.lastHSPos = cm.charCoords(end, 'div').left + return retval }, moveToFirstNonWhiteSpaceCharacter: function(cm, head) { // Go to the start of the line where the text begins, or the end for // whitespace-only lines - var cursor = head; - return Pos(cursor.line, - cm.findFirstNonWhiteSpaceCharacter(cursor.line)); + var cursor = head + return Pos(cursor.line, cm.findFirstNonWhiteSpaceCharacter(cursor.line)) }, moveToMatchedSymbol: function(cm, head) { - var cursor = head; - var line = cursor.line; - var ch = cursor.ch; - var lineText = cm.getLine(line); + var cursor = head + var line = cursor.line + var ch = cursor.ch + var lineText = cm.getLine(line) // var symbol; // for (; ch < lineText.length; ch++) { // symbol = lineText.charAt(ch); @@ -1899,22 +2160,21 @@ var Vim = function() { // } // } if (ch < lineText.length) { - var matched = cm.findMatchingBracket(Pos(line, ch)); - return matched.to; + var matched = cm.findMatchingBracket(Pos(line, ch)) + return matched.to } else { - return cursor; + return cursor } }, moveToStartOfLine: function(_cm, head) { - return Pos(head.line, 0); + return Pos(head.line, 0) }, moveToLineOrEdgeOfDocument: function(cm, _head, motionArgs) { - var lineNum = motionArgs.forward ? cm.lastLine() : cm.firstLine(); + var lineNum = motionArgs.forward ? cm.lastLine() : cm.firstLine() if (motionArgs.repeatIsExplicit) { - lineNum = motionArgs.repeat - cm.getOption('firstLineNumber'); + lineNum = motionArgs.repeat - cm.getOption('firstLineNumber') } - return Pos(lineNum, - cm.findFirstNonWhiteSpaceCharacter(lineNum)); + return Pos(lineNum, cm.findFirstNonWhiteSpaceCharacter(lineNum)) }, textObjectManipulation: function(cm, head, motionArgs, vim) { // TODO: lots of possible exceptions that can be thrown here. Try da( @@ -1922,18 +2182,16 @@ var Vim = function() { // TODO: adding <> >< to this map doesn't work, presumably because // they're operators - var mirroredPairs = {'(': ')', ')': '(', - '{': '}', '}': '{', - '[': ']', ']': '['}; - var selfPaired = {'\'': true, '"': true}; + var mirroredPairs = { '(': ')', ')': '(', '{': '}', '}': '{', '[': ']', ']': '[' } + var selfPaired = { "'": true, '"': true } - var character = motionArgs.selectedCharacter; + var character = motionArgs.selectedCharacter // 'b' refers to '()' block. // 'B' refers to '{}' block. - if (character == 'b') { - character = '('; - } else if (character == 'B') { - character = '{'; + if (character === 'b') { + character = '(' + } else if (character === 'B') { + character = '{' } // Inclusive is the difference between a and i @@ -1941,279 +2199,273 @@ var Vim = function() { // object operations, merge the map into the defaultKeyMap and use // motionArgs to define behavior. Define separate entries for 'aw', // 'iw', 'a[', 'i[', etc. - var inclusive = !motionArgs.textObjectInner; + var inclusive = !motionArgs.textObjectInner - var tmp; + var tmp if (mirroredPairs[character]) { - tmp = selectCompanionObject(cm, head, character, inclusive); + tmp = selectCompanionObject(cm, head, character, inclusive) } else if (selfPaired[character]) { - tmp = findBeginningAndEnd(cm, head, character, inclusive); + tmp = findBeginningAndEnd(cm, head, character, inclusive) } else if (character === 'W') { - tmp = expandWordUnderCursor(cm, inclusive, true /** forward */, - true /** bigWord */); + tmp = expandWordUnderCursor(cm, inclusive, true /** forward */, true /** bigWord */) } else if (character === 'w') { - tmp = expandWordUnderCursor(cm, inclusive, true /** forward */, - false /** bigWord */); + tmp = expandWordUnderCursor(cm, inclusive, true /** forward */, false /** bigWord */) } else if (character === 'p') { - tmp = findParagraph(cm, head, motionArgs.repeat, 0, inclusive); - motionArgs.linewise = true; + tmp = findParagraph(cm, head, motionArgs.repeat, 0, inclusive) + motionArgs.linewise = true if (vim.visualMode) { - if (!vim.visualLine) { vim.visualLine = true; } + if (!vim.visualLine) { + vim.visualLine = true + } } else { - var operatorArgs = vim.inputState.operatorArgs; - if (operatorArgs) { operatorArgs.linewise = true; } - tmp.end.line--; + var operatorArgs = vim.inputState.operatorArgs + if (operatorArgs) { + operatorArgs.linewise = true + } + tmp.end.line-- } } else { // No text object defined for this, don't move. - return null; + return null } if (!cm.state.vim.visualMode) { - return [tmp.start, tmp.end]; + return [tmp.start, tmp.end] } else { - return expandSelection(cm, tmp.start, tmp.end); + return expandSelection(cm, tmp.start, tmp.end) } }, repeatLastCharacterSearch: function(cm, head, motionArgs) { - var lastSearch = vimGlobalState.lastCharacterSearch; - var repeat = motionArgs.repeat; - var forward = motionArgs.forward === lastSearch.forward; - var increment = (lastSearch.increment ? 1 : 0) * (forward ? -1 : 1); - cm.moveH(-1 * increment, 'char'); - motionArgs.inclusive = forward ? true : false; - var curEnd = moveToCharacter(cm, repeat, forward, lastSearch.selectedCharacter); + var lastSearch = vimGlobalState.lastCharacterSearch + var repeat = motionArgs.repeat + var forward = motionArgs.forward === lastSearch.forward + var increment = (lastSearch.increment ? 1 : 0) * (forward ? -1 : 1) + cm.moveH(-1 * increment, 'char') + motionArgs.inclusive = forward ? true : false + var curEnd = moveToCharacter(cm, repeat, forward, lastSearch.selectedCharacter) if (!curEnd) { - cm.moveH(increment, 'char'); - return head; + cm.moveH(increment, 'char') + return head } - curEnd.ch += increment; - return curEnd; - } - }; + curEnd.ch += increment + return curEnd + }, + } function defineMotion(name, fn) { - motions[name] = fn; + motions[name] = fn } function fillArray(val, times) { - var arr = []; + var arr = [] for (var i = 0; i < times; i++) { - arr.push(val); + arr.push(val) } - return arr; + return arr } /** * An operator acts on a text selection. It receives the list of selections * as input. The corresponding CodeMirror selection is guaranteed to - * match the input selection. + * match the input selection. */ var operators = { change: function(cm, args, ranges) { - var finalHead, text; - var vim = cm.state.vim; - vimGlobalState.macroModeState.lastInsertModeChanges.inVisualBlock = vim.visualBlock; + var finalHead, text + var vim = cm.state.vim + vimGlobalState.macroModeState.lastInsertModeChanges.inVisualBlock = vim.visualBlock if (!vim.visualMode) { var anchor = ranges[0].anchor, - head = ranges[0].head; - text = cm.getRange(anchor, head); - var lastState = vim.lastEditInputState || {}; - if (lastState.motion == "moveByWords" && !isWhiteSpaceString(text)) { + head = ranges[0].head + text = cm.getRange(anchor, head) + var lastState = vim.lastEditInputState || {} + if (lastState.motion === 'moveByWords' && !isWhiteSpaceString(text)) { // Exclude trailing whitespace if the range is not all whitespace. - var match = (/\s+$/).exec(text); + var match = /\s+$/.exec(text) if (match && lastState.motionArgs && lastState.motionArgs.forward) { - head = offsetCursor(head, 0, - match[0].length); - text = text.slice(0, - match[0].length); + head = offsetCursor(head, 0, -match[0].length) + text = text.slice(0, -match[0].length) } } - var prevLineEnd = new Pos(anchor.line - 1, Number.MAX_VALUE); - var wasLastLine = cm.firstLine() == cm.lastLine(); + var prevLineEnd = new Pos(anchor.line - 1, Number.MAX_VALUE) + var wasLastLine = cm.firstLine() === cm.lastLine() if (head.line > cm.lastLine() && args.linewise && !wasLastLine) { - cm.replaceRange('', prevLineEnd, head); + cm.replaceRange('', prevLineEnd, head) } else { - cm.replaceRange('', anchor, head); + cm.replaceRange('', anchor, head) } if (args.linewise) { // Push the next line back down, if there is a next line. if (!wasLastLine) { - cm.setCursor(prevLineEnd); - CodeMirror.commands.newlineAndIndent(cm); + cm.setCursor(prevLineEnd) + CodeMirror.commands.newlineAndIndent(cm) } // make sure cursor ends up at the end of the line. - anchor.ch = Number.MAX_VALUE; + anchor.ch = Number.MAX_VALUE } - finalHead = anchor; + finalHead = anchor } else { - text = cm.getSelection(); - var replacement = fillArray('', ranges.length); - cm.replaceSelections(replacement); - finalHead = cursorMin(ranges[0].head, ranges[0].anchor); - } - vimGlobalState.registerController.pushText( - args.registerName, 'change', text, - args.linewise, ranges.length > 1); - actions.enterInsertMode(cm, {head: finalHead}, cm.state.vim); + text = cm.getSelection() + var replacement = fillArray('', ranges.length) + cm.replaceSelections(replacement) + finalHead = cursorMin(ranges[0].head, ranges[0].anchor) + } + vimGlobalState.registerController.pushText(args.registerName, 'change', text, args.linewise, ranges.length > 1) + actions.enterInsertMode(cm, { head: finalHead }, cm.state.vim) }, // delete is a javascript keyword. - 'delete': function(cm, args, ranges) { + delete: function(cm, args, ranges) { // Add to the undo stack explicitly so that this delete is recorded as a // specific action instead of being bundled with generic other edits. - cm.pushUndoStop(); - var finalHead, text; - var vim = cm.state.vim; + cm.pushUndoStop() + var finalHead, text + var vim = cm.state.vim if (!vim.visualBlock) { var anchor = ranges[0].anchor, - head = ranges[0].head; - if (args.linewise && - head.line != cm.firstLine() && - anchor.line == cm.lastLine() && - anchor.line == head.line - 1) { + head = ranges[0].head + if ( + args.linewise && + head.line != cm.firstLine() && + anchor.line === cm.lastLine() && + anchor.line === head.line - 1 + ) { // Special case for dd on last line (and first line). - if (anchor.line == cm.firstLine()) { - anchor.ch = 0; + if (anchor.line === cm.firstLine()) { + anchor.ch = 0 } else { - anchor = Pos(anchor.line - 1, lineLength(cm, anchor.line - 1)); + anchor = Pos(anchor.line - 1, lineLength(cm, anchor.line - 1)) } } - text = cm.getRange(anchor, head); - cm.replaceRange('', anchor, head); - finalHead = anchor; + text = cm.getRange(anchor, head) + cm.replaceRange('', anchor, head) + finalHead = anchor if (args.linewise) { - finalHead = motions.moveToFirstNonWhiteSpaceCharacter(cm, anchor); + finalHead = motions.moveToFirstNonWhiteSpaceCharacter(cm, anchor) } } else { - text = cm.getSelection(); - var replacement = fillArray('', ranges.length); - cm.replaceSelections(replacement); - finalHead = ranges[0].anchor; - } - vimGlobalState.registerController.pushText( - args.registerName, 'delete', text, - args.linewise, vim.visualBlock); + text = cm.getSelection() + var replacement = fillArray('', ranges.length) + cm.replaceSelections(replacement) + finalHead = ranges[0].anchor + } + vimGlobalState.registerController.pushText(args.registerName, 'delete', text, args.linewise, vim.visualBlock) var includeLineBreak = vim.insertMode - return clipCursorToContent(cm, finalHead, includeLineBreak); + return clipCursorToContent(cm, finalHead, includeLineBreak) }, indent: function(cm, args, ranges) { - var vim = cm.state.vim; - var startLine = ranges[0].anchor.line; - var endLine = vim.visualBlock ? - ranges[ranges.length - 1].anchor.line : - ranges[0].head.line; + var vim = cm.state.vim + var startLine = ranges[0].anchor.line + var endLine = vim.visualBlock ? ranges[ranges.length - 1].anchor.line : ranges[0].head.line // In visual mode, n> shifts the selection right n times, instead of // shifting n lines right once. - var repeat = (vim.visualMode) ? args.repeat : 1; + var repeat = vim.visualMode ? args.repeat : 1 if (args.linewise) { // The only way to delete a newline is to delete until the start of // the next line, so in linewise mode evalInput will include the next // line. We don't want this in indent, so we go back a line. - endLine--; + endLine-- } - cm.pushUndoStop(); + cm.pushUndoStop() for (var i = startLine; i <= endLine; i++) { for (var j = 0; j < repeat; j++) { - cm.indentLine(i, args.indentRight); + cm.indentLine(i, args.indentRight) } } - cm.pushUndoStop(); - return motions.moveToFirstNonWhiteSpaceCharacter(cm, ranges[0].anchor); + cm.pushUndoStop() + return motions.moveToFirstNonWhiteSpaceCharacter(cm, ranges[0].anchor) }, changeCase: function(cm, args, ranges, oldAnchor, newHead) { - var selections = cm.getSelections(); - var swapped = []; - var toLower = args.toLower; + var selections = cm.getSelections() + var swapped = [] + var toLower = args.toLower for (var j = 0; j < selections.length; j++) { - var toSwap = selections[j]; - var text = ''; + var toSwap = selections[j] + var text = '' if (toLower === true) { - text = toSwap.toLowerCase(); + text = toSwap.toLowerCase() } else if (toLower === false) { - text = toSwap.toUpperCase(); + text = toSwap.toUpperCase() } else { for (var i = 0; i < toSwap.length; i++) { - var character = toSwap.charAt(i); - text += isUpperCase(character) ? character.toLowerCase() : - character.toUpperCase(); + var character = toSwap.charAt(i) + text += isUpperCase(character) ? character.toLowerCase() : character.toUpperCase() } } - swapped.push(text); + swapped.push(text) } - cm.replaceSelections(swapped); - if (args.shouldMoveCursor){ - return newHead; - } else if (!cm.state.vim.visualMode && args.linewise && ranges[0].anchor.line + 1 == ranges[0].head.line) { - return motions.moveToFirstNonWhiteSpaceCharacter(cm, oldAnchor); - } else if (args.linewise){ - return oldAnchor; + cm.replaceSelections(swapped) + if (args.shouldMoveCursor) { + return newHead + } else if (!cm.state.vim.visualMode && args.linewise && ranges[0].anchor.line + 1 === ranges[0].head.line) { + return motions.moveToFirstNonWhiteSpaceCharacter(cm, oldAnchor) + } else if (args.linewise) { + return oldAnchor } else { - return cursorMin(ranges[0].anchor, ranges[0].head); + return cursorMin(ranges[0].anchor, ranges[0].head) } }, yank: function(cm, args, ranges, oldAnchor) { - var vim = cm.state.vim; - var text = cm.getSelection(); + var vim = cm.state.vim + var text = cm.getSelection() var endPos = vim.visualMode ? cursorMin(vim.sel.anchor, vim.sel.head, ranges[0].head, ranges[0].anchor) - : oldAnchor; - vimGlobalState.registerController.pushText( - args.registerName, 'yank', - text, args.linewise, vim.visualBlock); - return endPos; - } - }; + : oldAnchor + vimGlobalState.registerController.pushText(args.registerName, 'yank', text, args.linewise, vim.visualBlock) + return endPos + }, + } function defineOperator(name, fn) { - operators[name] = fn; + operators[name] = fn } var actions = { jumpListWalk: function(cm, actionArgs, vim) { if (vim.visualMode) { - return; + return } - var repeat = actionArgs.repeat; - var forward = actionArgs.forward; - var jumpList = vimGlobalState.jumpList; + var repeat = actionArgs.repeat + var forward = actionArgs.forward + var jumpList = vimGlobalState.jumpList - var mark = jumpList.move(cm, forward ? repeat : -repeat); - var markPos = mark ? mark.find() : undefined; - markPos = markPos ? markPos : cm.getCursor(); - cm.setCursor(markPos); + var mark = jumpList.move(cm, forward ? repeat : -repeat) + var markPos = mark ? mark.find() : undefined + markPos = markPos ? markPos : cm.getCursor() + cm.setCursor(markPos) }, scroll: function(cm, actionArgs, vim) { if (vim.visualMode) { - return; - } - var repeat = actionArgs.repeat || 1; - var lineHeight = cm.defaultTextHeight(); - var top = cm.getScrollInfo().top; - var delta = lineHeight * repeat; - var newPos = actionArgs.forward ? top + delta : top - delta; - var cursor = copyCursor(cm.getCursor()); - var cursorCoords = cm.charCoords(cursor, 'local'); + return + } + var repeat = actionArgs.repeat || 1 + var lineHeight = cm.defaultTextHeight() + var top = cm.getScrollInfo().top + var delta = lineHeight * repeat + var newPos = actionArgs.forward ? top + delta : top - delta + var cursor = copyCursor(cm.getCursor()) + var cursorCoords = cm.charCoords(cursor, 'local') if (actionArgs.forward) { if (newPos > cursorCoords.top) { - cursor.line += (newPos - cursorCoords.top) / lineHeight; - cursor.line = Math.ceil(cursor.line); - cm.setCursor(cursor); - cursorCoords = cm.charCoords(cursor, 'local'); - cm.scrollTo(null, cursorCoords.top); + cursor.line += (newPos - cursorCoords.top) / lineHeight + cursor.line = Math.ceil(cursor.line) + cm.setCursor(cursor) + cursorCoords = cm.charCoords(cursor, 'local') + cm.scrollTo(null, cursorCoords.top) } else { - // Cursor stays within bounds. Just reposition the scroll window. - cm.scrollTo(null, newPos); + // Cursor stays within bounds. Just reposition the scroll window. + cm.scrollTo(null, newPos) } } else { - var newBottom = newPos + cm.getScrollInfo().clientHeight; + var newBottom = newPos + cm.getScrollInfo().clientHeight if (newBottom < cursorCoords.bottom) { - cursor.line -= (cursorCoords.bottom - newBottom) / lineHeight; - cursor.line = Math.floor(cursor.line); - cm.setCursor(cursor); - cursorCoords = cm.charCoords(cursor, 'local'); - cm.scrollTo( - null, cursorCoords.bottom - cm.getScrollInfo().clientHeight); + cursor.line -= (cursorCoords.bottom - newBottom) / lineHeight + cursor.line = Math.floor(cursor.line) + cm.setCursor(cursor) + cursorCoords = cm.charCoords(cursor, 'local') + cm.scrollTo(null, cursorCoords.bottom - cm.getScrollInfo().clientHeight) } else { - // Cursor stays within bounds. Just reposition the scroll window. - cm.scrollTo(null, newPos); + // Cursor stays within bounds. Just reposition the scroll window. + cm.scrollTo(null, newPos) } } }, @@ -2230,478 +2482,474 @@ var Vim = function() { // break; // } // cm.scrollTo(null, y); - cm.moveCurrentLineTo(actionArgs.position); + cm.moveCurrentLineTo(actionArgs.position) }, replayMacro: function(cm, actionArgs, vim) { - var registerName = actionArgs.selectedCharacter; - var repeat = actionArgs.repeat; - var macroModeState = vimGlobalState.macroModeState; - if (registerName == '@') { - registerName = macroModeState.latestRegister; + var registerName = actionArgs.selectedCharacter + var repeat = actionArgs.repeat + var macroModeState = vimGlobalState.macroModeState + if (registerName === '@') { + registerName = macroModeState.latestRegister } - while(repeat--){ - executeMacroRegister(cm, vim, macroModeState, registerName); + while (repeat--) { + executeMacroRegister(cm, vim, macroModeState, registerName) } }, enterMacroRecordMode: function(cm, actionArgs) { - var macroModeState = vimGlobalState.macroModeState; - var registerName = actionArgs.selectedCharacter; + var macroModeState = vimGlobalState.macroModeState + var registerName = actionArgs.selectedCharacter if (vimGlobalState.registerController.isValidRegister(registerName)) { - macroModeState.enterMacroRecordMode(cm, registerName); + macroModeState.enterMacroRecordMode(cm, registerName) } }, toggleOverwrite: function(cm) { if (!cm.replaceMode) { - cm.toggleOverwrite(true); - cm.setOption('keyMap', 'vim-replace'); - CodeMirror.signal(cm, "vim-mode-change", {mode: "replace"}); + cm.toggleOverwrite(true) + cm.setOption('keyMap', 'vim-replace') + CodeMirror.signal(cm, 'vim-mode-change', { mode: 'replace' }) } else { - cm.toggleOverwrite(false); - cm.setOption('keyMap', 'vim-insert'); - CodeMirror.signal(cm, "vim-mode-change", {mode: "insert"}); + cm.toggleOverwrite(false) + cm.setOption('keyMap', 'vim-insert') + CodeMirror.signal(cm, 'vim-mode-change', { mode: 'insert' }) } }, enterInsertMode: function(cm, actionArgs, vim) { - if (cm.getOption('readOnly')) { return; } - vim.insertMode = true; - vim.insertModeRepeat = actionArgs && actionArgs.repeat || 1; - cm.leaveVimMode(); - var insertAt = (actionArgs) ? actionArgs.insertAt : null; - var sel = vim.sel; - var head = actionArgs.head || cm.getCursor('head'); - var height = cm.listSelections().length; - if (insertAt == 'eol') { - head = Pos(head.line, lineLength(cm, head.line)); - } else if (insertAt == 'charAfter') { - head = offsetCursor(head, 0, 1); - } else if (insertAt == 'firstNonBlank') { - head = motions.moveToFirstNonWhiteSpaceCharacter(cm, head); - } else if (insertAt == 'startOfSelectedArea') { + if (cm.getOption('readOnly')) { + return + } + vim.insertMode = true + vim.insertModeRepeat = (actionArgs && actionArgs.repeat) || 1 + cm.leaveVimMode() + var insertAt = actionArgs ? actionArgs.insertAt : null + var sel = vim.sel + var head = actionArgs.head || cm.getCursor('head') + var height = cm.listSelections().length + if (insertAt === 'eol') { + head = Pos(head.line, lineLength(cm, head.line)) + } else if (insertAt === 'charAfter') { + head = offsetCursor(head, 0, 1) + } else if (insertAt === 'firstNonBlank') { + head = motions.moveToFirstNonWhiteSpaceCharacter(cm, head) + } else if (insertAt === 'startOfSelectedArea') { if (!vim.visualBlock) { if (sel.head.line < sel.anchor.line) { - head = sel.head; + head = sel.head } else { - head = Pos(sel.anchor.line, 0); + head = Pos(sel.anchor.line, 0) } } else { - head = Pos( - Math.min(sel.head.line, sel.anchor.line), - Math.min(sel.head.ch, sel.anchor.ch)); - height = Math.abs(sel.head.line - sel.anchor.line) + 1; + head = Pos(Math.min(sel.head.line, sel.anchor.line), Math.min(sel.head.ch, sel.anchor.ch)) + height = Math.abs(sel.head.line - sel.anchor.line) + 1 } - } else if (insertAt == 'endOfSelectedArea') { + } else if (insertAt === 'endOfSelectedArea') { if (!vim.visualBlock) { if (sel.head.line >= sel.anchor.line) { - head = offsetCursor(sel.head, 0, 1); + head = offsetCursor(sel.head, 0, 1) } else { - head = Pos(sel.anchor.line, 0); + head = Pos(sel.anchor.line, 0) } } else { - head = Pos( - Math.min(sel.head.line, sel.anchor.line), - Math.max(sel.head.ch + 1, sel.anchor.ch)); - height = Math.abs(sel.head.line - sel.anchor.line) + 1; + head = Pos(Math.min(sel.head.line, sel.anchor.line), Math.max(sel.head.ch + 1, sel.anchor.ch)) + height = Math.abs(sel.head.line - sel.anchor.line) + 1 } - } else if (insertAt == 'inplace') { - if (vim.visualMode){ - return; + } else if (insertAt === 'inplace') { + if (vim.visualMode) { + return } } - cm.setOption('disableInput', false); + cm.setOption('disableInput', false) if (vim.visualMode) { - exitVisualMode(cm); + exitVisualMode(cm) } if (actionArgs && actionArgs.replace) { // Handle Replace-mode as a special case of insert mode. - cm.toggleOverwrite(true); - cm.setOption('keyMap', 'vim-replace'); - CodeMirror.signal(cm, "vim-mode-change", {mode: "replace"}); + cm.toggleOverwrite(true) + cm.setOption('keyMap', 'vim-replace') + CodeMirror.signal(cm, 'vim-mode-change', { mode: 'replace' }) } else { - cm.toggleOverwrite(false); - cm.setOption('keyMap', 'vim-insert'); - CodeMirror.signal(cm, "vim-mode-change", {mode: "insert"}); + cm.toggleOverwrite(false) + cm.setOption('keyMap', 'vim-insert') + CodeMirror.signal(cm, 'vim-mode-change', { mode: 'insert' }) } if (!vimGlobalState.macroModeState.isPlaying) { // Only record if not replaying. - cm.on('change', onChange); - CodeMirror.on(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown); + cm.on('change', onChange) + CodeMirror.on(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown) } - selectForInsert(cm, head, height); + selectForInsert(cm, head, height) }, toggleVisualMode: function(cm, actionArgs, vim) { - var repeat = actionArgs.repeat; - var anchor = cm.getCursor(); - var head; + var repeat = actionArgs.repeat + var anchor = cm.getCursor() + var head // TODO: The repeat should actually select number of characters/lines // equal to the repeat times the size of the previous visual // operation. if (!vim.visualMode) { // Entering visual mode - vim.visualMode = true; - vim.visualLine = !!actionArgs.linewise; - vim.visualBlock = !!actionArgs.blockwise; - head = clipCursorToContent( - cm, Pos(anchor.line, anchor.ch + repeat - 1), - true /** includeLineBreak */); + vim.visualMode = true + vim.visualLine = !!actionArgs.linewise + vim.visualBlock = !!actionArgs.blockwise + head = clipCursorToContent(cm, Pos(anchor.line, anchor.ch + repeat - 1), true /** includeLineBreak */) vim.sel = { anchor: anchor, - head: head - }; - CodeMirror.signal(cm, "vim-mode-change", {mode: "visual", subMode: vim.visualLine ? "linewise" : vim.visualBlock ? "blockwise" : ""}); - updateCmSelection(cm); - updateMark(cm, vim, '<', cursorMin(anchor, head)); - updateMark(cm, vim, '>', cursorMax(anchor, head)); - } else if (vim.visualLine ^ actionArgs.linewise || - vim.visualBlock ^ actionArgs.blockwise) { + head: head, + } + CodeMirror.signal(cm, 'vim-mode-change', { + mode: 'visual', + subMode: vim.visualLine ? 'linewise' : vim.visualBlock ? 'blockwise' : '', + }) + updateCmSelection(cm) + updateMark(cm, vim, '<', cursorMin(anchor, head)) + updateMark(cm, vim, '>', cursorMax(anchor, head)) + } else if (vim.visualLine ^ actionArgs.linewise || vim.visualBlock ^ actionArgs.blockwise) { // Toggling between modes - vim.visualLine = !!actionArgs.linewise; - vim.visualBlock = !!actionArgs.blockwise; - CodeMirror.signal(cm, "vim-mode-change", {mode: "visual", subMode: vim.visualLine ? "linewise" : vim.visualBlock ? "blockwise" : ""}); - updateCmSelection(cm); + vim.visualLine = !!actionArgs.linewise + vim.visualBlock = !!actionArgs.blockwise + CodeMirror.signal(cm, 'vim-mode-change', { + mode: 'visual', + subMode: vim.visualLine ? 'linewise' : vim.visualBlock ? 'blockwise' : '', + }) + updateCmSelection(cm) } else { - exitVisualMode(cm); + exitVisualMode(cm) } }, reselectLastSelection: function(cm, _actionArgs, vim) { - var lastSelection = vim.lastSelection; + var lastSelection = vim.lastSelection if (vim.visualMode) { - updateLastSelection(cm, vim); + updateLastSelection(cm, vim) } if (lastSelection) { - var anchor = lastSelection.anchorMark.find(); - var head = lastSelection.headMark.find(); + var anchor = lastSelection.anchorMark.find() + var head = lastSelection.headMark.find() if (!anchor || !head) { // If the marks have been destroyed due to edits, do nothing. - return; + return } vim.sel = { anchor: anchor, - head: head - }; - vim.visualMode = true; - vim.visualLine = lastSelection.visualLine; - vim.visualBlock = lastSelection.visualBlock; - updateCmSelection(cm); - updateMark(cm, vim, '<', cursorMin(anchor, head)); - updateMark(cm, vim, '>', cursorMax(anchor, head)); + head: head, + } + vim.visualMode = true + vim.visualLine = lastSelection.visualLine + vim.visualBlock = lastSelection.visualBlock + updateCmSelection(cm) + updateMark(cm, vim, '<', cursorMin(anchor, head)) + updateMark(cm, vim, '>', cursorMax(anchor, head)) CodeMirror.signal(cm, 'vim-mode-change', { mode: 'visual', - subMode: vim.visualLine ? 'linewise' : - vim.visualBlock ? 'blockwise' : ''}); + subMode: vim.visualLine ? 'linewise' : vim.visualBlock ? 'blockwise' : '', + }) } }, joinLines: function(cm, actionArgs, vim) { - var curStart, curEnd; + var curStart, curEnd if (vim.visualMode) { - curStart = cm.getCursor('anchor'); - curEnd = cm.getCursor('head'); + curStart = cm.getCursor('anchor') + curEnd = cm.getCursor('head') if (cursorIsBefore(curEnd, curStart)) { - var tmp = curEnd; - curEnd = curStart; - curStart = tmp; + var tmp = curEnd + curEnd = curStart + curStart = tmp } - curEnd.ch = lineLength(cm, curEnd.line) - 1; + curEnd.ch = lineLength(cm, curEnd.line) - 1 } else { // Repeat is the number of lines to join. Minimum 2 lines. - var repeat = Math.max(actionArgs.repeat, 2); - curStart = cm.getCursor(); - curEnd = clipCursorToContent(cm, Pos(curStart.line + repeat - 1, - Infinity)); + var repeat = Math.max(actionArgs.repeat, 2) + curStart = cm.getCursor() + curEnd = clipCursorToContent(cm, Pos(curStart.line + repeat - 1, Infinity)) } - var finalCh = 0; + var finalCh = 0 for (var i = curStart.line; i < curEnd.line; i++) { - finalCh = lineLength(cm, curStart.line); - var tmp = Pos(curStart.line + 1, - lineLength(cm, curStart.line + 1)); - var text = cm.getRange(curStart, tmp); - text = text.replace(/\n\s*/g, ' '); - cm.replaceRange(text, curStart, tmp); - } - var curFinalPos = Pos(curStart.line, finalCh); + finalCh = lineLength(cm, curStart.line) + var tmp = Pos(curStart.line + 1, lineLength(cm, curStart.line + 1)) + var text = cm.getRange(curStart, tmp) + text = text.replace(/\n\s*/g, ' ') + cm.replaceRange(text, curStart, tmp) + } + var curFinalPos = Pos(curStart.line, finalCh) if (vim.visualMode) { - exitVisualMode(cm, false); + exitVisualMode(cm, false) } - cm.setCursor(curFinalPos); + cm.setCursor(curFinalPos) }, newLineAndEnterInsertMode: function(cm, actionArgs, vim) { - vim.insertMode = true; - var insertAt = copyCursor(cm.getCursor()); + vim.insertMode = true + var insertAt = copyCursor(cm.getCursor()) if (insertAt.line === cm.firstLine() && !actionArgs.after) { // Special case for inserting newline before start of document. - cm.replaceRange('\n', Pos(cm.firstLine(), 0)); - cm.setCursor(cm.firstLine(), 0); + cm.replaceRange('\n', Pos(cm.firstLine(), 0)) + cm.setCursor(cm.firstLine(), 0) } else { - insertAt.line = (actionArgs.after) ? insertAt.line : - insertAt.line - 1; - insertAt.ch = lineLength(cm, insertAt.line); - cm.setCursor(insertAt); - var newlineFn = CodeMirror.commands.newlineAndIndentContinueComment || - CodeMirror.commands.newlineAndIndent; - newlineFn(cm); - } - this.enterInsertMode(cm, { repeat: actionArgs.repeat }, vim); + insertAt.line = actionArgs.after ? insertAt.line : insertAt.line - 1 + insertAt.ch = lineLength(cm, insertAt.line) + cm.setCursor(insertAt) + var newlineFn = CodeMirror.commands.newlineAndIndentContinueComment || CodeMirror.commands.newlineAndIndent + newlineFn(cm) + } + this.enterInsertMode(cm, { repeat: actionArgs.repeat }, vim) }, paste: function(cm, actionArgs, vim) { - var cur = copyCursor(cm.getCursor()); - var register = vimGlobalState.registerController.getRegister( - actionArgs.registerName); - var text = register.toString(); + var cur = copyCursor(cm.getCursor()) + var register = vimGlobalState.registerController.getRegister(actionArgs.registerName) + var text = register.toString() if (!text) { - return; + return } if (actionArgs.matchIndent) { - var tabSize = cm.getOption("tabSize"); + var tabSize = cm.getOption('tabSize') // length that considers tabs and tabSize var whitespaceLength = function(str) { - var tabs = (str.split("\t").length - 1); - var spaces = (str.split(" ").length - 1); - return tabs * tabSize + spaces * 1; - }; - var currentLine = cm.getLine(cm.getCursor().line); - var indent = whitespaceLength(currentLine.match(/^\s*/)[0]); + var tabs = str.split('\t').length - 1 + var spaces = str.split(' ').length - 1 + return tabs * tabSize + spaces * 1 + } + var currentLine = cm.getLine(cm.getCursor().line) + var indent = whitespaceLength(currentLine.match(/^\s*/)[0]) // chomp last newline b/c don't want it to match /^\s*/gm - var chompedText = text.replace(/\n$/, ''); - var wasChomped = text !== chompedText; - var firstIndent = whitespaceLength(text.match(/^\s*/)[0]); + var chompedText = text.replace(/\n$/, '') + var wasChomped = text !== chompedText + var firstIndent = whitespaceLength(text.match(/^\s*/)[0]) var text = chompedText.replace(/^\s*/gm, function(wspace) { - var newIndent = indent + (whitespaceLength(wspace) - firstIndent); + var newIndent = indent + (whitespaceLength(wspace) - firstIndent) if (newIndent < 0) { - return ""; - } - else if (cm.getOption("indentWithTabs")) { - var quotient = Math.floor(newIndent / tabSize); - return Array(quotient + 1).join('\t'); - } - else { - return Array(newIndent + 1).join(' '); + return '' + } else if (cm.getOption('indentWithTabs')) { + var quotient = Math.floor(newIndent / tabSize) + return Array(quotient + 1).join('\t') + } else { + return Array(newIndent + 1).join(' ') } - }); - text += wasChomped ? "\n" : ""; + }) + text += wasChomped ? '\n' : '' } if (actionArgs.repeat > 1) { - var text = Array(actionArgs.repeat + 1).join(text); + var text = Array(actionArgs.repeat + 1).join(text) } - var linewise = register.linewise; - var blockwise = register.blockwise; + var linewise = register.linewise + var blockwise = register.blockwise if (linewise) { - if(vim.visualMode) { - text = vim.visualLine ? text.slice(0, -1) : '\n' + text.slice(0, text.length - 1) + '\n'; + if (vim.visualMode) { + text = vim.visualLine ? text.slice(0, -1) : '\n' + text.slice(0, text.length - 1) + '\n' } else if (actionArgs.after) { // Move the newline at the end to the start instead, and paste just // before the newline character of the line we are on right now. - text = '\n' + text.slice(0, text.length - 1); - cur.ch = lineLength(cm, cur.line); + text = '\n' + text.slice(0, text.length - 1) + cur.ch = lineLength(cm, cur.line) } else { - cur.ch = 0; + cur.ch = 0 } } else { if (blockwise) { - text = text.split('\n'); + text = text.split('\n') for (var i = 0; i < text.length; i++) { - text[i] = (text[i] == '') ? ' ' : text[i]; + text[i] = text[i] === '' ? ' ' : text[i] } } - cur.ch += actionArgs.after ? 1 : 0; + cur.ch += actionArgs.after ? 1 : 0 } - var curPosFinal; - var idx; + var curPosFinal + var idx if (vim.visualMode) { // save the pasted text for reselection if the need arises - vim.lastPastedText = text; - var lastSelectionCurEnd; - var selectedArea = getSelectedAreaRange(cm, vim); - var selectionStart = selectedArea[0]; - var selectionEnd = selectedArea[1]; - var selectedText = cm.getSelection(); - var selections = cm.listSelections(); - var emptyStrings = new Array(selections.length).join('1').split('1'); + vim.lastPastedText = text + var lastSelectionCurEnd + var selectedArea = getSelectedAreaRange(cm, vim) + var selectionStart = selectedArea[0] + var selectionEnd = selectedArea[1] + var selectedText = cm.getSelection() + var selections = cm.listSelections() + var emptyStrings = new Array(selections.length).join('1').split('1') // save the curEnd marker before it get cleared due to cm.replaceRange. if (vim.lastSelection) { - lastSelectionCurEnd = vim.lastSelection.headMark.find(); + lastSelectionCurEnd = vim.lastSelection.headMark.find() } // push the previously selected text to unnamed register - vimGlobalState.registerController.unnamedRegister.setText(selectedText); + vimGlobalState.registerController.unnamedRegister.setText(selectedText) if (blockwise) { // first delete the selected text - cm.replaceSelections(emptyStrings); + cm.replaceSelections(emptyStrings) // Set new selections as per the block length of the yanked text - selectionEnd = Pos(selectionStart.line + text.length-1, selectionStart.ch); - cm.setCursor(selectionStart); - selectBlock(cm, selectionEnd); - cm.replaceSelections(text); - curPosFinal = selectionStart; + selectionEnd = Pos(selectionStart.line + text.length - 1, selectionStart.ch) + cm.setCursor(selectionStart) + selectBlock(cm, selectionEnd) + cm.replaceSelections(text) + curPosFinal = selectionStart } else if (vim.visualBlock) { - cm.replaceSelections(emptyStrings); - cm.setCursor(selectionStart); - cm.replaceRange(text, selectionStart, selectionStart); - curPosFinal = selectionStart; + cm.replaceSelections(emptyStrings) + cm.setCursor(selectionStart) + cm.replaceRange(text, selectionStart, selectionStart) + curPosFinal = selectionStart } else { - cm.replaceRange(text, selectionStart, selectionEnd); - curPosFinal = cm.posFromIndex(cm.indexFromPos(selectionStart) + text.length - 1); + cm.replaceRange(text, selectionStart, selectionEnd) + curPosFinal = cm.posFromIndex(cm.indexFromPos(selectionStart) + text.length - 1) } // restore the the curEnd marker - if(lastSelectionCurEnd) { - vim.lastSelection.headMark = cm.setBookmark(lastSelectionCurEnd); + if (lastSelectionCurEnd) { + vim.lastSelection.headMark = cm.setBookmark(lastSelectionCurEnd) } if (linewise) { - curPosFinal.ch=0; + curPosFinal.ch = 0 } } else { if (blockwise) { - cm.setCursor(cur); + cm.setCursor(cur) for (var i = 0; i < text.length; i++) { - var line = cur.line+i; + var line = cur.line + i if (line > cm.lastLine()) { - cm.replaceRange('\n', Pos(line, 0)); + cm.replaceRange('\n', Pos(line, 0)) } - var lastCh = lineLength(cm, line); + var lastCh = lineLength(cm, line) if (lastCh < cur.ch) { - extendLineToColumn(cm, line, cur.ch); + extendLineToColumn(cm, line, cur.ch) } } - cm.setCursor(cur); - selectBlock(cm, Pos(cur.line + text.length-1, cur.ch)); - cm.replaceSelections(text); - curPosFinal = cur; + cm.setCursor(cur) + selectBlock(cm, Pos(cur.line + text.length - 1, cur.ch)) + cm.replaceSelections(text) + curPosFinal = cur } else { - cm.replaceRange(text, cur); + cm.replaceRange(text, cur) // Now fine tune the cursor to where we want it. if (linewise && actionArgs.after) { - curPosFinal = Pos( - cur.line + 1, - cm.findFirstNonWhiteSpaceCharacter(cur.line + 1)); + curPosFinal = Pos(cur.line + 1, cm.findFirstNonWhiteSpaceCharacter(cur.line + 1)) } else if (linewise && !actionArgs.after) { - curPosFinal = Pos( - cur.line, - cm.findFirstNonWhiteSpaceCharacter(cur.line)); + curPosFinal = Pos(cur.line, cm.findFirstNonWhiteSpaceCharacter(cur.line)) } else if (!linewise && actionArgs.after) { - idx = cm.indexFromPos(cur); - curPosFinal = cm.posFromIndex(idx + text.length - 1); + idx = cm.indexFromPos(cur) + curPosFinal = cm.posFromIndex(idx + text.length - 1) } else { - idx = cm.indexFromPos(cur); - curPosFinal = cm.posFromIndex(idx + text.length); + idx = cm.indexFromPos(cur) + curPosFinal = cm.posFromIndex(idx + text.length) } } } if (vim.visualMode) { - exitVisualMode(cm, false); + exitVisualMode(cm, false) } - cm.setCursor(curPosFinal); + cm.setCursor(curPosFinal) }, undo: function(cm, actionArgs) { cm.operation(function() { - repeatFn(cm, CodeMirror.commands.undo, actionArgs.repeat)(); - cm.setCursor(cm.getCursor('anchor')); - }); + repeatFn(cm, CodeMirror.commands.undo, actionArgs.repeat)() + cm.setCursor(cm.getCursor('anchor')) + }) }, redo: function(cm, actionArgs) { - repeatFn(cm, CodeMirror.commands.redo, actionArgs.repeat)(); + repeatFn(cm, CodeMirror.commands.redo, actionArgs.repeat)() }, setRegister: function(_cm, actionArgs, vim) { - vim.inputState.registerName = actionArgs.selectedCharacter; + vim.inputState.registerName = actionArgs.selectedCharacter }, setMark: function(cm, actionArgs, vim) { - var markName = actionArgs.selectedCharacter; - updateMark(cm, vim, markName, cm.getCursor()); + var markName = actionArgs.selectedCharacter + updateMark(cm, vim, markName, cm.getCursor()) }, replace: function(cm, actionArgs, vim) { - var replaceWith = actionArgs.selectedCharacter; - var curStart = cm.getCursor(); - var replaceTo; - var curEnd; - var selections = cm.listSelections(); + var replaceWith = actionArgs.selectedCharacter + var curStart = cm.getCursor() + var replaceTo + var curEnd + var selections = cm.listSelections() if (vim.visualMode) { - curStart = cm.getCursor('start'); - curEnd = cm.getCursor('end'); + curStart = cm.getCursor('start') + curEnd = cm.getCursor('end') } else { - var line = cm.getLine(curStart.line); - replaceTo = curStart.ch + actionArgs.repeat; + var line = cm.getLine(curStart.line) + replaceTo = curStart.ch + actionArgs.repeat if (replaceTo > line.length) { - replaceTo=line.length; + replaceTo = line.length } - curEnd = Pos(curStart.line, replaceTo); + curEnd = Pos(curStart.line, replaceTo) } - if (replaceWith=='\n') { - if (!vim.visualMode) cm.replaceRange('', curStart, curEnd); + if (replaceWith == '\n') { + if (!vim.visualMode) cm.replaceRange('', curStart, curEnd) // special case, where vim help says to replace by just one line-break - (CodeMirror.commands.newlineAndIndentContinueComment || CodeMirror.commands.newlineAndIndent)(cm); + ;(CodeMirror.commands.newlineAndIndentContinueComment || CodeMirror.commands.newlineAndIndent)(cm) } else { - var replaceWithStr = cm.getRange(curStart, curEnd); + var replaceWithStr = cm.getRange(curStart, curEnd) //replace all characters in range by selected, but keep linebreaks - replaceWithStr = replaceWithStr.replace(/[^\n]/g, replaceWith); + replaceWithStr = replaceWithStr.replace(/[^\n]/g, replaceWith) if (vim.visualBlock) { // Tabs are split in visua block before replacing - var spaces = new Array(cm.getOption("tabSize")+1).join(' '); - replaceWithStr = cm.getSelection(); - replaceWithStr = replaceWithStr.replace(/\t/g, spaces).replace(/[^\n]/g, replaceWith).split('\n'); - cm.replaceSelections(replaceWithStr); + var spaces = new Array(cm.getOption('tabSize') + 1).join(' ') + replaceWithStr = cm.getSelection() + replaceWithStr = replaceWithStr + .replace(/\t/g, spaces) + .replace(/[^\n]/g, replaceWith) + .split('\n') + cm.replaceSelections(replaceWithStr) } else { - cm.replaceRange(replaceWithStr, curStart, curEnd); + cm.replaceRange(replaceWithStr, curStart, curEnd) } if (vim.visualMode) { - curStart = cursorIsBefore(selections[0].anchor, selections[0].head) ? - selections[0].anchor : selections[0].head; - cm.setCursor(curStart); - exitVisualMode(cm, false); + curStart = cursorIsBefore(selections[0].anchor, selections[0].head) + ? selections[0].anchor + : selections[0].head + cm.setCursor(curStart) + exitVisualMode(cm, false) } else { - cm.setCursor(offsetCursor(curEnd, 0, -1)); + cm.setCursor(offsetCursor(curEnd, 0, -1)) } } }, incrementNumberToken: function(cm, actionArgs) { - var cur = cm.getCursor(); - var lineStr = cm.getLine(cur.line); - var re = /(-?)(?:(0x)([\da-f]+)|(0b|0|)(\d+))/gi; - var match; - var start; - var end; - var numberStr; + var cur = cm.getCursor() + var lineStr = cm.getLine(cur.line) + var re = /(-?)(?:(0x)([\da-f]+)|(0b|0|)(\d+))/gi + var match + var start + var end + var numberStr while ((match = re.exec(lineStr)) !== null) { - start = match.index; - end = start + match[0].length; - if (cur.ch < end)break; + start = match.index + end = start + match[0].length + if (cur.ch < end) break } - if (!actionArgs.backtrack && (end <= cur.ch))return; + if (!actionArgs.backtrack && end <= cur.ch) return if (match) { var baseStr = match[2] || match[4] var digits = match[3] || match[5] - var increment = actionArgs.increase ? 1 : -1; - var base = {'0b': 2, '0': 8, '': 10, '0x': 16}[baseStr.toLowerCase()]; - var number = parseInt(match[1] + digits, base) + (increment * actionArgs.repeat); - numberStr = number.toString(base); + var increment = actionArgs.increase ? 1 : -1 + var base = { '0b': 2, '0': 8, '': 10, '0x': 16 }[baseStr.toLowerCase()] + var number = parseInt(match[1] + digits, base) + increment * actionArgs.repeat + numberStr = number.toString(base) var zeroPadding = baseStr ? new Array(digits.length - numberStr.length + 1 + match[1].length).join('0') : '' if (numberStr.charAt(0) === '-') { - numberStr = '-' + baseStr + zeroPadding + numberStr.substr(1); + numberStr = '-' + baseStr + zeroPadding + numberStr.substr(1) } else { - numberStr = baseStr + zeroPadding + numberStr; + numberStr = baseStr + zeroPadding + numberStr } - var from = Pos(cur.line, start); - var to = Pos(cur.line, end); - cm.replaceRange(numberStr, from, to); + var from = Pos(cur.line, start) + var to = Pos(cur.line, end) + cm.replaceRange(numberStr, from, to) } else { - return; + return } - cm.setCursor(Pos(cur.line, start + numberStr.length - 1)); + cm.setCursor(Pos(cur.line, start + numberStr.length - 1)) }, repeatLastEdit: function(cm, actionArgs, vim) { - var lastEditInputState = vim.lastEditInputState; - if (!lastEditInputState) { return; } - var repeat = actionArgs.repeat; + var lastEditInputState = vim.lastEditInputState + if (!lastEditInputState) { + return + } + var repeat = actionArgs.repeat if (repeat && actionArgs.repeatIsExplicit) { - vim.lastEditInputState.repeatOverride = repeat; + vim.lastEditInputState.repeatOverride = repeat } else { - repeat = vim.lastEditInputState.repeatOverride || repeat; + repeat = vim.lastEditInputState.repeatOverride || repeat } - repeatLastEdit(cm, vim, repeat, false /** repeatForInsert */); + repeatLastEdit(cm, vim, repeat, false /** repeatForInsert */) }, indent: function(cm, actionArgs) { - cm.indentLine(cm.getCursor().line, actionArgs.indentRight); + cm.indentLine(cm.getCursor().line, actionArgs.indentRight) }, - exitInsertMode: exitInsertMode - }; + exitInsertMode: exitInsertMode, + } function defineAction(name, fn) { - actions[name] = fn; + actions[name] = fn } /* @@ -2710,144 +2958,156 @@ var Vim = function() { /** * Clips cursor to ensure that line is within the buffer's range - * If includeLineBreak is true, then allow cur.ch == lineLength. + * If includeLineBreak is true, then allow cur.ch === lineLength. */ function clipCursorToContent(cm, cur, includeLineBreak) { - var line = Math.min(Math.max(cm.firstLine(), cur.line), cm.lastLine() ); - var maxCh = lineLength(cm, line) - 1; - maxCh = (includeLineBreak) ? maxCh + 1 : maxCh; - var ch = Math.min(Math.max(0, cur.ch), maxCh); - return Pos(line, ch); + var line = Math.min(Math.max(cm.firstLine(), cur.line), cm.lastLine()) + var maxCh = lineLength(cm, line) - 1 + maxCh = includeLineBreak ? maxCh + 1 : maxCh + var ch = Math.min(Math.max(0, cur.ch), maxCh) + return Pos(line, ch) } function copyArgs(args) { - var ret = {}; + var ret = {} for (var prop in args) { if (args.hasOwnProperty(prop)) { - ret[prop] = args[prop]; + ret[prop] = args[prop] } } - return ret; + return ret } function offsetCursor(cur, offsetLine, offsetCh) { if (typeof offsetLine === 'object') { - offsetCh = offsetLine.ch; - offsetLine = offsetLine.line; + offsetCh = offsetLine.ch + offsetLine = offsetLine.line } - return Pos(cur.line + offsetLine, cur.ch + offsetCh); + return Pos(cur.line + offsetLine, cur.ch + offsetCh) } function getOffset(anchor, head) { return { line: head.line - anchor.line, - ch: head.line - anchor.line - }; + ch: head.line - anchor.line, + } } function commandMatches(keys, keyMap, context, inputState) { // Partial matches are not applied. They inform the key handler // that the current key sequence is a subsequence of a valid key // sequence, so that the key buffer is not cleared. - var match, partial = [], full = []; + var match, + partial = [], + full = [] for (var i = 0; i < keyMap.length; i++) { - var command = keyMap[i]; - if (context == 'insert' && command.context != 'insert' || - command.context && command.context != context || - inputState.operator && command.type == 'action' || - !(match = commandMatch(keys, command.keys))) { continue; } - if (match == 'partial') { partial.push(command); } - if (match == 'full') { full.push(command); } + var command = keyMap[i] + if ( + (context === 'insert' && command.context != 'insert') || + (command.context && command.context != context) || + (inputState.operator && command.type === 'action') || + !(match = commandMatch(keys, command.keys)) + ) { + continue + } + if (match === 'partial') { + partial.push(command) + } + if (match === 'full') { + full.push(command) + } } return { partial: partial.length && partial, - full: full.length && full - }; + full: full.length && full, + } } function commandMatch(pressed, mapped) { - if (mapped.slice(-11) == '') { + if (mapped.slice(-11) === '') { // Last character matches anything. - var prefixLen = mapped.length - 11; - var pressedPrefix = pressed.slice(0, prefixLen); - var mappedPrefix = mapped.slice(0, prefixLen); - return pressedPrefix == mappedPrefix && pressed.length > prefixLen ? 'full' : - mappedPrefix.indexOf(pressedPrefix) == 0 ? 'partial' : false; + var prefixLen = mapped.length - 11 + var pressedPrefix = pressed.slice(0, prefixLen) + var mappedPrefix = mapped.slice(0, prefixLen) + return pressedPrefix === mappedPrefix && pressed.length > prefixLen + ? 'full' + : mappedPrefix.indexOf(pressedPrefix) === 0 + ? 'partial' + : false } else { - return pressed == mapped ? 'full' : - mapped.indexOf(pressed) == 0 ? 'partial' : false; + return pressed === mapped ? 'full' : mapped.indexOf(pressed) === 0 ? 'partial' : false } } function lastChar(keys) { - var match = /^.*(<[^>]+>)$/.exec(keys); - var selectedCharacter = match ? match[1] : keys.slice(-1); - if (selectedCharacter.length > 1){ - switch(selectedCharacter){ + var match = /^.*(<[^>]+>)$/.exec(keys) + var selectedCharacter = match ? match[1] : keys.slice(-1) + if (selectedCharacter.length > 1) { + switch (selectedCharacter) { case '': - selectedCharacter='\n'; - break; + selectedCharacter = '\n' + break case '': - selectedCharacter=' '; - break; + selectedCharacter = ' ' + break default: - selectedCharacter=''; - break; + selectedCharacter = '' + break } } - return selectedCharacter; + return selectedCharacter } function repeatFn(cm, fn, repeat) { return function() { for (var i = 0; i < repeat; i++) { - fn(cm); + fn(cm) } - }; + } } function copyCursor(cur) { - return Pos(cur.line, cur.ch); + return Pos(cur.line, cur.ch) } function cursorEqual(cur1, cur2) { - return cur1.ch == cur2.ch && cur1.line == cur2.line; + return cur1.ch === cur2.ch && cur1.line === cur2.line } function cursorIsBefore(cur1, cur2) { if (cur1.line < cur2.line) { - return true; + return true } - if (cur1.line == cur2.line && cur1.ch < cur2.ch) { - return true; + if (cur1.line === cur2.line && cur1.ch < cur2.ch) { + return true } - return false; + return false } function cursorMin(cur1, cur2) { if (arguments.length > 2) { - cur2 = cursorMin.apply(undefined, Array.prototype.slice.call(arguments, 1)); + cur2 = cursorMin.apply(undefined, Array.prototype.slice.call(arguments, 1)) } - return cursorIsBefore(cur1, cur2) ? cur1 : cur2; + return cursorIsBefore(cur1, cur2) ? cur1 : cur2 } function cursorMax(cur1, cur2) { if (arguments.length > 2) { - cur2 = cursorMax.apply(undefined, Array.prototype.slice.call(arguments, 1)); + cur2 = cursorMax.apply(undefined, Array.prototype.slice.call(arguments, 1)) } - return cursorIsBefore(cur1, cur2) ? cur2 : cur1; + return cursorIsBefore(cur1, cur2) ? cur2 : cur1 } function cursorIsBetween(cur1, cur2, cur3) { // returns true if cur2 is between cur1 and cur3. - var cur1before2 = cursorIsBefore(cur1, cur2); - var cur2before3 = cursorIsBefore(cur2, cur3); - return cur1before2 && cur2before3; + var cur1before2 = cursorIsBefore(cur1, cur2) + var cur2before3 = cursorIsBefore(cur2, cur3) + return cur1before2 && cur2before3 } function lineLength(cm, lineNum) { - return cm.getLine(lineNum).length; + return cm.getLine(lineNum).length } function trim(s) { if (s.trim) { - return s.trim(); + return s.trim() } - return s.replace(/^\s+|\s+$/g, ''); + return s.replace(/^\s+|\s+$/g, '') } function escapeRegex(s) { - return s.replace(/([.?*+$\[\]\/\\(){}|\-])/g, '\\$1'); + return s.replace(/([.?*+$\[\]\/\\(){}|\-])/g, '\\$1') } function extendLineToColumn(cm, lineNum, column) { - var endCh = lineLength(cm, lineNum); - var spaces = new Array(column-endCh+1).join(' '); - cm.setCursor(Pos(lineNum, endCh)); - cm.replaceRange(spaces, cm.getCursor()); + var endCh = lineLength(cm, lineNum) + var spaces = new Array(column - endCh + 1).join(' ') + cm.setCursor(Pos(lineNum, endCh)) + cm.replaceRange(spaces, cm.getCursor()) } // This functions selects a rectangular block // of text with selectionEnd as any of its corner @@ -2856,239 +3116,246 @@ var Vim = function() { // Width of the block: // Distance between selectionEnd.ch and any(first considered here) selection.ch function selectBlock(cm, selectionEnd) { - var selections = [], ranges = cm.listSelections(); - var head = copyCursor(cm.clipPos(selectionEnd)); - var isClipped = !cursorEqual(selectionEnd, head); - var curHead = cm.getCursor('head'); - var primIndex = getIndex(ranges, curHead); - var wasClipped = cursorEqual(ranges[primIndex].head, ranges[primIndex].anchor); - var max = ranges.length - 1; - var index = max - primIndex > primIndex ? max : 0; - var base = ranges[index].anchor; - - var firstLine = Math.min(base.line, head.line); - var lastLine = Math.max(base.line, head.line); - var baseCh = base.ch, headCh = head.ch; - - var dir = ranges[index].head.ch - baseCh; - var newDir = headCh - baseCh; + var selections = [], + ranges = cm.listSelections() + var head = copyCursor(cm.clipPos(selectionEnd)) + var isClipped = !cursorEqual(selectionEnd, head) + var curHead = cm.getCursor('head') + var primIndex = getIndex(ranges, curHead) + var wasClipped = cursorEqual(ranges[primIndex].head, ranges[primIndex].anchor) + var max = ranges.length - 1 + var index = max - primIndex > primIndex ? max : 0 + var base = ranges[index].anchor + + var firstLine = Math.min(base.line, head.line) + var lastLine = Math.max(base.line, head.line) + var baseCh = base.ch, + headCh = head.ch + + var dir = ranges[index].head.ch - baseCh + var newDir = headCh - baseCh if (dir > 0 && newDir <= 0) { - baseCh++; - if (!isClipped) { headCh--; } + baseCh++ + if (!isClipped) { + headCh-- + } } else if (dir < 0 && newDir >= 0) { - baseCh--; - if (!wasClipped) { headCh++; } - } else if (dir < 0 && newDir == -1) { - baseCh--; - headCh++; + baseCh-- + if (!wasClipped) { + headCh++ + } + } else if (dir < 0 && newDir === -1) { + baseCh-- + headCh++ } for (var line = firstLine; line <= lastLine; line++) { - var range = {anchor: new Pos(line, baseCh), head: new Pos(line, headCh)}; - selections.push(range); + var range = { anchor: new Pos(line, baseCh), head: new Pos(line, headCh) } + selections.push(range) } - cm.setSelections(selections); - selectionEnd.ch = headCh; - base.ch = baseCh; - return base; + cm.setSelections(selections) + selectionEnd.ch = headCh + base.ch = baseCh + return base } function selectForInsert(cm, head, height) { - var sel = []; + var sel = [] for (var i = 0; i < height; i++) { - var lineHead = offsetCursor(head, i, 0); - sel.push({anchor: lineHead, head: lineHead}); + var lineHead = offsetCursor(head, i, 0) + sel.push({ anchor: lineHead, head: lineHead }) } - cm.setSelections(sel, 0); + cm.setSelections(sel, 0) } // getIndex returns the index of the cursor in the selections. function getIndex(ranges, cursor, end) { for (var i = 0; i < ranges.length; i++) { - var atAnchor = end != 'head' && cursorEqual(ranges[i].anchor, cursor); - var atHead = end != 'anchor' && cursorEqual(ranges[i].head, cursor); + var atAnchor = end != 'head' && cursorEqual(ranges[i].anchor, cursor) + var atHead = end != 'anchor' && cursorEqual(ranges[i].head, cursor) if (atAnchor || atHead) { - return i; + return i } } - return -1; + return -1 } function getSelectedAreaRange(cm, vim) { - var lastSelection = vim.lastSelection; + var lastSelection = vim.lastSelection var getCurrentSelectedAreaRange = function() { - var selections = cm.listSelections(); - var start = selections[0]; - var end = selections[selections.length-1]; - var selectionStart = cursorIsBefore(start.anchor, start.head) ? start.anchor : start.head; - var selectionEnd = cursorIsBefore(end.anchor, end.head) ? end.head : end.anchor; - return [selectionStart, selectionEnd]; - }; + var selections = cm.listSelections() + var start = selections[0] + var end = selections[selections.length - 1] + var selectionStart = cursorIsBefore(start.anchor, start.head) ? start.anchor : start.head + var selectionEnd = cursorIsBefore(end.anchor, end.head) ? end.head : end.anchor + return [selectionStart, selectionEnd] + } var getLastSelectedAreaRange = function() { - var selectionStart = cm.getCursor(); - var selectionEnd = cm.getCursor(); - var block = lastSelection.visualBlock; + var selectionStart = cm.getCursor() + var selectionEnd = cm.getCursor() + var block = lastSelection.visualBlock if (block) { - var width = block.width; - var height = block.height; - selectionEnd = Pos(selectionStart.line + height, selectionStart.ch + width); - var selections = []; + var width = block.width + var height = block.height + selectionEnd = Pos(selectionStart.line + height, selectionStart.ch + width) + var selections = [] // selectBlock creates a 'proper' rectangular block. // We do not want that in all cases, so we manually set selections. for (var i = selectionStart.line; i < selectionEnd.line; i++) { - var anchor = Pos(i, selectionStart.ch); - var head = Pos(i, selectionEnd.ch); - var range = {anchor: anchor, head: head}; - selections.push(range); + var anchor = Pos(i, selectionStart.ch) + var head = Pos(i, selectionEnd.ch) + var range = { anchor: anchor, head: head } + selections.push(range) } - cm.setSelections(selections); + cm.setSelections(selections) } else { - var start = lastSelection.anchorMark.find(); - var end = lastSelection.headMark.find(); - var line = end.line - start.line; - var ch = end.ch - start.ch; - selectionEnd = {line: selectionEnd.line + line, ch: line ? selectionEnd.ch : ch + selectionEnd.ch}; + var start = lastSelection.anchorMark.find() + var end = lastSelection.headMark.find() + var line = end.line - start.line + var ch = end.ch - start.ch + selectionEnd = { line: selectionEnd.line + line, ch: line ? selectionEnd.ch : ch + selectionEnd.ch } if (lastSelection.visualLine) { - selectionStart = Pos(selectionStart.line, 0); - selectionEnd = Pos(selectionEnd.line, lineLength(cm, selectionEnd.line)); + selectionStart = Pos(selectionStart.line, 0) + selectionEnd = Pos(selectionEnd.line, lineLength(cm, selectionEnd.line)) } - cm.setSelection(selectionStart, selectionEnd); + cm.setSelection(selectionStart, selectionEnd) } - return [selectionStart, selectionEnd]; - }; + return [selectionStart, selectionEnd] + } if (!vim.visualMode) { - // In case of replaying the action. - return getLastSelectedAreaRange(); + // In case of replaying the action. + return getLastSelectedAreaRange() } else { - return getCurrentSelectedAreaRange(); + return getCurrentSelectedAreaRange() } } // Updates the previous selection with the current selection's values. This // should only be called in visual mode. function updateLastSelection(cm, vim) { - var anchor = vim.sel.anchor; - var head = vim.sel.head; + var anchor = vim.sel.anchor + var head = vim.sel.head // To accommodate the effect of lastPastedText in the last selection if (vim.lastPastedText) { - head = cm.posFromIndex(cm.indexFromPos(anchor) + vim.lastPastedText.length); - vim.lastPastedText = null; + head = cm.posFromIndex(cm.indexFromPos(anchor) + vim.lastPastedText.length) + vim.lastPastedText = null + } + vim.lastSelection = { + anchorMark: cm.setBookmark(anchor), + headMark: cm.setBookmark(head), + anchor: copyCursor(anchor), + head: copyCursor(head), + visualMode: vim.visualMode, + visualLine: vim.visualLine, + visualBlock: vim.visualBlock, } - vim.lastSelection = {'anchorMark': cm.setBookmark(anchor), - 'headMark': cm.setBookmark(head), - 'anchor': copyCursor(anchor), - 'head': copyCursor(head), - 'visualMode': vim.visualMode, - 'visualLine': vim.visualLine, - 'visualBlock': vim.visualBlock}; } function expandSelection(cm, start, end) { - var sel = cm.state.vim.sel; - var head = sel.head; - var anchor = sel.anchor; - var tmp; + var sel = cm.state.vim.sel + var head = sel.head + var anchor = sel.anchor + var tmp if (cursorIsBefore(end, start)) { - tmp = end; - end = start; - start = tmp; + tmp = end + end = start + start = tmp } if (cursorIsBefore(head, anchor)) { - head = cursorMin(start, head); - anchor = cursorMax(anchor, end); + head = cursorMin(start, head) + anchor = cursorMax(anchor, end) } else { - anchor = cursorMin(start, anchor); - head = cursorMax(head, end); - head = offsetCursor(head, 0, -1); - if (head.ch == -1 && head.line != cm.firstLine()) { - head = Pos(head.line - 1, lineLength(cm, head.line - 1)); + anchor = cursorMin(start, anchor) + head = cursorMax(head, end) + head = offsetCursor(head, 0, -1) + if (head.ch === -1 && head.line != cm.firstLine()) { + head = Pos(head.line - 1, lineLength(cm, head.line - 1)) } } - return [anchor, head]; + return [anchor, head] } /** * Updates the CodeMirror selection to match the provided vim selection. * If no arguments are given, it uses the current vim selection state. */ function updateCmSelection(cm, sel, mode) { - var vim = cm.state.vim; - sel = sel || vim.sel; - var mode = mode || - vim.visualLine ? 'line' : vim.visualBlock ? 'block' : 'char'; - var cmSel = makeCmSelection(cm, sel, mode); - cm.setSelections(cmSel.ranges, cmSel.primary); - updateFakeCursor(cm); + var vim = cm.state.vim + sel = sel || vim.sel + var mode = mode || vim.visualLine ? 'line' : vim.visualBlock ? 'block' : 'char' + var cmSel = makeCmSelection(cm, sel, mode) + cm.setSelections(cmSel.ranges, cmSel.primary) + updateFakeCursor(cm) } function makeCmSelection(cm, sel, mode, exclusive) { - var head = copyCursor(sel.head); - var anchor = copyCursor(sel.anchor); - if (mode == 'char') { - var headOffset = !exclusive && !cursorIsBefore(sel.head, sel.anchor) ? 1 : 0; - var anchorOffset = cursorIsBefore(sel.head, sel.anchor) ? 1 : 0; - head = offsetCursor(sel.head, 0, headOffset); - anchor = offsetCursor(sel.anchor, 0, anchorOffset); + var head = copyCursor(sel.head) + var anchor = copyCursor(sel.anchor) + if (mode === 'char') { + var headOffset = !exclusive && !cursorIsBefore(sel.head, sel.anchor) ? 1 : 0 + var anchorOffset = cursorIsBefore(sel.head, sel.anchor) ? 1 : 0 + head = offsetCursor(sel.head, 0, headOffset) + anchor = offsetCursor(sel.anchor, 0, anchorOffset) return { - ranges: [{anchor: anchor, head: head}], - primary: 0 - }; - } else if (mode == 'line') { + ranges: [{ anchor: anchor, head: head }], + primary: 0, + } + } else if (mode === 'line') { if (!cursorIsBefore(sel.head, sel.anchor)) { - anchor.ch = 0; + anchor.ch = 0 - var lastLine = cm.lastLine(); + var lastLine = cm.lastLine() if (head.line > lastLine) { - head.line = lastLine; + head.line = lastLine } - head.ch = lineLength(cm, head.line); + head.ch = lineLength(cm, head.line) } else { - head.ch = 0; - anchor.ch = lineLength(cm, anchor.line); + head.ch = 0 + anchor.ch = lineLength(cm, anchor.line) } return { - ranges: [{anchor: anchor, head: head}], - primary: 0 - }; - } else if (mode == 'block') { + ranges: [{ anchor: anchor, head: head }], + primary: 0, + } + } else if (mode === 'block') { var top = Math.min(anchor.line, head.line), - left = Math.min(anchor.ch, head.ch), - bottom = Math.max(anchor.line, head.line), - right = Math.max(anchor.ch, head.ch) + 1; - var height = bottom - top + 1; - var primary = head.line == top ? 0 : height - 1; - var ranges = []; + left = Math.min(anchor.ch, head.ch), + bottom = Math.max(anchor.line, head.line), + right = Math.max(anchor.ch, head.ch) + 1 + var height = bottom - top + 1 + var primary = head.line === top ? 0 : height - 1 + var ranges = [] for (var i = 0; i < height; i++) { ranges.push({ anchor: Pos(top + i, left), - head: Pos(top + i, right) - }); + head: Pos(top + i, right), + }) } return { ranges: ranges, - primary: primary - }; + primary: primary, + } } } function getHead(cm) { - var cur = cm.getCursor('head'); - if (cm.getSelection().length == 1) { + var cur = cm.getCursor('head') + if (cm.getSelection().length === 1) { // Small corner case when only 1 character is selected. The "real" // head is the left of head and anchor. - cur = cursorMin(cur, cm.getCursor('anchor')); + cur = cursorMin(cur, cm.getCursor('anchor')) } - return cur; + return cur } /** * If moveHead is set to false, the CodeMirror selection will not be * touched. The caller assumes the responsibility of putting the cursor - * in the right place. + * in the right place. */ function exitVisualMode(cm, moveHead) { - var vim = cm.state.vim; + var vim = cm.state.vim if (moveHead !== false) { - cm.setCursor(clipCursorToContent(cm, vim.sel.head)); + cm.setCursor(clipCursorToContent(cm, vim.sel.head)) } - updateLastSelection(cm, vim); - vim.visualMode = false; - vim.visualLine = false; - vim.visualBlock = false; - CodeMirror.signal(cm, "vim-mode-change", {mode: "normal"}); + updateLastSelection(cm, vim) + vim.visualMode = false + vim.visualLine = false + vim.visualBlock = false + CodeMirror.signal(cm, 'vim-mode-change', { mode: 'normal' }) if (vim.fakeCursor) { - vim.fakeCursor.clear(); + vim.fakeCursor.clear() } } @@ -3097,38 +3364,38 @@ var Vim = function() { // 'dw' should word, but not the newline, while 'w' should advance the // caret to the first character of the next line. function clipToLine(cm, curStart, curEnd) { - var selection = cm.getRange(curStart, curEnd); + var selection = cm.getRange(curStart, curEnd) // Only clip if the selection ends with trailing newline + whitespace if (/\n\s*$/.test(selection)) { - var lines = selection.split('\n'); + var lines = selection.split('\n') // We know this is all whitespace. - lines.pop(); + lines.pop() // Cases: // 1. Last word is an empty line - do not clip the trailing '\n' // 2. Last word is not an empty line - clip the trailing '\n' - var line; + var line // Find the line containing the last word, and clip all whitespace up // to it. for (var line = lines.pop(); lines.length > 0 && line && isWhiteSpaceString(line); line = lines.pop()) { - curEnd.line--; - curEnd.ch = 0; + curEnd.line-- + curEnd.ch = 0 } // If the last word is not an empty line, clip an additional newline if (line) { - curEnd.line--; - curEnd.ch = lineLength(cm, curEnd.line); + curEnd.line-- + curEnd.ch = lineLength(cm, curEnd.line) } else { - curEnd.ch = 0; + curEnd.ch = 0 } } } // Expand the selection to line ends. function expandSelectionToLine(_cm, curStart, curEnd) { - curStart.ch = 0; - curEnd.ch = 0; - curEnd.line++; + curStart.ch = 0 + curEnd.ch = 0 + curEnd.line++ } // function findFirstNonWhiteSpaceCharacter(text) { @@ -3136,181 +3403,202 @@ var Vim = function() { // return 0; // } // var firstNonWS = text.search(/\S/); - // return firstNonWS == -1 ? text.length : firstNonWS; + // return firstNonWS === -1 ? text.length : firstNonWS; // } function expandWordUnderCursor(cm, inclusive, _forward, bigWord, noSymbol) { - var cur = getHead(cm); - var line = cm.getLine(cur.line); - var idx = cur.ch; + var cur = getHead(cm) + var line = cm.getLine(cur.line) + var idx = cur.ch // Seek to first word or non-whitespace character, depending on if // noSymbol is true. - var test = noSymbol ? wordCharTest[0] : bigWordCharTest [0]; + var test = noSymbol ? wordCharTest[0] : bigWordCharTest[0] while (!test(line.charAt(idx))) { - idx++; - if (idx >= line.length) { return null; } + idx++ + if (idx >= line.length) { + return null + } } if (bigWord) { - test = bigWordCharTest[0]; + test = bigWordCharTest[0] } else { - test = wordCharTest[0]; + test = wordCharTest[0] if (!test(line.charAt(idx))) { - test = wordCharTest[1]; + test = wordCharTest[1] } } - var end = idx, start = idx; - while (test(line.charAt(end)) && end < line.length) { end++; } - while (test(line.charAt(start)) && start >= 0) { start--; } - start++; + var end = idx, + start = idx + while (test(line.charAt(end)) && end < line.length) { + end++ + } + while (test(line.charAt(start)) && start >= 0) { + start-- + } + start++ if (inclusive) { // If present, include all whitespace after word. // Otherwise, include all whitespace before word, except indentation. - var wordEnd = end; - while (/\s/.test(line.charAt(end)) && end < line.length) { end++; } - if (wordEnd == end) { - var wordStart = start; - while (/\s/.test(line.charAt(start - 1)) && start > 0) { start--; } - if (!start) { start = wordStart; } + var wordEnd = end + while (/\s/.test(line.charAt(end)) && end < line.length) { + end++ + } + if (wordEnd === end) { + var wordStart = start + while (/\s/.test(line.charAt(start - 1)) && start > 0) { + start-- + } + if (!start) { + start = wordStart + } } } - return { start: Pos(cur.line, start), end: Pos(cur.line, end) }; + return { start: Pos(cur.line, start), end: Pos(cur.line, end) } } function recordJumpPosition(cm, oldCur, newCur) { if (!cursorEqual(oldCur, newCur)) { - vimGlobalState.jumpList.add(cm, oldCur, newCur); + vimGlobalState.jumpList.add(cm, oldCur, newCur) } } function recordLastCharacterSearch(increment, args) { - vimGlobalState.lastCharacterSearch.increment = increment; - vimGlobalState.lastCharacterSearch.forward = args.forward; - vimGlobalState.lastCharacterSearch.selectedCharacter = args.selectedCharacter; + vimGlobalState.lastCharacterSearch.increment = increment + vimGlobalState.lastCharacterSearch.forward = args.forward + vimGlobalState.lastCharacterSearch.selectedCharacter = args.selectedCharacter } var symbolToMode = { - '(': 'bracket', ')': 'bracket', '{': 'bracket', '}': 'bracket', - '[': 'section', ']': 'section', - '*': 'comment', '/': 'comment', - 'm': 'method', 'M': 'method', - '#': 'preprocess' - }; + '(': 'bracket', + ')': 'bracket', + '{': 'bracket', + '}': 'bracket', + '[': 'section', + ']': 'section', + '*': 'comment', + '/': 'comment', + m: 'method', + M: 'method', + '#': 'preprocess', + } var findSymbolModes = { bracket: { isComplete: function(state) { if (state.nextCh === state.symb) { - state.depth++; - if (state.depth >= 1)return true; + state.depth++ + if (state.depth >= 1) return true } else if (state.nextCh === state.reverseSymb) { - state.depth--; + state.depth-- } - return false; - } + return false + }, }, section: { init: function(state) { - state.curMoveThrough = true; - state.symb = (state.forward ? ']' : '[') === state.symb ? '{' : '}'; + state.curMoveThrough = true + state.symb = (state.forward ? ']' : '[') === state.symb ? '{' : '}' }, isComplete: function(state) { - return state.index === 0 && state.nextCh === state.symb; - } + return state.index === 0 && state.nextCh === state.symb + }, }, comment: { isComplete: function(state) { - var found = state.lastCh === '*' && state.nextCh === '/'; - state.lastCh = state.nextCh; - return found; - } + var found = state.lastCh === '*' && state.nextCh === '/' + state.lastCh = state.nextCh + return found + }, }, // TODO: The original Vim implementation only operates on level 1 and 2. // The current implementation doesn't check for code block level and // therefore it operates on any levels. method: { init: function(state) { - state.symb = (state.symb === 'm' ? '{' : '}'); - state.reverseSymb = state.symb === '{' ? '}' : '{'; + state.symb = state.symb === 'm' ? '{' : '}' + state.reverseSymb = state.symb === '{' ? '}' : '{' }, isComplete: function(state) { - if (state.nextCh === state.symb)return true; - return false; - } + if (state.nextCh === state.symb) return true + return false + }, }, preprocess: { init: function(state) { - state.index = 0; + state.index = 0 }, isComplete: function(state) { if (state.nextCh === '#') { - var token = state.lineText.match(/#(\w+)/)[1]; + var token = state.lineText.match(/#(\w+)/)[1] if (token === 'endif') { if (state.forward && state.depth === 0) { - return true; + return true } - state.depth++; + state.depth++ } else if (token === 'if') { if (!state.forward && state.depth === 0) { - return true; + return true } - state.depth--; + state.depth-- } - if (token === 'else' && state.depth === 0)return true; + if (token === 'else' && state.depth === 0) return true } - return false; - } - } - }; + return false + }, + }, + } function findSymbol(cm, repeat, forward, symb) { - var cur = copyCursor(cm.getCursor()); - var increment = forward ? 1 : -1; - var endLine = forward ? cm.lineCount() : -1; - var curCh = cur.ch; - var line = cur.line; - var lineText = cm.getLine(line); + var cur = copyCursor(cm.getCursor()) + var increment = forward ? 1 : -1 + var endLine = forward ? cm.lineCount() : -1 + var curCh = cur.ch + var line = cur.line + var lineText = cm.getLine(line) var state = { lineText: lineText, nextCh: lineText.charAt(curCh), lastCh: null, index: curCh, symb: symb, - reverseSymb: (forward ? { ')': '(', '}': '{' } : { '(': ')', '{': '}' })[symb], + reverseSymb: (forward ? { ')': '(', '}': '{' } : { '(': ')', '{': '}' })[symb], forward: forward, depth: 0, - curMoveThrough: false - }; - var mode = symbolToMode[symb]; - if (!mode)return cur; - var init = findSymbolModes[mode].init; - var isComplete = findSymbolModes[mode].isComplete; - if (init) { init(state); } + curMoveThrough: false, + } + var mode = symbolToMode[symb] + if (!mode) return cur + var init = findSymbolModes[mode].init + var isComplete = findSymbolModes[mode].isComplete + if (init) { + init(state) + } while (line !== endLine && repeat) { - state.index += increment; - state.nextCh = state.lineText.charAt(state.index); + state.index += increment + state.nextCh = state.lineText.charAt(state.index) if (!state.nextCh) { - line += increment; - state.lineText = cm.getLine(line) || ''; + line += increment + state.lineText = cm.getLine(line) || '' if (increment > 0) { - state.index = 0; + state.index = 0 } else { - var lineLen = state.lineText.length; - state.index = (lineLen > 0) ? (lineLen-1) : 0; + var lineLen = state.lineText.length + state.index = lineLen > 0 ? lineLen - 1 : 0 } - state.nextCh = state.lineText.charAt(state.index); + state.nextCh = state.lineText.charAt(state.index) } if (isComplete(state)) { - cur.line = line; - cur.ch = state.index; - repeat--; + cur.line = line + cur.ch = state.index + repeat-- } } if (state.nextCh || state.curMoveThrough) { - return Pos(line, state.index); + return Pos(line, state.index) } - return cur; + return cur } /* @@ -3331,62 +3619,63 @@ var Vim = function() { * the word, or null if there are no more words. */ function findWord(cm, cur, forward, bigWord, emptyLineIsWord) { - var lineNum = cur.line; - var pos = cur.ch; - var line = cm.getLine(lineNum); - var dir = forward ? 1 : -1; - var charTests = bigWord ? bigWordCharTest: wordCharTest; - - if (emptyLineIsWord && line == '') { - lineNum += dir; - line = cm.getLine(lineNum); + var lineNum = cur.line + var pos = cur.ch + var line = cm.getLine(lineNum) + var dir = forward ? 1 : -1 + var charTests = bigWord ? bigWordCharTest : wordCharTest + + if (emptyLineIsWord && line === '') { + lineNum += dir + line = cm.getLine(lineNum) if (!isLine(cm, lineNum)) { - return null; + return null } - pos = (forward) ? 0 : line.length; + pos = forward ? 0 : line.length } while (true) { - if (emptyLineIsWord && line == '') { - return { from: 0, to: 0, line: lineNum }; + if (emptyLineIsWord && line === '') { + return { from: 0, to: 0, line: lineNum } } - var stop = (dir > 0) ? line.length : -1; - var wordStart = stop, wordEnd = stop; + var stop = dir > 0 ? line.length : -1 + var wordStart = stop, + wordEnd = stop // Find bounds of next word. while (pos != stop) { - var foundWord = false; + var foundWord = false for (var i = 0; i < charTests.length && !foundWord; ++i) { if (charTests[i](line.charAt(pos))) { - wordStart = pos; + wordStart = pos // Advance to end of word. while (pos != stop && charTests[i](line.charAt(pos))) { - pos += dir; + pos += dir } - wordEnd = pos; - foundWord = wordStart != wordEnd; - if (wordStart == cur.ch && lineNum == cur.line && - wordEnd == wordStart + dir) { + wordEnd = pos + foundWord = wordStart != wordEnd + if (wordStart === cur.ch && lineNum === cur.line && wordEnd === wordStart + dir) { // We started at the end of a word. Find the next one. - continue; + continue } else { return { from: Math.min(wordStart, wordEnd + 1), to: Math.max(wordStart, wordEnd), - line: lineNum }; + line: lineNum, + } } } } if (!foundWord) { - pos += dir; + pos += dir } } // Advance to next/prev line. - lineNum += dir; + lineNum += dir if (!isLine(cm, lineNum)) { - return null; + return null } - line = cm.getLine(lineNum); - pos = (dir > 0) ? 0 : line.length; + line = cm.getLine(lineNum) + pos = dir > 0 ? 0 : line.length } } @@ -3403,80 +3692,78 @@ var Vim = function() { * @return {Cursor} The position the cursor should move to. */ function moveToWord(cm, cur, repeat, forward, wordEnd, bigWord) { - var curStart = copyCursor(cur); - var words = []; - if (forward && !wordEnd || !forward && wordEnd) { - repeat++; + var curStart = copyCursor(cur) + var words = [] + if ((forward && !wordEnd) || (!forward && wordEnd)) { + repeat++ } // For 'e', empty lines are not considered words, go figure. - var emptyLineIsWord = !(forward && wordEnd); + var emptyLineIsWord = !(forward && wordEnd) for (var i = 0; i < repeat; i++) { - var word = findWord(cm, cur, forward, bigWord, emptyLineIsWord); + var word = findWord(cm, cur, forward, bigWord, emptyLineIsWord) if (!word) { - var eodCh = lineLength(cm, cm.lastLine()); - words.push(forward - ? {line: cm.lastLine(), from: eodCh, to: eodCh} - : {line: 0, from: 0, to: 0}); - break; - } - words.push(word); - cur = Pos(word.line, forward ? (word.to - 1) : word.from); - } - var shortCircuit = words.length != repeat; - var firstWord = words[0]; - var lastWord = words.pop(); + var eodCh = lineLength(cm, cm.lastLine()) + words.push(forward ? { line: cm.lastLine(), from: eodCh, to: eodCh } : { line: 0, from: 0, to: 0 }) + break + } + words.push(word) + cur = Pos(word.line, forward ? word.to - 1 : word.from) + } + var shortCircuit = words.length != repeat + var firstWord = words[0] + var lastWord = words.pop() if (forward && !wordEnd) { // w if (!shortCircuit && (firstWord.from != curStart.ch || firstWord.line != curStart.line)) { // We did not start in the middle of a word. Discard the extra word at the end. - lastWord = words.pop(); + lastWord = words.pop() } - return Pos(lastWord.line, lastWord.from); + return Pos(lastWord.line, lastWord.from) } else if (forward && wordEnd) { - return Pos(lastWord.line, lastWord.to - 1); + return Pos(lastWord.line, lastWord.to - 1) } else if (!forward && wordEnd) { // ge if (!shortCircuit && (firstWord.to != curStart.ch || firstWord.line != curStart.line)) { // We did not start in the middle of a word. Discard the extra word at the end. - lastWord = words.pop(); + lastWord = words.pop() } - return Pos(lastWord.line, lastWord.to); + return Pos(lastWord.line, lastWord.to) } else { // b - return Pos(lastWord.line, lastWord.from); + return Pos(lastWord.line, lastWord.from) } } function moveToCharacter(cm, repeat, forward, character) { - var cur = cm.getCursor(); - var start = cur.ch; - var idx; - for (var i = 0; i < repeat; i ++) { - var line = cm.getLine(cur.line); - idx = charIdxInLine(start, line, character, forward, true); - if (idx == -1) { - return null; + var cur = cm.getCursor() + var start = cur.ch + var idx + for (var i = 0; i < repeat; i++) { + var line = cm.getLine(cur.line) + idx = charIdxInLine(start, line, character, forward, true) + if (idx === -1) { + return null } - start = idx; + start = idx } - return Pos(cm.getCursor().line, idx); + return Pos(cm.getCursor().line, idx) } function moveToColumn(cm, repeat) { // repeat is always >= 1, so repeat - 1 always corresponds // to the column we want to go to. - var line = cm.getCursor().line; - return clipCursorToContent(cm, Pos(line, repeat - 1)); + var line = cm.getCursor().line + return clipCursorToContent(cm, Pos(line, repeat - 1)) } function updateMark(cm, vim, markName, pos) { if (!inArray(markName, validMarks)) { - return; + return } if (vim.marks[markName]) { - vim.marks[markName].clear(); + vim.marks[markName].clear() } - vim.marks[markName] = cm.setBookmark(pos); + vim.marks[markName] = cm.setBookmark(pos) } function charIdxInLine(start, line, character, forward, includeChar) { @@ -3485,71 +3772,83 @@ var Vim = function() { // If includeChar = true, include it too. // If forward = true, search forward, else search backwards. // If char is not found on this line, do nothing - var idx; + var idx if (forward) { - idx = line.indexOf(character, start + 1); + idx = line.indexOf(character, start + 1) if (idx != -1 && !includeChar) { - idx -= 1; + idx -= 1 } } else { - idx = line.lastIndexOf(character, start - 1); + idx = line.lastIndexOf(character, start - 1) if (idx != -1 && !includeChar) { - idx += 1; + idx += 1 } } - return idx; + return idx } function findParagraph(cm, head, repeat, dir, inclusive) { - var line = head.line; - var min = cm.firstLine(); - var max = cm.lastLine(); - var start, end, i = line; - function isEmpty(i) { return !cm.getLine(i); } + var line = head.line + var min = cm.firstLine() + var max = cm.lastLine() + var start, + end, + i = line + function isEmpty(i) { + return !cm.getLine(i) + } function isBoundary(i, dir, any) { - if (any) { return isEmpty(i) != isEmpty(i + dir); } - return !isEmpty(i) && isEmpty(i + dir); + if (any) { + return isEmpty(i) != isEmpty(i + dir) + } + return !isEmpty(i) && isEmpty(i + dir) } if (dir) { while (min <= i && i <= max && repeat > 0) { - if (isBoundary(i, dir)) { repeat--; } - i += dir; + if (isBoundary(i, dir)) { + repeat-- + } + i += dir } - return new Pos(i, 0); + return new Pos(i, 0) } - var vim = cm.state.vim; + var vim = cm.state.vim if (vim.visualLine && isBoundary(line, 1, true)) { - var anchor = vim.sel.anchor; + var anchor = vim.sel.anchor if (isBoundary(anchor.line, -1, true)) { if (!inclusive || anchor.line != line) { - line += 1; + line += 1 } } } - var startState = isEmpty(line); + var startState = isEmpty(line) for (i = line; i <= max && repeat; i++) { if (isBoundary(i, 1, true)) { if (!inclusive || isEmpty(i) != startState) { - repeat--; + repeat-- } } } - end = new Pos(i, 0); + end = new Pos(i, 0) // select boundary before paragraph for the last one - if (i > max && !startState) { startState = true; } - else { inclusive = false; } + if (i > max && !startState) { + startState = true + } else { + inclusive = false + } for (i = line; i > min; i--) { - if (!inclusive || isEmpty(i) == startState || i == line) { - if (isBoundary(i, -1, true)) { break; } + if (!inclusive || isEmpty(i) === startState || i === line) { + if (isBoundary(i, -1, true)) { + break + } } } - start = new Pos(i, 0); - return { start: start, end: end }; + start = new Pos(i, 0) + return { start: start, end: end } } function findSentence(cm, cur, repeat, dir) { - /* Takes an index object { @@ -3564,18 +3863,17 @@ var Vim = function() { */ function nextChar(cm, idx) { if (idx.pos + idx.dir < 0 || idx.pos + idx.dir >= idx.line.length) { - idx.ln += idx.dir; + idx.ln += idx.dir if (!isLine(cm, idx.ln)) { - idx.line = null; - idx.ln = null; - idx.pos = null; - return; + idx.line = null + idx.ln = null + idx.pos = null + return } - idx.line = cm.getLine(idx.ln); - idx.pos = (idx.dir > 0) ? 0 : idx.line.length - 1; - } - else { - idx.pos += idx.dir; + idx.line = cm.getLine(idx.ln) + idx.pos = idx.dir > 0 ? 0 : idx.line.length - 1 + } else { + idx.pos += idx.dir } } @@ -3584,8 +3882,8 @@ var Vim = function() { Returns an index object of the new location */ function forward(cm, ln, pos, dir) { - var line = cm.getLine(ln); - var stop = (line === ""); + var line = cm.getLine(ln) + var stop = line === '' var curr = { line: line, @@ -3599,46 +3897,44 @@ var Vim = function() { pos: curr.pos, } - var skip_empty_lines = (curr.line === ""); + var skip_empty_lines = curr.line === '' // Move one step to skip character we start on - nextChar(cm, curr); + nextChar(cm, curr) while (curr.line !== null) { - last_valid.ln = curr.ln; - last_valid.pos = curr.pos; + last_valid.ln = curr.ln + last_valid.pos = curr.pos - if (curr.line === "" && !skip_empty_lines) { - return { ln: curr.ln, pos: curr.pos, }; - } - else if (stop && curr.line !== "" && !isWhiteSpaceString(curr.line[curr.pos])) { - return { ln: curr.ln, pos: curr.pos, }; - } - else if (isEndOfSentenceSymbol(curr.line[curr.pos]) - && !stop - && (curr.pos === curr.line.length - 1 - || isWhiteSpaceString(curr.line[curr.pos + 1]))) { - stop = true; + if (curr.line === '' && !skip_empty_lines) { + return { ln: curr.ln, pos: curr.pos } + } else if (stop && curr.line !== '' && !isWhiteSpaceString(curr.line[curr.pos])) { + return { ln: curr.ln, pos: curr.pos } + } else if ( + isEndOfSentenceSymbol(curr.line[curr.pos]) && + !stop && + (curr.pos === curr.line.length - 1 || isWhiteSpaceString(curr.line[curr.pos + 1])) + ) { + stop = true } - nextChar(cm, curr); + nextChar(cm, curr) } /* Set the position to the last non whitespace character on the last valid line in the case that we reach the end of the document. */ - var line = cm.getLine(last_valid.ln); - last_valid.pos = 0; - for(var i = line.length - 1; i >= 0; --i) { + var line = cm.getLine(last_valid.ln) + last_valid.pos = 0 + for (var i = line.length - 1; i >= 0; --i) { if (!isWhiteSpaceString(line[i])) { - last_valid.pos = i; - break; + last_valid.pos = i + break } } - return last_valid; - + return last_valid } /* @@ -3646,7 +3942,7 @@ var Vim = function() { Returns an index object of the new location */ function reverse(cm, ln, pos, dir) { - var line = cm.getLine(ln); + var line = cm.getLine(ln) var curr = { line: line, @@ -3658,145 +3954,151 @@ var Vim = function() { var last_valid = { ln: curr.ln, pos: null, - }; + } - var skip_empty_lines = (curr.line === ""); + var skip_empty_lines = curr.line === '' // Move one step to skip character we start on - nextChar(cm, curr); + nextChar(cm, curr) while (curr.line !== null) { - - if (curr.line === "" && !skip_empty_lines) { + if (curr.line === '' && !skip_empty_lines) { if (last_valid.pos !== null) { - return last_valid; - } - else { - return { ln: curr.ln, pos: curr.pos }; + return last_valid + } else { + return { ln: curr.ln, pos: curr.pos } } - } - else if (isEndOfSentenceSymbol(curr.line[curr.pos]) - && last_valid.pos !== null - && !(curr.ln === last_valid.ln && curr.pos + 1 === last_valid.pos)) { - return last_valid; - } - else if (curr.line !== "" && !isWhiteSpaceString(curr.line[curr.pos])) { - skip_empty_lines = false; + } else if ( + isEndOfSentenceSymbol(curr.line[curr.pos]) && + last_valid.pos !== null && + !(curr.ln === last_valid.ln && curr.pos + 1 === last_valid.pos) + ) { + return last_valid + } else if (curr.line !== '' && !isWhiteSpaceString(curr.line[curr.pos])) { + skip_empty_lines = false last_valid = { ln: curr.ln, pos: curr.pos } } - nextChar(cm, curr); + nextChar(cm, curr) } /* Set the position to the first non whitespace character on the last valid line in the case that we reach the beginning of the document. */ - var line = cm.getLine(last_valid.ln); - last_valid.pos = 0; - for(var i = 0; i < line.length; ++i) { + var line = cm.getLine(last_valid.ln) + last_valid.pos = 0 + for (var i = 0; i < line.length; ++i) { if (!isWhiteSpaceString(line[i])) { - last_valid.pos = i; - break; + last_valid.pos = i + break } } - return last_valid; + return last_valid } var curr_index = { ln: cur.line, pos: cur.ch, - }; + } while (repeat > 0) { if (dir < 0) { - curr_index = reverse(cm, curr_index.ln, curr_index.pos, dir); - } - else { - curr_index = forward(cm, curr_index.ln, curr_index.pos, dir); + curr_index = reverse(cm, curr_index.ln, curr_index.pos, dir) + } else { + curr_index = forward(cm, curr_index.ln, curr_index.pos, dir) } - repeat--; + repeat-- } - return Pos(curr_index.ln, curr_index.pos); + return Pos(curr_index.ln, curr_index.pos) } // TODO: perhaps this finagling of start and end positions belonds // in codemirror/replaceRange? function selectCompanionObject(cm, head, symb, inclusive) { - var cur = head, start, end; - - var bracketRegexp = ({ - '(': /[()]/, ')': /[()]/, - '[': /[[\]]/, ']': /[[\]]/, - '{': /[{}]/, '}': /[{}]/})[symb]; - var openSym = ({ - '(': '(', ')': '(', - '[': '[', ']': '[', - '{': '{', '}': '{'})[symb]; - var curChar = cm.getLine(cur.line).charAt(cur.ch); + var cur = head, + start, + end + + var bracketRegexp = { + '(': /[()]/, + ')': /[()]/, + '[': /[[\]]/, + ']': /[[\]]/, + '{': /[{}]/, + '}': /[{}]/, + }[symb] + var openSym = { + '(': '(', + ')': '(', + '[': '[', + ']': '[', + '{': '{', + '}': '{', + }[symb] + var curChar = cm.getLine(cur.line).charAt(cur.ch) // Due to the behavior of scanForBracket, we need to add an offset if the // cursor is on a matching open bracket. - var offset = curChar === openSym ? 1 : 0; + var offset = curChar === openSym ? 1 : 0 - start = cm.scanForBracket(Pos(cur.line, cur.ch + offset), -1, undefined, {'bracketRegex': bracketRegexp}); - end = cm.scanForBracket(Pos(cur.line, cur.ch + offset), 1, undefined, {'bracketRegex': bracketRegexp}); + start = cm.scanForBracket(Pos(cur.line, cur.ch + offset), -1, undefined, { bracketRegex: bracketRegexp }) + end = cm.scanForBracket(Pos(cur.line, cur.ch + offset), 1, undefined, { bracketRegex: bracketRegexp }) if (!start || !end) { - return { start: cur, end: cur }; + return { start: cur, end: cur } } - start = start.pos; - end = end.pos; + start = start.pos + end = end.pos - if ((start.line == end.line && start.ch > end.ch) - || (start.line > end.line)) { - var tmp = start; - start = end; - end = tmp; + if ((start.line === end.line && start.ch > end.ch) || start.line > end.line) { + var tmp = start + start = end + end = tmp } if (inclusive) { - end.ch += 1; + end.ch += 1 } else { - start.ch += 1; + start.ch += 1 } - return { start: start, end: end }; + return { start: start, end: end } } // Takes in a symbol and a cursor and tries to simulate text objects that // have identical opening and closing symbols // TODO support across multiple lines function findBeginningAndEnd(cm, head, symb, inclusive) { - var cur = copyCursor(head); - var line = cm.getLine(cur.line); - var chars = line.split(''); - var start, end, i, len; - var firstIndex = chars.indexOf(symb); + var cur = copyCursor(head) + var line = cm.getLine(cur.line) + var chars = line.split('') + var start, end, i, len + var firstIndex = chars.indexOf(symb) // the decision tree is to always look backwards for the beginning first, // but if the cursor is in front of the first instance of the symb, // then move the cursor forward if (cur.ch < firstIndex) { - cur.ch = firstIndex; + cur.ch = firstIndex // Why is this line even here??? // cm.setCursor(cur.line, firstIndex+1); } // otherwise if the cursor is currently on the closing symbol - else if (firstIndex < cur.ch && chars[cur.ch] == symb) { - end = cur.ch; // assign end to the current cursor - --cur.ch; // make sure to look backwards + else if (firstIndex < cur.ch && chars[cur.ch] === symb) { + end = cur.ch // assign end to the current cursor + --cur.ch // make sure to look backwards } // if we're currently on the symbol, we've got a start - if (chars[cur.ch] == symb && !end) { - start = cur.ch + 1; // assign start to ahead of the cursor + if (chars[cur.ch] === symb && !end) { + start = cur.ch + 1 // assign start to ahead of the cursor } else { // go backwards to find the start for (i = cur.ch; i > -1 && !start; i--) { - if (chars[i] == symb) { - start = i + 1; + if (chars[i] === symb) { + start = i + 1 } } } @@ -3804,211 +4106,213 @@ var Vim = function() { // look forwards for the end symbol if (start && !end) { for (i = start, len = chars.length; i < len && !end; i++) { - if (chars[i] == symb) { - end = i; + if (chars[i] === symb) { + end = i } } } // nothing found if (!start || !end) { - return { start: cur, end: cur }; + return { start: cur, end: cur } } // include the symbols if (inclusive) { - --start; ++end; + --start + ++end } return { start: Pos(cur.line, start), - end: Pos(cur.line, end) - }; + end: Pos(cur.line, end), + } } // Search functions - defineOption('pcre', true, 'boolean'); + defineOption('pcre', true, 'boolean') function SearchState() {} SearchState.prototype = { getQuery: function() { - return vimGlobalState.query; + return vimGlobalState.query }, setQuery: function(query) { - vimGlobalState.query = query; + vimGlobalState.query = query }, getOverlay: function() { - return this.searchOverlay; + return this.searchOverlay }, setOverlay: function(overlay) { - this.searchOverlay = overlay; + this.searchOverlay = overlay }, isReversed: function() { - return vimGlobalState.isReversed; + return vimGlobalState.isReversed }, setReversed: function(reversed) { - vimGlobalState.isReversed = reversed; + vimGlobalState.isReversed = reversed }, getScrollbarAnnotate: function() { - return this.annotate; + return this.annotate }, setScrollbarAnnotate: function(annotate) { - this.annotate = annotate; - } - }; + this.annotate = annotate + }, + } function getSearchState(cm) { - var vim = cm.state.vim; - return vim.searchState_ || (vim.searchState_ = new SearchState()); + var vim = cm.state.vim + return vim.searchState_ || (vim.searchState_ = new SearchState()) } function dialog(cm, template, shortText, onClose, options) { if (cm.openDialog) { - cm.openDialog(template, onClose, { bottom: true, value: options.value, - onKeyDown: options.onKeyDown, onKeyUp: options.onKeyUp, - selectValueOnOpen: false}); - } - else { - onClose(prompt(shortText, '')); + cm.openDialog(template, onClose, { + bottom: true, + value: options.value, + onKeyDown: options.onKeyDown, + onKeyUp: options.onKeyUp, + selectValueOnOpen: false, + }) + } else { + onClose(prompt(shortText, '')) } } function splitBySlash(argString) { - return splitBySeparator(argString, '/'); + return splitBySeparator(argString, '/') } function findUnescapedSlashes(argString) { - return findUnescapedSeparators(argString, '/'); + return findUnescapedSeparators(argString, '/') } function splitBySeparator(argString, separator) { - var slashes = findUnescapedSeparators(argString, separator) || []; - if (!slashes.length) return []; - var tokens = []; + var slashes = findUnescapedSeparators(argString, separator) || [] + if (!slashes.length) return [] + var tokens = [] // in case of strings like foo/bar - if (slashes[0] !== 0) return; + if (slashes[0] !== 0) return for (var i = 0; i < slashes.length; i++) { - if (typeof slashes[i] == 'number') - tokens.push(argString.substring(slashes[i] + 1, slashes[i+1])); + if (typeof slashes[i] === 'number') tokens.push(argString.substring(slashes[i] + 1, slashes[i + 1])) } - return tokens; + return tokens } function findUnescapedSeparators(str, separator) { - if (!separator) - separator = '/'; + if (!separator) separator = '/' - var escapeNextChar = false; - var slashes = []; + var escapeNextChar = false + var slashes = [] for (var i = 0; i < str.length; i++) { - var c = str.charAt(i); - if (!escapeNextChar && c == separator) { - slashes.push(i); + var c = str.charAt(i) + if (!escapeNextChar && c === separator) { + slashes.push(i) } - escapeNextChar = !escapeNextChar && (c == '\\'); + escapeNextChar = !escapeNextChar && c === '\\' } - return slashes; + return slashes } // Translates a search string from ex (vim) syntax into javascript form. function translateRegex(str) { // When these match, add a '\' if unescaped or remove one if escaped. - var specials = '|(){'; + var specials = '|(){' // Remove, but never add, a '\' for these. - var unescape = '}'; - var escapeNextChar = false; - var out = []; + var unescape = '}' + var escapeNextChar = false + var out = [] for (var i = -1; i < str.length; i++) { - var c = str.charAt(i) || ''; - var n = str.charAt(i+1) || ''; - var specialComesNext = (n && specials.indexOf(n) != -1); + var c = str.charAt(i) || '' + var n = str.charAt(i + 1) || '' + var specialComesNext = n && specials.indexOf(n) != -1 if (escapeNextChar) { if (c !== '\\' || !specialComesNext) { - out.push(c); + out.push(c) } - escapeNextChar = false; + escapeNextChar = false } else { if (c === '\\') { - escapeNextChar = true; + escapeNextChar = true // Treat the unescape list as special for removing, but not adding '\'. if (n && unescape.indexOf(n) != -1) { - specialComesNext = true; + specialComesNext = true } // Not passing this test means removing a '\'. if (!specialComesNext || n === '\\') { - out.push(c); + out.push(c) } } else { - out.push(c); + out.push(c) if (specialComesNext && n !== '\\') { - out.push('\\'); + out.push('\\') } } } } - return out.join(''); + return out.join('') } // Translates the replace part of a search and replace from ex (vim) syntax into // javascript form. Similar to translateRegex, but additionally fixes back references // (translates '\[0..9]' to '$[0..9]') and follows different rules for escaping '$'. - var charUnescapes = {'\\n': '\n', '\\r': '\r', '\\t': '\t'}; + var charUnescapes = { '\\n': '\n', '\\r': '\r', '\\t': '\t' } function translateRegexReplace(str) { - var escapeNextChar = false; - var out = []; + var escapeNextChar = false + var out = [] for (var i = -1; i < str.length; i++) { - var c = str.charAt(i) || ''; - var n = str.charAt(i+1) || ''; + var c = str.charAt(i) || '' + var n = str.charAt(i + 1) || '' if (charUnescapes[c + n]) { - out.push(charUnescapes[c+n]); - i++; + out.push(charUnescapes[c + n]) + i++ } else if (escapeNextChar) { // At any point in the loop, escapeNextChar is true if the previous // character was a '\' and was not escaped. - out.push(c); - escapeNextChar = false; + out.push(c) + escapeNextChar = false } else { if (c === '\\') { - escapeNextChar = true; - if ((isNumber(n) || n === '$')) { - out.push('$'); + escapeNextChar = true + if (isNumber(n) || n === '$') { + out.push('$') } else if (n !== '/' && n !== '\\') { - out.push('\\'); + out.push('\\') } } else { if (c === '$') { - out.push('$'); + out.push('$') } - out.push(c); + out.push(c) if (n === '/') { - out.push('\\'); + out.push('\\') } } } } - return out.join(''); + return out.join('') } // Unescape \ and / in the replace part, for PCRE mode. - var unescapes = {'\\/': '/', '\\\\': '\\', '\\n': '\n', '\\r': '\r', '\\t': '\t'}; + var unescapes = { '\\/': '/', '\\\\': '\\', '\\n': '\n', '\\r': '\r', '\\t': '\t' } function unescapeRegexReplace(str) { - var stream = new CodeMirror.StringStream(str); - var output = []; + var stream = new CodeMirror.StringStream(str) + var output = [] while (!stream.eol()) { // Search for \. while (stream.peek() && stream.peek() != '\\') { - output.push(stream.next()); + output.push(stream.next()) } - var matched = false; + var matched = false for (var matcher in unescapes) { if (stream.match(matcher, true)) { - matched = true; - output.push(unescapes[matcher]); - break; + matched = true + output.push(unescapes[matcher]) + break } } if (!matched) { // Don't change anything - output.push(stream.next()); + output.push(stream.next()) } } - return output.join(''); + return output.join('') } /** @@ -4023,171 +4327,172 @@ var Vim = function() { */ function parseQuery(query, ignoreCase, smartCase) { // First update the last search register - var lastSearchRegister = vimGlobalState.registerController.getRegister('/'); - lastSearchRegister.setText(query); + var lastSearchRegister = vimGlobalState.registerController.getRegister('/') + lastSearchRegister.setText(query) // Check if the query is already a regex. - if (query instanceof RegExp) { return query; } + if (query instanceof RegExp) { + return query + } // First try to extract regex + flags from the input. If no flags found, // extract just the regex. IE does not accept flags directly defined in // the regex string in the form /regex/flags - var slashes = findUnescapedSlashes(query); - var regexPart; - var forceIgnoreCase; + var slashes = findUnescapedSlashes(query) + var regexPart + var forceIgnoreCase if (!slashes.length) { // Query looks like 'regexp' - regexPart = query; + regexPart = query } else { // Query looks like 'regexp/...' - regexPart = query.substring(0, slashes[0]); - var flagsPart = query.substring(slashes[0]); - forceIgnoreCase = (flagsPart.indexOf('i') != -1); + regexPart = query.substring(0, slashes[0]) + var flagsPart = query.substring(slashes[0]) + forceIgnoreCase = flagsPart.indexOf('i') != -1 } if (!regexPart) { - return null; + return null } if (!getOption('pcre')) { - regexPart = translateRegex(regexPart); + regexPart = translateRegex(regexPart) } if (smartCase) { - ignoreCase = (/^[^A-Z]*$/).test(regexPart); + ignoreCase = /^[^A-Z]*$/.test(regexPart) } - var regexp = new RegExp(regexPart, - (ignoreCase || forceIgnoreCase) ? 'i' : undefined); - return regexp; + var regexp = new RegExp(regexPart, ignoreCase || forceIgnoreCase ? 'i' : undefined) + return regexp } function showConfirm(cm, text) { if (cm.openNotification) { - cm.openNotification('' + text + '', - {bottom: true, duration: 5000}); + cm.openNotification('' + text + '', { bottom: true, duration: 5000 }) } else { - alert(text); + alert(text) } } function makePrompt(prefix, desc) { - var raw = '' + - (prefix || "") + ''; - if (desc) - raw += ' ' + desc + ''; - return raw; + var raw = '' + (prefix || '') + '' + if (desc) raw += ' ' + desc + '' + return raw } - var searchPromptDesc = '(Javascript regexp)'; + var searchPromptDesc = '(Javascript regexp)' function showPrompt(cm, options) { - var shortText = (options.prefix || '') + ' ' + (options.desc || ''); - var prompt = makePrompt(options.prefix, options.desc); - dialog(cm, prompt, shortText, options.onClose, options); + var shortText = (options.prefix || '') + ' ' + (options.desc || '') + var prompt = makePrompt(options.prefix, options.desc) + dialog(cm, prompt, shortText, options.onClose, options) } function regexEqual(r1, r2) { if (r1 instanceof RegExp && r2 instanceof RegExp) { - var props = ['global', 'multiline', 'ignoreCase', 'source']; - for (var i = 0; i < props.length; i++) { - var prop = props[i]; - if (r1[prop] !== r2[prop]) { - return false; - } + var props = ['global', 'multiline', 'ignoreCase', 'source'] + for (var i = 0; i < props.length; i++) { + var prop = props[i] + if (r1[prop] !== r2[prop]) { + return false } - return true; + } + return true } - return false; + return false } // Returns true if the query is valid. function updateSearchQuery(cm, rawQuery, ignoreCase, smartCase) { if (!rawQuery) { - return; + return } - var state = getSearchState(cm); - var query = parseQuery(rawQuery, !!ignoreCase, !!smartCase); + var state = getSearchState(cm) + var query = parseQuery(rawQuery, !!ignoreCase, !!smartCase) if (!query) { - return; + return } - highlightSearchMatches(cm, query); + highlightSearchMatches(cm, query) if (regexEqual(query, state.getQuery())) { - return query; + return query } - state.setQuery(query); - return query; + state.setQuery(query) + return query } function searchOverlay(query) { - if (query.source.charAt(0) == '^') { - var matchSol = true; + if (query.source.charAt(0) === '^') { + var matchSol = true } return { token: function(stream) { if (matchSol && !stream.sol()) { - stream.skipToEnd(); - return; + stream.skipToEnd() + return } - var match = stream.match(query, false); + var match = stream.match(query, false) if (match) { - if (match[0].length == 0) { + if (match[0].length === 0) { // Matched empty string, skip to next. - stream.next(); - return 'searching'; + stream.next() + return 'searching' } if (!stream.sol()) { // Backtrack 1 to match \b - stream.backUp(1); + stream.backUp(1) if (!query.exec(stream.next() + match[0])) { - stream.next(); - return null; + stream.next() + return null } } - stream.match(query); - return 'searching'; + stream.match(query) + return 'searching' } while (!stream.eol()) { - stream.next(); - if (stream.match(query, false)) break; + stream.next() + if (stream.match(query, false)) break } }, - query: query - }; + query: query, + } } function highlightSearchMatches(cm, query) { - var searchState = getSearchState(cm); - var overlay = searchState.getOverlay(); + var searchState = getSearchState(cm) + var overlay = searchState.getOverlay() if (!overlay || query != overlay.query) { if (overlay) { - cm.removeOverlay(overlay); + cm.removeOverlay(overlay) } - overlay = searchOverlay(query); - cm.addOverlay(overlay); + overlay = searchOverlay(query) + cm.addOverlay(overlay) if (cm.showMatchesOnScrollbar) { if (searchState.getScrollbarAnnotate()) { - searchState.getScrollbarAnnotate().clear(); + searchState.getScrollbarAnnotate().clear() } - searchState.setScrollbarAnnotate(cm.showMatchesOnScrollbar(query)); + searchState.setScrollbarAnnotate(cm.showMatchesOnScrollbar(query)) } - searchState.setOverlay(overlay); + searchState.setOverlay(overlay) } } function findNext(cm, prev, query, repeat) { - if (repeat === undefined) { repeat = 1; } + if (repeat === undefined) { + repeat = 1 + } return cm.operation(function() { - var pos = cm.getCursor(); - var cursor = cm.getSearchCursor(query, pos); + var pos = cm.getCursor() + var cursor = cm.getSearchCursor(query, pos) for (var i = 0; i < repeat; i++) { - var found = cursor.find(prev); - if (i == 0 && found && cursorEqual(cursor.from(), pos)) { found = cursor.find(prev); } + var found = cursor.find(prev) + if (i === 0 && found && cursorEqual(cursor.from(), pos)) { + found = cursor.find(prev) + } if (!found) { // SearchCursor may have returned null because it hit EOF, wrap // around and try again. - cursor = cm.getSearchCursor(query, - (prev) ? Pos(cm.lastLine()) : Pos(cm.firstLine(), 0) ); + cursor = cm.getSearchCursor(query, prev ? Pos(cm.lastLine()) : Pos(cm.firstLine(), 0)) if (!cursor.find(prev)) { - return; + return } } } - return cursor.from(); - }); + return cursor.from() + }) } function clearSearchHighlight(cm) { - var state = getSearchState(cm); - cm.removeOverlay(getSearchState(cm).getOverlay()); - state.setOverlay(null); + var state = getSearchState(cm) + cm.removeOverlay(getSearchState(cm).getOverlay()) + state.setOverlay(null) if (state.getScrollbarAnnotate()) { - state.getScrollbarAnnotate().clear(); - state.setScrollbarAnnotate(null); + state.getScrollbarAnnotate().clear() + state.setScrollbarAnnotate(null) } } /** @@ -4204,15 +4509,15 @@ var Vim = function() { function isInRange(pos, start, end) { if (typeof pos != 'number') { // Assume it is a cursor position. Get the line number. - pos = pos.line; + pos = pos.line } if (start instanceof Array) { - return inArray(pos, start); + return inArray(pos, start) } else { if (end) { - return (pos >= start && pos <= end); + return pos >= start && pos <= end } else { - return pos == start; + return pos === start } } } @@ -4224,175 +4529,179 @@ var Vim = function() { // var bottomY = scrollInfo.clientHeight - occludeToleranceBottom + scrollInfo.top; // var to = cm.coordsChar({left:0, top: bottomY}, 'local'); // return {top: from.line, bottom: to.line}; - return cm.getUserVisibleLines(); + return cm.getUserVisibleLines() } function getMarkPos(cm, vim, markName) { - if (markName == '\'') { - var history = cm.doc.history.done; - var event = history[history.length - 2]; - return event && event.ranges && event.ranges[0].head; - } else if (markName == '.') { - if (cm.doc.history.lastModTime == 0) { - return // If no changes, bail out; don't bother to copy or reverse history array. + if (markName === "'") { + var history = cm.doc.history.done + var event = history[history.length - 2] + return event && event.ranges && event.ranges[0].head + } else if (markName === '.') { + if (cm.doc.history.lastModTime === 0) { + return // If no changes, bail out; don't bother to copy or reverse history array. } else { - var changeHistory = cm.doc.history.done.filter(function(el){ if (el.changes !== undefined) { return el } }); - changeHistory.reverse(); - var lastEditPos = changeHistory[0].changes[0].to; + var changeHistory = cm.doc.history.done.filter(function(el) { + if (el.changes !== undefined) { + return el + } + }) + changeHistory.reverse() + var lastEditPos = changeHistory[0].changes[0].to } - return lastEditPos; + return lastEditPos } - var mark = vim.marks[markName]; - return mark && mark.find(); + var mark = vim.marks[markName] + return mark && mark.find() } var ExCommandDispatcher = function() { - this.buildCommandMap_(); - }; + this.buildCommandMap_() + } ExCommandDispatcher.prototype = { processCommand: function(cm, input, opt_params) { - var that = this; - cm.operation(function () { - cm.curOp.isVimOp = true; - that._processCommand(cm, input, opt_params); - }); + var that = this + cm.operation(function() { + cm.curOp.isVimOp = true + that._processCommand(cm, input, opt_params) + }) }, _processCommand: function(cm, input, opt_params) { - var vim = cm.state.vim; - var commandHistoryRegister = vimGlobalState.registerController.getRegister(':'); - var previousCommand = commandHistoryRegister.toString(); + var vim = cm.state.vim + var commandHistoryRegister = vimGlobalState.registerController.getRegister(':') + var previousCommand = commandHistoryRegister.toString() if (vim.visualMode) { - exitVisualMode(cm); + exitVisualMode(cm) } - var inputStream = new CodeMirror.StringStream(input); + var inputStream = new CodeMirror.StringStream(input) // update ": with the latest command whether valid or invalid - commandHistoryRegister.setText(input); - var params = opt_params || {}; - params.input = input; + commandHistoryRegister.setText(input) + var params = opt_params || {} + params.input = input try { - this.parseInput_(cm, inputStream, params); - } catch(e) { - showConfirm(cm, e); - throw e; + this.parseInput_(cm, inputStream, params) + } catch (e) { + showConfirm(cm, e) + throw e } - var command; - var commandName; + var command + var commandName if (!params.commandName) { // If only a line range is defined, move to the line. if (params.line !== undefined) { - commandName = 'move'; + commandName = 'move' } } else { - command = this.matchCommand_(params.commandName); + command = this.matchCommand_(params.commandName) if (command) { - commandName = command.name; + commandName = command.name if (command.excludeFromCommandHistory) { - commandHistoryRegister.setText(previousCommand); + commandHistoryRegister.setText(previousCommand) } - this.parseCommandArgs_(inputStream, params, command); - if (command.type == 'exToKey') { + this.parseCommandArgs_(inputStream, params, command) + if (command.type === 'exToKey') { // Handle Ex to Key mapping. for (var i = 0; i < command.toKeys.length; i++) { - CodeMirror.Vim.handleKey(cm, command.toKeys[i], 'mapping'); + CodeMirror.Vim.handleKey(cm, command.toKeys[i], 'mapping') } - return; - } else if (command.type == 'exToEx') { + return + } else if (command.type === 'exToEx') { // Handle Ex to Ex mapping. - this.processCommand(cm, command.toInput); - return; + this.processCommand(cm, command.toInput) + return } } } if (!commandName) { - showConfirm(cm, 'Not an editor command ":' + input + '"'); - return; + showConfirm(cm, 'Not an editor command ":' + input + '"') + return } try { - exCommands[commandName](cm, params); + exCommands[commandName](cm, params) // Possibly asynchronous commands (e.g. substitute, which might have a // user confirmation), are responsible for calling the callback when // done. All others have it taken care of for them here. if ((!command || !command.possiblyAsync) && params.callback) { - params.callback(); + params.callback() } - } catch(e) { - showConfirm(cm, e); - throw e; + } catch (e) { + showConfirm(cm, e) + throw e } }, parseInput_: function(cm, inputStream, result) { - inputStream.eatWhile(':'); + inputStream.eatWhile(':') // Parse range. if (inputStream.eat('%')) { - result.line = cm.firstLine(); - result.lineEnd = cm.lastLine(); + result.line = cm.firstLine() + result.lineEnd = cm.lastLine() } else { - result.line = this.parseLineSpec_(cm, inputStream); + result.line = this.parseLineSpec_(cm, inputStream) if (result.line !== undefined && inputStream.eat(',')) { - result.lineEnd = this.parseLineSpec_(cm, inputStream); + result.lineEnd = this.parseLineSpec_(cm, inputStream) } } // Parse command name. - var commandMatch = inputStream.match(/^(\w+)/); + var commandMatch = inputStream.match(/^(\w+)/) if (commandMatch) { - result.commandName = commandMatch[1]; + result.commandName = commandMatch[1] } else { - result.commandName = inputStream.match(/.*/)[0]; + result.commandName = inputStream.match(/.*/)[0] } - return result; + return result }, parseLineSpec_: function(cm, inputStream) { - var numberMatch = inputStream.match(/^(\d+)/); + var numberMatch = inputStream.match(/^(\d+)/) if (numberMatch) { // Absolute line number plus offset (N+M or N-M) is probably a typo, // not something the user actually wanted. (NB: vim does allow this.) - return parseInt(numberMatch[1], 10) - 1; + return parseInt(numberMatch[1], 10) - 1 } switch (inputStream.next()) { case '.': - return this.parseLineSpecOffset_(inputStream, cm.getCursor().line); + return this.parseLineSpecOffset_(inputStream, cm.getCursor().line) case '$': - return this.parseLineSpecOffset_(inputStream, cm.lastLine()); - case '\'': - var markName = inputStream.next(); - var markPos = getMarkPos(cm, cm.state.vim, markName); - if (!markPos) throw new Error('Mark not set'); - return this.parseLineSpecOffset_(inputStream, markPos.line); + return this.parseLineSpecOffset_(inputStream, cm.lastLine()) + case "'": + var markName = inputStream.next() + var markPos = getMarkPos(cm, cm.state.vim, markName) + if (!markPos) throw new Error('Mark not set') + return this.parseLineSpecOffset_(inputStream, markPos.line) case '-': case '+': - inputStream.backUp(1); + inputStream.backUp(1) // Offset is relative to current line if not otherwise specified. - return this.parseLineSpecOffset_(inputStream, cm.getCursor().line); + return this.parseLineSpecOffset_(inputStream, cm.getCursor().line) default: - inputStream.backUp(1); - return undefined; + inputStream.backUp(1) + return undefined } }, parseLineSpecOffset_: function(inputStream, line) { - var offsetMatch = inputStream.match(/^([+-])?(\d+)/); + var offsetMatch = inputStream.match(/^([+-])?(\d+)/) if (offsetMatch) { - var offset = parseInt(offsetMatch[2], 10); - if (offsetMatch[1] == "-") { - line -= offset; + var offset = parseInt(offsetMatch[2], 10) + if (offsetMatch[1] === '-') { + line -= offset } else { - line += offset; + line += offset } } - return line; + return line }, parseCommandArgs_: function(inputStream, params, command) { if (inputStream.eol()) { - return; + return } - params.argString = inputStream.match(/.*/)[0]; + params.argString = inputStream.match(/.*/)[0] // Parse command-line arguments - var delim = command.argDelimiter || /\s+/; - var args = trim(params.argString).split(delim); + var delim = command.argDelimiter || /\s+/ + var args = trim(params.argString).split(delim) if (args.length && args[0]) { - params.args = args; + params.args = args } }, matchCommand_: function(commandName) { @@ -4401,683 +4710,751 @@ var Vim = function() { // unambiguous if the defaultExCommandMap's shortNames are set up // correctly. (see @code{defaultExCommandMap}). for (var i = commandName.length; i > 0; i--) { - var prefix = commandName.substring(0, i); + var prefix = commandName.substring(0, i) if (this.commandMap_[prefix]) { - var command = this.commandMap_[prefix]; + var command = this.commandMap_[prefix] if (command.name.indexOf(commandName) === 0) { - return command; + return command } } } - return null; + return null }, buildCommandMap_: function() { - this.commandMap_ = {}; + this.commandMap_ = {} for (var i = 0; i < defaultExCommandMap.length; i++) { - var command = defaultExCommandMap[i]; - var key = command.shortName || command.name; - this.commandMap_[key] = command; + var command = defaultExCommandMap[i] + var key = command.shortName || command.name + this.commandMap_[key] = command } }, map: function(lhs, rhs, ctx) { - if (lhs != ':' && lhs.charAt(0) == ':') { - if (ctx) { throw Error('Mode not supported for ex mappings'); } - var commandName = lhs.substring(1); - if (rhs != ':' && rhs.charAt(0) == ':') { + if (lhs != ':' && lhs.charAt(0) === ':') { + if (ctx) { + throw Error('Mode not supported for ex mappings') + } + var commandName = lhs.substring(1) + if (rhs != ':' && rhs.charAt(0) === ':') { // Ex to Ex mapping this.commandMap_[commandName] = { name: commandName, type: 'exToEx', toInput: rhs.substring(1), - user: true - }; + user: true, + } } else { // Ex to key mapping this.commandMap_[commandName] = { name: commandName, type: 'exToKey', toKeys: rhs, - user: true - }; + user: true, + } } } else { - if (rhs != ':' && rhs.charAt(0) == ':') { + if (rhs != ':' && rhs.charAt(0) === ':') { // Key to Ex mapping. var mapping = { keys: lhs, type: 'keyToEx', - exArgs: { input: rhs.substring(1) } - }; - if (ctx) { mapping.context = ctx; } - defaultKeymap.unshift(mapping); + exArgs: { input: rhs.substring(1) }, + } + if (ctx) { + mapping.context = ctx + } + defaultKeymap.unshift(mapping) } else { // Key to key mapping var mapping = { keys: lhs, type: 'keyToKey', - toKeys: rhs - }; - if (ctx) { mapping.context = ctx; } - defaultKeymap.unshift(mapping); + toKeys: rhs, + } + if (ctx) { + mapping.context = ctx + } + defaultKeymap.unshift(mapping) } } }, unmap: function(lhs, ctx) { - if (lhs != ':' && lhs.charAt(0) == ':') { + if (lhs != ':' && lhs.charAt(0) === ':') { // Ex to Ex or Ex to key mapping - if (ctx) { throw Error('Mode not supported for ex mappings'); } - var commandName = lhs.substring(1); + if (ctx) { + throw Error('Mode not supported for ex mappings') + } + var commandName = lhs.substring(1) if (this.commandMap_[commandName] && this.commandMap_[commandName].user) { - delete this.commandMap_[commandName]; - return; + delete this.commandMap_[commandName] + return } } else { // Key to Ex or key to key mapping - var keys = lhs; + var keys = lhs for (var i = 0; i < defaultKeymap.length; i++) { - if (keys == defaultKeymap[i].keys - && defaultKeymap[i].context === ctx) { - defaultKeymap.splice(i, 1); - return; + if (keys === defaultKeymap[i].keys && defaultKeymap[i].context === ctx) { + defaultKeymap.splice(i, 1) + return } } } - throw Error('No such mapping.'); - } - }; + throw Error('No such mapping.') + }, + } var exCommands = { colorscheme: function(cm, params) { if (!params.args || params.args.length < 1) { - showConfirm(cm, cm.getOption('theme')); - return; + showConfirm(cm, cm.getOption('theme')) + return } - cm.setOption('theme', params.args[0]); + cm.setOption('theme', params.args[0]) }, map: function(cm, params, ctx) { - var mapArgs = params.args; + var mapArgs = params.args if (!mapArgs || mapArgs.length < 2) { if (cm) { - showConfirm(cm, 'Invalid mapping: ' + params.input); + showConfirm(cm, 'Invalid mapping: ' + params.input) } - return; + return } - exCommandDispatcher.map(mapArgs[0], mapArgs[1], ctx); + exCommandDispatcher.map(mapArgs[0], mapArgs[1], ctx) + }, + imap: function(cm, params) { + this.map(cm, params, 'insert') + }, + nmap: function(cm, params) { + this.map(cm, params, 'normal') + }, + vmap: function(cm, params) { + this.map(cm, params, 'visual') }, - imap: function(cm, params) { this.map(cm, params, 'insert'); }, - nmap: function(cm, params) { this.map(cm, params, 'normal'); }, - vmap: function(cm, params) { this.map(cm, params, 'visual'); }, unmap: function(cm, params, ctx) { - var mapArgs = params.args; + var mapArgs = params.args if (!mapArgs || mapArgs.length < 1) { if (cm) { - showConfirm(cm, 'No such mapping: ' + params.input); + showConfirm(cm, 'No such mapping: ' + params.input) } - return; + return } - exCommandDispatcher.unmap(mapArgs[0], ctx); + exCommandDispatcher.unmap(mapArgs[0], ctx) }, move: function(cm, params) { commandDispatcher.processCommand(cm, cm.state.vim, { - type: 'motion', - motion: 'moveToLineOrEdgeOfDocument', - motionArgs: { forward: false, explicitRepeat: true, - linewise: true }, - repeatOverride: params.line+1}); + type: 'motion', + motion: 'moveToLineOrEdgeOfDocument', + motionArgs: { forward: false, explicitRepeat: true, linewise: true }, + repeatOverride: params.line + 1, + }) }, set: function(cm, params) { - var setArgs = params.args; + var setArgs = params.args // Options passed through to the setOption/getOption calls. May be passed in by the // local/global versions of the set command - var setCfg = params.setCfg || {}; + var setCfg = params.setCfg || {} if (!setArgs || setArgs.length < 1) { if (cm) { - showConfirm(cm, 'Invalid mapping: ' + params.input); + showConfirm(cm, 'Invalid mapping: ' + params.input) } - return; + return } - var expr = setArgs[0].split('='); - var optionName = expr[0]; - var value = expr[1]; - var forceGet = false; + var expr = setArgs[0].split('=') + var optionName = expr[0] + var value = expr[1] + var forceGet = false - if (optionName.charAt(optionName.length - 1) == '?') { + if (optionName.charAt(optionName.length - 1) === '?') { // If post-fixed with ?, then the set is actually a get. - if (value) { throw Error('Trailing characters: ' + params.argString); } - optionName = optionName.substring(0, optionName.length - 1); - forceGet = true; + if (value) { + throw Error('Trailing characters: ' + params.argString) + } + optionName = optionName.substring(0, optionName.length - 1) + forceGet = true } - if (value === undefined && optionName.substring(0, 2) == 'no') { + if (value === undefined && optionName.substring(0, 2) === 'no') { // To set boolean options to false, the option name is prefixed with // 'no'. - optionName = optionName.substring(2); - value = false; + optionName = optionName.substring(2) + value = false } - var optionIsBoolean = options[optionName] && options[optionName].type == 'boolean'; - if (optionIsBoolean && value == undefined) { + var optionIsBoolean = options[optionName] && options[optionName].type === 'boolean' + if (optionIsBoolean && value === undefined) { // Calling set with a boolean option sets it to true. - value = true; + value = true } // If no value is provided, then we assume this is a get. - if (!optionIsBoolean && value === undefined || forceGet) { - var oldValue = getOption(optionName, cm, setCfg); + if ((!optionIsBoolean && value === undefined) || forceGet) { + var oldValue = getOption(optionName, cm, setCfg) if (oldValue instanceof Error) { - showConfirm(cm, oldValue.message); + showConfirm(cm, oldValue.message) } else if (oldValue === true || oldValue === false) { - showConfirm(cm, ' ' + (oldValue ? '' : 'no') + optionName); + showConfirm(cm, ' ' + (oldValue ? '' : 'no') + optionName) } else { - showConfirm(cm, ' ' + optionName + '=' + oldValue); + showConfirm(cm, ' ' + optionName + '=' + oldValue) } } else { - var setOptionReturn = setOption(optionName, value, cm, setCfg); + var setOptionReturn = setOption(optionName, value, cm, setCfg) if (setOptionReturn instanceof Error) { - showConfirm(cm, setOptionReturn.message); + showConfirm(cm, setOptionReturn.message) } } }, - setlocal: function (cm, params) { + setlocal: function(cm, params) { // setCfg is passed through to setOption - params.setCfg = {scope: 'local'}; - this.set(cm, params); + params.setCfg = { scope: 'local' } + this.set(cm, params) }, - setglobal: function (cm, params) { + setglobal: function(cm, params) { // setCfg is passed through to setOption - params.setCfg = {scope: 'global'}; - this.set(cm, params); + params.setCfg = { scope: 'global' } + this.set(cm, params) }, registers: function(cm, params) { - var regArgs = params.args; - var registers = vimGlobalState.registerController.registers; - var regInfo = '----------Registers----------

'; + var regArgs = params.args + var registers = vimGlobalState.registerController.registers + var regInfo = '----------Registers----------

' if (!regArgs) { for (var registerName in registers) { - var text = registers[registerName].toString(); + var text = registers[registerName].toString() if (text.length) { - regInfo += '"' + registerName + ' ' + text + '
'; + regInfo += '"' + registerName + ' ' + text + '
' } } } else { - var registerName; - regArgs = regArgs.join(''); + var registerName + regArgs = regArgs.join('') for (var i = 0; i < regArgs.length; i++) { - registerName = regArgs.charAt(i); + registerName = regArgs.charAt(i) if (!vimGlobalState.registerController.isValidRegister(registerName)) { - continue; + continue } - var register = registers[registerName] || new Register(); - regInfo += '"' + registerName + ' ' + register.toString() + '
'; + var register = registers[registerName] || new Register() + regInfo += '"' + registerName + ' ' + register.toString() + '
' } } - showConfirm(cm, regInfo); + showConfirm(cm, regInfo) }, sort: function(cm, params) { - var reverse, ignoreCase, unique, number, pattern; + var reverse, ignoreCase, unique, number, pattern function parseArgs() { if (params.argString) { - var args = new CodeMirror.StringStream(params.argString); - if (args.eat('!')) { reverse = true; } - if (args.eol()) { return; } - if (!args.eatSpace()) { return 'Invalid arguments'; } - var opts = args.match(/([dinuox]+)?\s*(\/.+\/)?\s*/); - if (!opts && !args.eol()) { return 'Invalid arguments'; } + var args = new CodeMirror.StringStream(params.argString) + if (args.eat('!')) { + reverse = true + } + if (args.eol()) { + return + } + if (!args.eatSpace()) { + return 'Invalid arguments' + } + var opts = args.match(/([dinuox]+)?\s*(\/.+\/)?\s*/) + if (!opts && !args.eol()) { + return 'Invalid arguments' + } if (opts[1]) { - ignoreCase = opts[1].indexOf('i') != -1; - unique = opts[1].indexOf('u') != -1; - var decimal = opts[1].indexOf('d') != -1 || opts[1].indexOf('n') != -1 && 1; - var hex = opts[1].indexOf('x') != -1 && 1; - var octal = opts[1].indexOf('o') != -1 && 1; - if (decimal + hex + octal > 1) { return 'Invalid arguments'; } - number = decimal && 'decimal' || hex && 'hex' || octal && 'octal'; + ignoreCase = opts[1].indexOf('i') != -1 + unique = opts[1].indexOf('u') != -1 + var decimal = opts[1].indexOf('d') != -1 || (opts[1].indexOf('n') != -1 && 1) + var hex = opts[1].indexOf('x') != -1 && 1 + var octal = opts[1].indexOf('o') != -1 && 1 + if (decimal + hex + octal > 1) { + return 'Invalid arguments' + } + number = (decimal && 'decimal') || (hex && 'hex') || (octal && 'octal') } if (opts[2]) { - pattern = new RegExp(opts[2].substr(1, opts[2].length - 2), ignoreCase ? 'i' : ''); + pattern = new RegExp(opts[2].substr(1, opts[2].length - 2), ignoreCase ? 'i' : '') } } } - var err = parseArgs(); + var err = parseArgs() if (err) { - showConfirm(cm, err + ': ' + params.argString); - return; - } - var lineStart = params.line || cm.firstLine(); - var lineEnd = params.lineEnd || params.line || cm.lastLine(); - if (lineStart == lineEnd) { return; } - var curStart = Pos(lineStart, 0); - var curEnd = Pos(lineEnd, lineLength(cm, lineEnd)); - var text = cm.getRange(curStart, curEnd).split('\n'); - var numberRegex = pattern ? pattern : - (number == 'decimal') ? /(-?)([\d]+)/ : - (number == 'hex') ? /(-?)(?:0x)?([0-9a-f]+)/i : - (number == 'octal') ? /([0-7]+)/ : null; - var radix = (number == 'decimal') ? 10 : (number == 'hex') ? 16 : (number == 'octal') ? 8 : null; - var numPart = [], textPart = []; + showConfirm(cm, err + ': ' + params.argString) + return + } + var lineStart = params.line || cm.firstLine() + var lineEnd = params.lineEnd || params.line || cm.lastLine() + if (lineStart === lineEnd) { + return + } + var curStart = Pos(lineStart, 0) + var curEnd = Pos(lineEnd, lineLength(cm, lineEnd)) + var text = cm.getRange(curStart, curEnd).split('\n') + var numberRegex = pattern + ? pattern + : number === 'decimal' + ? /(-?)([\d]+)/ + : number === 'hex' + ? /(-?)(?:0x)?([0-9a-f]+)/i + : number === 'octal' + ? /([0-7]+)/ + : null + var radix = number === 'decimal' ? 10 : number === 'hex' ? 16 : number === 'octal' ? 8 : null + var numPart = [], + textPart = [] if (number || pattern) { for (var i = 0; i < text.length; i++) { - var matchPart = pattern ? text[i].match(pattern) : null; + var matchPart = pattern ? text[i].match(pattern) : null if (matchPart && matchPart[0] != '') { - numPart.push(matchPart); + numPart.push(matchPart) } else if (!pattern && numberRegex.exec(text[i])) { - numPart.push(text[i]); + numPart.push(text[i]) } else { - textPart.push(text[i]); + textPart.push(text[i]) } } } else { - textPart = text; + textPart = text } function compareFn(a, b) { - if (reverse) { var tmp; tmp = a; a = b; b = tmp; } - if (ignoreCase) { a = a.toLowerCase(); b = b.toLowerCase(); } - var anum = number && numberRegex.exec(a); - var bnum = number && numberRegex.exec(b); - if (!anum) { return a < b ? -1 : 1; } - anum = parseInt((anum[1] + anum[2]).toLowerCase(), radix); - bnum = parseInt((bnum[1] + bnum[2]).toLowerCase(), radix); - return anum - bnum; + if (reverse) { + var tmp + tmp = a + a = b + b = tmp + } + if (ignoreCase) { + a = a.toLowerCase() + b = b.toLowerCase() + } + var anum = number && numberRegex.exec(a) + var bnum = number && numberRegex.exec(b) + if (!anum) { + return a < b ? -1 : 1 + } + anum = parseInt((anum[1] + anum[2]).toLowerCase(), radix) + bnum = parseInt((bnum[1] + bnum[2]).toLowerCase(), radix) + return anum - bnum } function comparePatternFn(a, b) { - if (reverse) { var tmp; tmp = a; a = b; b = tmp; } - if (ignoreCase) { a[0] = a[0].toLowerCase(); b[0] = b[0].toLowerCase(); } - return (a[0] < b[0]) ? -1 : 1; + if (reverse) { + var tmp + tmp = a + a = b + b = tmp + } + if (ignoreCase) { + a[0] = a[0].toLowerCase() + b[0] = b[0].toLowerCase() + } + return a[0] < b[0] ? -1 : 1 } - numPart.sort(pattern ? comparePatternFn : compareFn); + numPart.sort(pattern ? comparePatternFn : compareFn) if (pattern) { for (var i = 0; i < numPart.length; i++) { - numPart[i] = numPart[i].input; - } - } else if (!number) { textPart.sort(compareFn); } - text = (!reverse) ? textPart.concat(numPart) : numPart.concat(textPart); - if (unique) { // Remove duplicate lines - var textOld = text; - var lastLine; - text = []; + numPart[i] = numPart[i].input + } + } else if (!number) { + textPart.sort(compareFn) + } + text = !reverse ? textPart.concat(numPart) : numPart.concat(textPart) + if (unique) { + // Remove duplicate lines + var textOld = text + var lastLine + text = [] for (var i = 0; i < textOld.length; i++) { if (textOld[i] != lastLine) { - text.push(textOld[i]); + text.push(textOld[i]) } - lastLine = textOld[i]; + lastLine = textOld[i] } } - cm.replaceRange(text.join('\n'), curStart, curEnd); + cm.replaceRange(text.join('\n'), curStart, curEnd) }, global: function(cm, params) { // a global command is of the form // :[range]g/pattern/[cmd] // argString holds the string /pattern/[cmd] - var argString = params.argString; + var argString = params.argString if (!argString) { - showConfirm(cm, 'Regular Expression missing from global'); - return; + showConfirm(cm, 'Regular Expression missing from global') + return } // range is specified here - var lineStart = (params.line !== undefined) ? params.line : cm.firstLine(); - var lineEnd = params.lineEnd || params.line || cm.lastLine(); + var lineStart = params.line !== undefined ? params.line : cm.firstLine() + var lineEnd = params.lineEnd || params.line || cm.lastLine() // get the tokens from argString - var tokens = splitBySlash(argString); - var regexPart = argString, cmd; + var tokens = splitBySlash(argString) + var regexPart = argString, + cmd if (tokens.length) { - regexPart = tokens[0]; - cmd = tokens.slice(1, tokens.length).join('/'); + regexPart = tokens[0] + cmd = tokens.slice(1, tokens.length).join('/') } if (regexPart) { // If regex part is empty, then use the previous query. Otherwise // use the regex part as the new query. try { - updateSearchQuery(cm, regexPart, true /** ignoreCase */, - true /** smartCase */); + updateSearchQuery(cm, regexPart, true /** ignoreCase */, true /** smartCase */) } catch (e) { - showConfirm(cm, 'Invalid regex: ' + regexPart); - return; + showConfirm(cm, 'Invalid regex: ' + regexPart) + return } } // now that we have the regexPart, search for regex matches in the // specified range of lines - var query = getSearchState(cm).getQuery(); - var matchedLines = [], content = ''; + var query = getSearchState(cm).getQuery() + var matchedLines = [], + content = '' for (var i = lineStart; i <= lineEnd; i++) { - var matched = query.test(cm.getLine(i)); + var matched = query.test(cm.getLine(i)) if (matched) { - matchedLines.push(i+1); - content+= cm.getLine(i) + '
'; + matchedLines.push(i + 1) + content += cm.getLine(i) + '
' } } // if there is no [cmd], just display the list of matched lines if (!cmd) { - showConfirm(cm, content); - return; + showConfirm(cm, content) + return } - var index = 0; + var index = 0 var nextCommand = function() { if (index < matchedLines.length) { - var command = matchedLines[index] + cmd; + var command = matchedLines[index] + cmd exCommandDispatcher.processCommand(cm, command, { - callback: nextCommand - }); + callback: nextCommand, + }) } - index++; - }; - nextCommand(); + index++ + } + nextCommand() }, substitute: function(cm, params) { if (!cm.getSearchCursor) { - throw new Error('Search feature not available. Requires searchcursor.js or ' + - 'any other getSearchCursor implementation.'); - } - var argString = params.argString; - var tokens = argString ? splitBySeparator(argString, argString[0]) : []; - var regexPart, replacePart = '', trailing, flagsPart, count; - var confirm = false; // Whether to confirm each replace. - var global = false; // True to replace all instances on a line, false to replace only 1. + throw new Error( + 'Search feature not available. Requires searchcursor.js or ' + 'any other getSearchCursor implementation.', + ) + } + var argString = params.argString + var tokens = argString ? splitBySeparator(argString, argString[0]) : [] + var regexPart, + replacePart = '', + trailing, + flagsPart, + count + var confirm = false // Whether to confirm each replace. + var global = false // True to replace all instances on a line, false to replace only 1. if (tokens.length) { - regexPart = tokens[0]; - replacePart = tokens[1]; + regexPart = tokens[0] + replacePart = tokens[1] if (regexPart && regexPart[regexPart.length - 1] === '$') { - regexPart = regexPart.slice(0, regexPart.length - 1) + '\\n'; - replacePart = replacePart ? replacePart + '\n' : '\n'; + regexPart = regexPart.slice(0, regexPart.length - 1) + '\\n' + replacePart = replacePart ? replacePart + '\n' : '\n' } if (replacePart !== undefined) { if (getOption('pcre')) { - replacePart = unescapeRegexReplace(replacePart); + replacePart = unescapeRegexReplace(replacePart) } else { - replacePart = translateRegexReplace(replacePart); + replacePart = translateRegexReplace(replacePart) } - vimGlobalState.lastSubstituteReplacePart = replacePart; + vimGlobalState.lastSubstituteReplacePart = replacePart } - trailing = tokens[2] ? tokens[2].split(' ') : []; + trailing = tokens[2] ? tokens[2].split(' ') : [] } else { // either the argString is empty or its of the form ' hello/world' // actually splitBySlash returns a list of tokens // only if the string starts with a '/' if (argString && argString.length) { - showConfirm(cm, 'Substitutions should be of the form ' + - ':s/pattern/replace/'); - return; + showConfirm(cm, 'Substitutions should be of the form ' + ':s/pattern/replace/') + return } } // After the 3rd slash, we can have flags followed by a space followed // by count. if (trailing) { - flagsPart = trailing[0]; - count = parseInt(trailing[1]); + flagsPart = trailing[0] + count = parseInt(trailing[1]) if (flagsPart) { if (flagsPart.indexOf('c') != -1) { - confirm = true; - flagsPart.replace('c', ''); + confirm = true + flagsPart.replace('c', '') } if (flagsPart.indexOf('g') != -1) { - global = true; - flagsPart.replace('g', ''); + global = true + flagsPart.replace('g', '') } - regexPart = regexPart.replace(/\//g, "\\/") + '/' + flagsPart; + regexPart = regexPart.replace(/\//g, '\\/') + '/' + flagsPart } } if (regexPart) { // If regex part is empty, then use the previous query. Otherwise use // the regex part as the new query. try { - updateSearchQuery(cm, regexPart, true /** ignoreCase */, - true /** smartCase */); + updateSearchQuery(cm, regexPart, true /** ignoreCase */, true /** smartCase */) } catch (e) { - showConfirm(cm, 'Invalid regex: ' + regexPart); - return; + showConfirm(cm, 'Invalid regex: ' + regexPart) + return } } - replacePart = replacePart || vimGlobalState.lastSubstituteReplacePart; + replacePart = replacePart || vimGlobalState.lastSubstituteReplacePart if (replacePart === undefined) { - showConfirm(cm, 'No previous substitute regular expression'); - return; + showConfirm(cm, 'No previous substitute regular expression') + return } - var state = getSearchState(cm); - var query = state.getQuery(); - var lineStart = (params.line !== undefined) ? params.line : cm.getCursor().line; - var lineEnd = params.lineEnd || lineStart; - if (lineStart == cm.firstLine() && lineEnd == cm.lastLine()) { - lineEnd = Infinity; + var state = getSearchState(cm) + var query = state.getQuery() + var lineStart = params.line !== undefined ? params.line : cm.getCursor().line + var lineEnd = params.lineEnd || lineStart + if (lineStart === cm.firstLine() && lineEnd === cm.lastLine()) { + lineEnd = Infinity } if (count) { - lineStart = lineEnd; - lineEnd = lineStart + count - 1; + lineStart = lineEnd + lineEnd = lineStart + count - 1 } - var startPos = clipCursorToContent(cm, Pos(lineStart, 0)); - var cursor = cm.getSearchCursor(query, startPos); - doReplace(cm, confirm, global, lineStart, lineEnd, cursor, query, replacePart, params.callback); + var startPos = clipCursorToContent(cm, Pos(lineStart, 0)) + var cursor = cm.getSearchCursor(query, startPos) + doReplace(cm, confirm, global, lineStart, lineEnd, cursor, query, replacePart, params.callback) }, redo: CodeMirror.commands.redo, undo: CodeMirror.commands.undo, write: function(cm) { if (CodeMirror.commands.save) { // If a save command is defined, call it. - CodeMirror.commands.save(cm); + CodeMirror.commands.save(cm) } else if (cm.save) { // Saves to text area if no save command is defined and cm.save() is available. - cm.save(); + cm.save() } }, nohlsearch: function(cm) { - clearSearchHighlight(cm); + clearSearchHighlight(cm) }, - yank: function (cm) { - var cur = copyCursor(cm.getCursor()); - var line = cur.line; - var lineText = cm.getLine(line); - vimGlobalState.registerController.pushText( - '0', 'yank', lineText, true, true); + yank: function(cm) { + var cur = copyCursor(cm.getCursor()) + var line = cur.line + var lineText = cm.getLine(line) + vimGlobalState.registerController.pushText('0', 'yank', lineText, true, true) }, delmarks: function(cm, params) { if (!params.argString || !trim(params.argString)) { - showConfirm(cm, 'Argument required'); - return; + showConfirm(cm, 'Argument required') + return } - var state = cm.state.vim; - var stream = new CodeMirror.StringStream(trim(params.argString)); + var state = cm.state.vim + var stream = new CodeMirror.StringStream(trim(params.argString)) while (!stream.eol()) { - stream.eatSpace(); + stream.eatSpace() // Record the streams position at the beginning of the loop for use // in error messages. - var count = stream.pos; + var count = stream.pos if (!stream.match(/[a-zA-Z]/, false)) { - showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count)); - return; + showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count)) + return } - var sym = stream.next(); + var sym = stream.next() // Check if this symbol is part of a range if (stream.match('-', true)) { // This symbol is part of a range. // The range must terminate at an alphabetic character. if (!stream.match(/[a-zA-Z]/, false)) { - showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count)); - return; + showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count)) + return } - var startMark = sym; - var finishMark = stream.next(); + var startMark = sym + var finishMark = stream.next() // The range must terminate at an alphabetic character which // shares the same case as the start of the range. - if (isLowerCase(startMark) && isLowerCase(finishMark) || - isUpperCase(startMark) && isUpperCase(finishMark)) { - var start = startMark.charCodeAt(0); - var finish = finishMark.charCodeAt(0); + if ( + (isLowerCase(startMark) && isLowerCase(finishMark)) || + (isUpperCase(startMark) && isUpperCase(finishMark)) + ) { + var start = startMark.charCodeAt(0) + var finish = finishMark.charCodeAt(0) if (start >= finish) { - showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count)); - return; + showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count)) + return } // Because marks are always ASCII values, and we have // determined that they are the same case, we can use // their char codes to iterate through the defined range. for (var j = 0; j <= finish - start; j++) { - var mark = String.fromCharCode(start + j); - delete state.marks[mark]; + var mark = String.fromCharCode(start + j) + delete state.marks[mark] } } else { - showConfirm(cm, 'Invalid argument: ' + startMark + '-'); - return; + showConfirm(cm, 'Invalid argument: ' + startMark + '-') + return } } else { // This symbol is a valid mark, and is not part of a range. - delete state.marks[sym]; + delete state.marks[sym] } } - } - }; + }, + } - var exCommandDispatcher = new ExCommandDispatcher(); + var exCommandDispatcher = new ExCommandDispatcher() /** - * @param {CodeMirror} cm CodeMirror instance we are in. - * @param {boolean} confirm Whether to confirm each replace. - * @param {Cursor} lineStart Line to start replacing from. - * @param {Cursor} lineEnd Line to stop replacing at. - * @param {RegExp} query Query for performing matches with. - * @param {string} replaceWith Text to replace matches with. May contain $1, - * $2, etc for replacing captured groups using Javascript replace. - * @param {function()} callback A callback for when the replace is done. - */ - function doReplace(cm, confirm, global, lineStart, lineEnd, searchCursor, query, - replaceWith, callback) { + * @param {CodeMirror} cm CodeMirror instance we are in. + * @param {boolean} confirm Whether to confirm each replace. + * @param {Cursor} lineStart Line to start replacing from. + * @param {Cursor} lineEnd Line to stop replacing at. + * @param {RegExp} query Query for performing matches with. + * @param {string} replaceWith Text to replace matches with. May contain $1, + * $2, etc for replacing captured groups using Javascript replace. + * @param {function()} callback A callback for when the replace is done. + */ + function doReplace(cm, confirm, global, lineStart, lineEnd, searchCursor, query, replaceWith, callback) { // Set up all the functions. - cm.state.vim.exMode = true; - var done = false; - var lastPos = searchCursor.from(); + cm.state.vim.exMode = true + var done = false + var lastPos = searchCursor.from() function replaceAll() { - var matches = searchCursor.getMatches(); - var matchesLength = matches.length; - cm.operation(function(matches, matchesLength) { - for (var i = matchesLength - 1; i >= 0; i--) { - replace(); - replaceAllNext(matches, i); - } - done = true; - stop(); - }.bind(this, matches, matchesLength)); + var matches = searchCursor.getMatches() + var matchesLength = matches.length + cm.operation( + function(matches, matchesLength) { + for (var i = matchesLength - 1; i >= 0; i--) { + replace() + replaceAllNext(matches, i) + } + done = true + stop() + }.bind(this, matches, matchesLength), + ) } function replace() { - var text = cm.getRange(searchCursor.from(), searchCursor.to()); - var newText = text.replace(query, replaceWith); - searchCursor.replace(newText); + var text = cm.getRange(searchCursor.from(), searchCursor.to()) + var newText = text.replace(query, replaceWith) + searchCursor.replace(newText) } function replaceAllNext(matches, index) { - var hasNext = searchCursor.jumpTo(index) && - isInRange(searchCursor.from(), lineStart, lineEnd); - var match = matches.pop(); - if (hasNext && !global && lastPos && searchCursor.from().line == lastPos.line) { - // Skip over multiple occurrences on the same line when 'global' is - // not true. - return; - } - cm.scrollIntoView(searchCursor.from(), 30); - lastPos = searchCursor.from(); - done = false; - return; + var hasNext = searchCursor.jumpTo(index) && isInRange(searchCursor.from(), lineStart, lineEnd) + var match = matches.pop() + if (hasNext && !global && lastPos && searchCursor.from().line === lastPos.line) { + // Skip over multiple occurrences on the same line when 'global' is + // not true. + return + } + cm.scrollIntoView(searchCursor.from(), 30) + lastPos = searchCursor.from() + done = false + return } function next() { // The below only loops to skip over multiple occurrences on the same // line when 'global' is not true. - while(searchCursor.findNext() && - isInRange(searchCursor.from(), lineStart, lineEnd)) { - if (!global && lastPos && searchCursor.from().line == lastPos.line) { - continue; + while (searchCursor.findNext() && isInRange(searchCursor.from(), lineStart, lineEnd)) { + if (!global && lastPos && searchCursor.from().line === lastPos.line) { + continue } - cm.scrollIntoView(searchCursor.from(), 30); - cm.setSelection(searchCursor.from(), searchCursor.to()); - lastPos = searchCursor.from(); - done = false; - return; + cm.scrollIntoView(searchCursor.from(), 30) + cm.setSelection(searchCursor.from(), searchCursor.to()) + lastPos = searchCursor.from() + done = false + return } - done = true; + done = true } function stop(close) { - if (close) { close(); } - cm.focus(); + if (close) { + close() + } + cm.focus() if (lastPos) { - cm.setCursor(lastPos); - var vim = cm.state.vim; - vim.exMode = false; - vim.lastHPos = vim.lastHSPos = lastPos.ch; + cm.setCursor(lastPos) + var vim = cm.state.vim + vim.exMode = false + vim.lastHPos = vim.lastHSPos = lastPos.ch + } + if (callback) { + callback() } - if (callback) { callback(); } } function onPromptKeyDown(e, _value, close) { // Swallow all keys. - CodeMirror.e_stop(e); - var keyName = CodeMirror.keyName(e); + CodeMirror.e_stop(e) + var keyName = CodeMirror.keyName(e) switch (keyName) { case 'y': case 'Y': - replace(); next(); break; + replace() + next() + break case 'n': case 'N': - next(); break; + next() + break case 'a': case 'A': // replaceAll contains a call to close of its own. We don't want it // to fire too early or multiple times. - var savedCallback = callback; - callback = undefined; - cm.operation(replaceAll); - callback = savedCallback; - break; + var savedCallback = callback + callback = undefined + cm.operation(replaceAll) + callback = savedCallback + break case 'l': case 'L': - replace(); - // fall through and exit. + replace() + // fall through and exit. case 'q': case 'Q': case 'Esc': case 'Ctrl-C': case 'Ctrl-[': - stop(close); - break; + stop(close) + break + } + if (done) { + stop(close) } - if (done) { stop(close); } - return true; + return true } // Actually do replace. - next(); + next() if (done) { - showConfirm(cm, 'No matches for ' + query.source); - return; + showConfirm(cm, 'No matches for ' + query.source) + return } if (!confirm) { - replaceAll(); - if (callback) { callback(); } - return; + replaceAll() + if (callback) { + callback() + } + return } showPrompt(cm, { prefix: 'replace with ' + replaceWith + ' (y/n/a/q/l)', - onKeyDown: onPromptKeyDown - }); + onKeyDown: onPromptKeyDown, + }) } CodeMirror.keyMap.vim = { attach: attachVimMap, detach: detachVimMap, - call: cmKey - }; + call: cmKey, + } function exitInsertMode(cm) { - var vim = cm.state.vim; - var macroModeState = vimGlobalState.macroModeState; - var insertModeChangeRegister = vimGlobalState.registerController.getRegister('.'); - var isPlaying = macroModeState.isPlaying; - var lastChange = macroModeState.lastInsertModeChanges; + var vim = cm.state.vim + var macroModeState = vimGlobalState.macroModeState + var insertModeChangeRegister = vimGlobalState.registerController.getRegister('.') + var isPlaying = macroModeState.isPlaying + var lastChange = macroModeState.lastInsertModeChanges // In case of visual block, the insertModeChanges are not saved as a // single word, so we convert them to a single word // so as to update the ". register as expected in real vim. - var text = []; + var text = [] if (!isPlaying) { - var selLength = lastChange.inVisualBlock && vim.lastSelection ? - vim.lastSelection.visualBlock.height : 1; - var changes = lastChange.changes; - var text = []; - var i = 0; + var selLength = lastChange.inVisualBlock && vim.lastSelection ? vim.lastSelection.visualBlock.height : 1 + var changes = lastChange.changes + var text = [] + var i = 0 // In case of multiple selections in blockwise visual, // the inserted text, for example: 'foo', is stored as // 'f', 'f', InsertModeKey 'o', 'o', 'o', 'o'. (if you have a block with 2 lines). @@ -5086,54 +5463,52 @@ var Vim = function() { // 2. In case of a character, jump by selLength (2 in the example). while (i < changes.length) { // This loop will convert 'ffoooo' to 'foo'. - text.push(changes[i]); + text.push(changes[i]) if (changes[i] instanceof InsertModeKey) { - i++; + i++ } else { - i+= selLength; + i += selLength } } - lastChange.changes = text; - cm.off('change', onChange); - CodeMirror.off(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown); + lastChange.changes = text + cm.off('change', onChange) + CodeMirror.off(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown) } if (!isPlaying && vim.insertModeRepeat > 1) { // Perform insert mode repeat for commands like 3,a and 3,o. - repeatLastEdit(cm, vim, vim.insertModeRepeat - 1, - true /** repeatForInsert */); - vim.lastEditInputState.repeatOverride = vim.insertModeRepeat; - } - delete vim.insertModeRepeat; - vim.insertMode = false; - cm.setCursor(cm.getCursor().line, cm.getCursor().ch-1); - cm.setOption('keyMap', 'vim'); - cm.setOption('disableInput', true); - cm.toggleOverwrite(false); // exit replace mode if we were in it. + repeatLastEdit(cm, vim, vim.insertModeRepeat - 1, true /** repeatForInsert */) + vim.lastEditInputState.repeatOverride = vim.insertModeRepeat + } + delete vim.insertModeRepeat + vim.insertMode = false + cm.setCursor(cm.getCursor().line, cm.getCursor().ch - 1) + cm.setOption('keyMap', 'vim') + cm.setOption('disableInput', true) + cm.toggleOverwrite(false) // exit replace mode if we were in it. // update the ". register before exiting insert mode - insertModeChangeRegister.setText(lastChange.changes.join('')); - CodeMirror.signal(cm, "vim-mode-change", {mode: "normal"}); + insertModeChangeRegister.setText(lastChange.changes.join('')) + CodeMirror.signal(cm, 'vim-mode-change', { mode: 'normal' }) if (macroModeState.isRecording) { - logInsertModeChange(macroModeState); + logInsertModeChange(macroModeState) } - cm.enterVimMode(); + cm.enterVimMode() } function _mapCommand(command) { - defaultKeymap.unshift(command); + defaultKeymap.unshift(command) } function mapCommand(keys, type, name, args, extra) { - var command = {keys: keys, type: type}; - command[type] = name; - command[type + "Args"] = args; - for (var key in extra) - command[key] = extra[key]; - _mapCommand(command); + var command = { keys: keys, type: type } + command[type] = name + command[type + 'Args'] = args + for (var key in extra) command[key] = extra[key] + _mapCommand(command) } // The timeout in milliseconds for the two-character ESC keymap should be // adjusted according to your typing speed to prevent false positives. - defineOption('insertModeEscKeysTimeout', 200, 'number'); + defineOption('insertModeEscKeysTimeout', 200, 'number') CodeMirror.keyMap['vim-insert'] = { // TODO: override navigation keys so that Esc will cancel automatic @@ -5141,77 +5516,82 @@ var Vim = function() { fallthrough: ['default'], attach: attachVimMap, detach: detachVimMap, - call: cmKey - }; + call: cmKey, + } CodeMirror.keyMap['vim-replace'] = { - 'Backspace': 'goCharLeft', + Backspace: 'goCharLeft', fallthrough: ['vim-insert'], attach: attachVimMap, detach: detachVimMap, - call: cmKey - }; + call: cmKey, + } function executeMacroRegister(cm, vim, macroModeState, registerName) { - var register = vimGlobalState.registerController.getRegister(registerName); - if (registerName == ':') { + var register = vimGlobalState.registerController.getRegister(registerName) + if (registerName === ':') { // Read-only register containing last Ex command. if (register.keyBuffer[0]) { - exCommandDispatcher.processCommand(cm, register.keyBuffer[0]); + exCommandDispatcher.processCommand(cm, register.keyBuffer[0]) } - macroModeState.isPlaying = false; - return; + macroModeState.isPlaying = false + return } - var keyBuffer = register.keyBuffer; - var imc = 0; - macroModeState.isPlaying = true; - macroModeState.replaySearchQueries = register.searchQueries.slice(0); + var keyBuffer = register.keyBuffer + var imc = 0 + macroModeState.isPlaying = true + macroModeState.replaySearchQueries = register.searchQueries.slice(0) for (var i = 0; i < keyBuffer.length; i++) { - var text = keyBuffer[i]; - var match, key; + var text = keyBuffer[i] + var match, key while (text) { // Pull off one command key, which is either a single character // or a special sequence wrapped in '<' and '>', e.g. ''. - match = (/<\w+-.+?>|<\w+>|./).exec(text); - key = match[0]; - text = text.substring(match.index + key.length); - CodeMirror.Vim.handleKey(cm, key, 'macro'); + match = /<\w+-.+?>|<\w+>|./.exec(text) + key = match[0] + text = text.substring(match.index + key.length) + CodeMirror.Vim.handleKey(cm, key, 'macro') if (vim.insertMode) { - var changes = register.insertModeChanges[imc++].changes; - vimGlobalState.macroModeState.lastInsertModeChanges.changes = - changes; - repeatInsertModeChanges(cm, changes, 1); - exitInsertMode(cm); + var changes = register.insertModeChanges[imc++].changes + vimGlobalState.macroModeState.lastInsertModeChanges.changes = changes + repeatInsertModeChanges(cm, changes, 1) + exitInsertMode(cm) } } } - macroModeState.isPlaying = false; + macroModeState.isPlaying = false } function logKey(macroModeState, key) { - if (macroModeState.isPlaying) { return; } - var registerName = macroModeState.latestRegister; - var register = vimGlobalState.registerController.getRegister(registerName); + if (macroModeState.isPlaying) { + return + } + var registerName = macroModeState.latestRegister + var register = vimGlobalState.registerController.getRegister(registerName) if (register) { - register.pushText(key); + register.pushText(key) } } function logInsertModeChange(macroModeState) { - if (macroModeState.isPlaying) { return; } - var registerName = macroModeState.latestRegister; - var register = vimGlobalState.registerController.getRegister(registerName); + if (macroModeState.isPlaying) { + return + } + var registerName = macroModeState.latestRegister + var register = vimGlobalState.registerController.getRegister(registerName) if (register && register.pushInsertModeChanges) { - register.pushInsertModeChanges(macroModeState.lastInsertModeChanges); + register.pushInsertModeChanges(macroModeState.lastInsertModeChanges) } } function logSearchQuery(macroModeState, query) { - if (macroModeState.isPlaying) { return; } - var registerName = macroModeState.latestRegister; - var register = vimGlobalState.registerController.getRegister(registerName); + if (macroModeState.isPlaying) { + return + } + var registerName = macroModeState.latestRegister + var register = vimGlobalState.registerController.getRegister(registerName) if (register && register.pushSearchQuery) { - register.pushSearchQuery(query); + register.pushSearchQuery(query) } } @@ -5220,117 +5600,124 @@ var Vim = function() { * Should only be active in insert mode. */ function onChange(cm, changeObj) { - var macroModeState = vimGlobalState.macroModeState; - var lastChange = macroModeState.lastInsertModeChanges; + var macroModeState = vimGlobalState.macroModeState + var lastChange = macroModeState.lastInsertModeChanges if (!macroModeState.isPlaying) { - while(changeObj) { - lastChange.expectCursorActivityForChange = true; - if (changeObj.origin == '+input' || changeObj.origin == 'paste' - || changeObj.origin === undefined /* only in testing */) { - var text = changeObj.text.join('\n'); + while (changeObj) { + lastChange.expectCursorActivityForChange = true + if ( + changeObj.origin === '+input' || + changeObj.origin === 'paste' || + changeObj.origin === undefined /* only in testing */ + ) { + var text = changeObj.text.join('\n') if (lastChange.maybeReset) { - lastChange.changes = []; - lastChange.maybeReset = false; + lastChange.changes = [] + lastChange.maybeReset = false } if (cm.state.overwrite && !/\n/.test(text)) { - lastChange.changes.push([text]); + lastChange.changes.push([text]) } else { - lastChange.changes.push(text); + lastChange.changes.push(text) } } // Change objects may be chained with next. - changeObj = changeObj.next; + changeObj = changeObj.next } } } /** - * Listens for any kind of cursor activity on CodeMirror. - */ + * Listens for any kind of cursor activity on CodeMirror. + */ function onCursorActivity(cm) { - var vim = cm.state.vim; + var vim = cm.state.vim if (vim.insertMode) { // Tracking cursor activity in insert mode (for macro support). - var macroModeState = vimGlobalState.macroModeState; - if (macroModeState.isPlaying) { return; } - var lastChange = macroModeState.lastInsertModeChanges; + var macroModeState = vimGlobalState.macroModeState + if (macroModeState.isPlaying) { + return + } + var lastChange = macroModeState.lastInsertModeChanges if (lastChange.expectCursorActivityForChange) { - lastChange.expectCursorActivityForChange = false; + lastChange.expectCursorActivityForChange = false } else { // Cursor moved outside the context of an edit. Reset the change. - lastChange.maybeReset = true; + lastChange.maybeReset = true } } else if (!cm.curOp.isVimOp) { - handleExternalSelection(cm, vim); + handleExternalSelection(cm, vim) } if (vim.visualMode) { - updateFakeCursor(cm); + updateFakeCursor(cm) } } function updateFakeCursor(cm) { - var vim = cm.state.vim; - var from = clipCursorToContent(cm, copyCursor(vim.sel.head)); - var to = offsetCursor(from, 0, 1); + var vim = cm.state.vim + var from = clipCursorToContent(cm, copyCursor(vim.sel.head)) + var to = offsetCursor(from, 0, 1) if (vim.fakeCursor) { - vim.fakeCursor.clear(); + vim.fakeCursor.clear() } - vim.fakeCursor = cm.markText(from, to, {className: 'cm-animate-fat-cursor'}); + vim.fakeCursor = cm.markText(from, to, { className: 'cm-animate-fat-cursor' }) } function handleExternalSelection(cm, vim) { - var anchor = cm.getCursor('anchor'); - var head = cm.getCursor('head'); + var anchor = cm.getCursor('anchor') + var head = cm.getCursor('head') // Enter or exit visual mode to match mouse selection. if (vim.visualMode && !cm.somethingSelected()) { - exitVisualMode(cm, false); + exitVisualMode(cm, false) } else if (!vim.visualMode && !vim.insertMode && cm.somethingSelected()) { - vim.visualMode = true; - vim.visualLine = false; - CodeMirror.signal(cm, "vim-mode-change", {mode: "visual"}); + vim.visualMode = true + vim.visualLine = false + CodeMirror.signal(cm, 'vim-mode-change', { mode: 'visual' }) } if (vim.visualMode) { // Bind CodeMirror selection model to vim selection model. // Mouse selections are considered visual characterwise. - var headOffset = !cursorIsBefore(head, anchor) ? -1 : 0; - var anchorOffset = cursorIsBefore(head, anchor) ? -1 : 0; - head = offsetCursor(head, 0, headOffset); - anchor = offsetCursor(anchor, 0, anchorOffset); + var headOffset = !cursorIsBefore(head, anchor) ? -1 : 0 + var anchorOffset = cursorIsBefore(head, anchor) ? -1 : 0 + head = offsetCursor(head, 0, headOffset) + anchor = offsetCursor(anchor, 0, anchorOffset) vim.sel = { anchor: anchor, - head: head - }; - updateMark(cm, vim, '<', cursorMin(head, anchor)); - updateMark(cm, vim, '>', cursorMax(head, anchor)); + head: head, + } + updateMark(cm, vim, '<', cursorMin(head, anchor)) + updateMark(cm, vim, '>', cursorMax(head, anchor)) } else if (!vim.insertMode) { // Reset lastHPos if selection was modified by something outside of vim mode e.g. by mouse. - vim.lastHPos = cm.getCursor().ch; + vim.lastHPos = cm.getCursor().ch } } /** Wrapper for special keys pressed in insert mode */ function InsertModeKey(keyName) { - this.keyName = keyName; + this.keyName = keyName } /** - * Handles raw key down events from the text area. - * - Should only be active in insert mode. - * - For recording deletes in insert mode. - */ + * Handles raw key down events from the text area. + * - Should only be active in insert mode. + * - For recording deletes in insert mode. + */ function onKeyEventTargetKeyDown(e) { - var macroModeState = vimGlobalState.macroModeState; - var lastChange = macroModeState.lastInsertModeChanges; - var keyName = CodeMirror.keyName(e); - if (!keyName) { return; } + var macroModeState = vimGlobalState.macroModeState + var lastChange = macroModeState.lastInsertModeChanges + var keyName = CodeMirror.keyName(e) + if (!keyName) { + return + } function onKeyFound() { if (lastChange.maybeReset) { - lastChange.changes = []; - lastChange.maybeReset = false; + lastChange.changes = [] + lastChange.maybeReset = false } - lastChange.changes.push(new InsertModeKey(keyName)); - return true; + lastChange.changes.push(new InsertModeKey(keyName)) + return true } if (keyName.indexOf('Delete') != -1 || keyName.indexOf('Backspace') != -1) { - CodeMirror.lookupKey(keyName, 'vim-insert', onKeyFound); + CodeMirror.lookupKey(keyName, 'vim-insert', onKeyFound) } } @@ -5344,101 +5731,100 @@ var Vim = function() { * corresponding enterInsertMode call was made with a count. */ function repeatLastEdit(cm, vim, repeat, repeatForInsert) { - var macroModeState = vimGlobalState.macroModeState; - macroModeState.isPlaying = true; - var isAction = !!vim.lastEditActionCommand; - var cachedInputState = vim.inputState; + var macroModeState = vimGlobalState.macroModeState + macroModeState.isPlaying = true + var isAction = !!vim.lastEditActionCommand + var cachedInputState = vim.inputState function repeatCommand() { if (isAction) { - commandDispatcher.processAction(cm, vim, vim.lastEditActionCommand); + commandDispatcher.processAction(cm, vim, vim.lastEditActionCommand) } else { - commandDispatcher.evalInput(cm, vim); + commandDispatcher.evalInput(cm, vim) } } function repeatInsert(repeat) { if (macroModeState.lastInsertModeChanges.changes.length > 0) { // For some reason, repeat cw in desktop VIM does not repeat // insert mode changes. Will conform to that behavior. - repeat = !vim.lastEditActionCommand ? 1 : repeat; - var changeObject = macroModeState.lastInsertModeChanges; - repeatInsertModeChanges(cm, changeObject.changes, repeat); + repeat = !vim.lastEditActionCommand ? 1 : repeat + var changeObject = macroModeState.lastInsertModeChanges + repeatInsertModeChanges(cm, changeObject.changes, repeat) } } - vim.inputState = vim.lastEditInputState; + vim.inputState = vim.lastEditInputState if (isAction && vim.lastEditActionCommand.interlaceInsertRepeat) { // o and O repeat have to be interlaced with insert repeats so that the // insertions appear on separate lines instead of the last line. for (var i = 0; i < repeat; i++) { - repeatCommand(); - repeatInsert(1); + repeatCommand() + repeatInsert(1) } } else { if (!repeatForInsert) { // Hack to get the cursor to end up at the right place. If I is // repeated in insert mode repeat, cursor will be 1 insert // change set left of where it should be. - repeatCommand(); + repeatCommand() } - repeatInsert(repeat); + repeatInsert(repeat) } - vim.inputState = cachedInputState; + vim.inputState = cachedInputState if (vim.insertMode && !repeatForInsert) { // Don't exit insert mode twice. If repeatForInsert is set, then we // were called by an exitInsertMode call lower on the stack. - exitInsertMode(cm); + exitInsertMode(cm) } - macroModeState.isPlaying = false; + macroModeState.isPlaying = false } function repeatInsertModeChanges(cm, changes, repeat) { function keyHandler(binding) { - if (typeof binding == 'string') { - CodeMirror.commands[binding](cm); + if (typeof binding === 'string') { + CodeMirror.commands[binding](cm) } else { - binding(cm); + binding(cm) } - return true; + return true } - var head = cm.getCursor('head'); - var inVisualBlock = vimGlobalState.macroModeState.lastInsertModeChanges.inVisualBlock; + var head = cm.getCursor('head') + var inVisualBlock = vimGlobalState.macroModeState.lastInsertModeChanges.inVisualBlock if (inVisualBlock) { // Set up block selection again for repeating the changes. - var vim = cm.state.vim; - var lastSel = vim.lastSelection; - var offset = getOffset(lastSel.anchor, lastSel.head); - selectForInsert(cm, head, offset.line + 1); - repeat = cm.listSelections().length; - cm.setCursor(head); + var vim = cm.state.vim + var lastSel = vim.lastSelection + var offset = getOffset(lastSel.anchor, lastSel.head) + selectForInsert(cm, head, offset.line + 1) + repeat = cm.listSelections().length + cm.setCursor(head) } for (var i = 0; i < repeat; i++) { if (inVisualBlock) { - cm.setCursor(offsetCursor(head, i, 0)); + cm.setCursor(offsetCursor(head, i, 0)) } for (var j = 0; j < changes.length; j++) { - var change = changes[j]; + var change = changes[j] if (change instanceof InsertModeKey) { - CodeMirror.lookupKey(change.keyName, 'vim-insert', keyHandler); - } else if (typeof change == "string") { - var cur = cm.getCursor(); - cm.replaceRange(change, cur, cur); + CodeMirror.lookupKey(change.keyName, 'vim-insert', keyHandler) + } else if (typeof change === 'string') { + var cur = cm.getCursor() + cm.replaceRange(change, cur, cur) } else { - var start = cm.getCursor(); - var end = offsetCursor(start, 0, change[0].length); - cm.replaceRange(change[0], start, end); + var start = cm.getCursor() + var end = offsetCursor(start, 0, change[0].length) + cm.replaceRange(change[0], start, end) } } } if (inVisualBlock) { - cm.setCursor(offsetCursor(head, 0, 1)); + cm.setCursor(offsetCursor(head, 0, 1)) } } - resetVimGlobalState(); - return vimApi; -}; - + resetVimGlobalState() + return vimApi +} -CodeMirror.Vim = Vim(); +CodeMirror.Vim = Vim() -export { Vim }; -export default CodeMirror; +export { Vim } +export default CodeMirror diff --git a/src/cm_adapter.js b/src/cm_adapter.js index 13613eb..02cb955 100644 --- a/src/cm_adapter.js +++ b/src/cm_adapter.js @@ -1,43 +1,36 @@ /** * An adapter to make CodeMirror's vim bindings work with monaco */ -import { - KeyCode, - KeyMod, - Range, - Position, - Selection, - SelectionDirection, - editor as monacoEditor, -} from 'monaco-editor'; -import { TypeOperations } from 'monaco-editor/esm/vs/editor/common/controller/cursorTypeOperations'; +import { KeyCode, KeyMod, Range, Position, Selection, SelectionDirection, editor as monacoEditor } from 'monaco-editor' +import { TypeOperations } from 'monaco-editor/esm/vs/editor/common/controller/cursorTypeOperations' + const VerticalRevealType = { Bottom: 4, -}; +} -const { userAgent, platform } = window.navigator; -const edge = /Edge\/(\d+)/.exec(userAgent); -const ios = !edge && /AppleWebKit/.test(userAgent) && /Mobile\/\w+/.test(userAgent); -const mac = ios || /Mac/.test(platform); +const { userAgent } = window.navigator +const edge = /Edge\/(\d+)/.exec(userAgent) +const ios = !edge && /AppleWebKit/.test(userAgent) && /Mobile\/\w+/.test(userAgent) -const nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/; +const nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/ function isWordCharBasic(ch) { - return /\w/.test(ch) || ch > "\x80" && - (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)) + return ( + /\w/.test(ch) || (ch > '\x80' && (ch.toUpperCase() !== ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch))) + ) } function Pos(line, column) { if (!(this instanceof Pos)) { - return new Pos(line, column); + return new Pos(line, column) } - this.line = line; - this.ch = column; + this.line = line + this.ch = column } function signal(cm, signal, args) { - cm.dispatch(signal, args); + cm.dispatch(signal, args) } function dummy(key) { @@ -46,260 +39,293 @@ function dummy(key) { } } -let doFold, noFold; +let doFold, noFold if (String.prototype.normalize) { - doFold = function(str) { return str.normalize("NFD").toLowerCase() } - noFold = function(str) { return str.normalize("NFD") } + doFold = function(str) { + return str.normalize('NFD').toLowerCase() + } + noFold = function(str) { + return str.normalize('NFD') + } } else { - doFold = function(str) { return str.toLowerCase() } - noFold = function(str) { return str } + doFold = function(str) { + return str.toLowerCase() + } + noFold = function(str) { + return str + } } -var StringStream = function(string, tabSize) { - this.pos = this.start = 0; - this.string = string; - this.tabSize = tabSize || 8; - this.lastColumnPos = this.lastColumnValue = 0; - this.lineStart = 0; -}; +const StringStream = function(string, tabSize) { + this.pos = this.start = 0 + this.string = string + this.tabSize = tabSize || 8 + this.lastColumnPos = this.lastColumnValue = 0 + this.lineStart = 0 +} StringStream.prototype = { - eol: function() {return this.pos >= this.string.length;}, - sol: function() {return this.pos == this.lineStart;}, - peek: function() {return this.string.charAt(this.pos) || undefined;}, + eol: function() { + return this.pos >= this.string.length + }, + sol: function() { + return this.pos === this.lineStart + }, + peek: function() { + return this.string.charAt(this.pos) || undefined + }, next: function() { - if (this.pos < this.string.length) - return this.string.charAt(this.pos++); + if (this.pos < this.string.length) return this.string.charAt(this.pos++) }, eat: function(match) { - var ch = this.string.charAt(this.pos); - if (typeof match == "string") var ok = ch == match; - else var ok = ch && (match.test ? match.test(ch) : match(ch)); - if (ok) {++this.pos; return ch;} + const ch = this.string.charAt(this.pos) + let ok + if (typeof match === 'string') { + ok = ch === match + } else { + ok = ch && (match.test ? match.test(ch) : match(ch)) + } + if (ok) { + ++this.pos + return ch + } }, eatWhile: function(match) { - var start = this.pos; - while (this.eat(match)){} - return this.pos > start; + const start = this.pos + // while (this.eat(match)){} + return this.pos > start }, eatSpace: function() { - var start = this.pos; - while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos; - return this.pos > start; + const start = this.pos + while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos + return this.pos > start + }, + skipToEnd: function() { + this.pos = this.string.length }, - skipToEnd: function() {this.pos = this.string.length;}, skipTo: function(ch) { - var found = this.string.indexOf(ch, this.pos); - if (found > -1) {this.pos = found; return true;} + const found = this.string.indexOf(ch, this.pos) + if (found > -1) { + this.pos = found + return true + } + }, + backUp: function(n) { + this.pos -= n }, - backUp: function(n) {this.pos -= n;}, column: function() { - throw "not implemented"; + throw 'not implemented' }, indentation: function() { - throw "not implemented"; + throw 'not implemented' }, match: function(pattern, consume, caseInsensitive) { - if (typeof pattern == "string") { - var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;}; - var substr = this.string.substr(this.pos, pattern.length); - if (cased(substr) == cased(pattern)) { - if (consume !== false) this.pos += pattern.length; - return true; + if (typeof pattern === 'string') { + const cased = function(str) { + return caseInsensitive ? str.toLowerCase() : str + } + const substr = this.string.substr(this.pos, pattern.length) + if (cased(substr) === cased(pattern)) { + if (consume !== false) this.pos += pattern.length + return true } } else { - var match = this.string.slice(this.pos).match(pattern); - if (match && match.index > 0) return null; - if (match && consume !== false) this.pos += match[0].length; - return match; + const match = this.string.slice(this.pos).match(pattern) + if (match && match.index > 0) return null + if (match && consume !== false) this.pos += match[0].length + return match } }, - current: function(){return this.string.slice(this.start, this.pos);}, + current: function() { + return this.string.slice(this.start, this.pos) + }, hideFirstChars: function(n, inner) { - this.lineStart += n; - try { return inner(); } - finally { this.lineStart -= n; } - } -}; + this.lineStart += n + try { + return inner() + } finally { + this.lineStart -= n + } + }, +} function toCmPos(pos) { - return new Pos(pos.lineNumber - 1, pos.column - 1); + return new Pos(pos.lineNumber - 1, pos.column - 1) } function toMonacoPos(pos) { - return new Position(pos.line + 1, pos.ch + 1); + return new Position(pos.line + 1, pos.ch + 1) } class Marker { constructor(cm, id, line, ch) { - this.cm = cm; - this.id = id; - this.lineNumber = line + 1; - this.column = ch + 1; - cm.marks[this.id] = this; + this.cm = cm + this.id = id + this.lineNumber = line + 1 + this.column = ch + 1 + cm.marks[this.id] = this } clear() { - delete this.cm.marks[this.id]; + delete this.cm.marks[this.id] } find() { - return toCmPos(this); + return toCmPos(this) } } function monacoToCmKey(e, skip = false) { - let addQuotes = true; - let keyName = monaco.KeyCode[e.keyCode]; + let addQuotes = true + let keyName = monaco.KeyCode[e.keyCode] if (e.key) { - keyName = e.key; - addQuotes = false; + keyName = e.key + addQuotes = false } - let key = keyName; - let skipOnlyShiftCheck = skip; + let key = keyName + let skipOnlyShiftCheck = skip switch (e.keyCode) { case KeyCode.Shift: case KeyCode.Meta: case KeyCode.Alt: case KeyCode.Ctrl: - return key; + return key case KeyCode.Escape: - skipOnlyShiftCheck = true; - key = 'Esc'; - break; + skipOnlyShiftCheck = true + key = 'Esc' + break } if (keyName.startsWith('KEY_')) { - key = keyName[keyName.length - 1].toLowerCase(); + key = keyName[keyName.length - 1].toLowerCase() } else if (keyName.endsWith('Arrow')) { - skipOnlyShiftCheck = true; - key = keyName.substr(0, keyName.length - 5); + skipOnlyShiftCheck = true + key = keyName.substr(0, keyName.length - 5) } else if (keyName.startsWith('US_')) { - key = e.browserEvent.key; + key = e.browserEvent.key } if (!skipOnlyShiftCheck && !e.altKey && !e.ctrlKey && !e.metaKey) { - key = e.key || e.browserEvent.key; + key = e.key || e.browserEvent.key } else { if (e.altKey) { - key = `Alt-${key}`; + key = `Alt-${key}` } if (e.ctrlKey) { - key = `Ctrl-${key}`; + key = `Ctrl-${key}` } if (e.metaKey) { - key = `Meta-${key}`; + key = `Meta-${key}` } if (e.shiftKey) { - key = `Shift-${key}`; + key = `Shift-${key}` } } if (key.length === 1 && addQuotes) { - key = `'${key}'`; + key = `'${key}'` } - return key; + return key } class CMAdapter { - static Pos = Pos; - static signal = signal; - static on = dummy('on'); - static off = dummy('off'); - static addClass = dummy('addClass'); - static rmClass = dummy('rmClass'); - static defineOption = dummy('defineOption'); + static Pos = Pos + static signal = signal + static on = dummy('on') + static off = dummy('off') + static addClass = dummy('addClass') + static rmClass = dummy('rmClass') + static defineOption = dummy('defineOption') static keyMap = { - 'default': function(key) { + default: function(key) { return function(cm) { - return true; + return true } - } - }; - static isWordChar = isWordCharBasic; - static keyName = monacoToCmKey; - static StringStream = StringStream; + }, + } + static isWordChar = isWordCharBasic + static keyName = monacoToCmKey + static StringStream = StringStream static e_stop = function(e) { if (e.stopPropagation) { - e.stopPropagation(); + e.stopPropagation() } else { - e.cancelBubble = true; + e.cancelBubble = true } - CMAdapter.e_preventDefault(e); - return false; - }; + CMAdapter.e_preventDefault(e) + return false + } static e_preventDefault = function(e) { if (e.preventDefault) { - e.preventDefault(); + e.preventDefault() if (e.browserEvent) { - e.browserEvent.preventDefault(); + e.browserEvent.preventDefault() } } else { - e.returnValue = false; + e.returnValue = false } - return false; - }; + return false + } static commands = { redo: function(cm) { - cm.triggerEditorAction('redo'); + cm.triggerEditorAction('redo') }, undo: function(cm) { - cm.triggerEditorAction('undo'); + cm.triggerEditorAction('undo') }, newlineAndIndent: function(cm) { - cm.triggerEditorAction('editor.action.insertLineAfter'); - } - }; + cm.triggerEditorAction('editor.action.insertLineAfter') + }, + } static lookupKey = function lookupKey(key, map, handle) { if (typeof map === 'string') { - map = CMAdapter.keyMap[map]; + map = CMAdapter.keyMap[map] } - const found = typeof map == "function" ? map(key) : map[key]; + const found = typeof map === 'function' ? map(key) : map[key] - if (found === false) return "nothing"; - if (found === "...") return "multi"; - if (found != null && handle(found)) return "handled"; + if (found === false) return 'nothing' + if (found === '...') return 'multi' + if (found !== null && handle(found)) return 'handled' if (map.fallthrough) { - if (!Array.isArray(map.fallthrough)) - return lookupKey(key, map.fallthrough, handle); - for (var i = 0; i < map.fallthrough.length; i++) { - var result = lookupKey(key, map.fallthrough[i], handle); - if (result) return result; + if (!Array.isArray(map.fallthrough)) return lookupKey(key, map.fallthrough, handle) + for (let i = 0; i < map.fallthrough.length; i++) { + const result = lookupKey(key, map.fallthrough[i], handle) + if (result) return result } } } static defineExtension = function(name, fn) { - CMAdapter.prototype[name] = fn; - }; + CMAdapter.prototype[name] = fn + } constructor(editor) { - this.editor = editor; - this.state = {}; - this.marks = {}; - this.$uid = 0; - this.disposables = []; - this.listeners = {}; - this.curOp = {}; - this.attached = false; - this.statusBar = null; - this.addLocalListeners(); - this.ctxInsert = this.editor.createContextKey('insertMode', true); + this.editor = editor + this.state = {} + this.marks = {} + this.$uid = 0 + this.disposables = [] + this.listeners = {} + this.curOp = {} + this.attached = false + this.statusBar = null + this.addLocalListeners() + this.ctxInsert = this.editor.createContextKey('insertMode', true) } attach() { - CMAdapter.keyMap.vim.attach(this); + CMAdapter.keyMap.vim.attach(this) } addLocalListeners() { @@ -307,673 +333,688 @@ class CMAdapter { this.editor.onDidChangeCursorPosition(this.handleCursorChange), this.editor.onDidChangeModelContent(this.handleChange), this.editor.onKeyDown(this.handleKeyDown), - ); + ) } handleKeyDown = (e) => { // Allow previously registered keydown listeners to handle the event and // prevent this extension from also handling it. - if (e.browserEvent.defaultPrevented & e.keyCode !== KeyCode.Escape) { - return; + if (e.browserEvent.defaultPrevented & (e.keyCode !== KeyCode.Escape)) { + return } if (!this.attached) { - return; + return } - const key = monacoToCmKey(e); + const key = monacoToCmKey(e) if (this.replaceMode) { - this.handleReplaceMode(key, e); + this.handleReplaceMode(key, e) } if (!key) { - return; + return } if (CMAdapter.keyMap.vim && CMAdapter.keyMap.vim.call) { - const cmd = CMAdapter.keyMap.vim.call(key, this); + const cmd = CMAdapter.keyMap.vim.call(key, this) if (cmd) { - e.preventDefault(); - e.stopPropagation(); + e.preventDefault() + e.stopPropagation() try { - cmd(); + cmd() } catch (err) { - console.error(err); + console.error(err) } } } } handleReplaceMode(key, e) { - let fromReplace = false; - let char = key; - const pos = this.editor.getPosition(); - let range = new Range(pos.lineNumber, pos.column, pos.lineNumber, pos.column + 1); - let forceMoveMarkers = true; - - if (key.startsWith('\'')) { - char = key[1]; + let fromReplace = false + let char = key + const pos = this.editor.getPosition() + let range = new Range(pos.lineNumber, pos.column, pos.lineNumber, pos.column + 1) + const forceMoveMarkers = true + + if (key.startsWith("'")) { + char = key[1] } else if (char === 'Enter') { - char = '\n'; + char = '\n' } else if (char === 'Backspace') { - const lastItem = this.replaceStack.pop(); + const lastItem = this.replaceStack.pop() if (!lastItem) { - return; + return } - fromReplace = true; - char = lastItem; - range = new Range(pos.lineNumber, pos.column, pos.lineNumber, pos.column - 1); + fromReplace = true + char = lastItem + range = new Range(pos.lineNumber, pos.column, pos.lineNumber, pos.column - 1) } else { - return; + return } - e.preventDefault(); - e.stopPropagation(); + e.preventDefault() + e.stopPropagation() if (!this.replaceStack) { - this.replaceStack = []; + this.replaceStack = [] } if (!fromReplace) { - this.replaceStack.push(this.editor.getModel().getValueInRange(range)); + this.replaceStack.push(this.editor.getModel().getValueInRange(range)) } - this.editor.executeEdits('vim', [{ - text: char, - range, - forceMoveMarkers, - }]); + this.editor.executeEdits('vim', [ + { + text: char, + range, + forceMoveMarkers, + }, + ]) if (fromReplace) { - this.editor.setPosition(range.getStartPosition()); + this.editor.setPosition(range.getStartPosition()) } } handleCursorChange = (e) => { - const { position, source } = e; - const { editor } = this; - const selection = editor.getSelection(); + const { position, source } = e + const { editor } = this + const selection = editor.getSelection() if (!this.ctxInsert.get() && e.source === 'mouse' && selection.isEmpty()) { - const maxCol = editor.getModel().getLineMaxColumn(position.lineNumber); + const maxCol = editor.getModel().getLineMaxColumn(position.lineNumber) if (e.position.column === maxCol) { - editor.setPosition(new Position(e.position.lineNumber, maxCol - 1)); - return; + editor.setPosition(new Position(e.position.lineNumber, maxCol - 1)) + return } } - this.dispatch('cursorActivity', this, e); + this.dispatch('cursorActivity', this, e) } handleChange = (e) => { - const { changes } = e; + const { changes } = e const change = { text: changes.reduce((acc, change) => { - acc.push(change.text); - return acc; + acc.push(change.text) + return acc }, []), - origin: '+input' - }; - const curOp = this.curOp = this.curOp || {}; + origin: '+input', + } + const curOp = (this.curOp = this.curOp || {}) if (!curOp.changeHandlers) { - curOp.changeHandlers = this.listeners['change'] && this.listeners['change'].slice(); + curOp.changeHandlers = this.listeners['change'] && this.listeners['change'].slice() } if (this.virtualSelectionMode()) { - return; + return } if (!curOp.lastChange) { - curOp.lastChange = curOp.change = change; + curOp.lastChange = curOp.change = change } else { - curOp.lastChange.next = curOp.lastChange = change; + curOp.lastChange.next = curOp.lastChange = change } - this.dispatch('change', this, change); - }; + this.dispatch('change', this, change) + } setOption(key, value) { - this.state[key] = value; + this.state[key] = value if (key === 'theme') { - monacoEditor.setTheme(value); + monacoEditor.setTheme(value) } } getOption(key) { if (key === 'readOnly') { - return this.editor.getConfiguration().readOnly; + return this.editor.getRawOptions().readOnly } else if (key === 'firstLineNumber') { - return this.firstLine() + 1; + return this.firstLine() + 1 } else if (key === 'indentWithTabs') { - return !this.editor.getModel().getOptions().insertSpaces; + return !this.editor.getModel().getOptions().insertSpaces } else { return this.editor.getRawConfiguration()[key] } - return this.state[key]; } dispatch(signal, ...args) { - const listeners = this.listeners[signal]; + const listeners = this.listeners[signal] if (!listeners) { - return; + return } - listeners.forEach(handler => handler(...args)); + listeners.forEach((handler) => handler(...args)) } on(event, handler) { if (!this.listeners[event]) { - this.listeners[event] = []; + this.listeners[event] = [] } - this.listeners[event].push(handler); + this.listeners[event].push(handler) } off(event, handler) { - const listeners = this.listeners[event]; + const listeners = this.listeners[event] if (!listeners) { - return; + return } - this.listeners[event] = listeners.filter(l => l !== handler); + this.listeners[event] = listeners.filter((l) => l !== handler) } firstLine() { - return 0; + return 0 } lastLine() { - return this.lineCount() - 1; + return this.lineCount() - 1 } lineCount() { - return this.editor.getModel().getLineCount(); + return this.editor.getModel().getLineCount() } defaultTextHeight() { - return 1; + return 1 } getLine(line) { if (line < 0) { - return ''; + return '' } - const model = this.editor.getModel(); - const maxLines = model.getLineCount(); + const model = this.editor.getModel() + const maxLines = model.getLineCount() if (line + 1 > maxLines) { - line = maxLines - 1; + line = maxLines - 1 } - return this.editor.getModel().getLineContent(line + 1); + return this.editor.getModel().getLineContent(line + 1) } getAnchorForSelection(selection) { if (selection.isEmpty()) { - return selection.getPosition(); + return selection.getPosition() } - const selDir = selection.getDirection(); - return (selDir === SelectionDirection.LTR) ? selection.getStartPosition() : selection.getEndPosition(); + const selDir = selection.getDirection() + return selDir === SelectionDirection.LTR ? selection.getStartPosition() : selection.getEndPosition() } getHeadForSelection(selection) { if (selection.isEmpty()) { - return selection.getPosition(); + return selection.getPosition() } - const selDir = selection.getDirection(); - return (selDir === SelectionDirection.LTR) ? selection.getEndPosition() : selection.getStartPosition(); + const selDir = selection.getDirection() + return selDir === SelectionDirection.LTR ? selection.getEndPosition() : selection.getStartPosition() } getCursor(type = null) { if (!type) { - return toCmPos(this.editor.getPosition()); + return toCmPos(this.editor.getPosition()) } - const sel = this.editor.getSelection(); - let pos; + const sel = this.editor.getSelection() + let pos if (sel.isEmpty()) { - pos = sel.getPosition(); + pos = sel.getPosition() } else if (type === 'anchor') { - pos = this.getAnchorForSelection(sel); + pos = this.getAnchorForSelection(sel) } else { - pos = this.getHeadForSelection(sel); + pos = this.getHeadForSelection(sel) } - return toCmPos(pos); + return toCmPos(pos) } getRange(start, end) { - const p1 = toMonacoPos(start); - const p2 = toMonacoPos(end); + const p1 = toMonacoPos(start) + const p2 = toMonacoPos(end) - return this.editor.getModel().getValueInRange(Range.fromPositions(p1, p2)); + return this.editor.getModel().getValueInRange(Range.fromPositions(p1, p2)) } getSelection() { - return this.editor.getModel().getValueInRange(this.editor.getSelection()); + return this.editor.getModel().getValueInRange(this.editor.getSelection()) } replaceRange(text, start, end) { - const p1 = toMonacoPos(start); - const p2 = !end ? p1 : toMonacoPos(end); + const p1 = toMonacoPos(start) + const p2 = !end ? p1 : toMonacoPos(end) - this.editor.executeEdits('vim', [{ - text, - range: Range.fromPositions(p1, p2), - }]); + this.editor.executeEdits('vim', [ + { + text, + range: Range.fromPositions(p1, p2), + }, + ]) // @TODO - Check if this breaks any other expectation - this.pushUndoStop(); + this.pushUndoStop() } pushUndoStop() { - this.editor.pushUndoStop(); + this.editor.pushUndoStop() } setCursor(line, ch) { - let pos = line; + let pos = line if (typeof line !== 'object') { - pos = {}; - pos.line = line; - pos.ch = ch; + pos = {} + pos.line = line + pos.ch = ch } - const monacoPos = this.editor.getModel().validatePosition(toMonacoPos(pos)); - this.editor.setPosition(toMonacoPos(pos)); - this.editor.revealPosition(monacoPos); + const monacoPos = this.editor.getModel().validatePosition(toMonacoPos(pos)) + this.editor.setPosition(toMonacoPos(pos)) + this.editor.revealPosition(monacoPos) } somethingSelected() { - return !this.editor.getSelection().isEmpty(); + return !this.editor.getSelection().isEmpty() } operation(fn, force) { - return fn(); + return fn() } listSelections() { - const selections = this.editor.getSelections(); + const selections = this.editor.getSelections() if (!selections.length || this.inVirtualSelectionMode) { - return [{ - anchor: this.getCursor('anchor'), - head: this.getCursor('head'), - }]; + return [ + { + anchor: this.getCursor('anchor'), + head: this.getCursor('head'), + }, + ] } - return selections.map(sel => { - const pos = sel.getPosition(); - const start = sel.getStartPosition(); - const end = sel.getEndPosition(); + return selections.map((sel) => { + const pos = sel.getPosition() + const start = sel.getStartPosition() + const end = sel.getEndPosition() return { anchor: this.clipPos(toCmPos(this.getAnchorForSelection(sel))), head: this.clipPos(toCmPos(this.getHeadForSelection(sel))), - }; - }); + } + }) } focus() { - this.editor.focus(); + this.editor.focus() } setSelections(selections, primIndex) { - const hasSel = !!this.editor.getSelections().length; + const hasSel = !!this.editor.getSelections().length const sels = selections.map((sel, index) => { - const { anchor, head } = sel; + const { anchor, head } = sel if (hasSel) { - return Selection.fromPositions(toMonacoPos(anchor), toMonacoPos(head)); + return Selection.fromPositions(toMonacoPos(anchor), toMonacoPos(head)) } else { - return Selection.fromPositions(toMonacoPos(head), toMonacoPos(anchor)); + return Selection.fromPositions(toMonacoPos(head), toMonacoPos(anchor)) } - }); + }) if (!primIndex) { - sels.reverse(); + sels.reverse() } else if (sels[primIndex]) { - sels.push(sels.splice(primIndex, 1)[0]); + sels.push(sels.splice(primIndex, 1)[0]) } if (!sels.length) { - return; + return } - const sel = sels[0]; - let posToReveal; + const sel = sels[0] + let posToReveal if (sel.getDirection() === SelectionDirection.LTR) { - posToReveal = sel.getEndPosition(); + posToReveal = sel.getEndPosition() } else { - posToReveal = sel.getStartPosition(); + posToReveal = sel.getStartPosition() } - this.editor.setSelections(sels); - this.editor.revealPosition(posToReveal); + this.editor.setSelections(sels) + this.editor.revealPosition(posToReveal) } setSelection(frm, to) { - const range = Range.fromPositions(toMonacoPos(frm), toMonacoPos(to)); - this.editor.setSelection(range); + const range = Range.fromPositions(toMonacoPos(frm), toMonacoPos(to)) + this.editor.setSelection(range) } getSelections() { - const { editor } = this; - return editor.getSelections().map(sel => editor.getModel().getValueInRange(sel)); + const { editor } = this + return editor.getSelections().map((sel) => editor.getModel().getValueInRange(sel)) } replaceSelections(texts) { - const { editor } = this; + const { editor } = this editor.getSelections().forEach((sel, index) => { - editor.executeEdits('vim', [{ - range: sel, - text: texts[index], - forceMoveMarkers: false, - }]); + editor.executeEdits('vim', [ + { + range: sel, + text: texts[index], + forceMoveMarkers: false, + }, + ]) }) } toggleOverwrite(toggle) { if (toggle) { - this.enterVimMode(); - this.replaceMode = true; + this.enterVimMode() + this.replaceMode = true } else { - this.leaveVimMode(); - this.replaceMode = false; - this.replaceStack = []; + this.leaveVimMode() + this.replaceMode = false + this.replaceStack = [] } } charCoords(pos, mode) { - return { top: pos.line, left: pos.ch, - }; + } } - coordsChar(pos, mode) { - if (mode === 'local') { + // Empty block statement + // coordsChar(pos, mode) { + // if (mode === 'local') { - } - } + // } + // } clipPos(p) { - const pos = this.editor.getModel().validatePosition(toMonacoPos(p)); - return toCmPos(pos); + const pos = this.editor.getModel().validatePosition(toMonacoPos(p)) + return toCmPos(pos) } setBookmark(cursor, options) { - const bm = new Marker(this, this.$uid++, cursor.line, cursor.ch); + const bm = new Marker(this, this.$uid++, cursor.line, cursor.ch) if (!options || !options.insertLeft) { - bm.$insertRight = true; + bm.$insertRight = true } - this.marks[bm.id] = bm; - return bm; + this.marks[bm.id] = bm + return bm } getScrollInfo() { - const { editor } = this; - const [ range ] = editor.getVisibleRanges(); + const { editor } = this + const [range] = editor.getVisibleRanges() return { left: 0, top: range.startLineNumber - 1, height: editor.getModel().getLineCount(), clientHeight: range.endLineNumber - range.startLineNumber + 1, - }; + } } triggerEditorAction(action) { - this.editor.trigger('vim', action); + this.editor.trigger('vim', action) } dispose() { - this.dispatch('dispose'); - this.removeOverlay(); + this.dispatch('dispose') + this.removeOverlay() if (CMAdapter.keyMap.vim) { - CMAdapter.keyMap.vim.detach(this); + CMAdapter.keyMap.vim.detach(this) } - this.disposables.forEach(d => d.dispose()); + this.disposables.forEach((d) => d.dispose()) } getInputField() {} getWrapperElement() {} enterVimMode(toVim = true) { - this.ctxInsert.set(false); - const config = this.editor.getConfiguration(); - this.initialCursorWidth = config.viewInfo.cursorWidth || 0; + this.ctxInsert.set(false) + const config = this.editor.getRawOptions() + this.initialCursorWidth = config.cursorWidth || 0 this.editor.updateOptions({ cursorWidth: config.fontInfo.typicalFullwidthCharacterWidth, cursorBlinking: 'solid', - }); + }) } leaveVimMode() { - this.ctxInsert.set(true); + this.ctxInsert.set(true) this.editor.updateOptions({ cursorWidth: this.initialCursorWidth || 0, cursorBlinking: 'blink', - }); + }) } virtualSelectionMode() { - return this.inVirtualSelectionMode; + return this.inVirtualSelectionMode } markText() { // only used for fat-cursor, not needed - return {clear: function() {}, find: function() {}}; + return { clear: function() {}, find: function() {} } } getUserVisibleLines() { - const ranges = this.editor.getVisibleRanges(); + const ranges = this.editor.getVisibleRanges() if (!ranges.length) { return { top: 0, bottom: 0, - }; + } } const res = { top: Infinity, bottom: 0, - }; + } ranges.reduce((acc, range) => { if (range.startLineNumber < acc.top) { - acc.top = range.startLineNumber; + acc.top = range.startLineNumber } if (range.endLineNumber > acc.bottom) { - acc.bottom = range.endLineNumber; + acc.bottom = range.endLineNumber } - return acc; - }, res); + return acc + }, res) - res.top -= 1; - res.bottom -= 1; + res.top -= 1 + res.bottom -= 1 - return res; + return res } findPosV(startPos, amount, unit) { - const { editor } = this; - let finalAmount = amount; - let finalUnit = unit; - const pos = toMonacoPos(startPos); + const { editor } = this + let finalAmount = amount + let finalUnit = unit + const pos = toMonacoPos(startPos) if (unit === 'page') { - const editorHeight = editor.getLayoutInfo().height; - const lineHeight = editor.getConfiguration().fontInfo.lineHeight; - finalAmount = finalAmount * Math.floor(editorHeight / lineHeight); - finalUnit = 'line'; + const editorHeight = editor.getLayoutInfo().height + const lineHeight = editor.getConfiguration().fontInfo.lineHeight + finalAmount = finalAmount * Math.floor(editorHeight / lineHeight) + finalUnit = 'line' } if (unit === 'line') { - pos.lineNumber += finalAmount; + pos.lineNumber += finalAmount } - return toCmPos(pos); + return toCmPos(pos) } findMatchingBracket(pos) { - const mPos = toMonacoPos(pos); - const res = this.editor.getModel().matchBracket(mPos); + const mPos = toMonacoPos(pos) + const res = this.editor.getModel().matchBracket(mPos) if (!res || !(res.length === 2)) { return { to: null, - }; + } } return { to: toCmPos(res[1].getStartPosition()), - }; + } } findFirstNonWhiteSpaceCharacter(line) { - return this.editor.getModel().getLineFirstNonWhitespaceColumn(line + 1) - 1; + return this.editor.getModel().getLineFirstNonWhitespaceColumn(line + 1) - 1 } scrollTo(x, y) { if (!x && !y) { - return; + return } if (!x) { if (y < 0) { - y = this.editor.getPosition().lineNumber - y; + y = this.editor.getPosition().lineNumber - y } - this.editor.setScrollTop(this.editor.getTopForLineNumber(y + 1)); + this.editor.setScrollTop(this.editor.getTopForLineNumber(y + 1)) } } moveCurrentLineTo(viewPosition) { - const { editor } = this; - const pos = editor.getPosition(); - const range = Range.fromPositions(pos, pos); + const { editor } = this + const pos = editor.getPosition() + const range = Range.fromPositions(pos, pos) - switch(viewPosition) { + switch (viewPosition) { case 'top': - editor.revealRangeAtTop(range); - return; + editor.revealRangeAtTop(range) + return case 'center': - editor.revealRangeInCenter(range); - return; + editor.revealRangeInCenter(range) + return case 'bottom': // private api. no other way - editor._revealRange(range, VerticalRevealType.Bottom); - return; + editor._revealRange(range, VerticalRevealType.Bottom) + return } } getSearchCursor(query, pos, caseFold) { - let matchCase = false; - let isRegex = false; + let matchCase = false + let isRegex = false if (query instanceof RegExp && !query.global) { - matchCase = !query.ignoreCase; - query = query.source; - isRegex = true; + matchCase = !query.ignoreCase + query = query.source + isRegex = true } - if (pos.ch == undefined) pos.ch = Number.MAX_VALUE; + if (pos.ch === undefined) pos.ch = Number.MAX_VALUE - const monacoPos = toMonacoPos(pos); - const context = this; - const { editor } = this; - let lastSearch = null; - const model = editor.getModel(); - const matches = model.findMatches(query, false, isRegex, matchCase) || []; + const monacoPos = toMonacoPos(pos) + const context = this + const { editor } = this + let lastSearch = null + const model = editor.getModel() + const matches = model.findMatches(query, false, isRegex, matchCase) || [] return { - getMatches() {return matches;}, - findNext() {return this.find(false);}, - findPrevious() {return this.find(true);}, + getMatches() { + return matches + }, + findNext() { + return this.find(false) + }, + findPrevious() { + return this.find(true) + }, jumpTo(index) { if (!matches || !matches.length) { - return false; + return false } - var match = matches[index]; - lastSearch = match.range; - context.highlightRanges([lastSearch], 'currentFindMatch'); - context.highlightRanges(matches.map(m => m.range).filter(r => !r.equalsRange(lastSearch))); + const match = matches[index] + lastSearch = match.range + context.highlightRanges([lastSearch], 'currentFindMatch') + context.highlightRanges(matches.map((m) => m.range).filter((r) => !r.equalsRange(lastSearch))) - return lastSearch; + return lastSearch }, find(back) { if (!matches || !matches.length) { - return false; + return false } - let match; + let match if (back) { - const pos = lastSearch ? lastSearch.getStartPosition() : monacoPos; - match = model.findPreviousMatch(query, pos, isRegex, matchCase); + const pos = lastSearch ? lastSearch.getStartPosition() : monacoPos + match = model.findPreviousMatch(query, pos, isRegex, matchCase) if (!match || !match.range.getStartPosition().isBeforeOrEqual(pos)) { - return false; + return false } } else { - const pos = lastSearch ? lastSearch.getEndPosition() : monacoPos; - match = model.findNextMatch(query, pos, isRegex, matchCase); + const pos = lastSearch ? lastSearch.getEndPosition() : monacoPos + match = model.findNextMatch(query, pos, isRegex, matchCase) if (!match || !pos.isBeforeOrEqual(match.range.getStartPosition())) { - return false; + return false } } - lastSearch = match.range; - context.highlightRanges([lastSearch], 'currentFindMatch'); - context.highlightRanges(matches.map(m => m.range).filter(r => !r.equalsRange(lastSearch))); + lastSearch = match.range + context.highlightRanges([lastSearch], 'currentFindMatch') + context.highlightRanges(matches.map((m) => m.range).filter((r) => !r.equalsRange(lastSearch))) - return lastSearch; + return lastSearch }, from() { - return lastSearch && toCmPos(lastSearch.getStartPosition()); + return lastSearch && toCmPos(lastSearch.getStartPosition()) }, to() { - return lastSearch && toCmPos(lastSearch.getEndPosition()); + return lastSearch && toCmPos(lastSearch.getEndPosition()) }, replace(text) { if (lastSearch) { - editor.executeEdits('vim', [{ - range: lastSearch, - text, - forceMoveMarkers: true, - }]); - - lastSearch.setEndPosition(editor.getPosition()); - editor.setPosition(lastSearch.getStartPosition()); + editor.executeEdits('vim', [ + { + range: lastSearch, + text, + forceMoveMarkers: true, + }, + ]) + + lastSearch.setEndPosition(editor.getPosition()) + editor.setPosition(lastSearch.getStartPosition()) } - } - }; + }, + } } highlightRanges(ranges, className = 'findMatch') { - const decorationKey = `decoration${className}`; + const decorationKey = `decoration${className}` this[decorationKey] = this.editor.deltaDecorations( this[decorationKey] || [], - ranges.map(range => ({ + ranges.map((range) => ({ range, options: { stickiness: monacoEditor.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, @@ -982,128 +1023,128 @@ class CMAdapter { showIfCollapsed: true, }, })), - ); + ) - return this[decorationKey]; + return this[decorationKey] } addOverlay({ query }, hasBoundary, style) { - let matchCase = false; - let isRegex = false; + let matchCase = false + let isRegex = false if (query && query instanceof RegExp && !query.global) { - isRegex = true; - matchCase = !query.ignoreCase; - query = query.source; + isRegex = true + matchCase = !query.ignoreCase + query = query.source } - const match = this.editor.getModel().findNextMatch(query, this.editor.getPosition(), isRegex, matchCase); + const match = this.editor.getModel().findNextMatch(query, this.editor.getPosition(), isRegex, matchCase) if (!match || !match.range) { - return; + return } - this.highlightRanges([match.range]); + this.highlightRanges([match.range]) } removeOverlay() { - ['currentFindMatch', 'findMatch'].forEach(key => { - this.editor.deltaDecorations(this[`decoration${key}`] || [], []); - }); + ;['currentFindMatch', 'findMatch'].forEach((key) => { + this.editor.deltaDecorations(this[`decoration${key}`] || [], []) + }) } scrollIntoView(pos) { if (!pos) { - return; + return } - this.editor.revealPosition(toMonacoPos(pos)); + this.editor.revealPosition(toMonacoPos(pos)) } moveH(units, type) { if (type !== 'char') { - return; + return } - const pos = this.editor.getPosition(); - this.editor.setPosition(new Position(pos.lineNumber, pos.column + units)); + const pos = this.editor.getPosition() + this.editor.setPosition(new Position(pos.lineNumber, pos.column + units)) } /** * Uses internal apis which not sure why is internal */ scanForBracket(pos, dir, dd, config) { - const mPos = toMonacoPos(pos); - const model = this.editor.getModel(); - let range = model.matchBracket(mPos); + const mPos = toMonacoPos(pos) + const model = this.editor.getModel() + let range = model.matchBracket(mPos) if (!range || range.length !== 2) { - const bracket = '{(['; - for(let i=0; i 'import').join('\n'), - minimap: { - enabled: false, - }, - theme: 'vs', - language: 'javascript', - fontSize: 15, - scrollBeyondLastLine: false, -}); -editor.focus(); -const vimMode = initVimMode(editor, statusNode); - -const editorNode2 = document.getElementById('editor2'); -const statusNode2 = document.getElementById('status2'); -const editor2 = monaco.editor.create(editorNode2, { - value: [1, 2, 3, 4, 5, 6, 7, 8].map(t => 'import').join('\n'), - minimap: { - enabled: false, - }, - theme: 'vs', - language: 'javascript', - fontSize: 15, - scrollBeyondLastLine: false, -}); -editor.focus(); -const vimMode2 = initVimMode(editor2, statusNode2); - -window.editor = editor; -window.vimMode = vimMode; -window.editor2 = editor; -window.vimMode2 = vimMode2; diff --git a/src/index.js b/src/index.js deleted file mode 100644 index 8d34c23..0000000 --- a/src/index.js +++ /dev/null @@ -1,53 +0,0 @@ -import { default as VimMode } from './cm/keymap_vim'; -import StatusBar from './statusbar'; - -export function initVimMode( - editor, - statusbarNode = null, - StatusBarClass = StatusBar, - sanitizer = null) { - const vimAdapter = new VimMode(editor); - - if (!statusbarNode) { - vimAdapter.attach(); - return vimAdapter; - } - - const statusBar = new StatusBarClass(statusbarNode, editor, sanitizer); - let keyBuffer = ''; - - vimAdapter.on('vim-mode-change', (mode) => { - statusBar.setMode(mode); - }); - - vimAdapter.on('vim-keypress', (key) => { - if (key === ':') { - keyBuffer = ''; - } else { - keyBuffer += key; - } - statusBar.setKeyBuffer(keyBuffer); - }); - - vimAdapter.on('vim-command-done', () => { - keyBuffer = ''; - statusBar.setKeyBuffer(keyBuffer); - }); - - vimAdapter.on('dispose', function() { - statusBar.toggleVisibility(false); - statusBar.closeInput(); - statusBar.clear(); - }); - - statusBar.toggleVisibility(true); - vimAdapter.setStatusBar(statusBar) - vimAdapter.attach(); - - return vimAdapter; -} - -export { - VimMode, - StatusBar, -}; diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..b4e62fb --- /dev/null +++ b/src/index.ts @@ -0,0 +1,53 @@ +import { editor } from 'monaco-editor' + +import { default as VimMode } from './cm/keymap_vim' +import StatusBar from './statusbar' + +export function initVimMode( + editor: editor.IStandaloneCodeEditor, + statusbarNode = null, + StatusBarClass = StatusBar, + sanitizer = null, +) { + const vimAdapter = new VimMode(editor) + + if (!statusbarNode) { + vimAdapter.attach() + return vimAdapter + } + + const statusBar = new StatusBarClass(statusbarNode, editor, sanitizer) + let keyBuffer = '' + + vimAdapter.on('vim-mode-change', (mode) => { + statusBar.setMode(mode) + }) + + vimAdapter.on('vim-keypress', (key) => { + if (key === ':') { + keyBuffer = '' + } else { + keyBuffer += key + } + statusBar.setKeyBuffer(keyBuffer) + }) + + vimAdapter.on('vim-command-done', () => { + keyBuffer = '' + statusBar.setKeyBuffer(keyBuffer) + }) + + vimAdapter.on('dispose', function() { + statusBar.toggleVisibility(false) + statusBar.closeInput() + statusBar.clear() + }) + + statusBar.toggleVisibility(true) + vimAdapter.setStatusBar(statusBar) + vimAdapter.attach() + + return vimAdapter +} + +export { VimMode, StatusBar } diff --git a/src/statusbar.js b/src/statusbar.js index b21bda9..82f6f3a 100644 --- a/src/statusbar.js +++ b/src/statusbar.js @@ -1,172 +1,172 @@ export default class VimStatusBar { constructor(node, editor, sanitizer = null) { - this.node = node; - this.modeInfoNode = document.createElement('span'); - this.secInfoNode = document.createElement('span'); - this.notifNode = document.createElement('span'); - this.notifNode.className = 'vim-notification'; - this.keyInfoNode = document.createElement('span'); - this.keyInfoNode.setAttribute('style', 'float: right'); - this.node.appendChild(this.modeInfoNode); - this.node.appendChild(this.secInfoNode); - this.node.appendChild(this.notifNode); - this.node.appendChild(this.keyInfoNode); - this.toggleVisibility(false); - this.editor = editor; - this.sanitizer = sanitizer; + this.node = node + this.modeInfoNode = document.createElement('span') + this.secInfoNode = document.createElement('span') + this.notifNode = document.createElement('span') + this.notifNode.className = 'vim-notification' + this.keyInfoNode = document.createElement('span') + this.keyInfoNode.setAttribute('style', 'float: right') + this.node.appendChild(this.modeInfoNode) + this.node.appendChild(this.secInfoNode) + this.node.appendChild(this.notifNode) + this.node.appendChild(this.keyInfoNode) + this.toggleVisibility(false) + this.editor = editor + this.sanitizer = sanitizer } setMode(ev) { if (ev.mode === 'visual' && ev.subMode === 'linewise') { - this.setText('--VISUAL LINE--'); - return; + this.setText('--VISUAL LINE--') + return } - this.setText(`--${ev.mode.toUpperCase()}--`); + this.setText(`--${ev.mode.toUpperCase()}--`) } setKeyBuffer(key) { - this.keyInfoNode.textContent = key; + this.keyInfoNode.textContent = key } setSec(text, callback, options) { - this.notifNode.textContent = ''; + this.notifNode.textContent = '' if (text === undefined) { - return; + return } - this.setInnerHtml_(this.secInfoNode, text); - const input = this.secInfoNode.querySelector('input'); + this.setInnerHtml_(this.secInfoNode, text) + const input = this.secInfoNode.querySelector('input') if (input) { - input.focus(); + input.focus() this.input = { callback, options, node: input, - }; + } if (options) { if (options.selectValueOnOpen) { - input.select(); + input.select() } if (options.value) { - input.value = options.value; + input.value = options.value } } - this.addInputListeners(); + this.addInputListeners() } - return this.closeInput; + return this.closeInput } setText(text) { - this.modeInfoNode.textContent = text; + this.modeInfoNode.textContent = text } toggleVisibility(toggle) { if (toggle) { - this.node.style.display = 'block'; + this.node.style.display = 'block' } else { - this.node.style.display = 'none'; + this.node.style.display = 'none' } if (this.input) { - this.removeInputListeners(); + this.removeInputListeners() } - clearInterval(this.notifTimeout); + clearInterval(this.notifTimeout) } closeInput = () => { - this.removeInputListeners(); - this.input = null; - this.setSec(''); + this.removeInputListeners() + this.input = null + this.setSec('') if (this.editor) { - this.editor.focus(); + this.editor.focus() } - }; + } clear = () => { - this.setInnerHtml_(this.node, ''); + this.setInnerHtml_(this.node, '') } inputKeyUp = (e) => { - const { options } = this.input; + const { options } = this.input if (options && options.onKeyUp) { - options.onKeyUp(e, e.target.value, this.closeInput); + options.onKeyUp(e, e.target.value, this.closeInput) } - }; + } inputBlur = () => { - const { options } = this.input; + const { options } = this.input if (options.closeOnBlur) { - this.closeInput(); + this.closeInput() } - }; + } inputKeyDown = (e) => { - const { options, callback } = this.input; + const { options, callback } = this.input if (options && options.onKeyDown && options.onKeyDown(e, e.target.value, this.closeInput)) { - return; + return } - if (e.keyCode === 27 || (options && options.closeOnEnter !== false && e.keyCode == 13)) { - this.input.node.blur(); - e.stopPropagation(); - this.closeInput(); + if (e.keyCode === 27 || (options && options.closeOnEnter !== false && e.keyCode === 13)) { + this.input.node.blur() + e.stopPropagation() + this.closeInput() } if (e.keyCode === 13 && callback) { - e.stopPropagation(); - e.preventDefault(); - callback(e.target.value); + e.stopPropagation() + e.preventDefault() + callback(e.target.value) } - }; + } addInputListeners() { - const { node } = this.input; - node.addEventListener('keyup', this.inputKeyUp); - node.addEventListener('keydown', this.inputKeyDown); - node.addEventListener('input', this.inputKeyInput); - node.addEventListener('blur', this.inputBlur); + const { node } = this.input + node.addEventListener('keyup', this.inputKeyUp) + node.addEventListener('keydown', this.inputKeyDown) + node.addEventListener('input', this.inputKeyInput) + node.addEventListener('blur', this.inputBlur) } removeInputListeners() { if (!this.input || !this.input.node) { - return; + return } - const { node } = this.input; - node.removeEventListener('keyup', this.inputKeyUp); - node.removeEventListener('keydown', this.inputKeyDown); - node.removeEventListener('input', this.inputKeyInput); - node.removeEventListener('blur', this.inputBlur); + const { node } = this.input + node.removeEventListener('keyup', this.inputKeyUp) + node.removeEventListener('keydown', this.inputKeyDown) + node.removeEventListener('input', this.inputKeyInput) + node.removeEventListener('blur', this.inputBlur) } showNotification(text) { - const sp = document.createElement('span'); - this.setInnerHtml_(sp, text); - this.notifNode.textContent = sp.textContent; + const sp = document.createElement('span') + this.setInnerHtml_(sp, text) + this.notifNode.textContent = sp.textContent this.notifTimeout = setTimeout(() => { - this.notifNode.textContent = ''; - }, 5000); + this.notifNode.textContent = '' + }, 5000) } setInnerHtml_(element, htmlContents) { if (this.sanitizer) { // Clear out previous contents first. while (element.children.length) { - element.removeChild(element.children[0]); + element.removeChild(element.children[0]) } - element.appendChild(this.sanitizer(htmlContents)); + element.appendChild(this.sanitizer(htmlContents)) } else { - element.innerHTML = htmlContents; + element.innerHTML = htmlContents } } } diff --git a/tools/eslint-pre-commit.js b/tools/eslint-pre-commit.js new file mode 100644 index 0000000..e69de29 diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..f97bccc --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,50 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "target": "es5", + "module": "esnext", + "moduleResolution": "node", + "baseUrl": "./", + "outDir": "lib", + "allowJs": true, + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "dom", + "dom.iterable", + "es5", + "es2015", + "es2016", + "es2017", + "esnext" + ], + + "sourceMap": false, + "importHelpers": true, + "newLine": "LF", + "skipLibCheck": true, + "allowSyntheticDefaultImports": true, + + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + + "downlevelIteration": true, + "noEmitHelpers": true, + "noImplicitReturns": true, + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "removeComments": true, + "strictNullChecks": true, + "suppressExcessPropertyErrors": true, + "suppressImplicitAnyIndexErrors": true + }, + "include": [ + "./src", + "global.d.ts" + ], + "exclude": [ + "node_modules", + ] +} diff --git a/webpack.config.js b/webpack.config.js index b38d212..6a47e9f 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,81 +1,86 @@ -const path = require('path'); -const webpack = require('webpack'); -const HtmlWebpackPlugin = require('html-webpack-plugin'); -const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin'); +const path = require('path') +const webpack = require('webpack') +const HtmlWebpackPlugin = require('html-webpack-plugin') +const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin') -const pkg = require('./package.json'); +const pkg = require('./package.json') function getOutput(isProd = false) { const data = { path: path.resolve(__dirname, 'dist'), filename: '[name].js', - }; + } if (!isProd) { - return data; + return data } - data.libraryTarget = 'umd'; - data.library = 'MonacoVim'; - data.globalObject = 'self'; - return data; + data.libraryTarget = 'umd' + data.library = 'MonacoVim' + data.globalObject = 'self' + return data } module.exports = (_env, argv) => { - const isProd = argv.mode === 'production'; + const isProd = argv.mode === 'production' return { target: 'web', entry: { - 'monaco-vim': isProd ? './src/index.js' : './src/demo.js', + 'monaco-vim': isProd ? './src/index.ts' : './example/demo.js', }, output: getOutput(isProd), module: { - rules: [{ - test: /\.js$/, - exclude: /node_modules/, - use: { - loader: 'babel-loader', - options: { - compact: false, + rules: [ + { + test: /\.(js|ts)$/, + exclude: /node_modules/, + use: { + loader: 'ts-loader', }, }, - }, { - test: /\.css$/, - // exclude: /node_modules/, - use: [ - 'style-loader', - 'css-loader', - ], - }], + { + test: /\.css$/, + use: ['style-loader', 'css-loader'], + }, + { + test: /\.(ttf|eot|woff|woff2)$/i, + use: [ + { + loader: 'file-loader', + }, + ], + }, + ], }, - plugins: isProd ? [ - new webpack.BannerPlugin({ - banner: [ - pkg.name, - `Version - ${pkg.version}`, - `Author - ${pkg.author}`, - `License - ${pkg.license}`, - ].join('\n'), - }), - ] : [ - new HtmlWebpackPlugin({ - template: path.join(__dirname, './index.html'), - }), - new MonacoWebpackPlugin(), - ], - externals: isProd ? { - 'monaco-editor': { - root: 'monaco', - commonjs: 'monaco-editor', - commonjs2: 'monaco-editor', - amd: 'vs/editor/editor.main', - }, - 'monaco-editor/esm/vs/editor/common/controller/cursorTypeOperations': { - commonjs: 'monaco-editor/esm/vs/editor/common/controller/cursorTypeOperations', - commonjs2: 'monaco-editor/esm/vs/editor/common/controller/cursorTypeOperations', - amd: 'vs/editor/common/controller/cursorTypeOperations', - }, - } : {}, + plugins: isProd + ? [ + new webpack.BannerPlugin({ + banner: [pkg.name, `Version - ${pkg.version}`, `Author - ${pkg.author}`, `License - ${pkg.license}`].join( + '\n', + ), + }), + ] + : [ + new HtmlWebpackPlugin({ + template: path.join(__dirname, './example/index.html'), + }), + new MonacoWebpackPlugin(), + ], + externals: isProd + ? { + 'monaco-editor': { + root: 'monaco', + commonjs: 'monaco-editor', + commonjs2: 'monaco-editor', + amd: 'vs/editor/editor.main', + }, + 'monaco-editor/esm/vs/editor/common/controller/cursorTypeOperations': { + commonjs: 'monaco-editor/esm/vs/editor/common/controller/cursorTypeOperations', + commonjs2: 'monaco-editor/esm/vs/editor/common/controller/cursorTypeOperations', + amd: 'vs/editor/common/controller/cursorTypeOperations', + }, + } + : {}, } -}; +} diff --git a/yarn.lock b/yarn.lock index a8b0a5e..cb381a4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,231 +2,13 @@ # yarn lockfile v1 -"@babel/cli@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.7.0.tgz#8d10c9acb2acb362d7614a9493e1791c69100d89" - integrity sha512-jECEqAq6Ngf3pOhLSg7od9WKyrIacyh1oNNYtRXNn+ummSHCTXBamGywOAtiae34Vk7zKuQNnLvo2BKTMCoV4A== - dependencies: - commander "^2.8.1" - convert-source-map "^1.1.0" - fs-readdir-recursive "^1.1.0" - glob "^7.0.0" - lodash "^4.17.13" - make-dir "^2.1.0" - slash "^2.0.0" - source-map "^0.5.0" - optionalDependencies: - chokidar "^2.1.8" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": +"@babel/code-frame@^7.0.0": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@^7.7.2": - version "7.7.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.2.tgz#ea5b99693bcfc058116f42fa1dd54da412b29d91" - integrity sha512-eeD7VEZKfhK1KUXGiyPFettgF3m513f8FoBSWiQ1xTvl1RAopLs42Wp9+Ze911I6H0N9lNqJMDgoZT7gHsipeQ== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.7.2" - "@babel/helpers" "^7.7.0" - "@babel/parser" "^7.7.2" - "@babel/template" "^7.7.0" - "@babel/traverse" "^7.7.2" - "@babel/types" "^7.7.2" - convert-source-map "^1.7.0" - debug "^4.1.0" - json5 "^2.1.0" - lodash "^4.17.13" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/generator@^7.7.2": - version "7.7.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.2.tgz#2f4852d04131a5e17ea4f6645488b5da66ebf3af" - integrity sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ== - dependencies: - "@babel/types" "^7.7.2" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - -"@babel/helper-annotate-as-pure@^7.0.0", "@babel/helper-annotate-as-pure@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.0.tgz#efc54032d43891fe267679e63f6860aa7dbf4a5e" - integrity sha512-k50CQxMlYTYo+GGyUGFwpxKVtxVJi9yh61sXZji3zYHccK9RYliZGSTOgci85T+r+0VFN2nWbGM04PIqwfrpMg== - dependencies: - "@babel/types" "^7.7.0" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.0.tgz#32dd9551d6ed3a5fc2edc50d6912852aa18274d9" - integrity sha512-Cd8r8zs4RKDwMG/92lpZcnn5WPQ3LAMQbCw42oqUh4s7vsSN5ANUZjMel0OOnxDLq57hoDDbai+ryygYfCTOsw== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.7.0" - "@babel/types" "^7.7.0" - -"@babel/helper-call-delegate@^7.4.4": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.7.0.tgz#df8942452c2c1a217335ca7e393b9afc67f668dc" - integrity sha512-Su0Mdq7uSSWGZayGMMQ+z6lnL00mMCnGAbO/R0ZO9odIdB/WNU/VfQKqMQU0fdIsxQYbRjDM4BixIa93SQIpvw== - dependencies: - "@babel/helper-hoist-variables" "^7.7.0" - "@babel/traverse" "^7.7.0" - "@babel/types" "^7.7.0" - -"@babel/helper-create-regexp-features-plugin@^7.7.0": - version "7.7.2" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.2.tgz#6f20443778c8fce2af2ff4206284afc0ced65db6" - integrity sha512-pAil/ZixjTlrzNpjx+l/C/wJk002Wo7XbbZ8oujH/AoJ3Juv0iN/UTcPUHXKMFLqsfS0Hy6Aow8M31brUYBlQQ== - dependencies: - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.6.0" - -"@babel/helper-define-map@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.7.0.tgz#60b0e9fd60def9de5054c38afde8c8ee409c7529" - integrity sha512-kPKWPb0dMpZi+ov1hJiwse9dWweZsz3V9rP4KdytnX1E7z3cTNmFGglwklzFPuqIcHLIY3bgKSs4vkwXXdflQA== - dependencies: - "@babel/helper-function-name" "^7.7.0" - "@babel/types" "^7.7.0" - lodash "^4.17.13" - -"@babel/helper-explode-assignable-expression@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.0.tgz#db2a6705555ae1f9f33b4b8212a546bc7f9dc3ef" - integrity sha512-CDs26w2shdD1urNUAji2RJXyBFCaR+iBEGnFz3l7maizMkQe3saVw9WtjG1tz8CwbjvlFnaSLVhgnu1SWaherg== - dependencies: - "@babel/traverse" "^7.7.0" - "@babel/types" "^7.7.0" - -"@babel/helper-function-name@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz#44a5ad151cfff8ed2599c91682dda2ec2c8430a3" - integrity sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q== - dependencies: - "@babel/helper-get-function-arity" "^7.7.0" - "@babel/template" "^7.7.0" - "@babel/types" "^7.7.0" - -"@babel/helper-get-function-arity@^7.0.0", "@babel/helper-get-function-arity@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz#c604886bc97287a1d1398092bc666bc3d7d7aa2d" - integrity sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw== - dependencies: - "@babel/types" "^7.7.0" - -"@babel/helper-hoist-variables@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.0.tgz#b4552e4cfe5577d7de7b183e193e84e4ec538c81" - integrity sha512-LUe/92NqsDAkJjjCEWkNe+/PcpnisvnqdlRe19FahVapa4jndeuJ+FBiTX1rcAKWKcJGE+C3Q3tuEuxkSmCEiQ== - dependencies: - "@babel/types" "^7.7.0" - -"@babel/helper-member-expression-to-functions@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.0.tgz#472b93003a57071f95a541ea6c2b098398bcad8a" - integrity sha512-QaCZLO2RtBcmvO/ekOLp8p7R5X2JriKRizeDpm5ChATAFWrrYDcDxPuCIBXKyBjY+i1vYSdcUTMIb8psfxHDPA== - dependencies: - "@babel/types" "^7.7.0" - -"@babel/helper-module-imports@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.7.0.tgz#99c095889466e5f7b6d66d98dffc58baaf42654d" - integrity sha512-Dv3hLKIC1jyfTkClvyEkYP2OlkzNvWs5+Q8WgPbxM5LMeorons7iPP91JM+DU7tRbhqA1ZeooPaMFvQrn23RHw== - dependencies: - "@babel/types" "^7.7.0" - -"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.7.0.tgz#154a69f0c5b8fd4d39e49750ff7ac4faa3f36786" - integrity sha512-rXEefBuheUYQyX4WjV19tuknrJFwyKw0HgzRwbkyTbB+Dshlq7eqkWbyjzToLrMZk/5wKVKdWFluiAsVkHXvuQ== - dependencies: - "@babel/helper-module-imports" "^7.7.0" - "@babel/helper-simple-access" "^7.7.0" - "@babel/helper-split-export-declaration" "^7.7.0" - "@babel/template" "^7.7.0" - "@babel/types" "^7.7.0" - lodash "^4.17.13" - -"@babel/helper-optimise-call-expression@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.0.tgz#4f66a216116a66164135dc618c5d8b7a959f9365" - integrity sha512-48TeqmbazjNU/65niiiJIJRc5JozB8acui1OS7bSd6PgxfuovWsvjfWSzlgx+gPFdVveNzUdpdIg5l56Pl5jqg== - dependencies: - "@babel/types" "^7.7.0" - -"@babel/helper-plugin-utils@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" - integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== - -"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.5.5.tgz#0aa6824f7100a2e0e89c1527c23936c152cab351" - integrity sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw== - dependencies: - lodash "^4.17.13" - -"@babel/helper-remap-async-to-generator@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.0.tgz#4d69ec653e8bff5bce62f5d33fc1508f223c75a7" - integrity sha512-pHx7RN8X0UNHPB/fnuDnRXVZ316ZigkO8y8D835JlZ2SSdFKb6yH9MIYRU4fy/KPe5sPHDFOPvf8QLdbAGGiyw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.7.0" - "@babel/helper-wrap-function" "^7.7.0" - "@babel/template" "^7.7.0" - "@babel/traverse" "^7.7.0" - "@babel/types" "^7.7.0" - -"@babel/helper-replace-supers@^7.5.5", "@babel/helper-replace-supers@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.7.0.tgz#d5365c8667fe7cbd13b8ddddceb9bd7f2b387512" - integrity sha512-5ALYEul5V8xNdxEeWvRsBzLMxQksT7MaStpxjJf9KsnLxpAKBtfw5NeMKZJSYDa0lKdOcy0g+JT/f5mPSulUgg== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.7.0" - "@babel/helper-optimise-call-expression" "^7.7.0" - "@babel/traverse" "^7.7.0" - "@babel/types" "^7.7.0" - -"@babel/helper-simple-access@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.7.0.tgz#97a8b6c52105d76031b86237dc1852b44837243d" - integrity sha512-AJ7IZD7Eem3zZRuj5JtzFAptBw7pMlS3y8Qv09vaBWoFsle0d1kAn5Wq6Q9MyBXITPOKnxwkZKoAm4bopmv26g== - dependencies: - "@babel/template" "^7.7.0" - "@babel/types" "^7.7.0" - -"@babel/helper-split-export-declaration@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz#1365e74ea6c614deeb56ebffabd71006a0eb2300" - integrity sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA== - dependencies: - "@babel/types" "^7.7.0" - -"@babel/helper-wrap-function@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.7.0.tgz#15af3d3e98f8417a60554acbb6c14e75e0b33b74" - integrity sha512-sd4QjeMgQqzshSjecZjOp8uKfUtnpmCyQhKQrVJBBgeHAB/0FPi33h3AbVlVp07qQtMD4QgYSzaMI7VwncNK/w== - dependencies: - "@babel/helper-function-name" "^7.7.0" - "@babel/template" "^7.7.0" - "@babel/traverse" "^7.7.0" - "@babel/types" "^7.7.0" - -"@babel/helpers@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.7.0.tgz#359bb5ac3b4726f7c1fde0ec75f64b3f4275d60b" - integrity sha512-VnNwL4YOhbejHb7x/b5F39Zdg5vIQpUUNzJwx0ww1EcVRt41bbGRZWhAURrfY32T5zTT3qwNOQFWpn+P0i0a2g== - dependencies: - "@babel/template" "^7.7.0" - "@babel/traverse" "^7.7.0" - "@babel/types" "^7.7.0" - "@babel/highlight@^7.0.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" @@ -236,440 +18,177 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.7.0", "@babel/parser@^7.7.2": - version "7.7.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.3.tgz#5fad457c2529de476a248f75b0f090b3060af043" - integrity sha512-bqv+iCo9i+uLVbI0ILzKkvMorqxouI+GbV13ivcARXn9NNEabi2IEz912IgNpT/60BNXac5dgcfjb94NjsF33A== - -"@babel/plugin-proposal-async-generator-functions@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.0.tgz#83ef2d6044496b4c15d8b4904e2219e6dccc6971" - integrity sha512-ot/EZVvf3mXtZq0Pd0+tSOfGWMizqmOohXmNZg6LNFjHOV+wOPv7BvVYh8oPR8LhpIP3ye8nNooKL50YRWxpYA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.7.0" - "@babel/plugin-syntax-async-generators" "^7.2.0" - -"@babel/plugin-proposal-dynamic-import@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.0.tgz#dc02a8bad8d653fb59daf085516fa416edd2aa7f" - integrity sha512-7poL3Xi+QFPC7sGAzEIbXUyYzGJwbc2+gSD0AkiC5k52kH2cqHdqxm5hNFfLW3cRSTcx9bN0Fl7/6zWcLLnKAQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-dynamic-import" "^7.2.0" - -"@babel/plugin-proposal-json-strings@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" - integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-json-strings" "^7.2.0" - -"@babel/plugin-proposal-object-rest-spread@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz#8ffccc8f3a6545e9f78988b6bf4fe881b88e8096" - integrity sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - -"@babel/plugin-proposal-optional-catch-binding@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" - integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" - -"@babel/plugin-proposal-unicode-property-regex@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.0.tgz#549fe1717a1bd0a2a7e63163841cb37e78179d5d" - integrity sha512-mk34H+hp7kRBWJOOAR0ZMGCydgKMD4iN9TpDRp3IIcbunltxEY89XSimc6WbtSLCDrwcdy/EEw7h5CFCzxTchw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-async-generators@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" - integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-dynamic-import@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" - integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-json-strings@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" - integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-object-rest-spread@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" - integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" - integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-top-level-await@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.0.tgz#f5699549f50bbe8d12b1843a4e82f0a37bb65f4d" - integrity sha512-hi8FUNiFIY1fnUI2n1ViB1DR0R4QeK4iHcTlW6aJkrPoTdb8Rf1EMQ6GT3f67DDkYyWgew9DFoOZ6gOoEsdzTA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-arrow-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" - integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-async-to-generator@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.0.tgz#e2b84f11952cf5913fe3438b7d2585042772f492" - integrity sha512-vLI2EFLVvRBL3d8roAMqtVY0Bm9C1QzLkdS57hiKrjUBSqsQYrBsMCeOg/0KK7B0eK9V71J5mWcha9yyoI2tZw== - dependencies: - "@babel/helper-module-imports" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.7.0" - -"@babel/plugin-transform-block-scoped-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" - integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-block-scoping@^7.6.3": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.3.tgz#6e854e51fbbaa84351b15d4ddafe342f3a5d542a" - integrity sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - lodash "^4.17.13" - -"@babel/plugin-transform-classes@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.0.tgz#b411ecc1b8822d24b81e5d184f24149136eddd4a" - integrity sha512-/b3cKIZwGeUesZheU9jNYcwrEA7f/Bo4IdPmvp7oHgvks2majB5BoT5byAql44fiNQYOPzhk2w8DbgfuafkMoA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.7.0" - "@babel/helper-define-map" "^7.7.0" - "@babel/helper-function-name" "^7.7.0" - "@babel/helper-optimise-call-expression" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.7.0" - "@babel/helper-split-export-declaration" "^7.7.0" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" - integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== +"@commitlint/cli@^8.2.0": + version "8.2.0" + resolved "https://registry.npm.taobao.org/@commitlint/cli/download/@commitlint/cli-8.2.0.tgz#fbf9969e04e2162d985eaa644fdad6ce807aadb6" + integrity sha1-+/mWngTiFi2YXqpkT9rWzoB6rbY= dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-destructuring@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz#44bbe08b57f4480094d57d9ffbcd96d309075ba6" - integrity sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-dotall-regex@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.0.tgz#c5c9ecacab3a5e0c11db6981610f0c32fd698b3b" - integrity sha512-3QQlF7hSBnSuM1hQ0pS3pmAbWLax/uGNCbPBND9y+oJ4Y776jsyujG2k0Sn2Aj2a0QwVOiOFL5QVPA7spjvzSA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-duplicate-keys@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz#c5dbf5106bf84cdf691222c0974c12b1df931853" - integrity sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-exponentiation-operator@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" - integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-for-of@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556" - integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-function-name@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.0.tgz#0fa786f1eef52e3b7d4fc02e54b2129de8a04c2a" - integrity sha512-P5HKu0d9+CzZxP5jcrWdpe7ZlFDe24bmqP6a6X8BHEBl/eizAsY8K6LX8LASZL0Jxdjm5eEfzp+FIrxCm/p8bA== - dependencies: - "@babel/helper-function-name" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" - integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-member-expression-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" - integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-modules-amd@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz#ef00435d46da0a5961aa728a1d2ecff063e4fb91" - integrity sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg== - dependencies: - "@babel/helper-module-transforms" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - babel-plugin-dynamic-import-node "^2.3.0" - -"@babel/plugin-transform-modules-commonjs@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.0.tgz#3e5ffb4fd8c947feede69cbe24c9554ab4113fe3" - integrity sha512-KEMyWNNWnjOom8vR/1+d+Ocz/mILZG/eyHHO06OuBQ2aNhxT62fr4y6fGOplRx+CxCSp3IFwesL8WdINfY/3kg== - dependencies: - "@babel/helper-module-transforms" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-simple-access" "^7.7.0" - babel-plugin-dynamic-import-node "^2.3.0" - -"@babel/plugin-transform-modules-systemjs@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.0.tgz#9baf471213af9761c1617bb12fd278e629041417" - integrity sha512-ZAuFgYjJzDNv77AjXRqzQGlQl4HdUM6j296ee4fwKVZfhDR9LAGxfvXjBkb06gNETPnN0sLqRm9Gxg4wZH6dXg== - dependencies: - "@babel/helper-hoist-variables" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - babel-plugin-dynamic-import-node "^2.3.0" - -"@babel/plugin-transform-modules-umd@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.0.tgz#d62c7da16670908e1d8c68ca0b5d4c0097b69966" - integrity sha512-u7eBA03zmUswQ9LQ7Qw0/ieC1pcAkbp5OQatbWUzY1PaBccvuJXUkYzoN1g7cqp7dbTu6Dp9bXyalBvD04AANA== - dependencies: - "@babel/helper-module-transforms" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" + "@commitlint/format" "^8.2.0" + "@commitlint/lint" "^8.2.0" + "@commitlint/load" "^8.2.0" + "@commitlint/read" "^8.2.0" + babel-polyfill "6.26.0" + chalk "2.4.2" + get-stdin "7.0.0" + lodash "4.17.14" + meow "5.0.0" + resolve-from "5.0.0" + resolve-global "1.0.0" + +"@commitlint/config-conventional@^8.2.0": + version "8.2.0" + resolved "https://registry.npm.taobao.org/@commitlint/config-conventional/download/@commitlint/config-conventional-8.2.0.tgz#886a5538e3708e017ec2871e0cbce00f635d3102" + integrity sha1-iGpVOONwjgF+woceDLzgD2NdMQI= + +"@commitlint/ensure@^8.2.0": + version "8.2.0" + resolved "https://registry.npm.taobao.org/@commitlint/ensure/download/@commitlint/ensure-8.2.0.tgz#fad0c81c3d3bd09aa5fbcbcc483ae1f39bc8af8f" + integrity sha1-+tDIHD070Jql+8vMSDrh85vIr48= + dependencies: + lodash "4.17.14" + +"@commitlint/execute-rule@^8.2.0": + version "8.2.0" + resolved "https://registry.npm.taobao.org/@commitlint/execute-rule/download/@commitlint/execute-rule-8.2.0.tgz#aefb3744e22613660adefb7ebcccaa60bd24e78d" + integrity sha1-rvs3ROImE2YK3vt+vMyqYL0k540= + +"@commitlint/format@^8.2.0": + version "8.2.0" + resolved "https://registry.npm.taobao.org/@commitlint/format/download/@commitlint/format-8.2.0.tgz#0a2447fadac7c0421ce8a8d7e27dfa2172c737d4" + integrity sha1-CiRH+trHwEIc6KjX4n36IXLHN9Q= + dependencies: + chalk "^2.0.1" + +"@commitlint/is-ignored@^8.2.0": + version "8.2.0" + resolved "https://registry.npm.taobao.org/@commitlint/is-ignored/download/@commitlint/is-ignored-8.2.0.tgz#b6409ab28bf5a80f25e14da17da3916adb230a89" + integrity sha1-tkCasov1qA8l4U2hfaORatsjCok= + dependencies: + "@types/semver" "^6.0.1" + semver "6.2.0" + +"@commitlint/lint@^8.2.0": + version "8.2.0" + resolved "https://registry.npm.taobao.org/@commitlint/lint/download/@commitlint/lint-8.2.0.tgz#aadc606379f3550eb877f16d4f5b103639cbf92a" + integrity sha1-qtxgY3nzVQ64d/FtT1sQNjnL+So= + dependencies: + "@commitlint/is-ignored" "^8.2.0" + "@commitlint/parse" "^8.2.0" + "@commitlint/rules" "^8.2.0" + babel-runtime "^6.23.0" + lodash "4.17.14" + +"@commitlint/load@^8.2.0": + version "8.2.0" + resolved "https://registry.npm.taobao.org/@commitlint/load/download/@commitlint/load-8.2.0.tgz#9ca53a0c795e4f63d796b4d42279e856549add1a" + integrity sha1-nKU6DHleT2PXlrTUInnoVlSa3Ro= + dependencies: + "@commitlint/execute-rule" "^8.2.0" + "@commitlint/resolve-extends" "^8.2.0" + babel-runtime "^6.23.0" + chalk "2.4.2" + cosmiconfig "^5.2.0" + lodash "4.17.14" + resolve-from "^5.0.0" + +"@commitlint/message@^8.2.0": + version "8.2.0" + resolved "https://registry.npm.taobao.org/@commitlint/message/download/@commitlint/message-8.2.0.tgz#bdc0388183f6bc6006c7e7e197a721683011907a" + integrity sha1-vcA4gYP2vGAGx+fhl6chaDARkHo= + +"@commitlint/parse@^8.2.0": + version "8.2.0" + resolved "https://registry.npm.taobao.org/@commitlint/parse/download/@commitlint/parse-8.2.0.tgz#de80137e89ee5a2d3029656c9b33e90c88c6f56c" + integrity sha1-3oATfonuWi0wKWVsmzPpDIjG9Ww= + dependencies: + conventional-changelog-angular "^1.3.3" + conventional-commits-parser "^2.1.0" + lodash "^4.17.11" -"@babel/plugin-transform-named-capturing-groups-regex@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.0.tgz#358e6fd869b9a4d8f5cbc79e4ed4fc340e60dcaf" - integrity sha512-+SicSJoKouPctL+j1pqktRVCgy+xAch1hWWTMy13j0IflnyNjaoskj+DwRQFimHbLqO3sq2oN2CXMvXq3Bgapg== +"@commitlint/read@^8.2.0": + version "8.2.0" + resolved "https://registry.npm.taobao.org/@commitlint/read/download/@commitlint/read-8.2.0.tgz#54c6549723d532c74434ee0d74e0459032dc9159" + integrity sha1-VMZUlyPVMsdENO4NdOBFkDLckVk= + dependencies: + "@commitlint/top-level" "^8.2.0" + "@marionebl/sander" "^0.6.0" + babel-runtime "^6.23.0" + git-raw-commits "^1.3.0" + +"@commitlint/resolve-extends@^8.2.0": + version "8.2.0" + resolved "https://registry.npm.taobao.org/@commitlint/resolve-extends/download/@commitlint/resolve-extends-8.2.0.tgz#b7f2f0c71c10f24b98a199ed11d2c14cfd7a318f" + integrity sha1-t/LwxxwQ8kuYoZntEdLBTP16MY8= + dependencies: + "@types/node" "^12.0.2" + import-fresh "^3.0.0" + lodash "4.17.14" + resolve-from "^5.0.0" + resolve-global "^1.0.0" + +"@commitlint/rules@^8.2.0": + version "8.2.0" + resolved "https://registry.npm.taobao.org/@commitlint/rules/download/@commitlint/rules-8.2.0.tgz#4cd6a323ca1a3f3d33ae6dc723f8c88f3dcde347" + integrity sha1-TNajI8oaPz0zrm3HI/jIjz3N40c= + dependencies: + "@commitlint/ensure" "^8.2.0" + "@commitlint/message" "^8.2.0" + "@commitlint/to-lines" "^8.2.0" + babel-runtime "^6.23.0" + +"@commitlint/to-lines@^8.2.0": + version "8.2.0" + resolved "https://registry.npm.taobao.org/@commitlint/to-lines/download/@commitlint/to-lines-8.2.0.tgz#dddb5916a457e1a79e437115a9b8eac7bf9ad52a" + integrity sha1-3dtZFqRX4aeeQ3EVqbjqx7+a1So= + +"@commitlint/top-level@^8.2.0": + version "8.2.0" + resolved "https://registry.npm.taobao.org/@commitlint/top-level/download/@commitlint/top-level-8.2.0.tgz#206e7cbc54dbe9494190677f887dd60943fed5b0" + integrity sha1-IG58vFTb6UlBkGd/iH3WCUP+1bA= + dependencies: + find-up "^4.0.0" + +"@marionebl/sander@^0.6.0": + version "0.6.1" + resolved "https://registry.npm.taobao.org/@marionebl/sander/download/@marionebl/sander-0.6.1.tgz#1958965874f24bc51be48875feb50d642fc41f7b" + integrity sha1-GViWWHTyS8Ub5Ih1/rUNZC/EH3s= dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.7.0" + graceful-fs "^4.1.3" + mkdirp "^0.5.1" + rimraf "^2.5.2" -"@babel/plugin-transform-new-target@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5" - integrity sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA== +"@nodelib/fs.scandir@2.1.3": + version "2.1.3" + resolved "https://registry.npm.taobao.org/@nodelib/fs.scandir/download/@nodelib/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" + integrity sha1-Olgr21OATGum0UZXnEblITDPSjs= dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@nodelib/fs.stat" "2.0.3" + run-parallel "^1.1.9" -"@babel/plugin-transform-object-super@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz#c70021df834073c65eb613b8679cc4a381d1a9f9" - integrity sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.5.5" - -"@babel/plugin-transform-parameters@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16" - integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw== - dependencies: - "@babel/helper-call-delegate" "^7.4.4" - "@babel/helper-get-function-arity" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-property-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" - integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-regenerator@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.0.tgz#f1b20b535e7716b622c99e989259d7dd942dd9cc" - integrity sha512-AXmvnC+0wuj/cFkkS/HFHIojxH3ffSXE+ttulrqWjZZRaUOonfJc60e1wSNT4rV8tIunvu/R3wCp71/tLAa9xg== - dependencies: - regenerator-transform "^0.14.0" - -"@babel/plugin-transform-reserved-words@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" - integrity sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-shorthand-properties@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" - integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-spread@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz#fc77cf798b24b10c46e1b51b1b88c2bf661bb8dd" - integrity sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-sticky-regex@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" - integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" - -"@babel/plugin-transform-template-literals@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0" - integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g== - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-typeof-symbol@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" - integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-unicode-regex@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.0.tgz#743d9bcc44080e3cc7d49259a066efa30f9187a3" - integrity sha512-RrThb0gdrNwFAqEAAx9OWgtx6ICK69x7i9tCnMdVrxQwSDp/Abu9DXFU5Hh16VP33Rmxh04+NGW28NsIkFvFKA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/preset-env@^7.7.1": - version "7.7.1" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.7.1.tgz#04a2ff53552c5885cf1083e291c8dd5490f744bb" - integrity sha512-/93SWhi3PxcVTDpSqC+Dp4YxUu3qZ4m7I76k0w73wYfn7bGVuRIO4QUz95aJksbS+AD1/mT1Ie7rbkT0wSplaA== - dependencies: - "@babel/helper-module-imports" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-async-generator-functions" "^7.7.0" - "@babel/plugin-proposal-dynamic-import" "^7.7.0" - "@babel/plugin-proposal-json-strings" "^7.2.0" - "@babel/plugin-proposal-object-rest-spread" "^7.6.2" - "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.7.0" - "@babel/plugin-syntax-async-generators" "^7.2.0" - "@babel/plugin-syntax-dynamic-import" "^7.2.0" - "@babel/plugin-syntax-json-strings" "^7.2.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" - "@babel/plugin-syntax-top-level-await" "^7.7.0" - "@babel/plugin-transform-arrow-functions" "^7.2.0" - "@babel/plugin-transform-async-to-generator" "^7.7.0" - "@babel/plugin-transform-block-scoped-functions" "^7.2.0" - "@babel/plugin-transform-block-scoping" "^7.6.3" - "@babel/plugin-transform-classes" "^7.7.0" - "@babel/plugin-transform-computed-properties" "^7.2.0" - "@babel/plugin-transform-destructuring" "^7.6.0" - "@babel/plugin-transform-dotall-regex" "^7.7.0" - "@babel/plugin-transform-duplicate-keys" "^7.5.0" - "@babel/plugin-transform-exponentiation-operator" "^7.2.0" - "@babel/plugin-transform-for-of" "^7.4.4" - "@babel/plugin-transform-function-name" "^7.7.0" - "@babel/plugin-transform-literals" "^7.2.0" - "@babel/plugin-transform-member-expression-literals" "^7.2.0" - "@babel/plugin-transform-modules-amd" "^7.5.0" - "@babel/plugin-transform-modules-commonjs" "^7.7.0" - "@babel/plugin-transform-modules-systemjs" "^7.7.0" - "@babel/plugin-transform-modules-umd" "^7.7.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.7.0" - "@babel/plugin-transform-new-target" "^7.4.4" - "@babel/plugin-transform-object-super" "^7.5.5" - "@babel/plugin-transform-parameters" "^7.4.4" - "@babel/plugin-transform-property-literals" "^7.2.0" - "@babel/plugin-transform-regenerator" "^7.7.0" - "@babel/plugin-transform-reserved-words" "^7.2.0" - "@babel/plugin-transform-shorthand-properties" "^7.2.0" - "@babel/plugin-transform-spread" "^7.6.2" - "@babel/plugin-transform-sticky-regex" "^7.2.0" - "@babel/plugin-transform-template-literals" "^7.4.4" - "@babel/plugin-transform-typeof-symbol" "^7.2.0" - "@babel/plugin-transform-unicode-regex" "^7.7.0" - "@babel/types" "^7.7.1" - browserslist "^4.6.0" - core-js-compat "^3.1.1" - invariant "^2.2.2" - js-levenshtein "^1.1.3" - semver "^5.5.0" +"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": + version "2.0.3" + resolved "https://registry.npm.taobao.org/@nodelib/fs.stat/download/@nodelib/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" + integrity sha1-NNxfTKu8cg9OYPdadH5+zWwXW9M= -"@babel/template@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.0.tgz#4fadc1b8e734d97f56de39c77de76f2562e597d0" - integrity sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ== +"@nodelib/fs.walk@^1.2.3": + version "1.2.4" + resolved "https://registry.npm.taobao.org/@nodelib/fs.walk/download/@nodelib/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" + integrity sha1-ARuSAqcKY2bkNspcBlhEUoqwSXY= dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.7.0" - "@babel/types" "^7.7.0" - -"@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": - version "7.7.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.2.tgz#ef0a65e07a2f3c550967366b3d9b62a2dcbeae09" - integrity sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.7.2" - "@babel/helper-function-name" "^7.7.0" - "@babel/helper-split-export-declaration" "^7.7.0" - "@babel/parser" "^7.7.2" - "@babel/types" "^7.7.2" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" + "@nodelib/fs.scandir" "2.1.3" + fastq "^1.6.0" -"@babel/types@^7.7.0", "@babel/types@^7.7.1", "@babel/types@^7.7.2": - version "7.7.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.2.tgz#550b82e5571dcd174af576e23f0adba7ffc683f7" - integrity sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA== +"@samverschueren/stream-to-observable@^0.3.0": + version "0.3.0" + resolved "https://registry.npm.taobao.org/@samverschueren/stream-to-observable/download/@samverschueren/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" + integrity sha1-7N9I1TLFjqR3rPyrgDSEJPjQZi8= dependencies: - esutils "^2.0.2" - lodash "^4.17.13" - to-fast-properties "^2.0.0" + any-observable "^0.3.0" -"@types/anymatch@*": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a" - integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA== +"@types/eslint-visitor-keys@^1.0.0": + version "1.0.0" + resolved "https://registry.npm.taobao.org/@types/eslint-visitor-keys/download/@types/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" + integrity sha1-HuMNeVRMqE1o1LPNsK9PIFZj3S0= "@types/events@*": version "3.0.0" @@ -685,6 +204,11 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/json-schema@^7.0.3": + version "7.0.4" + resolved "https://registry.npm.taobao.org/@types/json-schema/download/@types/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" + integrity sha1-OP1z3f2bVaux4bLtV4y1W9e30zk= + "@types/minimatch@*": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" @@ -695,43 +219,63 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.2.tgz#c4e63af5e8823ce9cc3f0b34f7b998c2171f0c44" integrity sha512-dyYO+f6ihZEtNPDcWNR1fkoTDf3zAK3lAABDze3mz6POyIercH0lEUawUFXlG8xaQZmm1yEBON/4TsYv/laDYg== -"@types/source-list-map@*": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" - integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== - -"@types/tapable@*": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.4.tgz#b4ffc7dc97b498c969b360a41eee247f82616370" - integrity sha512-78AdXtlhpCHT0K3EytMpn4JNxaf5tbqbLcbIRoQIHzpTIyjpxLQKRoxU55ujBXAtg3Nl2h/XWvfDa9dsMOd0pQ== - -"@types/uglify-js@*": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.0.4.tgz#96beae23df6f561862a830b4288a49e86baac082" - integrity sha512-SudIN9TRJ+v8g5pTG8RRCqfqTMNqgWCKKd3vtynhGzkIIjxaicNAMuY5TRadJ6tzDu3Dotf3ngaMILtmOdmWEQ== - dependencies: - source-map "^0.6.1" - -"@types/webpack-sources@*": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.5.tgz#be47c10f783d3d6efe1471ff7f042611bd464a92" - integrity sha512-zfvjpp7jiafSmrzJ2/i3LqOyTYTuJ7u1KOXlKgDlvsj9Rr0x7ZiYu5lZbXwobL7lmsRNtPXlBfmaUD8eU2Hu8w== - dependencies: - "@types/node" "*" - "@types/source-list-map" "*" - source-map "^0.6.1" +"@types/node@^12.0.2": + version "12.12.22" + resolved "https://registry.npm.taobao.org/@types/node/download/@types/node-12.12.22.tgz#b8d9eae3328b96910a373cf06ac8d3c5abe9c200" + integrity sha1-uNnq4zKLlpEKNzzwasjTxavpwgA= -"@types/webpack@^4.4.19": - version "4.39.1" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.39.1.tgz#d76cd551cc851198f67f75ff3e26551d204530e9" - integrity sha512-rgO9ihNu/l72Sjx3shqwc9r6gi+tOMsqxhMEZhOEVIZt82GFOeUyEdpTk1BO2HqEHLS/XJW8ldUTIIfIMMyYFQ== +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.npm.taobao.org/@types/normalize-package-data/download/@types/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha1-5IbQ2XOW15vu3QpuM/RTT/a0lz4= + +"@types/semver@^6.0.1": + version "6.2.0" + resolved "https://registry.npm.taobao.org/@types/semver/download/@types/semver-6.2.0.tgz#d688d574400d96c5b0114968705366f431831e1a" + integrity sha1-1ojVdEANlsWwEUlocFNm9DGDHho= + +"@typescript-eslint/eslint-plugin@^2.13.0": + version "2.13.0" + resolved "https://registry.npm.taobao.org/@typescript-eslint/eslint-plugin/download/@typescript-eslint/eslint-plugin-2.13.0.tgz#57e933fe16a2fc66dbac059af0d6d85d921d748e" + integrity sha1-V+kz/hai/GbbrAWa8NbYXZIddI4= + dependencies: + "@typescript-eslint/experimental-utils" "2.13.0" + eslint-utils "^1.4.3" + functional-red-black-tree "^1.0.1" + regexpp "^3.0.0" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@2.13.0": + version "2.13.0" + resolved "https://registry.npm.taobao.org/@typescript-eslint/experimental-utils/download/@typescript-eslint/experimental-utils-2.13.0.tgz#958614faa6f77599ee2b241740e0ea402482533d" + integrity sha1-lYYU+qb3dZnuKyQXQODqQCSCUz0= + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "2.13.0" + eslint-scope "^5.0.0" + +"@typescript-eslint/parser@^2.13.0": + version "2.13.0" + resolved "https://registry.npm.taobao.org/@typescript-eslint/parser/download/@typescript-eslint/parser-2.13.0.tgz#ea1ab394cf9ca17467e3da7f96eca9309f57c326" + integrity sha1-6hqzlM+coXRn49p/luypMJ9XwyY= + dependencies: + "@types/eslint-visitor-keys" "^1.0.0" + "@typescript-eslint/experimental-utils" "2.13.0" + "@typescript-eslint/typescript-estree" "2.13.0" + eslint-visitor-keys "^1.1.0" + +"@typescript-eslint/typescript-estree@2.13.0": + version "2.13.0" + resolved "https://registry.npm.taobao.org/@typescript-eslint/typescript-estree/download/@typescript-eslint/typescript-estree-2.13.0.tgz#a2e746867da772c857c13853219fced10d2566bc" + integrity sha1-oudGhn2ncshXwThTIZ/O0Q0lZrw= dependencies: - "@types/anymatch" "*" - "@types/node" "*" - "@types/tapable" "*" - "@types/uglify-js" "*" - "@types/webpack-sources" "*" - source-map "^0.6.0" + debug "^4.1.1" + eslint-visitor-keys "^1.1.0" + glob "^7.1.6" + is-glob "^4.0.1" + lodash.unescape "4.0.1" + semver "^6.3.0" + tsutils "^3.17.1" "@webassemblyjs/ast@1.8.5": version "1.8.5" @@ -889,6 +433,14 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +JSONStream@^1.0.4: + version "1.3.5" + resolved "https://registry.npm.taobao.org/JSONStream/download/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha1-MgjB8I06TZkmGrZPkjArwV4RHKA= + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -902,11 +454,29 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: mime-types "~2.1.24" negotiator "0.6.2" +acorn-jsx@^5.1.0: + version "5.1.0" + resolved "https://registry.npm.taobao.org/acorn-jsx/download/acorn-jsx-5.1.0.tgz?cache=0&sync_timestamp=1570993493871&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Facorn-jsx%2Fdownload%2Facorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" + integrity sha1-KUrbcbVzmLBoABXwo4xWPuHbU4Q= + acorn@^6.2.1: version "6.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e" integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA== +acorn@^7.1.0: + version "7.1.0" + resolved "https://registry.npm.taobao.org/acorn/download/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" + integrity sha1-lJ028sKSU12mAig1hsJHfFfrLWw= + +aggregate-error@^3.0.0: + version "3.0.1" + resolved "https://registry.npm.taobao.org/aggregate-error/download/aggregate-error-3.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Faggregate-error%2Fdownload%2Faggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" + integrity sha1-2y/nJG5Tb0DZtUQqOeEX191qJOA= + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" @@ -917,7 +487,7 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== -ajv@^6.1.0, ajv@^6.10.2: +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2: version "6.10.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== @@ -932,6 +502,18 @@ ansi-colors@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== +ansi-escapes@^3.0.0: + version "3.2.0" + resolved "https://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha1-h4C5j/nb9WOBUtHx/lwde0RCl2s= + +ansi-escapes@^4.2.1: + version "4.3.0" + resolved "https://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-4.3.0.tgz#a4ce2b33d6b214b7950d8595c212f12ac9cc569d" + integrity sha1-pM4rM9ayFLeVDYWVwhLxKsnMVp0= + dependencies: + type-fest "^0.8.1" + ansi-html@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" @@ -952,6 +534,11 @@ ansi-regex@^4.1.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha1-OIU59VF5vzkznIGvMKZU1p+Hy3U= + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -964,6 +551,11 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" +any-observable@^0.3.0: + version "0.3.0" + resolved "https://registry.npm.taobao.org/any-observable/download/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" + integrity sha1-r5M0deWAamfQ198JDdXovvZdEZs= + anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -985,6 +577,13 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE= + dependencies: + sprintf-js "~1.0.2" + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" @@ -1000,6 +599,11 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.npm.taobao.org/array-find-index/download/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -1010,6 +614,20 @@ array-flatten@^2.1.0: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== +array-ify@^1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/array-ify/download/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" + integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= + +array-includes@^3.0.3: + version "3.1.1" + resolved "https://registry.npm.taobao.org/array-includes/download/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" + integrity sha1-zdZ+aFK9+cEhVGB4ZzIlXtJFk0g= + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0" + is-string "^1.0.5" + array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -1017,6 +635,11 @@ array-union@^1.0.1: dependencies: array-uniq "^1.0.1" +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npm.taobao.org/array-union/download/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha1-t5hCCtvrHego2ErNii4j0+/oXo0= + array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" @@ -1027,6 +650,19 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +array.prototype.flat@^1.2.1: + version "1.2.3" + resolved "https://registry.npm.taobao.org/array.prototype.flat/download/array.prototype.flat-1.2.3.tgz?cache=0&sync_timestamp=1576196704364&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Farray.prototype.flat%2Fdownload%2Farray.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" + integrity sha1-DegrQmsDGNv9uUAInjiwQ9N/bHs= + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.npm.taobao.org/arrify/download/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + asn1.js@^4.0.0: version "4.10.1" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" @@ -1049,6 +685,11 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/astral-regex/download/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha1-bIw/uCfdQ+45GPJ7gngqt2WKb9k= + async-each@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" @@ -1071,74 +712,16 @@ atob@^2.1.1: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -babel-code-frame@^6.26.0: +babel-polyfill@6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= + resolved "https://registry.npm.taobao.org/babel-polyfill/download/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" + integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-loader@^8.0.6: - version "8.0.6" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb" - integrity sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw== - dependencies: - find-cache-dir "^2.0.0" - loader-utils "^1.0.2" - mkdirp "^0.5.1" - pify "^4.0.1" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-dynamic-import-node@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" - integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== - dependencies: - object.assign "^4.1.0" - -babel-plugin-syntax-class-properties@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" - integrity sha1-1+sjt5oxf4VDlixQW4J8fWysJ94= - -babel-plugin-transform-class-properties@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" - integrity sha1-anl2PqYdM9NvN7YRqp3vgagbRqw= - dependencies: - babel-helper-function-name "^6.24.1" - babel-plugin-syntax-class-properties "^6.8.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" + babel-runtime "^6.26.0" + core-js "^2.5.0" + regenerator-runtime "^0.10.5" -babel-runtime@^6.22.0, babel-runtime@^6.26.0: +babel-runtime@^6.23.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= @@ -1146,47 +729,6 @@ babel-runtime@^6.22.0, babel-runtime@^6.26.0: core-js "^2.4.0" regenerator-runtime "^0.11.0" -babel-template@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.24.1, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== - balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -1297,6 +839,13 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" +braces@^3.0.1: + version "3.0.2" + resolved "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha1-NFThpGLujVmeI23zNs2epPiv4Qc= + dependencies: + fill-range "^7.0.1" + brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" @@ -1361,15 +910,6 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.6.0, browserslist@^4.7.2: - version "4.7.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.2.tgz#1bb984531a476b5d389cedecb195b2cd69fb1348" - integrity sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw== - dependencies: - caniuse-lite "^1.0.30001004" - electron-to-chromium "^1.3.295" - node-releases "^1.1.38" - buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -1445,6 +985,30 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/caller-callsite/download/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/caller-path/download/caller-path-2.0.0.tgz?cache=0&sync_timestamp=1574395542397&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcaller-path%2Fdownload%2Fcaller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/callsites/download/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npm.taobao.org/callsites/download/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M= + camel-case@3.0.x: version "3.0.0" resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" @@ -1453,17 +1017,26 @@ camel-case@3.0.x: no-case "^2.2.0" upper-case "^1.1.1" +camelcase-keys@^4.0.0: + version "4.2.0" + resolved "https://registry.npm.taobao.org/camelcase-keys/download/camelcase-keys-4.2.0.tgz?cache=0&sync_timestamp=1573242102106&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamelcase-keys%2Fdownload%2Fcamelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" + integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= + dependencies: + camelcase "^4.1.0" + map-obj "^2.0.0" + quick-lru "^1.0.0" + +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.npm.taobao.org/camelcase/download/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30001004: - version "1.0.30001010" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001010.tgz#397a14034d384260453cc81994f494626d34b938" - integrity sha512-RA5GH9YjFNea4ZQszdWgh2SC+dpLiRAg4VDQS2b5JRI45OxmbGrYocYHTa9x0bKMQUE7uvHkNPNffUr+pCxSGw== - -chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.2: +chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1472,7 +1045,7 @@ chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^1.1.3: +chalk@^1.0.0, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= @@ -1483,6 +1056,11 @@ chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.npm.taobao.org/chardet/download/chardet-0.7.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchardet%2Fdownload%2Fchardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha1-kAlISfCTfy7twkJdDSip5fDLrZ4= + chokidar@^2.0.2, chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" @@ -1514,6 +1092,11 @@ chrome-trace-event@^1.0.2: dependencies: tslib "^1.9.0" +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/ci-info/download/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha1-Z6npZL4xpR4V5QENWObxKDQAL0Y= + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -1539,6 +1122,38 @@ clean-css@4.2.x: dependencies: source-map "~0.6.0" +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.npm.taobao.org/clean-stack/download/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha1-7oRy27Ep5yezHooQpCfe6d/kAIs= + +cli-cursor@^2.0.0, cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.npm.taobao.org/cli-cursor/download/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npm.taobao.org/cli-cursor/download/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha1-JkMFp65JDR0Dvwybp8kl0XU68wc= + dependencies: + restore-cursor "^3.1.0" + +cli-truncate@^0.2.1: + version "0.2.1" + resolved "https://registry.npm.taobao.org/cli-truncate/download/cli-truncate-0.2.1.tgz?cache=0&sync_timestamp=1575618577964&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcli-truncate%2Fdownload%2Fcli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" + integrity sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ= + dependencies: + slice-ansi "0.0.4" + string-width "^1.0.1" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.npm.taobao.org/cli-width/download/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + cliui@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" @@ -1592,11 +1207,6 @@ commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== -commander@^2.8.1: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - commander@~2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" @@ -1607,6 +1217,14 @@ commondir@^1.0.1: resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= +compare-func@^1.3.1: + version "1.3.2" + resolved "https://registry.npm.taobao.org/compare-func/download/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648" + integrity sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg= + dependencies: + array-ify "^1.0.0" + dot-prop "^3.0.0" + component-emitter@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" @@ -1669,6 +1287,11 @@ constants-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.npm.taobao.org/contains-path/download/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= + content-disposition@0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" @@ -1681,12 +1304,26 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -convert-source-map@^1.1.0, convert-source-map@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" +conventional-changelog-angular@^1.3.3: + version "1.6.6" + resolved "https://registry.npm.taobao.org/conventional-changelog-angular/download/conventional-changelog-angular-1.6.6.tgz#b27f2b315c16d0a1f23eb181309d0e6a4698ea0f" + integrity sha1-sn8rMVwW0KHyPrGBMJ0OakaY6g8= + dependencies: + compare-func "^1.3.1" + q "^1.5.1" + +conventional-commits-parser@^2.1.0: + version "2.1.7" + resolved "https://registry.npm.taobao.org/conventional-commits-parser/download/conventional-commits-parser-2.1.7.tgz#eca45ed6140d72ba9722ee4132674d639e644e8e" + integrity sha1-7KRe1hQNcrqXIu5BMmdNY55kTo4= + dependencies: + JSONStream "^1.0.4" + is-text-path "^1.0.0" + lodash "^4.2.1" + meow "^4.0.0" + split2 "^2.0.0" + through2 "^2.0.0" + trim-off-newlines "^1.0.0" cookie-signature@1.0.6: version "1.0.6" @@ -1715,24 +1352,31 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js-compat@^3.1.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.4.1.tgz#e12c5a3ef9fcb50fd9d9a32805bfe674f9139246" - integrity sha512-YdeJI26gLc0CQJ9asLE5obEgBz2I0+CIgnoTbS2T0d5IPQw/OCgCIFR527RmpduxjrB3gSEHoGOCTq9sigOyfw== - dependencies: - browserslist "^4.7.2" - semver "^6.3.0" - core-js@^2.4.0: version "2.6.9" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A== +core-js@^2.5.0: + version "2.6.11" + resolved "https://registry.npm.taobao.org/core-js/download/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" + integrity sha1-OIMUafmSK97Y7iHJ3EaYXgOZMIw= + core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +cosmiconfig@^5.2.0, cosmiconfig@^5.2.1: + version "5.2.1" + resolved "https://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha1-BA9yaAnFked6F8CjYmykW08Wixo= + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + create-ecdh@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" @@ -1764,7 +1408,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" -cross-spawn@6.0.5, cross-spawn@^6.0.0: +cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -1775,6 +1419,15 @@ cross-spawn@6.0.5, cross-spawn@^6.0.0: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^7.0.0: + version "7.0.1" + resolved "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" + integrity sha1-CrVihuD3wk4VPQTMKqAn5DqaXRQ= + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + crypto-browserify@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" @@ -1830,17 +1483,36 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.npm.taobao.org/currently-unhandled/download/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + dependencies: + array-find-index "^1.0.1" + cyclist@~0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= +dargs@^4.0.1: + version "4.1.0" + resolved "https://registry.npm.taobao.org/dargs/download/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17" + integrity sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc= + dependencies: + number-is-nan "^1.0.0" + +date-fns@^1.27.2: + version "1.30.1" + resolved "https://registry.npm.taobao.org/date-fns/download/date-fns-1.30.1.tgz?cache=0&sync_timestamp=1574404262163&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdate-fns%2Fdownload%2Fdate-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" + integrity sha1-LnG/CxGRU9u0zE6I2epaz7UNwFw= + date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -1854,14 +1526,22 @@ debug@^3.0.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6: dependencies: ms "^2.1.1" -debug@^4.1.0, debug@^4.1.1: +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== dependencies: ms "^2.1.1" -decamelize@^1.2.0: +decamelize-keys@^1.0.0: + version "1.1.0" + resolved "https://registry.npm.taobao.org/decamelize-keys/download/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" + integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -1871,6 +1551,11 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.npm.taobao.org/dedent/download/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + deep-equal@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.0.tgz#3103cdf8ab6d32cf4a8df7865458f2b8d33f3745" @@ -1888,6 +1573,11 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.npm.taobao.org/deep-is/download/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + default-gateway@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" @@ -1896,7 +1586,7 @@ default-gateway@^4.2.0: execa "^1.0.0" ip-regex "^2.1.0" -define-properties@^1.1.2: +define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== @@ -1938,6 +1628,20 @@ del@^4.1.1: pify "^4.0.1" rimraf "^2.6.3" +del@^5.0.0: + version "5.1.0" + resolved "https://registry.npm.taobao.org/del/download/del-5.1.0.tgz#d9487c94e367410e6eff2925ee58c0c84a75b3a7" + integrity sha1-2Uh8lONnQQ5u/ykl7ljAyEp1s6c= + dependencies: + globby "^10.0.1" + graceful-fs "^4.2.2" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.1" + p-map "^3.0.0" + rimraf "^3.0.0" + slash "^3.0.0" + delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" @@ -1985,6 +1689,13 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npm.taobao.org/dir-glob/download/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha1-Vtv3PZkqSpO6FYT0U0Bj/S5BcX8= + dependencies: + path-type "^4.0.0" + dns-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" @@ -2005,6 +1716,21 @@ dns-txt@^2.0.2: dependencies: buffer-indexof "^1.0.0" +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.npm.taobao.org/doctrine/download/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npm.taobao.org/doctrine/download/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha1-rd6+rXKmV023g2OdyHoSF3OXOWE= + dependencies: + esutils "^2.0.2" + dom-converter@^0.2: version "0.2.0" resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" @@ -2058,6 +1784,13 @@ domutils@^1.5.1: dom-serializer "0" domelementtype "1" +dot-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.npm.taobao.org/dot-prop/download/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" + integrity sha1-G3CK8JSknJoOfbyteQq6U52sEXc= + dependencies: + is-obj "^1.0.0" + duplexify@^3.4.2, duplexify@^3.6.0: version "3.7.1" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" @@ -2073,10 +1806,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.295: - version "1.3.306" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz#e8265301d053d5f74e36cb876486830261fbe946" - integrity sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A== +elegant-spinner@^1.0.1: + version "1.0.1" + resolved "https://registry.npm.taobao.org/elegant-spinner/download/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" + integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= elliptic@^6.0.0: version "6.5.0" @@ -2096,6 +1829,11 @@ emoji-regex@^7.0.1: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc= + emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" @@ -2122,6 +1860,15 @@ enhanced-resolve@4.1.0, enhanced-resolve@^4.1.0: memory-fs "^0.4.0" tapable "^1.0.0" +enhanced-resolve@^4.0.0: + version "4.1.1" + resolved "https://registry.npm.taobao.org/enhanced-resolve/download/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" + integrity sha1-KTfiuAZs0P584JkKmPDXGjUYn2Y= + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + entities@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" @@ -2139,6 +1886,30 @@ errno@^0.1.3, errno@~0.1.7: dependencies: prr "~1.0.1" +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npm.taobao.org/error-ex/download/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha1-tKxAZIEH/c3PriQvQovqihTU8b8= + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.17.0, es-abstract@^1.17.0-next.1: + version "1.17.0" + resolved "https://registry.npm.taobao.org/es-abstract/download/es-abstract-1.17.0.tgz#f42a517d0036a5591dbb2c463591dc8bb50309b1" + integrity sha1-9CpRfQA2pVkduyxGNZHci7UDCbE= + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.1.5" + is-regex "^1.0.5" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimleft "^2.1.1" + string.prototype.trimright "^2.1.1" + es-abstract@^1.5.1: version "1.13.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" @@ -2160,6 +1931,15 @@ es-to-primitive@^1.2.0: is-date-object "^1.0.1" is-symbol "^1.0.2" +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.npm.taobao.org/es-to-primitive/download/es-to-primitive-1.2.1.tgz?cache=0&sync_timestamp=1573280885098&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fes-to-primitive%2Fdownload%2Fes-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo= + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -2170,6 +1950,54 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +eslint-config-prettier@^6.8.0: + version "6.8.0" + resolved "https://registry.npm.taobao.org/eslint-config-prettier/download/eslint-config-prettier-6.8.0.tgz#36bd7559dcef9f97d7596779b38e6a879abb89d3" + integrity sha1-Nr11Wdzvn5fXWWd5s45qh5q7idM= + dependencies: + get-stdin "^6.0.0" + +eslint-import-resolver-node@^0.3.2: + version "0.3.2" + resolved "https://registry.npm.taobao.org/eslint-import-resolver-node/download/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" + integrity sha1-WPFfuDm40FdsqYBBNHaqskcttmo= + dependencies: + debug "^2.6.9" + resolve "^1.5.0" + +eslint-module-utils@^2.4.1: + version "2.5.0" + resolved "https://registry.npm.taobao.org/eslint-module-utils/download/eslint-module-utils-2.5.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-module-utils%2Fdownload%2Feslint-module-utils-2.5.0.tgz#cdf0b40d623032274ccd2abd7e64c4e524d6e19c" + integrity sha1-zfC0DWIwMidMzSq9fmTE5STW4Zw= + dependencies: + debug "^2.6.9" + pkg-dir "^2.0.0" + +eslint-plugin-import@^2.19.1: + version "2.19.1" + resolved "https://registry.npm.taobao.org/eslint-plugin-import/download/eslint-plugin-import-2.19.1.tgz#5654e10b7839d064dd0d46cd1b88ec2133a11448" + integrity sha1-VlThC3g50GTdDUbNG4jsITOhFEg= + dependencies: + array-includes "^3.0.3" + array.prototype.flat "^1.2.1" + contains-path "^0.1.0" + debug "^2.6.9" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.2" + eslint-module-utils "^2.4.1" + has "^1.0.3" + minimatch "^3.0.4" + object.values "^1.1.0" + read-pkg-up "^2.0.0" + resolve "^1.12.0" + +eslint-plugin-prettier@^3.1.2: + version "3.1.2" + resolved "https://registry.npm.taobao.org/eslint-plugin-prettier/download/eslint-plugin-prettier-3.1.2.tgz#432e5a667666ab84ce72f945c72f77d996a5c9ba" + integrity sha1-Qy5aZnZmq4TOcvlFxy932Zalybo= + dependencies: + prettier-linter-helpers "^1.0.0" + eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" @@ -2178,6 +2006,90 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-scope@^5.0.0: + version "5.0.0" + resolved "https://registry.npm.taobao.org/eslint-scope/download/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" + integrity sha1-6HyIh8c+jR7ITxylkWRcNYv8j7k= + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.4.3: + version "1.4.3" + resolved "https://registry.npm.taobao.org/eslint-utils/download/eslint-utils-1.4.3.tgz?cache=0&sync_timestamp=1577351142754&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-utils%2Fdownload%2Feslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha1-dP7HxU0Hdrb2fgJRBAtYBlZOmB8= + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.npm.taobao.org/eslint-visitor-keys/download/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + integrity sha1-4qgs6oT/JGrW+1f5veW0ZiFFnsI= + +eslint@^6.8.0: + version "6.8.0" + resolved "https://registry.npm.taobao.org/eslint/download/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" + integrity sha1-YiYtZylzn5J1cjgkMC+yJ8jJP/s= + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^5.0.0" + eslint-utils "^1.4.3" + eslint-visitor-keys "^1.1.0" + espree "^6.1.2" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^7.0.0" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.14" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.3" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^6.1.2" + strip-ansi "^5.2.0" + strip-json-comments "^3.0.1" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^6.1.2: + version "6.1.2" + resolved "https://registry.npm.taobao.org/espree/download/espree-6.1.2.tgz?cache=0&sync_timestamp=1571625294862&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fespree%2Fdownload%2Fespree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" + integrity sha1-bCcmUJMrT5HDcU5ee19eLs9HJi0= + dependencies: + acorn "^7.1.0" + acorn-jsx "^5.1.0" + eslint-visitor-keys "^1.1.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.npm.taobao.org/esprima/download/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha1-E7BM2z5sXRnfkatph6hpVhmwqnE= + +esquery@^1.0.1: + version "1.0.1" + resolved "https://registry.npm.taobao.org/esquery/download/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + integrity sha1-QGxRZYsfWZGl+bYrHcJbAOPlxwg= + dependencies: + estraverse "^4.0.0" + esrecurse@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" @@ -2185,7 +2097,7 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" -estraverse@^4.1.0, estraverse@^4.1.1: +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== @@ -2238,6 +2150,21 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +execa@^2.0.3: + version "2.1.0" + resolved "https://registry.npm.taobao.org/execa/download/execa-2.1.0.tgz?cache=0&sync_timestamp=1576749101742&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexeca%2Fdownload%2Fexeca-2.1.0.tgz#e5d3ecd837d2a60ec50f3da78fd39767747bbe99" + integrity sha1-5dPs2DfSpg7FDz2nj9OXZ3R7vpk= + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^3.0.0" + onetime "^5.1.0" + p-finally "^2.0.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -2309,6 +2236,15 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.npm.taobao.org/external-editor/download/external-editor-3.1.0.tgz?cache=0&sync_timestamp=1562602323993&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexternal-editor%2Fdownload%2Fexternal-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha1-ywP3QL764D6k0oPK7SdBqD8zVJU= + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -2328,11 +2264,39 @@ fast-deep-equal@^2.0.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.npm.taobao.org/fast-diff/download/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha1-c+4RmC2Gyq95WYKNUZz+kn+sXwM= + +fast-glob@^3.0.3: + version "3.1.1" + resolved "https://registry.npm.taobao.org/fast-glob/download/fast-glob-3.1.1.tgz?cache=0&sync_timestamp=1575197922374&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-glob%2Fdownload%2Ffast-glob-3.1.1.tgz#87ee30e9e9f3eb40d6f254a7997655da753d7c82" + integrity sha1-h+4w6enz60DW8lSnmXZV2nU9fII= + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fastq@^1.6.0: + version "1.6.0" + resolved "https://registry.npm.taobao.org/fastq/download/fastq-1.6.0.tgz#4ec8a38f4ac25f21492673adb7eae9cfef47d1c2" + integrity sha1-Tsijj0rCXyFJJnOtt+rpz+9H0cI= + dependencies: + reusify "^1.0.0" + faye-websocket@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" @@ -2345,12 +2309,49 @@ faye-websocket@~0.11.1: resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== dependencies: - websocket-driver ">=0.5.1" + websocket-driver ">=0.5.1" + +figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + +figures@^1.7.0: + version "1.7.0" + resolved "https://registry.npm.taobao.org/figures/download/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/figures/download/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + +figures@^3.0.0: + version "3.1.0" + resolved "https://registry.npm.taobao.org/figures/download/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec" + integrity sha1-SxmN0H2NcVMGQoZK8tRd2eRZxOw= + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha1-yg9u+m3T1WEzP7FFFQZcL6/fQ5w= + dependencies: + flat-cache "^2.0.1" -figgy-pudding@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" - integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== +file-loader@^5.0.2: + version "5.0.2" + resolved "https://registry.npm.taobao.org/file-loader/download/file-loader-5.0.2.tgz?cache=0&sync_timestamp=1574689264559&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffile-loader%2Fdownload%2Ffile-loader-5.0.2.tgz#7f3d8b4ac85a5e8df61338cfec95d7405f971caa" + integrity sha1-fz2LSshaXo32EzjP7JXXQF+XHKo= + dependencies: + loader-utils "^1.2.3" + schema-utils "^2.5.0" fill-range@^4.0.0: version "4.0.0" @@ -2362,6 +2363,13 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha1-GRmmp8df44ssfHflGYU12prN2kA= + dependencies: + to-regex-range "^5.0.1" + finalhandler@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" @@ -2375,7 +2383,7 @@ finalhandler@~1.1.2: statuses "~1.5.0" unpipe "~1.0.0" -find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: +find-cache-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== @@ -2384,6 +2392,13 @@ find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: make-dir "^2.0.0" pkg-dir "^3.0.0" +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.npm.taobao.org/find-up/download/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -2391,6 +2406,14 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.npm.taobao.org/find-up/download/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk= + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + findup-sync@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" @@ -2401,6 +2424,20 @@ findup-sync@3.0.0: micromatch "^3.0.4" resolve-dir "^1.0.1" +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.npm.taobao.org/flat-cache/download/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha1-XSltbwS9pEpGMKMBQTvbwuwIXsA= + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flatted@^2.0.0: + version "2.0.1" + resolved "https://registry.npm.taobao.org/flatted/download/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" + integrity sha1-aeV8qo8OrLwoHS4stFjUb9tEngg= + flush-write-stream@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" @@ -2453,11 +2490,6 @@ fs-minipass@^1.2.5: dependencies: minipass "^2.2.1" -fs-readdir-recursive@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" - integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== - fs-write-stream-atomic@^1.0.8: version "1.0.10" resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" @@ -2486,6 +2518,11 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.npm.taobao.org/functional-red-black-tree/download/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -2510,6 +2547,21 @@ get-caller-file@^2.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.npm.taobao.org/get-own-enumerable-property-symbols/download/get-own-enumerable-property-symbols-3.0.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-own-enumerable-property-symbols%2Fdownload%2Fget-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha1-tf3nfyLL4185C04ImSLFC85u9mQ= + +get-stdin@7.0.0, get-stdin@^7.0.0: + version "7.0.0" + resolved "https://registry.npm.taobao.org/get-stdin/download/get-stdin-7.0.0.tgz#8d5de98f15171a125c5e516643c7a6d0ea8a96f6" + integrity sha1-jV3pjxUXGhJcXlFmQ8em0OqKlvY= + +get-stdin@^6.0.0: + version "6.0.0" + resolved "https://registry.npm.taobao.org/get-stdin/download/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" + integrity sha1-ngm/cSs2CrkiXoEgSPcf3pyJZXs= + get-stream@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -2517,11 +2569,29 @@ get-stream@^4.0.0: dependencies: pump "^3.0.0" +get-stream@^5.0.0: + version "5.1.0" + resolved "https://registry.npm.taobao.org/get-stream/download/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" + integrity sha1-ASA83JJZf5uQkGfD5lbMH008Tck= + dependencies: + pump "^3.0.0" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= +git-raw-commits@^1.3.0: + version "1.3.6" + resolved "https://registry.npm.taobao.org/git-raw-commits/download/git-raw-commits-1.3.6.tgz#27c35a32a67777c1ecd412a239a6c19d71b95aff" + integrity sha1-J8NaMqZ3d8Hs1BKiOabBnXG5Wv8= + dependencies: + dargs "^4.0.1" + lodash.template "^4.0.2" + meow "^4.0.0" + split2 "^2.0.0" + through2 "^2.0.0" + glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -2530,10 +2600,17 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob@^7.0.0: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== +glob-parent@^5.0.0, glob-parent@^5.1.0: + version "5.1.0" + resolved "https://registry.npm.taobao.org/glob-parent/download/glob-parent-5.1.0.tgz?cache=0&sync_timestamp=1569109895057&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglob-parent%2Fdownload%2Fglob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" + integrity sha1-X0wdHnSNMM1zrSlEs1d6gbCB6MI= + dependencies: + is-glob "^4.0.1" + +glob@^7.0.3, glob@^7.1.3, glob@^7.1.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -2542,10 +2619,10 @@ glob@^7.0.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.3, glob@^7.1.3, glob@^7.1.4: - version "7.1.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" - integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== +glob@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -2554,6 +2631,13 @@ glob@^7.0.3, glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" +global-dirs@^0.1.1: + version "0.1.1" + resolved "https://registry.npm.taobao.org/global-dirs/download/global-dirs-0.1.1.tgz?cache=0&sync_timestamp=1573231318877&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglobal-dirs%2Fdownload%2Fglobal-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= + dependencies: + ini "^1.3.4" + global-modules@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" @@ -2590,15 +2674,26 @@ global-prefix@^3.0.0: kind-of "^6.0.2" which "^1.3.1" -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +globals@^12.1.0: + version "12.3.0" + resolved "https://registry.npm.taobao.org/globals/download/globals-12.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglobals%2Fdownload%2Fglobals-12.3.0.tgz#1e564ee5c4dded2ab098b0f88f24702a3c56be13" + integrity sha1-HlZO5cTd7SqwmLD4jyRwKjxWvhM= + dependencies: + type-fest "^0.8.1" -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== +globby@^10.0.1: + version "10.0.1" + resolved "https://registry.npm.taobao.org/globby/download/globby-10.0.1.tgz#4782c34cb75dd683351335c5829cc3420e606b22" + integrity sha1-R4LDTLdd1oM1EzXFgpzDQg5gayI= + dependencies: + "@types/glob" "^7.1.1" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.0.3" + glob "^7.1.3" + ignore "^5.1.1" + merge2 "^1.2.3" + slash "^3.0.0" globby@^6.1.0: version "6.1.0" @@ -2616,6 +2711,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== +graceful-fs@^4.1.3, graceful-fs@^4.2.2: + version "4.2.3" + resolved "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.2.3.tgz?cache=0&sync_timestamp=1571871291246&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fgraceful-fs%2Fdownload%2Fgraceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha1-ShL/G2A3bvCYYsIJPt2Qgyi+hCM= + handle-thing@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" @@ -2638,6 +2738,11 @@ has-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= +has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.npm.taobao.org/has-symbols/download/has-symbols-1.0.1.tgz?cache=0&sync_timestamp=1573951301709&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhas-symbols%2Fdownload%2Fhas-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha1-n1IUdYpEGWxAbZvXbOv4HsLdMeg= + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -2718,6 +2823,11 @@ homedir-polyfill@^1.0.1: dependencies: parse-passwd "^1.0.0" +hosted-git-info@^2.1.4: + version "2.8.5" + resolved "https://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" + integrity sha1-dZz88sTRVq3lmwst+r3cQqa5xww= + hpack.js@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" @@ -2837,7 +2947,24 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -iconv-lite@0.4.24, iconv-lite@^0.4.4: +husky@^3.1.0: + version "3.1.0" + resolved "https://registry.npm.taobao.org/husky/download/husky-3.1.0.tgz#5faad520ab860582ed94f0c1a77f0f04c90b57c0" + integrity sha1-X6rVIKuGBYLtlPDBp38PBMkLV8A= + dependencies: + chalk "^2.4.2" + ci-info "^2.0.0" + cosmiconfig "^5.2.1" + execa "^1.0.0" + get-stdin "^7.0.0" + opencollective-postinstall "^2.0.2" + pkg-dir "^4.2.0" + please-upgrade-node "^3.2.0" + read-pkg "^5.2.0" + run-node "^1.0.0" + slash "^3.0.0" + +iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -2868,6 +2995,32 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.npm.taobao.org/ignore/download/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw= + +ignore@^5.1.1: + version "5.1.4" + resolved "https://registry.npm.taobao.org/ignore/download/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" + integrity sha1-hLez2+ZFUrbvDsqZ9nQ9vsbZet8= + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/import-fresh/download/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.0.0: + version "3.2.1" + resolved "https://registry.npm.taobao.org/import-fresh/download/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha1-Yz/2GFBueTr1rJG/SLcmd+FcvmY= + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + import-local@2.0.0, import-local@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" @@ -2881,6 +3034,16 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= +indent-string@^3.0.0: + version "3.2.0" + resolved "https://registry.npm.taobao.org/indent-string/download/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.npm.taobao.org/indent-string/download/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha1-Yk+PRJfWGbLZdoUx1Y9BIoVNclE= + indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" @@ -2919,6 +3082,25 @@ ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== +inquirer@^7.0.0: + version "7.0.1" + resolved "https://registry.npm.taobao.org/inquirer/download/inquirer-7.0.1.tgz#13f7980eedc73c689feff3994b109c4e799c6ebb" + integrity sha1-E/eYDu3HPGif7/OZSxCcTnmcbrs= + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.2" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.2.0" + rxjs "^6.5.3" + string-width "^4.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + internal-ip@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" @@ -2932,13 +3114,6 @@ interpret@1.2.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== -invariant@^2.2.2: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - invert-kv@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" @@ -2988,6 +3163,11 @@ is-arguments@^1.0.4: resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" @@ -3005,6 +3185,11 @@ is-callable@^1.1.4: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== +is-callable@^1.1.5: + version "1.1.5" + resolved "https://registry.npm.taobao.org/is-callable/download/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" + integrity sha1-9+RrWWiQRW23Tn9ul2yzJz0G+qs= + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -3042,6 +3227,11 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-data-descriptor "^1.0.0" kind-of "^6.0.2" +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.npm.taobao.org/is-directory/download/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -3071,6 +3261,11 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0= + is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -3078,7 +3273,7 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" -is-glob@^4.0.0: +is-glob@^4.0.0, is-glob@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== @@ -3092,7 +3287,24 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" -is-path-cwd@^2.0.0: +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss= + +is-obj@^1.0.0, is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.npm.taobao.org/is-obj/download/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-observable@^1.1.0: + version "1.1.0" + resolved "https://registry.npm.taobao.org/is-observable/download/is-observable-1.1.0.tgz?cache=0&sync_timestamp=1559094483943&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-observable%2Fdownload%2Fis-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" + integrity sha1-s+mGyPRN6VCGfKtUA/WjRlAFl14= + dependencies: + symbol-observable "^1.1.0" + +is-path-cwd@^2.0.0, is-path-cwd@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== @@ -3111,6 +3323,16 @@ is-path-inside@^2.1.0: dependencies: path-is-inside "^1.0.2" +is-path-inside@^3.0.1: + version "3.0.2" + resolved "https://registry.npm.taobao.org/is-path-inside/download/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" + integrity sha1-9SIPyCo+IzdXKR3dycWHfyofMBc= + +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.npm.taobao.org/is-plain-obj/download/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -3118,6 +3340,11 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.npm.taobao.org/is-promise/download/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + is-regex@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" @@ -3125,11 +3352,33 @@ is-regex@^1.0.4: dependencies: has "^1.0.1" +is-regex@^1.0.5: + version "1.0.5" + resolved "https://registry.npm.taobao.org/is-regex/download/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" + integrity sha1-OdWJo1i/GJZ/cmlnEguPwa7XTq4= + dependencies: + has "^1.0.3" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/is-regexp/download/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/is-stream/download/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha1-venDJoDW+uBBKdasnZIc54FfeOM= + +is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.npm.taobao.org/is-string/download/is-string-1.0.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-string%2Fdownload%2Fis-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha1-QEk+0ZjvP/R3uMf5L2ROyCpc06Y= + is-symbol@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" @@ -3137,6 +3386,13 @@ is-symbol@^1.0.2: dependencies: has-symbols "^1.0.0" +is-text-path@^1.0.0: + version "1.0.1" + resolved "https://registry.npm.taobao.org/is-text-path/download/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" + integrity sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4= + dependencies: + text-extensions "^1.0.0" + is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -3169,32 +3425,20 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -js-levenshtein@^1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" - integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: +js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= +js-yaml@^3.13.1: + version "3.13.1" + resolved "https://registry.npm.taobao.org/js-yaml/download/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha1-r/FRswv9+o5J4F2iLnQV6d+jeEc= + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" -json-parse-better-errors@^1.0.2: +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== @@ -3204,6 +3448,11 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npm.taobao.org/json-stable-stringify-without-jsonify/download/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + json3@^3.3.2: version "3.3.3" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" @@ -3221,12 +3470,10 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" - integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== - dependencies: - minimist "^1.2.0" +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.npm.taobao.org/jsonparse/download/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= killable@^1.0.1: version "1.0.1" @@ -3264,6 +3511,103 @@ lcid@^2.0.0: dependencies: invert-kv "^2.0.0" +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.npm.taobao.org/levn/download/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.npm.taobao.org/lines-and-columns/download/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + +lint-staged@^9.5.0: + version "9.5.0" + resolved "https://registry.npm.taobao.org/lint-staged/download/lint-staged-9.5.0.tgz#290ec605252af646d9b74d73a0fa118362b05a33" + integrity sha1-KQ7GBSUq9kbZt01zoPoRg2KwWjM= + dependencies: + chalk "^2.4.2" + commander "^2.20.0" + cosmiconfig "^5.2.1" + debug "^4.1.1" + dedent "^0.7.0" + del "^5.0.0" + execa "^2.0.3" + listr "^0.14.3" + log-symbols "^3.0.0" + micromatch "^4.0.2" + normalize-path "^3.0.0" + please-upgrade-node "^3.1.1" + string-argv "^0.3.0" + stringify-object "^3.3.0" + +listr-silent-renderer@^1.1.1: + version "1.1.1" + resolved "https://registry.npm.taobao.org/listr-silent-renderer/download/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" + integrity sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4= + +listr-update-renderer@^0.5.0: + version "0.5.0" + resolved "https://registry.npm.taobao.org/listr-update-renderer/download/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2" + integrity sha1-Tqg2hUinuK7LfgbYyVy0WuLt5qI= + dependencies: + chalk "^1.1.3" + cli-truncate "^0.2.1" + elegant-spinner "^1.0.1" + figures "^1.7.0" + indent-string "^3.0.0" + log-symbols "^1.0.2" + log-update "^2.3.0" + strip-ansi "^3.0.1" + +listr-verbose-renderer@^0.5.0: + version "0.5.0" + resolved "https://registry.npm.taobao.org/listr-verbose-renderer/download/listr-verbose-renderer-0.5.0.tgz#f1132167535ea4c1261102b9f28dac7cba1e03db" + integrity sha1-8RMhZ1NepMEmEQK58o2sfLoeA9s= + dependencies: + chalk "^2.4.1" + cli-cursor "^2.1.0" + date-fns "^1.27.2" + figures "^2.0.0" + +listr@^0.14.3: + version "0.14.3" + resolved "https://registry.npm.taobao.org/listr/download/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586" + integrity sha1-L+qQlgTkNL5GTFC926DUlpKPpYY= + dependencies: + "@samverschueren/stream-to-observable" "^0.3.0" + is-observable "^1.1.0" + is-promise "^2.1.0" + is-stream "^1.1.0" + listr-silent-renderer "^1.1.1" + listr-update-renderer "^0.5.0" + listr-verbose-renderer "^0.5.0" + p-map "^2.0.0" + rxjs "^6.3.3" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/load-json-file/download/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.npm.taobao.org/load-json-file/download/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + loader-runner@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" @@ -3288,6 +3632,14 @@ loader-utils@^0.2.16: json5 "^0.5.0" object-assign "^4.0.1" +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/locate-path/download/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -3296,22 +3648,83 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" -lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.3, lodash@^4.17.4: +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npm.taobao.org/locate-path/download/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha1-Gvujlq/WdqbUJQTQpno6frn2KqA= + dependencies: + p-locate "^4.1.0" + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.npm.taobao.org/lodash._reinterpolate/download/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + +lodash.template@^4.0.2: + version "4.5.0" + resolved "https://registry.npm.taobao.org/lodash.template/download/lodash.template-4.5.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash.template%2Fdownload%2Flodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity sha1-+XYZXPPzR9DV9SSDVp/oAxzM6Ks= + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.2.0" + resolved "https://registry.npm.taobao.org/lodash.templatesettings/download/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + integrity sha1-5IExDwSdPPbUfpEq0JMTsVTw+zM= + dependencies: + lodash._reinterpolate "^3.0.0" + +lodash.unescape@4.0.1: + version "4.0.1" + resolved "https://registry.npm.taobao.org/lodash.unescape/download/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" + integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw= + +lodash@4.17.14: + version "4.17.14" + resolved "https://registry.npm.taobao.org/lodash/download/lodash-4.17.14.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash%2Fdownload%2Flodash-4.17.14.tgz#9ce487ae66c96254fe20b599f21b6816028078ba" + integrity sha1-nOSHrmbJYlT+ILWZ8htoFgKAeLo= + +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.3, lodash@^4.2.1: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +log-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.npm.taobao.org/log-symbols/download/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" + integrity sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg= + dependencies: + chalk "^1.0.0" + +log-symbols@^3.0.0: + version "3.0.0" + resolved "https://registry.npm.taobao.org/log-symbols/download/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" + integrity sha1-86CFFqXeqJMzan3uFNGKHP2rd8Q= + dependencies: + chalk "^2.4.2" + +log-update@^2.3.0: + version "2.3.0" + resolved "https://registry.npm.taobao.org/log-update/download/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" + integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg= + dependencies: + ansi-escapes "^3.0.0" + cli-cursor "^2.0.0" + wrap-ansi "^3.0.1" + loglevel@^1.6.4: version "1.6.6" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.6.tgz#0ee6300cc058db6b3551fa1c4bf73b83bb771312" integrity sha512-Sgr5lbboAUBo3eXCSPL4/KoVz3ROKquOjcctxmHIt+vol2DrqTQe3SwkKKuYhEiWB5kYa13YyopJ69deJ1irzQ== -loose-envify@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.npm.taobao.org/loud-rejection/download/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= dependencies: - js-tokens "^3.0.0 || ^4.0.0" + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" lower-case@^1.1.1: version "1.1.4" @@ -3325,7 +3738,7 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -make-dir@^2.0.0, make-dir@^2.1.0: +make-dir@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== @@ -3350,6 +3763,16 @@ map-cache@^0.2.2: resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= +map-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.npm.taobao.org/map-obj/download/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/map-obj/download/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" + integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= + map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -3388,11 +3811,59 @@ memory-fs@^0.4.0, memory-fs@^0.4.1: errno "^0.1.3" readable-stream "^2.0.1" +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.npm.taobao.org/memory-fs/download/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha1-MkwBKIuIZSlm0WHbd4OHIIRajjw= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +meow@5.0.0: + version "5.0.0" + resolved "https://registry.npm.taobao.org/meow/download/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" + integrity sha1-38c9Y6mvxxSl43F2DrXIi5EHiqQ= + dependencies: + camelcase-keys "^4.0.0" + decamelize-keys "^1.0.0" + loud-rejection "^1.0.0" + minimist-options "^3.0.1" + normalize-package-data "^2.3.4" + read-pkg-up "^3.0.0" + redent "^2.0.0" + trim-newlines "^2.0.0" + yargs-parser "^10.0.0" + +meow@^4.0.0: + version "4.0.1" + resolved "https://registry.npm.taobao.org/meow/download/meow-4.0.1.tgz#d48598f6f4b1472f35bf6317a95945ace347f975" + integrity sha1-1IWY9vSxRy81v2MXqVlFrONH+XU= + dependencies: + camelcase-keys "^4.0.0" + decamelize-keys "^1.0.0" + loud-rejection "^1.0.0" + minimist "^1.1.3" + minimist-options "^3.0.1" + normalize-package-data "^2.3.4" + read-pkg-up "^3.0.0" + redent "^2.0.0" + trim-newlines "^2.0.0" + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/merge-stream/download/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A= + +merge2@^1.2.3, merge2@^1.3.0: + version "1.3.0" + resolved "https://registry.npm.taobao.org/merge2/download/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" + integrity sha1-WzZu6DsvFYLEj4fkfPGpNSEDyoE= + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -3417,6 +3888,14 @@ micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" +micromatch@^4.0.0, micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.npm.taobao.org/micromatch/download/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha1-T8sJmb+fvC/L3SEvbWKbmlbDklk= + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -3447,7 +3926,12 @@ mime@^2.4.4: resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== -mimic-fn@^2.0.0: +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI= + +mimic-fn@^2.0.0, mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== @@ -3469,12 +3953,20 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" +minimist-options@^3.0.1: + version "3.0.2" + resolved "https://registry.npm.taobao.org/minimist-options/download/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" + integrity sha1-+6TIGRM54T7PTWG+sD8HAQPz2VQ= + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@^1.2.0: +minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= @@ -3525,17 +4017,17 @@ mkdirp@^0.5.0, mkdirp@^0.5.1: dependencies: minimist "0.0.8" -monaco-editor-webpack-plugin@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/monaco-editor-webpack-plugin/-/monaco-editor-webpack-plugin-1.7.0.tgz#920cbeecca25f15d70d568a7e11b0ba4daf1ae83" - integrity sha512-oItymcnlL14Sjd7EF7q+CMhucfwR/2BxsqrXIBrWL6LQplFfAfV+grLEQRmVHeGSBZ/Gk9ptzfueXnWcoEcFuA== +monaco-editor-webpack-plugin@^1.8.1: + version "1.8.1" + resolved "https://registry.npm.taobao.org/monaco-editor-webpack-plugin/download/monaco-editor-webpack-plugin-1.8.1.tgz#5701bfce16c14c51503a607726d97fd92784af26" + integrity sha1-VwG/zhbBTFFQOmB3Jtl/2SeEryY= dependencies: - "@types/webpack" "^4.4.19" + loader-utils "^1.2.3" -monaco-editor@0.18.1: - version "0.18.1" - resolved "https://registry.yarnpkg.com/monaco-editor/-/monaco-editor-0.18.1.tgz#ced7c305a23109875feeaf395a504b91f6358cfc" - integrity sha512-fmL+RFZ2Hrezy+X/5ZczQW51LUmvzfcqOurnkCIRFTyjdVjzR7JvENzI6+VKBJzJdPh6EYL4RoWl92b2Hrk9fw== +monaco-editor@0.19.0: + version "0.19.0" + resolved "https://registry.npm.taobao.org/monaco-editor/download/monaco-editor-0.19.0.tgz#c6e774210f3b292ff739e96f45a1cc78bf5ac2e7" + integrity sha1-xud0IQ87KS/3OelvRaHMeL9awuc= move-concurrently@^1.0.1: version "1.0.1" @@ -3577,6 +4069,11 @@ multicast-dns@^6.0.1: dns-packet "^1.3.1" thunky "^1.0.2" +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.npm.taobao.org/mute-stream/download/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha1-FjDEKyJR/4HiooPelqVJfqkuXg0= + nan@^2.12.1: version "2.14.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" @@ -3599,6 +4096,11 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npm.taobao.org/natural-compare/download/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + needle@^2.2.1: version "2.4.0" resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" @@ -3680,13 +4182,6 @@ node-pre-gyp@^0.12.0: semver "^5.3.0" tar "^4" -node-releases@^1.1.38: - version "1.1.40" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.40.tgz#a94facfa8e2d612302601ca1361741d529c4515a" - integrity sha512-r4LPcC5b/bS8BdtWH1fbeK88ib/wg9aqmg6/s3ngNLn2Ewkn/8J6Iw3P9RTlfIAdSdvYvQl2thCY5Y+qTAQ2iQ== - dependencies: - semver "^6.3.0" - nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -3695,6 +4190,16 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg= + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" @@ -3727,6 +4232,13 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" +npm-run-path@^3.0.0: + version "3.1.0" + resolved "https://registry.npm.taobao.org/npm-run-path/download/npm-run-path-3.1.0.tgz?cache=0&sync_timestamp=1577055779072&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnpm-run-path%2Fdownload%2Fnpm-run-path-3.1.0.tgz#7f91be317f6a466efed3c9f2980ad8a4ee8b0fa5" + integrity sha1-f5G+MX9qRm7+08nymArYpO6LD6U= + dependencies: + path-key "^3.0.0" + npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" @@ -3763,6 +4275,11 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" +object-inspect@^1.7.0: + version "1.7.0" + resolved "https://registry.npm.taobao.org/object-inspect/download/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha1-9Pa9GBrXfwBrXs5gvQtvOY/3Smc= + object-is@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6" @@ -3805,6 +4322,16 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" +object.values@^1.1.0: + version "1.1.1" + resolved "https://registry.npm.taobao.org/object.values/download/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" + integrity sha1-aKmezeNWt+kpWjxeDOMdyMlT3l4= + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" @@ -3829,12 +4356,43 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.npm.taobao.org/onetime/download/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +onetime@^5.1.0: + version "5.1.0" + resolved "https://registry.npm.taobao.org/onetime/download/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" + integrity sha1-//DzyRYX/mK7UBiWNumayKbfe+U= + dependencies: + mimic-fn "^2.1.0" + +opencollective-postinstall@^2.0.2: + version "2.0.2" + resolved "https://registry.npm.taobao.org/opencollective-postinstall/download/opencollective-postinstall-2.0.2.tgz#5657f1bede69b6e33a45939b061eb53d3c6c3a89" + integrity sha1-Vlfxvt5ptuM6RZObBh61PTxsOok= + opn@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== dependencies: - is-wsl "^1.1.0" + is-wsl "^1.1.0" + +optionator@^0.8.3: + version "0.8.3" + resolved "https://registry.npm.taobao.org/optionator/download/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha1-hPodA2/p08fiHZmIS2ARZ+yPtJU= + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" original@^1.0.0: version "1.0.2" @@ -3862,7 +4420,7 @@ os-locale@^3.0.0, os-locale@^3.1.0: lcid "^2.0.0" mem "^4.0.0" -os-tmpdir@^1.0.0: +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= @@ -3885,18 +4443,37 @@ p-finally@^1.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= +p-finally@^2.0.0: + version "2.0.1" + resolved "https://registry.npm.taobao.org/p-finally/download/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" + integrity sha1-vW/KqcVZoJa2gIBvTWV7Pw8kBWE= + p-is-promise@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== -p-limit@^2.0.0: +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.npm.taobao.org/p-limit/download/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg= + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0, p-limit@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== dependencies: p-try "^2.0.0" +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/p-locate/download/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" @@ -3904,11 +4481,25 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npm.taobao.org/p-locate/download/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha1-o0KLtwiLOmApL2aRkni3wpetTwc= + dependencies: + p-limit "^2.2.0" + p-map@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.npm.taobao.org/p-map/download/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha1-1wTZr4orpoTiYA2aIVmD1BQal50= + dependencies: + aggregate-error "^3.0.0" + p-retry@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" @@ -3916,6 +4507,11 @@ p-retry@^3.0.1: dependencies: retry "^0.12.0" +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/p-try/download/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -3942,6 +4538,13 @@ param-case@2.1.x: dependencies: no-case "^2.2.0" +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npm.taobao.org/parent-module/download/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI= + dependencies: + callsites "^3.0.0" + parse-asn1@^5.0.0: version "5.1.4" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc" @@ -3954,6 +4557,31 @@ parse-asn1@^5.0.0: pbkdf2 "^3.0.3" safe-buffer "^5.1.1" +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.npm.taobao.org/parse-json/download/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0: + version "5.0.0" + resolved "https://registry.npm.taobao.org/parse-json/download/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" + integrity sha1-c+URTJhtFD76NxLU6iTbmkJm9g8= + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + lines-and-columns "^1.1.6" + parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" @@ -3984,6 +4612,11 @@ path-exists@^3.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npm.taobao.org/path-exists/download/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha1-UTvb4tO5XXdi6METfvoZXGxhtbM= + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -3999,6 +4632,11 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npm.taobao.org/path-key/download/path-key-3.1.1.tgz?cache=0&sync_timestamp=1574442298523&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-key%2Fdownload%2Fpath-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U= + path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" @@ -4009,6 +4647,25 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/path-type/download/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.npm.taobao.org/path-type/download/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha1-zvMdyOCho7sNEFwM2Xzzv0f0428= + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npm.taobao.org/path-type/download/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs= + pbkdf2@^3.0.3: version "3.0.17" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" @@ -4020,11 +4677,21 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" +picomatch@^2.0.5: + version "2.1.1" + resolved "https://registry.npm.taobao.org/picomatch/download/picomatch-2.1.1.tgz?cache=0&sync_timestamp=1573081258067&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpicomatch%2Fdownload%2Fpicomatch-2.1.1.tgz#ecdfbea7704adb5fe6fb47f9866c4c0e15e905c5" + integrity sha1-7N++p3BK21/m+0f5hmxMDhXpBcU= + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" @@ -4042,6 +4709,13 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -4049,6 +4723,20 @@ pkg-dir@^3.0.0: dependencies: find-up "^3.0.0" +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM= + dependencies: + find-up "^4.0.0" + +please-upgrade-node@^3.1.1, please-upgrade-node@^3.2.0: + version "3.2.0" + resolved "https://registry.npm.taobao.org/please-upgrade-node/download/please-upgrade-node-3.2.0.tgz?cache=0&sync_timestamp=1565266078749&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fplease-upgrade-node%2Fdownload%2Fplease-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" + integrity sha1-rt3T+ZTJM+StmLmdmlVu+g4v6UI= + dependencies: + semver-compare "^1.0.0" + portfinder@^1.0.25: version "1.0.25" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.25.tgz#254fd337ffba869f4b9d37edc298059cb4d35eca" @@ -4119,6 +4807,23 @@ postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.5, postcss@^7.0. source-map "^0.6.1" supports-color "^6.1.0" +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/prettier-linter-helpers/download/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha1-0j1B/hN1ZG3i0BBNNFSjAIgCz3s= + dependencies: + fast-diff "^1.1.2" + +prettier@^1.19.1: + version "1.19.1" + resolved "https://registry.npm.taobao.org/prettier/download/prettier-1.19.1.tgz?cache=0&sync_timestamp=1573302093134&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fprettier%2Fdownload%2Fprettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" + integrity sha1-99f1/4qc2HKnvkyhQglZVqYHl8s= + pretty-error@^2.0.2: version "2.1.1" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" @@ -4127,11 +4832,6 @@ pretty-error@^2.0.2: renderkid "^2.0.1" utila "~0.4" -private@^0.1.6: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== - process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -4142,6 +4842,11 @@ process@^0.11.10: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.npm.taobao.org/progress/download/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha1-foz42PW48jnBvGi+tOt4Vn1XLvg= + promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" @@ -4212,6 +4917,11 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +q@^1.5.1: + version "1.5.1" + resolved "https://registry.npm.taobao.org/q/download/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + qs@6.7.0: version "6.7.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" @@ -4232,6 +4942,11 @@ querystringify@^2.1.1: resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== +quick-lru@^1.0.0: + version "1.1.0" + resolved "https://registry.npm.taobao.org/quick-lru/download/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" + integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= + randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -4272,6 +4987,50 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-2.0.0.tgz?cache=0&sync_timestamp=1575620465504&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fread-pkg-up%2Fdownload%2Fread-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-3.0.0.tgz?cache=0&sync_timestamp=1575620465504&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fread-pkg-up%2Fdownload%2Fread-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= + dependencies: + find-up "^2.0.0" + read-pkg "^3.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/read-pkg/download/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.npm.taobao.org/read-pkg/download/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.npm.taobao.org/read-pkg/download/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha1-e/KVQ4yloz5WzTDgU7NO5yUMk8w= + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" @@ -4303,30 +5062,24 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" -regenerate-unicode-properties@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" - integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== +redent@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/redent/download/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" + integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= dependencies: - regenerate "^1.4.0" + indent-string "^3.0.0" + strip-indent "^2.0.0" -regenerate@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== +regenerator-runtime@^0.10.5: + version "0.10.5" + resolved "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== -regenerator-transform@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb" - integrity sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ== - dependencies: - private "^0.1.6" - regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -4342,29 +5095,15 @@ regexp.prototype.flags@^1.2.0: dependencies: define-properties "^1.1.2" -regexpu-core@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" - integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg== - dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties "^8.1.0" - regjsgen "^0.5.0" - regjsparser "^0.6.0" - unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.1.0" - -regjsgen@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" - integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.npm.taobao.org/regexpp/download/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha1-jRnTHPYySCtYkEn4KB+T28uk0H8= -regjsparser@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" - integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== - dependencies: - jsesc "~0.5.0" +regexpp@^3.0.0: + version "3.0.0" + resolved "https://registry.npm.taobao.org/regexpp/download/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" + integrity sha1-3WOYLuMwDme0HBlW+FCqaA2dMw4= relateurl@0.2.x: version "0.2.7" @@ -4432,23 +5171,56 @@ resolve-dir@^1.0.0, resolve-dir@^1.0.1: expand-tilde "^2.0.0" global-modules "^1.0.0" +resolve-from@5.0.0, resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npm.taobao.org/resolve-from/download/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha1-w1IlhD3493bfIcV1V7wIfp39/Gk= + resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" integrity sha1-six699nWiBvItuZTM17rywoYh0g= +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npm.taobao.org/resolve-from/download/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY= + +resolve-global@1.0.0, resolve-global@^1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/resolve-global/download/resolve-global-1.0.0.tgz#a2a79df4af2ca3f49bf77ef9ddacd322dad19255" + integrity sha1-oqed9K8so/Sb93753azTItrRklU= + dependencies: + global-dirs "^0.1.1" + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.3.2: - version "1.12.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" - integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== +resolve@^1.10.0, resolve@^1.12.0, resolve@^1.5.0: + version "1.14.1" + resolved "https://registry.npm.taobao.org/resolve/download/resolve-1.14.1.tgz#9e018c540fcf0c427d678b9931cbf45e984bcaff" + integrity sha1-ngGMVA/PDEJ9Z4uZMcv0XphLyv8= dependencies: path-parse "^1.0.6" +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/restore-cursor/download/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npm.taobao.org/restore-cursor/download/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha1-OfZ8VLOnpYzqUjbZXPADQjljH34= + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -4459,13 +5231,32 @@ retry@^0.12.0: resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= -rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: +reusify@^1.0.0: + version "1.0.4" + resolved "https://registry.npm.taobao.org/reusify/download/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY= + +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.npm.taobao.org/rimraf/download/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha1-stEE/g2Psnz54KHNqCYt04M8bKs= + dependencies: + glob "^7.1.3" + +rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" +rimraf@^3.0.0: + version "3.0.0" + resolved "https://registry.npm.taobao.org/rimraf/download/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b" + integrity sha1-YUF21LMBC3Xlw5DrDulvbcDOu5s= + dependencies: + glob "^7.1.3" + ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -4474,6 +5265,23 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.npm.taobao.org/run-async/download/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= + dependencies: + is-promise "^2.1.0" + +run-node@^1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/run-node/download/run-node-1.0.0.tgz#46b50b946a2aa2d4947ae1d886e9856fd9cabe5e" + integrity sha1-RrULlGoqotSUeuHYhumFb9nKvl4= + +run-parallel@^1.1.9: + version "1.1.9" + resolved "https://registry.npm.taobao.org/run-parallel/download/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" + integrity sha1-yd06fPn0ssS2JE4XOm7YZuYd1nk= + run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" @@ -4481,6 +5289,13 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" +rxjs@^6.3.3, rxjs@^6.5.3: + version "6.5.3" + resolved "https://registry.npm.taobao.org/rxjs/download/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" + integrity sha1-UQ4mMX9NuRp+sd532d2boKSJmjo= + dependencies: + tslib "^1.9.0" + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -4525,6 +5340,14 @@ schema-utils@^2.0.0, schema-utils@^2.0.1: ajv "^6.10.2" ajv-keywords "^3.4.1" +schema-utils@^2.5.0: + version "2.6.1" + resolved "https://registry.npm.taobao.org/schema-utils/download/schema-utils-2.6.1.tgz?cache=0&sync_timestamp=1574946672681&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fschema-utils%2Fdownload%2Fschema-utils-2.6.1.tgz#eb78f0b945c7bcfa2082b3565e8db3548011dc4f" + integrity sha1-63jwuUXHvPoggrNWXo2zVIAR3E8= + dependencies: + ajv "^6.10.2" + ajv-keywords "^3.4.1" + select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" @@ -4537,12 +5360,22 @@ selfsigned@^1.10.7: dependencies: node-forge "0.9.0" -semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/semver-compare/download/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= + +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.3.0: +semver@6.2.0: + version "6.2.0" + resolved "https://registry.npm.taobao.org/semver/download/semver-6.2.0.tgz#4d813d9590aaf8a9192693d6c85b9344de5901db" + integrity sha1-TYE9lZCq+KkZJpPWyFuTRN5ZAds= + +semver@^6.0.0, semver@^6.1.2, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -4639,20 +5472,46 @@ shebang-command@^1.2.0: dependencies: shebang-regex "^1.0.0" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/shebang-command/download/shebang-command-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fshebang-command%2Fdownload%2Fshebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo= + dependencies: + shebang-regex "^3.0.0" + shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= -signal-exit@^3.0.0: +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npm.taobao.org/shebang-regex/download/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI= + +signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npm.taobao.org/slash/download/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ= + +slice-ansi@0.0.4: + version "0.0.4" + resolved "https://registry.npm.taobao.org/slice-ansi/download/slice-ansi-0.0.4.tgz?cache=0&sync_timestamp=1568743074657&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fslice-ansi%2Fdownload%2Fslice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" + integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= + +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.npm.taobao.org/slice-ansi/download/slice-ansi-2.1.0.tgz?cache=0&sync_timestamp=1568743074657&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fslice-ansi%2Fdownload%2Fslice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha1-ys12k0YaY3pXiNkqfdT7oGjoFjY= + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" snapdragon-node@^2.0.1: version "2.1.1" @@ -4733,7 +5592,7 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= -source-map@^0.5.0, source-map@^0.5.6: +source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -4743,6 +5602,32 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha1-+4PlBERSaPFUsHTiGMh8ADzTHfQ= + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha1-LqRQrudPKom/uUUZwH/Nb0EyKXc= + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha1-meEZt6XaAOBUkcn6M4t5BII7QdA= + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.5" + resolved "https://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha1-NpS1gEVnpFjTyARYQqY1hjL2JlQ= + spdy-transport@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" @@ -4773,6 +5658,18 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" +split2@^2.0.0: + version "2.2.0" + resolved "https://registry.npm.taobao.org/split2/download/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493" + integrity sha1-GGsldbz4PoW30YRldWI47k7kJJM= + dependencies: + through2 "^2.0.2" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + ssri@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" @@ -4825,6 +5722,11 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= +string-argv@^0.3.0: + version "0.3.1" + resolved "https://registry.npm.taobao.org/string-argv/download/string-argv-0.3.1.tgz?cache=0&sync_timestamp=1567089826826&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring-argv%2Fdownload%2Fstring-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" + integrity sha1-leL77AQnrhkYSTX4FtdKqkxcGdo= + string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -4851,6 +5753,31 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string-width@^4.1.0: + version "4.2.0" + resolved "https://registry.npm.taobao.org/string-width/download/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha1-lSGCxGzHssMT0VluYjmSvRY7crU= + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string.prototype.trimleft@^2.1.1: + version "2.1.1" + resolved "https://registry.npm.taobao.org/string.prototype.trimleft/download/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" + integrity sha1-m9uKxqvW1gKxek7TIYcNL43O/HQ= + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string.prototype.trimright@^2.1.1: + version "2.1.1" + resolved "https://registry.npm.taobao.org/string.prototype.trimright/download/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" + integrity sha1-RAMUsVmWyGbOigNBiU1FGGIAxdk= + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -4865,6 +5792,15 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.npm.taobao.org/stringify-object/download/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha1-cDBlrvyhkwDTzoivT1s5VtdVZik= + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -4886,11 +5822,38 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-6.0.0.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha1-CxVx3XZpzNTz4G4U7x7tJiJa5TI= + dependencies: + ansi-regex "^5.0.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/strip-final-newline/download/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha1-ibhS+y/L6Tb29LMYevsKEsGrWK0= + +strip-indent@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/strip-indent/download/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" + integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= + +strip-json-comments@^3.0.1: + version "3.0.1" + resolved "https://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" + integrity sha1-hXE5dakfuHvxswXMp3OV5A0qZKc= + strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -4923,6 +5886,21 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" +symbol-observable@^1.1.0: + version "1.2.0" + resolved "https://registry.npm.taobao.org/symbol-observable/download/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha1-wiaIrtTqs83C3+rLtWFmBWCgCAQ= + +table@^5.2.3: + version "5.4.6" + resolved "https://registry.npm.taobao.org/table/download/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha1-EpLRlQDOP4YFOwXw6Ofko7shB54= + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" @@ -4965,7 +5943,17 @@ terser@^4.1.2: source-map "~0.6.1" source-map-support "~0.5.12" -through2@^2.0.0: +text-extensions@^1.0.0: + version "1.9.0" + resolved "https://registry.npm.taobao.org/text-extensions/download/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" + integrity sha1-GFPkX+45yUXOb2w2stZZtaq8KiY= + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npm.taobao.org/text-table/download/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +through2@^2.0.0, through2@^2.0.2: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -4973,6 +5961,11 @@ through2@^2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" +"through@>=2.2.7 <3", through@^2.3.6: + version "2.3.8" + resolved "https://registry.npm.taobao.org/through/download/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + thunky@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.3.tgz#f5df732453407b09191dae73e2a8cc73f381a826" @@ -4985,21 +5978,18 @@ timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.npm.taobao.org/tmp/download/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha1-bTQzWIl2jSGyvNoKonfO07G/rfk= + dependencies: + os-tmpdir "~1.0.2" + to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" @@ -5015,6 +6005,13 @@ to-regex-range@^2.1.0: is-number "^3.0.0" repeat-string "^1.6.1" +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ= + dependencies: + is-number "^7.0.0" + to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" @@ -5035,16 +6032,61 @@ toposort@^1.0.0: resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029" integrity sha1-LmhELZ9k7HILjMieZEOsbKqVACk= -tslib@^1.9.0: +trim-newlines@^2.0.0: + version "2.0.0" + resolved "https://registry.npm.taobao.org/trim-newlines/download/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" + integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= + +trim-off-newlines@^1.0.0: + version "1.0.1" + resolved "https://registry.npm.taobao.org/trim-off-newlines/download/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" + integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= + +ts-loader@^6.2.1: + version "6.2.1" + resolved "https://registry.npm.taobao.org/ts-loader/download/ts-loader-6.2.1.tgz?cache=0&sync_timestamp=1571811892359&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fts-loader%2Fdownload%2Fts-loader-6.2.1.tgz#67939d5772e8a8c6bdaf6277ca023a4812da02ef" + integrity sha1-Z5OdV3LoqMa9r2J3ygI6SBLaAu8= + dependencies: + chalk "^2.3.0" + enhanced-resolve "^4.0.0" + loader-utils "^1.0.2" + micromatch "^4.0.0" + semver "^6.0.0" + +tslib@^1.8.1, tslib@^1.9.0: version "1.10.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== +tsutils@^3.17.1: + version "3.17.1" + resolved "https://registry.npm.taobao.org/tsutils/download/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" + integrity sha1-7XGZF/EcoN7lhicrKsSeAVot11k= + dependencies: + tslib "^1.8.1" + tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.npm.taobao.org/type-check/download/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.npm.taobao.org/type-fest/download/type-fest-0.6.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftype-fest%2Fdownload%2Ftype-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha1-jSojcNPfiG61yQraHFv2GIrPg4s= + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.npm.taobao.org/type-fest/download/type-fest-0.8.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftype-fest%2Fdownload%2Ftype-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha1-CeJJ696FHTseSNJ8EFREZn8XuD0= + type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -5058,6 +6100,11 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +typescript@^3.7.4: + version "3.7.4" + resolved "https://registry.npm.taobao.org/typescript/download/typescript-3.7.4.tgz?cache=0&sync_timestamp=1577173159597&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftypescript%2Fdownload%2Ftypescript-3.7.4.tgz#1743a5ec5fef6a1fa9f3e4708e33c81c73876c19" + integrity sha1-F0Ol7F/vah+p8+RwjjPIHHOHbBk= + uglify-js@3.4.x: version "3.4.10" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.10.tgz#9ad9563d8eb3acdfb8d38597d2af1d815f6a755f" @@ -5066,29 +6113,6 @@ uglify-js@3.4.x: commander "~2.19.0" source-map "~0.6.1" -unicode-canonical-property-names-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" - integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== - -unicode-match-property-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" - integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== - dependencies: - unicode-canonical-property-names-ecmascript "^1.0.4" - unicode-property-aliases-ecmascript "^1.0.4" - -unicode-match-property-value-ecmascript@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" - integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== - -unicode-property-aliases-ecmascript@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" - integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== - union-value@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" @@ -5221,6 +6245,19 @@ v8-compile-cache@2.0.3: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== +v8-compile-cache@^2.0.3: + version "2.1.0" + resolved "https://registry.npm.taobao.org/v8-compile-cache/download/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" + integrity sha1-4U3jezGm0ZT1aQ1n78Tn9vxqsw4= + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha1-/JH2uce6FchX9MssXe/uw51PQQo= + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -5385,6 +6422,13 @@ which@^1.2.14, which@^1.2.9, which@^1.3.1: dependencies: isexe "^2.0.0" +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npm.taobao.org/which/download/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE= + dependencies: + isexe "^2.0.0" + wide-align@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" @@ -5392,6 +6436,11 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.npm.taobao.org/word-wrap/download/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha1-YQY29rH3A4kb00dxzLF/uTtHB5w= + worker-farm@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" @@ -5407,6 +6456,14 @@ wrap-ansi@^2.0.0: string-width "^1.0.1" strip-ansi "^3.0.1" +wrap-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" + integrity sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo= + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" @@ -5421,6 +6478,13 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +write@1.0.3: + version "1.0.3" + resolved "https://registry.npm.taobao.org/write/download/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha1-CADhRSO5I6OH5BUSPIZWFqrg9cM= + dependencies: + mkdirp "^0.5.1" + ws@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" @@ -5443,6 +6507,13 @@ yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== +yargs-parser@^10.0.0: + version "10.1.0" + resolved "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + integrity sha1-cgImW4n36eny5XZeD+c1qQXtuqg= + dependencies: + camelcase "^4.1.0" + yargs-parser@^11.1.1: version "11.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" From bd1a251e02075e4722bdc3acbb9d35f74e6d9563 Mon Sep 17 00:00:00 2001 From: pjshy Date: Thu, 26 Dec 2019 23:16:17 +0800 Subject: [PATCH 2/4] refactor: convert js to ts --- .eslintignore | 1 + package.json | 3 +- src/cm/keymap_vim.d.ts | 11 ++++ src/index.ts | 12 ++-- src/{statusbar.js => statusbar.ts} | 88 ++++++++++++++++++++---------- tools/eslint-pre-commit.js | 0 webpack.config.js | 15 ++--- 7 files changed, 83 insertions(+), 47 deletions(-) create mode 100644 src/cm/keymap_vim.d.ts rename src/{statusbar.js => statusbar.ts} (62%) delete mode 100644 tools/eslint-pre-commit.js diff --git a/.eslintignore b/.eslintignore index 468bb89..399d4f7 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,4 @@ node_modules dist lib +*.d.ts diff --git a/package.json b/package.json index 1aab40d..66176ec 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "description": "Vim keybindings for monaco-editor", "main": "./lib/index.js", "scripts": { + "test": "echo \"No test in this repo\"", "start": "webpack-dev-server --mode development --host=0.0.0.0 --port=8080", "lint": "eslint . --ext .js,.ts --cache --cache-location ./.cache-eslint/", "clean": "rm -rf lib dist local", @@ -57,7 +58,7 @@ "lint-staged": { "*.@(ts|tsx|js|jsx)": [ "prettier --write", - "yarn lint -- --fix", + "yarn lint --fix", "git add" ] }, diff --git a/src/cm/keymap_vim.d.ts b/src/cm/keymap_vim.d.ts new file mode 100644 index 0000000..96bc62c --- /dev/null +++ b/src/cm/keymap_vim.d.ts @@ -0,0 +1,11 @@ +import { editor } from 'monaco-editor' + +export default class VimMode { + constructor(editor: editor.IStandaloneCodeEditor) + + attach(): void + + on(key: string, callback: any): void + + setStatusBar(bar: any): void +} diff --git a/src/index.ts b/src/index.ts index b4e62fb..dd6beb4 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,12 +1,12 @@ import { editor } from 'monaco-editor' import { default as VimMode } from './cm/keymap_vim' -import StatusBar from './statusbar' +import { VimStatusBar } from './statusbar' export function initVimMode( editor: editor.IStandaloneCodeEditor, - statusbarNode = null, - StatusBarClass = StatusBar, + statusbarNode: HTMLElement | null = null, + StatusBarClass = VimStatusBar, sanitizer = null, ) { const vimAdapter = new VimMode(editor) @@ -19,11 +19,11 @@ export function initVimMode( const statusBar = new StatusBarClass(statusbarNode, editor, sanitizer) let keyBuffer = '' - vimAdapter.on('vim-mode-change', (mode) => { + vimAdapter.on('vim-mode-change', (mode: any) => { statusBar.setMode(mode) }) - vimAdapter.on('vim-keypress', (key) => { + vimAdapter.on('vim-keypress', (key: any) => { if (key === ':') { keyBuffer = '' } else { @@ -49,5 +49,3 @@ export function initVimMode( return vimAdapter } - -export { VimMode, StatusBar } diff --git a/src/statusbar.js b/src/statusbar.ts similarity index 62% rename from src/statusbar.js rename to src/statusbar.ts index 82f6f3a..af4b987 100644 --- a/src/statusbar.js +++ b/src/statusbar.ts @@ -1,22 +1,40 @@ -export default class VimStatusBar { - constructor(node, editor, sanitizer = null) { +import { editor } from 'monaco-editor' + +export class VimStatusBar { + private node: HTMLElement | null + + private editor: editor.IStandaloneCodeEditor + + private modeInfoNode = document.createElement('span') + + private secInfoNode = document.createElement('span') + + private notifNode = document.createElement('span') + + private keyInfoNode = document.createElement('span') + + private input: null | { node: HTMLInputElement; options: any; callback: any } = null + + private notifTimeout: number | null = null + + private sanitizer: null | ((content: string) => HTMLElement) + + constructor(node: HTMLElement | null, editor: editor.IStandaloneCodeEditor, sanitizer = null) { this.node = node - this.modeInfoNode = document.createElement('span') - this.secInfoNode = document.createElement('span') - this.notifNode = document.createElement('span') + if (this.node) { + this.node.appendChild(this.modeInfoNode) + this.node.appendChild(this.secInfoNode) + this.node.appendChild(this.notifNode) + this.node.appendChild(this.keyInfoNode) + } this.notifNode.className = 'vim-notification' - this.keyInfoNode = document.createElement('span') this.keyInfoNode.setAttribute('style', 'float: right') - this.node.appendChild(this.modeInfoNode) - this.node.appendChild(this.secInfoNode) - this.node.appendChild(this.notifNode) - this.node.appendChild(this.keyInfoNode) this.toggleVisibility(false) this.editor = editor this.sanitizer = sanitizer } - setMode(ev) { + setMode(ev: { mode: string; subMode: string }) { if (ev.mode === 'visual' && ev.subMode === 'linewise') { this.setText('--VISUAL LINE--') return @@ -25,11 +43,11 @@ export default class VimStatusBar { this.setText(`--${ev.mode.toUpperCase()}--`) } - setKeyBuffer(key) { + setKeyBuffer(key: string) { this.keyInfoNode.textContent = key } - setSec(text, callback, options) { + setSec(text: string, callback?: any, options?: any) { this.notifNode.textContent = '' if (text === undefined) { return @@ -62,22 +80,20 @@ export default class VimStatusBar { return this.closeInput } - setText(text) { + setText(text: string) { this.modeInfoNode.textContent = text } - toggleVisibility(toggle) { - if (toggle) { - this.node.style.display = 'block' - } else { - this.node.style.display = 'none' + toggleVisibility(toggle: boolean) { + if (this.node) { + this.node.style.display = toggle ? 'block' : 'none' } if (this.input) { this.removeInputListeners() } - clearInterval(this.notifTimeout) + this.notifTimeout && clearInterval(this.notifTimeout) } closeInput = () => { @@ -94,14 +110,19 @@ export default class VimStatusBar { this.setInnerHtml_(this.node, '') } - inputKeyUp = (e) => { - const { options } = this.input - if (options && options.onKeyUp) { - options.onKeyUp(e, e.target.value, this.closeInput) + inputKeyUp = (e: any) => { + if (this.input) { + const { options } = this.input + if (options && options.onKeyUp) { + options.onKeyUp(e, e.target.value, this.closeInput) + } } } inputBlur = () => { + if (!this.input) { + return + } const { options } = this.input if (options.closeOnBlur) { @@ -109,7 +130,10 @@ export default class VimStatusBar { } } - inputKeyDown = (e) => { + inputKeyDown = (e: any) => { + if (!this.input) { + return + } const { options, callback } = this.input if (options && options.onKeyDown && options.onKeyDown(e, e.target.value, this.closeInput)) { @@ -130,10 +154,12 @@ export default class VimStatusBar { } addInputListeners() { + if (!this.input) { + return + } const { node } = this.input node.addEventListener('keyup', this.inputKeyUp) node.addEventListener('keydown', this.inputKeyDown) - node.addEventListener('input', this.inputKeyInput) node.addEventListener('blur', this.inputBlur) } @@ -145,20 +171,22 @@ export default class VimStatusBar { const { node } = this.input node.removeEventListener('keyup', this.inputKeyUp) node.removeEventListener('keydown', this.inputKeyDown) - node.removeEventListener('input', this.inputKeyInput) node.removeEventListener('blur', this.inputBlur) } - showNotification(text) { + showNotification(text: string) { const sp = document.createElement('span') this.setInnerHtml_(sp, text) this.notifNode.textContent = sp.textContent - this.notifTimeout = setTimeout(() => { + this.notifTimeout = window.setTimeout(() => { this.notifNode.textContent = '' }, 5000) } - setInnerHtml_(element, htmlContents) { + setInnerHtml_(element: HTMLElement | null, htmlContents: string) { + if (!element) { + return + } if (this.sanitizer) { // Clear out previous contents first. while (element.children.length) { diff --git a/tools/eslint-pre-commit.js b/tools/eslint-pre-commit.js deleted file mode 100644 index e69de29..0000000 diff --git a/webpack.config.js b/webpack.config.js index 6a47e9f..2d77a3a 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -30,14 +30,15 @@ module.exports = (_env, argv) => { 'monaco-vim': isProd ? './src/index.ts' : './example/demo.js', }, output: getOutput(isProd), + resolve: { + extensions: ['.wasm', '.mjs', '.js', '.json', '.ts'], + }, module: { rules: [ { - test: /\.(js|ts)$/, + test: /\.(t|j)sx?$/, exclude: /node_modules/, - use: { - loader: 'ts-loader', - }, + loader: 'ts-loader', }, { test: /\.css$/, @@ -45,11 +46,7 @@ module.exports = (_env, argv) => { }, { test: /\.(ttf|eot|woff|woff2)$/i, - use: [ - { - loader: 'file-loader', - }, - ], + use: 'file-loader', }, ], }, From 492b94bed44addfa31dbbe1b98839b8d8a231eca Mon Sep 17 00:00:00 2001 From: pjshy Date: Fri, 27 Dec 2019 14:47:46 +0800 Subject: [PATCH 3/4] fix: remove useless config --- .travis.yml | 2 +- babel.config.js | 4 ---- package.json | 13 +++++-------- tsconfig.json | 1 + 4 files changed, 7 insertions(+), 13 deletions(-) delete mode 100644 babel.config.js diff --git a/.travis.yml b/.travis.yml index db06e8a..6e11407 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: node_js node_js: - - "12" + - stable install: "yarn install" before_deploy: "yarn build" cache: yarn diff --git a/babel.config.js b/babel.config.js deleted file mode 100644 index 8ab2e22..0000000 --- a/babel.config.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - presets: ['@babel/preset-env'], - plugins: ['@babel/plugin-syntax-dynamic-import', 'transform-class-properties'], -} diff --git a/package.json b/package.json index 66176ec..0fe7a70 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,12 @@ "name": "monaco-vim", "version": "0.1.4", "description": "Vim keybindings for monaco-editor", + "types": "./lib/index.d.ts", "main": "./lib/index.js", + "files": [ + "lib", + "src" + ], "scripts": { "test": "echo \"No test in this repo\"", "start": "webpack-dev-server --mode development --host=0.0.0.0 --port=8080", @@ -18,14 +23,6 @@ "monaco-editor", "vim" ], - "files": [ - "dist", - "lib", - "src", - "LICENSE", - "LICENSE.codemirror.txt", - "README.md" - ], "author": "Brijesh Bittu (http://bitwiser.in/)", "license": "MIT", "devDependencies": { diff --git a/tsconfig.json b/tsconfig.json index f97bccc..f8b0d64 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -21,6 +21,7 @@ ], "sourceMap": false, + "declaration": true, "importHelpers": true, "newLine": "LF", "skipLibCheck": true, From 3b0076375dc4cb4dcb0db285f87e121f5cbdd0eb Mon Sep 17 00:00:00 2001 From: pjshy Date: Fri, 27 Dec 2019 18:19:06 +0800 Subject: [PATCH 4/4] fix: build error --- src/cm/keymap_vim.js | 17 ++++++---- src/cm_adapter.d.ts | 5 +++ src/cm_adapter.js | 76 ++++++++++++++++++++++---------------------- 3 files changed, 53 insertions(+), 45 deletions(-) create mode 100644 src/cm_adapter.d.ts diff --git a/src/cm/keymap_vim.js b/src/cm/keymap_vim.js index 6fdc180..420cffe 100644 --- a/src/cm/keymap_vim.js +++ b/src/cm/keymap_vim.js @@ -40,6 +40,13 @@ import CodeMirror from '../cm_adapter' +/** Wrapper for special keys pressed in insert mode */ +class InsertModeKey { + constructor(keyName) { + this.keyName = keyName + } +} + var defaultKeymap = [ // Key to key mapping. This goes first to make it possible to override // existing mappings. @@ -2864,8 +2871,9 @@ var Vim = function() { curEnd = Pos(curStart.line, replaceTo) } if (replaceWith == '\n') { - if (!vim.visualMode) cm.replaceRange('', curStart, curEnd) - // special case, where vim help says to replace by just one line-break + if (!vim.visualMode) + cm.replaceRange('', curStart, curEnd) + // special case, where vim help says to replace by just one line-break ;(CodeMirror.commands.newlineAndIndentContinueComment || CodeMirror.commands.newlineAndIndent)(cm) } else { var replaceWithStr = cm.getRange(curStart, curEnd) @@ -5691,11 +5699,6 @@ var Vim = function() { } } - /** Wrapper for special keys pressed in insert mode */ - function InsertModeKey(keyName) { - this.keyName = keyName - } - /** * Handles raw key down events from the text area. * - Should only be active in insert mode. diff --git a/src/cm_adapter.d.ts b/src/cm_adapter.d.ts new file mode 100644 index 0000000..548fae0 --- /dev/null +++ b/src/cm_adapter.d.ts @@ -0,0 +1,5 @@ +import { editor } from 'monaco-editor' + +export default class CMAdapter { + constructor(editor: editor.IStandaloneCodeEditor) +} diff --git a/src/cm_adapter.js b/src/cm_adapter.js index 02cb955..300d739 100644 --- a/src/cm_adapter.js +++ b/src/cm_adapter.js @@ -57,28 +57,28 @@ if (String.prototype.normalize) { } } -const StringStream = function(string, tabSize) { - this.pos = this.start = 0 - this.string = string - this.tabSize = tabSize || 8 - this.lastColumnPos = this.lastColumnValue = 0 - this.lineStart = 0 -} +class StringStream { + constructor(string, tabSize) { + this.pos = this.start = 0 + this.string = string + this.tabSize = tabSize || 8 + this.lastColumnPos = this.lastColumnValue = 0 + this.lineStart = 0 + } -StringStream.prototype = { - eol: function() { + eol() { return this.pos >= this.string.length - }, - sol: function() { + } + sol() { return this.pos === this.lineStart - }, - peek: function() { + } + peek() { return this.string.charAt(this.pos) || undefined - }, - next: function() { + } + next() { if (this.pos < this.string.length) return this.string.charAt(this.pos++) - }, - eat: function(match) { + } + eat(match) { const ch = this.string.charAt(this.pos) let ok if (typeof match === 'string') { @@ -90,37 +90,37 @@ StringStream.prototype = { ++this.pos return ch } - }, - eatWhile: function(match) { + } + eatWhile(match) { const start = this.pos // while (this.eat(match)){} return this.pos > start - }, - eatSpace: function() { + } + eatSpace() { const start = this.pos while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos return this.pos > start - }, - skipToEnd: function() { + } + skipToEnd() { this.pos = this.string.length - }, - skipTo: function(ch) { + } + skipTo(ch) { const found = this.string.indexOf(ch, this.pos) if (found > -1) { this.pos = found return true } - }, - backUp: function(n) { + } + backUp(n) { this.pos -= n - }, - column: function() { + } + column() { throw 'not implemented' - }, - indentation: function() { + } + indentation() { throw 'not implemented' - }, - match: function(pattern, consume, caseInsensitive) { + } + match(pattern, consume, caseInsensitive) { if (typeof pattern === 'string') { const cased = function(str) { return caseInsensitive ? str.toLowerCase() : str @@ -136,18 +136,18 @@ StringStream.prototype = { if (match && consume !== false) this.pos += match[0].length return match } - }, - current: function() { + } + current() { return this.string.slice(this.start, this.pos) - }, - hideFirstChars: function(n, inner) { + } + hideFirstChars(n, inner) { this.lineStart += n try { return inner() } finally { this.lineStart -= n } - }, + } } function toCmPos(pos) {