@bizone-ai/monaco-json-transform
Version:
JSON Transform language tokenizer (and syntax highlight), hover provider and more
134 lines • 6.13 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.registerJsonTransformHoverProvider = exports.jsonTransformHoverProviderFactory = void 0;
const json_schema_utils_1 = require("@bizone-ai/json-schema-utils");
const json_transform_utils_1 = require("@bizone-ai/json-transform-utils");
const NoContent = {};
const parseArgs = (func, args) => {
if (!args)
return {};
const argsValues = args.split(/,(?=(?:[^']*'[^']*')*[^']*$)/).map((argVal) => {
let arg = argVal;
const trimmed = argVal.trim();
if (trimmed.startsWith("'") && trimmed.endsWith("'") && trimmed.length > 1) {
arg = trimmed.substring(1, trimmed.length - 1).replace(/''/g, "'");
//otherwise, take the whole argument as-is
}
return arg;
});
return !argsValues || argsValues.length === 0
? {}
: argsValues.reduce((a, c, i) => {
func.arguments?.forEach(fa => {
if (fa.position === i && fa.name) {
a[fa.name] = c;
}
});
return a;
}, {});
};
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_utils_1.functionsParser.get(funcName))
return;
const funcType = charBefore === '"' && charAfter === '"' ? "object" : "inline";
let func = json_transform_utils_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 = parseArgs(func, word.word.match(/\(([^)]*)/)?.[1] ?? "");
func = (0, json_transform_utils_1.getSubfunction)(func, args);
}
const sig = (0, json_transform_utils_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_utils_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_utils_1.functionsParser.resolveDocsUrl(arg.func, arg.type), "_blank");
});
}
monaco.languages.registerHoverProvider("json", (0, exports.jsonTransformHoverProviderFactory)(options));
};
exports.registerJsonTransformHoverProvider = registerJsonTransformHoverProvider;
//# sourceMappingURL=jsonTransformerHoverProvider.js.map