@sckyzo/cosmos-react 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +128 -0
- package/README.md +916 -19
- package/dist/CodeBlock-CY18_3tZ.d.cts +52 -0
- package/dist/CodeBlock-CY18_3tZ.d.ts +52 -0
- package/dist/code/index.cjs +331 -0
- package/dist/code/index.cjs.map +1 -0
- package/dist/code/index.d.cts +29 -0
- package/dist/code/index.d.ts +29 -0
- package/dist/code/index.js +326 -0
- package/dist/code/index.js.map +1 -0
- package/dist/editor/index.cjs +879 -0
- package/dist/editor/index.cjs.map +1 -0
- package/dist/editor/index.d.cts +100 -0
- package/dist/editor/index.d.ts +100 -0
- package/dist/editor/index.js +872 -0
- package/dist/editor/index.js.map +1 -0
- package/dist/fieldRecipe-Cao5uUIK.d.cts +3 -0
- package/dist/fieldRecipe-Cao5uUIK.d.ts +3 -0
- package/dist/index.cjs +18158 -12012
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1631 -243
- package/dist/index.d.ts +1631 -243
- package/dist/index.js +18113 -12005
- package/dist/index.js.map +1 -1
- package/dist/intent-D0bANgYJ.d.cts +12 -0
- package/dist/intent-D0bANgYJ.d.ts +12 -0
- package/dist/map/index.cjs +559 -0
- package/dist/map/index.cjs.map +1 -0
- package/dist/map/index.d.cts +95 -0
- package/dist/map/index.d.ts +95 -0
- package/dist/map/index.js +556 -0
- package/dist/map/index.js.map +1 -0
- package/package.json +82 -3
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useReducer, useState, useEffect, Fragment } from 'react';
|
|
3
|
+
import { CodeBlock as CodeBlock$1 } from '@sckyzo/cosmos-react';
|
|
4
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var __defProp = Object.defineProperty;
|
|
7
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
8
|
+
var __esm = (fn, res, err) => function __init() {
|
|
9
|
+
if (err) throw err[0];
|
|
10
|
+
try {
|
|
11
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
12
|
+
} catch (e) {
|
|
13
|
+
throw err = [e], e;
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
var __export = (target, all) => {
|
|
17
|
+
for (var name in all)
|
|
18
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
// src/code/promql.ts
|
|
22
|
+
var promql_exports = {};
|
|
23
|
+
__export(promql_exports, {
|
|
24
|
+
default: () => promql_default
|
|
25
|
+
});
|
|
26
|
+
var IDENT, GROUPING, promql, promql_default;
|
|
27
|
+
var init_promql = __esm({
|
|
28
|
+
"src/code/promql.ts"() {
|
|
29
|
+
IDENT = "[a-zA-Z_][a-zA-Z0-9_]*";
|
|
30
|
+
GROUPING = "by|without|on|ignoring|group_left|group_right";
|
|
31
|
+
promql = {
|
|
32
|
+
name: "promql",
|
|
33
|
+
displayName: "PromQL",
|
|
34
|
+
scopeName: "source.promql",
|
|
35
|
+
aliases: ["prometheus"],
|
|
36
|
+
patterns: [{ include: "#expression" }],
|
|
37
|
+
repository: {
|
|
38
|
+
expression: {
|
|
39
|
+
patterns: [
|
|
40
|
+
{ include: "#comment" },
|
|
41
|
+
{ include: "#string" },
|
|
42
|
+
{ include: "#label-matchers" },
|
|
43
|
+
{ include: "#grouping" },
|
|
44
|
+
{ include: "#duration" },
|
|
45
|
+
{ include: "#number" },
|
|
46
|
+
{ include: "#aggregation" },
|
|
47
|
+
{ include: "#keyword" },
|
|
48
|
+
{ include: "#function" },
|
|
49
|
+
{ include: "#metric" },
|
|
50
|
+
{ include: "#operator" },
|
|
51
|
+
{ include: "#punctuation" }
|
|
52
|
+
]
|
|
53
|
+
},
|
|
54
|
+
comment: {
|
|
55
|
+
name: "comment.line.number-sign.promql",
|
|
56
|
+
match: "#.*$"
|
|
57
|
+
},
|
|
58
|
+
string: {
|
|
59
|
+
patterns: [
|
|
60
|
+
{
|
|
61
|
+
name: "string.quoted.double.promql",
|
|
62
|
+
begin: '"',
|
|
63
|
+
end: '"',
|
|
64
|
+
patterns: [{ name: "constant.character.escape.promql", match: "\\\\." }]
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: "string.quoted.single.promql",
|
|
68
|
+
begin: "'",
|
|
69
|
+
end: "'",
|
|
70
|
+
patterns: [{ name: "constant.character.escape.promql", match: "\\\\." }]
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
name: "string.quoted.other.backtick.promql",
|
|
74
|
+
begin: "`",
|
|
75
|
+
end: "`"
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
},
|
|
79
|
+
// {job="api", code!~"5..", instance=~".+"}
|
|
80
|
+
"label-matchers": {
|
|
81
|
+
name: "meta.label-matchers.promql",
|
|
82
|
+
begin: "\\{",
|
|
83
|
+
end: "\\}",
|
|
84
|
+
beginCaptures: { 0: { name: "punctuation.definition.label-matchers.begin.promql" } },
|
|
85
|
+
endCaptures: { 0: { name: "punctuation.definition.label-matchers.end.promql" } },
|
|
86
|
+
patterns: [
|
|
87
|
+
{ include: "#comment" },
|
|
88
|
+
{ include: "#string" },
|
|
89
|
+
{
|
|
90
|
+
name: "keyword.operator.comparison.label-matcher.promql",
|
|
91
|
+
match: "=~|!~|!=|="
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
name: "meta.property-name.label.promql",
|
|
95
|
+
match: IDENT
|
|
96
|
+
},
|
|
97
|
+
{ name: "punctuation.separator.comma.promql", match: "," }
|
|
98
|
+
]
|
|
99
|
+
},
|
|
100
|
+
// sum by (job, instance) (...), a / on (job) group_left (...)
|
|
101
|
+
grouping: {
|
|
102
|
+
name: "meta.grouping.promql",
|
|
103
|
+
begin: `\\b(${GROUPING})\\b\\s*(\\()`,
|
|
104
|
+
end: "\\)",
|
|
105
|
+
beginCaptures: {
|
|
106
|
+
1: { name: "keyword.control.grouping.promql" },
|
|
107
|
+
2: { name: "punctuation.definition.grouping.begin.promql" }
|
|
108
|
+
},
|
|
109
|
+
endCaptures: { 0: { name: "punctuation.definition.grouping.end.promql" } },
|
|
110
|
+
patterns: [
|
|
111
|
+
{ include: "#string" },
|
|
112
|
+
{ name: "meta.property-name.label.promql", match: IDENT },
|
|
113
|
+
{ name: "punctuation.separator.comma.promql", match: "," }
|
|
114
|
+
]
|
|
115
|
+
},
|
|
116
|
+
// 5m, 1h30m, 500ms, as in [5m], [1h:5m] and offset 1d
|
|
117
|
+
duration: {
|
|
118
|
+
name: "constant.numeric.duration.promql",
|
|
119
|
+
match: "\\b\\d+(?:ms|[smhdwy])(?:\\d+(?:ms|[smhdwy]))*\\b"
|
|
120
|
+
},
|
|
121
|
+
number: {
|
|
122
|
+
name: "constant.numeric.promql",
|
|
123
|
+
match: "\\b(?:0[xX][0-9a-fA-F]+|\\d+\\.?\\d*(?:[eE][+-]?\\d+)?|[Ii]nf|[Nn]a[Nn])\\b|(?<![\\w.])\\.\\d+(?:[eE][+-]?\\d+)?\\b"
|
|
124
|
+
},
|
|
125
|
+
aggregation: {
|
|
126
|
+
name: "keyword.other.aggregation.promql",
|
|
127
|
+
match: "\\b(?:sum|min|max|avg|group|stddev|stdvar|count_values|count|bottomk|topk|quantile|limitk|limit_ratio)\\b(?=\\s*(?:\\(|by\\b|without\\b))"
|
|
128
|
+
},
|
|
129
|
+
keyword: {
|
|
130
|
+
patterns: [
|
|
131
|
+
{
|
|
132
|
+
name: "keyword.control.modifier.promql",
|
|
133
|
+
match: "\\b(?:offset|bool)\\b"
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
name: "keyword.operator.logical.promql",
|
|
137
|
+
match: "\\b(?:and|or|unless|atan2)\\b"
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
name: "keyword.control.grouping.promql",
|
|
141
|
+
match: `\\b(?:${GROUPING})\\b`
|
|
142
|
+
}
|
|
143
|
+
]
|
|
144
|
+
},
|
|
145
|
+
// Any name followed by "(" is a function: the list of PromQL functions grows with Prometheus.
|
|
146
|
+
function: {
|
|
147
|
+
name: "support.function.promql",
|
|
148
|
+
match: `\\b${IDENT}(?=\\s*\\()`
|
|
149
|
+
},
|
|
150
|
+
metric: {
|
|
151
|
+
name: "variable.other.metric.promql",
|
|
152
|
+
match: "(?<![\\w:])[a-zA-Z_][a-zA-Z0-9_:]*"
|
|
153
|
+
},
|
|
154
|
+
operator: {
|
|
155
|
+
patterns: [
|
|
156
|
+
{ name: "keyword.operator.comparison.promql", match: "==|!=|>=|<=|=~|!~|>|<" },
|
|
157
|
+
{ name: "keyword.operator.arithmetic.promql", match: "[-+*/%^]" },
|
|
158
|
+
{ name: "keyword.operator.modifier.at.promql", match: "@" }
|
|
159
|
+
]
|
|
160
|
+
},
|
|
161
|
+
punctuation: {
|
|
162
|
+
patterns: [
|
|
163
|
+
{ name: "punctuation.definition.range.promql", match: "[\\[\\]:]" },
|
|
164
|
+
{ name: "punctuation.definition.group.promql", match: "[()]" },
|
|
165
|
+
{ name: "punctuation.separator.comma.promql", match: "," }
|
|
166
|
+
]
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
promql_default = [promql];
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
// src/code/languages.ts
|
|
175
|
+
var LOADERS = {
|
|
176
|
+
shellscript: () => import('shiki/langs/shellscript.mjs'),
|
|
177
|
+
shellsession: () => import('shiki/langs/shellsession.mjs'),
|
|
178
|
+
yaml: () => import('shiki/langs/yaml.mjs'),
|
|
179
|
+
json: () => import('shiki/langs/json.mjs'),
|
|
180
|
+
toml: () => import('shiki/langs/toml.mjs'),
|
|
181
|
+
ini: () => import('shiki/langs/ini.mjs'),
|
|
182
|
+
docker: () => import('shiki/langs/docker.mjs'),
|
|
183
|
+
sql: () => import('shiki/langs/sql.mjs'),
|
|
184
|
+
typescript: () => import('shiki/langs/typescript.mjs'),
|
|
185
|
+
javascript: () => import('shiki/langs/javascript.mjs'),
|
|
186
|
+
tsx: () => import('shiki/langs/tsx.mjs'),
|
|
187
|
+
jsx: () => import('shiki/langs/jsx.mjs'),
|
|
188
|
+
python: () => import('shiki/langs/python.mjs'),
|
|
189
|
+
go: () => import('shiki/langs/go.mjs'),
|
|
190
|
+
html: () => import('shiki/langs/html.mjs'),
|
|
191
|
+
xml: () => import('shiki/langs/xml.mjs'),
|
|
192
|
+
css: () => import('shiki/langs/css.mjs'),
|
|
193
|
+
diff: () => import('shiki/langs/diff.mjs'),
|
|
194
|
+
nginx: () => import('shiki/langs/nginx.mjs'),
|
|
195
|
+
hcl: () => import('shiki/langs/hcl.mjs'),
|
|
196
|
+
terraform: () => import('shiki/langs/terraform.mjs'),
|
|
197
|
+
rust: () => import('shiki/langs/rust.mjs'),
|
|
198
|
+
java: () => import('shiki/langs/java.mjs'),
|
|
199
|
+
php: () => import('shiki/langs/php.mjs'),
|
|
200
|
+
markdown: () => import('shiki/langs/markdown.mjs'),
|
|
201
|
+
promql: () => Promise.resolve().then(() => (init_promql(), promql_exports))
|
|
202
|
+
};
|
|
203
|
+
var ALIASES = {
|
|
204
|
+
bash: "shellscript",
|
|
205
|
+
sh: "shellscript",
|
|
206
|
+
shell: "shellscript",
|
|
207
|
+
zsh: "shellscript",
|
|
208
|
+
console: "shellsession",
|
|
209
|
+
yml: "yaml",
|
|
210
|
+
dockerfile: "docker",
|
|
211
|
+
ts: "typescript",
|
|
212
|
+
js: "javascript",
|
|
213
|
+
py: "python",
|
|
214
|
+
golang: "go",
|
|
215
|
+
tf: "terraform",
|
|
216
|
+
rs: "rust",
|
|
217
|
+
md: "markdown",
|
|
218
|
+
prometheus: "promql"
|
|
219
|
+
};
|
|
220
|
+
var languageId = (language) => {
|
|
221
|
+
const name = language?.trim().toLowerCase();
|
|
222
|
+
if (!name) return void 0;
|
|
223
|
+
if (Object.hasOwn(LOADERS, name)) return name;
|
|
224
|
+
return Object.hasOwn(ALIASES, name) ? ALIASES[name] : void 0;
|
|
225
|
+
};
|
|
226
|
+
var CODE_LANGUAGES = [...Object.keys(LOADERS), ...Object.keys(ALIASES)];
|
|
227
|
+
var THEME = "cosmos";
|
|
228
|
+
var ITALIC = 1;
|
|
229
|
+
var BOLD = 2;
|
|
230
|
+
var UNDERLINE = 4;
|
|
231
|
+
var missingShiki = (cause) => new Error(
|
|
232
|
+
'@sckyzo/cosmos-react/code needs the optional peer dependency "shiki". Install it with `pnpm add shiki` (or `npm install shiki`).',
|
|
233
|
+
{ cause }
|
|
234
|
+
);
|
|
235
|
+
var core;
|
|
236
|
+
var pending;
|
|
237
|
+
var loadCore = () => pending ??= (async () => {
|
|
238
|
+
let shiki;
|
|
239
|
+
let engine;
|
|
240
|
+
try {
|
|
241
|
+
[shiki, engine] = await Promise.all([
|
|
242
|
+
import('shiki/core'),
|
|
243
|
+
import('shiki/engine/javascript')
|
|
244
|
+
]);
|
|
245
|
+
} catch (error) {
|
|
246
|
+
throw missingShiki(error);
|
|
247
|
+
}
|
|
248
|
+
core = await shiki.createHighlighterCore({
|
|
249
|
+
themes: [shiki.createCssVariablesTheme({ name: THEME, variablePrefix: "--color-code-" })],
|
|
250
|
+
langs: [],
|
|
251
|
+
engine: engine.createJavaScriptRegexEngine()
|
|
252
|
+
});
|
|
253
|
+
return core;
|
|
254
|
+
})();
|
|
255
|
+
var loading = /* @__PURE__ */ new Map();
|
|
256
|
+
var loadLanguage = (language) => {
|
|
257
|
+
const id = languageId(language);
|
|
258
|
+
if (!id) return Promise.resolve(false);
|
|
259
|
+
let promise = loading.get(id);
|
|
260
|
+
if (!promise) {
|
|
261
|
+
promise = (async () => {
|
|
262
|
+
const highlighter = await loadCore();
|
|
263
|
+
if (!highlighter.getLoadedLanguages().includes(id)) {
|
|
264
|
+
await highlighter.loadLanguage(await LOADERS[id]());
|
|
265
|
+
}
|
|
266
|
+
return true;
|
|
267
|
+
})();
|
|
268
|
+
promise.catch(() => loading.delete(id));
|
|
269
|
+
loading.set(id, promise);
|
|
270
|
+
}
|
|
271
|
+
return promise;
|
|
272
|
+
};
|
|
273
|
+
var isLanguageLoaded = (language) => {
|
|
274
|
+
const id = languageId(language);
|
|
275
|
+
return Boolean(id && core?.getLoadedLanguages().includes(id));
|
|
276
|
+
};
|
|
277
|
+
var tokenStyle = (color, fontStyle) => {
|
|
278
|
+
const style = {};
|
|
279
|
+
if (color) style.color = color;
|
|
280
|
+
if (fontStyle && fontStyle > 0) {
|
|
281
|
+
if (fontStyle & ITALIC) style.fontStyle = "italic";
|
|
282
|
+
if (fontStyle & BOLD) style.fontWeight = "bold";
|
|
283
|
+
if (fontStyle & UNDERLINE) style.textDecoration = "underline";
|
|
284
|
+
}
|
|
285
|
+
return style;
|
|
286
|
+
};
|
|
287
|
+
var highlight = (code, language) => {
|
|
288
|
+
const id = languageId(language);
|
|
289
|
+
if (!core || !id || !core.getLoadedLanguages().includes(id)) return code;
|
|
290
|
+
const { tokens } = core.codeToTokens(code, { lang: id, theme: THEME });
|
|
291
|
+
return tokens.map((line, i) => /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
292
|
+
i > 0 && "\n",
|
|
293
|
+
line.map((token, j) => /* @__PURE__ */ jsx("span", { style: tokenStyle(token.color, token.fontStyle), children: token.content }, j))
|
|
294
|
+
] }, i));
|
|
295
|
+
};
|
|
296
|
+
var CodeBlock = ({ highlight: highlight2, language, variant, ...props }) => {
|
|
297
|
+
const wanted = highlight2 ? void 0 : variant === "terminal" ? "bash" : language;
|
|
298
|
+
const [, loaded] = useReducer((n) => n + 1, 0);
|
|
299
|
+
const [failure, setFailure] = useState();
|
|
300
|
+
const ready = isLanguageLoaded(wanted);
|
|
301
|
+
useEffect(() => {
|
|
302
|
+
if (!wanted || ready) return;
|
|
303
|
+
let current = true;
|
|
304
|
+
loadLanguage(wanted).then(
|
|
305
|
+
() => current && loaded(),
|
|
306
|
+
(error) => current && setFailure(error)
|
|
307
|
+
);
|
|
308
|
+
return () => {
|
|
309
|
+
current = false;
|
|
310
|
+
};
|
|
311
|
+
}, [wanted, ready]);
|
|
312
|
+
if (failure) throw failure;
|
|
313
|
+
return /* @__PURE__ */ jsx(
|
|
314
|
+
CodeBlock$1,
|
|
315
|
+
{
|
|
316
|
+
...props,
|
|
317
|
+
language,
|
|
318
|
+
variant,
|
|
319
|
+
highlight: highlight2 ?? (ready ? highlight : void 0)
|
|
320
|
+
}
|
|
321
|
+
);
|
|
322
|
+
};
|
|
323
|
+
|
|
324
|
+
export { CODE_LANGUAGES, CodeBlock, highlight, loadLanguage };
|
|
325
|
+
//# sourceMappingURL=index.js.map
|
|
326
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/code/promql.ts","../../src/code/languages.ts","../../src/code/highlighter.tsx","../../src/code/CodeBlock.tsx"],"names":["highlight","jsx","PlainCodeBlock"],"mappings":"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","file":"index.js","sourcesContent":["import type { LanguageRegistration } from 'shiki/core';\n\n// Shiki ships no PromQL grammar. This is a small TextMate one, written for the\n// scopes the `--color-code-*` theme colours: functions and metric/label names\n// stand apart, aggregations and `by` / `without` read as keywords.\n\nconst IDENT = '[a-zA-Z_][a-zA-Z0-9_]*';\nconst GROUPING = 'by|without|on|ignoring|group_left|group_right';\n\nconst promql: LanguageRegistration = {\n name: 'promql',\n displayName: 'PromQL',\n scopeName: 'source.promql',\n aliases: ['prometheus'],\n patterns: [{ include: '#expression' }],\n repository: {\n expression: {\n patterns: [\n { include: '#comment' },\n { include: '#string' },\n { include: '#label-matchers' },\n { include: '#grouping' },\n { include: '#duration' },\n { include: '#number' },\n { include: '#aggregation' },\n { include: '#keyword' },\n { include: '#function' },\n { include: '#metric' },\n { include: '#operator' },\n { include: '#punctuation' },\n ],\n },\n comment: {\n name: 'comment.line.number-sign.promql',\n match: '#.*$',\n },\n string: {\n patterns: [\n {\n name: 'string.quoted.double.promql',\n begin: '\"',\n end: '\"',\n patterns: [{ name: 'constant.character.escape.promql', match: '\\\\\\\\.' }],\n },\n {\n name: 'string.quoted.single.promql',\n begin: \"'\",\n end: \"'\",\n patterns: [{ name: 'constant.character.escape.promql', match: '\\\\\\\\.' }],\n },\n {\n name: 'string.quoted.other.backtick.promql',\n begin: '`',\n end: '`',\n },\n ],\n },\n // {job=\"api\", code!~\"5..\", instance=~\".+\"}\n 'label-matchers': {\n name: 'meta.label-matchers.promql',\n begin: '\\\\{',\n end: '\\\\}',\n beginCaptures: { 0: { name: 'punctuation.definition.label-matchers.begin.promql' } },\n endCaptures: { 0: { name: 'punctuation.definition.label-matchers.end.promql' } },\n patterns: [\n { include: '#comment' },\n { include: '#string' },\n {\n name: 'keyword.operator.comparison.label-matcher.promql',\n match: '=~|!~|!=|=',\n },\n {\n name: 'meta.property-name.label.promql',\n match: IDENT,\n },\n { name: 'punctuation.separator.comma.promql', match: ',' },\n ],\n },\n // sum by (job, instance) (...), a / on (job) group_left (...)\n grouping: {\n name: 'meta.grouping.promql',\n begin: `\\\\b(${GROUPING})\\\\b\\\\s*(\\\\()`,\n end: '\\\\)',\n beginCaptures: {\n 1: { name: 'keyword.control.grouping.promql' },\n 2: { name: 'punctuation.definition.grouping.begin.promql' },\n },\n endCaptures: { 0: { name: 'punctuation.definition.grouping.end.promql' } },\n patterns: [\n { include: '#string' },\n { name: 'meta.property-name.label.promql', match: IDENT },\n { name: 'punctuation.separator.comma.promql', match: ',' },\n ],\n },\n // 5m, 1h30m, 500ms, as in [5m], [1h:5m] and offset 1d\n duration: {\n name: 'constant.numeric.duration.promql',\n match: '\\\\b\\\\d+(?:ms|[smhdwy])(?:\\\\d+(?:ms|[smhdwy]))*\\\\b',\n },\n number: {\n name: 'constant.numeric.promql',\n match:\n '\\\\b(?:0[xX][0-9a-fA-F]+|\\\\d+\\\\.?\\\\d*(?:[eE][+-]?\\\\d+)?|[Ii]nf|[Nn]a[Nn])\\\\b|(?<![\\\\w.])\\\\.\\\\d+(?:[eE][+-]?\\\\d+)?\\\\b',\n },\n aggregation: {\n name: 'keyword.other.aggregation.promql',\n match:\n '\\\\b(?:sum|min|max|avg|group|stddev|stdvar|count_values|count|bottomk|topk|quantile|limitk|limit_ratio)\\\\b(?=\\\\s*(?:\\\\(|by\\\\b|without\\\\b))',\n },\n keyword: {\n patterns: [\n {\n name: 'keyword.control.modifier.promql',\n match: '\\\\b(?:offset|bool)\\\\b',\n },\n {\n name: 'keyword.operator.logical.promql',\n match: '\\\\b(?:and|or|unless|atan2)\\\\b',\n },\n {\n name: 'keyword.control.grouping.promql',\n match: `\\\\b(?:${GROUPING})\\\\b`,\n },\n ],\n },\n // Any name followed by \"(\" is a function: the list of PromQL functions grows with Prometheus.\n function: {\n name: 'support.function.promql',\n match: `\\\\b${IDENT}(?=\\\\s*\\\\()`,\n },\n metric: {\n name: 'variable.other.metric.promql',\n match: '(?<![\\\\w:])[a-zA-Z_][a-zA-Z0-9_:]*',\n },\n operator: {\n patterns: [\n { name: 'keyword.operator.comparison.promql', match: '==|!=|>=|<=|=~|!~|>|<' },\n { name: 'keyword.operator.arithmetic.promql', match: '[-+*/%^]' },\n { name: 'keyword.operator.modifier.at.promql', match: '@' },\n ],\n },\n punctuation: {\n patterns: [\n { name: 'punctuation.definition.range.promql', match: '[\\\\[\\\\]:]' },\n { name: 'punctuation.definition.group.promql', match: '[()]' },\n { name: 'punctuation.separator.comma.promql', match: ',' },\n ],\n },\n },\n};\n\nexport default [promql];\n","import type { LanguageInput } from 'shiki/core';\n\n// Every language is one dynamic import: a bundler splits each into a chunk of its own, and a page\n// only downloads the ones its code blocks show. Keyed by the id Shiki knows the grammar by.\nexport const LOADERS = {\n shellscript: () => import('shiki/langs/shellscript.mjs'),\n shellsession: () => import('shiki/langs/shellsession.mjs'),\n yaml: () => import('shiki/langs/yaml.mjs'),\n json: () => import('shiki/langs/json.mjs'),\n toml: () => import('shiki/langs/toml.mjs'),\n ini: () => import('shiki/langs/ini.mjs'),\n docker: () => import('shiki/langs/docker.mjs'),\n sql: () => import('shiki/langs/sql.mjs'),\n typescript: () => import('shiki/langs/typescript.mjs'),\n javascript: () => import('shiki/langs/javascript.mjs'),\n tsx: () => import('shiki/langs/tsx.mjs'),\n jsx: () => import('shiki/langs/jsx.mjs'),\n python: () => import('shiki/langs/python.mjs'),\n go: () => import('shiki/langs/go.mjs'),\n html: () => import('shiki/langs/html.mjs'),\n xml: () => import('shiki/langs/xml.mjs'),\n css: () => import('shiki/langs/css.mjs'),\n diff: () => import('shiki/langs/diff.mjs'),\n nginx: () => import('shiki/langs/nginx.mjs'),\n hcl: () => import('shiki/langs/hcl.mjs'),\n terraform: () => import('shiki/langs/terraform.mjs'),\n rust: () => import('shiki/langs/rust.mjs'),\n java: () => import('shiki/langs/java.mjs'),\n php: () => import('shiki/langs/php.mjs'),\n markdown: () => import('shiki/langs/markdown.mjs'),\n promql: () => import('./promql'),\n} satisfies Record<string, () => PromiseLike<{ default: LanguageInput }>>;\n\nexport type LanguageId = keyof typeof LOADERS;\n\n/** The other names a language goes by in a code fence or a file name. */\nconst ALIASES: Record<string, LanguageId> = {\n bash: 'shellscript',\n sh: 'shellscript',\n shell: 'shellscript',\n zsh: 'shellscript',\n console: 'shellsession',\n yml: 'yaml',\n dockerfile: 'docker',\n ts: 'typescript',\n js: 'javascript',\n py: 'python',\n golang: 'go',\n tf: 'terraform',\n rs: 'rust',\n md: 'markdown',\n prometheus: 'promql',\n};\n\n/** The grammar behind a language name, or `undefined` for a language Cosmos has none for. */\nexport const languageId = (language?: string): LanguageId | undefined => {\n const name = language?.trim().toLowerCase();\n if (!name) return undefined;\n if (Object.hasOwn(LOADERS, name)) return name as LanguageId;\n return Object.hasOwn(ALIASES, name) ? ALIASES[name] : undefined;\n};\n\n/** The names the highlighter understands: the ids and their aliases. */\nexport const CODE_LANGUAGES: readonly string[] = [...Object.keys(LOADERS), ...Object.keys(ALIASES)];\n","import { Fragment, type CSSProperties, type ReactNode } from 'react';\nimport type { HighlighterCore } from 'shiki/core';\nimport { LOADERS, languageId } from './languages';\n\nconst THEME = 'cosmos';\n\n// Shiki's FontStyle bit flags.\nconst ITALIC = 1;\nconst BOLD = 2;\nconst UNDERLINE = 4;\n\nconst missingShiki = (cause: unknown) =>\n new Error(\n '@sckyzo/cosmos-react/code needs the optional peer dependency \"shiki\". Install it with `pnpm add shiki` (or `npm install shiki`).',\n { cause }\n );\n\nlet core: HighlighterCore | undefined;\nlet pending: Promise<HighlighterCore> | undefined;\n\n/**\n * The Shiki core, created on the first use: its colours are the `--color-code-*` tokens of the\n * theme, so a theme, accent or text size switch repaints on its own, and its regex engine is the\n * JavaScript one (no WebAssembly to load). No language is loaded yet.\n */\nconst loadCore = () =>\n (pending ??= (async () => {\n let shiki: typeof import('shiki/core');\n let engine: typeof import('shiki/engine/javascript');\n try {\n [shiki, engine] = await Promise.all([\n import('shiki/core'),\n import('shiki/engine/javascript'),\n ]);\n } catch (error) {\n throw missingShiki(error);\n }\n core = await shiki.createHighlighterCore({\n themes: [shiki.createCssVariablesTheme({ name: THEME, variablePrefix: '--color-code-' })],\n langs: [],\n engine: engine.createJavaScriptRegexEngine(),\n });\n return core;\n })());\n\nconst loading = new Map<string, Promise<boolean>>();\n\n/**\n * Loads the grammar of `language`: resolves `true` once the highlighter colours it, and `false`\n * for a language Cosmos has no grammar for (the block shows plain text). Rejects when `shiki` is\n * not installed. Loads each language once.\n */\nexport const loadLanguage = (language?: string): Promise<boolean> => {\n const id = languageId(language);\n if (!id) return Promise.resolve(false);\n let promise = loading.get(id);\n if (!promise) {\n promise = (async () => {\n const highlighter = await loadCore();\n if (!highlighter.getLoadedLanguages().includes(id)) {\n await highlighter.loadLanguage(await LOADERS[id]());\n }\n return true;\n })();\n // A failed load (no network, no shiki) is tried again on the next ask.\n promise.catch(() => loading.delete(id));\n loading.set(id, promise);\n }\n return promise;\n};\n\n/** Whether `highlight` colours `language` right now. */\nexport const isLanguageLoaded = (language?: string) => {\n const id = languageId(language);\n return Boolean(id && core?.getLoadedLanguages().includes(id));\n};\n\nconst tokenStyle = (color: string | undefined, fontStyle: number | undefined) => {\n const style: CSSProperties = {};\n if (color) style.color = color;\n if (fontStyle && fontStyle > 0) {\n if (fontStyle & ITALIC) style.fontStyle = 'italic';\n if (fontStyle & BOLD) style.fontWeight = 'bold';\n if (fontStyle & UNDERLINE) style.textDecoration = 'underline';\n }\n return style;\n};\n\n/**\n * `CodeBlock`'s `highlight` prop, ready to use: Shiki tokens as React elements (nothing goes\n * through `innerHTML`). It colours the languages that have loaded, and returns `code` as plain\n * text for the others, so a block shows its text first and its colours once\n * `loadLanguage(language)` has resolved. `CodeBlock` of this entry does both.\n */\nexport const highlight = (code: string, language?: string): ReactNode => {\n const id = languageId(language);\n if (!core || !id || !core.getLoadedLanguages().includes(id)) return code;\n const { tokens } = core.codeToTokens(code, { lang: id, theme: THEME });\n return tokens.map((line, i) => (\n <Fragment key={i}>\n {i > 0 && '\\n'}\n {line.map((token, j) => (\n <span key={j} style={tokenStyle(token.color, token.fontStyle)}>\n {token.content}\n </span>\n ))}\n </Fragment>\n ));\n};\n","import { useEffect, useReducer, useState } from 'react';\nimport { CodeBlock as PlainCodeBlock, type CodeBlockProps } from '../ui/CodeBlock';\nimport { highlight as builtIn, isLanguageLoaded, loadLanguage } from './highlighter';\n\nexport type { CodeBlockProps };\n\n/**\n * `CodeBlock` with the Shiki highlighter plugged in: `<CodeBlock language=\"yaml\" code={…} />` is\n * coloured with no setup. The language loads on demand; until it has, and for a language with no\n * grammar, the block shows plain text. A `highlight` prop still overrides the built-in one.\n */\nexport const CodeBlock = ({ highlight, language, variant, ...props }: CodeBlockProps) => {\n // A terminal session is highlighted as shell, whatever its `language` label says.\n const wanted = highlight ? undefined : variant === 'terminal' ? 'bash' : language;\n const [, loaded] = useReducer((n: number) => n + 1, 0);\n const [failure, setFailure] = useState<unknown>();\n const ready = isLanguageLoaded(wanted);\n\n useEffect(() => {\n if (!wanted || ready) return;\n let current = true;\n loadLanguage(wanted).then(\n () => current && loaded(),\n (error: unknown) => current && setFailure(error)\n );\n return () => {\n current = false;\n };\n }, [wanted, ready]);\n\n // Rendered, so an error boundary catches it: a missing peer names the package to install.\n if (failure) throw failure;\n\n return (\n <PlainCodeBlock\n {...props}\n language={language}\n variant={variant}\n highlight={highlight ?? (ready ? builtIn : undefined)}\n />\n );\n};\n"]}
|