Skip to content

Commit 88f8e38

Browse files
authored
[20231027]Feat/support tips feature (#4)
* support login with AKSK input * add aksk input * login with AKSK: 1.store aksk in process. 2.add refresh feature. 3.add icon pkg. * add aksk input * support: set aksk and terraform init/plan/apply/destroy cmd * update tiat-resource.config * 1.add res doc redirect function. 2.adjust tips logic. * 1.scrape tool. 2.adjust package.json for npm compile.
1 parent 5080aec commit 88f8e38

19 files changed

+35702
-19288
lines changed

config/snippets/resources.json

Whitespace-only changes.

config/snippets/tiat-urls.json

-8
This file was deleted.

config/snippets/tiat-resources.json renamed to config/tips/tiat-resources.json

+34,697-19,034
Large diffs are not rendered by default.

package-lock.json

+541-16
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+7-2
Original file line numberDiff line numberDiff line change
@@ -256,18 +256,23 @@
256256
"mocha": "^10.1.0",
257257
"tsconfig-paths": "^4.2.0",
258258
"typescript": "^4.9.4",
259-
"vscode": "^1.1.34"
259+
"vscode": "^1.1.34",
260+
"@types/cheerio": "^0.22.33",
261+
"cheerio": "^1.0.0-rc.12"
260262
},
261263
"dependencies": {
264+
"@types/jsdom": "^21.1.4",
262265
"@types/strip-ansi": "^5.2.1",
263266
"all": "^0.0.0",
264267
"asynckit": "^0.4.0",
265268
"axios": "^1.3.5",
266269
"chalk": "^4.1.2",
267270
"fs-extra": "^11.1.0",
268271
"inversify": "^6.0.1",
272+
"jsdom": "^22.1.0",
269273
"lodash": "^4.17.21",
270274
"lodash-es": "^4.17.21",
275+
"marked": "^0.3.6",
271276
"opn": "^6.0.0",
272277
"reflect-metadata": "^0.1.13",
273278
"shared": "^0.2.0",
@@ -278,4 +283,4 @@
278283
"vscode-extension-telemetry-wrapper": "^0.13.3",
279284
"vscode-nls-i18n": "^0.2.4"
280285
}
281-
}
286+
}

src/autocomplete/TerraformDefinitionProvider.ts

-24
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { CompletionItemProvider, TextDocument, Position, CancellationToken, CompletionItem } from "vscode";
2+
import resources from '../../config/tips/tiat-resources.json';
3+
import * as _ from "lodash";
4+
5+
var topLevelTypes = ["output", "provider", "resource", "variable", "data"];
6+
var topLevelRegexes = topLevelTypes.map(o => {
7+
return {
8+
type: o,
9+
regex: new RegExp(o + ' "[A-Za-z0-9\-_]+" "[A-Za-z0-9\-_]*" \{')
10+
};
11+
});
12+
13+
export class TerraformExampleProvider implements CompletionItemProvider {
14+
document: TextDocument;
15+
position: Position;
16+
token: CancellationToken;
17+
18+
public provideCompletionItems(document: TextDocument, position: Position, token: CancellationToken): CompletionItem[] {
19+
return [];
20+
}
21+
}
+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { HoverProvider, TextDocument, Position, CancellationToken, CompletionItem, CompletionItemKind, Hover, ProviderResult } from "vscode";
2+
import resources from '../../config/tips/tiat-resources.json';
3+
import * as _ from "lodash";
4+
5+
var topLevelTypes = ["output", "provider", "resource", "variable", "data"];
6+
var topLevelRegexes = topLevelTypes.map(o => {
7+
return {
8+
type: o,
9+
regex: new RegExp(o + ' "[A-Za-z0-9\-_]+" "[A-Za-z0-9\-_]*" \{')
10+
};
11+
});
12+
13+
export class TerraformHoverProvider implements HoverProvider {
14+
provideHover(document: TextDocument, position: Position, token: CancellationToken): ProviderResult<Hover> {
15+
throw new Error("Method not implemented.");
16+
}
17+
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import {
2+
DefinitionProvider,
3+
TextDocument,
4+
Position,
5+
CancellationToken,
6+
Definition
7+
} from "vscode";
8+
import * as _ from "lodash";
9+
// import * as opn from "opn";
10+
import opn from "opn";
11+
import resources from '../../config/tips/tiat-resources.json';
12+
13+
const urlPrefix = "https://www.terraform.io";
14+
15+
export class TerraformResDocProvider implements DefinitionProvider {
16+
public provideDefinition(document: TextDocument, position: Position, token: CancellationToken): Definition {
17+
const words = document.getWordRangeAtPosition(position);
18+
const resName = document.getText(words);
19+
20+
const found = _.get(resources, resName);
21+
const urlSuffix = found.url?.toString() || "";
22+
var target = <string>(urlPrefix + urlSuffix);
23+
if (urlSuffix && target) {
24+
opn(target);
25+
}
26+
return null;
27+
}
28+
}

src/autocomplete/TerraformCompletionProvider.ts renamed to src/autocomplete/TerraformTipsProvider.ts

+10-12
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { CompletionItemProvider, TextDocument, Position, CancellationToken, CompletionItem, CompletionItemKind } from "vscode";
2-
// var resources = require('../../config/snippets/tiat-resources.json');
3-
import resources from '../../config/snippets/tiat-resources.json';
2+
import resources from '../../config/tips/tiat-resources.json';
43
import * as _ from "lodash";
54

65
var topLevelTypes = ["output", "provider", "resource", "variable", "data"];
@@ -11,7 +10,7 @@ var topLevelRegexes = topLevelTypes.map(o => {
1110
};
1211
});
1312

