@nlighten/monaco-json-transform
Version:
JSON Transform language tokenizer (and syntax highlight), hover provider and more
111 lines • 5.36 kB
JavaScript
;
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