@barefootjs/jsx 0.10.0 → 0.11.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/compiler.d.ts.map +1 -1
- package/dist/debug-profile.d.ts +115 -0
- package/dist/debug-profile.d.ts.map +1 -0
- package/dist/debug.d.ts +4 -3
- package/dist/debug.d.ts.map +1 -1
- package/dist/expression-parser.d.ts +31 -0
- package/dist/expression-parser.d.ts.map +1 -1
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1905 -207
- package/dist/ir-to-client-js/control-flow/plan/branch-loop.d.ts +6 -0
- package/dist/ir-to-client-js/control-flow/plan/branch-loop.d.ts.map +1 -1
- package/dist/ir-to-client-js/control-flow/plan/build-branch-loop.d.ts +1 -1
- package/dist/ir-to-client-js/control-flow/plan/build-branch-loop.d.ts.map +1 -1
- package/dist/ir-to-client-js/control-flow/plan/build-component-loop.d.ts +1 -1
- package/dist/ir-to-client-js/control-flow/plan/build-component-loop.d.ts.map +1 -1
- package/dist/ir-to-client-js/control-flow/plan/build-composite-loop.d.ts +2 -2
- package/dist/ir-to-client-js/control-flow/plan/build-composite-loop.d.ts.map +1 -1
- package/dist/ir-to-client-js/control-flow/plan/build-event-delegation.d.ts +3 -3
- package/dist/ir-to-client-js/control-flow/plan/build-event-delegation.d.ts.map +1 -1
- package/dist/ir-to-client-js/control-flow/plan/build-inner-loop.d.ts.map +1 -1
- package/dist/ir-to-client-js/control-flow/plan/build-insert.d.ts +2 -0
- package/dist/ir-to-client-js/control-flow/plan/build-insert.d.ts.map +1 -1
- package/dist/ir-to-client-js/control-flow/plan/build-loop-child-arm.d.ts +2 -0
- package/dist/ir-to-client-js/control-flow/plan/build-loop-child-arm.d.ts.map +1 -1
- package/dist/ir-to-client-js/control-flow/plan/build-loop.d.ts +4 -2
- package/dist/ir-to-client-js/control-flow/plan/build-loop.d.ts.map +1 -1
- package/dist/ir-to-client-js/control-flow/plan/build-reactive-effects.d.ts +3 -1
- package/dist/ir-to-client-js/control-flow/plan/build-reactive-effects.d.ts.map +1 -1
- package/dist/ir-to-client-js/control-flow/plan/event-delegation.d.ts +7 -0
- package/dist/ir-to-client-js/control-flow/plan/event-delegation.d.ts.map +1 -1
- package/dist/ir-to-client-js/control-flow/plan/inner-loop.d.ts +7 -0
- package/dist/ir-to-client-js/control-flow/plan/inner-loop.d.ts.map +1 -1
- package/dist/ir-to-client-js/control-flow/plan/insert.d.ts +8 -0
- package/dist/ir-to-client-js/control-flow/plan/insert.d.ts.map +1 -1
- package/dist/ir-to-client-js/control-flow/plan/loop-child-arm.d.ts +8 -0
- package/dist/ir-to-client-js/control-flow/plan/loop-child-arm.d.ts.map +1 -1
- package/dist/ir-to-client-js/control-flow/plan/loop.d.ts +28 -0
- package/dist/ir-to-client-js/control-flow/plan/loop.d.ts.map +1 -1
- package/dist/ir-to-client-js/control-flow/plan/reactive-effects.d.ts +7 -0
- package/dist/ir-to-client-js/control-flow/plan/reactive-effects.d.ts.map +1 -1
- package/dist/ir-to-client-js/control-flow/stringify/component-loop.d.ts.map +1 -1
- package/dist/ir-to-client-js/control-flow/stringify/composite-loop.d.ts.map +1 -1
- package/dist/ir-to-client-js/control-flow/stringify/event-delegation.d.ts.map +1 -1
- package/dist/ir-to-client-js/control-flow/stringify/event-listener.d.ts +1 -1
- package/dist/ir-to-client-js/control-flow/stringify/event-listener.d.ts.map +1 -1
- package/dist/ir-to-client-js/control-flow/stringify/inner-loop.d.ts +1 -1
- package/dist/ir-to-client-js/control-flow/stringify/inner-loop.d.ts.map +1 -1
- package/dist/ir-to-client-js/control-flow/stringify/insert.d.ts.map +1 -1
- package/dist/ir-to-client-js/control-flow/stringify/loop-child-arm.d.ts +2 -2
- package/dist/ir-to-client-js/control-flow/stringify/loop-child-arm.d.ts.map +1 -1
- package/dist/ir-to-client-js/control-flow/stringify/loop.d.ts.map +1 -1
- package/dist/ir-to-client-js/control-flow/stringify/reactive-effects.d.ts.map +1 -1
- package/dist/ir-to-client-js/control-flow.d.ts.map +1 -1
- package/dist/ir-to-client-js/emit-reactive.d.ts.map +1 -1
- package/dist/ir-to-client-js/imports.d.ts +2 -2
- package/dist/ir-to-client-js/imports.d.ts.map +1 -1
- package/dist/ir-to-client-js/index.d.ts +2 -2
- package/dist/ir-to-client-js/index.d.ts.map +1 -1
- package/dist/ir-to-client-js/phases/effects-and-on-mounts.d.ts.map +1 -1
- package/dist/ir-to-client-js/phases/event-handlers.d.ts.map +1 -1
- package/dist/ir-to-client-js/plan/build-declaration-emit.d.ts.map +1 -1
- package/dist/ir-to-client-js/plan/declaration-emit.d.ts +6 -0
- package/dist/ir-to-client-js/plan/declaration-emit.d.ts.map +1 -1
- package/dist/ir-to-client-js/types.d.ts +5 -0
- package/dist/ir-to-client-js/types.d.ts.map +1 -1
- package/dist/ir-to-client-js/utils.d.ts +29 -0
- package/dist/ir-to-client-js/utils.d.ts.map +1 -1
- package/dist/loop-destructure.d.ts +26 -0
- package/dist/loop-destructure.d.ts.map +1 -0
- package/dist/profiler.d.ts +492 -0
- package/dist/profiler.d.ts.map +1 -0
- package/dist/ssr-defaults.d.ts.map +1 -1
- package/dist/types.d.ts +8 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/debug-profile.test.ts +405 -0
- package/src/__tests__/expression-parser.test.ts +44 -1
- package/src/__tests__/profile-bfid-emission.test.ts +63 -0
- package/src/__tests__/profile-binding-ids.test.ts +123 -0
- package/src/__tests__/profile-cond-binding-ids.test.ts +80 -0
- package/src/__tests__/profile-loop-binding-ids.test.ts +106 -0
- package/src/__tests__/profile-nested-binding-ids.test.ts +153 -0
- package/src/__tests__/profile-turn-markers-branch.test.ts +83 -0
- package/src/__tests__/profile-turn-markers-delegation.test.ts +63 -0
- package/src/__tests__/profile-turn-markers.test.ts +54 -0
- package/src/__tests__/profiler-batch-advisor.test.ts +198 -0
- package/src/__tests__/profiler-coverage-conformance.test.ts +360 -0
- package/src/__tests__/profiler-e2e.test.ts +104 -0
- package/src/__tests__/profiler-hot-subscribers.test.ts +263 -0
- package/src/__tests__/profiler-wasted-re-runs.test.ts +147 -0
- package/src/__tests__/profiler.test.ts +408 -0
- package/src/__tests__/ssr-defaults.test.ts +24 -0
- package/src/compiler.ts +3 -0
- package/src/debug-profile.ts +543 -0
- package/src/debug.ts +192 -28
- package/src/expression-parser.ts +53 -0
- package/src/index.ts +72 -1
- package/src/ir-to-client-js/control-flow/plan/branch-loop.ts +6 -0
- package/src/ir-to-client-js/control-flow/plan/build-branch-loop.ts +5 -3
- package/src/ir-to-client-js/control-flow/plan/build-component-loop.ts +3 -1
- package/src/ir-to-client-js/control-flow/plan/build-composite-loop.ts +8 -2
- package/src/ir-to-client-js/control-flow/plan/build-event-delegation.ts +19 -3
- package/src/ir-to-client-js/control-flow/plan/build-inner-loop.ts +2 -0
- package/src/ir-to-client-js/control-flow/plan/build-insert.ts +9 -2
- package/src/ir-to-client-js/control-flow/plan/build-loop-child-arm.ts +9 -1
- package/src/ir-to-client-js/control-flow/plan/build-loop.ts +12 -8
- package/src/ir-to-client-js/control-flow/plan/build-reactive-effects.ts +10 -4
- package/src/ir-to-client-js/control-flow/plan/event-delegation.ts +7 -0
- package/src/ir-to-client-js/control-flow/plan/inner-loop.ts +7 -0
- package/src/ir-to-client-js/control-flow/plan/insert.ts +8 -0
- package/src/ir-to-client-js/control-flow/plan/loop-child-arm.ts +8 -0
- package/src/ir-to-client-js/control-flow/plan/loop.ts +28 -0
- package/src/ir-to-client-js/control-flow/plan/reactive-effects.ts +7 -0
- package/src/ir-to-client-js/control-flow/stringify/branch-loop.ts +5 -3
- package/src/ir-to-client-js/control-flow/stringify/component-loop.ts +4 -2
- package/src/ir-to-client-js/control-flow/stringify/composite-loop.ts +6 -3
- package/src/ir-to-client-js/control-flow/stringify/event-delegation.ts +14 -2
- package/src/ir-to-client-js/control-flow/stringify/event-listener.ts +5 -2
- package/src/ir-to-client-js/control-flow/stringify/inner-loop.ts +13 -11
- package/src/ir-to-client-js/control-flow/stringify/insert.ts +19 -7
- package/src/ir-to-client-js/control-flow/stringify/loop-child-arm.ts +18 -13
- package/src/ir-to-client-js/control-flow/stringify/loop.ts +9 -7
- package/src/ir-to-client-js/control-flow/stringify/reactive-effects.ts +18 -14
- package/src/ir-to-client-js/control-flow.ts +12 -6
- package/src/ir-to-client-js/emit-reactive.ts +18 -5
- package/src/ir-to-client-js/imports.ts +2 -0
- package/src/ir-to-client-js/index.ts +6 -1
- package/src/ir-to-client-js/phases/effects-and-on-mounts.ts +10 -4
- package/src/ir-to-client-js/phases/event-handlers.ts +6 -2
- package/src/ir-to-client-js/plan/build-declaration-emit.ts +7 -1
- package/src/ir-to-client-js/plan/declaration-emit.ts +6 -0
- package/src/ir-to-client-js/stringify/declaration-emit.ts +12 -6
- package/src/ir-to-client-js/types.ts +5 -0
- package/src/ir-to-client-js/utils.ts +37 -0
- package/src/jsx-to-ir.ts +2 -2
- package/src/loop-destructure.ts +170 -0
- package/src/profiler.ts +1488 -0
- package/src/ssr-defaults.ts +65 -0
- package/src/types.ts +8 -0
package/src/ssr-defaults.ts
CHANGED
|
@@ -149,9 +149,74 @@ export function extractSsrDefaults(metadata: IRMetadata): Record<string, SsrDefa
|
|
|
149
149
|
bindings[memo.name] = value
|
|
150
150
|
}
|
|
151
151
|
|
|
152
|
+
// Bare-props-arg form (`function Foo(props: Props)`): a signal / memo
|
|
153
|
+
// whose initializer reads `props.X` is lowered by template-stash
|
|
154
|
+
// adapters to a *bare scalar* recompute (`my $count = ($initial // 0)`,
|
|
155
|
+
// the #1297 prop-derived seeding) — not a `$props->{X}` hash read. That
|
|
156
|
+
// bare `$initial` has to exist in the stash or Perl's strict mode aborts
|
|
157
|
+
// the render with `Global symbol "$initial" requires explicit package
|
|
158
|
+
// name`. The top block skips bare-props props on the assumption they're
|
|
159
|
+
// only ever read via `$props->{X}`, which the prop-derived seeding
|
|
160
|
+
// violates — so seed every prop a signal / memo initializer references.
|
|
161
|
+
// Value is `null` (→ undef): the recompute's own `?? <literal>` supplies
|
|
162
|
+
// the real fallback, and a caller-passed prop still wins via `propName`.
|
|
163
|
+
if (metadata.propsObjectName !== null) {
|
|
164
|
+
const referenced = new Set<string>()
|
|
165
|
+
for (const sig of metadata.signals) {
|
|
166
|
+
if (!sig.getter || sig.isModule) continue
|
|
167
|
+
collectPropRefs(sig.initialValue, metadata.propsObjectName, referenced)
|
|
168
|
+
}
|
|
169
|
+
for (const memo of metadata.memos) {
|
|
170
|
+
if (memo.isModule) continue
|
|
171
|
+
collectPropRefs(memo.computation, metadata.propsObjectName, referenced)
|
|
172
|
+
}
|
|
173
|
+
for (const name of referenced) {
|
|
174
|
+
// Don't clobber a signal / memo (or already-seeded prop) of the same
|
|
175
|
+
// name — those carry a resolved value the recompute relies on.
|
|
176
|
+
if (name in out) continue
|
|
177
|
+
out[name] = { propName: name, value: null }
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
152
181
|
return Object.keys(out).length === 0 ? undefined : out
|
|
153
182
|
}
|
|
154
183
|
|
|
184
|
+
/**
|
|
185
|
+
* Collect the first-level property name of every `propsObjectName.X` access
|
|
186
|
+
* within `expr` (e.g. `props.initial ?? 0` → `initial`). Used to seed the
|
|
187
|
+
* stash vars a template-stash adapter's bare-scalar signal/memo recompute
|
|
188
|
+
* references. A deeper chain (`props.a.b`) still contributes its *base*
|
|
189
|
+
* prop `a`: adapters lower that to `$a->{b}`, so the bare `$a` needs
|
|
190
|
+
* seeding just the same — the walk stops at the first
|
|
191
|
+
* `propsObjectName.<name>` match and collects `a` (not `b`).
|
|
192
|
+
*/
|
|
193
|
+
function collectPropRefs(
|
|
194
|
+
expr: string | undefined,
|
|
195
|
+
propsObjectName: string,
|
|
196
|
+
out: Set<string>,
|
|
197
|
+
): void {
|
|
198
|
+
if (!expr || !expr.trim()) return
|
|
199
|
+
const node = parseExpression(expr)
|
|
200
|
+
if (!node) return
|
|
201
|
+
const visit = (n: ts.Node): void => {
|
|
202
|
+
if (
|
|
203
|
+
ts.isPropertyAccessExpression(n) &&
|
|
204
|
+
ts.isIdentifier(n.expression) &&
|
|
205
|
+
n.expression.text === propsObjectName &&
|
|
206
|
+
ts.isIdentifier(n.name)
|
|
207
|
+
) {
|
|
208
|
+
// `propsObjectName.<name>` — collect <name> and stop. For a deeper
|
|
209
|
+
// chain (`props.a.b`) this node is the inner `props.a`, so we collect
|
|
210
|
+
// the base prop `a` (which lowers to `$a->{b}`); the outer `.b`
|
|
211
|
+
// access has no further `props.` reference to find.
|
|
212
|
+
out.add(n.name.text)
|
|
213
|
+
return
|
|
214
|
+
}
|
|
215
|
+
ts.forEachChild(n, visit)
|
|
216
|
+
}
|
|
217
|
+
visit(node)
|
|
218
|
+
}
|
|
219
|
+
|
|
155
220
|
function resultToJsonable(v: EvalResult): unknown {
|
|
156
221
|
if (v === UNRESOLVED) return null
|
|
157
222
|
if (v === undefined) return null
|
package/src/types.ts
CHANGED
|
@@ -1570,6 +1570,14 @@ export interface CompileOptions {
|
|
|
1570
1570
|
* starting with `.`.
|
|
1571
1571
|
*/
|
|
1572
1572
|
rewriteRelativeImport?: (importPath: string) => string
|
|
1573
|
+
/**
|
|
1574
|
+
* Profile mode (#1690, SR3). When true, the client-JS codegen emits
|
|
1575
|
+
* IR-aligned `__bfId` arguments at reactive creation sites
|
|
1576
|
+
* (`createSignal`/`createMemo`/`createEffect`) so a profiling run can join
|
|
1577
|
+
* runtime events to IR nodes. Off by default — the emitted code is then
|
|
1578
|
+
* byte-for-byte unchanged (SR8). Dev/profiling builds only.
|
|
1579
|
+
*/
|
|
1580
|
+
profile?: boolean
|
|
1573
1581
|
}
|
|
1574
1582
|
|
|
1575
1583
|
export interface FileOutput {
|