@santi020k/lumen-core 0.4.0 → 1.0.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/dist/charts.d.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  export declare const lumenChartTones: readonly ["series-1", "series-2", "series-3", "series-4", "series-5", "series-6", "series-7", "series-8", "brand", "accent", "success", "warning", "danger", "neutral"];
2
- export type LumenChartTone = typeof lumenChartTones[number];
2
+ export type LumenChartTone = (typeof lumenChartTones)[number];
3
3
  export interface LumenChartDatum {
4
4
  label?: string;
5
5
  tone?: LumenChartTone;
6
6
  x: number | string;
7
+ xLabel?: string;
7
8
  y: number | null;
8
9
  }
9
10
  export interface LumenChartSeries {
@@ -47,6 +48,7 @@ export interface LumenBarGeometryMark {
47
48
  y: number;
48
49
  }
49
50
  export interface LumenBarGeometryCategory {
51
+ category: number | string;
50
52
  label: number | string;
51
53
  x: number;
52
54
  y: number;
@@ -59,6 +61,7 @@ export interface LumenBarGeometry {
59
61
  width: number;
60
62
  }
61
63
  export interface LumenBarGeometryOptions {
64
+ categoryWidth?: number;
62
65
  height?: number;
63
66
  layout?: LumenBarChartLayout;
64
67
  orientation?: LumenChartOrientation;
@@ -92,6 +95,8 @@ export declare const getLumenChartDomain: (values: readonly (number | null)[], i
92
95
  export declare const scaleLumenChartValue: (value: number, domain: LumenChartDomain, rangeStart: number, rangeEnd: number) => number;
93
96
  export declare const getLumenChartTicks: (domain: LumenChartDomain, count?: number) => number[];
94
97
  export declare const resolveLumenChartTone: (tone: LumenChartTone | undefined, index?: number) => LumenChartTone;
98
+ export declare const getLumenChartToneClassName: (tone: LumenChartTone | undefined, index?: number) => string;
99
+ export declare const getLumenPieChartVariantClassName: (variant: LumenPieChartVariant) => string;
95
100
  export declare const createLumenPieGeometry: (data: readonly LumenChartDatum[], options?: LumenPieGeometryOptions) => LumenPieGeometry;
96
101
  export declare const createLumenLineGeometry: (data: readonly LumenChartDatum[], options?: LumenLineGeometryOptions) => LumenLineGeometry;
97
102
  export declare const getLumenChartValueRatio: (value: number, domain: LumenChartDomain) => number;
@@ -1 +1 @@
1
- {"version":3,"file":"charts.d.ts","sourceRoot":"","sources":["../src/charts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"charts.d.ts","sourceRoot":"","sources":["../src/charts.ts"],"names":[],"mappings":"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"}
package/dist/charts.js CHANGED
@@ -14,6 +14,26 @@ export const lumenChartTones = [
14
14
  'danger',
15
15
  'neutral'
16
16
  ];
17
+ const lumenChartToneClassNames = {
18
+ accent: 'ui-chart-tone--accent',
19
+ brand: 'ui-chart-tone--brand',
20
+ danger: 'ui-chart-tone--danger',
21
+ neutral: 'ui-chart-tone--neutral',
22
+ 'series-1': 'ui-chart-tone--series-1',
23
+ 'series-2': 'ui-chart-tone--series-2',
24
+ 'series-3': 'ui-chart-tone--series-3',
25
+ 'series-4': 'ui-chart-tone--series-4',
26
+ 'series-5': 'ui-chart-tone--series-5',
27
+ 'series-6': 'ui-chart-tone--series-6',
28
+ 'series-7': 'ui-chart-tone--series-7',
29
+ 'series-8': 'ui-chart-tone--series-8',
30
+ success: 'ui-chart-tone--success',
31
+ warning: 'ui-chart-tone--warning'
32
+ };
33
+ const lumenPieChartVariantClassNames = {
34
+ donut: 'ui-pie-chart--donut',
35
+ pie: 'ui-pie-chart--pie'
36
+ };
17
37
  const defaultChartSize = 100;
18
38
  const defaultChartPadding = 4;
19
39
  const finiteValues = (values) => values.filter((value) => value !== null && Number.isFinite(value));
@@ -49,15 +69,26 @@ export const getLumenChartTicks = (domain, count = 5) => {
49
69
  return Array.from({ length: safeCount }, (_, index) => domain.min + step * index);
50
70
  };
51
71
  export const resolveLumenChartTone = (tone, index = 0) => tone ?? lumenChartTones[index % 8] ?? 'series-1';
72
+ export const getLumenChartToneClassName = (tone, index = 0) => lumenChartToneClassNames[resolveLumenChartTone(tone, index)];
73
+ export const getLumenPieChartVariantClassName = (variant) => lumenPieChartVariantClassNames[variant];
52
74
  const polarPoint = (center, radius, angle) => {
53
- const radians = angle * Math.PI / 180;
75
+ const radians = (angle * Math.PI) / 180;
54
76
  return {
55
77
  x: center + Math.cos(radians) * radius,
56
78
  y: center + Math.sin(radians) * radius
57
79
  };
58
80
  };
59
81
  const formatPieCoordinate = (value) => value.toFixed(3);
60
- const pieArc = (radius, largeArc, sweep, point) => `A ${formatPieCoordinate(radius)} ${formatPieCoordinate(radius)} 0 ${largeArc ? 1 : 0} ${sweep} ${formatPieCoordinate(point.x)} ${formatPieCoordinate(point.y)}`;
82
+ const pieArc = (radius, largeArc, sweep, point) => [
83
+ 'A',
84
+ formatPieCoordinate(radius),
85
+ formatPieCoordinate(radius),
86
+ 0,
87
+ largeArc ? 1 : 0,
88
+ sweep,
89
+ formatPieCoordinate(point.x),
90
+ formatPieCoordinate(point.y)
91
+ ].join(' ');
61
92
  const fullPiePath = (center, outerRadius, innerRadius) => {
62
93
  const topOuter = polarPoint(center, outerRadius, -90);
63
94
  const bottomOuter = polarPoint(center, outerRadius, 90);
@@ -116,12 +147,10 @@ export const createLumenPieGeometry = (data, options = {}) => {
116
147
  const slices = available.map((datum, index) => {
117
148
  const percentage = total === 0 ? 0 : datum.y / total;
118
149
  const startAngle = angle;
119
- const endAngle = index === available.length - 1
120
- ? 270
121
- : startAngle + percentage * 360;
150
+ const endAngle = index === available.length - 1 ? 270 : startAngle + percentage * 360;
122
151
  angle = endAngle;
123
152
  return {
124
- label: datum.label ?? String(datum.x),
153
+ label: datum.label ?? datum.xLabel ?? String(datum.x),
125
154
  path: pieSlicePath(center, outerRadius, innerRadius, startAngle, endAngle),
126
155
  percentage,
127
156
  tone: resolveLumenChartTone(datum.tone, index),
@@ -153,7 +182,8 @@ const splitGeometrySegments = (data, domain, width, height, padding) => {
153
182
  }
154
183
  current.push({
155
184
  ...datum,
156
- xCoordinate: padding + (data.length === 1 ? 0.5 : index / denominator) * drawableWidth,
185
+ xCoordinate: padding +
186
+ (data.length === 1 ? 0.5 : index / denominator) * drawableWidth,
157
187
  yCoordinate: scaleLumenChartValue(datum.y, domain, padding + drawableHeight, padding)
158
188
  });
159
189
  }
@@ -176,13 +206,24 @@ export const createLumenLineGeometry = (data, options = {}) => {
176
206
  const segments = splitGeometrySegments(data, domain, width, height, padding);
177
207
  const baseline = scaleLumenChartValue(Math.max(domain.min, Math.min(domain.max, 0)), domain, height - padding, padding);
178
208
  return {
179
- areaPaths: segments.map(points => {
209
+ areaPaths: segments
210
+ .map(points => {
180
211
  const first = points[0];
181
212
  const last = points[points.length - 1];
182
213
  if (!first || !last)
183
214
  return '';
184
- return `${segmentPath(points)} L ${last.xCoordinate.toFixed(3)} ${baseline.toFixed(3)} L ${first.xCoordinate.toFixed(3)} ${baseline.toFixed(3)} Z`;
185
- }).filter(Boolean),
215
+ return [
216
+ segmentPath(points),
217
+ 'L',
218
+ last.xCoordinate.toFixed(3),
219
+ baseline.toFixed(3),
220
+ 'L',
221
+ first.xCoordinate.toFixed(3),
222
+ baseline.toFixed(3),
223
+ 'Z'
224
+ ].join(' ');
225
+ })
226
+ .filter(Boolean),
186
227
  domain,
187
228
  path: segments.map(segmentPath).join(' '),
188
229
  points: segments.flat()
@@ -205,7 +246,10 @@ export const getLumenChartCategories = (series) => {
205
246
  };
206
247
  export const alignLumenChartSeries = (series, categories) => ({
207
248
  ...series,
208
- data: categories.map(category => series.data.find(datum => datum.x === category) ?? { x: category, y: null })
249
+ data: categories.map(category => series.data.find(datum => datum.x === category) ?? {
250
+ x: category,
251
+ y: null
252
+ })
209
253
  });
210
254
  const getDatumValue = (series, category) => series.data.find(datum => datum.x === category)?.y ?? 0;
211
255
  const getStackedDomain = (series, categories) => {
@@ -236,32 +280,43 @@ export const createLumenBarGeometry = (series, options = {}) => {
236
280
  const layout = options.layout ?? 'grouped';
237
281
  const categories = getLumenChartCategories(series);
238
282
  const values = series.flatMap(item => item.data.map(datum => datum.y));
239
- const domain = layout === 'stacked'
240
- ? getStackedDomain(series, categories)
241
- : getLumenChartDomain(values);
242
- const margin = orientation === 'horizontal'
243
- ? { bottom: 24, left: 112, right: 20, top: 16 }
244
- : { bottom: 52, left: 52, right: 16, top: 16 };
283
+ const domain = layout === 'stacked' ?
284
+ getStackedDomain(series, categories) :
285
+ getLumenChartDomain(values);
286
+ const margin = orientation === 'horizontal' ?
287
+ {
288
+ bottom: 24,
289
+ left: Math.max(64, Math.min(240, options.categoryWidth ?? 112)),
290
+ right: 20,
291
+ top: 16
292
+ } :
293
+ { bottom: 52, left: 52, right: 16, top: 16 };
245
294
  const plotWidth = Math.max(1, width - margin.left - margin.right);
246
295
  const plotHeight = Math.max(1, height - margin.top - margin.bottom);
247
- const categorySize = (orientation === 'horizontal' ? plotHeight : plotWidth) / Math.max(1, categories.length);
296
+ const categorySize = (orientation === 'horizontal' ? plotHeight : plotWidth) /
297
+ Math.max(1, categories.length);
248
298
  const categoryGap = Math.min(16, categorySize * 0.24);
249
299
  const usableCategorySize = Math.max(1, categorySize - categoryGap);
250
300
  const seriesSize = usableCategorySize / Math.max(1, series.length);
251
301
  const marks = [];
252
302
  const categoryPositions = [];
253
303
  for (const [categoryIndex, category] of categories.entries()) {
254
- const categoryStart = (orientation === 'horizontal' ? margin.top : margin.left) + categoryIndex * categorySize + categoryGap / 2;
304
+ const categoryStart = (orientation === 'horizontal' ? margin.top : margin.left) +
305
+ categoryIndex * categorySize +
306
+ categoryGap / 2;
255
307
  let positiveOffset = 0;
256
308
  let negativeOffset = 0;
257
309
  categoryPositions.push({
258
- label: category,
259
- x: orientation === 'horizontal'
260
- ? margin.left - 8
261
- : categoryStart + usableCategorySize / 2,
262
- y: orientation === 'horizontal'
263
- ? categoryStart + usableCategorySize / 2
264
- : height - 20
310
+ category,
311
+ label: series
312
+ .flatMap(item => item.data)
313
+ .find(datum => datum.x === category)?.xLabel ?? category,
314
+ x: orientation === 'horizontal' ?
315
+ margin.left - 8 :
316
+ categoryStart + usableCategorySize / 2,
317
+ y: orientation === 'horizontal' ?
318
+ categoryStart + usableCategorySize / 2 :
319
+ height - 20
265
320
  });
266
321
  for (const [seriesIndex, item] of series.entries()) {
267
322
  const value = getDatumValue(item, category);
@@ -273,14 +328,17 @@ export const createLumenBarGeometry = (series, options = {}) => {
273
328
  const end = scaleLumenChartValue(endValue, domain, margin.left, margin.left + plotWidth);
274
329
  marks.push({
275
330
  category,
276
- height: layout === 'stacked' ? usableCategorySize : Math.max(1, seriesSize - 2),
331
+ height: layout === 'stacked' ?
332
+ usableCategorySize :
333
+ Math.max(1, seriesSize - 2),
277
334
  seriesId: item.id,
278
335
  seriesLabel: item.label,
279
336
  tone,
280
337
  value,
281
338
  width: Math.abs(end - start),
282
339
  x: Math.min(start, end),
283
- y: categoryStart + (layout === 'stacked' ? 0 : seriesIndex * seriesSize + 1)
340
+ y: categoryStart +
341
+ (layout === 'stacked' ? 0 : seriesIndex * seriesSize + 1)
284
342
  });
285
343
  }
286
344
  else {
@@ -295,8 +353,11 @@ export const createLumenBarGeometry = (series, options = {}) => {
295
353
  seriesLabel: item.label,
296
354
  tone,
297
355
  value,
298
- width: layout === 'stacked' ? usableCategorySize : Math.max(1, seriesSize - 2),
299
- x: categoryStart + (layout === 'stacked' ? 0 : seriesIndex * seriesSize + 1),
356
+ width: layout === 'stacked' ?
357
+ usableCategorySize :
358
+ Math.max(1, seriesSize - 2),
359
+ x: categoryStart +
360
+ (layout === 'stacked' ? 0 : seriesIndex * seriesSize + 1),
300
361
  y: Math.min(start, end)
301
362
  });
302
363
  }
@@ -1 +1 @@
1
- {"version":3,"file":"code.d.ts","sourceRoot":"","sources":["../src/code.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAA;AAEhG,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,kBAAkB,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd;AAED,eAAO,MAAM,wBAAwB;;;;;;;CAOkB,CAAA;AA+NvD,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,WAc9C,CAAA;AAuKD,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,EAAE,iBAAa,KAAG,cAAc,EA0B7E,CAAA;AAgBD,eAAO,MAAM,mBAAmB,GAAI,MAAM,MAAM,EAAE,iBAAa,WACW,CAAA"}
1
+ {"version":3,"file":"code.d.ts","sourceRoot":"","sources":["../src/code.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAC5B,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAA;AAEjE,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,kBAAkB,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd;AAED,eAAO,MAAM,wBAAwB;;;;;;;CAOkB,CAAA;AAiPvD,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,WAc9C,CAAA;AA0LD,eAAO,MAAM,iBAAiB,GAC5B,MAAM,MAAM,EACZ,iBAAa,KACZ,cAAc,EA0BhB,CAAA;AAeD,eAAO,MAAM,mBAAmB,GAAI,MAAM,MAAM,EAAE,iBAAa,WAA6E,CAAA"}
package/dist/code.js CHANGED
@@ -14,11 +14,7 @@ const bashLikeLanguages = new Set([
14
14
  'terminal',
15
15
  'zsh'
16
16
  ]);
17
- const jsonLikeLanguages = new Set([
18
- 'json',
19
- 'json5',
20
- 'jsonc'
21
- ]);
17
+ const jsonLikeLanguages = new Set(['json', 'json5', 'jsonc']);
22
18
  const javascriptLikeLanguages = new Set([
23
19
  'js',
24
20
  'jsx',
@@ -28,14 +24,8 @@ const javascriptLikeLanguages = new Set([
28
24
  'tsx',
29
25
  'typescript'
30
26
  ]);
31
- const luaLikeLanguages = new Set([
32
- 'lua'
33
- ]);
34
- const markdownLikeLanguages = new Set([
35
- 'md',
36
- 'markdown',
37
- 'mdx'
38
- ]);
27
+ const luaLikeLanguages = new Set(['lua']);
28
+ const markdownLikeLanguages = new Set(['md', 'markdown', 'mdx']);
39
29
  const markupLikeLanguages = new Set([
40
30
  'astro',
41
31
  'html',
@@ -44,13 +34,8 @@ const markupLikeLanguages = new Set([
44
34
  'vue',
45
35
  'xml'
46
36
  ]);
47
- const sqlLikeLanguages = new Set([
48
- 'sql'
49
- ]);
50
- const yamlLikeLanguages = new Set([
51
- 'yaml',
52
- 'yml'
53
- ]);
37
+ const sqlLikeLanguages = new Set(['sql']);
38
+ const yamlLikeLanguages = new Set(['yaml', 'yml']);
54
39
  const javascriptKeywords = new Set([
55
40
  'as',
56
41
  'async',
@@ -123,11 +108,7 @@ const bashKeywords = new Set([
123
108
  'unset',
124
109
  'while'
125
110
  ]);
126
- const jsonKeywords = new Set([
127
- 'false',
128
- 'null',
129
- 'true'
130
- ]);
111
+ const jsonKeywords = new Set(['false', 'null', 'true']);
131
112
  const luaKeywords = new Set([
132
113
  'and',
133
114
  'break',
@@ -192,14 +173,41 @@ const yamlKeywords = new Set([
192
173
  'true',
193
174
  'yes'
194
175
  ]);
195
- const bashTokenPattern = /#[^\n]*|"(?:\\.|[^"\\])*"|'[^']*'|\$\{?[A-Za-z_][\w]*\}?|--?[A-Za-z][\w-]*|\b[A-Za-z_][\w]*\b|\b\d+(?:\.\d+)?\b|[|&;<>()[\]{}=]+/g;
196
- const javascriptTokenPattern = /\/\/[^\n]*|\/\*[\s\S]*?\*\/|"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|`(?:\\.|[^`\\])*`|\b\d[\d._]*\b|\b[A-Za-z_$][\w$]*\b|[=+\-*%<>!?:.,;()[\]{}|&/]+/g;
197
- const jsonTokenPattern = /\/\/[^\n]*|\/\*[\s\S]*?\*\/|"(?:\\.|[^"\\])*"|\b(?:false|null|true)\b|-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b|[{},:]|\[|\]/gi;
198
- const luaTokenPattern = /--\[\[[\s\S]*?\]\]|--[^\n]*|"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\b[A-Za-z_][\w]*\b|\b\d+(?:\.\d+)?\b|[=+\-*%<>~#.,:;()[\]{}]+/g;
199
- const markdownTokenPattern = /```[\s\S]*?```|`[^`\n]+`|<!--[\s\S]*?-->|^#{1,6}(?=\s)|^>\s?|^\s*(?:[-+*]|\d+\.)\s+|\*\*|__|\*|_|\[[^\]]+\]\([^)]+\)/gm;
200
- const markupTokenPattern = /<!--[\s\S]*?-->|---|<\/?|\/?>|"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\b[A-Za-z_][\w:.-]*\b|[{}=]/g;
201
- const sqlTokenPattern = /--[^\n]*|\/\*[\s\S]*?\*\/|"(?:\\.|[^"\\])*"|'(?:''|[^'])*'|\b[A-Za-z_][\w$]*\b|\b\d+(?:\.\d+)?\b|[=+\-*%<>!.,;()[\]]+/g;
202
- const yamlTokenPattern = /#[^\n]*|"(?:\\.|[^"\\])*"|'(?:''|[^'])*'|\b[A-Za-z_][\w.-]*(?=\s*:)|\b(?:false|no|null|off|on|true|yes)\b|\b\d+(?:\.\d+)?\b|[{},:&*!?|>@`~-]+|\[|\]/gi;
176
+ const bashTokenPattern = new RegExp([
177
+ String.raw `#[^\n]*|"(?:\\.|[^"\\])*"|'[^']*'|\$\{?[A-Za-z_][\w]*\}?|`,
178
+ String.raw `--?[A-Za-z][\w-]*|\b[A-Za-z_][\w]*\b|\b\d+(?:\.\d+)?\b|[|&;<>()[\]{}=]+`
179
+ ].join(''), 'g');
180
+ const javascriptTokenPattern = new RegExp([
181
+ String.raw `\/\/[^\n]*|\/\*[\s\S]*?\*\/|"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|`,
182
+ '`(?:\\\\.|[^`\\\\])*`|',
183
+ String.raw `\b\d[\d._]*\b|\b[A-Za-z_$][\w$]*\b|[=+\-*%<>!?:.,;()[\]{}|&/]+`
184
+ ].join(''), 'g');
185
+ const jsonTokenPattern = new RegExp([
186
+ String.raw `\/\/[^\n]*|\/\*[\s\S]*?\*\/|"(?:\\.|[^"\\])*"|`,
187
+ String.raw `\b(?:false|null|true)\b|-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b|[{},:]|\[|\]`
188
+ ].join(''), 'gi');
189
+ const luaTokenPattern = new RegExp([
190
+ String.raw `--\[\[[\s\S]*?\]\]|--[^\n]*|"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|`,
191
+ String.raw `\b[A-Za-z_][\w]*\b|\b\d+(?:\.\d+)?\b|[=+\-*%<>~#.,:;()[\]{}]+`
192
+ ].join(''), 'g');
193
+ const markdownTokenPattern = new RegExp([
194
+ '```[\\s\\S]*?```|`[^`\\n]+`|',
195
+ String.raw `<!--[\s\S]*?-->|^#{1,6}(?=\s)|^>\s?|^\s*(?:[-+*]|\d+\.)\s+|`,
196
+ String.raw `\*\*|__|\*|_|\[[^\]]+\]\([^)]+\)`
197
+ ].join(''), 'gm');
198
+ const markupTokenPattern = new RegExp([
199
+ String.raw `<!--[\s\S]*?-->|---|<\/?|\/?>|"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|`,
200
+ String.raw `\b[A-Za-z_][\w:.-]*\b|[{}=]`
201
+ ].join(''), 'g');
202
+ const sqlTokenPattern = new RegExp([
203
+ String.raw `--[^\n]*|\/\*[\s\S]*?\*\/|"(?:\\.|[^"\\])*"|'(?:''|[^'])*'|`,
204
+ String.raw `\b[A-Za-z_][\w$]*\b|\b\d+(?:\.\d+)?\b|[=+\-*%<>!.,;()[\]]+`
205
+ ].join(''), 'g');
206
+ const yamlTokenPattern = new RegExp([
207
+ String.raw `#[^\n]*|"(?:\\.|[^"\\])*"|'(?:''|[^'])*'|\b[A-Za-z_][\w.-]*(?=\s*:)|`,
208
+ String.raw `\b(?:false|no|null|off|on|true|yes)\b|\b\d+(?:\.\d+)?\b|`,
209
+ '[{},:&*!?|>@`~-]+|\\[|\\]'
210
+ ].join(''), 'gi');
203
211
  const leadingWhitespacePattern = /^[\t ]*/;
204
212
  const normalizeLanguage = (language = '') => language.trim().toLowerCase();
205
213
  const startsWithIdentifierPattern = /^[A-Za-z_$]/;
@@ -301,7 +309,10 @@ const getMarkupTokenKind = (value, source, start) => {
301
309
  const closingTagIndex = source.lastIndexOf('>', start);
302
310
  if (openingTagIndex < closingTagIndex)
303
311
  return undefined;
304
- const beforeValue = source.slice(openingTagIndex + 1, start).replace('/', '').trim();
312
+ const beforeValue = source
313
+ .slice(openingTagIndex + 1, start)
314
+ .replace('/', '')
315
+ .trim();
305
316
  return beforeValue === '' ? 'keyword' : 'type';
306
317
  };
307
318
  const getSqlTokenKind = (value) => {