@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.
- package/dist/adapters/interface.d.ts +20 -0
- package/dist/adapters/interface.d.ts.map +1 -1
- package/dist/expression-parser.d.ts +36 -19
- package/dist/expression-parser.d.ts.map +1 -1
- package/dist/import-map.d.ts +56 -0
- package/dist/import-map.d.ts.map +1 -0
- package/dist/import-map.js +18 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +154 -162
- package/dist/ir-to-client-js/utils.d.ts.map +1 -1
- package/dist/scanner/js-scanner.d.ts +10 -0
- package/dist/scanner/js-scanner.d.ts.map +1 -1
- package/dist/scanner/js-scanner.js +5 -0
- package/package.json +7 -3
- package/src/__tests__/__snapshots__/doc-examples.test.ts.snap +134 -8
- package/src/__tests__/child-components-in-map.test.ts +76 -0
- package/src/__tests__/import-map.test.ts +75 -0
- package/src/__tests__/ir-sort-comparator.test.ts +212 -9
- package/src/__tests__/token-contains-ident.test.ts +27 -0
- package/src/__tests__/unsupported-expression.test.ts +42 -13
- package/src/adapters/interface.ts +20 -0
- package/src/expression-parser.ts +265 -50
- package/src/import-map.ts +72 -0
- package/src/index.ts +5 -1
- package/src/ir-to-client-js/stringify/static-array-child-init.ts +8 -4
- package/src/ir-to-client-js/utils.ts +29 -115
- package/src/scanner/js-scanner.ts +16 -1
|
@@ -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
|
-
*
|
|
78
|
-
*
|
|
79
|
-
* (
|
|
80
|
-
*
|
|
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
|
|
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
|
-
*
|
|
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
|
-
*
|
|
144
|
-
*
|
|
145
|
-
* (
|
|
146
|
-
* (
|
|
147
|
-
*
|
|
148
|
-
*
|
|
149
|
-
*
|
|
150
|
-
*
|
|
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
|
-
*
|
|
153
|
-
*
|
|
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":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,YAAY,CAAA;AAM3B,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAA;CAAE,GACnH;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,UAAU,EAAE,CAAA;CAAE,GACxD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GAC3E;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GACnE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,UAAU,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,UAAU,CAAA;CAAE,GACxF;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,EAAE,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GAChF;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,YAAY,EAAE,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,eAAe,CAAC;IAAC,MAAM,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,UAAU,CAAA;CAAE,GAC7K;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,UAAU,EAAE,CAAA;CAAE,GAOjD;IACE,IAAI,EAAE,cAAc,CAAA;IACpB,MAAM,EACF,MAAM,GACN,UAAU,GACV,SAAS,GACT,aAAa,GACb,IAAI,GACJ,QAAQ,GACR,OAAO,GACP,SAAS,GACT,YAAY,GACZ,aAAa,GACb,aAAa,GACb,MAAM,CAAA;IACV,MAAM,EAAE,UAAU,CAAA;IAClB,IAAI,EAAE,UAAU,EAAE,CAAA;CACnB,GAWD;IACE,IAAI,EAAE,cAAc,CAAA;IACpB,MAAM,EAAE,MAAM,GAAG,UAAU,CAAA;IAC3B,MAAM,EAAE,UAAU,CAAA;IAClB,IAAI,EAAE,EAAE,CAAA;IACR,UAAU,EAAE,cAAc,CAAA;CAC3B,GACD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAExD
|
|
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, "&").replace(/"/g, """).replace(/</g, "<");
|
|
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';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AACtD,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,yBAAyB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAGtG,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACnD,YAAY,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAGhD,YAAY,EACV,WAAW,EACX,MAAM,EACN,SAAS,EACT,MAAM,EACN,YAAY,EACZ,aAAa,EACb,MAAM,EACN,oBAAoB,EACpB,WAAW,EACX,UAAU,EACV,MAAM,EACN,aAAa,EACb,UAAU,EACV,OAAO,EACP,UAAU,EACV,SAAS,EACT,WAAW,EACX,cAAc,EACd,WAAW,EACX,oBAAoB,EACpB,YAAY,EACZ,UAAU,EACV,eAAe,EACf,cAAc,EACd,MAAM,EACN,SAAS,EACT,QAAQ,EACR,cAAc,EACd,aAAa,GACd,MAAM,SAAS,CAAA;AAGhB,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,sBAAsB,IAAI,sBAAsB,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAA;AAC3O,OAAO,EAAE,sBAAsB,EAAE,KAAK,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAGpF,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAGrC,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAGxH,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,YAAY,EACV,eAAe,EACf,aAAa,EACb,sBAAsB,EACtB,gBAAgB,EAChB,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAA;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAC/D,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAA;AAChI,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAC7D,YAAY,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAGrE,OAAO,EAAE,gBAAgB,EAAE,6BAA6B,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACvG,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAGvD,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AACvF,YAAY,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAG/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAA;AAGhE,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAGxE,MAAM,WAAW,YAAY;IAC3B,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAA;IACjB,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAA;IAChB,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,qDAAqD;IACrD,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC1B,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAA;IACd,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAA;IAClB,qBAAqB;IACrB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAA;IAC9G;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;CACzB;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,YAAY,GACpB,IAAI,GACJ;IAAE,KAAK,CAAC,EAAE,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GACvD;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAEtC;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAA;IACb,+DAA+D;IAC/D,OAAO,EAAE,MAAM,CAAA;IACf,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CACrB;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAA;IAClB,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAA;IACd,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,KAAK,CAAC,EAAE,aAAa,CAAA;IACrB,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,8BAA8B;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,qCAAqC;IACrC,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,uEAAuE;IACvE,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAC3D;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACxC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,WAAW,EAAE,CAAA;IAC7B;;;;;;;OAOG;IACH,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAA;CAC/B;AAGD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAGrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAG1D,OAAO,EACL,6BAA6B,EAC7B,8BAA8B,EAC9B,qBAAqB,EACrB,mBAAmB,EACnB,KAAK,gBAAgB,GACtB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAGlF,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,mBAAmB,EAAE,cAAc,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAC1J,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,cAAc,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAC1I,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAGnD,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,0BAA0B,EAC1B,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,WAAW,EACX,cAAc,EACd,2BAA2B,EAC3B,eAAe,GAChB,MAAM,SAAS,CAAA;AAChB,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,kBAAkB,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAClU,YAAY,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AAG9D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAG/D,YAAY,EAEV,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAGlB,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAGlB,mBAAmB,EACnB,kBAAkB,EAGlB,wBAAwB,EACxB,uBAAuB,EACvB,yBAAyB,EAGzB,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,cAAc,CAAA"}
|
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, "&").replace(/"/g, """).replace(/</g, "<");
|
|
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
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
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
|
|
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"
|
|
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"
|
|
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
|
|
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
|
-
|
|
5614
|
-
|
|
5615
|
-
|
|
5616
|
-
|
|
5617
|
-
|
|
5618
|
-
|
|
5619
|
-
|
|
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
|
-
|
|
12695
|
-
|
|
12696
|
-
lines.push(`
|
|
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,
|