jexl-extended
Version:
Extended grammar for Javascript Expression Language (JEXL)
144 lines (143 loc) • 4.98 kB
JavaScript
;
/**
* Monaco Editor Completion Provider for JEXL
* This provides IntelliSense completion items without requiring Monaco as a dependency
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.CompletionItemKind = void 0;
exports.createJexlCompletionItems = createJexlCompletionItems;
exports.createJexlFunctionItems = createJexlFunctionItems;
exports.createJexlTransformItems = createJexlTransformItems;
exports.getJexlCompletionDoc = getJexlCompletionDoc;
exports.getOperatorDoc = getOperatorDoc;
exports.createJexlKeywords = createJexlKeywords;
exports.createJexlOperators = createJexlOperators;
// Import completion docs directly (generated file)
const completion_docs_generated_1 = require("./completion-docs.generated");
// Monaco CompletionItemKind enum values (to avoid Monaco dependency)
exports.CompletionItemKind = {
Method: 0,
Function: 1,
Constructor: 2,
Field: 3,
Variable: 4,
Class: 5,
Struct: 6,
Interface: 7,
Module: 8,
Property: 9,
Event: 10,
Operator: 11,
Unit: 12,
Value: 13,
Constant: 14,
Enum: 15,
EnumMember: 16,
Keyword: 17,
Text: 18,
Color: 19,
File: 20,
Reference: 21,
Customcolor: 22,
Folder: 23,
TypeParameter: 24,
User: 25,
Issue: 26,
Snippet: 27
};
function createJexlCompletionItems(type) {
const filteredDocs = type ? completion_docs_generated_1.completionDocs.filter(doc => doc.type === type) : completion_docs_generated_1.completionDocs;
return filteredDocs.map(doc => {
const kind = doc.type === 'function' ? exports.CompletionItemKind.Function : exports.CompletionItemKind.Method;
return {
label: doc.label,
kind,
insertText: doc.insertText,
insertTextRules: 4, // InsertTextRule.InsertAsSnippet
documentation: doc.documentation,
detail: doc.detail
};
});
}
function createJexlFunctionItems() {
return createJexlCompletionItems('function');
}
function createJexlTransformItems() {
return createJexlCompletionItems('transform');
}
function getJexlCompletionDoc(functionName, preferredType) {
// Find all matches for the function name
const matches = completion_docs_generated_1.completionDocs.filter(doc => {
var _a;
return doc.label === functionName ||
doc.name === functionName ||
((_a = doc.aliases) === null || _a === void 0 ? void 0 : _a.includes(functionName));
});
if (matches.length === 0) {
return undefined;
}
// If we have a preferred type, try to find that first
if (preferredType) {
const preferredMatch = matches.find(doc => doc.type === preferredType);
if (preferredMatch) {
return preferredMatch;
}
}
// Otherwise return the first match
return matches[0];
}
function getOperatorDoc(operator) {
const operators = createJexlOperators();
const operatorItem = operators.find(op => op.label === operator);
if (operatorItem) {
return {
label: operatorItem.label,
documentation: operatorItem.documentation || '',
detail: operatorItem.detail || 'JEXL Operator'
};
}
return undefined;
}
function createJexlKeywords() {
// Accurate JEXL keywords based on actual grammar
const keywords = ['true', 'false', 'null', 'undefined', 'in'];
return keywords.map(keyword => ({
label: keyword,
kind: exports.CompletionItemKind.Keyword,
insertText: keyword,
documentation: `JEXL keyword: ${keyword}`,
detail: 'JEXL Keyword'
}));
}
function createJexlOperators() {
// Accurate JEXL operators based on actual grammar
const operators = [
{ label: '|', desc: 'Transform pipe operator' },
{ label: '==', desc: 'Equality comparison' },
{ label: '!=', desc: 'Inequality comparison' },
{ label: '>', desc: 'Greater than' },
{ label: '<', desc: 'Less than' },
{ label: '>=', desc: 'Greater than or equal' },
{ label: '<=', desc: 'Less than or equal' },
{ label: '&&', desc: 'Logical AND' },
{ label: '||', desc: 'Logical OR' },
{ label: '!', desc: 'Logical NOT' },
{ label: 'in', desc: 'Membership test' },
{ label: '+', desc: 'Addition' },
{ label: '-', desc: 'Subtraction' },
{ label: '*', desc: 'Multiplication' },
{ label: '/', desc: 'Division' },
{ label: '//', desc: 'Floor division' },
{ label: '%', desc: 'Modulus' },
{ label: '^', desc: 'Exponentiation' },
{ label: '?', desc: 'Conditional operator' },
{ label: ':', desc: 'Conditional separator' }
];
return operators.map(op => ({
label: op.label,
kind: exports.CompletionItemKind.Operator,
insertText: op.label,
documentation: op.desc,
detail: 'JEXL Operator'
}));
}