summaryrefslogtreecommitdiff
path: root/.config/coc/extensions/node_modules/coc-go/lib/utils
diff options
context:
space:
mode:
authorJacob McDonnell <jacob@simplelittledream.com>2022-07-16 18:13:16 -0400
committerJacob McDonnell <jacob@simplelittledream.com>2022-07-16 18:13:16 -0400
commit8fad9a5ecddc88d57a531e4b0084544984f23d25 (patch)
tree84954bc8219942aa56bc899330ccd0007bbe0ef0 /.config/coc/extensions/node_modules/coc-go/lib/utils
parent2887af7fcfb4d618dd13cf66ec2fbdbd84c7527c (diff)
Added profile and other missing configs
Diffstat (limited to '.config/coc/extensions/node_modules/coc-go/lib/utils')
-rw-r--r--.config/coc/extensions/node_modules/coc-go/lib/utils/checktag.js23
-rw-r--r--.config/coc/extensions/node_modules/coc-go/lib/utils/config.js57
-rw-r--r--.config/coc/extensions/node_modules/coc-go/lib/utils/fs.js15
-rw-r--r--.config/coc/extensions/node_modules/coc-go/lib/utils/fs.test.js29
-rw-r--r--.config/coc/extensions/node_modules/coc-go/lib/utils/impl.js43
-rw-r--r--.config/coc/extensions/node_modules/coc-go/lib/utils/lspcommands.js10
-rw-r--r--.config/coc/extensions/node_modules/coc-go/lib/utils/modify-tags.js113
-rw-r--r--.config/coc/extensions/node_modules/coc-go/lib/utils/playground.js22
-rw-r--r--.config/coc/extensions/node_modules/coc-go/lib/utils/request.js28
-rw-r--r--.config/coc/extensions/node_modules/coc-go/lib/utils/tests.js85
-rw-r--r--.config/coc/extensions/node_modules/coc-go/lib/utils/tests.test.js21
-rw-r--r--.config/coc/extensions/node_modules/coc-go/lib/utils/tools.js149
-rw-r--r--.config/coc/extensions/node_modules/coc-go/lib/utils/ui.js21
-rw-r--r--.config/coc/extensions/node_modules/coc-go/lib/utils/versions.js33
-rw-r--r--.config/coc/extensions/node_modules/coc-go/lib/utils/versions.test.js59
15 files changed, 708 insertions, 0 deletions
diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/checktag.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/checktag.js
new file mode 100644
index 0000000..053604a
--- /dev/null
+++ b/.config/coc/extensions/node_modules/coc-go/lib/utils/checktag.js
@@ -0,0 +1,23 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const request_1 = require("./request");
+const releaseFilter = /^v\d+\.\d+\.\d+$/;
+async function checkLatestTag(repo, prefixFilter) {
+ const data = await (0, request_1.getJSON)(`https://api.github.com/repos/${repo}/tags`);
+ if (!Array.isArray(data)) {
+ return '';
+ }
+ let tags = data.map(t => t.name);
+ if (prefixFilter) {
+ tags = tags
+ .filter(t => t.match(prefixFilter))
+ .map(t => t.replace(prefixFilter, ''));
+ }
+ tags = tags
+ .filter(t => t.match(releaseFilter));
+ return tags.length > 0
+ ? tags[0].replace(/^v/, '')
+ : '';
+}
+exports.default = checkLatestTag;
+//# sourceMappingURL=checktag.js.map \ No newline at end of file
diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/config.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/config.js
new file mode 100644
index 0000000..d60955c
--- /dev/null
+++ b/.config/coc/extensions/node_modules/coc-go/lib/utils/config.js
@@ -0,0 +1,57 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.setState = exports.getState = exports.configDir = exports.setStoragePath = exports.getConfig = void 0;
+const tslib_1 = require("tslib");
+const path_1 = tslib_1.__importDefault(require("path"));
+const os_1 = tslib_1.__importDefault(require("os"));
+const fs_1 = tslib_1.__importDefault(require("fs"));
+const coc_nvim_1 = require("coc.nvim");
+const fs_2 = require("./fs");
+const state = {};
+function getConfig() {
+ return coc_nvim_1.workspace.getConfiguration().get("go");
+}
+exports.getConfig = getConfig;
+function setStoragePath(dir) {
+ state.storagePath = dir;
+}
+exports.setStoragePath = setStoragePath;
+async function configDir(...names) {
+ const storage = state.storagePath || path_1.default.join(os_1.default.homedir(), ".config", "coc", "go");
+ const dir = path_1.default.join(storage, ...names);
+ return new Promise((resolve) => {
+ (0, fs_2.createDir)(dir);
+ resolve(dir);
+ });
+}
+exports.configDir = configDir;
+async function stateFile() {
+ return path_1.default.join(await configDir(), 'state.json');
+}
+async function getStateData() {
+ try {
+ const f = await stateFile();
+ const d = JSON.parse(await fs_1.default.promises.readFile(f, 'utf-8'));
+ return d || {};
+ }
+ catch (err) { /* mute */ }
+ return {};
+}
+async function setStateData(data) {
+ try {
+ await fs_1.default.promises.writeFile(await stateFile(), JSON.stringify(data, null, ' '));
+ }
+ catch (err) { /* mute */ }
+}
+async function getState(key) {
+ const d = await getStateData();
+ return d[key] || '';
+}
+exports.getState = getState;
+async function setState(key, value) {
+ const d = await getStateData();
+ d[key] = value;
+ await setStateData(d);
+}
+exports.setState = setState;
+//# sourceMappingURL=config.js.map \ No newline at end of file
diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/fs.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/fs.js
new file mode 100644
index 0000000..899b1fd
--- /dev/null
+++ b/.config/coc/extensions/node_modules/coc-go/lib/utils/fs.js
@@ -0,0 +1,15 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.createDir = void 0;
+const tslib_1 = require("tslib");
+const fs_1 = tslib_1.__importDefault(require("fs"));
+const path_1 = tslib_1.__importDefault(require("path"));
+function createDir(dirPath) {
+ if (fs_1.default.existsSync(dirPath)) {
+ return;
+ }
+ createDir(path_1.default.dirname(dirPath));
+ fs_1.default.mkdirSync(dirPath);
+}
+exports.createDir = createDir;
+//# sourceMappingURL=fs.js.map \ No newline at end of file
diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/fs.test.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/fs.test.js
new file mode 100644
index 0000000..28c3ec9
--- /dev/null
+++ b/.config/coc/extensions/node_modules/coc-go/lib/utils/fs.test.js
@@ -0,0 +1,29 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const tslib_1 = require("tslib");
+const tmp_1 = tslib_1.__importDefault(require("tmp"));
+const assert_1 = tslib_1.__importDefault(require("assert"));
+const path_1 = tslib_1.__importDefault(require("path"));
+const fs_1 = tslib_1.__importDefault(require("fs"));
+const fs_2 = require("./fs");
+describe('createDir()', () => {
+ let tmpDir;
+ const joinPath = (...parts) => path_1.default.join(tmpDir.name, ...parts);
+ beforeEach(() => tmpDir = tmp_1.default.dirSync({ unsafeCleanup: true }));
+ afterEach(() => tmpDir.removeCallback());
+ it('should create a directory', () => {
+ const dirPath = joinPath('test');
+ (0, fs_2.createDir)(dirPath);
+ assert_1.default.ok(fs_1.default.existsSync(dirPath));
+ });
+ it('should create nested directories', () => {
+ const dirPath = joinPath('test', 'foo', 'bar');
+ (0, fs_2.createDir)(dirPath);
+ assert_1.default.ok(fs_1.default.existsSync(dirPath));
+ });
+ it('should not fail if directory exists', () => {
+ (0, fs_2.createDir)(tmpDir.name);
+ assert_1.default.ok(fs_1.default.existsSync(tmpDir.name));
+ });
+});
+//# sourceMappingURL=fs.test.js.map \ No newline at end of file
diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/impl.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/impl.js
new file mode 100644
index 0000000..f616827
--- /dev/null
+++ b/.config/coc/extensions/node_modules/coc-go/lib/utils/impl.js
@@ -0,0 +1,43 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.generateImplStubs = void 0;
+const coc_nvim_1 = require("coc.nvim");
+const binaries_1 = require("../binaries");
+const tools_1 = require("./tools");
+const interfaceRegex = /^(\w+ \*?\w+ )?([\w./-]+)$/;
+async function generateImplStubs(document) {
+ try {
+ const implInput = await coc_nvim_1.window.requestInput("Enter receiver and interface [f *File io.Closer]");
+ if (implInput == null) {
+ coc_nvim_1.window.showMessage("No input detected! Aborting.", "warning");
+ return;
+ }
+ const matches = implInput.match(interfaceRegex);
+ if (!matches) {
+ throw Error(`Cannot parse input: ${implInput}`);
+ }
+ const edit = await runGoImpl(document, [matches[1], matches[2]]);
+ await coc_nvim_1.workspace.applyEdit({ changes: { [document.uri]: [edit] } });
+ }
+ catch (error) {
+ coc_nvim_1.window.showMessage(error, "error");
+ }
+}
+exports.generateImplStubs = generateImplStubs;
+async function runGoImpl(document, args) {
+ const stdout = await (0, tools_1.execTool)(binaries_1.IMPL, args);
+ const { line } = await coc_nvim_1.window.getCursorPosition();
+ const insertPos = { line: line + 1, character: 0 };
+ const lineText = await coc_nvim_1.workspace.getLine(document.uri, line);
+ const newText = lineText.trim() === ''
+ ? stdout
+ : `\n${stdout}`;
+ return {
+ range: {
+ start: insertPos,
+ end: insertPos
+ },
+ newText
+ };
+}
+//# sourceMappingURL=impl.js.map \ No newline at end of file
diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/lspcommands.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/lspcommands.js
new file mode 100644
index 0000000..8e5b4c6
--- /dev/null
+++ b/.config/coc/extensions/node_modules/coc-go/lib/utils/lspcommands.js
@@ -0,0 +1,10 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.goplsTidy = void 0;
+const coc_nvim_1 = require("coc.nvim");
+async function goplsTidy() {
+ const doc = await coc_nvim_1.workspace.document;
+ await coc_nvim_1.commands.executeCommand('gopls.tidy', { URIs: [doc.uri] });
+}
+exports.goplsTidy = goplsTidy;
+//# sourceMappingURL=lspcommands.js.map \ No newline at end of file
diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/modify-tags.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/modify-tags.js
new file mode 100644
index 0000000..ca80186
--- /dev/null
+++ b/.config/coc/extensions/node_modules/coc-go/lib/utils/modify-tags.js
@@ -0,0 +1,113 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.clearTags = exports.removeTags = exports.addTags = void 0;
+const coc_nvim_1 = require("coc.nvim");
+const vscode_uri_1 = require("vscode-uri");
+const tools_1 = require("./tools");
+const binaries_1 = require("../binaries");
+////////////////////////////////////////////////////////////////////////////////
+async function addTags(document, params = {}) {
+ const config = coc_nvim_1.workspace.getConfiguration().get('go.tags', {});
+ let tags = (params.tags && params.tags.length > 0)
+ ? params.tags.join(',')
+ : (config.tags || 'json');
+ let options = (config.options || config.options === "")
+ ? config.options
+ : 'json=omitempty';
+ const transform = (config.transform || "snakecase");
+ const skipUnexported = config.skipUnexported;
+ let cursor;
+ if (params.prompt) {
+ cursor = await coc_nvim_1.window.getCursorPosition();
+ tags = await coc_nvim_1.window.requestInput('Enter comma separated tag names', tags);
+ if (!tags) {
+ return;
+ }
+ options = await coc_nvim_1.window.requestInput('Enter comma separated options', options);
+ }
+ const args = [
+ '-add-tags', tags.replace(/ +/g, ''),
+ '-override',
+ '-add-options', (options || ""),
+ '-transform', transform,
+ ...(await offsetArgs(document, (params.selection || "struct"), cursor))
+ ];
+ if (skipUnexported) {
+ args.push('--skip-unexported');
+ }
+ await runGomodifytags(document, args);
+}
+exports.addTags = addTags;
+async function removeTags(document, params = {}) {
+ const config = coc_nvim_1.workspace.getConfiguration().get('go.tags', {});
+ let tags = (params.tags && params.tags.length > 0)
+ ? params.tags.join(',')
+ : (config.tags || 'json');
+ let cursor;
+ if (params.prompt) {
+ cursor = await coc_nvim_1.window.getCursorPosition();
+ tags = await coc_nvim_1.window.requestInput('Enter comma separated tag names', tags);
+ if (!tags) {
+ return;
+ }
+ }
+ await runGomodifytags(document, [
+ '-remove-tags', (tags || "json"),
+ '-clear-options',
+ ...(await offsetArgs(document, (params.selection || "struct"), cursor))
+ ]);
+}
+exports.removeTags = removeTags;
+async function clearTags(document, params = {}) {
+ await runGomodifytags(document, [
+ '-clear-tags',
+ '-clear-options',
+ ...(await offsetArgs(document, (params.selection || "struct")))
+ ]);
+}
+exports.clearTags = clearTags;
+////////////////////////////////////////////////////////////////////////////////
+async function runGomodifytags(document, args) {
+ const fileName = vscode_uri_1.URI.parse(document.uri).fsPath;
+ args.push('-modified', '-file', fileName, '-format', 'json');
+ const input = fileArchive(fileName, document.getText());
+ const edit = await execGomodifytags(args, input);
+ await coc_nvim_1.workspace.applyEdit({ changes: { [document.uri]: [edit] } });
+}
+async function execGomodifytags(args, input) {
+ try {
+ const stdout = await (0, tools_1.execTool)(binaries_1.GOMODIFYTAGS, args, input);
+ const mods = JSON.parse(stdout);
+ return {
+ range: {
+ start: { line: mods.start - 1, character: 0 },
+ end: { line: mods.end, character: 0 }
+ },
+ newText: mods.lines.join("\n") + "\n"
+ };
+ }
+ catch (err) {
+ coc_nvim_1.window.showMessage(`Cannot modify tags: ${err}`, 'error');
+ throw err;
+ }
+}
+function fileArchive(fileName, fileContents) {
+ return fileName + '\n' + Buffer.byteLength(fileContents, 'utf8') + '\n' + fileContents;
+}
+// https://github.com/golang/vscode-go/blob/master/src/util.ts#L84
+function byteOffsetAt(document, position) {
+ const offset = document.offsetAt(position);
+ const text = document.getText();
+ return Buffer.byteLength(text.substr(0, offset)).toString();
+}
+async function offsetArgs(document, selection, cursor = null) {
+ cursor = cursor || await coc_nvim_1.window.getCursorPosition();
+ coc_nvim_1.window.showMessage(`selection = ${selection}`);
+ switch (selection) {
+ case "struct":
+ return ['-offset', byteOffsetAt(document, cursor)];
+ case "line":
+ return ['-line', String(cursor.line + 1)];
+ }
+}
+//# sourceMappingURL=modify-tags.js.map \ No newline at end of file
diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/playground.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/playground.js
new file mode 100644
index 0000000..9fef796
--- /dev/null
+++ b/.config/coc/extensions/node_modules/coc-go/lib/utils/playground.js
@@ -0,0 +1,22 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.openPlayground = void 0;
+const coc_nvim_1 = require("coc.nvim");
+const tools_1 = require("./tools");
+const binaries_1 = require("../binaries");
+async function openPlayground(document) {
+ return runGoplay(document.getText());
+}
+exports.openPlayground = openPlayground;
+async function runGoplay(code) {
+ try {
+ const stdout = await (0, tools_1.execTool)(binaries_1.GOPLAY, ['-'], code);
+ coc_nvim_1.window.showMessage(stdout);
+ return true;
+ }
+ catch (err) {
+ coc_nvim_1.window.showMessage(`${err}`, "error");
+ return false;
+ }
+}
+//# sourceMappingURL=playground.js.map \ No newline at end of file
diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/request.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/request.js
new file mode 100644
index 0000000..ad7c968
--- /dev/null
+++ b/.config/coc/extensions/node_modules/coc-go/lib/utils/request.js
@@ -0,0 +1,28 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.getJSON = void 0;
+const tslib_1 = require("tslib");
+const https_1 = tslib_1.__importDefault(require("https"));
+const options = {
+ headers: {
+ 'User-Agent': `coc-go`,
+ }
+};
+function getJSON(url) {
+ return new Promise((resolve, reject) => {
+ https_1.default.get(url, options, (res) => {
+ let body = '';
+ res.on('data', (chunk) => (body += chunk));
+ res.on('end', () => {
+ try {
+ resolve(JSON.parse(body));
+ }
+ catch (err) {
+ reject(err);
+ }
+ });
+ }).on('error', reject);
+ });
+}
+exports.getJSON = getJSON;
+//# sourceMappingURL=request.js.map \ No newline at end of file
diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/tests.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/tests.js
new file mode 100644
index 0000000..4aa14b2
--- /dev/null
+++ b/.config/coc/extensions/node_modules/coc-go/lib/utils/tests.js
@@ -0,0 +1,85 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.extractFunctionName = exports.toogleTests = exports.generateTestsFunction = exports.generateTestsExported = exports.generateTestsAll = void 0;
+const coc_nvim_1 = require("coc.nvim");
+const vscode_uri_1 = require("vscode-uri");
+const tools_1 = require("./tools");
+const binaries_1 = require("../binaries");
+////////////////////////////////////////////////////////////////////////////////
+async function generateTestsAll(document) {
+ if (isTest(document)) {
+ coc_nvim_1.window.showMessage("Document is a test file", "error");
+ return;
+ }
+ await runGotests(document, ["-all"]) && await openTests(document);
+}
+exports.generateTestsAll = generateTestsAll;
+async function generateTestsExported(document) {
+ if (isTest(document)) {
+ coc_nvim_1.window.showMessage("Document is a test file", "error");
+ return;
+ }
+ await runGotests(document, ["-exported"]) && await openTests(document);
+}
+exports.generateTestsExported = generateTestsExported;
+async function generateTestsFunction(document) {
+ if (isTest(document)) {
+ coc_nvim_1.window.showMessage("Document is a test file", "error");
+ return;
+ }
+ const { line } = await coc_nvim_1.window.getCursorPosition();
+ const text = await document.getText({
+ start: { line, character: 0 },
+ end: { line, character: Infinity },
+ });
+ coc_nvim_1.window.showMessage(text);
+ const funcName = extractFunctionName(text);
+ if (!funcName) {
+ coc_nvim_1.window.showMessage("No function found", "error");
+ return;
+ }
+ await runGotests(document, ["-only", `^${funcName}$`]) && await openTests(document);
+}
+exports.generateTestsFunction = generateTestsFunction;
+async function toogleTests(document) {
+ const targetURI = isTest(document)
+ ? sourceURI(document)
+ : testURI(document);
+ return coc_nvim_1.workspace.openResource(targetURI);
+}
+exports.toogleTests = toogleTests;
+////////////////////////////////////////////////////////////////////////////////
+async function openTests(document) {
+ return coc_nvim_1.workspace.openResource(testURI(document));
+}
+function isTest(document) {
+ return document.uri.endsWith('_test.go');
+}
+function testURI(document) {
+ return document.uri.replace(/(_test)?\.go$/, '_test.go');
+}
+function sourceURI(document) {
+ return document.uri.replace(/(_test)?\.go$/, '.go');
+}
+async function runGotests(document, args) {
+ const config = coc_nvim_1.workspace.getConfiguration().get('go.tests', {});
+ args.push(...(config.generateFlags || []), '-w', vscode_uri_1.URI.parse(document.uri).fsPath);
+ try {
+ const stdout = await (0, tools_1.execTool)(binaries_1.GOTESTS, args);
+ coc_nvim_1.window.showMessage(stdout || "");
+ return true;
+ }
+ catch (err) {
+ coc_nvim_1.window.showMessage(`Error: ${err}`, "error");
+ return false;
+ }
+}
+////////////////////////////////////////////////////////////////////////////////
+function extractFunctionName(line) {
+ const m = /^func +(\([^)]+\) +)?([^\s(]+)/.exec(line);
+ if (m) {
+ return m[2];
+ }
+}
+exports.extractFunctionName = extractFunctionName;
+//# sourceMappingURL=tests.js.map \ No newline at end of file
diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/tests.test.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/tests.test.js
new file mode 100644
index 0000000..70d0801
--- /dev/null
+++ b/.config/coc/extensions/node_modules/coc-go/lib/utils/tests.test.js
@@ -0,0 +1,21 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const tslib_1 = require("tslib");
+const assert_1 = tslib_1.__importDefault(require("assert"));
+const tests_1 = require("./tests");
+describe('extractFunctionName()', () => {
+ const cases = [
+ ['', null],
+ ['\tfuncFoo()', null],
+ ['func Foo() {', 'Foo'],
+ ['func Foo() string {', 'Foo'],
+ ['func Foo(str string) string {', 'Foo'],
+ ['func (b *Bar) Foo(str string) string {', 'Foo'],
+ ];
+ cases.forEach(([line, name]) => {
+ it(`should extract ${JSON.stringify(name)} from "${line}"`, () => {
+ assert_1.default.equal(name, (0, tests_1.extractFunctionName)(line));
+ });
+ });
+});
+//# sourceMappingURL=tests.test.js.map \ No newline at end of file
diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/tools.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/tools.js
new file mode 100644
index 0000000..375db4a
--- /dev/null
+++ b/.config/coc/extensions/node_modules/coc-go/lib/utils/tools.js
@@ -0,0 +1,149 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.execTool = exports.commandExists = exports.runBin = exports.runGoTool = exports.goBinPath = exports.installGoBin = void 0;
+const tslib_1 = require("tslib");
+const path_1 = tslib_1.__importDefault(require("path"));
+const fs_1 = tslib_1.__importDefault(require("fs"));
+const util_1 = tslib_1.__importDefault(require("util"));
+const child_process_1 = require("child_process");
+const coc_nvim_1 = require("coc.nvim");
+const which_1 = tslib_1.__importDefault(require("which"));
+const config_1 = require("./config");
+const versions_1 = require("./versions");
+const runExec = util_1.default.promisify(child_process_1.exec);
+const isWin = process.platform === 'win32';
+async function installGoBin(source, force = false, getVersion) {
+ const name = goBinName(source);
+ if (!force && await goBinExists(name)) {
+ return true;
+ }
+ const statusItem = coc_nvim_1.window.createStatusBarItem(90, { progress: true });
+ statusItem.text = `Installing '${name}'`;
+ statusItem.show();
+ const success = await goInstall(source) && await goBinExists(name);
+ if (success) {
+ const vname = getVersion ? `${name}@${await getVersion()}` : name;
+ coc_nvim_1.window.showMessage(`Installed '${vname}'`);
+ }
+ else {
+ coc_nvim_1.window.showMessage(`Failed to install '${name}'`, 'error');
+ }
+ statusItem.hide();
+ return success;
+}
+exports.installGoBin = installGoBin;
+async function goInstall(source) {
+ return await goVersionOrLater('1.17.0')
+ ? goRun(`install ${source}@latest`)
+ : goRun(`get ${source}@latest`);
+}
+async function goVersionOrLater(version) {
+ try {
+ return (0, versions_1.compareVersions)(version, await getGoVersion()) < 0;
+ }
+ catch (err) {
+ // mute
+ }
+ return false;
+}
+async function getGoVersion() {
+ try {
+ const [, out] = await runBin('go', ['version']);
+ return out.trim().match(/^go version go(\S+) .*$/)[1];
+ }
+ catch (err) {
+ // mute
+ }
+ return '';
+}
+async function goBinPath(source) {
+ const name = goBinName(source);
+ return path_1.default.join(await (0, config_1.configDir)('bin'), name + (isWin ? ".exe" : ""));
+}
+exports.goBinPath = goBinPath;
+async function runGoTool(name, args = []) {
+ return runBin(await goBinPath(name), args);
+}
+exports.runGoTool = runGoTool;
+async function runBin(bin, args = []) {
+ return new Promise((resolve) => {
+ const p = (0, child_process_1.spawn)(bin, args);
+ let out = "";
+ p.stdout.on('data', (data) => out += data);
+ p.on("close", code => resolve([code, out]));
+ });
+}
+exports.runBin = runBin;
+async function commandExists(command) {
+ if (path_1.default.isAbsolute(command)) {
+ return fileExists(command);
+ }
+ return new Promise((resolve) => { (0, which_1.default)(command, (err) => resolve(err == null)); });
+}
+exports.commandExists = commandExists;
+////////////////////////////////////////////////////////////////////////////////
+async function goBinExists(source) {
+ const name = goBinName(source);
+ const bin = await goBinPath(name);
+ return fileExists(bin);
+}
+async function fileExists(path) {
+ return new Promise((resolve) => fs_1.default.open(path, 'r', (err) => resolve(err === null)));
+}
+async function goRun(args) {
+ const gopath = await (0, config_1.configDir)('tools');
+ const gobin = await (0, config_1.configDir)('bin');
+ const env = {
+ GO111MODULE: 'on',
+ GOBIN: gobin,
+ GOPATH: gopath,
+ GOROOT: '',
+ GOTOOLDIR: '',
+ };
+ const cmd = isWin
+ ? `go ${args}`
+ : `env GOBIN="${gobin}" go ${args}`;
+ const opts = {
+ env: Object.assign({}, process.env, env),
+ cwd: gopath,
+ shell: isWin ? undefined : process.env.SHELL,
+ windowsHide: true,
+ };
+ try {
+ await runExec(cmd, opts);
+ }
+ catch (ex) {
+ coc_nvim_1.window.showMessage(ex, 'error');
+ return false;
+ }
+ return true;
+}
+async function execTool(source, args, input) {
+ const [bin, name] = await Promise.all([
+ goBinPath(source),
+ goBinName(source),
+ ]);
+ if (!await commandExists(bin)) {
+ await installGoBin(source);
+ }
+ return new Promise((resolve, reject) => {
+ const p = (0, child_process_1.execFile)(bin, args, { cwd: coc_nvim_1.workspace.cwd }, async (err, stdout, stderr) => {
+ if (err && err.code === "ENOENT") {
+ return reject(`Error: Command ${name} not found! Run "CocCommand go.install.${name}" to install it and try again.`);
+ }
+ if (err) {
+ return reject(stderr.toString());
+ }
+ return resolve(stdout.toString());
+ });
+ if (p.pid) {
+ p.stdin.end(input);
+ }
+ });
+}
+exports.execTool = execTool;
+////////////////////////////////////////////////////////////////////////////////
+function goBinName(source) {
+ return source.replace(/\/\.\.\.$/, '').split('/').pop();
+}
+//# sourceMappingURL=tools.js.map \ No newline at end of file
diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/ui.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/ui.js
new file mode 100644
index 0000000..772354e
--- /dev/null
+++ b/.config/coc/extensions/node_modules/coc-go/lib/utils/ui.js
@@ -0,0 +1,21 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.withProgress = void 0;
+const coc_nvim_1 = require("coc.nvim");
+// eslint-disable-next-line no-unused-vars
+async function withProgress(text, fn) {
+ const status = coc_nvim_1.window.createStatusBarItem(90, { progress: true });
+ // Show status item at leaste one second
+ let offset = 1000;
+ const t = setTimeout(() => (offset = 0), offset);
+ const dispose = () => {
+ clearTimeout(t);
+ setTimeout(() => status.dispose(), offset);
+ };
+ status.text = text;
+ status.show();
+ await fn(status);
+ dispose();
+}
+exports.withProgress = withProgress;
+//# sourceMappingURL=ui.js.map \ No newline at end of file
diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/versions.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/versions.js
new file mode 100644
index 0000000..1bcd82a
--- /dev/null
+++ b/.config/coc/extensions/node_modules/coc-go/lib/utils/versions.js
@@ -0,0 +1,33 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.parseVersion = exports.compareVersions = exports.isValidVersion = void 0;
+const versionExp = /^v?(\d+)\.(\d+)(\.(\d+))?$/;
+function isValidVersion(version) {
+ return Boolean(version.trim().match(versionExp));
+}
+exports.isValidVersion = isValidVersion;
+function compareVersions(version1, version2) {
+ const v1 = parseVersion(version1);
+ const v2 = parseVersion(version2);
+ for (let i = 0; i < 3; i++) {
+ if (v1[i] !== v2[i]) {
+ return Math.max(-1, Math.min(1, v1[i] - v2[i]));
+ }
+ }
+ return 0;
+}
+exports.compareVersions = compareVersions;
+function parseVersion(v) {
+ let ver = [0, 0, 0];
+ const match = v.trim().match(versionExp);
+ if (match) {
+ const [, major, minor, , patch = '0'] = match;
+ ver = [parseInt(major), parseInt(minor), parseInt(patch)];
+ }
+ if (!isValidVersion(v)) {
+ throw new Error(`'${v}' is not a valid version`);
+ }
+ return ver;
+}
+exports.parseVersion = parseVersion;
+//# sourceMappingURL=versions.js.map \ No newline at end of file
diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/versions.test.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/versions.test.js
new file mode 100644
index 0000000..640786f
--- /dev/null
+++ b/.config/coc/extensions/node_modules/coc-go/lib/utils/versions.test.js
@@ -0,0 +1,59 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const tslib_1 = require("tslib");
+const assert_1 = tslib_1.__importDefault(require("assert"));
+const versions_1 = require("./versions");
+const v0_0_0 = [0, 0, 0];
+const v1_0_0 = [1, 0, 0];
+const v1_2_0 = [1, 2, 0];
+const v1_2_3 = [1, 2, 3];
+describe('isValidVersion()', () => {
+ it('should recognise valid versions', () => {
+ assert_1.default.ok((0, versions_1.isValidVersion)('v1.0.0'));
+ assert_1.default.ok((0, versions_1.isValidVersion)('1.0.0'));
+ assert_1.default.ok((0, versions_1.isValidVersion)('0.1.0'));
+ assert_1.default.ok((0, versions_1.isValidVersion)('0.0.1'));
+ assert_1.default.ok((0, versions_1.isValidVersion)('0.0.0'));
+ assert_1.default.ok((0, versions_1.isValidVersion)('v0.0.0'));
+ });
+ it('should recognise invalid versions', () => {
+ assert_1.default.ok(!(0, versions_1.isValidVersion)('v 1.0.0'));
+ assert_1.default.ok(!(0, versions_1.isValidVersion)('1'));
+ assert_1.default.ok((0, versions_1.isValidVersion)('1.1'));
+ });
+});
+describe("parseVersion()", () => {
+ it("should parse simple versions", () => {
+ assert_1.default.deepStrictEqual((0, versions_1.parseVersion)('v0.0.0'), v0_0_0);
+ assert_1.default.deepStrictEqual((0, versions_1.parseVersion)('v1.0.0'), v1_0_0);
+ assert_1.default.deepStrictEqual((0, versions_1.parseVersion)('v1.2.0'), v1_2_0);
+ assert_1.default.deepStrictEqual((0, versions_1.parseVersion)('v1.2'), v1_2_0);
+ assert_1.default.deepStrictEqual((0, versions_1.parseVersion)('v1.2.3'), v1_2_3);
+ });
+});
+describe('compareVersions()', () => {
+ it('should compare equal version', () => {
+ assert_1.default.throws(() => (0, versions_1.compareVersions)('', ''));
+ assert_1.default.strictEqual((0, versions_1.compareVersions)('1.0.0', '1.0.0'), 0);
+ assert_1.default.strictEqual((0, versions_1.compareVersions)('1.2.0', '1.2.0'), 0);
+ assert_1.default.strictEqual((0, versions_1.compareVersions)('1.2.3', '1.2.3'), 0);
+ assert_1.default.strictEqual((0, versions_1.compareVersions)('v1.0.0', '1.0.0'), 0);
+ });
+ it('should compare greater version', () => {
+ assert_1.default.throws(() => (0, versions_1.compareVersions)('', ''));
+ assert_1.default.strictEqual((0, versions_1.compareVersions)('2.0.0', '1.0.0'), 1);
+ assert_1.default.strictEqual((0, versions_1.compareVersions)('1.1.0', '1.0.0'), 1);
+ assert_1.default.strictEqual((0, versions_1.compareVersions)('1.0.4', '1.0.0'), 1);
+ assert_1.default.strictEqual((0, versions_1.compareVersions)('v1.1.0', '1.0.0'), 1);
+ assert_1.default.strictEqual((0, versions_1.compareVersions)('1.1.0', 'v1.0.0'), 1);
+ });
+ it('should compare smaller version', () => {
+ assert_1.default.throws(() => (0, versions_1.compareVersions)('', ''));
+ assert_1.default.strictEqual((0, versions_1.compareVersions)('1.0.0', '2.0.0'), -1);
+ assert_1.default.strictEqual((0, versions_1.compareVersions)('1.0.0', '1.1.0'), -1);
+ assert_1.default.strictEqual((0, versions_1.compareVersions)('1.0.0', '1.0.4'), -1);
+ assert_1.default.strictEqual((0, versions_1.compareVersions)('1.0.0', 'v1.1.0'), -1);
+ assert_1.default.strictEqual((0, versions_1.compareVersions)('v1.0.0', '1.1.0'), -1);
+ });
+});
+//# sourceMappingURL=versions.test.js.map \ No newline at end of file