Skip to content

Commit a7b16f9

Browse files
authored
chore(server) - Update how we determine what a CloudFormation template is (#250)
* Update how we determine what a cfn template is * Support json for hover
1 parent 277f018 commit a7b16f9

File tree

4 files changed

+39
-44
lines changed

4 files changed

+39
-44
lines changed

server/src/handlers/helpers.ts

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,3 @@
1-
import { Connection } from "vscode-languageserver";
2-
3-
export function isCloudFormation(
4-
template: string,
5-
filename: string,
6-
cfnConnection: Connection
7-
): Boolean {
8-
if (/"?AWSTemplateFormatVersion"?\s*/.exec(template)) {
9-
cfnConnection.console.log(
10-
"Determined this file is a CloudFormation Template. " +
11-
filename +
12-
". Found the string AWSTemplateFormatVersion"
13-
);
14-
return true;
15-
}
16-
if (/\n?"?Resources"?\s*:/.exec(template)) {
17-
if (
18-
/"?Type"?\s*:\s*"?'?[a-zA-Z0-9]{2,64}::[a-zA-Z0-9]{2,64}/.exec(template)
19-
) {
20-
// filter out serverless.io templates
21-
if (!(/\nresources:/.exec(template) && /\nprovider:/.exec(template))) {
22-
cfnConnection.console.log(
23-
"Determined this file is a CloudFormation Template. " +
24-
filename +
25-
". Found 'Resources' and 'Type: [a-zA-Z0-9]{2,64}::[a-zA-Z0-9]{2,64}'"
26-
);
27-
return true;
28-
}
29-
}
30-
}
31-
return false;
32-
}
33-
341
export function isYaml(filename: string): Boolean {
352
if (filename.endsWith(".yaml") || filename.endsWith(".yml")) {
363
return true;

server/src/handlers/languageHandlers.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import {
3030
PropertyASTNodeImpl,
3131
StringASTNodeImpl,
3232
} from "yaml-language-server/out/server/src/languageservice/parser/jsonParser07";
33+
import { MarkdownString } from "../utils/markdownString";
3334

3435
// code adopted from https://github.com/redhat-developer/yaml-language-server/blob/main/src/languageserver/handlers/languageHandlers.ts
3536
export class LanguageHandlers extends YamlLanguageHandlers {
@@ -187,16 +188,24 @@ export class LanguageHandlers extends YamlLanguageHandlers {
187188
return Promise.resolve(undefined);
188189
}
189190

190-
const results = await this.cfnLanguageService.doHover(
191+
let hover: Hover = {
192+
contents: new MarkdownString().toMarkupContent(),
193+
};
194+
195+
let results = await this.cfnLanguageService.doHover(
191196
document,
192197
textDocumentPositionParams.position
193198
);
194199

200+
if (results !== null) {
201+
hover = results;
202+
}
203+
195204
let [node, template] = getNode(document, textDocumentPositionParams);
196205

197206
function updateHover(map: CfnType, nodeValue: string) {
198207
if (map.has(nodeValue)) {
199-
results.contents = map.getKeyMarkupContent(nodeValue);
208+
hover.contents = map.getKeyMarkupContent(nodeValue);
200209
}
201210
}
202211

@@ -224,6 +233,6 @@ export class LanguageHandlers extends YamlLanguageHandlers {
224233
console.debug(error);
225234
}
226235

227-
return results;
236+
return hover;
228237
}
229238
}

server/src/handlers/validationHandler.ts

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import { CfnLint } from "../services/cfnlint";
2323
import { Diagnostic } from "vscode-languageserver-types";
2424
import { LanguageService } from "yaml-language-server";
2525
import { ValidationHandler as YamlValidationHandler } from "yaml-language-server/out/server/src/languageserver/handlers/validationHandlers";
26-
import { isCloudFormation } from "./helpers";
26+
import { getNode } from "../utils/cfnParser";
2727

2828
// code adopted from https://github.com/redhat-developer/yaml-language-server/blob/main/src/languageserver/handlers/validationHandlers.ts
2929
export class ValidationHandler extends YamlValidationHandler {
@@ -115,18 +115,23 @@ export class ValidationHandler extends YamlValidationHandler {
115115

116116
let fileToLint = URI.parse(uri).fsPath;
117117

118-
let isCfn = isCloudFormation(
119-
document.getText(),
120-
uri.toString(),
121-
this.cfnConnection
122-
);
118+
let [_, template] = getNode(document, {
119+
textDocument: document,
120+
position: {
121+
line: 0,
122+
character: 0,
123+
},
124+
});
123125

124-
this.cfnConnection.sendNotification("cfn/isPreviewable", isCfn);
126+
this.cfnConnection.sendNotification(
127+
"cfn/isPreviewable",
128+
template.isValidTemplate
129+
);
125130

126131
let buildGraph = this.cfnSettings.isPreviewing[uri];
127132

128133
return new Promise<Diagnostic[]>((resolve, reject) => {
129-
if (isCfn) {
134+
if (template.isValidTemplate) {
130135
if (
131136
this.cfnSettings.cfnLintPath.includes(" --registry-schemas ") ||
132137
this.cfnSettings.cfnLintPath.includes(" -s ")

server/src/utils/cfnParser.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ export class CfnType extends Map<string, TypeInfo> {
3737
}
3838

3939
export interface CfnTypes {
40+
isValidTemplate: boolean; // stores if this a CFN template
41+
formatVersion: string | undefined;
4042
parameters: CfnType;
4143
resources: CfnType;
4244
}
@@ -58,6 +60,8 @@ export function getNode(
5860
position: TextDocumentPositionParams
5961
): [ASTNode, CfnTypes] | null {
6062
let cfnTypes: CfnTypes = {
63+
isValidTemplate: false,
64+
formatVersion: undefined,
6165
parameters: new CfnType("Parameter"),
6266
resources: new CfnType("Resource"),
6367
};
@@ -79,6 +83,12 @@ export function getNode(
7983
if (visit.valueNode instanceof ObjectASTNodeImpl) {
8084
filteredSections.set(visit.keyNode.value, visit.valueNode);
8185
}
86+
} else if (
87+
["AWSTemplateFormatVersion"].indexOf(visit.keyNode.value) > -1
88+
) {
89+
if (visit.valueNode instanceof StringASTNodeImpl) {
90+
cfnTypes.formatVersion = visit.valueNode.value;
91+
}
8292
}
8393
});
8494
}
@@ -101,6 +111,10 @@ export function getNode(
101111
}
102112
});
103113
}
114+
115+
if (cfnTypes.resources.size > 0 || cfnTypes.formatVersion !== undefined) {
116+
cfnTypes.isValidTemplate = true;
117+
}
104118
return [currentDoc.getNodeFromOffset(offset), cfnTypes];
105119
} catch (error) {
106120
console.debug(error);

0 commit comments

Comments
 (0)