@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.
Files changed (140) hide show
  1. package/dist/compiler.d.ts.map +1 -1
  2. package/dist/debug-profile.d.ts +115 -0
  3. package/dist/debug-profile.d.ts.map +1 -0
  4. package/dist/debug.d.ts +4 -3
  5. package/dist/debug.d.ts.map +1 -1
  6. package/dist/expression-parser.d.ts +31 -0
  7. package/dist/expression-parser.d.ts.map +1 -1
  8. package/dist/index.d.ts +8 -1
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +1905 -207
  11. package/dist/ir-to-client-js/control-flow/plan/branch-loop.d.ts +6 -0
  12. package/dist/ir-to-client-js/control-flow/plan/branch-loop.d.ts.map +1 -1
  13. package/dist/ir-to-client-js/control-flow/plan/build-branch-loop.d.ts +1 -1
  14. package/dist/ir-to-client-js/control-flow/plan/build-branch-loop.d.ts.map +1 -1
  15. package/dist/ir-to-client-js/control-flow/plan/build-component-loop.d.ts +1 -1
  16. package/dist/ir-to-client-js/control-flow/plan/build-component-loop.d.ts.map +1 -1
  17. package/dist/ir-to-client-js/control-flow/plan/build-composite-loop.d.ts +2 -2
  18. package/dist/ir-to-client-js/control-flow/plan/build-composite-loop.d.ts.map +1 -1
  19. package/dist/ir-to-client-js/control-flow/plan/build-event-delegation.d.ts +3 -3
  20. package/dist/ir-to-client-js/control-flow/plan/build-event-delegation.d.ts.map +1 -1
  21. package/dist/ir-to-client-js/control-flow/plan/build-inner-loop.d.ts.map +1 -1
  22. package/dist/ir-to-client-js/control-flow/plan/build-insert.d.ts +2 -0
  23. package/dist/ir-to-client-js/control-flow/plan/build-insert.d.ts.map +1 -1
  24. package/dist/ir-to-client-js/control-flow/plan/build-loop-child-arm.d.ts +2 -0
  25. package/dist/ir-to-client-js/control-flow/plan/build-loop-child-arm.d.ts.map +1 -1
  26. package/dist/ir-to-client-js/control-flow/plan/build-loop.d.ts +4 -2
  27. package/dist/ir-to-client-js/control-flow/plan/build-loop.d.ts.map +1 -1
  28. package/dist/ir-to-client-js/control-flow/plan/build-reactive-effects.d.ts +3 -1
  29. package/dist/ir-to-client-js/control-flow/plan/build-reactive-effects.d.ts.map +1 -1
  30. package/dist/ir-to-client-js/control-flow/plan/event-delegation.d.ts +7 -0
  31. package/dist/ir-to-client-js/control-flow/plan/event-delegation.d.ts.map +1 -1
  32. package/dist/ir-to-client-js/control-flow/plan/inner-loop.d.ts +7 -0
  33. package/dist/ir-to-client-js/control-flow/plan/inner-loop.d.ts.map +1 -1
  34. package/dist/ir-to-client-js/control-flow/plan/insert.d.ts +8 -0
  35. package/dist/ir-to-client-js/control-flow/plan/insert.d.ts.map +1 -1
  36. package/dist/ir-to-client-js/control-flow/plan/loop-child-arm.d.ts +8 -0
  37. package/dist/ir-to-client-js/control-flow/plan/loop-child-arm.d.ts.map +1 -1
  38. package/dist/ir-to-client-js/control-flow/plan/loop.d.ts +28 -0
  39. package/dist/ir-to-client-js/control-flow/plan/loop.d.ts.map +1 -1
  40. package/dist/ir-to-client-js/control-flow/plan/reactive-effects.d.ts +7 -0
  41. package/dist/ir-to-client-js/control-flow/plan/reactive-effects.d.ts.map +1 -1
  42. package/dist/ir-to-client-js/control-flow/stringify/component-loop.d.ts.map +1 -1
  43. package/dist/ir-to-client-js/control-flow/stringify/composite-loop.d.ts.map +1 -1
  44. package/dist/ir-to-client-js/control-flow/stringify/event-delegation.d.ts.map +1 -1
  45. package/dist/ir-to-client-js/control-flow/stringify/event-listener.d.ts +1 -1
  46. package/dist/ir-to-client-js/control-flow/stringify/event-listener.d.ts.map +1 -1
  47. package/dist/ir-to-client-js/control-flow/stringify/inner-loop.d.ts +1 -1
  48. package/dist/ir-to-client-js/control-flow/stringify/inner-loop.d.ts.map +1 -1
  49. package/dist/ir-to-client-js/control-flow/stringify/insert.d.ts.map +1 -1
  50. package/dist/ir-to-client-js/control-flow/stringify/loop-child-arm.d.ts +2 -2
  51. package/dist/ir-to-client-js/control-flow/stringify/loop-child-arm.d.ts.map +1 -1
  52. package/dist/ir-to-client-js/control-flow/stringify/loop.d.ts.map +1 -1
  53. package/dist/ir-to-client-js/control-flow/stringify/reactive-effects.d.ts.map +1 -1
  54. package/dist/ir-to-client-js/control-flow.d.ts.map +1 -1
  55. package/dist/ir-to-client-js/emit-reactive.d.ts.map +1 -1
  56. package/dist/ir-to-client-js/imports.d.ts +2 -2
  57. package/dist/ir-to-client-js/imports.d.ts.map +1 -1
  58. package/dist/ir-to-client-js/index.d.ts +2 -2
  59. package/dist/ir-to-client-js/index.d.ts.map +1 -1
  60. package/dist/ir-to-client-js/phases/effects-and-on-mounts.d.ts.map +1 -1
  61. package/dist/ir-to-client-js/phases/event-handlers.d.ts.map +1 -1
  62. package/dist/ir-to-client-js/plan/build-declaration-emit.d.ts.map +1 -1
  63. package/dist/ir-to-client-js/plan/declaration-emit.d.ts +6 -0
  64. package/dist/ir-to-client-js/plan/declaration-emit.d.ts.map +1 -1
  65. package/dist/ir-to-client-js/types.d.ts +5 -0
  66. package/dist/ir-to-client-js/types.d.ts.map +1 -1
  67. package/dist/ir-to-client-js/utils.d.ts +29 -0
  68. package/dist/ir-to-client-js/utils.d.ts.map +1 -1
  69. package/dist/loop-destructure.d.ts +26 -0
  70. package/dist/loop-destructure.d.ts.map +1 -0
  71. package/dist/profiler.d.ts +492 -0
  72. package/dist/profiler.d.ts.map +1 -0
  73. package/dist/ssr-defaults.d.ts.map +1 -1
  74. package/dist/types.d.ts +8 -0
  75. package/dist/types.d.ts.map +1 -1
  76. package/package.json +2 -2
  77. package/src/__tests__/debug-profile.test.ts +405 -0
  78. package/src/__tests__/expression-parser.test.ts +44 -1
  79. package/src/__tests__/profile-bfid-emission.test.ts +63 -0
  80. package/src/__tests__/profile-binding-ids.test.ts +123 -0
  81. package/src/__tests__/profile-cond-binding-ids.test.ts +80 -0
  82. package/src/__tests__/profile-loop-binding-ids.test.ts +106 -0
  83. package/src/__tests__/profile-nested-binding-ids.test.ts +153 -0
  84. package/src/__tests__/profile-turn-markers-branch.test.ts +83 -0
  85. package/src/__tests__/profile-turn-markers-delegation.test.ts +63 -0
  86. package/src/__tests__/profile-turn-markers.test.ts +54 -0
  87. package/src/__tests__/profiler-batch-advisor.test.ts +198 -0
  88. package/src/__tests__/profiler-coverage-conformance.test.ts +360 -0
  89. package/src/__tests__/profiler-e2e.test.ts +104 -0
  90. package/src/__tests__/profiler-hot-subscribers.test.ts +263 -0
  91. package/src/__tests__/profiler-wasted-re-runs.test.ts +147 -0
  92. package/src/__tests__/profiler.test.ts +408 -0
  93. package/src/__tests__/ssr-defaults.test.ts +24 -0
  94. package/src/compiler.ts +3 -0
  95. package/src/debug-profile.ts +543 -0
  96. package/src/debug.ts +192 -28
  97. package/src/expression-parser.ts +53 -0
  98. package/src/index.ts +72 -1
  99. package/src/ir-to-client-js/control-flow/plan/branch-loop.ts +6 -0
  100. package/src/ir-to-client-js/control-flow/plan/build-branch-loop.ts +5 -3
  101. package/src/ir-to-client-js/control-flow/plan/build-component-loop.ts +3 -1
  102. package/src/ir-to-client-js/control-flow/plan/build-composite-loop.ts +8 -2
  103. package/src/ir-to-client-js/control-flow/plan/build-event-delegation.ts +19 -3
  104. package/src/ir-to-client-js/control-flow/plan/build-inner-loop.ts +2 -0
  105. package/src/ir-to-client-js/control-flow/plan/build-insert.ts +9 -2
  106. package/src/ir-to-client-js/control-flow/plan/build-loop-child-arm.ts +9 -1
  107. package/src/ir-to-client-js/control-flow/plan/build-loop.ts +12 -8
  108. package/src/ir-to-client-js/control-flow/plan/build-reactive-effects.ts +10 -4
  109. package/src/ir-to-client-js/control-flow/plan/event-delegation.ts +7 -0
  110. package/src/ir-to-client-js/control-flow/plan/inner-loop.ts +7 -0
  111. package/src/ir-to-client-js/control-flow/plan/insert.ts +8 -0
  112. package/src/ir-to-client-js/control-flow/plan/loop-child-arm.ts +8 -0
  113. package/src/ir-to-client-js/control-flow/plan/loop.ts +28 -0
  114. package/src/ir-to-client-js/control-flow/plan/reactive-effects.ts +7 -0
  115. package/src/ir-to-client-js/control-flow/stringify/branch-loop.ts +5 -3
  116. package/src/ir-to-client-js/control-flow/stringify/component-loop.ts +4 -2
  117. package/src/ir-to-client-js/control-flow/stringify/composite-loop.ts +6 -3
  118. package/src/ir-to-client-js/control-flow/stringify/event-delegation.ts +14 -2
  119. package/src/ir-to-client-js/control-flow/stringify/event-listener.ts +5 -2
  120. package/src/ir-to-client-js/control-flow/stringify/inner-loop.ts +13 -11
  121. package/src/ir-to-client-js/control-flow/stringify/insert.ts +19 -7
  122. package/src/ir-to-client-js/control-flow/stringify/loop-child-arm.ts +18 -13
  123. package/src/ir-to-client-js/control-flow/stringify/loop.ts +9 -7
  124. package/src/ir-to-client-js/control-flow/stringify/reactive-effects.ts +18 -14
  125. package/src/ir-to-client-js/control-flow.ts +12 -6
  126. package/src/ir-to-client-js/emit-reactive.ts +18 -5
  127. package/src/ir-to-client-js/imports.ts +2 -0
  128. package/src/ir-to-client-js/index.ts +6 -1
  129. package/src/ir-to-client-js/phases/effects-and-on-mounts.ts +10 -4
  130. package/src/ir-to-client-js/phases/event-handlers.ts +6 -2
  131. package/src/ir-to-client-js/plan/build-declaration-emit.ts +7 -1
  132. package/src/ir-to-client-js/plan/declaration-emit.ts +6 -0
  133. package/src/ir-to-client-js/stringify/declaration-emit.ts +12 -6
  134. package/src/ir-to-client-js/types.ts +5 -0
  135. package/src/ir-to-client-js/utils.ts +37 -0
  136. package/src/jsx-to-ir.ts +2 -2
  137. package/src/loop-destructure.ts +170 -0
  138. package/src/profiler.ts +1488 -0
  139. package/src/ssr-defaults.ts +65 -0
  140. package/src/types.ts +8 -0
@@ -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 {