@barefootjs/jsx 0.4.0 → 0.5.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.
@@ -106,6 +106,26 @@ export interface TemplateAdapter {
106
106
  * Required for adapters that look up templates by filename (e.g. Mojolicious).
107
107
  */
108
108
  templatesPerComponent?: boolean;
109
+ /**
110
+ * How the application author injects the externals importmap (and any
111
+ * `<link rel="modulepreload">` hints) into the page `<head>` when
112
+ * `externals` / `bundleEntries` are configured.
113
+ *
114
+ * - `'component'` — the adapter ships a render-time component (e.g. Hono's
115
+ * `BfImportMap`) that reads `barefoot-externals.json`; `bf build` emits no
116
+ * static snippet.
117
+ * - `'html-snippet'` — the adapter targets a template-string language (Go
118
+ * html/template, Mojolicious EP) with no component layer, so `bf build`
119
+ * writes a ready-to-include `barefoot-importmap.html` alongside
120
+ * `barefoot-externals.json` (via `renderImportMapHtml`).
121
+ *
122
+ * Optional only for backward compatibility (and internal-only adapters like
123
+ * the CSR test adapter). Every *shipping* adapter must set it — the
124
+ * adapter-tests importmap-injection contract enforces this so a new adapter
125
+ * cannot silently leave configured `externals` with no injection point.
126
+ * See issue #1644.
127
+ */
128
+ importMapInjection?: 'component' | 'html-snippet';
109
129
  /**
110
130
  * Module specifier of the SSR shim for `@barefootjs/client` (and
111
131
  * `/runtime`). When set, the compiler rewrites client-package imports in
@@ -1 +1 @@
1
- {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/adapters/interface.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/adapters/interface.ts"],"names":[],"mappings":"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"}
@@ -74,21 +74,30 @@ export type ParsedExpr = {
74
74
  reason: string;
75
75
  };
76
76
  /**
77
- * Structured form of a JS `(a, b) => …` sort comparator. Built once
78
- * at parse time and consumed by both adapters' arrayMethod emit and
79
- * (when chained directly before `.map()`) the loop-hoist path in
80
- * `jsx-to-ir.ts`. The shape is intentionally finite see
81
- * `extractSortComparatorFromTS` for the accepted catalogue.
77
+ * One comparison key inside a sort comparator. A simple
78
+ * `(a, b) => a.f - b.f` produces a single key; a multi-key
79
+ * `||`-chained comparator (`a.x - b.x || a.y - b.y`) produces one key
80
+ * per `||` operand, applied in priority order as tie-breakers.
82
81
  */
83
- export type SortComparator = {
82
+ export type SortKey = {
84
83
  key: {
85
84
  kind: 'self';
86
85
  } | {
87
86
  kind: 'field';
88
87
  field: string;
89
88
  };
90
- type: 'numeric' | 'string';
89
+ type: 'numeric' | 'string' | 'auto';
91
90
  direction: 'asc' | 'desc';
91
+ };
92
+ /**
93
+ * Structured form of a JS `(a, b) => …` sort comparator. Built once
94
+ * at parse time and consumed by both adapters' arrayMethod emit and
95
+ * (when chained directly before `.map()`) the loop-hoist path in
96
+ * `jsx-to-ir.ts`. The shape is intentionally finite — see
97
+ * `extractSortComparatorFromTS` for the accepted catalogue.
98
+ */
99
+ export type SortComparator = {
100
+ keys: SortKey[];
92
101
  raw: string;
93
102
  paramA: string;
94
103
  paramB: string;
@@ -138,20 +147,28 @@ export declare function parseExpression(expr: string): ParsedExpr;
138
147
  * match exactly, in which case the caller emits an `unsupported` IR
139
148
  * node and adapters surface BF101.
140
149
  *
141
- * Accepted shapes (paired ascending / descending):
150
+ * Body shapes:
151
+ * - expression-bodied arrow (`(a, b) => …`)
152
+ * - single-`return` block body — both arrow (`(a, b) => { return …; }`)
153
+ * and function expression. Multi-statement / local-var bodies stay
154
+ * refused (deferred follow-up).
155
+ *
156
+ * A body is split on top-level `||` into one leaf per operand, giving
157
+ * a multi-key comparator (`a.x - b.x || a.y - b.y` → sort by x, then y).
158
+ * Accepted leaf shapes (each paired ascending / descending by operand
159
+ * order):
142
160
  *
143
- * (a, b) => a.field - b.field → field, numeric, asc
144
- * (a, b) => b.field - a.field field, numeric, desc
145
- * (a, b) => a - b self, numeric, asc
146
- * (a, b) => b - a → self, numeric, desc
147
- * (a, b) => a.field.localeCompare(b.field) → field, string, asc
148
- * (a, b) => b.field.localeCompare(a.field) → field, string, desc
149
- * (a, b) => a.localeCompare(b) → self, string, asc
150
- * (a, b) => b.localeCompare(a) → self, string, desc
161
+ * a.field - b.field → field, numeric
162
+ * a - b self, numeric
163
+ * a.field.localeCompare(b.field) field, string
164
+ * a.localeCompare(b) → self, string
165
+ * a.field > b.field ? 1 : -1 → field, auto (relational ternary)
166
+ * a.field < b.field ? -1 : 1 → field, auto
167
+ * a < b ? -1 : a > b ? 1 : 0 → self/field, auto (3-way)
168
+ * a === b ? 0 : <relational ternary> leading-tie 3-way
151
169
  *
152
- * Anything outside (block bodies, multi-key `a.x-b.x || a.y-b.y`,
153
- * function-reference comparators, ternary comparators) returns null.
154
- * Block-body support is deferred to a follow-up.
170
+ * Function-reference comparators and `localeCompare(b, locale, opts)`
171
+ * (the multi-arg form) return null deferred follow-ups.
155
172
  */
156
173
  export declare function extractSortComparatorFromTS(node: ts.Node, method: 'sort' | 'toSorted'): SortComparator | null;
157
174
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"expression-parser.d.ts","sourceRoot":"","sources":["../src/expression-parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"expression-parser.d.ts","sourceRoot":"","sources":["../src/expression-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Shared importmap-snippet renderer.
3
+ *
4
+ * `bf build` emits `barefoot-externals.json` (the `ExternalsManifest`) whenever
5
+ * `externals` / `bundleEntries` are configured. Component adapters (Hono) read
6
+ * that manifest at render time via a JSX component (`BfImportMap`). Template-
7
+ * string adapters (Go html/template, Mojolicious EP) have no component layer, so
8
+ * `bf build` instead emits a static `barefoot-importmap.html` for them to
9
+ * `{{ template }}` / `%= include` into the page `<head>`.
10
+ *
11
+ * This module is the single source of truth for that snippet's HTML, so every
12
+ * adapter's importmap injection point stays in sync. See issue #1644.
13
+ */
14
+ /**
15
+ * The subset of `barefoot-externals.json` needed to render the importmap
16
+ * snippet. All fields are optional so a partial or hand-written manifest
17
+ * (e.g. a Hono `BfImportMap` `externals` prop) still type-checks. The strict
18
+ * build-output `ExternalsManifest` is structurally assignable to this, so both
19
+ * the CLI's emitted manifest and a hand-written one feed `renderImportMapHtml`.
20
+ * This is the one shared manifest type for every importmap injection path.
21
+ */
22
+ export interface ImportMapManifest {
23
+ /** Entries for `<script type="importmap">`. */
24
+ importmap?: {
25
+ imports?: Record<string, string>;
26
+ };
27
+ /** URLs to emit as `<link rel="modulepreload">`. */
28
+ preloads?: string[];
29
+ }
30
+ /**
31
+ * Shape of `barefoot-externals.json`, written by `bf build`. This is the build
32
+ * output contract shared by the CLI (which writes it) and the adapters (which
33
+ * consume it) — the all-required superset of {@link ImportMapManifest}.
34
+ */
35
+ export interface ExternalsManifest {
36
+ /** Entries for `<script type="importmap">`. */
37
+ importmap: {
38
+ imports: Record<string, string>;
39
+ };
40
+ /** URLs to emit as `<link rel="modulepreload">`. */
41
+ preloads: string[];
42
+ /** Package names to pass as `--external` to the user's bundler. */
43
+ externals: string[];
44
+ }
45
+ /**
46
+ * Render the `<script type="importmap">` (plus `<link rel="modulepreload">`)
47
+ * snippet from a parsed externals manifest. Fields are read defensively so a
48
+ * partial or hand-written manifest still produces valid output.
49
+ *
50
+ * Inside the importmap JSON, each `<` is replaced with its JSON unicode escape
51
+ * for code point U+003C so a URL containing `</script>` cannot break out of the
52
+ * script element — the JSON parser decodes that escape back to `<`, keeping the
53
+ * mapping value-identical.
54
+ */
55
+ export declare function renderImportMapHtml(manifest: ImportMapManifest): string;
56
+ //# sourceMappingURL=import-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-map.d.ts","sourceRoot":"","sources":["../src/import-map.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC,+CAA+C;IAC/C,SAAS,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAA;IAChD,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,+CAA+C;IAC/C,SAAS,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAA;IAC9C,oDAAoD;IACpD,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,mEAAmE;IACnE,SAAS,EAAE,MAAM,EAAE,CAAA;CACpB;AAOD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,CAavE"}
@@ -0,0 +1,18 @@
1
+ // src/import-map.ts
2
+ function escapeHtmlAttr(value) {
3
+ return value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;");
4
+ }
5
+ function renderImportMapHtml(manifest) {
6
+ const imports = manifest.importmap?.imports ?? {};
7
+ const json = JSON.stringify({ imports }).replace(/</g, "\\u003c");
8
+ const lines = [`<script type="importmap">${json}</script>`];
9
+ for (const href of manifest.preloads ?? []) {
10
+ lines.push(`<link rel="modulepreload" href="${escapeHtmlAttr(href)}" crossorigin>`);
11
+ }
12
+ return lines.join(`
13
+ `) + `
14
+ `;
15
+ }
16
+ export {
17
+ renderImportMapHtml
18
+ };
package/dist/index.d.ts CHANGED
@@ -28,6 +28,8 @@ export type { ClientJsResult } from './ir-to-client-js';
28
28
  export { SourceMapGenerator, buildSourceMapFromIR } from './ir-to-client-js/source-map';
29
29
  export type { SourceMapV3 } from './ir-to-client-js/source-map';
30
30
  export { combineParentChildClientJs } from './combine-client-js';
31
+ export { renderImportMapHtml } from './import-map';
32
+ export type { ExternalsManifest, ImportMapManifest } from './import-map';
31
33
  export interface OutputLayout {
32
34
  /** Subdirectory for marked templates (default: 'components') */
33
35
  templates: string;
@@ -166,7 +168,7 @@ export { applyCssLayerPrefix } from './css-layer-prefixer';
166
168
  export { enableCompilerInstrumentation, disableCompilerInstrumentation, resetCompilerCounters, getCompilerCounters, type CompilerCounters, } from './instrumentation';
167
169
  export { ErrorCodes, createError, formatError, generateCodeFrame } from './errors';
168
170
  export { parseExpression, isSupported, exprToString, stringifyParsedExpr, identifierPath, parseBlockBody, containsHigherOrder } from './expression-parser';
169
- export type { ParsedExpr, ParsedStatement, SortComparator, SupportLevel, SupportResult, TemplatePart } from './expression-parser';
171
+ export type { ParsedExpr, ParsedStatement, SortComparator, SortKey, SupportLevel, SupportResult, TemplatePart } from './expression-parser';
170
172
  export { buildLoopChainExpr } from './loop-chain';
171
173
  export type { LoopChainInputs } from './loop-chain';
172
174
  export { buildComponentGraph, buildComponentAnalysis, buildGraphFromIR, buildEventSummary, buildLoopSummary, buildWhyUpdate, traceUpdatePath, formatComponentGraph, formatUpdatePath, formatEventSummary, formatLoopSummary, formatWhyUpdate, describeFallback, formatFallbackExplanations, buildComponentSummary, formatComponentSummary, formatSignalTrace, generateStaticTrace, graphToJSON, resolveSetters, buildLocalFunctionSetterMap, makeIdCallRegex, } from './debug';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -62,6 +62,9 @@ function canRegexStartHere(prev) {
62
62
  return true;
63
63
  }
64
64
  }
65
+ function isIdentifierLikeToken(kind) {
66
+ return kind === ts.SyntaxKind.Identifier || kind >= ts.SyntaxKind.FirstKeyword && kind <= ts.SyntaxKind.LastKeyword;
67
+ }
65
68
  function isOpaqueContentKind(kind) {
66
69
  return kind === ts.SyntaxKind.StringLiteral || kind === ts.SyntaxKind.NoSubstitutionTemplateLiteral || kind === ts.SyntaxKind.RegularExpressionLiteral || kind === ts.SyntaxKind.SingleLineCommentTrivia || kind === ts.SyntaxKind.MultiLineCommentTrivia;
67
70
  }
@@ -173,6 +176,22 @@ function findTopLevelTemplateLiterals(code) {
173
176
  return out;
174
177
  }
175
178
 
179
+ // src/import-map.ts
180
+ function escapeHtmlAttr(value) {
181
+ return value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;");
182
+ }
183
+ function renderImportMapHtml(manifest) {
184
+ const imports = manifest.importmap?.imports ?? {};
185
+ const json = JSON.stringify({ imports }).replace(/</g, "\\u003c");
186
+ const lines = [`<script type="importmap">${json}</script>`];
187
+ for (const href of manifest.preloads ?? []) {
188
+ lines.push(`<link rel="modulepreload" href="${escapeHtmlAttr(href)}" crossorigin>`);
189
+ }
190
+ return lines.join(`
191
+ `) + `
192
+ `;
193
+ }
194
+
176
195
  // src/analyzer.ts
177
196
  import ts7 from "typescript";
178
197
 
@@ -398,150 +417,17 @@ function setIntersects(a, b) {
398
417
  function tokenContainsIdent(expr, ident) {
399
418
  return scanForIdentifiers(expr, (token) => token === ident);
400
419
  }
401
- var IDENT_START_RE = /[A-Za-z_$]/;
402
- var IDENT_PART_RE = /[A-Za-z0-9_$]/;
403
420
  function scanForIdentifiers(expr, predicate) {
404
- const n = expr.length;
405
- let i = 0;
406
- let state = 0;
407
- const tmplExprStack = [];
408
- let braceDepth = 0;
409
- while (i < n) {
410
- const ch = expr[i];
411
- switch (state) {
412
- case 0:
413
- case 4: {
414
- if (ch === "'") {
415
- state = 1;
416
- i++;
417
- continue;
418
- }
419
- if (ch === '"') {
420
- state = 2;
421
- i++;
422
- continue;
423
- }
424
- if (ch === "`") {
425
- state = 3;
426
- i++;
427
- continue;
428
- }
429
- if (ch === "/" && i + 1 < n) {
430
- const next = expr[i + 1];
431
- if (next === "/") {
432
- state = 5;
433
- i += 2;
434
- continue;
435
- }
436
- if (next === "*") {
437
- state = 6;
438
- i += 2;
439
- continue;
440
- }
441
- }
442
- if (state === 4) {
443
- if (ch === "{") {
444
- braceDepth++;
445
- i++;
446
- continue;
447
- }
448
- if (ch === "}") {
449
- if (braceDepth === 0) {
450
- const restored = tmplExprStack.pop();
451
- braceDepth = restored ?? 0;
452
- state = 3;
453
- i++;
454
- continue;
455
- }
456
- braceDepth--;
457
- i++;
458
- continue;
459
- }
460
- }
461
- if (IDENT_START_RE.test(ch)) {
462
- let j = i + 1;
463
- while (j < n && IDENT_PART_RE.test(expr[j]))
464
- j++;
465
- const token = expr.slice(i, j);
466
- let prev = i - 1;
467
- while (prev >= 0 && (expr[prev] === " " || expr[prev] === "\t" || expr[prev] === `
468
- ` || expr[prev] === "\r"))
469
- prev--;
470
- const isMemberTail = prev >= 0 && expr[prev] === "." && (prev === 0 || expr[prev - 1] !== ".");
471
- if (!isMemberTail && predicate(token))
472
- return true;
473
- i = j;
474
- continue;
475
- }
476
- i++;
477
- continue;
478
- }
479
- case 1: {
480
- if (ch === "\\" && i + 1 < n) {
481
- i += 2;
482
- continue;
483
- }
484
- if (ch === "'") {
485
- state = 0;
486
- i++;
487
- continue;
488
- }
489
- i++;
490
- continue;
491
- }
492
- case 2: {
493
- if (ch === "\\" && i + 1 < n) {
494
- i += 2;
495
- continue;
496
- }
497
- if (ch === '"') {
498
- state = 0;
499
- i++;
500
- continue;
501
- }
502
- i++;
503
- continue;
504
- }
505
- case 3: {
506
- if (ch === "\\" && i + 1 < n) {
507
- i += 2;
508
- continue;
509
- }
510
- if (ch === "`") {
511
- state = tmplExprStack.length > 0 ? 4 : 0;
512
- i++;
513
- continue;
514
- }
515
- if (ch === "$" && i + 1 < n && expr[i + 1] === "{") {
516
- tmplExprStack.push(braceDepth);
517
- braceDepth = 0;
518
- state = 4;
519
- i += 2;
520
- continue;
521
- }
522
- i++;
523
- continue;
524
- }
525
- case 5: {
526
- if (ch === `
527
- ` || ch === "\r") {
528
- state = 0;
529
- i++;
530
- continue;
531
- }
532
- i++;
533
- continue;
534
- }
535
- case 6: {
536
- if (ch === "*" && i + 1 < n && expr[i + 1] === "/") {
537
- state = 0;
538
- i += 2;
539
- continue;
540
- }
541
- i++;
542
- continue;
543
- }
421
+ let prevSignificant;
422
+ for (const tok of iterateJsTokens(expr)) {
423
+ if (isTriviaKind(tok.kind))
424
+ continue;
425
+ if (isIdentifierLikeToken(tok.kind)) {
426
+ const isMemberTail = prevSignificant === ts2.SyntaxKind.DotToken || prevSignificant === ts2.SyntaxKind.QuestionDotToken;
427
+ if (!isMemberTail && predicate(expr.slice(tok.pos, tok.end)))
428
+ return true;
544
429
  }
430
+ prevSignificant = tok.kind;
545
431
  }
546
432
  return false;
547
433
  }
@@ -5418,6 +5304,8 @@ function convertNode(node, raw) {
5418
5304
  ` + ` (a, b) => a.field - b.field
5419
5305
  ` + ` (a, b) => a.localeCompare(b)
5420
5306
  ` + ` (a, b) => a.field.localeCompare(b.field)
5307
+ ` + ` (a, b) => a.field > b.field ? 1 : -1 (relational ternary)
5308
+ ` + ` any of the above ||-chained for multi-key tie-breaks
5421
5309
  ` + `(reverse the operands for descending order). ` + `Wrap the call in /* @client */ to evaluate at hydration.`
5422
5310
  };
5423
5311
  }
@@ -5577,26 +5465,54 @@ function extractSortComparatorFromTS(node, method) {
5577
5465
  const paramA = pA.name.text;
5578
5466
  const paramB = pB.name.text;
5579
5467
  let body;
5580
- if (ts8.isArrowFunction(node)) {
5581
- if (ts8.isBlock(node.body))
5582
- return null;
5468
+ if (ts8.isArrowFunction(node) && !ts8.isBlock(node.body)) {
5583
5469
  body = node.body;
5584
5470
  } else {
5585
- const stmts = node.body.statements;
5471
+ const block = node.body;
5472
+ const stmts = block.statements;
5586
5473
  if (stmts.length !== 1 || !ts8.isReturnStatement(stmts[0]) || !stmts[0].expression)
5587
5474
  return null;
5588
5475
  body = stmts[0].expression;
5589
5476
  }
5590
5477
  const raw = body.getText();
5478
+ const keys = [];
5479
+ for (const operand of flattenLogicalOr(body)) {
5480
+ const key = classifyLeafComparator(operand, paramA, paramB);
5481
+ if (!key)
5482
+ return null;
5483
+ keys.push(key);
5484
+ }
5485
+ if (keys.length === 0)
5486
+ return null;
5487
+ return { keys, raw, paramA, paramB, method };
5488
+ }
5489
+ function unwrapParens(expr) {
5490
+ let e = expr;
5491
+ while (ts8.isParenthesizedExpression(e))
5492
+ e = e.expression;
5493
+ return e;
5494
+ }
5495
+ function flattenLogicalOr(expr) {
5496
+ const inner = unwrapParens(expr);
5497
+ if (ts8.isBinaryExpression(inner) && inner.operatorToken.kind === ts8.SyntaxKind.BarBarToken) {
5498
+ return [...flattenLogicalOr(inner.left), ...flattenLogicalOr(inner.right)];
5499
+ }
5500
+ return [inner];
5501
+ }
5502
+ function classifyLeafComparator(expr, paramA, paramB) {
5503
+ const body = unwrapParens(expr);
5591
5504
  if (ts8.isBinaryExpression(body) && body.operatorToken.kind === ts8.SyntaxKind.MinusToken) {
5592
- return classifyComparatorOperands(body.left, body.right, paramA, paramB, "numeric", method, raw);
5505
+ return classifyComparatorOperands(body.left, body.right, paramA, paramB, "numeric");
5593
5506
  }
5594
5507
  if (ts8.isCallExpression(body) && ts8.isPropertyAccessExpression(body.expression) && body.expression.name.text === "localeCompare" && body.arguments.length === 1) {
5595
- return classifyComparatorOperands(body.expression.expression, body.arguments[0], paramA, paramB, "string", method, raw);
5508
+ return classifyComparatorOperands(body.expression.expression, body.arguments[0], paramA, paramB, "string");
5509
+ }
5510
+ if (ts8.isConditionalExpression(body)) {
5511
+ return classifyTernaryComparator(body, paramA, paramB);
5596
5512
  }
5597
5513
  return null;
5598
5514
  }
5599
- function classifyComparatorOperands(left, right, paramA, paramB, type, method, raw) {
5515
+ function classifyComparatorOperands(left, right, paramA, paramB, type) {
5600
5516
  const leftRef = classifySortOperand(left, paramA, paramB);
5601
5517
  const rightRef = classifySortOperand(right, paramA, paramB);
5602
5518
  if (!leftRef || !rightRef)
@@ -5609,15 +5525,89 @@ function classifyComparatorOperands(left, right, paramA, paramB, type, method, r
5609
5525
  return null;
5610
5526
  }
5611
5527
  const direction = leftRef.param === "A" ? "asc" : "desc";
5612
- return {
5613
- key: leftRef.key,
5614
- type,
5615
- direction,
5616
- raw,
5617
- paramA,
5618
- paramB,
5619
- method
5620
- };
5528
+ return { key: leftRef.key, type, direction };
5529
+ }
5530
+ function classifyTernaryComparator(node, paramA, paramB) {
5531
+ const cond = unwrapParens(node.condition);
5532
+ if (ts8.isBinaryExpression(cond) && (cond.operatorToken.kind === ts8.SyntaxKind.EqualsEqualsEqualsToken || cond.operatorToken.kind === ts8.SyntaxKind.EqualsEqualsToken) && sameKeyOperands(cond.left, cond.right, paramA, paramB) && numericSign(node.whenTrue) === 0) {
5533
+ const elseBranch = unwrapParens(node.whenFalse);
5534
+ if (ts8.isConditionalExpression(elseBranch)) {
5535
+ return classifyTernaryComparator(elseBranch, paramA, paramB);
5536
+ }
5537
+ return null;
5538
+ }
5539
+ if (!ts8.isBinaryExpression(cond))
5540
+ return null;
5541
+ const op = cond.operatorToken.kind;
5542
+ const isGreater = op === ts8.SyntaxKind.GreaterThanToken || op === ts8.SyntaxKind.GreaterThanEqualsToken;
5543
+ const isLess = op === ts8.SyntaxKind.LessThanToken || op === ts8.SyntaxKind.LessThanEqualsToken;
5544
+ if (!isGreater && !isLess)
5545
+ return null;
5546
+ const leftRef = classifySortOperand(cond.left, paramA, paramB);
5547
+ const rightRef = classifySortOperand(cond.right, paramA, paramB);
5548
+ if (!leftRef || !rightRef)
5549
+ return null;
5550
+ if (leftRef.param === rightRef.param)
5551
+ return null;
5552
+ if (leftRef.key.kind !== rightRef.key.kind)
5553
+ return null;
5554
+ if (leftRef.key.kind === "field" && rightRef.key.kind === "field" && leftRef.key.field !== rightRef.key.field) {
5555
+ return null;
5556
+ }
5557
+ const trueSign = numericSign(node.whenTrue);
5558
+ if (trueSign === null || trueSign === 0)
5559
+ return null;
5560
+ if (!isBoundedTernaryElse(node.whenFalse, leftRef.key, paramA, paramB))
5561
+ return null;
5562
+ const greaterForA = leftRef.param === "A" ? isGreater : !isGreater;
5563
+ const asc = greaterForA ? trueSign > 0 : trueSign < 0;
5564
+ return { key: leftRef.key, type: "auto", direction: asc ? "asc" : "desc" };
5565
+ }
5566
+ function sameKeyOperands(left, right, paramA, paramB) {
5567
+ const l = classifySortOperand(left, paramA, paramB);
5568
+ const r = classifySortOperand(right, paramA, paramB);
5569
+ if (!l || !r)
5570
+ return false;
5571
+ if (l.param === r.param)
5572
+ return false;
5573
+ if (l.key.kind !== r.key.kind)
5574
+ return false;
5575
+ if (l.key.kind === "field" && r.key.kind === "field" && l.key.field !== r.key.field)
5576
+ return false;
5577
+ return true;
5578
+ }
5579
+ function numericSign(expr) {
5580
+ const e = unwrapParens(expr);
5581
+ if (ts8.isPrefixUnaryExpression(e) && e.operator === ts8.SyntaxKind.MinusToken) {
5582
+ const inner = numericSign(e.operand);
5583
+ return inner === null ? null : -inner;
5584
+ }
5585
+ if (ts8.isNumericLiteral(e)) {
5586
+ const n = Number(e.text);
5587
+ if (Number.isNaN(n))
5588
+ return null;
5589
+ if (n === 0)
5590
+ return 0;
5591
+ return n > 0 ? 1 : -1;
5592
+ }
5593
+ return null;
5594
+ }
5595
+ function isBoundedTernaryElse(expr, key, paramA, paramB) {
5596
+ const e = unwrapParens(expr);
5597
+ if (numericSign(e) !== null)
5598
+ return true;
5599
+ if (ts8.isConditionalExpression(e)) {
5600
+ const nested = classifyTernaryComparator(e, paramA, paramB);
5601
+ return nested !== null && sortKeyEquals(nested.key, key);
5602
+ }
5603
+ return false;
5604
+ }
5605
+ function sortKeyEquals(a, b) {
5606
+ if (a.kind !== b.kind)
5607
+ return false;
5608
+ if (a.kind === "field" && b.kind === "field")
5609
+ return a.field === b.field;
5610
+ return true;
5621
5611
  }
5622
5612
  function classifySortOperand(expr, paramA, paramB) {
5623
5613
  if (ts8.isIdentifier(expr)) {
@@ -12691,10 +12681,11 @@ function emitInnerLoopNested(lines, plan) {
12691
12681
  for (const stmt of innerPreludeStatements) {
12692
12682
  lines.push(` ${stmt}`);
12693
12683
  }
12694
- for (const comp of comps) {
12695
- lines.push(` const __compEl = qsaChildScope(__innerEl, ${comp.selector})`);
12696
- lines.push(` if (__compEl) initChild('${nameForRegistryRef(comp.componentName)}', __compEl, ${comp.propsExpr})`);
12697
- }
12684
+ comps.forEach((comp, i) => {
12685
+ const compElVar = comps.length > 1 ? `__compEl${i}` : "__compEl";
12686
+ lines.push(` const ${compElVar} = qsaChildScope(__innerEl, ${comp.selector})`);
12687
+ lines.push(` if (${compElVar}) initChild('${nameForRegistryRef(comp.componentName)}', ${compElVar}, ${comp.propsExpr})`);
12688
+ });
12698
12689
  lines.push(` })`);
12699
12690
  lines.push(` })`);
12700
12691
  lines.push(` }`);
@@ -18365,6 +18356,7 @@ export {
18365
18356
  rewriteImportsForTemplate,
18366
18357
  resolveSetters,
18367
18358
  resetCompilerCounters,
18359
+ renderImportMapHtml,
18368
18360
  parseExpression,
18369
18361
  parseBlockBody,
18370
18362
  needsTypeBasedDetection,