14-
export class TerraformCompletionProvider implements CompletionItemProvider {
13+
export class TerraformTipsProvider implements CompletionItemProvider {
1514
document: TextDocument;
1615
position: Position;
1716
token: CancellationToken;
@@ -31,7 +30,7 @@ export class TerraformCompletionProvider implements CompletionItemProvider {
3130
}
3231

3332
// Are we trying to type a variable?
34-
if (this.isTypingVariable(lineTillCurrentPosition)) {
33+
if (this.isTypingTfCode(lineTillCurrentPosition)) {
3534
// These variables should always just have 3 parts, resource type, resource name, exported field
3635
var varString = this.getVariableString(lineTillCurrentPosition);
3736
var parts = varString.split(".");
@@ -74,7 +73,6 @@ export class TerraformCompletionProvider implements CompletionItemProvider {
7473
}
7574

7675
// Are we trying to type a parameter to a resource?
77-
7876
let possibleResources = this.checkTopLevelResource(lineTillCurrentPosition);
7977
if (possibleResources.length > 0) {
8078
return this.getHintsForStrings(possibleResources);
@@ -87,8 +85,8 @@ export class TerraformCompletionProvider implements CompletionItemProvider {
8785
if (parentType && parentType.type === "resource") {
8886
let resourceType = this.getResourceTypeFromLine(line);
8987
let ret = this.getItemsForArgs(resources[resourceType].args, resourceType);
90-
return ret;
91-
}
88+
return ret;
89+
}
9290
else if (parentType && parentType.type !== "resource") {
9391
// We don't want to accidentally include some other containers stuff
9492
return [];
@@ -99,7 +97,7 @@ export class TerraformCompletionProvider implements CompletionItemProvider {
9997
}
10098

10199
getNamesForResourceType(document: TextDocument, resourceType: string): string[] {
102-
var r = new RegExp('resource "' + resourceType +'" "([a-zA-Z0-9\-_]+)"');
100+
var r = new RegExp('resource "' + resourceType + '" "([a-zA-Z0-9\-_]+)"');
103101
var found = [];
104102
for (var i = 0; i < document.lineCount; i++) {
105103
var line = document.lineAt(i).text;
@@ -128,7 +126,7 @@ export class TerraformCompletionProvider implements CompletionItemProvider {
128126
}
129127

130128
isTopLevelType(line: string): boolean {
131-
for (var i=0; i<topLevelTypes.length; i++) {
129+
for (var i = 0; i < topLevelTypes.length; i++) {
132130
var resourceType = topLevelTypes[i];
133131
if (resourceType.indexOf(line) === 0) {
134132
return true;
@@ -138,7 +136,7 @@ export class TerraformCompletionProvider implements CompletionItemProvider {
138136
}
139137

140138
getTopLevelType(line: string): CompletionItem[] {
141-
for (var i=0; i<topLevelTypes.length; i++) {
139+
for (var i = 0; i < topLevelTypes.length; i++) {
142140
var resourceType = topLevelTypes[i];
143141
if (resourceType.indexOf(line) === 0) {
144142
return [new CompletionItem(resourceType, CompletionItemKind.Enum)];
@@ -147,7 +145,7 @@ export class TerraformCompletionProvider implements CompletionItemProvider {
147145
return [];
148146
}
149147

150-
isTypingVariable(line: string): boolean {
148+
isTypingTfCode(line: string): boolean {
151149
var r = /\$\{[0-9a-zA-Z_\.\-]*$/;
152150
return r.test(line);
153151
}
@@ -183,7 +181,7 @@ export class TerraformCompletionProvider implements CompletionItemProvider {
183181
});
184182
}
185183

186-
getParentType(line: string): boolean|any {
184+
getParentType(line: string): boolean | any {
187185
for (var i = 0; i < topLevelRegexes.length; i++) {
188186
let tl = topLevelRegexes[i];
189187
if (tl.regex.test(line)) {

src/extension.ts

+8-7
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,13 @@ import { init } from "vscode-nls-i18n";
66
import { TerraformCommand, TerraformerCommand } from "./commons/customCmdRegister";
77
import { terraformShellManager } from "./client/terminal/terraformShellManager";
88
import { DialogOption } from "./utils/uiUtils";
9-
import { TerraformCompletionProvider } from './autocomplete/TerraformCompletionProvider';
10-
import { TerraformDefinitionProvider } from './autocomplete/TerraformDefinitionProvider';
11-
import { registerExternelCommands } from './commons';
9+
import { TerraformTipsProvider } from './autocomplete/TerraformTipsProvider';
10+
import { TerraformResDocProvider } from './autocomplete/TerraformResDocProvider';
11+
import { registerExternelCommands, bindExtensionContext } from './commons';
1212
import { registerView } from './views';
1313
import { TerraformRunner } from './client/runner/terraformRunner';
1414
import { TerraformerRunner } from './client/runner/terraformerRunner';
1515
import { GitUtils } from './utils/gitUtils';
16-
import { bindExtensionContext } from "./commons";
1716
import _ from 'lodash';
1817

1918
const TF_MODE: vscode.DocumentFilter = { language: 'terraform', scheme: 'file' };
@@ -96,8 +95,8 @@ export async function activate(context: vscode.ExtensionContext) {
9695

9796
// auto-complete
9897
console.log('activate the auto complete(snippets and lint) feature');
99-
context.subscriptions.push(vscode.languages.registerCompletionItemProvider(TF_MODE, new TerraformCompletionProvider(), '.'));
100-
context.subscriptions.push(vscode.languages.registerDefinitionProvider(TF_MODE, new TerraformDefinitionProvider()));
98+
context.subscriptions.push(vscode.languages.registerCompletionItemProvider(TF_MODE, new TerraformTipsProvider(), '.'));
99+
context.subscriptions.push(vscode.languages.registerDefinitionProvider(TF_MODE, new TerraformResDocProvider()));
101100

102101
// import-resource
103102
console.log('activate the import feature');
@@ -107,4 +106,6 @@ export async function activate(context: vscode.ExtensionContext) {
107106
}
108107

109108
// This method is called when your extension is deactivated
110-
export function deactivate() { }
109+
export function deactivate() {
110+
/* TODO document why this function 'deactivate' is empty */
111+
}

0 commit comments

Comments
 (0)