@elastic/highlightjs-esql
Version:
Highlight.js language syntax definitions for ES|QL
395 lines (379 loc) • 6.43 kB
JavaScript
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Elasticsearch B.V. licenses this file to you under
* the MIT license (the "License"); you may
* not use this file except in compliance with the License.
*/
/*
Language: ES|QL
Description: language definition for Elastic ES|QL language
Website: https://www.elastic.co/guide/en/elasticsearch/reference/current/esql.html
Category: enterprise
*/
const source = (re) => {
if (!re) return null;
if (typeof re === "string") return re;
return re.source;
};
const concat = (...args) => {
const joined = args.map((x) => source(x)).join("");
return joined;
};
const either = (...args) => {
const joined = "(" + args.map((x) => source(x)).join("|") + ")";
return joined;
};
export default function (hljs) {
const literals = ["TRUE", "FALSE", "NULL"];
const binaryNamedOperators = ["AND", "OR", "IS", "IN", "AS", "LIKE", "RLIKE"];
const otherNamedOperators = ["ASC", "DESC", "FIRST", "LAST", "NULLS", "NOT"];
const keywords = ["BY", "ON", "WITH", "METADATA", "SCORE", "KEY", "GROUP"];
const commands = [
"CHANGE_POINT",
"COMPLETION",
"DISSECT",
"DROP",
"ENRICH",
"EVAL",
"EXPLAIN",
"FORK",
"FROM",
"FULL JOIN",
"FUSE",
"GROK",
"INFO",
"INLINESTATS",
"JOIN",
"KEEP",
"LEFT JOIN",
"LEFT",
"LIMIT",
"LOOKUP JOIN",
"LOOKUP",
"METRICS",
"METRICS_INFO",
"MMR",
"MV_EXPAND",
"RENAME",
"OPTIONS",
"PROMQL",
"REGISTERED_DOMAIN",
"RERANK",
"RIGHT JOIN",
"RIGHT",
"ROW",
"SAMPLE",
"SET",
"SHOW INFO",
"SHOW",
"SORT",
"STATS",
"TIMESERIES",
"TS_INFO",
"TS",
"URI_PARTS",
"USER_AGENT",
"WHERE",
];
const OPERATOR = {
className: "operator",
match: /\|\+-%\*\//,
};
const STRING = {
className: "string",
begin: /"/,
end: /"/,
contains: [hljs.BACKSLASH_ESCAPE],
};
const functions = [
"ABS",
"ABSENT",
"ABSENT_OVER_TIME",
"ACOS",
"ACOSH",
"ASIN",
"ASINH",
"ATAN",
"ATAN2",
"ATANH",
"AVG",
"AVG_OVER_TIME",
"BIT_LENGTH",
"BUCKET",
"BYTE_LENGTH",
"CASE",
"CATEGORIZE",
"CBRT",
"CEIL",
"CHUNK",
"CIDR_MATCH",
"CLAMP",
"CLAMP_MAX",
"CLAMP_MIN",
"COALESCE",
"CONCAT",
"CONTAINS",
"COPY_SIGN",
"COS",
"COSH",
"COUNT",
"COUNT_DISTINCT",
"COUNT_DISTINCT_OVER_TIME",
"COUNT_OVER_TIME",
"DATE_DIFF",
"DATE_EXTRACT",
"DATE_FORMAT",
"DATE_PARSE",
"DATE_TRUNC",
"DAY_NAME",
"DECAY",
"DELTA",
"DERIV",
"E",
"ENDS_WITH",
"EXP",
"FIRST",
"FIRST_OVER_TIME",
"FLOOR",
"FROM_BASE64",
"GREATEST",
"HASH",
"HYPOT",
"IDELTA",
"INCREASE",
"IP_PREFIX",
"IRATE",
"JSON_EXTRACT",
"KNN",
"KQL",
"LAST",
"LAST_OVER_TIME",
"LEAST",
"LEFT",
"LENGTH",
"LOCATE",
"LOG",
"LOG10",
"LTRIM",
"MATCH",
"MATCH_PHRASE",
"MAX",
"MAX_OVER_TIME",
"MD5",
"MEDIAN_ABSOLUTE_DEVIATION",
"MEDIAN",
"MIN",
"MIN_OVER_TIME",
"MONTH_NAME",
"MV_APPEND",
"MV_AVG",
"MV_CONCAT",
"MV_CONTAINS",
"MV_COUNT",
"MV_DEDUPE",
"MV_FIRST",
"MV_INTERSECTION",
"MV_INTERSECTS",
"MV_LAST",
"MV_MAX",
"MV_MEDIAN_ABSOLUTE_DEVIATION",
"MV_MEDIAN",
"MV_MIN",
"MV_PERCENTILE",
"MV_PSERIES_WEIGHTED_SUM",
"MV_SLICE",
"MV_SORT",
"MV_SUM",
"MV_UNION",
"MV_ZIP",
"NETWORK_DIRECTION",
"NOW",
"PERCENTILE",
"PERCENTILE_OVER_TIME",
"PI",
"POW",
"PRESENT",
"PRESENT_OVER_TIME",
"QSTR",
"RATE",
"REPEAT",
"REPLACE",
"REVERSE",
"RIGHT",
"ROUND",
"ROUND_TO",
"RTRIM",
"SAMPLE",
"SCALB",
"SCORE",
"SHA1",
"SHA256",
"SIGNUM",
"SIN",
"SINH",
"SPACE",
"SPARKLINE",
"SPLIT",
"SQRT",
"ST_BUFFER",
"ST_CENTROID_AGG",
"ST_CONTAINS",
"ST_DIMENSION",
"ST_DISJOINT",
"ST_DISTANCE",
"ST_ENVELOPE",
"ST_EXTENT_AGG",
"ST_GEOHASH",
"ST_GEOHEX",
"ST_GEOMETRYTYPE",
"ST_GEOTILE",
"ST_INTERSECTS",
"ST_ISEMPTY",
"ST_NPOINTS",
"ST_SIMPLIFY",
"ST_SIMPLIFYPRESERVETOPOLOGY",
"ST_WITHIN",
"ST_X",
"ST_XMAX",
"ST_XMIN",
"ST_Y",
"ST_YMAX",
"ST_YMIN",
"STARTS_WITH",
"STD_DEV",
"STDDEV_OVER_TIME",
"SUBSTRING",
"SUM",
"SUM_OVER_TIME",
"TAN",
"TANH",
"TAU",
"TBUCKET",
"TEXT_EMBEDDING",
"TO_AGGREGATE_METRIC_DOUBLE",
"TO_BASE64",
"TO_BOOLEAN",
"TO_CARTESIANPOINT",
"TO_CARTESIANSHAPE",
"TO_DATE_NANOS",
"TO_DATEPERIOD",
"TO_DATETIME",
"TO_DEGREES",
"TO_DENSE_VECTOR",
"TO_DOUBLE",
"TO_EXPONENTIAL_HISTOGRAM",
"TO_GEOHASH",
"TO_GEOHEX",
"TO_GEOPOINT",
"TO_GEOSHAPE",
"TO_GEOTILE",
"TO_INTEGER",
"TO_IP",
"TO_LONG",
"TO_LOWER",
"TO_RADIANS",
"TO_STRING",
"TO_TDIGEST",
"TO_TIMEDURATION",
"TO_UNSIGNED_LONG",
"TO_UPPER",
"TO_VERSION",
"TOP",
"TOP_SNIPPETS",
"TRANGE",
"TRIM",
"URL_DECODE",
"URL_ENCODE",
"URL_ENCODE_COMPONENT",
"V_COSINE",
"V_DOT_PRODUCT",
"V_HAMMING",
"V_L1_NORM",
"V_L2_NORM",
"V_MAGNITUDE",
"VALUES",
"VARIANCE",
"VARIANCE_OVER_TIME",
"WEIGHTED_AVG",
"ADD",
"CAST",
"DIV",
"EQUALS",
"GREATER_THAN",
"GREATER_THAN_OR_EQUAL",
"IN",
"IS_NOT_NULL",
"IS_NULL",
"LESS_THAN",
"LESS_THAN_OR_EQUAL",
"LIKE",
"MATCH_OPERATOR",
"MOD",
"MUL",
"NEG",
"NOT_IN",
"NOT_LIKE",
"NOT_RLIKE",
"NOT_EQUALS",
"RLIKE",
"SUB",
];
const FUNCTION_CALL = {
className: "function",
begin: concat(/\b/, either(...functions), /\s*\(/),
keywords: {
keyword: functions,
},
};
const DOCTAGS = hljs.COMMENT(
"/\\*", // begin
"\\*/", // end
{
contains: [
{
scope: "doctag",
begin: "@\\w+",
},
],
},
);
const PARAM = {
className: "variable",
begin: "\\?(\\w+)?",
};
const CAST = {
className: "type",
begin: "::\\w+",
};
const PUNCTUATION = {
scope: "punctuation",
match: /[,;{}[\]()]/,
};
return {
name: "esql",
aliases: ["es|ql"],
case_insensitive: true,
keywords: {
$pattern: /\b[\w.]+\b/,
keyword: [...keywords, ...commands],
built_in: [...binaryNamedOperators, ...otherNamedOperators],
literal: literals,
},
contains: [
DOCTAGS,
hljs.C_BLOCK_COMMENT_MODE,
hljs.C_LINE_COMMENT_MODE,
hljs.QUOTE_STRING_MODE,
hljs.C_NUMBER_MODE,
OPERATOR,
FUNCTION_CALL,
STRING,
PARAM,
CAST,
PUNCTUATION,
],
illegal: /[{}]|<\//,
};
}