Complete residential site build with Docker Compose & Gitea Actions deployment

This commit is contained in:
CalebLewallen
2026-05-13 17:31:20 -04:00
parent f9c4e13a50
commit 3c22823f72
19354 changed files with 2097331 additions and 0 deletions
@@ -0,0 +1,23 @@
import { SingleYAMLDocument } from '../parser/yamlParser07';
import { JSONDocument } from '../parser/jsonDocument';
import { ResolvedSchema } from 'vscode-json-languageservice/lib/umd/services/jsonSchemaService';
/**
* Retrieve schema by auto-detecting the Kubernetes GroupVersionKind (GVK) from the document.
* If there is no definition for the GVK in the main kubernetes schema,
* the schema is then retrieved from the CRD catalog.
* Public for testing purpose, not part of the API.
* @param doc
* @param crdCatalogURI The URL of the CRD catalog to retrieve the schema from
* @param kubernetesSchema The main kubernetes schema, if it includes a definition for the GVK it will be used
*/
export declare function autoDetectKubernetesSchemaFromDocument(doc: SingleYAMLDocument | JSONDocument, crdCatalogURI: string, kubernetesSchema: ResolvedSchema): string | undefined;
/**
* Retrieve the group, version and kind from the document.
* Public for testing purpose, not part of the API.
* @param doc
*/
export declare function getGroupVersionKindFromDocument(doc: SingleYAMLDocument | JSONDocument): {
group: string;
version: string;
kind: string;
} | undefined;
@@ -0,0 +1,89 @@
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "../parser/yamlParser07"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getGroupVersionKindFromDocument = exports.autoDetectKubernetesSchemaFromDocument = void 0;
const yamlParser07_1 = require("../parser/yamlParser07");
/**
* Retrieve schema by auto-detecting the Kubernetes GroupVersionKind (GVK) from the document.
* If there is no definition for the GVK in the main kubernetes schema,
* the schema is then retrieved from the CRD catalog.
* Public for testing purpose, not part of the API.
* @param doc
* @param crdCatalogURI The URL of the CRD catalog to retrieve the schema from
* @param kubernetesSchema The main kubernetes schema, if it includes a definition for the GVK it will be used
*/
function autoDetectKubernetesSchemaFromDocument(doc, crdCatalogURI, kubernetesSchema) {
const res = getGroupVersionKindFromDocument(doc);
if (!res) {
return undefined;
}
const { group, version, kind } = res;
if (!group || !version || !kind) {
return undefined;
}
const k8sSchema = kubernetesSchema.schema;
const kubernetesBuildIns = (k8sSchema.oneOf || [])
.map((s) => {
if (typeof s === 'boolean') {
return undefined;
}
return s._$ref || s.$ref;
})
.filter((ref) => ref)
.map((ref) => ref.replace('_definitions.json#/definitions/', '').toLowerCase());
const groupWithoutK8sIO = group.replace('.k8s.io', '');
const k8sTypeName = `io.k8s.api.${groupWithoutK8sIO.toLowerCase()}.${version.toLowerCase()}.${kind.toLowerCase()}`;
if (kubernetesBuildIns.includes(k8sTypeName)) {
return undefined;
}
if (k8sTypeName.includes('openshift.io')) {
return `${crdCatalogURI}/openshift/v4.15-strict/${kind.toLowerCase()}_${group.toLowerCase()}_${version.toLowerCase()}.json`;
}
const schemaURL = `${crdCatalogURI}/${group.toLowerCase()}/${kind.toLowerCase()}_${version.toLowerCase()}.json`;
return schemaURL;
}
exports.autoDetectKubernetesSchemaFromDocument = autoDetectKubernetesSchemaFromDocument;
/**
* Retrieve the group, version and kind from the document.
* Public for testing purpose, not part of the API.
* @param doc
*/
function getGroupVersionKindFromDocument(doc) {
if (doc instanceof yamlParser07_1.SingleYAMLDocument) {
try {
const rootJSON = doc.root.internalNode.toJSON();
if (!rootJSON) {
return undefined;
}
const groupVersion = rootJSON['apiVersion'];
if (!groupVersion) {
return undefined;
}
const [group, version] = groupVersion.split('/');
if (!group || !version) {
return undefined;
}
const kind = rootJSON['kind'];
if (!kind) {
return undefined;
}
return { group, version, kind };
}
catch (error) {
console.error('Error parsing YAML document:', error);
return undefined;
}
}
return undefined;
}
exports.getGroupVersionKindFromDocument = getGroupVersionKindFromDocument;
});
//# sourceMappingURL=crdUtil.js.map
@@ -0,0 +1 @@
{"version":3,"file":"crdUtil.js","sourceRoot":"","sources":["../../../../src/languageservice/services/crdUtil.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
import { SymbolInformation, DocumentSymbol } from 'vscode-languageserver-types';
import { YAMLSchemaService } from './yamlSchemaService';
import { DocumentSymbolsContext } from 'vscode-json-languageservice/lib/umd/jsonLanguageTypes';
import { TextDocument } from 'vscode-languageserver-textdocument';
import { Telemetry } from '../telemetry';
export declare class YAMLDocumentSymbols {
private readonly telemetry?;
private jsonDocumentSymbols;
constructor(schemaService: YAMLSchemaService, telemetry?: Telemetry);
findDocumentSymbols(document: TextDocument, context?: DocumentSymbolsContext): SymbolInformation[];
findHierarchicalDocumentSymbols(document: TextDocument, context?: DocumentSymbolsContext): DocumentSymbol[];
}
@@ -0,0 +1,81 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Red Hat, Inc. All rights reserved.
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "vscode-json-languageservice/lib/umd/services/jsonDocumentSymbols", "../parser/yaml-documents", "yaml"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.YAMLDocumentSymbols = void 0;
const jsonDocumentSymbols_1 = require("vscode-json-languageservice/lib/umd/services/jsonDocumentSymbols");
const yaml_documents_1 = require("../parser/yaml-documents");
const yaml_1 = require("yaml");
class YAMLDocumentSymbols {
constructor(schemaService, telemetry) {
this.telemetry = telemetry;
this.jsonDocumentSymbols = new jsonDocumentSymbols_1.JSONDocumentSymbols(schemaService);
// override 'getKeyLabel' to handle complex mapping
// eslint-disable-next-line @typescript-eslint/no-explicit-any
this.jsonDocumentSymbols.getKeyLabel = (property) => {
const keyNode = property.keyNode.internalNode;
let name = '';
if ((0, yaml_1.isMap)(keyNode)) {
name = '{}';
}
else if ((0, yaml_1.isSeq)(keyNode)) {
name = '[]';
}
else {
name = keyNode.source;
}
return name;
};
}
findDocumentSymbols(document, context = { resultLimit: Number.MAX_VALUE }) {
let results = [];
try {
const doc = yaml_documents_1.yamlDocumentsCache.getYamlDocument(document);
if (!doc || doc['documents'].length === 0) {
return null;
}
for (const yamlDoc of doc['documents']) {
if (yamlDoc.root) {
results = results.concat(this.jsonDocumentSymbols.findDocumentSymbols(document, yamlDoc, context));
}
}
}
catch (err) {
this.telemetry?.sendError('yaml.documentSymbols.error', err);
}
return results;
}
findHierarchicalDocumentSymbols(document, context = { resultLimit: Number.MAX_VALUE }) {
let results = [];
try {
const doc = yaml_documents_1.yamlDocumentsCache.getYamlDocument(document);
if (!doc || doc['documents'].length === 0) {
return null;
}
for (const yamlDoc of doc['documents']) {
if (yamlDoc.root) {
results = results.concat(this.jsonDocumentSymbols.findDocumentSymbols2(document, yamlDoc, context));
}
}
}
catch (err) {
this.telemetry?.sendError('yaml.hierarchicalDocumentSymbols.error', err);
}
return results;
}
}
exports.YAMLDocumentSymbols = YAMLDocumentSymbols;
});
//# sourceMappingURL=documentSymbols.js.map
@@ -0,0 +1 @@
{"version":3,"file":"documentSymbols.js","sourceRoot":"","sources":["../../../../src/languageservice/services/documentSymbols.ts"],"names":[],"mappings":"AAAA;;;;gGAIgG;;;;;;;;;;;;;IAIhG,0GAAuG;IAGvG,6DAA8D;IAE9D,+BAA0C;IAE1C,MAAa,mBAAmB;QAG9B,YACE,aAAgC,EACf,SAAqB;YAArB,cAAS,GAAT,SAAS,CAAY;YAEtC,IAAI,CAAC,mBAAmB,GAAG,IAAI,yCAAmB,CAAC,aAAa,CAAC,CAAC;YAElE,mDAAmD;YACnD,8DAA8D;YAC9D,IAAI,CAAC,mBAAmB,CAAC,WAAW,GAAG,CAAC,QAAa,EAAE,EAAE;gBACvD,MAAM,OAAO,GAAS,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC;gBACpD,IAAI,IAAI,GAAG,EAAE,CAAC;gBACd,IAAI,IAAA,YAAK,EAAC,OAAO,CAAC,EAAE;oBAClB,IAAI,GAAG,IAAI,CAAC;iBACb;qBAAM,IAAI,IAAA,YAAK,EAAC,OAAO,CAAC,EAAE;oBACzB,IAAI,GAAG,IAAI,CAAC;iBACb;qBAAM;oBACL,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;iBACvB;gBACD,OAAO,IAAI,CAAC;YACd,CAAC,CAAC;QACJ,CAAC;QAEM,mBAAmB,CACxB,QAAsB,EACtB,UAAkC,EAAE,WAAW,EAAE,MAAM,CAAC,SAAS,EAAE;YAEnE,IAAI,OAAO,GAAG,EAAE,CAAC;YACjB,IAAI;gBACF,MAAM,GAAG,GAAG,mCAAkB,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;gBACzD,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;oBACzC,OAAO,IAAI,CAAC;iBACb;gBAED,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,WAAW,CAAC,EAAE;oBACtC,IAAI,OAAO,CAAC,IAAI,EAAE;wBAChB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;qBACpG;iBACF;aACF;YAAC,OAAO,GAAG,EAAE;gBACZ,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;aAC9D;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;QAEM,+BAA+B,CACpC,QAAsB,EACtB,UAAkC,EAAE,WAAW,EAAE,MAAM,CAAC,SAAS,EAAE;YAEnE,IAAI,OAAO,GAAG,EAAE,CAAC;YACjB,IAAI;gBACF,MAAM,GAAG,GAAG,mCAAkB,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;gBACzD,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;oBACzC,OAAO,IAAI,CAAC;iBACb;gBAED,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,WAAW,CAAC,EAAE;oBACtC,IAAI,OAAO,CAAC,IAAI,EAAE;wBAChB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;qBACrG;iBACF;aACF;YAAC,OAAO,GAAG,EAAE;gBACZ,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,wCAAwC,EAAE,GAAG,CAAC,CAAC;aAC1E;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;KACF;IArED,kDAqEC"}
@@ -0,0 +1,9 @@
import { SingleYAMLDocument } from '../parser/yamlParser07';
import { JSONDocument } from '../parser/jsonDocument';
/**
* Retrieve schema if declared as modeline.
* Public for testing purpose, not part of the API.
* @param doc
*/
export declare function getSchemaFromModeline(doc: SingleYAMLDocument | JSONDocument): string;
export declare function isModeline(lineText: string): boolean;
@@ -0,0 +1,47 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Red Hat, Inc. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "../parser/yamlParser07"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isModeline = exports.getSchemaFromModeline = void 0;
const yamlParser07_1 = require("../parser/yamlParser07");
/**
* Retrieve schema if declared as modeline.
* Public for testing purpose, not part of the API.
* @param doc
*/
function getSchemaFromModeline(doc) {
if (doc instanceof yamlParser07_1.SingleYAMLDocument) {
const yamlLanguageServerModeline = doc.lineComments.find((lineComment) => {
return isModeline(lineComment);
});
if (yamlLanguageServerModeline != undefined) {
const schemaMatchs = yamlLanguageServerModeline.match(/\$schema=\S+/g);
if (schemaMatchs !== null && schemaMatchs.length >= 1) {
if (schemaMatchs.length >= 2) {
console.log('Several $schema attributes have been found on the yaml-language-server modeline. The first one will be picked.');
}
return schemaMatchs[0].substring('$schema='.length);
}
}
}
return undefined;
}
exports.getSchemaFromModeline = getSchemaFromModeline;
function isModeline(lineText) {
const matchModeline = lineText.match(/^#\s+yaml-language-server\s*:/g);
return matchModeline !== null && matchModeline.length === 1;
}
exports.isModeline = isModeline;
});
//# sourceMappingURL=modelineUtil.js.map
@@ -0,0 +1 @@
{"version":3,"file":"modelineUtil.js","sourceRoot":"","sources":["../../../../src/languageservice/services/modelineUtil.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;;;;;;;;;;;;;IAEhG,yDAA4D;IAG5D;;;;OAIG;IACH,SAAgB,qBAAqB,CAAC,GAAsC;QAC1E,IAAI,GAAG,YAAY,iCAAkB,EAAE;YACrC,MAAM,0BAA0B,GAAG,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE;gBACvE,OAAO,UAAU,CAAC,WAAW,CAAC,CAAC;YACjC,CAAC,CAAC,CAAC;YACH,IAAI,0BAA0B,IAAI,SAAS,EAAE;gBAC3C,MAAM,YAAY,GAAG,0BAA0B,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;gBACvE,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,CAAC,MAAM,IAAI,CAAC,EAAE;oBACrD,IAAI,YAAY,CAAC,MAAM,IAAI,CAAC,EAAE;wBAC5B,OAAO,CAAC,GAAG,CACT,gHAAgH,CACjH,CAAC;qBACH;oBACD,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;iBACrD;aACF;SACF;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAlBD,sDAkBC;IAED,SAAgB,UAAU,CAAC,QAAgB;QACzC,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACvE,OAAO,aAAa,KAAK,IAAI,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC;IAC9D,CAAC;IAHD,gCAGC"}
@@ -0,0 +1,12 @@
import { Connection, WorkspaceFolder } from 'vscode-languageserver';
import { URI } from 'vscode-uri';
import { WorkspaceContextService } from '../yamlLanguageService';
export interface FileSystem {
readFile(fsPath: string, encoding?: string): Promise<string>;
}
/**
* Handles schema content requests given the schema URI
* @param uri can be a local file, vscode request, http(s) request or a custom request
*/
export declare const schemaRequestHandler: (connection: Connection, uri: string, workspaceFolders: WorkspaceFolder[], workspaceRoot: URI, useVSCodeContentRequest: boolean, fs: FileSystem, isWeb: boolean) => Promise<string>;
export declare const workspaceContext: WorkspaceContextService;
@@ -0,0 +1,98 @@
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "path", "request-light", "url", "vscode-languageserver", "vscode-uri", "../../requestTypes", "../utils/paths"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.workspaceContext = exports.schemaRequestHandler = void 0;
const path_1 = require("path");
const request_light_1 = require("request-light");
const URL = require("url");
const vscode_languageserver_1 = require("vscode-languageserver");
const vscode_uri_1 = require("vscode-uri");
const requestTypes_1 = require("../../requestTypes");
const paths_1 = require("../utils/paths");
// eslint-disable-next-line @typescript-eslint/no-namespace
var FSReadUri;
(function (FSReadUri) {
FSReadUri.type = new vscode_languageserver_1.RequestType('fs/readUri');
})(FSReadUri || (FSReadUri = {}));
/**
* Handles schema content requests given the schema URI
* @param uri can be a local file, vscode request, http(s) request or a custom request
*/
const schemaRequestHandler = async (connection, uri, workspaceFolders, workspaceRoot, useVSCodeContentRequest, fs, isWeb) => {
if (!uri) {
return Promise.reject('No schema specified');
}
// If the requested schema URI is a relative file path
// Convert it into a proper absolute path URI
if ((0, paths_1.isRelativePath)(uri)) {
// HACK: the fs/readUri extension is only available with vscode-yaml,
// and this fix is specific to vscode-yaml on web, so don't use it in other cases
if (workspaceFolders.length === 1 && isWeb) {
const wsUri = vscode_uri_1.URI.parse(workspaceFolders[0].uri);
const wsDirname = wsUri.path;
const modifiedUri = wsUri.with({ path: (0, path_1.join)(wsDirname, uri) });
try {
return connection.sendRequest(FSReadUri.type, modifiedUri.toString());
}
catch (e) {
connection.window.showErrorMessage(`failed to get content of '${modifiedUri}': ${e}`);
}
}
else {
uri = (0, paths_1.relativeToAbsolutePath)(workspaceFolders, workspaceRoot, uri);
}
}
let scheme = vscode_uri_1.URI.parse(uri).scheme.toLowerCase();
// test if uri is windows path, ie starts with 'c:\'
if (/^[a-z]:[\\/]/i.test(uri)) {
const winUri = vscode_uri_1.URI.file(uri);
scheme = winUri.scheme.toLowerCase();
uri = winUri.toString();
}
// If the requested schema is a local file, read and return the file contents
if (scheme === 'file') {
const fsPath = vscode_uri_1.URI.parse(uri).fsPath;
return fs.readFile(fsPath, 'UTF-8').catch(() => {
// If there was an error reading the file, return empty error message
// Otherwise return the file contents as a string
return '';
});
}
// HTTP(S) requests are sent and the response result is either the schema content or an error
if (scheme === 'http' || scheme === 'https') {
// If we are running inside of VSCode we need to make a content request. This content request
// will make it so that schemas behind VPN's will resolve correctly
if (useVSCodeContentRequest) {
return connection.sendRequest(requestTypes_1.VSCodeContentRequest.type, uri).then((responseText) => {
return responseText;
}, (error) => {
return Promise.reject(error.message);
});
}
// Send the HTTP(S) schema content request and return the result
const headers = { 'Accept-Encoding': 'gzip, deflate' };
return (0, request_light_1.xhr)({ url: uri, followRedirects: 5, headers }).then((response) => {
return response.responseText;
}, (error) => {
return Promise.reject(error.responseText || (0, request_light_1.getErrorStatusDescription)(error.status) || error.toString());
});
}
// Neither local file nor vscode, nor HTTP(S) schema request, so send it off as a custom request
return connection.sendRequest(requestTypes_1.CustomSchemaContentRequest.type, uri);
};
exports.schemaRequestHandler = schemaRequestHandler;
exports.workspaceContext = {
resolveRelativePath: (relativePath, resource) => {
return URL.resolve(resource, relativePath);
},
};
});
//# sourceMappingURL=schemaRequestHandler.js.map
@@ -0,0 +1 @@
{"version":3,"file":"schemaRequestHandler.js","sourceRoot":"","sources":["../../../../src/languageservice/services/schemaRequestHandler.ts"],"names":[],"mappings":";;;;;;;;;;;;IAAA,+BAA4B;IAC5B,iDAA4E;IAC5E,2BAA2B;IAC3B,iEAAiF;IACjF,2CAAiC;IACjC,qDAAsF;IACtF,0CAAwE;IAOxE,2DAA2D;IAC3D,IAAU,SAAS,CAElB;IAFD,WAAU,SAAS;QACJ,cAAI,GAAyC,IAAI,mCAAW,CAAC,YAAY,CAAC,CAAC;IAC1F,CAAC,EAFS,SAAS,KAAT,SAAS,QAElB;IAED;;;OAGG;IACI,MAAM,oBAAoB,GAAG,KAAK,EACvC,UAAsB,EACtB,GAAW,EACX,gBAAmC,EACnC,aAAkB,EAClB,uBAAgC,EAChC,EAAc,EACd,KAAc,EACG,EAAE;QACnB,IAAI,CAAC,GAAG,EAAE;YACR,OAAO,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;SAC9C;QAED,sDAAsD;QACtD,6CAA6C;QAC7C,IAAI,IAAA,sBAAc,EAAC,GAAG,CAAC,EAAE;YACvB,qEAAqE;YACrE,iFAAiF;YACjF,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,EAAE;gBAC1C,MAAM,KAAK,GAAG,gBAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACjD,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC;gBAC7B,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAA,WAAI,EAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC/D,IAAI;oBACF,OAAO,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;iBACvE;gBAAC,OAAO,CAAC,EAAE;oBACV,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,6BAA6B,WAAW,MAAM,CAAC,EAAE,CAAC,CAAC;iBACvF;aACF;iBAAM;gBACL,GAAG,GAAG,IAAA,8BAAsB,EAAC,gBAAgB,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;aACpE;SACF;QAED,IAAI,MAAM,GAAG,gBAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QAEjD,oDAAoD;QACpD,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YAC7B,MAAM,MAAM,GAAG,gBAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC7B,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YACrC,GAAG,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;SACzB;QAED,6EAA6E;QAC7E,IAAI,MAAM,KAAK,MAAM,EAAE;YACrB,MAAM,MAAM,GAAG,gBAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;YAErC,OAAO,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;gBAC7C,qEAAqE;gBACrE,iDAAiD;gBACjD,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;SACJ;QAED,6FAA6F;QAC7F,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,OAAO,EAAE;YAC3C,6FAA6F;YAC7F,mEAAmE;YACnE,IAAI,uBAAuB,EAAE;gBAC3B,OAAO,UAAU,CAAC,WAAW,CAAC,mCAAoB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAChE,CAAC,YAAY,EAAE,EAAE;oBACf,OAAO,YAAY,CAAC;gBACtB,CAAC,EACD,CAAC,KAAK,EAAE,EAAE;oBACR,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACvC,CAAC,CACiB,CAAC;aACtB;YAED,gEAAgE;YAChE,MAAM,OAAO,GAAG,EAAE,iBAAiB,EAAE,eAAe,EAAE,CAAC;YACvD,OAAO,IAAA,mBAAG,EAAC,EAAE,GAAG,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CACxD,CAAC,QAAQ,EAAE,EAAE;gBACX,OAAO,QAAQ,CAAC,YAAY,CAAC;YAC/B,CAAC,EACD,CAAC,KAAkB,EAAE,EAAE;gBACrB,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,IAAA,yCAAyB,EAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC3G,CAAC,CACF,CAAC;SACH;QAED,gGAAgG;QAChG,OAAO,UAAU,CAAC,WAAW,CAAC,yCAA0B,CAAC,IAAI,EAAE,GAAG,CAAoB,CAAC;IACzF,CAAC,CAAC;IAjFW,QAAA,oBAAoB,wBAiF/B;IAEW,QAAA,gBAAgB,GAA4B;QACvD,mBAAmB,EAAE,CAAC,YAAoB,EAAE,QAAgB,EAAE,EAAE;YAC9D,OAAO,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC7C,CAAC;KACF,CAAC"}
@@ -0,0 +1,7 @@
import { TextDocument } from 'vscode-languageserver-textdocument';
import { Diagnostic } from 'vscode-languageserver-types';
import { SingleYAMLDocument } from '../../parser/yaml-documents';
import { AdditionalValidator } from './types';
export declare class MapKeyOrderValidator implements AdditionalValidator {
validate(document: TextDocument, yamlDoc: SingleYAMLDocument): Diagnostic[];
}
@@ -0,0 +1,49 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Red Hat. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "vscode-languageserver-types", "yaml"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.MapKeyOrderValidator = void 0;
const vscode_languageserver_types_1 = require("vscode-languageserver-types");
const yaml_1 = require("yaml");
class MapKeyOrderValidator {
validate(document, yamlDoc) {
const result = [];
(0, yaml_1.visit)(yamlDoc.internalDocument, (key, node) => {
if ((0, yaml_1.isMap)(node)) {
for (let i = 1; i < node.items.length; i++) {
if (compare(node.items[i - 1], node.items[i]) > 0) {
const range = createRange(document, node.items[i - 1]);
result.push(vscode_languageserver_types_1.Diagnostic.create(range, `Wrong ordering of key "${node.items[i - 1].key}" in mapping`, vscode_languageserver_types_1.DiagnosticSeverity.Error, 'mapKeyOrder'));
break;
}
}
}
});
return result;
}
}
exports.MapKeyOrderValidator = MapKeyOrderValidator;
function createRange(document, node) {
const keySourceToken = node.key.srcToken;
const start = keySourceToken.offset;
const end = start + keySourceToken.source.length;
return vscode_languageserver_types_1.Range.create(document.positionAt(start), document.positionAt(end));
}
function compare(thiz, that) {
const thatKey = String(that.key);
const thisKey = String(thiz.key);
return thisKey.localeCompare(thatKey);
}
});
//# sourceMappingURL=map-key-order.js.map
@@ -0,0 +1 @@
{"version":3,"file":"map-key-order.js","sourceRoot":"","sources":["../../../../../src/languageservice/services/validation/map-key-order.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;;;;;;;;;;;;;IAGhG,6EAAoF;IACpF,+BAAgD;IAKhD,MAAa,oBAAoB;QAC/B,QAAQ,CAAC,QAAsB,EAAE,OAA2B;YAC1D,MAAM,MAAM,GAAG,EAAE,CAAC;YAElB,IAAA,YAAK,EAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;gBAC5C,IAAI,IAAA,YAAK,EAAC,IAAI,CAAC,EAAE;oBACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;wBAC1C,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;4BACjD,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;4BACvD,MAAM,CAAC,IAAI,CACT,wCAAU,CAAC,MAAM,CACf,KAAK,EACL,0BAA0B,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,cAAc,EAC7D,gDAAkB,CAAC,KAAK,EACxB,aAAa,CACd,CACF,CAAC;4BACF,MAAM;yBACP;qBACF;iBACF;YACH,CAAC,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC;QAChB,CAAC;KACF;IAzBD,oDAyBC;IAED,SAAS,WAAW,CAAC,QAAsB,EAAE,IAAU;QACrD,MAAM,cAAc,GAAI,IAAI,CAAC,GAAY,CAAC,QAAuB,CAAC;QAClE,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC;QACpC,MAAM,GAAG,GAAG,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC;QACjD,OAAO,mCAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,SAAS,OAAO,CAAC,IAAU,EAAE,IAAU;QACrC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjC,OAAO,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC"}
@@ -0,0 +1,6 @@
import { TextDocument } from 'vscode-languageserver-textdocument';
import { Diagnostic } from 'vscode-languageserver-types';
import { SingleYAMLDocument } from '../../parser/yaml-documents';
export interface AdditionalValidator {
validate(document: TextDocument, yamlDoc: SingleYAMLDocument): Diagnostic[];
}
@@ -0,0 +1,17 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Red Hat. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
});
//# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/languageservice/services/validation/types.ts"],"names":[],"mappings":"AAAA;;;gGAGgG"}
@@ -0,0 +1,8 @@
import { TextDocument } from 'vscode-languageserver-textdocument';
import { Diagnostic } from 'vscode-languageserver-types';
import { SingleYAMLDocument } from '../../parser/yaml-documents';
import { AdditionalValidator } from './types';
export declare class UnusedAnchorsValidator implements AdditionalValidator {
validate(document: TextDocument, yamlDoc: SingleYAMLDocument): Diagnostic[];
private getAnchorNode;
}
@@ -0,0 +1,105 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Red Hat. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "vscode-languageserver-types", "yaml", "../../utils/yamlAstUtils", "@vscode/l10n"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.UnusedAnchorsValidator = void 0;
const vscode_languageserver_types_1 = require("vscode-languageserver-types");
const yaml_1 = require("yaml");
const yamlAstUtils_1 = require("../../utils/yamlAstUtils");
const l10n = require("@vscode/l10n");
class UnusedAnchorsValidator {
validate(document, yamlDoc) {
const result = [];
const anchors = new Set();
const usedAnchors = new Set();
const unIdentifiedAlias = new Set();
const anchorParent = new Map();
(0, yaml_1.visit)(yamlDoc.internalDocument, (key, node, path) => {
if (!(0, yaml_1.isNode)(node)) {
return;
}
if (((0, yaml_1.isCollection)(node) || (0, yaml_1.isScalar)(node)) && node.anchor) {
anchors.add(node);
anchorParent.set(node, path[path.length - 1]);
}
if ((0, yaml_1.isAlias)(node)) {
if (!node.resolve(yamlDoc.internalDocument)) {
unIdentifiedAlias.add(node);
}
else {
usedAnchors.add(node.resolve(yamlDoc.internalDocument));
}
}
});
for (const anchor of anchors) {
if (!usedAnchors.has(anchor)) {
const aToken = this.getAnchorNode(anchorParent.get(anchor), anchor);
if (aToken) {
const range = vscode_languageserver_types_1.Range.create(document.positionAt(aToken.offset), document.positionAt(aToken.offset + aToken.source.length));
const warningDiagnostic = vscode_languageserver_types_1.Diagnostic.create(range, l10n.t('Unused anchor "{0}"', aToken.source), vscode_languageserver_types_1.DiagnosticSeverity.Information, 0);
warningDiagnostic.tags = [vscode_languageserver_types_1.DiagnosticTag.Unnecessary];
result.push(warningDiagnostic);
}
}
}
unIdentifiedAlias.forEach((node) => {
const nodeRange = node.range;
if (nodeRange) {
const startOffset = nodeRange[0];
const endOffset = nodeRange[1];
const range = vscode_languageserver_types_1.Range.create(document.positionAt(startOffset), document.positionAt(endOffset));
const warningDiagnostic = vscode_languageserver_types_1.Diagnostic.create(range, l10n.t('Unresolved alias "{0}"', node.toString()), vscode_languageserver_types_1.DiagnosticSeverity.Information, 0);
warningDiagnostic.tags = [vscode_languageserver_types_1.DiagnosticTag.Unnecessary];
result.push(warningDiagnostic);
}
});
return result;
}
getAnchorNode(parentNode, node) {
if (parentNode && parentNode.srcToken) {
const token = parentNode.srcToken;
if ((0, yamlAstUtils_1.isCollectionItem)(token)) {
return getAnchorFromCollectionItem(token);
}
else if (yaml_1.CST.isCollection(token)) {
for (const t of token.items) {
if (node.srcToken !== t.value)
continue;
const anchor = getAnchorFromCollectionItem(t);
if (anchor) {
return anchor;
}
}
}
}
return undefined;
}
}
exports.UnusedAnchorsValidator = UnusedAnchorsValidator;
function getAnchorFromCollectionItem(token) {
for (const t of token.start) {
if (t.type === 'anchor') {
return t;
}
}
if (token.sep && Array.isArray(token.sep)) {
for (const t of token.sep) {
if (t.type === 'anchor') {
return t;
}
}
}
}
});
//# sourceMappingURL=unused-anchors.js.map
@@ -0,0 +1 @@
{"version":3,"file":"unused-anchors.js","sourceRoot":"","sources":["../../../../../src/languageservice/services/validation/unused-anchors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
import { TextDocument } from 'vscode-languageserver-textdocument';
import { Diagnostic } from 'vscode-languageserver-types';
import { SingleYAMLDocument } from '../../parser/yaml-documents';
import { LanguageSettings } from '../../yamlLanguageService';
import { AdditionalValidator } from './types';
export declare class YAMLStyleValidator implements AdditionalValidator {
private forbidSequence;
private forbidMapping;
constructor(settings: LanguageSettings);
validate(document: TextDocument, yamlDoc: SingleYAMLDocument): Diagnostic[];
private getRangeOf;
}
@@ -0,0 +1,42 @@
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "vscode-languageserver-types", "yaml", "@vscode/l10n"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.YAMLStyleValidator = void 0;
const vscode_languageserver_types_1 = require("vscode-languageserver-types");
const yaml_1 = require("yaml");
const l10n = require("@vscode/l10n");
class YAMLStyleValidator {
constructor(settings) {
this.forbidMapping = settings.flowMapping === 'forbid';
this.forbidSequence = settings.flowSequence === 'forbid';
}
validate(document, yamlDoc) {
const result = [];
(0, yaml_1.visit)(yamlDoc.internalDocument, (key, node) => {
if (this.forbidMapping && (0, yaml_1.isMap)(node) && node.srcToken?.type === 'flow-collection') {
result.push(vscode_languageserver_types_1.Diagnostic.create(this.getRangeOf(document, node.srcToken), l10n.t('Flow style mapping is forbidden'), vscode_languageserver_types_1.DiagnosticSeverity.Error, 'flowMap'));
}
if (this.forbidSequence && (0, yaml_1.isSeq)(node) && node.srcToken?.type === 'flow-collection') {
result.push(vscode_languageserver_types_1.Diagnostic.create(this.getRangeOf(document, node.srcToken), l10n.t('Flow style sequence is forbidden'), vscode_languageserver_types_1.DiagnosticSeverity.Error, 'flowSeq'));
}
});
return result;
}
getRangeOf(document, node) {
const endOffset = node.end[0].offset;
let endPosition = document.positionAt(endOffset);
endPosition = { character: endPosition.character + 1, line: endPosition.line };
return vscode_languageserver_types_1.Range.create(document.positionAt(node.start.offset), endPosition);
}
}
exports.YAMLStyleValidator = YAMLStyleValidator;
});
//# sourceMappingURL=yaml-style.js.map
@@ -0,0 +1 @@
{"version":3,"file":"yaml-style.js","sourceRoot":"","sources":["../../../../../src/languageservice/services/validation/yaml-style.ts"],"names":[],"mappings":";;;;;;;;;;;;IACA,6EAAoF;IACpF,+BAA2C;IAK3C,qCAAqC;IAErC,MAAa,kBAAkB;QAI7B,YAAY,QAA0B;YACpC,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,WAAW,KAAK,QAAQ,CAAC;YACvD,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,YAAY,KAAK,QAAQ,CAAC;QAC3D,CAAC;QACD,QAAQ,CAAC,QAAsB,EAAE,OAA2B;YAC1D,MAAM,MAAM,GAAG,EAAE,CAAC;YAClB,IAAA,YAAK,EAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;gBAC5C,IAAI,IAAI,CAAC,aAAa,IAAI,IAAA,YAAK,EAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,KAAK,iBAAiB,EAAE;oBAClF,MAAM,CAAC,IAAI,CACT,wCAAU,CAAC,MAAM,CACf,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,EACxC,IAAI,CAAC,CAAC,CAAC,iCAAiC,CAAC,EACzC,gDAAkB,CAAC,KAAK,EACxB,SAAS,CACV,CACF,CAAC;iBACH;gBACD,IAAI,IAAI,CAAC,cAAc,IAAI,IAAA,YAAK,EAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,KAAK,iBAAiB,EAAE;oBACnF,MAAM,CAAC,IAAI,CACT,wCAAU,CAAC,MAAM,CACf,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,EACxC,IAAI,CAAC,CAAC,CAAC,kCAAkC,CAAC,EAC1C,gDAAkB,CAAC,KAAK,EACxB,SAAS,CACV,CACF,CAAC;iBACH;YACH,CAAC,CAAC,CAAC;YACH,OAAO,MAAM,CAAC;QAChB,CAAC;QAEO,UAAU,CAAC,QAAsB,EAAE,IAAoB;YAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACrC,IAAI,WAAW,GAAG,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YACjD,WAAW,GAAG,EAAE,SAAS,EAAE,WAAW,CAAC,SAAS,GAAG,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC;YAC/E,OAAO,mCAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC;QAC3E,CAAC;KACF;IAzCD,gDAyCC"}
@@ -0,0 +1,25 @@
import { CodeAction } from 'vscode-languageserver-types';
import { ClientCapabilities, CodeActionParams } from 'vscode-languageserver-protocol';
import { TextDocument } from 'vscode-languageserver-textdocument';
import { LanguageSettings } from '../yamlLanguageService';
export declare class YamlCodeActions {
private readonly clientCapabilities;
private indentation;
private lineWidth;
constructor(clientCapabilities: ClientCapabilities);
configure(settings: LanguageSettings, printWidth: number): void;
getCodeAction(document: TextDocument, params: CodeActionParams): CodeAction[] | undefined;
private getJumpToSchemaActions;
private getTabToSpaceConverting;
private getUnusedAnchorsDelete;
private getConvertToBooleanActions;
private getConvertToBlockStyleActions;
private getConvertStringToBlockStyleActions;
private getKeyOrderActions;
/**
* Check if diagnostic contains info for quick fix
* Supports Enum/Const/Property mismatch
*/
private getPossibleQuickFixValues;
private getQuickFixForPropertyOrValueMismatch;
}
@@ -0,0 +1,356 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Red Hat, Inc. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "@vscode/l10n", "path", "vscode-json-languageservice", "vscode-languageserver-types", "yaml", "../../commands", "../utils/textBuffer", "../utils/yamlScalar", "../parser/schemaValidation/baseValidator", "../utils/strings", "../utils/arrUtils", "../parser/yaml-documents", "../utils/block-string-rewriter", "../utils/flow-style-rewriter"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.YamlCodeActions = void 0;
const l10n = require("@vscode/l10n");
const path = require("path");
const vscode_json_languageservice_1 = require("vscode-json-languageservice");
const vscode_languageserver_types_1 = require("vscode-languageserver-types");
const yaml_1 = require("yaml");
const commands_1 = require("../../commands");
const textBuffer_1 = require("../utils/textBuffer");
const yamlScalar_1 = require("../utils/yamlScalar");
const baseValidator_1 = require("../parser/schemaValidation/baseValidator");
const strings_1 = require("../utils/strings");
const arrUtils_1 = require("../utils/arrUtils");
const yaml_documents_1 = require("../parser/yaml-documents");
const block_string_rewriter_1 = require("../utils/block-string-rewriter");
const flow_style_rewriter_1 = require("../utils/flow-style-rewriter");
class YamlCodeActions {
constructor(clientCapabilities) {
this.clientCapabilities = clientCapabilities;
this.indentation = ' ';
this.lineWidth = 80;
}
configure(settings, printWidth) {
this.indentation = settings.indentation;
this.lineWidth = printWidth;
}
getCodeAction(document, params) {
if (!params.context.diagnostics) {
return;
}
const result = [];
result.push(...this.getConvertToBooleanActions(params.context.diagnostics, document));
result.push(...this.getJumpToSchemaActions(params.context.diagnostics));
result.push(...this.getTabToSpaceConverting(params.context.diagnostics, document));
result.push(...this.getUnusedAnchorsDelete(params.context.diagnostics, document));
result.push(...this.getConvertToBlockStyleActions(params.context.diagnostics, document));
result.push(...this.getConvertStringToBlockStyleActions(params.range, document));
result.push(...this.getKeyOrderActions(params.context.diagnostics, document));
result.push(...this.getQuickFixForPropertyOrValueMismatch(params.context.diagnostics, document));
return result;
}
getJumpToSchemaActions(diagnostics) {
const isOpenTextDocumentEnabled = this.clientCapabilities?.window?.showDocument?.support ?? false;
if (!isOpenTextDocumentEnabled) {
return [];
}
const schemaUriToDiagnostic = new Map();
for (const diagnostic of diagnostics) {
const schemaUri = diagnostic.data?.schemaUri || [];
for (const schemaUriStr of schemaUri) {
if (schemaUriStr) {
if (!schemaUriToDiagnostic.has(schemaUriStr)) {
schemaUriToDiagnostic.set(schemaUriStr, []);
}
schemaUriToDiagnostic.get(schemaUriStr).push(diagnostic);
}
}
}
const result = [];
for (const schemaUri of schemaUriToDiagnostic.keys()) {
const action = vscode_languageserver_types_1.CodeAction.create(l10n.t('Jump to schema location ({0})', path.basename(schemaUri)), vscode_languageserver_types_1.Command.create('JumpToSchema', commands_1.YamlCommands.JUMP_TO_SCHEMA, schemaUri));
action.diagnostics = schemaUriToDiagnostic.get(schemaUri);
result.push(action);
}
return result;
}
getTabToSpaceConverting(diagnostics, document) {
const result = [];
const textBuff = new textBuffer_1.TextBuffer(document);
const processedLine = [];
for (const diag of diagnostics) {
if (diag.message === 'Tabs are not allowed as indentation') {
if (processedLine.includes(diag.range.start.line)) {
continue;
}
const lineContent = textBuff.getLineContent(diag.range.start.line);
let replacedTabs = 0;
let newText = '';
for (let i = diag.range.start.character; i <= diag.range.end.character; i++) {
const char = lineContent.charAt(i);
if (char !== '\t') {
break;
}
replacedTabs++;
newText += this.indentation;
}
processedLine.push(diag.range.start.line);
let resultRange = diag.range;
if (replacedTabs !== diag.range.end.character - diag.range.start.character) {
resultRange = vscode_languageserver_types_1.Range.create(diag.range.start, vscode_languageserver_types_1.Position.create(diag.range.end.line, diag.range.start.character + replacedTabs));
}
result.push(vscode_languageserver_types_1.CodeAction.create(l10n.t('Convert Tab to Spaces'), createWorkspaceEdit(document.uri, [vscode_languageserver_types_1.TextEdit.replace(resultRange, newText)]), vscode_languageserver_types_1.CodeActionKind.QuickFix));
}
}
if (result.length !== 0) {
const replaceEdits = [];
for (let i = 0; i <= textBuff.getLineCount(); i++) {
const lineContent = textBuff.getLineContent(i);
let replacedTabs = 0;
let newText = '';
for (let j = 0; j < lineContent.length; j++) {
const char = lineContent.charAt(j);
if (char !== ' ' && char !== '\t') {
if (replacedTabs !== 0) {
replaceEdits.push(vscode_languageserver_types_1.TextEdit.replace(vscode_languageserver_types_1.Range.create(i, j - replacedTabs, i, j), newText));
replacedTabs = 0;
newText = '';
}
break;
}
if (char === ' ' && replacedTabs !== 0) {
replaceEdits.push(vscode_languageserver_types_1.TextEdit.replace(vscode_languageserver_types_1.Range.create(i, j - replacedTabs, i, j), newText));
replacedTabs = 0;
newText = '';
continue;
}
if (char === '\t') {
newText += this.indentation;
replacedTabs++;
}
}
// line contains only tabs
if (replacedTabs !== 0) {
replaceEdits.push(vscode_languageserver_types_1.TextEdit.replace(vscode_languageserver_types_1.Range.create(i, 0, i, textBuff.getLineLength(i)), newText));
}
}
if (replaceEdits.length > 0) {
result.push(vscode_languageserver_types_1.CodeAction.create(l10n.t('Convert all Tabs to Spaces'), createWorkspaceEdit(document.uri, replaceEdits), vscode_languageserver_types_1.CodeActionKind.QuickFix));
}
}
return result;
}
getUnusedAnchorsDelete(diagnostics, document) {
const result = [];
const buffer = new textBuffer_1.TextBuffer(document);
for (const diag of diagnostics) {
if (diag.message.startsWith('Unused anchor') && diag.source === baseValidator_1.YAML_SOURCE) {
const range = vscode_languageserver_types_1.Range.create(diag.range.start, diag.range.end);
const actual = buffer.getText(range);
const lineContent = buffer.getLineContent(range.end.line);
const lastWhitespaceChar = (0, strings_1.getFirstNonWhitespaceCharacterAfterOffset)(lineContent, range.end.character);
range.end.character = lastWhitespaceChar;
const action = vscode_languageserver_types_1.CodeAction.create(l10n.t('Delete unused anchor: {0}', actual), createWorkspaceEdit(document.uri, [vscode_languageserver_types_1.TextEdit.del(range)]), vscode_languageserver_types_1.CodeActionKind.QuickFix);
action.diagnostics = [diag];
result.push(action);
}
}
return result;
}
getConvertToBooleanActions(diagnostics, document) {
const results = [];
for (const diagnostic of diagnostics) {
if (diagnostic.message === 'Incorrect type. Expected "boolean".') {
const value = document.getText(diagnostic.range).toLocaleLowerCase();
if (value === '"true"' || value === '"false"' || value === "'true'" || value === "'false'") {
const newValue = value.includes('true') ? 'true' : 'false';
results.push(vscode_languageserver_types_1.CodeAction.create(l10n.t('Convert to boolean'), createWorkspaceEdit(document.uri, [vscode_languageserver_types_1.TextEdit.replace(diagnostic.range, newValue)]), vscode_languageserver_types_1.CodeActionKind.QuickFix));
}
}
}
return results;
}
getConvertToBlockStyleActions(diagnostics, document) {
const results = [];
for (const diagnostic of diagnostics) {
if (diagnostic.code === 'flowMap' || diagnostic.code === 'flowSeq') {
const node = getNodeForDiagnostic(document, diagnostic);
if ((0, yaml_1.isMap)(node.internalNode) || (0, yaml_1.isSeq)(node.internalNode)) {
const blockTypeDescription = (0, yaml_1.isMap)(node.internalNode) ? 'map' : 'sequence';
const rewriter = new flow_style_rewriter_1.FlowStyleRewriter(this.indentation);
results.push(vscode_languageserver_types_1.CodeAction.create(l10n.t('Convert to block style {0}', blockTypeDescription), createWorkspaceEdit(document.uri, [vscode_languageserver_types_1.TextEdit.replace(diagnostic.range, rewriter.write(node))]), vscode_languageserver_types_1.CodeActionKind.QuickFix));
}
}
}
return results;
}
getConvertStringToBlockStyleActions(range, document) {
const yamlDocument = yaml_documents_1.yamlDocumentsCache.getYamlDocument(document);
const startOffset = range ? document.offsetAt(range.start) : 0;
const endOffset = range ? document.offsetAt(range.end) : Infinity;
const results = [];
for (const singleYamlDocument of yamlDocument.documents) {
const matchingNodes = [];
(0, yaml_1.visit)(singleYamlDocument.internalDocument, (key, node) => {
if ((0, yaml_1.isScalar)(node)) {
if ((startOffset <= node.range[0] && node.range[2] <= endOffset) ||
(node.range[0] <= startOffset && endOffset <= node.range[2])) {
if (node.type === 'QUOTE_DOUBLE' || node.type === 'QUOTE_SINGLE') {
if (typeof node.value === 'string' && (node.value.indexOf('\n') >= 0 || node.value.length > this.lineWidth)) {
matchingNodes.push(node);
}
}
}
}
});
for (const node of matchingNodes) {
const range = vscode_languageserver_types_1.Range.create(document.positionAt(node.range[0]), document.positionAt(node.range[1]));
const rewriter = new block_string_rewriter_1.BlockStringRewriter(this.indentation, this.lineWidth);
const foldedBlockScalar = rewriter.writeFoldedBlockScalar(node);
if (foldedBlockScalar !== null) {
results.push(vscode_languageserver_types_1.CodeAction.create(l10n.t('Convert string to folded block string'), createWorkspaceEdit(document.uri, [vscode_languageserver_types_1.TextEdit.replace(range, foldedBlockScalar)]), vscode_languageserver_types_1.CodeActionKind.Refactor));
}
const literalBlockScalar = rewriter.writeLiteralBlockScalar(node);
if (literalBlockScalar !== null) {
results.push(vscode_languageserver_types_1.CodeAction.create(l10n.t('Convert string to literal block string'), createWorkspaceEdit(document.uri, [vscode_languageserver_types_1.TextEdit.replace(range, literalBlockScalar)]), vscode_languageserver_types_1.CodeActionKind.Refactor));
}
}
}
return results;
}
getKeyOrderActions(diagnostics, document) {
const results = [];
for (const diagnostic of diagnostics) {
if (diagnostic?.code === 'mapKeyOrder') {
let node = getNodeForDiagnostic(document, diagnostic);
while (node && node.type !== 'object') {
node = node.parent;
}
if (node && (0, yaml_1.isMap)(node.internalNode)) {
const sorted = structuredClone(node.internalNode);
const _getTrailingTokens = (value) => {
if (!value)
return;
if (yaml_1.CST.isScalar(value)) {
if (value.type === 'block-scalar') {
value.props ?? (value.props = []);
return value.props;
}
value.end ?? (value.end = []);
return value.end;
}
if (value.type === 'flow-collection') {
value.end ?? (value.end = []);
return value.end;
}
if (value.type === 'block-map') {
const lastItem = value.items[value.items.length - 1];
return lastItem ? _getTrailingTokens(lastItem.value) : undefined;
}
return;
};
if ((sorted.srcToken.type === 'block-map' || sorted.srcToken.type === 'flow-collection') &&
(node.internalNode.srcToken.type === 'block-map' || node.internalNode.srcToken.type === 'flow-collection')) {
sorted.srcToken.items.sort((a, b) => {
if (a.key && b.key && yaml_1.CST.isScalar(a.key) && yaml_1.CST.isScalar(b.key)) {
return a.key.source.localeCompare(b.key.source);
}
if (!a.key && b.key) {
return -1;
}
if (a.key && !b.key) {
return 1;
}
if (!a.key && !b.key) {
return 0;
}
});
for (let i = 0; i < sorted.srcToken.items.length; i++) {
const item = sorted.srcToken.items[i];
const uItem = node.internalNode.srcToken.items[i];
item.start = uItem.start;
// strip leading blank lines so reordered entries stay one-per-line
while (item.start?.[0]?.type === 'newline')
item.start.shift();
const itemTokens = _getTrailingTokens(item.value);
const itemNewLineIndex = itemTokens?.findIndex((p) => p.type === 'newline') ?? -1;
const uNewLineToken = _getTrailingTokens(uItem.value)?.find((p) => p.type === 'newline' && p.offset < node.offset + node.length) ??
null;
if (uNewLineToken && itemNewLineIndex < 0 && itemTokens) {
itemTokens.push({ type: 'newline', indent: 0, offset: item.value.offset, source: '\n' });
}
if (!uNewLineToken && itemNewLineIndex > -1 && itemTokens) {
itemTokens.splice(itemNewLineIndex, 1);
}
}
}
const replaceRange = vscode_languageserver_types_1.Range.create(document.positionAt(node.offset), document.positionAt(node.offset + node.length));
results.push(vscode_languageserver_types_1.CodeAction.create(l10n.t('Fix key order for this map'), createWorkspaceEdit(document.uri, [vscode_languageserver_types_1.TextEdit.replace(replaceRange, yaml_1.CST.stringify(sorted.srcToken))]), vscode_languageserver_types_1.CodeActionKind.QuickFix));
}
}
}
return results;
}
/**
* Check if diagnostic contains info for quick fix
* Supports Enum/Const/Property mismatch
*/
getPossibleQuickFixValues(diagnostic) {
if (typeof diagnostic.data !== 'object') {
return;
}
if (diagnostic.code === vscode_json_languageservice_1.ErrorCode.EnumValueMismatch &&
'values' in diagnostic.data &&
Array.isArray(diagnostic.data.values)) {
return diagnostic.data.values;
}
else if (diagnostic.code === vscode_json_languageservice_1.ErrorCode.PropertyExpected &&
'properties' in diagnostic.data &&
Array.isArray(diagnostic.data.properties)) {
return diagnostic.data.properties;
}
}
getQuickFixForPropertyOrValueMismatch(diagnostics, document) {
const results = [];
for (const diagnostic of diagnostics) {
const values = this.getPossibleQuickFixValues(diagnostic);
if (!values?.length) {
continue;
}
for (const value of values) {
const scalar = typeof value === 'string' ? (0, yamlScalar_1.toYamlStringScalar)(value) : String(value);
results.push(vscode_languageserver_types_1.CodeAction.create(scalar, createWorkspaceEdit(document.uri, [vscode_languageserver_types_1.TextEdit.replace(diagnostic.range, scalar)]), vscode_languageserver_types_1.CodeActionKind.QuickFix));
}
}
return results;
}
}
exports.YamlCodeActions = YamlCodeActions;
function getNodeForDiagnostic(document, diagnostic) {
const yamlDocuments = yaml_documents_1.yamlDocumentsCache.getYamlDocument(document);
const startOffset = document.offsetAt(diagnostic.range.start);
const endOffset = document.offsetAt(diagnostic.range.end);
const yamlDoc = (0, arrUtils_1.matchOffsetToDocument)(startOffset, yamlDocuments);
let node = yamlDoc.getNodeFromOffset(startOffset);
if (node && startOffset < endOffset && node.offset + node.length === startOffset) {
const nodeInsideRange = yamlDoc.getNodeFromOffset(startOffset + 1);
if (nodeInsideRange) {
node = nodeInsideRange;
}
}
return node;
}
function createWorkspaceEdit(uri, edits) {
const changes = {};
changes[uri] = edits;
const edit = {
changes,
};
return edit;
}
});
//# sourceMappingURL=yamlCodeActions.js.map
File diff suppressed because one or more lines are too long
@@ -0,0 +1,11 @@
import { TextDocument } from 'vscode-languageserver-textdocument';
import { CodeLens } from 'vscode-languageserver-types';
import { YAMLSchemaService } from './yamlSchemaService';
import { Telemetry } from '../telemetry';
export declare class YamlCodeLens {
private schemaService;
private readonly telemetry?;
constructor(schemaService: YAMLSchemaService, telemetry?: Telemetry);
getCodeLens(document: TextDocument): Promise<CodeLens[]>;
resolveCodeLens(param: CodeLens): PromiseLike<CodeLens> | CodeLens;
}
@@ -0,0 +1,60 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Red Hat, Inc. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "vscode-languageserver-types", "../../commands", "../parser/yaml-documents", "../utils/schemaUrls", "../utils/schemaUtils"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.YamlCodeLens = void 0;
const vscode_languageserver_types_1 = require("vscode-languageserver-types");
const commands_1 = require("../../commands");
const yaml_documents_1 = require("../parser/yaml-documents");
const schemaUrls_1 = require("../utils/schemaUrls");
const schemaUtils_1 = require("../utils/schemaUtils");
class YamlCodeLens {
constructor(schemaService, telemetry) {
this.schemaService = schemaService;
this.telemetry = telemetry;
}
async getCodeLens(document) {
const result = [];
try {
const yamlDocument = yaml_documents_1.yamlDocumentsCache.getYamlDocument(document);
let schemaUrls = new Map();
for (const currentYAMLDoc of yamlDocument.documents) {
const schema = await this.schemaService.getSchemaForResource(document.uri, currentYAMLDoc);
if (schema?.schema) {
// merge schemas from all docs to avoid duplicates
schemaUrls = new Map([...(0, schemaUrls_1.getSchemaUrls)(schema?.schema), ...schemaUrls]);
}
}
for (const urlToSchema of schemaUrls) {
const lens = vscode_languageserver_types_1.CodeLens.create(vscode_languageserver_types_1.Range.create(0, 0, 0, 0));
lens.command = {
title: (0, schemaUtils_1.getSchemaTitle)(urlToSchema[1], urlToSchema[0]),
command: commands_1.YamlCommands.JUMP_TO_SCHEMA,
arguments: [urlToSchema[0]],
};
result.push(lens);
}
}
catch (err) {
this.telemetry?.sendError('yaml.codeLens.error', err);
}
return result;
}
resolveCodeLens(param) {
return param;
}
}
exports.YamlCodeLens = YamlCodeLens;
});
//# sourceMappingURL=yamlCodeLens.js.map
@@ -0,0 +1 @@
{"version":3,"file":"yamlCodeLens.js","sourceRoot":"","sources":["../../../../src/languageservice/services/yamlCodeLens.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;;;;;;;;;;;;;IAGhG,6EAA8D;IAC9D,6CAA8C;IAC9C,6DAA8D;IAI9D,oDAAoD;IACpD,sDAAsD;IAEtD,MAAa,YAAY;QACvB,YACU,aAAgC,EACvB,SAAqB;YAD9B,kBAAa,GAAb,aAAa,CAAmB;YACvB,cAAS,GAAT,SAAS,CAAY;QACrC,CAAC;QAEJ,KAAK,CAAC,WAAW,CAAC,QAAsB;YACtC,MAAM,MAAM,GAAG,EAAE,CAAC;YAClB,IAAI;gBACF,MAAM,YAAY,GAAG,mCAAkB,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;gBAClE,IAAI,UAAU,GAAG,IAAI,GAAG,EAAsB,CAAC;gBAC/C,KAAK,MAAM,cAAc,IAAI,YAAY,CAAC,SAAS,EAAE;oBACnD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;oBAC3F,IAAI,MAAM,EAAE,MAAM,EAAE;wBAClB,kDAAkD;wBAClD,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAA,0BAAa,EAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC;qBACzE;iBACF;gBACD,KAAK,MAAM,WAAW,IAAI,UAAU,EAAE;oBACpC,MAAM,IAAI,GAAG,sCAAQ,CAAC,MAAM,CAAC,mCAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBACvD,IAAI,CAAC,OAAO,GAAG;wBACb,KAAK,EAAE,IAAA,4BAAc,EAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;wBACrD,OAAO,EAAE,uBAAY,CAAC,cAAc;wBACpC,SAAS,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;qBAC5B,CAAC;oBACF,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;iBACnB;aACF;YAAC,OAAO,GAAG,EAAE;gBACZ,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;aACvD;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,eAAe,CAAC,KAAe;YAC7B,OAAO,KAAK,CAAC;QACf,CAAC;KACF;IApCD,oCAoCC"}
@@ -0,0 +1,3 @@
import { Connection } from 'vscode-languageserver';
import { CommandExecutor } from '../../languageserver/commandExecutor';
export declare function registerCommands(commandExecutor: CommandExecutor, connection: Connection): void;
@@ -0,0 +1,60 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Red Hat, Inc. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "../../commands", "vscode-uri"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.registerCommands = void 0;
const commands_1 = require("../../commands");
const vscode_uri_1 = require("vscode-uri");
function registerCommands(commandExecutor, connection) {
commandExecutor.registerCommand(commands_1.YamlCommands.JUMP_TO_SCHEMA, async (uri) => {
if (!uri) {
return;
}
const wsFolders = await connection.workspace.getWorkspaceFolders();
if (uri.indexOf('://') < 0 && !uri.startsWith('/')) {
if (wsFolders.length === 1) {
const wsUri = vscode_uri_1.URI.parse(wsFolders[0].uri);
uri = wsUri.with({ path: wsUri.path + uri }).toString();
}
}
else if (uri.startsWith('file://') && wsFolders.length === 1 && vscode_uri_1.URI.parse(wsFolders[0].uri).scheme != 'file') {
const wsUri = vscode_uri_1.URI.parse(wsFolders[0].uri);
const pathFromUri = vscode_uri_1.URI.parse(uri).path;
uri = wsUri.with({ path: pathFromUri }).toString();
}
else if (!uri.startsWith('file') && !/^[a-z]:[\\/]/i.test(uri)) {
// if uri points to local file of its a windows path
const origUri = vscode_uri_1.URI.parse(uri);
const customUri = vscode_uri_1.URI.from({
scheme: 'json-schema',
authority: origUri.authority,
path: origUri.path.endsWith('.json') ? origUri.path : origUri.path + '.json',
fragment: uri,
});
uri = customUri.toString();
}
// test if uri is windows path, ie starts with 'c:\' and convert to URI
if (/^[a-z]:[\\/]/i.test(uri)) {
const winUri = vscode_uri_1.URI.file(uri);
uri = winUri.toString();
}
const result = await connection.window.showDocument({ uri: uri, external: false, takeFocus: true });
if (!result) {
connection.window.showErrorMessage(`Cannot open ${uri}`);
}
});
}
exports.registerCommands = registerCommands;
});
//# sourceMappingURL=yamlCommands.js.map
@@ -0,0 +1 @@
{"version":3,"file":"yamlCommands.js","sourceRoot":"","sources":["../../../../src/languageservice/services/yamlCommands.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;;;;;;;;;;;;;IAGhG,6CAA8C;IAE9C,2CAAiC;IAEjC,SAAgB,gBAAgB,CAAC,eAAgC,EAAE,UAAsB;QACvF,eAAe,CAAC,eAAe,CAAC,uBAAY,CAAC,cAAc,EAAE,KAAK,EAAE,GAAW,EAAE,EAAE;YACjF,IAAI,CAAC,GAAG,EAAE;gBACR,OAAO;aACR;YACD,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,mBAAmB,EAAE,CAAC;YAEnE,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;gBAClD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;oBAC1B,MAAM,KAAK,GAAG,gBAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBAC1C,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;iBACzD;aACF;iBAAM,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,gBAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,MAAM,EAAE;gBAC9G,MAAM,KAAK,GAAG,gBAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC1C,MAAM,WAAW,GAAG,gBAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACxC,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;aACpD;iBAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gBAChE,oDAAoD;gBACpD,MAAM,OAAO,GAAG,gBAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC/B,MAAM,SAAS,GAAG,gBAAG,CAAC,IAAI,CAAC;oBACzB,MAAM,EAAE,aAAa;oBACrB,SAAS,EAAE,OAAO,CAAC,SAAS;oBAC5B,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,GAAG,OAAO;oBAC5E,QAAQ,EAAE,GAAG;iBACd,CAAC,CAAC;gBACH,GAAG,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;aAC5B;YAED,uEAAuE;YACvE,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gBAC7B,MAAM,MAAM,GAAG,gBAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC7B,GAAG,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;aACzB;YAED,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACpG,IAAI,CAAC,MAAM,EAAE;gBACX,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,eAAe,GAAG,EAAE,CAAC,CAAC;aAC1D;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAvCD,4CAuCC"}
@@ -0,0 +1,77 @@
import { TextDocument } from 'vscode-languageserver-textdocument';
import { ClientCapabilities } from 'vscode-languageserver';
import { CompletionItem as CompletionItemBase, CompletionList, Position } from 'vscode-languageserver-types';
import { Telemetry } from '../telemetry';
import { YamlDocuments } from '../parser/yaml-documents';
import { LanguageSettings } from '../yamlLanguageService';
import { YAMLSchemaService } from './yamlSchemaService';
import { JSONSchema } from '../jsonSchema';
import { SettingsState } from '../../yamlSettings';
interface ParentCompletionItemOptions {
schema: JSONSchema;
indent?: string;
insertTexts?: string[];
}
interface CompletionItem extends CompletionItemBase {
parent?: ParentCompletionItemOptions;
}
export declare class YamlCompletion {
private schemaService;
private clientCapabilities;
private yamlDocument;
private readonly telemetry?;
private customTags;
private completionEnabled;
private configuredIndentation;
private yamlVersion;
private isSingleQuote;
private indentation;
private arrayPrefixIndentation;
private supportsMarkdown;
private disableDefaultProperties;
private parentSkeletonSelectedFirst;
constructor(schemaService: YAMLSchemaService, clientCapabilities: ClientCapabilities, yamlDocument: YamlDocuments, telemetry?: Telemetry);
configure(languageSettings: LanguageSettings, yamlSettings?: SettingsState): void;
doComplete(document: TextDocument, position: Position, isKubernetes?: boolean, doComplete?: boolean): Promise<CompletionList>;
updateCompletionText(completionItem: CompletionItem, text: string): void;
mergeSimpleInsertTexts(label: string, existingText: string, addingText: string, oneOfSchema: boolean): string | undefined;
getValuesFromInsertText(insertText: string): string[];
private finalizeParentCompletion;
private createTempObjNode;
private addPropertyCompletions;
private getValueCompletions;
private addArrayItemValueCompletion;
private getInsertTextForProperty;
private getInsertTextForObject;
private getInsertTextForArray;
private getInsertTextForGuessedValue;
private getInsertTextForPlainText;
private getInsertTextForValue;
private getInsertTemplateForValue;
private addSchemaValueCompletions;
private collectTypes;
private addDefaultValueCompletions;
private addEnumValueCompletions;
private getLabelForValue;
private collectDefaultSnippets;
private getInsertTextForSnippetValue;
private addBooleanValueCompletion;
private addNullValueCompletion;
private getLabelForSnippetValue;
private getCustomTagValueCompletions;
private addCustomTagValueCompletion;
private getDocumentationWithMarkdownText;
private getSuggestionKind;
private getCurrentWord;
private fromMarkup;
private doesSupportMarkdown;
private findItemAtOffset;
private getPropertyNamesCandidates;
getQuote(): string;
/**
* simplify `{$1:value}` to `value`
*/
evaluateTab1Symbol(value: string): string;
isParentCompletionItem(item: CompletionItemBase): item is CompletionItem;
}
export {};
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
@@ -0,0 +1,9 @@
import { DefinitionParams } from 'vscode-languageserver-protocol';
import { TextDocument } from 'vscode-languageserver-textdocument';
import { DefinitionLink } from 'vscode-languageserver-types';
import { Telemetry } from '../telemetry';
export declare class YamlDefinition {
private readonly telemetry?;
constructor(telemetry?: Telemetry);
getDefinition(document: TextDocument, params: DefinitionParams): DefinitionLink[] | undefined;
}
@@ -0,0 +1,51 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Red Hat, Inc. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "vscode-languageserver-types", "yaml", "../parser/yaml-documents", "../utils/arrUtils", "../utils/textBuffer"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.YamlDefinition = void 0;
const vscode_languageserver_types_1 = require("vscode-languageserver-types");
const yaml_1 = require("yaml");
const yaml_documents_1 = require("../parser/yaml-documents");
const arrUtils_1 = require("../utils/arrUtils");
const textBuffer_1 = require("../utils/textBuffer");
class YamlDefinition {
constructor(telemetry) {
this.telemetry = telemetry;
}
getDefinition(document, params) {
try {
const yamlDocument = yaml_documents_1.yamlDocumentsCache.getYamlDocument(document);
const offset = document.offsetAt(params.position);
const currentDoc = (0, arrUtils_1.matchOffsetToDocument)(offset, yamlDocument);
if (currentDoc) {
const [node] = currentDoc.getNodeFromPosition(offset, new textBuffer_1.TextBuffer(document));
if (node && (0, yaml_1.isAlias)(node)) {
const defNode = node.resolve(currentDoc.internalDocument);
if (defNode && defNode.range) {
const targetRange = vscode_languageserver_types_1.Range.create(document.positionAt(defNode.range[0]), document.positionAt(defNode.range[2]));
const selectionRange = vscode_languageserver_types_1.Range.create(document.positionAt(defNode.range[0]), document.positionAt(defNode.range[1]));
return [vscode_languageserver_types_1.LocationLink.create(document.uri, targetRange, selectionRange)];
}
}
}
}
catch (err) {
this.telemetry?.sendError('yaml.definition.error', err);
}
return undefined;
}
}
exports.YamlDefinition = YamlDefinition;
});
//# sourceMappingURL=yamlDefinition.js.map
@@ -0,0 +1 @@
{"version":3,"file":"yamlDefinition.js","sourceRoot":"","sources":["../../../../src/languageservice/services/yamlDefinition.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;;;;;;;;;;;;;IAIhG,6EAAkF;IAClF,+BAA+B;IAE/B,6DAA8D;IAC9D,gDAA0D;IAC1D,oDAAiD;IAEjD,MAAa,cAAc;QACzB,YAA6B,SAAqB;YAArB,cAAS,GAAT,SAAS,CAAY;QAAG,CAAC;QAEtD,aAAa,CAAC,QAAsB,EAAE,MAAwB;YAC5D,IAAI;gBACF,MAAM,YAAY,GAAG,mCAAkB,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;gBAClE,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAClD,MAAM,UAAU,GAAG,IAAA,gCAAqB,EAAC,MAAM,EAAE,YAAY,CAAC,CAAC;gBAC/D,IAAI,UAAU,EAAE;oBACd,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,uBAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAChF,IAAI,IAAI,IAAI,IAAA,cAAO,EAAC,IAAI,CAAC,EAAE;wBACzB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;wBAC1D,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE;4BAC5B,MAAM,WAAW,GAAG,mCAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;4BAC/G,MAAM,cAAc,GAAG,mCAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;4BAClH,OAAO,CAAC,0CAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;yBACzE;qBACF;iBACF;aACF;YAAC,OAAO,GAAG,EAAE;gBACZ,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;aACzD;YAED,OAAO,SAAS,CAAC;QACnB,CAAC;KACF;IAzBD,wCAyBC"}
@@ -0,0 +1,4 @@
import { FoldingRange } from 'vscode-languageserver-types';
import { FoldingRangesContext } from '../yamlTypes';
import { TextDocument } from 'vscode-languageserver-textdocument';
export declare function getFoldingRanges(document: TextDocument, context: FoldingRangesContext): FoldingRange[] | undefined;
@@ -0,0 +1,76 @@
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "vscode-languageserver-types", "../parser/yaml-documents"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getFoldingRanges = void 0;
/*---------------------------------------------------------------------------------------------
* Copyright (c) Red Hat, Inc. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
const vscode_languageserver_types_1 = require("vscode-languageserver-types");
const yaml_documents_1 = require("../parser/yaml-documents");
function getFoldingRanges(document, context) {
if (!document) {
return;
}
const result = [];
const doc = yaml_documents_1.yamlDocumentsCache.getYamlDocument(document);
for (const ymlDoc of doc.documents) {
if (doc.documents.length > 1) {
result.push(createNormalizedFolding(document, ymlDoc.root));
}
ymlDoc.visit((node) => {
if (node.type === 'object' && node.parent?.type === 'array') {
result.push(createNormalizedFolding(document, node));
}
if (node.type === 'property' && node.valueNode) {
switch (node.valueNode.type) {
case 'array':
case 'object':
result.push(createNormalizedFolding(document, node));
break;
case 'string': {
// check if it is a multi-line string
const nodePosn = document.positionAt(node.offset);
const valuePosn = document.positionAt(node.valueNode.offset + node.valueNode.length);
if (nodePosn.line !== valuePosn.line) {
result.push(createNormalizedFolding(document, node));
}
break;
}
default:
return true;
}
}
return true;
});
}
const rangeLimit = context && context.rangeLimit;
if (typeof rangeLimit !== 'number' || result.length <= rangeLimit) {
return result;
}
if (context && context.onRangeLimitExceeded) {
context.onRangeLimitExceeded(document.uri);
}
return result.slice(0, context.rangeLimit);
}
exports.getFoldingRanges = getFoldingRanges;
function createNormalizedFolding(document, node) {
const startPos = document.positionAt(node.offset);
let endPos = document.positionAt(node.offset + node.length);
const textFragment = document.getText(vscode_languageserver_types_1.Range.create(startPos, endPos));
const newLength = textFragment.length - textFragment.trimRight().length;
if (newLength > 0) {
endPos = document.positionAt(node.offset + node.length - newLength);
}
return vscode_languageserver_types_1.FoldingRange.create(startPos.line, endPos.line, startPos.character, endPos.character);
}
});
//# sourceMappingURL=yamlFolding.js.map
@@ -0,0 +1 @@
{"version":3,"file":"yamlFolding.js","sourceRoot":"","sources":["../../../../src/languageservice/services/yamlFolding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
import { TextEdit, FormattingOptions } from 'vscode-languageserver-types';
import { CustomFormatterOptions, LanguageSettings } from '../yamlLanguageService';
import { TextDocument } from 'vscode-languageserver-textdocument';
export declare class YAMLFormatter {
private formatterEnabled;
configure(shouldFormat: LanguageSettings): void;
format(document: TextDocument, options?: Partial<FormattingOptions> & CustomFormatterOptions): Promise<TextEdit[]>;
}
@@ -0,0 +1,60 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Red Hat, Inc. All rights reserved.
* Copyright (c) Adam Voss. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "vscode-languageserver-types", "prettier/plugins/yaml", "prettier/plugins/estree", "prettier/standalone"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.YAMLFormatter = void 0;
const vscode_languageserver_types_1 = require("vscode-languageserver-types");
const yamlPlugin = require("prettier/plugins/yaml");
const estreePlugin = require("prettier/plugins/estree");
const standalone_1 = require("prettier/standalone");
class YAMLFormatter {
constructor() {
this.formatterEnabled = true;
}
configure(shouldFormat) {
if (shouldFormat) {
this.formatterEnabled = shouldFormat.format;
}
}
async format(document, options = {}) {
if (!this.formatterEnabled) {
return [];
}
try {
const text = document.getText();
const prettierOptions = {
parser: 'yaml',
plugins: [yamlPlugin, estreePlugin],
// --- FormattingOptions ---
tabWidth: options.tabWidth || options.tabSize,
// --- CustomFormatterOptions ---
singleQuote: options.singleQuote,
bracketSpacing: options.bracketSpacing,
// 'preserve' is the default for Options.proseWrap. See also server.ts
proseWrap: 'always' === options.proseWrap ? 'always' : 'never' === options.proseWrap ? 'never' : 'preserve',
printWidth: options.printWidth,
trailingComma: options.trailingComma === false ? 'none' : 'all',
};
const formatted = await (0, standalone_1.format)(text, prettierOptions);
return [vscode_languageserver_types_1.TextEdit.replace(vscode_languageserver_types_1.Range.create(vscode_languageserver_types_1.Position.create(0, 0), document.positionAt(text.length)), formatted)];
}
catch (error) {
return [];
}
}
}
exports.YAMLFormatter = YAMLFormatter;
});
//# sourceMappingURL=yamlFormatter.js.map
@@ -0,0 +1 @@
{"version":3,"file":"yamlFormatter.js","sourceRoot":"","sources":["../../../../src/languageservice/services/yamlFormatter.ts"],"names":[],"mappings":"AAAA;;;;gGAIgG;;;;;;;;;;;;;IAEhG,6EAA2F;IAG3F,oDAAoD;IACpD,wDAAwD;IACxD,oDAA6C;IAG7C,MAAa,aAAa;QAA1B;YACU,qBAAgB,GAAG,IAAI,CAAC;QA0ClC,CAAC;QAxCQ,SAAS,CAAC,YAA8B;YAC7C,IAAI,YAAY,EAAE;gBAChB,IAAI,CAAC,gBAAgB,GAAG,YAAY,CAAC,MAAM,CAAC;aAC7C;QACH,CAAC;QAEM,KAAK,CAAC,MAAM,CACjB,QAAsB,EACtB,UAA+D,EAAE;YAEjE,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;gBAC1B,OAAO,EAAE,CAAC;aACX;YAED,IAAI;gBACF,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;gBAEhC,MAAM,eAAe,GAAY;oBAC/B,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,CAAC,UAAU,EAAE,YAAY,CAAC;oBAEnC,4BAA4B;oBAC5B,QAAQ,EAAG,OAAO,CAAC,QAAmB,IAAI,OAAO,CAAC,OAAO;oBAEzD,iCAAiC;oBACjC,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,cAAc,EAAE,OAAO,CAAC,cAAc;oBACtC,sEAAsE;oBACtE,SAAS,EAAE,QAAQ,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU;oBAC3G,UAAU,EAAE,OAAO,CAAC,UAAU;oBAC9B,aAAa,EAAE,OAAO,CAAC,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;iBAChE,CAAC;gBAEF,MAAM,SAAS,GAAG,MAAM,IAAA,mBAAM,EAAC,IAAI,EAAE,eAAe,CAAC,CAAC;gBAEtD,OAAO,CAAC,sCAAQ,CAAC,OAAO,CAAC,mCAAK,CAAC,MAAM,CAAC,sCAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;aAC7G;YAAC,OAAO,KAAK,EAAE;gBACd,OAAO,EAAE,CAAC;aACX;QACH,CAAC;KACF;IA3CD,sCA2CC"}
@@ -0,0 +1,47 @@
import { TextDocument } from 'vscode-languageserver-textdocument';
import { Hover, Position } from 'vscode-languageserver-types';
import { Telemetry } from '../telemetry';
import { LanguageSettings } from '../yamlLanguageService';
import { YAMLSchemaService } from './yamlSchemaService';
export declare class YAMLHover {
private readonly telemetry?;
private shouldHover;
private shouldHoverAnchor;
private indentation;
private schemaService;
constructor(schemaService: YAMLSchemaService, telemetry?: Telemetry);
configure(languageSettings: LanguageSettings): void;
doHover(document: TextDocument, position: Position, isKubernetes?: boolean): Promise<Hover | null>;
private getHover;
/**
* Resolves merge keys (<<) and anchors recursively in an object node
* @param node The object AST node to resolve
* @param doc The YAML document for resolving anchors
* @param currentRecursionLevel Current recursion level (default: 0)
* @returns A plain JavaScript object with all merges resolved
*/
private resolveMergeKeys;
/**
* Resolves a merge value (which might be an alias) and recursively resolves its merge keys
* @param node The AST node that might be an alias or object
* @param doc The YAML document for resolving anchors
* @param currentRecursionLevel Current recursion level
* @returns The resolved value
*/
private resolveMergeValue;
/**
* Converts an AST node to a plain JavaScript value
* @param node The AST node to convert
* @param doc The YAML document for resolving anchors
* @param currentRecursionLevel Current recursion level
* @returns The converted value
*/
private astNodeToValue;
/**
* Converts a YAML Node to a plain JavaScript value
* @param node The YAML node to convert
* @returns The converted value
*/
private nodeToValue;
private toMarkdown;
}
@@ -0,0 +1,380 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Red Hat, Inc. All rights reserved.
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "@vscode/l10n", "path", "vscode-languageserver-types", "vscode-uri", "yaml", "../parser/isKubernetes", "../parser/astNodeUtils", "../parser/yaml-documents", "../utils/arrUtils", "../utils/yamlScalar"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.YAMLHover = void 0;
const l10n = require("@vscode/l10n");
const path = require("path");
const vscode_languageserver_types_1 = require("vscode-languageserver-types");
const vscode_uri_1 = require("vscode-uri");
const yaml_1 = require("yaml");
const isKubernetes_1 = require("../parser/isKubernetes");
const astNodeUtils_1 = require("../parser/astNodeUtils");
const yaml_documents_1 = require("../parser/yaml-documents");
const arrUtils_1 = require("../utils/arrUtils");
const yamlScalar_1 = require("../utils/yamlScalar");
class YAMLHover {
constructor(schemaService, telemetry) {
this.telemetry = telemetry;
this.shouldHover = true;
this.schemaService = schemaService;
}
configure(languageSettings) {
if (languageSettings) {
this.shouldHover = languageSettings.hover;
this.shouldHoverAnchor = languageSettings.hoverAnchor;
this.indentation = languageSettings.indentation;
}
}
doHover(document, position, isKubernetes = false) {
try {
if (!this.shouldHover || !document) {
return Promise.resolve(undefined);
}
const doc = yaml_documents_1.yamlDocumentsCache.getYamlDocument(document);
const offset = document.offsetAt(position);
const currentDoc = (0, arrUtils_1.matchOffsetToDocument)(offset, doc);
if (currentDoc === null) {
return Promise.resolve(undefined);
}
(0, isKubernetes_1.setKubernetesParserOption)(doc.documents, isKubernetes);
const currentDocIndex = doc.documents.indexOf(currentDoc);
currentDoc.currentDocIndex = currentDocIndex;
return this.getHover(document, position, currentDoc);
}
catch (error) {
this.telemetry?.sendError('yaml.hover.error', error);
}
}
// method copied from https://github.com/microsoft/vscode-json-languageservice/blob/2ea5ad3d2ffbbe40dea11cfe764a502becf113ce/src/services/jsonHover.ts#L23
getHover(document, position, doc) {
const offset = document.offsetAt(position);
let node = doc.getNodeFromOffset(offset);
if (!node ||
((node.type === 'object' || node.type === 'array') && offset > node.offset + 1 && offset < node.offset + node.length - 1)) {
return Promise.resolve(null);
}
const hoverRangeNode = node;
// use the property description when hovering over an object key
if (node.type === 'string') {
const parent = node.parent;
if (parent && parent.type === 'property' && parent.keyNode === node) {
node = parent.valueNode;
if (!node) {
return Promise.resolve(null);
}
}
}
const hoverRange = vscode_languageserver_types_1.Range.create(document.positionAt(hoverRangeNode.offset), document.positionAt(hoverRangeNode.offset + hoverRangeNode.length));
const createHover = (contents) => {
const markupContent = {
kind: vscode_languageserver_types_1.MarkupKind.Markdown,
value: contents,
};
const result = {
contents: markupContent,
range: hoverRange,
};
return result;
};
if (this.shouldHoverAnchor && node.type === 'property' && node.valueNode) {
if (node.valueNode.type === 'object') {
const resolved = this.resolveMergeKeys(node.valueNode, doc);
const contents = '```yaml\n' + (0, yaml_1.stringify)(resolved, null, 2) + '\n```';
return Promise.resolve(createHover(contents));
}
}
const removePipe = (value) => {
return value.replace(/\s\|\|\s*$/, '');
};
return this.schemaService.getSchemaForResource(document.uri, doc).then((schema) => {
if (schema && node && !schema.errors.length) {
const matchingSchemas = doc.getMatchingSchemas(schema.schema, node.offset);
let title = undefined;
let markdownDescription = undefined;
let markdownEnumDescriptions = [];
const markdownExamples = [];
const markdownEnums = [];
let enumIdx = undefined;
matchingSchemas.every((s) => {
if ((s.node === node || (node.type === 'property' && node.valueNode === s.node)) && !s.inverted && s.schema) {
title = title || s.schema.title || s.schema.closestTitle;
markdownDescription = markdownDescription || s.schema.markdownDescription || this.toMarkdown(s.schema.description);
if (s.schema.enum) {
enumIdx = s.schema.enum.indexOf((0, astNodeUtils_1.getNodeValue)(node));
if (s.schema.markdownEnumDescriptions) {
markdownEnumDescriptions = s.schema.markdownEnumDescriptions;
}
else if (s.schema.enumDescriptions) {
markdownEnumDescriptions = s.schema.enumDescriptions.map(this.toMarkdown, this);
}
else {
markdownEnumDescriptions = [];
}
s.schema.enum.forEach((enumValue, idx) => {
var _a;
enumValue = typeof enumValue === 'string' ? (0, yamlScalar_1.toYamlStringScalar)(enumValue, false) : JSON.stringify(enumValue);
//insert only if the value is not present yet (avoiding duplicates)
//but it also adds or keeps the description of the enum value
const foundIdx = markdownEnums.findIndex((me) => me.value === enumValue);
if (foundIdx < 0) {
markdownEnums.push({
value: enumValue,
description: markdownEnumDescriptions[idx],
});
}
else {
(_a = markdownEnums[foundIdx]).description || (_a.description = markdownEnumDescriptions[idx]);
}
});
}
if (s.schema.anyOf && isAllSchemasMatched(node, matchingSchemas, s.schema)) {
//if append title and description of all matched schemas on hover
title = '';
markdownDescription = s.schema.description ? s.schema.description + '\n' : '';
s.schema.anyOf.forEach((childSchema, index) => {
title += childSchema.title || s.schema.closestTitle || '';
markdownDescription += childSchema.markdownDescription || this.toMarkdown(childSchema.description) || '';
if (index !== s.schema.anyOf.length - 1) {
title += ' || ';
markdownDescription += ' || ';
}
});
title = removePipe(title);
markdownDescription = removePipe(markdownDescription);
}
if (s.schema.examples) {
s.schema.examples.forEach((example) => {
markdownExamples.push((0, yaml_1.stringify)(example, null, 2));
});
}
}
return true;
});
let result = '';
if (title) {
result = '#### ' + this.toMarkdown(title);
}
if (markdownDescription) {
result = ensureLineBreak(result);
result += markdownDescription;
}
if (markdownEnums.length !== 0) {
result = ensureLineBreak(result);
result += l10n.t('Allowed Values:') + '\n\n';
if (enumIdx) {
markdownEnums.unshift(markdownEnums.splice(enumIdx, 1)[0]);
}
markdownEnums.forEach((me) => {
if (me.description) {
result += `* \`${toMarkdownCodeBlock(me.value)}\`: ${me.description}\n`;
}
else {
result += `* \`${toMarkdownCodeBlock(me.value)}\`\n`;
}
});
}
if (markdownExamples.length !== 0) {
markdownExamples.forEach((example) => {
result = ensureLineBreak(result);
result += l10n.t('Example:') + '\n\n';
result += `\`\`\`yaml\n${example}\`\`\`\n`;
});
}
if (result.length > 0 && schema.schema.url) {
result = ensureLineBreak(result);
result += l10n.t('Source: [{0}]({1})', getSchemaName(schema.schema), schema.schema.url);
}
return createHover(result);
}
return null;
});
}
/**
* Resolves merge keys (<<) and anchors recursively in an object node
* @param node The object AST node to resolve
* @param doc The YAML document for resolving anchors
* @param currentRecursionLevel Current recursion level (default: 0)
* @returns A plain JavaScript object with all merges resolved
*/
resolveMergeKeys(node, doc, currentRecursionLevel = 0) {
const result = {};
const unprocessedProperties = [...node.properties];
while (unprocessedProperties.length > 0) {
const propertyNode = unprocessedProperties.shift();
const key = propertyNode.keyNode.value;
if (key === '<<' && propertyNode.valueNode) {
// Handle merge key
const mergeValue = this.resolveMergeValue(propertyNode.valueNode, doc, currentRecursionLevel + 1);
if (mergeValue && typeof mergeValue === 'object' && !Array.isArray(mergeValue)) {
// Merge properties from the resolved value
const mergeKeys = Object.keys(mergeValue);
for (const mergeKey of mergeKeys) {
result[mergeKey] = mergeValue[mergeKey];
}
}
}
else {
// Regular property
result[key] = this.astNodeToValue(propertyNode.valueNode, doc, currentRecursionLevel);
}
}
return result;
}
/**
* Resolves a merge value (which might be an alias) and recursively resolves its merge keys
* @param node The AST node that might be an alias or object
* @param doc The YAML document for resolving anchors
* @param currentRecursionLevel Current recursion level
* @returns The resolved value
*/
resolveMergeValue(node, doc, currentRecursionLevel) {
const MAX_MERGE_RECURSION_LEVEL = 10;
// Check if we've exceeded max recursion level
if (currentRecursionLevel >= MAX_MERGE_RECURSION_LEVEL) {
return { '<<': node.parent.internalNode['value'] + ' (recursion limit reached)' };
}
// If it's an object node, resolve its merge keys
if (node.type === 'object') {
return this.resolveMergeKeys(node, doc, currentRecursionLevel);
}
// Otherwise, convert to value
return this.astNodeToValue(node, doc, currentRecursionLevel);
}
/**
* Converts an AST node to a plain JavaScript value
* @param node The AST node to convert
* @param doc The YAML document for resolving anchors
* @param currentRecursionLevel Current recursion level
* @returns The converted value
*/
astNodeToValue(node, doc, currentRecursionLevel) {
if (!node) {
return null;
}
switch (node.type) {
case 'object': {
return this.resolveMergeKeys(node, doc, currentRecursionLevel);
}
case 'array': {
return node.children.map((child) => this.astNodeToValue(child, doc, currentRecursionLevel));
}
case 'string':
case 'number':
case 'boolean':
case 'null': {
return node.value;
}
default: {
return this.nodeToValue(node.internalNode);
}
}
}
/**
* Converts a YAML Node to a plain JavaScript value
* @param node The YAML node to convert
* @returns The converted value
*/
nodeToValue(node) {
if ((0, yaml_1.isAlias)(node)) {
return node.source;
}
if ((0, yaml_1.isMap)(node)) {
const result = {};
for (const pair of node.items) {
if (pair.key && pair.value) {
const key = this.nodeToValue(pair.key);
const value = this.nodeToValue(pair.value);
if (typeof key === 'string') {
result[key] = value;
}
}
}
return result;
}
if ((0, yaml_1.isSeq)(node)) {
return node.items.map((item) => this.nodeToValue(item));
}
return node.value;
}
// copied from https://github.com/microsoft/vscode-json-languageservice/blob/2ea5ad3d2ffbbe40dea11cfe764a502becf113ce/src/services/jsonHover.ts#L112
toMarkdown(plain) {
if (plain) {
let escaped = plain.replace(/([^\n\r])(\r?\n)([^\n\r])/gm, '$1\n\n$3'); // single new lines to \n\n (Markdown paragraph)
escaped = escaped.replace(/[\\`*_{}[\]#+\-!]/g, '\\$&'); // escape some of the markdown syntax tokens http://daringfireball.net/projects/markdown/syntax#backslash to avoid unintended formatting
if (this.indentation !== undefined) {
// escape indentation whitespace to prevent it from being converted to markdown code blocks.
const indentationMatchRegex = new RegExp(` {${this.indentation.length}}`, 'g');
escaped = escaped.replace(indentationMatchRegex, '&emsp;');
}
return escaped;
}
return undefined;
}
}
exports.YAMLHover = YAMLHover;
function ensureLineBreak(content) {
if (content.length === 0) {
return content;
}
if (!content.endsWith('\n')) {
content += '\n';
}
return content + '\n';
}
function getSchemaName(schema) {
let result = 'JSON Schema';
const urlString = schema.url;
if (urlString) {
const url = vscode_uri_1.URI.parse(urlString);
result = path.basename(url.fsPath);
}
else if (schema.title) {
result = schema.title;
}
return result;
}
// copied from https://github.com/microsoft/vscode-json-languageservice/blob/2ea5ad3d2ffbbe40dea11cfe764a502becf113ce/src/services/jsonHover.ts#L122
function toMarkdownCodeBlock(content) {
// see https://daringfireball.net/projects/markdown/syntax#precode
if (content.indexOf('`') !== -1) {
return '`` ' + content + ' ``';
}
return content;
}
/**
* check all the schemas which is inside anyOf presented or not in matching schema.
* @param node node
* @param matchingSchemas all matching schema
* @param schema scheam which is having anyOf
* @returns true if all the schemas which inside anyOf presents in matching schema
*/
function isAllSchemasMatched(node, matchingSchemas, schema) {
let count = 0;
for (const matchSchema of matchingSchemas) {
if (node === matchSchema.node && matchSchema.schema !== schema) {
schema.anyOf.forEach((childSchema) => {
if (matchSchema.schema.title === childSchema.title &&
matchSchema.schema.description === childSchema.description &&
matchSchema.schema.properties === childSchema.properties) {
count++;
}
});
}
}
return count === schema.anyOf.length;
}
});
//# sourceMappingURL=yamlHover.js.map
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
import { DocumentLink } from 'vscode-languageserver-types';
import { TextDocument } from 'vscode-languageserver-textdocument';
import { Telemetry } from '../telemetry';
export declare class YamlLinks {
private readonly telemetry?;
constructor(telemetry?: Telemetry);
findLinks(document: TextDocument): Promise<DocumentLink[]>;
}
@@ -0,0 +1,41 @@
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "vscode-json-languageservice/lib/umd/services/jsonLinks", "../parser/yaml-documents"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.YamlLinks = void 0;
/*---------------------------------------------------------------------------------------------
* Copyright (c) Red Hat, Inc. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
const jsonLinks_1 = require("vscode-json-languageservice/lib/umd/services/jsonLinks");
const yaml_documents_1 = require("../parser/yaml-documents");
class YamlLinks {
constructor(telemetry) {
this.telemetry = telemetry;
}
findLinks(document) {
try {
const doc = yaml_documents_1.yamlDocumentsCache.getYamlDocument(document);
// Find links across all YAML Documents then report them back once finished
const linkPromises = [];
for (const yamlDoc of doc.documents) {
linkPromises.push((0, jsonLinks_1.findLinks)(document, yamlDoc));
}
// Wait for all the promises to return and then flatten them into one DocumentLink array
return Promise.all(linkPromises).then((yamlLinkArray) => [].concat(...yamlLinkArray));
}
catch (err) {
this.telemetry?.sendError('yaml.documentLink.error', err);
}
}
}
exports.YamlLinks = YamlLinks;
});
//# sourceMappingURL=yamlLinks.js.map
@@ -0,0 +1 @@
{"version":3,"file":"yamlLinks.js","sourceRoot":"","sources":["../../../../src/languageservice/services/yamlLinks.ts"],"names":[],"mappings":";;;;;;;;;;;;IAAA;;;oGAGgG;IAChG,sFAAoG;IAIpG,6DAA8D;IAE9D,MAAa,SAAS;QACpB,YAA6B,SAAqB;YAArB,cAAS,GAAT,SAAS,CAAY;QAAG,CAAC;QAEtD,SAAS,CAAC,QAAsB;YAC9B,IAAI;gBACF,MAAM,GAAG,GAAG,mCAAkB,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;gBACzD,2EAA2E;gBAC3E,MAAM,YAAY,GAAG,EAAE,CAAC;gBACxB,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,SAAS,EAAE;oBACnC,YAAY,CAAC,IAAI,CAAC,IAAA,qBAAa,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;iBACrD;gBACD,wFAAwF;gBACxF,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;aACvF;YAAC,OAAO,GAAG,EAAE;gBACZ,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;aAC3D;QACH,CAAC;KACF;IAjBD,8BAiBC"}
@@ -0,0 +1,4 @@
import { DocumentOnTypeFormattingParams } from 'vscode-languageserver';
import { TextEdit } from 'vscode-languageserver-types';
import { TextDocument } from 'vscode-languageserver-textdocument';
export declare function doDocumentOnTypeFormatting(document: TextDocument, params: DocumentOnTypeFormattingParams): TextEdit[] | undefined;
@@ -0,0 +1,57 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Red Hat, Inc. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "vscode-languageserver-types", "../utils/textBuffer"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.doDocumentOnTypeFormatting = void 0;
const vscode_languageserver_types_1 = require("vscode-languageserver-types");
const textBuffer_1 = require("../utils/textBuffer");
function doDocumentOnTypeFormatting(document, params) {
const { position } = params;
const tb = new textBuffer_1.TextBuffer(document);
if (params.ch === '\n') {
const previousLine = tb.getLineContent(position.line - 1);
if (previousLine.trimRight().endsWith(':')) {
const currentLine = tb.getLineContent(position.line);
const subLine = currentLine.substring(position.character, currentLine.length);
const isInArray = previousLine.indexOf(' - ') !== -1;
if (subLine.trimRight().length === 0) {
const indentationFix = position.character - (previousLine.length - previousLine.trimLeft().length);
if (indentationFix === params.options.tabSize && !isInArray) {
return; // skip if line already has proper formatting
}
const result = [];
if (currentLine.length > 0) {
result.push(vscode_languageserver_types_1.TextEdit.del(vscode_languageserver_types_1.Range.create(position, vscode_languageserver_types_1.Position.create(position.line, currentLine.length - 1))));
}
result.push(vscode_languageserver_types_1.TextEdit.insert(position, ' '.repeat(params.options.tabSize + (isInArray ? 2 - indentationFix : 0))));
return result;
}
if (isInArray) {
return [vscode_languageserver_types_1.TextEdit.insert(position, ' '.repeat(params.options.tabSize))];
}
}
if (previousLine.trimRight().endsWith('|')) {
return [vscode_languageserver_types_1.TextEdit.insert(position, ' '.repeat(params.options.tabSize))];
}
if (previousLine.includes(' - ') && !previousLine.includes(': ')) {
return [vscode_languageserver_types_1.TextEdit.insert(position, '- ')];
}
if (previousLine.includes(' - ') && previousLine.includes(': ')) {
return [vscode_languageserver_types_1.TextEdit.insert(position, ' ')];
}
}
}
exports.doDocumentOnTypeFormatting = doDocumentOnTypeFormatting;
});
//# sourceMappingURL=yamlOnTypeFormatting.js.map
@@ -0,0 +1 @@
{"version":3,"file":"yamlOnTypeFormatting.js","sourceRoot":"","sources":["../../../../src/languageservice/services/yamlOnTypeFormatting.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;;;;;;;;;;;;;IAGhG,6EAAwE;IAExE,oDAAiD;IAEjD,SAAgB,0BAA0B,CACxC,QAAsB,EACtB,MAAsC;QAEtC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;QAC5B,MAAM,EAAE,GAAG,IAAI,uBAAU,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,MAAM,CAAC,EAAE,KAAK,IAAI,EAAE;YACtB,MAAM,YAAY,GAAG,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAC1D,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBAC1C,MAAM,WAAW,GAAG,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACrD,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;gBAC9E,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;gBACrD,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;oBACpC,MAAM,cAAc,GAAG,QAAQ,CAAC,SAAS,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC;oBACnG,IAAI,cAAc,KAAK,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,SAAS,EAAE;wBAC3D,OAAO,CAAC,6CAA6C;qBACtD;oBACD,MAAM,MAAM,GAAG,EAAE,CAAC;oBAClB,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;wBAC1B,MAAM,CAAC,IAAI,CAAC,sCAAQ,CAAC,GAAG,CAAC,mCAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,sCAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;qBAC3G;oBACD,MAAM,CAAC,IAAI,CAAC,sCAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAElH,OAAO,MAAM,CAAC;iBACf;gBACD,IAAI,SAAS,EAAE;oBACb,OAAO,CAAC,sCAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;iBACxE;aACF;YAED,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBAC1C,OAAO,CAAC,sCAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;aACxE;YAED,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;gBAChE,OAAO,CAAC,sCAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;aAC1C;YAED,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;gBAC/D,OAAO,CAAC,sCAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;aAC1C;SACF;IACH,CAAC;IA1CD,gEA0CC"}
@@ -0,0 +1,18 @@
import { TextDocument } from 'vscode-languageserver-textdocument';
import { Range, WorkspaceEdit } from 'vscode-languageserver-types';
import { Telemetry } from '../telemetry';
import { PrepareRenameParams, RenameParams } from 'vscode-languageserver-protocol';
export declare class YamlRename {
private readonly telemetry?;
constructor(telemetry?: Telemetry);
prepareRename(document: TextDocument, params: PrepareRenameParams): Range | null;
doRename(document: TextDocument, params: RenameParams): WorkspaceEdit | null;
private findTarget;
private findByToken;
private findAnchorToken;
private getAnchorFromToken;
private getAnchorFromCollectionItem;
private getNameRange;
private isOffsetInsideToken;
private findInvalidAnchorChar;
}
@@ -0,0 +1,198 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Red Hat, Inc. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "vscode-languageserver-types", "../parser/yaml-documents", "../utils/arrUtils", "../utils/textBuffer", "yaml", "../utils/yamlAstUtils", "vscode-languageserver-protocol"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.YamlRename = void 0;
const vscode_languageserver_types_1 = require("vscode-languageserver-types");
const yaml_documents_1 = require("../parser/yaml-documents");
const arrUtils_1 = require("../utils/arrUtils");
const textBuffer_1 = require("../utils/textBuffer");
const yaml_1 = require("yaml");
const yamlAstUtils_1 = require("../utils/yamlAstUtils");
const vscode_languageserver_protocol_1 = require("vscode-languageserver-protocol");
class YamlRename {
constructor(telemetry) {
this.telemetry = telemetry;
}
prepareRename(document, params) {
try {
const target = this.findTarget(document, params.position);
if (!target) {
return null;
}
if (!this.findAnchorToken(target.yamlDoc, target.anchorNode)) {
return null;
}
return this.getNameRange(document, target.token);
}
catch (err) {
this.telemetry?.sendError('yaml.prepareRename.error', err);
return null;
}
}
doRename(document, params) {
try {
const target = this.findTarget(document, params.position);
if (!target) {
return null;
}
const anchorToken = this.findAnchorToken(target.yamlDoc, target.anchorNode);
if (!anchorToken) {
return null;
}
const newName = params.newName;
const invalidChar = this.findInvalidAnchorChar(newName);
if (invalidChar !== null) {
throw new vscode_languageserver_protocol_1.ResponseError(vscode_languageserver_protocol_1.ErrorCodes.InvalidParams, `Anchor name cannot contain '${invalidChar}'`);
}
const edits = [];
edits.push(vscode_languageserver_types_1.TextEdit.replace(this.getNameRange(document, anchorToken), newName));
(0, yaml_1.visit)(target.yamlDoc.internalDocument, (key, node) => {
if ((0, yaml_1.isAlias)(node) && node.srcToken && node.resolve(target.yamlDoc.internalDocument) === target.anchorNode) {
edits.push(vscode_languageserver_types_1.TextEdit.replace(this.getNameRange(document, node.srcToken), newName));
}
});
return {
changes: {
[document.uri]: edits,
},
};
}
catch (err) {
if (err instanceof vscode_languageserver_protocol_1.ResponseError) {
throw err;
}
this.telemetry?.sendError('yaml.rename.error', err);
return null;
}
}
findTarget(document, position) {
const yamlDocuments = yaml_documents_1.yamlDocumentsCache.getYamlDocument(document);
const offset = document.offsetAt(position);
const yamlDoc = (0, arrUtils_1.matchOffsetToDocument)(offset, yamlDocuments);
if (!yamlDoc) {
return null;
}
const [node] = yamlDoc.getNodeFromPosition(offset, new textBuffer_1.TextBuffer(document));
if (!node) {
return this.findByToken(yamlDoc, offset);
}
if ((0, yaml_1.isAlias)(node) && node.srcToken && this.isOffsetInsideToken(node.srcToken, offset)) {
const anchorNode = node.resolve(yamlDoc.internalDocument);
if (!anchorNode) {
return null;
}
return { anchorNode, token: node.srcToken, yamlDoc };
}
if (((0, yaml_1.isCollection)(node) || (0, yaml_1.isScalar)(node)) && node.anchor) {
const anchorToken = this.findAnchorToken(yamlDoc, node);
if (anchorToken && this.isOffsetInsideToken(anchorToken, offset)) {
return { anchorNode: node, token: anchorToken, yamlDoc };
}
}
return this.findByToken(yamlDoc, offset);
}
findByToken(yamlDoc, offset) {
let target;
(0, yaml_1.visit)(yamlDoc.internalDocument, (key, node) => {
if ((0, yaml_1.isAlias)(node) && node.srcToken && this.isOffsetInsideToken(node.srcToken, offset)) {
const anchorNode = node.resolve(yamlDoc.internalDocument);
if (anchorNode) {
target = { anchorNode, token: node.srcToken, yamlDoc };
return yaml_1.visit.BREAK;
}
}
if (((0, yaml_1.isCollection)(node) || (0, yaml_1.isScalar)(node)) && node.anchor) {
const anchorToken = this.findAnchorToken(yamlDoc, node);
if (anchorToken && this.isOffsetInsideToken(anchorToken, offset)) {
target = { anchorNode: node, token: anchorToken, yamlDoc };
return yaml_1.visit.BREAK;
}
}
});
return target ?? null;
}
findAnchorToken(yamlDoc, node) {
const parent = yamlDoc.getParent(node);
const candidates = [];
if (parent && parent.srcToken) {
candidates.push(parent.srcToken);
}
if (node.srcToken) {
candidates.push(node.srcToken);
}
for (const token of candidates) {
const anchor = this.getAnchorFromToken(token, node);
if (anchor) {
return anchor;
}
}
return undefined;
}
getAnchorFromToken(token, node) {
if ((0, yamlAstUtils_1.isCollectionItem)(token)) {
return this.getAnchorFromCollectionItem(token);
}
else if (yaml_1.CST.isCollection(token)) {
const collection = token;
for (const item of collection.items ?? []) {
if (item.value !== node.srcToken) {
continue;
}
const anchor = this.getAnchorFromCollectionItem(item);
if (anchor) {
return anchor;
}
}
}
return undefined;
}
getAnchorFromCollectionItem(token) {
for (const t of token.start) {
if (t.type === 'anchor') {
return t;
}
}
if (token.sep && Array.isArray(token.sep)) {
for (const t of token.sep) {
if (t.type === 'anchor') {
return t;
}
}
}
return undefined;
}
getNameRange(document, token) {
const startOffset = token.offset + 1;
const endOffset = token.offset + token.source.length;
return vscode_languageserver_types_1.Range.create(document.positionAt(startOffset), document.positionAt(endOffset));
}
isOffsetInsideToken(token, offset) {
return offset >= token.offset && offset <= token.offset + token.source.length;
}
findInvalidAnchorChar(name) {
// YAML 1.2.2 spec: anchor names cannot contain flow indicators or whitespace
// https://yaml.org/spec/1.2.2/#rule-ns-anchor-char
const invalidChars = ['[', ']', '{', '}', ',', ' ', '\t'];
for (const char of invalidChars) {
if (name.includes(char)) {
return char === ' ' ? 'space' : char === '\t' ? 'tab' : char;
}
}
return null;
}
}
exports.YamlRename = YamlRename;
});
//# sourceMappingURL=yamlRename.js.map
File diff suppressed because one or more lines are too long
@@ -0,0 +1,99 @@
import { JSONSchema } from '../jsonSchema';
import { SchemaPriority, SchemaRequestService, WorkspaceContextService } from '../yamlLanguageService';
import { SettingsState } from '../../yamlSettings';
import { UnresolvedSchema, ResolvedSchema, JSONSchemaService, SchemaDependencies, ISchemaContributions, SchemaHandle } from 'vscode-json-languageservice/lib/umd/services/jsonSchemaService';
import { JSONDocument } from '../parser/jsonDocument';
import { JSONSchemaDescriptionExt } from '../../requestTypes';
import { SchemaVersions } from '../yamlTypes';
export declare type CustomSchemaProvider = (uri: string) => Promise<string | string[]>;
export declare enum MODIFICATION_ACTIONS {
'delete' = 0,
'add' = 1,
'deleteAll' = 2
}
export interface SchemaAdditions {
schema: string;
action: MODIFICATION_ACTIONS.add;
path: string;
key: string;
content: any;
}
export interface SchemaDeletions {
schema: string;
action: MODIFICATION_ACTIONS.delete;
path: string;
key: string;
}
export interface SchemaDeletionsAll {
schemas: string[];
action: MODIFICATION_ACTIONS.deleteAll;
}
export declare class YAMLSchemaService extends JSONSchemaService {
[x: string]: any;
private customSchemaProvider;
private filePatternAssociations;
private contextService;
private requestService;
private yamlSettings;
schemaPriorityMapping: Map<string, Set<SchemaPriority>>;
private schemaUriToNameAndDescription;
constructor(requestService: SchemaRequestService, contextService?: WorkspaceContextService, promiseConstructor?: PromiseConstructor, yamlSettings?: SettingsState);
registerCustomSchemaProvider(customSchemaProvider: CustomSchemaProvider): void;
getAllSchemas(): JSONSchemaDescriptionExt[];
private collectSchemaNodes;
private schemaMapValues;
resolveSchemaContent(schemaToResolve: UnresolvedSchema, schemaURL: string, dependencies: SchemaDependencies): Promise<ResolvedSchema>;
getSchemaForResource(resource: string, doc: JSONDocument): Promise<ResolvedSchema>;
private finalizeResolvedSchema;
addSchemaPriority(uri: string, priority: number): void;
/**
* Search through all the schemas and find the ones with the highest priority
*/
private highestPrioritySchemas;
private resolveCustomSchema;
/**
* Save a schema with schema ID and schema content.
* Overrides previous schemas set for that schema ID.
*/
saveSchema(schemaId: string, schemaContent: JSONSchema): Promise<void>;
/**
* Delete schemas on specific path
*/
deleteSchemas(deletions: SchemaDeletionsAll): Promise<void>;
/**
* Delete a schema with schema ID.
*/
deleteSchema(schemaId: string): Promise<void>;
/**
* Add content to a specified schema at a specified path
*/
addContent(additions: SchemaAdditions): Promise<void>;
/**
* Delete content in a specified schema at a specified path
*/
deleteContent(deletions: SchemaDeletions): Promise<void>;
/**
* Take a JSON Schema and the path that you would like to get to
* @returns the JSON Schema resolved at that specific path
*/
private resolveJSONSchemaToSection;
/**
* Resolve the next Object if they have compatible types
* @param object a location in the JSON Schema
* @param token the next token that you want to search for
*/
private resolveNext;
/**
* Everything below here is needed because we're importing from vscode-json-languageservice umd and we need
* to provide a wrapper around the javascript methods we are calling since they have no type
*/
normalizeId(id: string): string;
getOrAddSchemaHandle(id: string, unresolvedSchemaContent?: JSONSchema): SchemaHandle;
loadSchema(schemaUri: string): Promise<UnresolvedSchema>;
registerExternalSchema(uri: string, filePatterns?: string[], unresolvedSchema?: JSONSchema, name?: string, description?: string, versions?: SchemaVersions): SchemaHandle;
clearExternalSchemas(): void;
setSchemaContributions(schemaContributions: ISchemaContributions): void;
getRegisteredSchemaIds(filter?: (scheme: any) => boolean): string[];
getResolvedSchema(schemaId: string): Promise<ResolvedSchema>;
onResourceChange(uri: string): boolean;
}
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
@@ -0,0 +1,3 @@
import { Position, SelectionRange } from 'vscode-languageserver-types';
import { TextDocument } from 'vscode-languageserver-textdocument';
export declare function getSelectionRanges(document: TextDocument, positions: Position[]): SelectionRange[];
@@ -0,0 +1,144 @@
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "vscode-languageserver-types", "../parser/yaml-documents"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getSelectionRanges = void 0;
const vscode_languageserver_types_1 = require("vscode-languageserver-types");
const yaml_documents_1 = require("../parser/yaml-documents");
function getSelectionRanges(document, positions) {
const doc = yaml_documents_1.yamlDocumentsCache.getYamlDocument(document);
return positions.map((position) => {
const ranges = getRanges(position);
let current;
for (const range of ranges) {
current = vscode_languageserver_types_1.SelectionRange.create(range, current);
}
return current ?? vscode_languageserver_types_1.SelectionRange.create({ start: position, end: position });
});
function getRanges(position) {
const offset = document.offsetAt(position);
const result = [];
for (const ymlDoc of doc.documents) {
let currentNode;
let overrideStartOffset;
ymlDoc.visit((node) => {
const endOffset = node.offset + node.length;
// Skip if end offset doesn't even reach cursor position
if (endOffset < offset) {
return true;
}
// Skip if we're ending at new line
// times:
// - second: 1
// millisecond: 10
// | - second: 2
// ↑ millisecond: 0
// (| is actually part of { second: 1, millisecond: 10 })
// \r\n doesn't matter here
if (getTextFromOffsets(endOffset - 1, endOffset) === '\n') {
if (endOffset - 1 < offset) {
return true;
}
}
let startOffset = node.offset;
if (startOffset > offset) {
// Recheck start offset for some special cases
const newOffset = getStartOffsetForSpecialCases(node, position);
if (!newOffset || newOffset > offset) {
return true;
}
startOffset = newOffset;
}
// Allow equal for children to override
if (!currentNode || startOffset >= currentNode.offset) {
currentNode = node;
overrideStartOffset = startOffset;
}
return true;
});
while (currentNode) {
const startOffset = overrideStartOffset ?? currentNode.offset;
const endOffset = currentNode.offset + currentNode.length;
const range = {
start: document.positionAt(startOffset),
end: document.positionAt(endOffset),
};
const text = document.getText(range);
const trimmedText = trimEndNewLine(text);
const trimmedEndOffset = startOffset + trimmedText.length;
if (trimmedEndOffset >= offset) {
range.end = document.positionAt(trimmedEndOffset);
}
// Add a jump between '' "" {} []
const isSurroundedBy = (startCharacter, endCharacter) => {
return trimmedText.startsWith(startCharacter) && trimmedText.endsWith(endCharacter || startCharacter);
};
if ((currentNode.type === 'string' && (isSurroundedBy("'") || isSurroundedBy('"'))) ||
(currentNode.type === 'object' && isSurroundedBy('{', '}')) ||
(currentNode.type === 'array' && isSurroundedBy('[', ']'))) {
result.push({
start: document.positionAt(startOffset + 1),
end: document.positionAt(endOffset - 1),
});
}
result.push(range);
currentNode = currentNode.parent;
overrideStartOffset = undefined;
}
// A position can't be in multiple documents
if (result.length > 0) {
break;
}
}
return result.reverse();
}
function getStartOffsetForSpecialCases(node, position) {
const nodeStartPosition = document.positionAt(node.offset);
if (nodeStartPosition.line !== position.line) {
return;
}
if (node.parent?.type === 'array') {
// array:
// - value
// ↑
if (getTextFromOffsets(node.offset - 2, node.offset) === '- ') {
return node.offset - 2;
}
}
if (node.type === 'array' || node.type === 'object') {
// array:
// - value
// ↑
const lineBeginning = { line: nodeStartPosition.line, character: 0 };
const text = document.getText({ start: lineBeginning, end: nodeStartPosition });
if (text.trim().length === 0) {
return document.offsetAt(lineBeginning);
}
}
}
function getTextFromOffsets(startOffset, endOffset) {
return document.getText({
start: document.positionAt(startOffset),
end: document.positionAt(endOffset),
});
}
}
exports.getSelectionRanges = getSelectionRanges;
function trimEndNewLine(str) {
if (str.endsWith('\r\n')) {
return str.substring(0, str.length - 2);
}
if (str.endsWith('\n')) {
return str.substring(0, str.length - 1);
}
return str;
}
});
//# sourceMappingURL=yamlSelectionRanges.js.map
@@ -0,0 +1 @@
{"version":3,"file":"yamlSelectionRanges.js","sourceRoot":"","sources":["../../../../src/languageservice/services/yamlSelectionRanges.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
import { Diagnostic } from 'vscode-languageserver-types';
import { LanguageSettings } from '../yamlLanguageService';
import { YAMLSchemaService } from './yamlSchemaService';
import { YAMLDocDiagnostic } from '../utils/parseUtils';
import { TextDocument } from 'vscode-languageserver-textdocument';
import { Telemetry } from '../telemetry';
/**
* Convert a YAMLDocDiagnostic to a language server Diagnostic
* @param yamlDiag A YAMLDocDiagnostic from the parser
* @param textDocument TextDocument from the language server client
*/
export declare const yamlDiagToLSDiag: (yamlDiag: YAMLDocDiagnostic, textDocument: TextDocument) => Diagnostic;
export declare class YAMLValidation {
private readonly telemetry?;
private validationEnabled;
private customTags;
private jsonValidation;
private disableAdditionalProperties;
private yamlVersion;
private validators;
private MATCHES_MULTIPLE;
constructor(schemaService: YAMLSchemaService, telemetry?: Telemetry);
configure(settings: LanguageSettings): void;
doValidation(textDocument: TextDocument, isKubernetes?: boolean): Promise<Diagnostic[]>;
private runAdditionalValidators;
}
@@ -0,0 +1,143 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Red Hat, Inc. All rights reserved.
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "vscode-languageserver-types", "vscode-json-languageservice/lib/umd/services/jsonValidation", "../parser/schemaValidation/baseValidator", "../utils/textBuffer", "../parser/yaml-documents", "./validation/unused-anchors", "./validation/yaml-style", "./validation/map-key-order"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.YAMLValidation = exports.yamlDiagToLSDiag = void 0;
const vscode_languageserver_types_1 = require("vscode-languageserver-types");
const jsonValidation_1 = require("vscode-json-languageservice/lib/umd/services/jsonValidation");
const baseValidator_1 = require("../parser/schemaValidation/baseValidator");
const textBuffer_1 = require("../utils/textBuffer");
const yaml_documents_1 = require("../parser/yaml-documents");
const unused_anchors_1 = require("./validation/unused-anchors");
const yaml_style_1 = require("./validation/yaml-style");
const map_key_order_1 = require("./validation/map-key-order");
/**
* Convert a YAMLDocDiagnostic to a language server Diagnostic
* @param yamlDiag A YAMLDocDiagnostic from the parser
* @param textDocument TextDocument from the language server client
*/
const yamlDiagToLSDiag = (yamlDiag, textDocument) => {
const start = textDocument.positionAt(yamlDiag.location.start);
const range = {
start,
end: yamlDiag.location.toLineEnd
? vscode_languageserver_types_1.Position.create(start.line, new textBuffer_1.TextBuffer(textDocument).getLineLength(start.line))
: textDocument.positionAt(yamlDiag.location.end),
};
return vscode_languageserver_types_1.Diagnostic.create(range, yamlDiag.message, yamlDiag.severity, yamlDiag.code, baseValidator_1.YAML_SOURCE);
};
exports.yamlDiagToLSDiag = yamlDiagToLSDiag;
class YAMLValidation {
constructor(schemaService, telemetry) {
this.telemetry = telemetry;
this.validators = [];
this.MATCHES_MULTIPLE = 'Matches multiple schemas when only one must validate.';
this.validationEnabled = true;
this.jsonValidation = new jsonValidation_1.JSONValidation(schemaService, Promise);
}
configure(settings) {
this.validators = [];
if (settings) {
this.validationEnabled = settings.validate;
this.customTags = settings.customTags;
this.disableAdditionalProperties = settings.disableAdditionalProperties;
this.yamlVersion = settings.yamlVersion;
// Add style validator if flow style is set to forbid only.
if (settings.flowMapping === 'forbid' || settings.flowSequence === 'forbid') {
this.validators.push(new yaml_style_1.YAMLStyleValidator(settings));
}
if (settings.keyOrdering) {
this.validators.push(new map_key_order_1.MapKeyOrderValidator());
}
}
this.validators.push(new unused_anchors_1.UnusedAnchorsValidator());
}
async doValidation(textDocument, isKubernetes = false) {
if (!this.validationEnabled) {
return Promise.resolve([]);
}
const validationResult = [];
try {
const yamlDocument = yaml_documents_1.yamlDocumentsCache.getYamlDocument(textDocument, { customTags: this.customTags, yamlVersion: this.yamlVersion }, true);
let index = 0;
for (const currentYAMLDoc of yamlDocument.documents) {
currentYAMLDoc.isKubernetes = isKubernetes;
currentYAMLDoc.currentDocIndex = index;
currentYAMLDoc.disableAdditionalProperties = this.disableAdditionalProperties;
currentYAMLDoc.uri = textDocument.uri;
const validation = await this.jsonValidation.doValidation(textDocument, currentYAMLDoc);
const syd = currentYAMLDoc;
if (syd.errors.length > 0) {
// TODO: Get rid of these type assertions (shouldn't need them)
validationResult.push(...syd.errors);
}
if (syd.warnings.length > 0) {
validationResult.push(...syd.warnings);
}
validationResult.push(...validation);
validationResult.push(...this.runAdditionalValidators(textDocument, currentYAMLDoc));
index++;
}
}
catch (err) {
this.telemetry?.sendError('yaml.validation.error', err);
}
let previousErr;
const foundSignatures = new Set();
const duplicateMessagesRemoved = [];
for (let err of validationResult) {
/**
* A patch ontop of the validation that removes the
* 'Matches many schemas' error for kubernetes
* for a better user experience.
*/
if (isKubernetes && err.message === this.MATCHES_MULTIPLE) {
continue;
}
if (Object.prototype.hasOwnProperty.call(err, 'location')) {
err = (0, exports.yamlDiagToLSDiag)(err, textDocument);
}
if (!err.source) {
err.source = baseValidator_1.YAML_SOURCE;
}
if (previousErr &&
previousErr.message === err.message &&
previousErr.range.end.line === err.range.start.line &&
Math.abs(previousErr.range.end.character - err.range.end.character) >= 1) {
previousErr.range.end = err.range.end;
continue;
}
else {
previousErr = err;
}
const errSig = err.range.start.line + ' ' + err.range.start.character + ' ' + err.message;
if (!foundSignatures.has(errSig)) {
duplicateMessagesRemoved.push(err);
foundSignatures.add(errSig);
}
}
return duplicateMessagesRemoved;
}
runAdditionalValidators(document, yarnDoc) {
const result = [];
for (const validator of this.validators) {
result.push(...validator.validate(document, yarnDoc));
}
return result;
}
}
exports.YAMLValidation = YAMLValidation;
});
//# sourceMappingURL=yamlValidation.js.map
@@ -0,0 +1 @@
{"version":3,"file":"yamlValidation.js","sourceRoot":"","sources":["../../../../src/languageservice/services/yamlValidation.ts"],"names":[],"mappings":"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"}