UNPKG

@nlighten/monaco-json-transform

Version:

JSON Transform language tokenizer (and syntax highlight), hover provider and more

111 lines 5.36 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.registerJsonTransformHoverProvider = exports.jsonTransformHoverProviderFactory = void 0; const json_schema_utils_1 = require("@nlighten/json-schema-utils"); const json_transform_core_1 = require("@nlighten/json-transform-core"); const NoContent = {}; const jsonTransformHoverProviderFactory = ({ getTypeMap, dontShowDocsLink } = {}) => ({ provideHover: (model, position, token) => new Promise(resolve => { if (token.isCancellationRequested) return resolve(NoContent); token.onCancellationRequested(() => { resolve(NoContent); }); const word = model.getWordAtPosition(position); if (!word) return resolve(NoContent); if (word.word.startsWith("$$")) { // function documentation const charBefore = model.getValueInRange({ startLineNumber: position.lineNumber, startColumn: word.startColumn - 1, endLineNumber: position.lineNumber, endColumn: word.startColumn, }); const charAfter = model.getValueInRange({ startLineNumber: position.lineNumber, startColumn: word.endColumn, endLineNumber: position.lineNumber, endColumn: word.endColumn + 1, }); const funcName = word.word.match(/^\$\$([^:(]+)/)?.[1]; if (!funcName || !json_transform_core_1.functionsParser.get(funcName)) return; const funcType = charBefore === '"' && charAfter === '"' ? "object" : "inline"; let func = json_transform_core_1.functionsParser.get(funcName); if (!func) return; if (func.subfunctions && funcType === "inline") { // TODO: is there a way to get the definition for object? const args = (0, json_transform_core_1.parseArgs)(func, word.word.match(/\(([^)]*)/)?.[1] ?? ""); func = (0, json_transform_core_1.getSubfunction)(func, args); } const sig = (0, json_transform_core_1.getFunctionInlineSignature)(funcName, func); return resolve({ range: { startLineNumber: position.lineNumber, startColumn: word.startColumn, endLineNumber: position.lineNumber, endColumn: word.endColumn, }, contents: [ { value: `\`${sig}\`` + (func.aliasTo ? `\n (alias to \`$$${func.aliasTo})\`` : ""), }, func.deprecatedInFavorOf && !dontShowDocsLink ? { value: `DEPRECATED - Please use [$$${func.deprecatedInFavorOf}](command:docs?${encodeURIComponent(JSON.stringify({ func: func.deprecatedInFavorOf, type: func }))}) instead`, isTrusted: true, } : null, { value: (0, json_schema_utils_1.formatSchemaType)(func.outputSchema), }, { value: func.description ?? "" }, !dontShowDocsLink && { value: `See docs at [${func?.aliasTo ?? funcName}](command:docs?${encodeURIComponent(JSON.stringify({ func: funcName, type: func }))})`, isTrusted: true, }, ].filter(Boolean), }); } else { let varType = null; // try to find var type from current model suggestions const typeMap = getTypeMap ? getTypeMap(model) : undefined; varType = typeMap?.[word.word] ?? json_transform_core_1.ContextVariablesSchemas[word.word]; if (varType) { const contents = [{ value: `**${word.word}**` }, { value: (0, json_schema_utils_1.formatSchemaType)(varType) }]; if (varType.description) { contents.push({ value: varType.description }); } return resolve({ range: { startLineNumber: position.lineNumber, startColumn: word.startColumn, endLineNumber: position.lineNumber, endColumn: word.endColumn, }, contents, }); } } return resolve(NoContent); }), }); exports.jsonTransformHoverProviderFactory = jsonTransformHoverProviderFactory; /** * Add tokens hover information for JSON transformers * @param monaco * @param options */ const registerJsonTransformHoverProvider = (monaco, options) => { if (!options.dontRegisterDocsCommand) { monaco.editor.registerCommand("docs", function (accessor, arg) { window.open(json_transform_core_1.functionsParser.resolveDocsUrl(arg.func, arg.type), "_blank"); }); } monaco.languages.registerHoverProvider("json", (0, exports.jsonTransformHoverProviderFactory)(options)); }; exports.registerJsonTransformHoverProvider = registerJsonTransformHoverProvider; //# sourceMappingURL=jsonTransformerHoverProvider.js.map