@b9g/crank 0.7.4 → 0.7.6
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/_css.cjs.map +1 -1
- package/_css.js.map +1 -1
- package/_svg.cjs +94 -0
- package/_svg.cjs.map +1 -0
- package/_svg.js +92 -0
- package/_svg.js.map +1 -0
- package/_utils.cjs.map +1 -1
- package/_utils.js.map +1 -1
- package/async.cjs +2 -1
- package/async.cjs.map +1 -1
- package/async.js +2 -1
- package/async.js.map +1 -1
- package/crank.cjs +198 -16
- package/crank.cjs.map +1 -1
- package/crank.js +198 -16
- package/crank.js.map +1 -1
- package/dom.cjs +326 -258
- package/dom.cjs.map +1 -1
- package/dom.js +326 -258
- package/dom.js.map +1 -1
- package/event-target.cjs.map +1 -1
- package/event-target.js.map +1 -1
- package/html.cjs +35 -5
- package/html.cjs.map +1 -1
- package/html.js +35 -5
- package/html.js.map +1 -1
- package/jsx-runtime.cjs.map +1 -1
- package/jsx-runtime.js.map +1 -1
- package/jsx-tag.cjs +86 -21
- package/jsx-tag.cjs.map +1 -1
- package/jsx-tag.js +86 -22
- package/jsx-tag.js.map +1 -1
- package/package.json +1 -2
- package/standalone.cjs +7 -0
- package/standalone.cjs.map +1 -1
- package/standalone.js +2 -0
- package/standalone.js.map +1 -1
- package/umd.js +653 -285
- package/umd.js.map +1 -1
- package/_css.d.ts +0 -21
- package/_utils.d.ts +0 -14
- package/async.d.ts +0 -107
- package/crank.d.ts +0 -732
- package/dom.d.ts +0 -14
- package/event-target.d.ts +0 -26
- package/html.d.ts +0 -24
- package/jsx-runtime.d.ts +0 -6
- package/jsx-tag.d.ts +0 -4
- package/standalone.d.ts +0 -2
- package/umd.d.ts +0 -3
package/html.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html.js","sources":["../src/html.ts"],"sourcesContent":["import {Portal, Renderer} from \"./crank.js\";\nimport type {ElementValue, RenderAdapter} from \"./crank.js\";\nimport {camelToKebabCase, formatStyleValue} from \"./_css.js\";\n\nconst voidTags = new Set([\n\t\"area\",\n\t\"base\",\n\t\"br\",\n\t\"col\",\n\t\"command\",\n\t\"embed\",\n\t\"hr\",\n\t\"img\",\n\t\"input\",\n\t\"keygen\",\n\t\"link\",\n\t\"meta\",\n\t\"param\",\n\t\"source\",\n\t\"track\",\n\t\"wbr\",\n]);\n\nfunction escape(text: string): string {\n\treturn text.replace(/[&<>\"']/g, (match) => {\n\t\tswitch (match) {\n\t\t\tcase \"&\":\n\t\t\t\treturn \"&\";\n\t\t\tcase \"<\":\n\t\t\t\treturn \"<\";\n\t\t\tcase \">\":\n\t\t\t\treturn \">\";\n\t\t\tcase '\"':\n\t\t\t\treturn \""\";\n\t\t\tcase \"'\":\n\t\t\t\treturn \"'\";\n\t\t\tdefault:\n\t\t\t\treturn \"\";\n\t\t}\n\t});\n}\n\nfunction printStyleObject(style: Record<string, any>): string {\n\tconst cssStrings = [];\n\tfor (const [name, value] of Object.entries(style)) {\n\t\tif (value != null) {\n\t\t\tconst cssName = camelToKebabCase(name);\n\t\t\tconst cssValue = formatStyleValue(cssName, value);\n\t\t\tcssStrings.push(`${cssName}:${cssValue};`);\n\t\t}\n\t}\n\n\treturn cssStrings.join(\"\");\n}\n\nfunction printAttrs(props: Record<string, any>): string {\n\tconst attrs: string[] = [];\n\tfor (let [name, value] of Object.entries(props)) {\n\t\tif (name === \"innerHTML\" || name.startsWith(\"prop:\")) {\n\t\t\tcontinue;\n\t\t} else if (name === \"style\") {\n\t\t\tif (typeof value === \"string\") {\n\t\t\t\tattrs.push(`style=\"${escape(value)}\"`);\n\t\t\t} else if (typeof value === \"object\" && value !== null) {\n\t\t\t\tattrs.push(`style=\"${escape(printStyleObject(value))}\"`);\n\t\t\t}\n\t\t} else if (name === \"className\") {\n\t\t\tif (\"class\" in props || typeof value !== \"string\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tattrs.push(`class=\"${escape(value)}\"`);\n\t\t} else if (name === \"class\") {\n\t\t\tif (typeof value === \"string\") {\n\t\t\t\tattrs.push(`class=\"${escape(value)}\"`);\n\t\t\t} else if (typeof value === \"object\" && value !== null) {\n\t\t\t\t// class={{\"foo bar\": true, \"baz\": false}} syntax\n\t\t\t\tconst classes = Object.keys(value)\n\t\t\t\t\t.filter((k) => value[k])\n\t\t\t\t\t.join(\" \");\n\t\t\t\tif (classes) {\n\t\t\t\t\tattrs.push(`class=\"${escape(classes)}\"`);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (name.startsWith(\"attr:\")) {\n\t\t\t\tname = name.slice(\"attr:\".length);\n\t\t\t}\n\t\t\tif (typeof value === \"string\") {\n\t\t\t\tattrs.push(`${escape(name)}=\"${escape(value)}\"`);\n\t\t\t} else if (typeof value === \"number\") {\n\t\t\t\tattrs.push(`${escape(name)}=\"${value}\"`);\n\t\t\t} else if (value === true) {\n\t\t\t\tattrs.push(`${escape(name)}`);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn attrs.join(\" \");\n}\n\n/**\n * The equivalent of DOM Node for the HTML Renderer. Not to be confused with\n * the DOM's Text node. It's just an object with value string so that\n * we can reference the value of the HTML by reference, not value.\n *\n * TextNode is never actually\n */\ninterface TextNode {\n\tvalue?: string;\n}\n\nfunction join(children: Array<TextNode | string>): string {\n\tlet result = \"\";\n\tfor (let i = 0; i < children.length; i++) {\n\t\tconst child = children[i];\n\t\tresult += typeof child === \"string\" ? child : child.value;\n\t}\n\n\treturn result;\n}\n\nexport const impl: Partial<\n\tRenderAdapter<TextNode, undefined, TextNode, string>\n> = {\n\tcreate(): TextNode {\n\t\treturn {value: \"\"};\n\t},\n\n\ttext({value}: {value: string}): TextNode {\n\t\treturn {value: escape(value)};\n\t},\n\n\tread(value: ElementValue<TextNode>): string {\n\t\tif (Array.isArray(value)) {\n\t\t\treturn join(value);\n\t\t} else if (typeof value === \"undefined\") {\n\t\t\treturn \"\";\n\t\t} else if (typeof value === \"string\") {\n\t\t\treturn value;\n\t\t} else {\n\t\t\treturn value.value || \"\";\n\t\t}\n\t},\n\n\tarrange({\n\t\ttag,\n\t\ttagName,\n\t\tnode,\n\t\tprops,\n\t\tchildren,\n\t}: {\n\t\ttag: string | symbol;\n\t\ttagName: string;\n\t\tnode: TextNode;\n\t\tprops: Record<string, any>;\n\t\tchildren: Array<TextNode | string>;\n\t\troot: TextNode | undefined;\n\t}): void {\n\t\tif (tag === Portal) {\n\t\t\treturn;\n\t\t} else if (typeof tag !== \"string\") {\n\t\t\tthrow new Error(`Unknown tag: ${tagName}`);\n\t\t}\n\n\t\tconst attrs = printAttrs(props);\n\t\tconst open = `<${tag}${attrs.length ? \" \" : \"\"}${attrs}>`;\n\t\tlet result: string;\n\t\tif (voidTags.has(tag)) {\n\t\t\tresult = open;\n\t\t} else {\n\t\t\tconst close = `</${tag}>`;\n\t\t\tconst contents =\n\t\t\t\t\"innerHTML\" in props ? props[\"innerHTML\"] : join(children);\n\t\t\tresult = `${open}${contents}${close}`;\n\t\t}\n\n\t\tnode.value = result;\n\t},\n};\n\nexport class HTMLRenderer extends Renderer<TextNode, undefined, any, string> {\n\tconstructor() {\n\t\tsuper(impl);\n\t}\n}\n\nexport const renderer = new HTMLRenderer();\n\ndeclare global {\n\tmodule Crank {\n\t\tinterface EventMap extends GlobalEventHandlersEventMap {}\n\t}\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"html.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/jsx-runtime.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx-runtime.cjs","sources":[
|
|
1
|
+
{"version":3,"file":"jsx-runtime.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;"}
|
package/jsx-runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx-runtime.js","sources":[
|
|
1
|
+
{"version":3,"file":"jsx-runtime.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;"}
|
package/jsx-tag.cjs
CHANGED
|
@@ -8,7 +8,17 @@ function jsx(spans, ...expressions) {
|
|
|
8
8
|
let parseResult = cache.get(key);
|
|
9
9
|
if (parseResult == null) {
|
|
10
10
|
parseResult = parse(spans.raw);
|
|
11
|
-
|
|
11
|
+
let hasError = false;
|
|
12
|
+
for (let i = 0; i < parseResult.targets.length; i++) {
|
|
13
|
+
const t = parseResult.targets[i];
|
|
14
|
+
if (t && t.type === "error") {
|
|
15
|
+
hasError = true;
|
|
16
|
+
break;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
if (!hasError) {
|
|
20
|
+
cache.set(key, parseResult);
|
|
21
|
+
}
|
|
12
22
|
}
|
|
13
23
|
const { element, targets } = parseResult;
|
|
14
24
|
for (let i = 0; i < expressions.length; i++) {
|
|
@@ -16,12 +26,15 @@ function jsx(spans, ...expressions) {
|
|
|
16
26
|
const target = targets[i];
|
|
17
27
|
if (target) {
|
|
18
28
|
if (target.type === "error") {
|
|
19
|
-
|
|
29
|
+
const msg = target.message.replace("${}", formatTagForError(exp));
|
|
30
|
+
throw new SyntaxError(target.spanIndex != null && target.charIndex != null
|
|
31
|
+
? formatSyntaxError(msg, spans.raw, target.spanIndex, target.charIndex)
|
|
32
|
+
: msg);
|
|
20
33
|
}
|
|
21
34
|
target.value = exp;
|
|
22
35
|
}
|
|
23
36
|
}
|
|
24
|
-
return build(element);
|
|
37
|
+
return build(element, parseResult.spans);
|
|
25
38
|
}
|
|
26
39
|
/** Alias for `jsx` template tag. */
|
|
27
40
|
const html = jsx;
|
|
@@ -113,16 +126,20 @@ function parse(spans) {
|
|
|
113
126
|
type: "tag",
|
|
114
127
|
slash: closingSlash,
|
|
115
128
|
value: tagName,
|
|
129
|
+
spanIndex: s,
|
|
130
|
+
charIndex: match.index,
|
|
116
131
|
};
|
|
117
132
|
if (!stack.length) {
|
|
118
133
|
if (end !== span.length) {
|
|
119
|
-
throw new SyntaxError(`Unmatched closing tag "${tagName}"
|
|
134
|
+
throw new SyntaxError(formatSyntaxError(`Unmatched closing tag "${tagName}"`, spans, s, match.index));
|
|
120
135
|
}
|
|
121
136
|
// ERROR EXPRESSION
|
|
122
137
|
expressionTarget = {
|
|
123
138
|
type: "error",
|
|
124
139
|
message: "Unmatched closing tag ${}",
|
|
125
140
|
value: null,
|
|
141
|
+
spanIndex: s,
|
|
142
|
+
charIndex: match.index,
|
|
126
143
|
};
|
|
127
144
|
}
|
|
128
145
|
else {
|
|
@@ -141,6 +158,8 @@ function parse(spans) {
|
|
|
141
158
|
type: "tag",
|
|
142
159
|
slash: "",
|
|
143
160
|
value: tagName,
|
|
161
|
+
spanIndex: s,
|
|
162
|
+
charIndex: match.index,
|
|
144
163
|
},
|
|
145
164
|
close: null,
|
|
146
165
|
props: [],
|
|
@@ -175,7 +194,7 @@ function parse(spans) {
|
|
|
175
194
|
if (match) {
|
|
176
195
|
const [, tagEnd, spread, name, equals, string] = match;
|
|
177
196
|
if (i < match.index) {
|
|
178
|
-
throw new SyntaxError(`Unexpected text \`${span.slice(i, match.index).trim()}
|
|
197
|
+
throw new SyntaxError(formatSyntaxError(`Unexpected text \`${span.slice(i, match.index).trim()}\``, spans, s, i));
|
|
179
198
|
}
|
|
180
199
|
if (tagEnd) {
|
|
181
200
|
if (tagEnd[0] === "/") {
|
|
@@ -194,7 +213,7 @@ function parse(spans) {
|
|
|
194
213
|
// SPREAD PROP EXPRESSION
|
|
195
214
|
expressionTarget = value;
|
|
196
215
|
if (!(expressing && end === span.length)) {
|
|
197
|
-
throw new SyntaxError('Expression expected after "..."');
|
|
216
|
+
throw new SyntaxError(formatSyntaxError('Expression expected after "..."', spans, s, match.index));
|
|
198
217
|
}
|
|
199
218
|
}
|
|
200
219
|
else if (name) {
|
|
@@ -204,14 +223,14 @@ function parse(spans) {
|
|
|
204
223
|
value = { type: "value", value: true };
|
|
205
224
|
}
|
|
206
225
|
else if (end < span.length) {
|
|
207
|
-
throw new SyntaxError(`Unexpected text \`${span.slice(end, end + 20)}
|
|
226
|
+
throw new SyntaxError(formatSyntaxError(`Unexpected text \`${span.slice(end, end + 20)}\``, spans, s, end));
|
|
208
227
|
}
|
|
209
228
|
else {
|
|
210
229
|
value = { type: "value", value: null };
|
|
211
230
|
// PROP EXPRESSION
|
|
212
231
|
expressionTarget = value;
|
|
213
232
|
if (!(expressing && end === span.length)) {
|
|
214
|
-
throw new SyntaxError(`Expression expected for prop "${name}"
|
|
233
|
+
throw new SyntaxError(formatSyntaxError(`Expression expected for prop "${name}"`, spans, s, match.index));
|
|
215
234
|
}
|
|
216
235
|
}
|
|
217
236
|
}
|
|
@@ -237,10 +256,10 @@ function parse(spans) {
|
|
|
237
256
|
else {
|
|
238
257
|
if (!expressing) {
|
|
239
258
|
if (i === span.length) {
|
|
240
|
-
throw new SyntaxError(`Expected props but reached end of document
|
|
259
|
+
throw new SyntaxError(formatSyntaxError(`Expected props but reached end of document`, spans, s, i));
|
|
241
260
|
}
|
|
242
261
|
else {
|
|
243
|
-
throw new SyntaxError(`Unexpected text \`${span.slice(i, i + 20).trim()}
|
|
262
|
+
throw new SyntaxError(formatSyntaxError(`Unexpected text \`${span.slice(i, i + 20).trim()}\``, spans, s, i));
|
|
244
263
|
}
|
|
245
264
|
}
|
|
246
265
|
// Unexpected expression errors are handled in the outer loop.
|
|
@@ -255,13 +274,13 @@ function parse(spans) {
|
|
|
255
274
|
// We're in a closing tag and looking for the >.
|
|
256
275
|
if (match) {
|
|
257
276
|
if (i < match.index) {
|
|
258
|
-
throw new SyntaxError(`Unexpected text \`${span.slice(i, match.index).trim()}
|
|
277
|
+
throw new SyntaxError(formatSyntaxError(`Unexpected text \`${span.slice(i, match.index).trim()}\``, spans, s, i));
|
|
259
278
|
}
|
|
260
279
|
matcher = CHILDREN_RE;
|
|
261
280
|
}
|
|
262
281
|
else {
|
|
263
282
|
if (!expressing) {
|
|
264
|
-
throw new SyntaxError(`Unexpected text \`${span.slice(i, i + 20).trim()}
|
|
283
|
+
throw new SyntaxError(formatSyntaxError(`Unexpected text \`${span.slice(i, i + 20).trim()}\``, spans, s, i));
|
|
265
284
|
}
|
|
266
285
|
}
|
|
267
286
|
break;
|
|
@@ -277,7 +296,7 @@ function parse(spans) {
|
|
|
277
296
|
}
|
|
278
297
|
else {
|
|
279
298
|
if (!expressing) {
|
|
280
|
-
throw new SyntaxError(`Missing \`${matcher === CLOSING_SINGLE_QUOTE_RE ? "'" : '"'}
|
|
299
|
+
throw new SyntaxError(formatSyntaxError(`Missing \`${matcher === CLOSING_SINGLE_QUOTE_RE ? "'" : '"'}\``, spans, s, i));
|
|
281
300
|
}
|
|
282
301
|
}
|
|
283
302
|
break;
|
|
@@ -288,7 +307,7 @@ function parse(spans) {
|
|
|
288
307
|
}
|
|
289
308
|
else {
|
|
290
309
|
if (!expressing) {
|
|
291
|
-
throw new SyntaxError("Expected `-->` but reached end of template");
|
|
310
|
+
throw new SyntaxError(formatSyntaxError("Expected `-->` but reached end of template", spans, s, i));
|
|
292
311
|
}
|
|
293
312
|
}
|
|
294
313
|
break;
|
|
@@ -322,40 +341,45 @@ function parse(spans) {
|
|
|
322
341
|
targets.push(null);
|
|
323
342
|
break;
|
|
324
343
|
default:
|
|
325
|
-
throw new SyntaxError("Unexpected expression");
|
|
344
|
+
throw new SyntaxError(formatSyntaxError("Unexpected expression", spans, s, spans[s].length));
|
|
326
345
|
}
|
|
327
346
|
}
|
|
328
347
|
else if (expressionTarget) {
|
|
329
|
-
throw new SyntaxError("Expression expected");
|
|
348
|
+
throw new SyntaxError(formatSyntaxError("Expression expected", spans, s, spans[s].length));
|
|
330
349
|
}
|
|
331
350
|
lineStart = false;
|
|
332
351
|
}
|
|
333
352
|
if (stack.length) {
|
|
334
353
|
const ti = targets.indexOf(element.open);
|
|
335
354
|
if (ti === -1) {
|
|
336
|
-
throw new SyntaxError(`Unmatched opening tag "${element.open.value}"
|
|
355
|
+
throw new SyntaxError(formatSyntaxError(`Unmatched opening tag "${element.open.value}"`, spans, element.open.spanIndex ?? 0, element.open.charIndex ?? 0));
|
|
337
356
|
}
|
|
338
357
|
targets[ti] = {
|
|
339
358
|
type: "error",
|
|
340
359
|
message: "Unmatched opening tag ${}",
|
|
341
360
|
value: null,
|
|
361
|
+
spanIndex: element.open.spanIndex,
|
|
362
|
+
charIndex: element.open.charIndex,
|
|
342
363
|
};
|
|
343
364
|
}
|
|
344
365
|
if (element.children.length === 1 && element.children[0].type === "element") {
|
|
345
366
|
element = element.children[0];
|
|
346
367
|
}
|
|
347
|
-
return { element, targets };
|
|
368
|
+
return { element, targets, spans };
|
|
348
369
|
}
|
|
349
|
-
function build(parsed) {
|
|
370
|
+
function build(parsed, spans) {
|
|
350
371
|
if (parsed.close !== null &&
|
|
351
372
|
parsed.close.slash !== "//" &&
|
|
352
373
|
parsed.open.value !== parsed.close.value) {
|
|
353
|
-
|
|
374
|
+
const msg = `Unmatched closing tag ${formatTagForError(parsed.close.value)}, expected ${formatTagForError(parsed.open.value)}`;
|
|
375
|
+
throw new SyntaxError(spans && parsed.close.spanIndex != null && parsed.close.charIndex != null
|
|
376
|
+
? formatSyntaxError(msg, spans, parsed.close.spanIndex, parsed.close.charIndex)
|
|
377
|
+
: msg);
|
|
354
378
|
}
|
|
355
379
|
const children = [];
|
|
356
380
|
for (let i = 0; i < parsed.children.length; i++) {
|
|
357
381
|
const child = parsed.children[i];
|
|
358
|
-
children.push(child.type === "element" ? build(child) : child.value);
|
|
382
|
+
children.push(child.type === "element" ? build(child, spans) : child.value);
|
|
359
383
|
}
|
|
360
384
|
let props = parsed.props.length ? {} : null;
|
|
361
385
|
for (let i = 0; i < parsed.props.length; i++) {
|
|
@@ -426,7 +450,48 @@ function formatTagForError(tag) {
|
|
|
426
450
|
? `"${tag}"`
|
|
427
451
|
: JSON.stringify(tag);
|
|
428
452
|
}
|
|
453
|
+
function formatSyntaxError(message, spans, spanIndex, charIndex) {
|
|
454
|
+
// Reconstruct full template source with ${} placeholders
|
|
455
|
+
let source = spans[0];
|
|
456
|
+
for (let i = 1; i < spans.length; i++) {
|
|
457
|
+
source += "${}" + spans[i];
|
|
458
|
+
}
|
|
459
|
+
// Compute absolute offset
|
|
460
|
+
let offset = 0;
|
|
461
|
+
for (let i = 0; i < spanIndex; i++) {
|
|
462
|
+
offset += spans[i].length + 3; // 3 = "${}".length
|
|
463
|
+
}
|
|
464
|
+
offset += charIndex;
|
|
465
|
+
// Split into lines and find line/column
|
|
466
|
+
const lines = source.split(/\n/);
|
|
467
|
+
let line = 0;
|
|
468
|
+
let col = offset;
|
|
469
|
+
for (let i = 0; i < lines.length; i++) {
|
|
470
|
+
if (col <= lines[i].length) {
|
|
471
|
+
line = i;
|
|
472
|
+
break;
|
|
473
|
+
}
|
|
474
|
+
col -= lines[i].length + 1; // +1 for the newline
|
|
475
|
+
}
|
|
476
|
+
// Build context lines
|
|
477
|
+
let result = `${message}\n\n`;
|
|
478
|
+
const start = Math.max(0, line - 1);
|
|
479
|
+
const end = Math.min(lines.length - 1, line + 1);
|
|
480
|
+
const gutterWidth = String(end + 1).length;
|
|
481
|
+
for (let i = start; i <= end; i++) {
|
|
482
|
+
const num = String(i + 1).padStart(gutterWidth);
|
|
483
|
+
if (i === line) {
|
|
484
|
+
result += `> ${num} | ${lines[i]}\n`;
|
|
485
|
+
result += ` ${" ".repeat(gutterWidth)} | ${" ".repeat(col)}^\n`;
|
|
486
|
+
}
|
|
487
|
+
else {
|
|
488
|
+
result += ` ${num} | ${lines[i]}\n`;
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
return result.trimEnd();
|
|
492
|
+
}
|
|
429
493
|
|
|
430
494
|
exports.html = html;
|
|
431
495
|
exports.jsx = jsx;
|
|
496
|
+
exports.parse = parse;
|
|
432
497
|
//# sourceMappingURL=jsx-tag.cjs.map
|
package/jsx-tag.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx-tag.cjs","sources":["../src/jsx-tag.ts"],"sourcesContent":["import {createElement} from \"./crank.js\";\nimport type {Element} from \"./crank.js\";\n\nconst cache = new Map<string, ParseResult>();\nexport function jsx(\n\tspans: TemplateStringsArray,\n\t...expressions: Array<unknown>\n): Element {\n\tconst key = JSON.stringify(spans.raw);\n\tlet parseResult = cache.get(key);\n\tif (parseResult == null) {\n\t\tparseResult = parse(spans.raw);\n\t\tcache.set(key, parseResult);\n\t}\n\n\tconst {element, targets} = parseResult;\n\tfor (let i = 0; i < expressions.length; i++) {\n\t\tconst exp = expressions[i];\n\t\tconst target = targets[i];\n\t\tif (target) {\n\t\t\tif (target.type === \"error\") {\n\t\t\t\tthrow new SyntaxError(\n\t\t\t\t\ttarget.message.replace(\"${}\", formatTagForError(exp)),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\ttarget.value = exp;\n\t\t}\n\t}\n\n\treturn build(element);\n}\n\n/** Alias for `jsx` template tag. */\nexport const html = jsx;\n\n// Type definitions for a bare-bones AST\ninterface ParseElement {\n\ttype: \"element\";\n\topen: ParseTag;\n\tclose: ParseTag | null;\n\t// ParseValue is used to represent spread props.\n\tprops: Array<ParseProp | ParseValue>;\n\tchildren: Array<ParseElement | ParseValue>;\n}\n\ninterface ParseValue {\n\ttype: \"value\";\n\tvalue: any;\n}\n\ninterface ParseTag {\n\ttype: \"tag\";\n\tslash: string;\n\tvalue: any;\n}\n\ninterface ParseProp {\n\ttype: \"prop\";\n\tname: string;\n\tvalue: ParseValue | ParsePropString;\n}\n\ninterface ParsePropString {\n\ttype: \"propString\";\n\tparts: Array<string | ParseValue>;\n}\n\ninterface ParseError {\n\ttype: \"error\";\n\tmessage: string;\n\tvalue: any;\n}\n\n// The parse result includes an array of targets, references to objects in the\n// parse tree whose `value` property is overwritten with expressions when the\n// template function is called. By separating the logic of parsing static\n// template spans from the handling of dynamic expressions, we can cache parse\n// results for successive calls.\ntype ExpressionTarget = ParseValue | ParseTag | ParseProp | ParseError;\n\ninterface ParseResult {\n\telement: ParseElement;\n\ttargets: Array<ExpressionTarget | null>;\n}\n\n/**\n * Matches first significant character in children mode.\n *\n * Group 1: newline\n * Group 2: comment\n * Group 3: tag\n * Group 4: closing slash\n * Group 5: tag name\n *\n * The comment group must appear first because the tag group can potentially\n * match a comment, so that we can handle tag expressions where we've reached\n * the end of a span.\n */\nconst CHILDREN_RE =\n\t/((?:\\r|\\n|\\r\\n)\\s*)|(<!--[\\S\\s]*?(?:-->|$))|(<\\s*(\\/{0,2})\\s*([-_$\\w]*))/g;\n\n/**\n * Matches props after element tags.\n *\n * Group 1: tag end\n * Group 2: spread props\n * Group 3: prop name\n * Group 4: equals\n * Group 5: prop value string\n */\nconst PROPS_RE =\n\t/\\s*(?:(\\/?\\s*>)|(\\.\\.\\.\\s*)|(?:([-_$\\w]+)\\s*(=)?\\s*(?:(\"(\\\\\"|[\\S\\s])*?(?:\"|$)|'(?:\\\\'|[\\S\\s])*?(?:'|$)))?))/g;\n\nconst CLOSING_BRACKET_RE = />/g;\n\nconst CLOSING_SINGLE_QUOTE_RE = /[^\\\\]?'/g;\n\nconst CLOSING_DOUBLE_QUOTE_RE = /[^\\\\]?\"/g;\n\nconst CLOSING_COMMENT_RE = /-->/g;\n\nfunction parse(spans: ArrayLike<string>): ParseResult {\n\tlet matcher = CHILDREN_RE;\n\tconst stack: Array<ParseElement> = [];\n\tlet element: ParseElement = {\n\t\ttype: \"element\",\n\t\topen: {type: \"tag\", slash: \"\", value: \"\"},\n\t\tclose: null,\n\t\tprops: [],\n\t\tchildren: [],\n\t};\n\n\tconst targets: Array<ExpressionTarget | null> = [];\n\tlet lineStart = true;\n\tfor (let s = 0; s < spans.length; s++) {\n\t\tconst span = spans[s];\n\t\t// Whether or not an expression is upcoming. Used to provide better errors.\n\t\tconst expressing = s < spans.length - 1;\n\t\tlet expressionTarget: ExpressionTarget | null = null;\n\t\tfor (let i = 0, end = i; i < span.length; i = end) {\n\t\t\tmatcher.lastIndex = i;\n\t\t\tconst match = matcher.exec(span);\n\t\t\tend = match ? match.index + match[0].length : span.length;\n\t\t\tswitch (matcher) {\n\t\t\t\tcase CHILDREN_RE: {\n\t\t\t\t\tif (match) {\n\t\t\t\t\t\tconst [, newline, comment, tag, closingSlash, tagName] = match;\n\t\t\t\t\t\tif (i < match.index) {\n\t\t\t\t\t\t\tlet before = span.slice(i, match.index);\n\t\t\t\t\t\t\tif (lineStart) {\n\t\t\t\t\t\t\t\tbefore = before.replace(/^\\s*/, \"\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (newline) {\n\t\t\t\t\t\t\t\tif (span[Math.max(0, match.index - 1)] === \"\\\\\") {\n\t\t\t\t\t\t\t\t\t// We preserve whitespace before escaped newlines and have to\n\t\t\t\t\t\t\t\t\t// remove the backslash.\n\t\t\t\t\t\t\t\t\t// jsx` \\\n\t\t\t\t\t\t\t\t\t// `\n\t\t\t\t\t\t\t\t\tbefore = before.slice(0, -1);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tbefore = before.replace(/\\s*$/, \"\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (before) {\n\t\t\t\t\t\t\t\telement.children.push({type: \"value\", value: before});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlineStart = !!newline;\n\t\t\t\t\t\tif (comment) {\n\t\t\t\t\t\t\tif (end === span.length) {\n\t\t\t\t\t\t\t\t// Expression in a comment:\n\t\t\t\t\t\t\t\t// jsx`<!-- ${exp} -->`\n\t\t\t\t\t\t\t\tmatcher = CLOSING_COMMENT_RE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (tag) {\n\t\t\t\t\t\t\tif (closingSlash) {\n\t\t\t\t\t\t\t\telement.close = {\n\t\t\t\t\t\t\t\t\ttype: \"tag\",\n\t\t\t\t\t\t\t\t\tslash: closingSlash,\n\t\t\t\t\t\t\t\t\tvalue: tagName,\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\tif (!stack.length) {\n\t\t\t\t\t\t\t\t\tif (end !== span.length) {\n\t\t\t\t\t\t\t\t\t\tthrow new SyntaxError(`Unmatched closing tag \"${tagName}\"`);\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// ERROR EXPRESSION\n\t\t\t\t\t\t\t\t\texpressionTarget = {\n\t\t\t\t\t\t\t\t\t\ttype: \"error\",\n\t\t\t\t\t\t\t\t\t\tmessage: \"Unmatched closing tag ${}\",\n\t\t\t\t\t\t\t\t\t\tvalue: null,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tif (end === span.length) {\n\t\t\t\t\t\t\t\t\t\t// TAG EXPRESSION\n\t\t\t\t\t\t\t\t\t\texpressionTarget = element.close;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\telement = stack.pop()!;\n\t\t\t\t\t\t\t\t\tmatcher = CLOSING_BRACKET_RE;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst next: ParseElement = {\n\t\t\t\t\t\t\t\t\ttype: \"element\",\n\t\t\t\t\t\t\t\t\topen: {\n\t\t\t\t\t\t\t\t\t\ttype: \"tag\",\n\t\t\t\t\t\t\t\t\t\tslash: \"\",\n\t\t\t\t\t\t\t\t\t\tvalue: tagName,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tclose: null,\n\t\t\t\t\t\t\t\t\tprops: [],\n\t\t\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\telement.children.push(next);\n\t\t\t\t\t\t\t\tstack.push(element);\n\t\t\t\t\t\t\t\telement = next;\n\t\t\t\t\t\t\t\tmatcher = PROPS_RE;\n\t\t\t\t\t\t\t\tif (end === span.length) {\n\t\t\t\t\t\t\t\t\t// TAG EXPRESSION\n\t\t\t\t\t\t\t\t\texpressionTarget = element.open;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (i < span.length) {\n\t\t\t\t\t\t\tlet after = span.slice(i);\n\t\t\t\t\t\t\tif (!expressing) {\n\t\t\t\t\t\t\t\t// trim trailing whitespace\n\t\t\t\t\t\t\t\tafter = after.replace(/\\s*$/, \"\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (after) {\n\t\t\t\t\t\t\t\telement.children.push({type: \"value\", value: after});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase PROPS_RE: {\n\t\t\t\t\tif (match) {\n\t\t\t\t\t\tconst [, tagEnd, spread, name, equals, string] = match;\n\t\t\t\t\t\tif (i < match.index) {\n\t\t\t\t\t\t\tthrow new SyntaxError(\n\t\t\t\t\t\t\t\t`Unexpected text \\`${span.slice(i, match.index).trim()}\\``,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (tagEnd) {\n\t\t\t\t\t\t\tif (tagEnd[0] === \"/\") {\n\t\t\t\t\t\t\t\t// This is a self-closing element, so there will always be a\n\t\t\t\t\t\t\t\t// result on the stack.\n\t\t\t\t\t\t\t\telement = stack.pop()!;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tmatcher = CHILDREN_RE;\n\t\t\t\t\t\t} else if (spread) {\n\t\t\t\t\t\t\tconst value = {\n\t\t\t\t\t\t\t\ttype: \"value\" as const,\n\t\t\t\t\t\t\t\tvalue: null,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\telement.props.push(value);\n\t\t\t\t\t\t\t// SPREAD PROP EXPRESSION\n\t\t\t\t\t\t\texpressionTarget = value;\n\t\t\t\t\t\t\tif (!(expressing && end === span.length)) {\n\t\t\t\t\t\t\t\tthrow new SyntaxError('Expression expected after \"...\"');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (name) {\n\t\t\t\t\t\t\tlet value: ParseValue | ParsePropString;\n\t\t\t\t\t\t\tif (string == null) {\n\t\t\t\t\t\t\t\tif (!equals) {\n\t\t\t\t\t\t\t\t\tvalue = {type: \"value\", value: true};\n\t\t\t\t\t\t\t\t} else if (end < span.length) {\n\t\t\t\t\t\t\t\t\tthrow new SyntaxError(\n\t\t\t\t\t\t\t\t\t\t`Unexpected text \\`${span.slice(end, end + 20)}\\``,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tvalue = {type: \"value\" as const, value: null};\n\t\t\t\t\t\t\t\t\t// PROP EXPRESSION\n\t\t\t\t\t\t\t\t\texpressionTarget = value;\n\t\t\t\t\t\t\t\t\tif (!(expressing && end === span.length)) {\n\t\t\t\t\t\t\t\t\t\tthrow new SyntaxError(\n\t\t\t\t\t\t\t\t\t\t\t`Expression expected for prop \"${name}\"`,\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst quote = string[0];\n\t\t\t\t\t\t\t\tvalue = {type: \"propString\", parts: []};\n\t\t\t\t\t\t\t\tvalue.parts.push(string);\n\t\t\t\t\t\t\t\tif (end === span.length) {\n\t\t\t\t\t\t\t\t\tmatcher =\n\t\t\t\t\t\t\t\t\t\tquote === \"'\"\n\t\t\t\t\t\t\t\t\t\t\t? CLOSING_SINGLE_QUOTE_RE\n\t\t\t\t\t\t\t\t\t\t\t: CLOSING_DOUBLE_QUOTE_RE;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst prop = {\n\t\t\t\t\t\t\t\ttype: \"prop\" as const,\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\telement.props.push(prop);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (!expressing) {\n\t\t\t\t\t\t\tif (i === span.length) {\n\t\t\t\t\t\t\t\tthrow new SyntaxError(\n\t\t\t\t\t\t\t\t\t`Expected props but reached end of document`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthrow new SyntaxError(\n\t\t\t\t\t\t\t\t\t`Unexpected text \\`${span.slice(i, i + 20).trim()}\\``,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Unexpected expression errors are handled in the outer loop.\n\t\t\t\t\t\t//\n\t\t\t\t\t\t// This would most likely be the starting point for the logic of\n\t\t\t\t\t\t// prop name expressions.\n\t\t\t\t\t\t// jsx`<p ${name}=${value}>`\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase CLOSING_BRACKET_RE: {\n\t\t\t\t\t// We're in a closing tag and looking for the >.\n\t\t\t\t\tif (match) {\n\t\t\t\t\t\tif (i < match.index) {\n\t\t\t\t\t\t\tthrow new SyntaxError(\n\t\t\t\t\t\t\t\t`Unexpected text \\`${span.slice(i, match.index).trim()}\\``,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmatcher = CHILDREN_RE;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (!expressing) {\n\t\t\t\t\t\t\tthrow new SyntaxError(\n\t\t\t\t\t\t\t\t`Unexpected text \\`${span.slice(i, i + 20).trim()}\\``,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase CLOSING_SINGLE_QUOTE_RE:\n\t\t\t\tcase CLOSING_DOUBLE_QUOTE_RE: {\n\t\t\t\t\tconst string = span.slice(i, end);\n\t\t\t\t\tconst prop = element.props[element.props.length - 1] as ParseProp;\n\t\t\t\t\tconst propString = prop.value as ParsePropString;\n\t\t\t\t\tpropString.parts.push(string);\n\t\t\t\t\tif (match) {\n\t\t\t\t\t\tmatcher = PROPS_RE;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (!expressing) {\n\t\t\t\t\t\t\tthrow new SyntaxError(\n\t\t\t\t\t\t\t\t`Missing \\`${\n\t\t\t\t\t\t\t\t\tmatcher === CLOSING_SINGLE_QUOTE_RE ? \"'\" : '\"'\n\t\t\t\t\t\t\t\t}\\``,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase CLOSING_COMMENT_RE: {\n\t\t\t\t\tif (match) {\n\t\t\t\t\t\tmatcher = CHILDREN_RE;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (!expressing) {\n\t\t\t\t\t\t\tthrow new SyntaxError(\n\t\t\t\t\t\t\t\t\"Expected `-->` but reached end of template\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (expressing) {\n\t\t\tif (expressionTarget) {\n\t\t\t\ttargets.push(expressionTarget);\n\t\t\t\tif (expressionTarget.type === \"error\") {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tswitch (matcher) {\n\t\t\t\tcase CHILDREN_RE: {\n\t\t\t\t\tconst target = {type: \"value\" as const, value: null};\n\t\t\t\t\telement.children.push(target);\n\t\t\t\t\ttargets.push(target);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase CLOSING_SINGLE_QUOTE_RE:\n\t\t\t\tcase CLOSING_DOUBLE_QUOTE_RE: {\n\t\t\t\t\tconst prop = element.props[element.props.length - 1] as ParseProp;\n\t\t\t\t\tconst target = {type: \"value\" as const, value: null};\n\t\t\t\t\t(prop.value as ParsePropString).parts.push(target);\n\t\t\t\t\ttargets.push(target);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase CLOSING_COMMENT_RE:\n\t\t\t\t\ttargets.push(null);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new SyntaxError(\"Unexpected expression\");\n\t\t\t}\n\t\t} else if (expressionTarget) {\n\t\t\tthrow new SyntaxError(\"Expression expected\");\n\t\t}\n\n\t\tlineStart = false;\n\t}\n\n\tif (stack.length) {\n\t\tconst ti = targets.indexOf(element.open);\n\t\tif (ti === -1) {\n\t\t\tthrow new SyntaxError(`Unmatched opening tag \"${element.open.value}\"`);\n\t\t}\n\n\t\ttargets[ti] = {\n\t\t\ttype: \"error\",\n\t\t\tmessage: \"Unmatched opening tag ${}\",\n\t\t\tvalue: null,\n\t\t};\n\t}\n\n\tif (element.children.length === 1 && element.children[0].type === \"element\") {\n\t\telement = element.children[0];\n\t}\n\n\treturn {element, targets};\n}\n\nfunction build(parsed: ParseElement): Element {\n\tif (\n\t\tparsed.close !== null &&\n\t\tparsed.close.slash !== \"//\" &&\n\t\tparsed.open.value !== parsed.close.value\n\t) {\n\t\tthrow new SyntaxError(\n\t\t\t`Unmatched closing tag ${formatTagForError(\n\t\t\t\tparsed.close.value,\n\t\t\t)}, expected ${formatTagForError(parsed.open.value)}`,\n\t\t);\n\t}\n\n\tconst children: Array<unknown> = [];\n\tfor (let i = 0; i < parsed.children.length; i++) {\n\t\tconst child = parsed.children[i];\n\t\tchildren.push(child.type === \"element\" ? build(child) : child.value);\n\t}\n\n\tlet props = parsed.props.length ? ({} as Record<string, unknown>) : null;\n\tfor (let i = 0; i < parsed.props.length; i++) {\n\t\tconst prop = parsed.props[i];\n\t\tif (prop.type === \"prop\") {\n\t\t\tlet value: any;\n\t\t\tif (prop.value.type === \"value\") {\n\t\t\t\tvalue = prop.value.value;\n\t\t\t} else {\n\t\t\t\tlet string = \"\";\n\t\t\t\tfor (let i = 0; i < prop.value.parts.length; i++) {\n\t\t\t\t\tconst part = prop.value.parts[i];\n\t\t\t\t\tif (typeof part === \"string\") {\n\t\t\t\t\t\tstring += part;\n\t\t\t\t\t} else if (typeof part.value !== \"boolean\" && part.value != null) {\n\t\t\t\t\t\tstring +=\n\t\t\t\t\t\t\ttypeof part.value === \"string\" ? part.value : String(part.value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvalue = string\n\t\t\t\t\t// remove quotes\n\t\t\t\t\t.slice(1, -1)\n\t\t\t\t\t// unescape things\n\t\t\t\t\t// adapted from https://stackoverflow.com/a/57330383/1825413\n\t\t\t\t\t.replace(\n\t\t\t\t\t\t/\\\\x[0-9a-f]{2}|\\\\u[0-9a-f]{4}|\\\\u\\{[0-9a-f]+\\}|\\\\./gi,\n\t\t\t\t\t\t(match) => {\n\t\t\t\t\t\t\tswitch (match[1]) {\n\t\t\t\t\t\t\t\tcase \"b\":\n\t\t\t\t\t\t\t\t\treturn \"\\b\";\n\t\t\t\t\t\t\t\tcase \"f\":\n\t\t\t\t\t\t\t\t\treturn \"\\f\";\n\t\t\t\t\t\t\t\tcase \"n\":\n\t\t\t\t\t\t\t\t\treturn \"\\n\";\n\t\t\t\t\t\t\t\tcase \"r\":\n\t\t\t\t\t\t\t\t\treturn \"\\r\";\n\t\t\t\t\t\t\t\tcase \"t\":\n\t\t\t\t\t\t\t\t\treturn \"\\t\";\n\t\t\t\t\t\t\t\tcase \"v\":\n\t\t\t\t\t\t\t\t\treturn \"\\v\";\n\t\t\t\t\t\t\t\tcase \"x\":\n\t\t\t\t\t\t\t\t\treturn String.fromCharCode(parseInt(match.slice(2), 16));\n\t\t\t\t\t\t\t\tcase \"u\":\n\t\t\t\t\t\t\t\t\tif (match[2] === \"{\") {\n\t\t\t\t\t\t\t\t\t\treturn String.fromCodePoint(\n\t\t\t\t\t\t\t\t\t\t\tparseInt(match.slice(3, -1), 16),\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturn String.fromCharCode(parseInt(match.slice(2), 16));\n\t\t\t\t\t\t\t\tcase \"0\":\n\t\t\t\t\t\t\t\t\treturn \"\\0\";\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\treturn match.slice(1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t}\n\n\t\t\tprops![prop.name] = value;\n\t\t} else {\n\t\t\t// spread prop\n\t\t\tprops = {...props, ...(prop.value as any)};\n\t\t}\n\t}\n\n\treturn createElement(parsed.open.value, props, ...children);\n}\n\nfunction formatTagForError(tag: unknown): string {\n\treturn typeof tag === \"function\"\n\t\t? tag.name + \"()\"\n\t\t: typeof tag === \"string\"\n\t\t\t? `\"${tag}\"`\n\t\t\t: JSON.stringify(tag);\n}\n"],"names":["createElement"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"jsx-tag.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/jsx-tag.js
CHANGED
|
@@ -7,7 +7,17 @@ function jsx(spans, ...expressions) {
|
|
|
7
7
|
let parseResult = cache.get(key);
|
|
8
8
|
if (parseResult == null) {
|
|
9
9
|
parseResult = parse(spans.raw);
|
|
10
|
-
|
|
10
|
+
let hasError = false;
|
|
11
|
+
for (let i = 0; i < parseResult.targets.length; i++) {
|
|
12
|
+
const t = parseResult.targets[i];
|
|
13
|
+
if (t && t.type === "error") {
|
|
14
|
+
hasError = true;
|
|
15
|
+
break;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
if (!hasError) {
|
|
19
|
+
cache.set(key, parseResult);
|
|
20
|
+
}
|
|
11
21
|
}
|
|
12
22
|
const { element, targets } = parseResult;
|
|
13
23
|
for (let i = 0; i < expressions.length; i++) {
|
|
@@ -15,12 +25,15 @@ function jsx(spans, ...expressions) {
|
|
|
15
25
|
const target = targets[i];
|
|
16
26
|
if (target) {
|
|
17
27
|
if (target.type === "error") {
|
|
18
|
-
|
|
28
|
+
const msg = target.message.replace("${}", formatTagForError(exp));
|
|
29
|
+
throw new SyntaxError(target.spanIndex != null && target.charIndex != null
|
|
30
|
+
? formatSyntaxError(msg, spans.raw, target.spanIndex, target.charIndex)
|
|
31
|
+
: msg);
|
|
19
32
|
}
|
|
20
33
|
target.value = exp;
|
|
21
34
|
}
|
|
22
35
|
}
|
|
23
|
-
return build(element);
|
|
36
|
+
return build(element, parseResult.spans);
|
|
24
37
|
}
|
|
25
38
|
/** Alias for `jsx` template tag. */
|
|
26
39
|
const html = jsx;
|
|
@@ -112,16 +125,20 @@ function parse(spans) {
|
|
|
112
125
|
type: "tag",
|
|
113
126
|
slash: closingSlash,
|
|
114
127
|
value: tagName,
|
|
128
|
+
spanIndex: s,
|
|
129
|
+
charIndex: match.index,
|
|
115
130
|
};
|
|
116
131
|
if (!stack.length) {
|
|
117
132
|
if (end !== span.length) {
|
|
118
|
-
throw new SyntaxError(`Unmatched closing tag "${tagName}"
|
|
133
|
+
throw new SyntaxError(formatSyntaxError(`Unmatched closing tag "${tagName}"`, spans, s, match.index));
|
|
119
134
|
}
|
|
120
135
|
// ERROR EXPRESSION
|
|
121
136
|
expressionTarget = {
|
|
122
137
|
type: "error",
|
|
123
138
|
message: "Unmatched closing tag ${}",
|
|
124
139
|
value: null,
|
|
140
|
+
spanIndex: s,
|
|
141
|
+
charIndex: match.index,
|
|
125
142
|
};
|
|
126
143
|
}
|
|
127
144
|
else {
|
|
@@ -140,6 +157,8 @@ function parse(spans) {
|
|
|
140
157
|
type: "tag",
|
|
141
158
|
slash: "",
|
|
142
159
|
value: tagName,
|
|
160
|
+
spanIndex: s,
|
|
161
|
+
charIndex: match.index,
|
|
143
162
|
},
|
|
144
163
|
close: null,
|
|
145
164
|
props: [],
|
|
@@ -174,7 +193,7 @@ function parse(spans) {
|
|
|
174
193
|
if (match) {
|
|
175
194
|
const [, tagEnd, spread, name, equals, string] = match;
|
|
176
195
|
if (i < match.index) {
|
|
177
|
-
throw new SyntaxError(`Unexpected text \`${span.slice(i, match.index).trim()}
|
|
196
|
+
throw new SyntaxError(formatSyntaxError(`Unexpected text \`${span.slice(i, match.index).trim()}\``, spans, s, i));
|
|
178
197
|
}
|
|
179
198
|
if (tagEnd) {
|
|
180
199
|
if (tagEnd[0] === "/") {
|
|
@@ -193,7 +212,7 @@ function parse(spans) {
|
|
|
193
212
|
// SPREAD PROP EXPRESSION
|
|
194
213
|
expressionTarget = value;
|
|
195
214
|
if (!(expressing && end === span.length)) {
|
|
196
|
-
throw new SyntaxError('Expression expected after "..."');
|
|
215
|
+
throw new SyntaxError(formatSyntaxError('Expression expected after "..."', spans, s, match.index));
|
|
197
216
|
}
|
|
198
217
|
}
|
|
199
218
|
else if (name) {
|
|
@@ -203,14 +222,14 @@ function parse(spans) {
|
|
|
203
222
|
value = { type: "value", value: true };
|
|
204
223
|
}
|
|
205
224
|
else if (end < span.length) {
|
|
206
|
-
throw new SyntaxError(`Unexpected text \`${span.slice(end, end + 20)}
|
|
225
|
+
throw new SyntaxError(formatSyntaxError(`Unexpected text \`${span.slice(end, end + 20)}\``, spans, s, end));
|
|
207
226
|
}
|
|
208
227
|
else {
|
|
209
228
|
value = { type: "value", value: null };
|
|
210
229
|
// PROP EXPRESSION
|
|
211
230
|
expressionTarget = value;
|
|
212
231
|
if (!(expressing && end === span.length)) {
|
|
213
|
-
throw new SyntaxError(`Expression expected for prop "${name}"
|
|
232
|
+
throw new SyntaxError(formatSyntaxError(`Expression expected for prop "${name}"`, spans, s, match.index));
|
|
214
233
|
}
|
|
215
234
|
}
|
|
216
235
|
}
|
|
@@ -236,10 +255,10 @@ function parse(spans) {
|
|
|
236
255
|
else {
|
|
237
256
|
if (!expressing) {
|
|
238
257
|
if (i === span.length) {
|
|
239
|
-
throw new SyntaxError(`Expected props but reached end of document
|
|
258
|
+
throw new SyntaxError(formatSyntaxError(`Expected props but reached end of document`, spans, s, i));
|
|
240
259
|
}
|
|
241
260
|
else {
|
|
242
|
-
throw new SyntaxError(`Unexpected text \`${span.slice(i, i + 20).trim()}
|
|
261
|
+
throw new SyntaxError(formatSyntaxError(`Unexpected text \`${span.slice(i, i + 20).trim()}\``, spans, s, i));
|
|
243
262
|
}
|
|
244
263
|
}
|
|
245
264
|
// Unexpected expression errors are handled in the outer loop.
|
|
@@ -254,13 +273,13 @@ function parse(spans) {
|
|
|
254
273
|
// We're in a closing tag and looking for the >.
|
|
255
274
|
if (match) {
|
|
256
275
|
if (i < match.index) {
|
|
257
|
-
throw new SyntaxError(`Unexpected text \`${span.slice(i, match.index).trim()}
|
|
276
|
+
throw new SyntaxError(formatSyntaxError(`Unexpected text \`${span.slice(i, match.index).trim()}\``, spans, s, i));
|
|
258
277
|
}
|
|
259
278
|
matcher = CHILDREN_RE;
|
|
260
279
|
}
|
|
261
280
|
else {
|
|
262
281
|
if (!expressing) {
|
|
263
|
-
throw new SyntaxError(`Unexpected text \`${span.slice(i, i + 20).trim()}
|
|
282
|
+
throw new SyntaxError(formatSyntaxError(`Unexpected text \`${span.slice(i, i + 20).trim()}\``, spans, s, i));
|
|
264
283
|
}
|
|
265
284
|
}
|
|
266
285
|
break;
|
|
@@ -276,7 +295,7 @@ function parse(spans) {
|
|
|
276
295
|
}
|
|
277
296
|
else {
|
|
278
297
|
if (!expressing) {
|
|
279
|
-
throw new SyntaxError(`Missing \`${matcher === CLOSING_SINGLE_QUOTE_RE ? "'" : '"'}
|
|
298
|
+
throw new SyntaxError(formatSyntaxError(`Missing \`${matcher === CLOSING_SINGLE_QUOTE_RE ? "'" : '"'}\``, spans, s, i));
|
|
280
299
|
}
|
|
281
300
|
}
|
|
282
301
|
break;
|
|
@@ -287,7 +306,7 @@ function parse(spans) {
|
|
|
287
306
|
}
|
|
288
307
|
else {
|
|
289
308
|
if (!expressing) {
|
|
290
|
-
throw new SyntaxError("Expected `-->` but reached end of template");
|
|
309
|
+
throw new SyntaxError(formatSyntaxError("Expected `-->` but reached end of template", spans, s, i));
|
|
291
310
|
}
|
|
292
311
|
}
|
|
293
312
|
break;
|
|
@@ -321,40 +340,45 @@ function parse(spans) {
|
|
|
321
340
|
targets.push(null);
|
|
322
341
|
break;
|
|
323
342
|
default:
|
|
324
|
-
throw new SyntaxError("Unexpected expression");
|
|
343
|
+
throw new SyntaxError(formatSyntaxError("Unexpected expression", spans, s, spans[s].length));
|
|
325
344
|
}
|
|
326
345
|
}
|
|
327
346
|
else if (expressionTarget) {
|
|
328
|
-
throw new SyntaxError("Expression expected");
|
|
347
|
+
throw new SyntaxError(formatSyntaxError("Expression expected", spans, s, spans[s].length));
|
|
329
348
|
}
|
|
330
349
|
lineStart = false;
|
|
331
350
|
}
|
|
332
351
|
if (stack.length) {
|
|
333
352
|
const ti = targets.indexOf(element.open);
|
|
334
353
|
if (ti === -1) {
|
|
335
|
-
throw new SyntaxError(`Unmatched opening tag "${element.open.value}"
|
|
354
|
+
throw new SyntaxError(formatSyntaxError(`Unmatched opening tag "${element.open.value}"`, spans, element.open.spanIndex ?? 0, element.open.charIndex ?? 0));
|
|
336
355
|
}
|
|
337
356
|
targets[ti] = {
|
|
338
357
|
type: "error",
|
|
339
358
|
message: "Unmatched opening tag ${}",
|
|
340
359
|
value: null,
|
|
360
|
+
spanIndex: element.open.spanIndex,
|
|
361
|
+
charIndex: element.open.charIndex,
|
|
341
362
|
};
|
|
342
363
|
}
|
|
343
364
|
if (element.children.length === 1 && element.children[0].type === "element") {
|
|
344
365
|
element = element.children[0];
|
|
345
366
|
}
|
|
346
|
-
return { element, targets };
|
|
367
|
+
return { element, targets, spans };
|
|
347
368
|
}
|
|
348
|
-
function build(parsed) {
|
|
369
|
+
function build(parsed, spans) {
|
|
349
370
|
if (parsed.close !== null &&
|
|
350
371
|
parsed.close.slash !== "//" &&
|
|
351
372
|
parsed.open.value !== parsed.close.value) {
|
|
352
|
-
|
|
373
|
+
const msg = `Unmatched closing tag ${formatTagForError(parsed.close.value)}, expected ${formatTagForError(parsed.open.value)}`;
|
|
374
|
+
throw new SyntaxError(spans && parsed.close.spanIndex != null && parsed.close.charIndex != null
|
|
375
|
+
? formatSyntaxError(msg, spans, parsed.close.spanIndex, parsed.close.charIndex)
|
|
376
|
+
: msg);
|
|
353
377
|
}
|
|
354
378
|
const children = [];
|
|
355
379
|
for (let i = 0; i < parsed.children.length; i++) {
|
|
356
380
|
const child = parsed.children[i];
|
|
357
|
-
children.push(child.type === "element" ? build(child) : child.value);
|
|
381
|
+
children.push(child.type === "element" ? build(child, spans) : child.value);
|
|
358
382
|
}
|
|
359
383
|
let props = parsed.props.length ? {} : null;
|
|
360
384
|
for (let i = 0; i < parsed.props.length; i++) {
|
|
@@ -425,6 +449,46 @@ function formatTagForError(tag) {
|
|
|
425
449
|
? `"${tag}"`
|
|
426
450
|
: JSON.stringify(tag);
|
|
427
451
|
}
|
|
452
|
+
function formatSyntaxError(message, spans, spanIndex, charIndex) {
|
|
453
|
+
// Reconstruct full template source with ${} placeholders
|
|
454
|
+
let source = spans[0];
|
|
455
|
+
for (let i = 1; i < spans.length; i++) {
|
|
456
|
+
source += "${}" + spans[i];
|
|
457
|
+
}
|
|
458
|
+
// Compute absolute offset
|
|
459
|
+
let offset = 0;
|
|
460
|
+
for (let i = 0; i < spanIndex; i++) {
|
|
461
|
+
offset += spans[i].length + 3; // 3 = "${}".length
|
|
462
|
+
}
|
|
463
|
+
offset += charIndex;
|
|
464
|
+
// Split into lines and find line/column
|
|
465
|
+
const lines = source.split(/\n/);
|
|
466
|
+
let line = 0;
|
|
467
|
+
let col = offset;
|
|
468
|
+
for (let i = 0; i < lines.length; i++) {
|
|
469
|
+
if (col <= lines[i].length) {
|
|
470
|
+
line = i;
|
|
471
|
+
break;
|
|
472
|
+
}
|
|
473
|
+
col -= lines[i].length + 1; // +1 for the newline
|
|
474
|
+
}
|
|
475
|
+
// Build context lines
|
|
476
|
+
let result = `${message}\n\n`;
|
|
477
|
+
const start = Math.max(0, line - 1);
|
|
478
|
+
const end = Math.min(lines.length - 1, line + 1);
|
|
479
|
+
const gutterWidth = String(end + 1).length;
|
|
480
|
+
for (let i = start; i <= end; i++) {
|
|
481
|
+
const num = String(i + 1).padStart(gutterWidth);
|
|
482
|
+
if (i === line) {
|
|
483
|
+
result += `> ${num} | ${lines[i]}\n`;
|
|
484
|
+
result += ` ${" ".repeat(gutterWidth)} | ${" ".repeat(col)}^\n`;
|
|
485
|
+
}
|
|
486
|
+
else {
|
|
487
|
+
result += ` ${num} | ${lines[i]}\n`;
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
return result.trimEnd();
|
|
491
|
+
}
|
|
428
492
|
|
|
429
|
-
export { html, jsx };
|
|
493
|
+
export { html, jsx, parse };
|
|
430
494
|
//# sourceMappingURL=jsx-tag.js.map
|