From 7f829a6336a4c21f7d7203fb1bd7ff4dc3474b8c Mon Sep 17 00:00:00 2001 From: Yatao Li Date: Mon, 16 Sep 2019 18:41:38 +0800 Subject: [PATCH] taking shape --- .gitignore | 2 + index.ts | 3 + package-lock.json | 470 +++++++++++++++++++++++++++++++++++++++++++++- package.json | 9 +- platform.ts | 105 ++++++----- repl.ts | 73 ++++--- tsconfig.json | 3 +- utils.ts | 44 ++++- 8 files changed, 619 insertions(+), 90 deletions(-) create mode 100644 index.ts diff --git a/.gitignore b/.gitignore index 9209ef5..d1bffee 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ node_modules out +publish +coc-utils-*.tgz diff --git a/index.ts b/index.ts new file mode 100644 index 0000000..942e34b --- /dev/null +++ b/index.ts @@ -0,0 +1,3 @@ +export * from "./repl" +export * from "./platform" +export * from "./utils" diff --git a/package-lock.json b/package-lock.json index 70fb6b1..08118cf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "coc-utils", - "version": "0.0.1", + "version": "0.0.5", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -19,6 +19,12 @@ "integrity": "sha512-p/sGgiPaathCfOtqu2fx5Mu1bcjuP8ALFg4xpGgNkcin7LwRyzUKniEHBKdcE1RPsenq5JVPIpMTJSygLboygQ==", "dev": true }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, "async": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", @@ -56,12 +62,29 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, "chownr": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==", "dev": true }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, "coc.nvim": { "version": "0.0.73", "resolved": "https://registry.npmjs.org/coc.nvim/-/coc.nvim-0.0.73.tgz", @@ -118,6 +141,12 @@ } } }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -159,18 +188,60 @@ "ms": "2.0.0" } }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true }, + "dts-dom": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/dts-dom/-/dts-dom-3.3.0.tgz", + "integrity": "sha512-k1ZsLGLxU8cd32cLL2DL5LmM5vvbaPMqnqnIqnvI5Wy22vr8M2LUuk3FFcEDKxSX+6h4G1TGQE7MDv2sRQk5Fg==", + "dev": true + }, + "dts-gen": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/dts-gen/-/dts-gen-0.5.8.tgz", + "integrity": "sha512-kIAV6dlHaF7r5J+tIuOC1BJls2P72YM0cyWQUR88zcJEpX2ccRZe+HmXLfkkvfPwjvSO3FEqUiyC8On/grx5qw==", + "dev": true, + "requires": { + "dts-dom": "^3.3.0", + "parse-git-config": "^1.1.1", + "typescript": "^3.5.1", + "yargs": "^4.8.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, "event-lite": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/event-lite/-/event-lite-0.1.2.tgz", "integrity": "sha512-HnSYx1BsJ87/p6swwzv+2v6B4X+uxUteoDfRxsAb1S1BePzQqOLevVmkdA15GHJVd9A9Ok6wygUR18Hu0YeV9g==", "dev": true }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, "extract-zip": { "version": "1.6.7", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", @@ -205,6 +276,16 @@ "pend": "~1.2.0" } }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, "flatted": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", @@ -234,6 +315,12 @@ } } }, + "fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", + "dev": true + }, "fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -259,6 +346,23 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "git-config-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/git-config-path/-/git-config-path-1.0.1.tgz", + "integrity": "sha1-bTP37WPbDQ4RgTFQO6s6ykfVRmQ=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "fs-exists-sync": "^0.1.0", + "homedir-polyfill": "^1.0.0" + } + }, "glob": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", @@ -278,6 +382,21 @@ "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", "dev": true }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", + "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", + "dev": true + }, "ieee754": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", @@ -310,6 +429,39 @@ "integrity": "sha1-J3siiofZWtd30HwTgyAiQGpHNCM=", "dev": true }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -345,12 +497,40 @@ "graceful-fs": "^4.1.6" } }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, "log4js": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.5.1.tgz", @@ -485,6 +665,32 @@ "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", "dev": true }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -493,16 +699,99 @@ "wrappy": "1" } }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "parse-git-config": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/parse-git-config/-/parse-git-config-1.1.1.tgz", + "integrity": "sha1-06mYQxcTL1c5hxK7pDjhKVkN34w=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "fs-exists-sync": "^0.1.0", + "git-config-path": "^1.0.1", + "ini": "^1.3.4" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -528,6 +817,27 @@ } } }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", @@ -542,6 +852,27 @@ "util-deprecate": "~1.0.1" } }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, "rfc-3986": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/rfc-3986/-/rfc-3986-1.0.1.tgz", @@ -573,6 +904,44 @@ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, "streamroller": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.6.tgz", @@ -603,6 +972,17 @@ } } }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -611,6 +991,24 @@ "safe-buffer": "~5.1.0" } }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -671,6 +1069,16 @@ "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", "dev": true }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "vscode-jsonrpc": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz", @@ -705,17 +1113,77 @@ "isexe": "^2.0.0" } }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, "yallist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", "dev": true }, + "yargs": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", + "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", + "dev": true, + "requires": { + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "lodash.assign": "^4.0.3", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.1", + "which-module": "^1.0.0", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^2.4.1" + } + }, + "yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" + } + }, "yauzl": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", diff --git a/package.json b/package.json index 538a03d..f51753f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "coc-utils", - "version": "0.0.1", + "version": "0.0.5", "description": "Utilities for coc.nvim extensions", "main": "out/index.js", "scripts": { @@ -17,12 +17,15 @@ }, "devDependencies": { "@types/node": "^10.3.3", - "typescript": "^3.0.3", - "coc.nvim": ">=0.0.71" + "coc.nvim": ">=0.0.71", + "typescript": "^3.0.3" }, "engines": { "coc": ">=0.0.71" }, + "files": [ + "out" + ], "repository": { "type": "git", "url": "git+https://github.com/coc-extensions/coc-utils.git" diff --git a/platform.ts b/platform.ts index 839782f..a9e3639 100644 --- a/platform.ts +++ b/platform.ts @@ -2,15 +2,14 @@ * Copyright (C) Microsoft Corporation. All rights reserved. *--------------------------------------------------------*/ -import { workspace, extensions, ExtensionContext } from 'coc.nvim' -import {sleep} from "./utils" +import {workspace, extensions, ExtensionContext} from 'coc.nvim' +import {httpsGet, httpsGetJson} from "./utils" import fs = require("fs"); import path = require("path"); import process = require("process"); -import { IncomingMessage, RequestOptions, Agent } from 'http' -import { parse } from 'url' +import {IncomingMessage, RequestOptions, Agent, get} from 'http' +import {parse} from 'url' const tunnel = require('tunnel') -const followRedirects = require("follow-redirects") const unzip = require("extract-zip"); const rimraf = require("rimraf") @@ -47,12 +46,11 @@ export function getPlatformDetails(): IPlatformDetails { }; } -export function getPlatformSignature(): string -{ +export function getPlatformSignature(): string { const plat = getPlatformDetails() - const os_sig = (()=>{ - switch(plat.operatingSystem){ + const os_sig = (() => { + switch (plat.operatingSystem) { case OperatingSystem.Windows: return "win" case OperatingSystem.Linux: return "linux" case OperatingSystem.MacOS: return "osx" @@ -60,91 +58,100 @@ export function getPlatformSignature(): string } })() - const arch_sig = (()=>{ - if(plat.isProcess64Bit) return "x64" + const arch_sig = (() => { + if (plat.isProcess64Bit) return "x64" else return "x86" })() return `${os_sig}-${arch_sig}` } -export interface ILanguageServerPackage -{ +export interface ILanguageServerPackage { + // the executable of the language server, + // in the downloaded and extracted package executable: string - downloadUrl: string + platformPath: string } -export interface ILanguageServerRepository -{ - [platform:string]: ILanguageServerPackage +export interface ILanguageServerPackages { + [platform: string]: ILanguageServerPackage } -export type LanguageServerDownloadChannel = - | { type: "nightly" } - | { type: "latest" } - | { type: "specific-tag" } +export type LanguageServerRepository = + | {kind: "github", repo: string, channel: string} + | {kind: "url-prefix", url: string} -export class LanguageServerProvider -{ +interface IGithubAsset { + name: string + browser_download_url: string +} + +interface IGithubRelease { + assets: IGithubAsset[] +} + +export class LanguageServerProvider { private extensionStoragePath: string + private languageServerName: string private languageServerDirectory: string private languageServerZip: string private languageServerExe: string private languageServerPackage: ILanguageServerPackage - constructor(private extension: ExtensionContext, private repo: ILanguageServerRepository, private channel: LanguageServerDownloadChannel) - { + constructor(extension: ExtensionContext, name: string, packs: ILanguageServerPackages, private repo: LanguageServerRepository) { const platsig = getPlatformSignature() + this.languageServerName = name this.extensionStoragePath = extension.storagePath - this.languageServerPackage = repo[platsig] + this.languageServerPackage = packs[platsig] - if(!this.languageServerPackage) { throw "Platform not supported" } + if (!this.languageServerPackage) {throw "Platform not supported"} this.languageServerDirectory = path.join(this.extensionStoragePath, "server") this.languageServerZip = this.languageServerDirectory + ".zip" this.languageServerExe = path.join(this.languageServerDirectory, this.languageServerPackage.executable) } + async getDownloadUrl(platfile: string): Promise { + if (this.repo.kind === "github") { + let {repo: repo, channel: channel} = this.repo + let api_url = `https://api.github.com/repos/${repo}/releases/${channel}` + let api_result = await httpsGetJson(api_url) + let matched_assets = api_result.assets.filter(x => x.name === platfile) + return matched_assets[0].browser_download_url + } else if (this.repo.kind === "url-prefix") { + return `${this.repo.url}/${platfile}` + } + throw new Error("unsupported repo kind.") + } + public async downloadLanguageServer(): Promise { let item = workspace.createStatusBarItem(0, {progress: true}) - item.text = "Downloading F# Language Server" + item.text = `Downloading ${this.languageServerName}` item.show() - if(!fs.existsSync(this.extensionStoragePath)) { + if (!fs.existsSync(this.extensionStoragePath)) { fs.mkdirSync(this.extensionStoragePath) } - if(fs.existsSync(this.languageServerDirectory)){ + if (fs.existsSync(this.languageServerDirectory)) { rimraf.sync(this.languageServerDirectory) } - let url = this.languageServerPackage.downloadUrl - - if(this.channel.type === "nightly") - { - url = url.replace("RELEASE", "nightly") - } + let platfile = this.languageServerPackage.platformPath + let url = await this.getDownloadUrl(platfile) fs.mkdirSync(this.languageServerDirectory) - await new Promise((resolve, reject) => { - const req = followRedirects.https.request(url, (res: IncomingMessage) => { - if (res.statusCode != 200) { - reject(new Error(`Invalid response from ${url}: ${res.statusCode}`)) - return - } - let file = fs.createWriteStream(this.languageServerZip) - let stream = res.pipe(file) - stream.on('finish', resolve) - }) - req.on('error', reject) - req.end() + await httpsGet(url, (resolve, _, res) => { + let file = fs.createWriteStream(this.languageServerZip) + let stream = res.pipe(file) + stream.on('finish', resolve) }) await new Promise((resolve, reject) => { unzip(this.languageServerZip, {dir: this.languageServerDirectory}, (err: any) => { - if(err) reject(err) + if (err) reject(err) else resolve() }) }) diff --git a/repl.ts b/repl.ts index 33db1b1..2d651b5 100644 --- a/repl.ts +++ b/repl.ts @@ -79,40 +79,57 @@ export class REPLProcess { } } -let currentREPL: REPLProcess = undefined -async function createREPL () { - if(currentREPL) { - currentREPL.dispose() - currentREPL = undefined - } - currentREPL = new REPLProcess("F# REPL", "dotnet", ["fsi", "--readline+"]) - currentREPL.onExited(() => { - currentREPL = undefined - }) - await currentREPL.start() - return currentREPL.onExited +export interface IREPLDescriptor +{ + filetype: string + title: string + command: string + args: string[] + // some REPLs require a special sequence to be sent + // to commit evaluation. + commit: string } +export class REPLProvider { + private m_proc: REPLProcess = undefined -export async function doEval(mode: string) { - - let document = await workspace.document - if (!document || document.filetype !== 'fsharp') { - return + constructor(public desc: IREPLDescriptor) { } - if(!currentREPL) { - await createREPL() + async createREPL() { + if (this.m_proc) { + this.m_proc.dispose() + this.m_proc = undefined + } + this.m_proc = new REPLProcess(this.desc.title, this.desc.command, this.desc.args) + this.m_proc.onExited(() => { + this.m_proc = undefined + }) + await this.m_proc.start() + return this.m_proc.onExited } - // TODO: move to workspace.getCurrentSelection when we get an answer: - // https://github.com/neoclide/coc.nvim/issues/933 - const content = await getCurrentSelection(mode) - for(let line of content){ - await currentREPL.eval(line) + public async eval(mode: string) { + + let document = await workspace.document + if (!document || document.filetype !== this.desc.filetype) { + return + } + + if (!this.m_proc) { + await this.createREPL() + } + + // TODO: move to workspace.getCurrentSelection when we get an answer: + // https://github.com/neoclide/coc.nvim/issues/933 + const content = await getCurrentSelection(mode) + for (let line of content) { + await this.m_proc.eval(line) + } + await this.m_proc.eval(this.desc.commit) + // see :help feedkeys + await workspace.nvim.call('eval', `feedkeys("\\${content.length}j", "in")`) + // await currentREPL.scrollToBottom() } - await currentREPL.eval(";;") - // see :help feedkeys - await workspace.nvim.call('eval', `feedkeys("\\${content.length}j", "in")`) - // await currentREPL.scrollToBottom() } + diff --git a/tsconfig.json b/tsconfig.json index 87fe401..1dea967 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,7 +12,8 @@ "lib": [ "es2016" ], "sourceMap": true, "allowSyntheticDefaultImports": true, - "esModuleInterop": true + "esModuleInterop": true, + "declaration": true }, "exclude": [ "node_modules" diff --git a/utils.ts b/utils.ts index 18204b8..436e4f4 100644 --- a/utils.ts +++ b/utils.ts @@ -7,10 +7,11 @@ import fs = require("fs"); import os = require("os"); import path = require("path"); -import { workspace, ExtensionContext, commands, TerminalResult } from 'coc.nvim'; -import { Uri } from 'coc.nvim' -import { Range } from 'vscode-languageserver-protocol'; -import {REPLProcess} from './repl'; +import {workspace} from 'coc.nvim'; +import {Uri} from 'coc.nvim' +import {IncomingMessage} from 'http'; + +const followRedirects = require("follow-redirects") export function fileURLToPath(x: string) { return Uri.parse(x).fsPath @@ -64,11 +65,10 @@ export async function getCurrentSelection(mode: string) { let doc = await workspace.document if (mode === "v" || mode === "V") { - let [from, _ ] = await doc.buffer.mark("<") - let [to, __ ] = await doc.buffer.mark(">") + let [from,] = await doc.buffer.mark("<") + let [to,] = await doc.buffer.mark(">") let result: string[] = [] - for(let i = from; i <= to; ++i) - { + for (let i = from; i <= to; ++i) { result.push(doc.getline(i - 1)) } return result @@ -87,3 +87,31 @@ export async function getCurrentSelection(mode: string) { return [] } +export function httpsGet( + url: string, + cb: (resolve: (value?: T | PromiseLike) => void, + reject: (reason?: any) => void, + res: IncomingMessage) + => void) { + return new Promise((resolve, reject) => { + const req = followRedirects.https.request(url, (res: IncomingMessage) => { + if (res.statusCode != 200) { + reject(new Error(`Invalid response from ${url}: ${res.statusCode}`)) + return + } + cb(resolve, reject, res) + }) + req.on('error', reject) + req.end() + }) +} + +export function httpsGetJson(url: string): Promise { + return httpsGet(url, (resolve, reject, response) => { + let data = '' + response.on('data', chunk => data += chunk) + response.on('end', () => { + resolve(JSON.parse(data)) + }) + }) +}