@barefootjs/jsx 0.13.0 → 0.14.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/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -0
- package/dist/profiler.d.ts +37 -0
- package/dist/profiler.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/profiler.test.ts +69 -0
- package/src/index.ts +2 -0
- package/src/profiler.ts +63 -0
package/dist/index.d.ts
CHANGED
|
@@ -177,8 +177,8 @@ export { isLowerableObjectRestDestructure } from './loop-destructure.ts';
|
|
|
177
177
|
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.ts';
|
|
178
178
|
export type { ComponentGraph, ComponentAnalysis, SignalNode, MemoNode, EffectNode, DomBinding, UpdatePath, SignalTrace, EventBinding, SetterRef, FnSetterResolution, EventSummary, LoopInfo, LoopChildBinding, LoopSummary, WhyUpdateResult, WhyUpdateDep, WhyUpdateSource, FallbackExplanation, ComponentSummary } from './debug.ts';
|
|
179
179
|
export type { WrapReason } from './ir-to-client-js/reactivity.ts';
|
|
180
|
-
export { buildStaticBudget, formatStaticBudget, diffStaticBudget, formatBudgetDiff, buildProfileReport, formatProfileReport, buildIdIndex, joinProfilerEvents, parseProfilerId, analyzeHotSubscribers, formatHotSubscribers, findUninstrumentedEffects, analyzeWastedReReruns, formatWastedReReruns, analyzeBatchAdvisor, formatBatchAdvisor, } from './profiler.ts';
|
|
181
|
-
export type { StaticBudget, StaticBudgetOptions, FanOutEntry, BudgetDiff, FanOutChange, ProfileReport, ProfileReportInput, ProfileCoverage, DiagnosticsSummary, EffectCandidate, IdIndex, ResolvedNode, JoinResult, JoinedEvent, UnattributedId, HotSubscribersResult, HotSubscriber, HotSubscribersOptions, WastedReRunsResult, WastedSubscriber, WastedReRunsOptions, BatchAdvisorResult, BatchCandidate, BatchSafety, } from './profiler.ts';
|
|
180
|
+
export { PROFILE_SCHEMA_VERSION, buildStaticBudget, formatStaticBudget, diffStaticBudget, formatBudgetDiff, buildProfileReport, formatProfileReport, buildIdIndex, joinProfilerEvents, parseProfilerId, analyzeHotSubscribers, formatHotSubscribers, findUninstrumentedEffects, analyzeWastedReReruns, formatWastedReReruns, analyzeBatchAdvisor, formatBatchAdvisor, } from './profiler.ts';
|
|
181
|
+
export type { StaticBudget, StaticBudgetOptions, FanOutEntry, BudgetHandler, BudgetDiff, FanOutChange, ProfileReport, ProfileReportInput, ProfileCoverage, DiagnosticsSummary, EffectCandidate, IdIndex, ResolvedNode, JoinResult, JoinedEvent, UnattributedId, HotSubscribersResult, HotSubscriber, HotSubscribersOptions, WastedReRunsResult, WastedSubscriber, WastedReRunsOptions, BatchAdvisorResult, BatchCandidate, BatchSafety, } from './profiler.ts';
|
|
182
182
|
export { buildReactiveProfile, buildProfileFromGraph, diffProfiles, formatSingleProfile, formatProfileTable, formatProfileDiff, profileToJSON, } from './debug-profile.ts';
|
|
183
183
|
export type { ComponentProfile, ComponentProfileMetrics, ProfileFinding, ProfileDiff, ProfileDiffEntry, } from './debug-profile.ts';
|
|
184
184
|
export { BOOLEAN_ATTRS, isBooleanAttr } from './html-constants.ts';
|
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":"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"}
|
package/dist/index.js
CHANGED
|
@@ -19836,6 +19836,7 @@ function findSourceFile2(meta) {
|
|
|
19836
19836
|
}
|
|
19837
19837
|
// src/profiler.ts
|
|
19838
19838
|
import ts20 from "typescript";
|
|
19839
|
+
var PROFILE_SCHEMA_VERSION = 1;
|
|
19839
19840
|
var DEFAULT_FANOUT_THRESHOLD = 8;
|
|
19840
19841
|
function buildStaticBudget(source, filePath, componentName, options = {}) {
|
|
19841
19842
|
const threshold = options.fanOutThreshold ?? DEFAULT_FANOUT_THRESHOLD;
|
|
@@ -19847,11 +19848,18 @@ function buildStaticBudget(source, filePath, componentName, options = {}) {
|
|
|
19847
19848
|
const { direct, total } = subscriberCounts(graph, s.name);
|
|
19848
19849
|
return { signal: s.name, subscribers: total, direct, hot: direct >= threshold, loc: s.loc };
|
|
19849
19850
|
}).sort((a, b) => b.subscribers - a.subscribers);
|
|
19851
|
+
const handlers = graph.domBindings.filter((b) => b.type === "event").flatMap((b) => {
|
|
19852
|
+
if (!b.loc)
|
|
19853
|
+
return [];
|
|
19854
|
+
const eventName = b.label.match(/^(\w+)\s+handler/)?.[1] ?? "event";
|
|
19855
|
+
return [{ name: `${eventName}@${b.slotId}`, loc: { file: b.loc.file, line: b.loc.start.line } }];
|
|
19856
|
+
});
|
|
19850
19857
|
const { depth, chain } = longestMemoChain(graph);
|
|
19851
19858
|
const hasReactiveState = graph.signals.length > 0 || graph.memos.length > 0;
|
|
19852
19859
|
const observedInComponent = graph.signals.some((s) => transitiveSubscriberCount(graph, s.name) > 0) || graph.memos.some((m) => transitiveSubscriberCount(graph, m.name) > 0);
|
|
19853
19860
|
const crossComponentOnly = hasReactiveState && !observedInComponent;
|
|
19854
19861
|
return {
|
|
19862
|
+
schemaVersion: PROFILE_SCHEMA_VERSION,
|
|
19855
19863
|
componentName: summary.componentName,
|
|
19856
19864
|
sourceFile: summary.sourceFile,
|
|
19857
19865
|
kind: "static-budget",
|
|
@@ -19863,6 +19871,7 @@ function buildStaticBudget(source, filePath, componentName, options = {}) {
|
|
|
19863
19871
|
memoChainDepth: depth,
|
|
19864
19872
|
memoChainLongest: chain,
|
|
19865
19873
|
fanOut,
|
|
19874
|
+
handlers,
|
|
19866
19875
|
crossComponentOnly
|
|
19867
19876
|
};
|
|
19868
19877
|
}
|
|
@@ -19939,6 +19948,13 @@ function formatStaticBudget(b) {
|
|
|
19939
19948
|
lines.push(` ${f.signal.padEnd(12)} → ${f.subscribers} subscribers${detail}${f.hot ? " ⚠ high" : ""}`);
|
|
19940
19949
|
}
|
|
19941
19950
|
}
|
|
19951
|
+
if (b.handlers.length > 0) {
|
|
19952
|
+
lines.push(` handlers (${b.handlers.length}):`);
|
|
19953
|
+
for (const h of b.handlers) {
|
|
19954
|
+
const file = h.loc.file.split("/").pop() ?? h.loc.file;
|
|
19955
|
+
lines.push(` ${h.name.padEnd(16)} ${file}:${h.loc.line}`);
|
|
19956
|
+
}
|
|
19957
|
+
}
|
|
19942
19958
|
if (b.crossComponentOnly) {
|
|
19943
19959
|
lines.push(` ⓘ compound: ${b.signals} signal(s) / ${b.memos} memo(s) but 0 in-component subscriptions —`);
|
|
19944
19960
|
lines.push(" consumers are likely in composed child components (or it is read only from handlers);");
|
|
@@ -19962,6 +19978,7 @@ function diffStaticBudget(base, head) {
|
|
|
19962
19978
|
fanOut.sort((a, b) => b.after - b.before - (a.after - a.before));
|
|
19963
19979
|
const d = {
|
|
19964
19980
|
kind: "diff",
|
|
19981
|
+
schemaVersion: PROFILE_SCHEMA_VERSION,
|
|
19965
19982
|
componentName: head.componentName,
|
|
19966
19983
|
signals: head.signals - base.signals,
|
|
19967
19984
|
memos: head.memos - base.memos,
|
|
@@ -20531,6 +20548,7 @@ function buildProfileReport(input) {
|
|
|
20531
20548
|
}
|
|
20532
20549
|
return {
|
|
20533
20550
|
kind: "profile",
|
|
20551
|
+
schemaVersion: PROFILE_SCHEMA_VERSION,
|
|
20534
20552
|
componentName: primary.componentName,
|
|
20535
20553
|
sourceFile: primary.sourceFile,
|
|
20536
20554
|
scenario,
|
|
@@ -21231,6 +21249,7 @@ export {
|
|
|
21231
21249
|
TestAdapter,
|
|
21232
21250
|
SourceMapGenerator,
|
|
21233
21251
|
REACTIVE_PRIMITIVES,
|
|
21252
|
+
PROFILE_SCHEMA_VERSION,
|
|
21234
21253
|
JsxAdapter,
|
|
21235
21254
|
ErrorCodes,
|
|
21236
21255
|
BaseAdapter,
|
package/dist/profiler.d.ts
CHANGED
|
@@ -20,6 +20,29 @@
|
|
|
20
20
|
*/
|
|
21
21
|
import { type ComponentGraph } from './debug.ts';
|
|
22
22
|
import type { ProfilerEvent } from '@barefootjs/shared';
|
|
23
|
+
/**
|
|
24
|
+
* Schema version for the machine-readable `bf debug profile --json` output
|
|
25
|
+
* (#1841). Bumped when the shape of `StaticBudget` / `ProfileReport` /
|
|
26
|
+
* `BudgetDiff` changes in a way a consumer must notice. An agent can branch on
|
|
27
|
+
* this before trusting any other field — the contract is "same major version =
|
|
28
|
+
* additive only".
|
|
29
|
+
*/
|
|
30
|
+
export declare const PROFILE_SCHEMA_VERSION = 1;
|
|
31
|
+
/** An event handler the IR knows about — the unit `--scenario auto` fires. */
|
|
32
|
+
export interface BudgetHandler {
|
|
33
|
+
/**
|
|
34
|
+
* `<eventName>@<slotId>` (e.g. `click@s1`). The slotId is the stable join
|
|
35
|
+
* key: it is the element marker `--scenario auto` dispatches against and the
|
|
36
|
+
* id the coverage report counts, so an agent can map a handler listed here to
|
|
37
|
+
* its dynamic coverage without running first.
|
|
38
|
+
*/
|
|
39
|
+
name: string;
|
|
40
|
+
/** Source location of the handler binding (1-indexed line). */
|
|
41
|
+
loc: {
|
|
42
|
+
file: string;
|
|
43
|
+
line: number;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
23
46
|
export interface FanOutEntry {
|
|
24
47
|
/** Signal name (the reactive source whose change fans out). */
|
|
25
48
|
signal: string;
|
|
@@ -43,6 +66,8 @@ export interface FanOutEntry {
|
|
|
43
66
|
};
|
|
44
67
|
}
|
|
45
68
|
export interface StaticBudget {
|
|
69
|
+
/** Machine-readable output contract version (#1841). See `PROFILE_SCHEMA_VERSION`. */
|
|
70
|
+
schemaVersion: number;
|
|
46
71
|
componentName: string;
|
|
47
72
|
sourceFile: string;
|
|
48
73
|
kind: 'static-budget';
|
|
@@ -58,6 +83,14 @@ export interface StaticBudget {
|
|
|
58
83
|
memoChainLongest: string[];
|
|
59
84
|
/** Per-signal fan-out, descending, hottest first. */
|
|
60
85
|
fanOut: FanOutEntry[];
|
|
86
|
+
/**
|
|
87
|
+
* Event handlers the IR knows about — the exact set `--scenario auto` would
|
|
88
|
+
* fire — as name + source location (#1841). Exposed statically so an agent
|
|
89
|
+
* can predict the coverage gap and reference handler names *before* any run.
|
|
90
|
+
* Empty when this component binds no handlers (they may live in composed
|
|
91
|
+
* children — see `crossComponentOnly`).
|
|
92
|
+
*/
|
|
93
|
+
handlers: BudgetHandler[];
|
|
61
94
|
/**
|
|
62
95
|
* True when the component declares reactive state (signals/memos) but nothing
|
|
63
96
|
* in *this* component subscribes to it — every consumer is in a composed child
|
|
@@ -93,6 +126,8 @@ export interface BudgetDiff {
|
|
|
93
126
|
* component with no reactive state (#1849 B2).
|
|
94
127
|
*/
|
|
95
128
|
kind: 'diff';
|
|
129
|
+
/** Machine-readable output contract version (#1841). See `PROFILE_SCHEMA_VERSION`. */
|
|
130
|
+
schemaVersion: number;
|
|
96
131
|
componentName: string;
|
|
97
132
|
signals: number;
|
|
98
133
|
memos: number;
|
|
@@ -452,6 +487,8 @@ export interface ProfileCoverage {
|
|
|
452
487
|
}
|
|
453
488
|
export interface ProfileReport {
|
|
454
489
|
kind: 'profile';
|
|
490
|
+
/** Machine-readable output contract version (#1841). See `PROFILE_SCHEMA_VERSION`. */
|
|
491
|
+
schemaVersion: number;
|
|
455
492
|
componentName: string;
|
|
456
493
|
sourceFile: string;
|
|
457
494
|
/** Scenario label (e.g. `'auto'` or a scenario file name). */
|
package/dist/profiler.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profiler.d.ts","sourceRoot":"","sources":["../src/profiler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,EAKL,KAAK,cAAc,EAGpB,MAAM,YAAY,CAAA;AAEnB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"profiler.d.ts","sourceRoot":"","sources":["../src/profiler.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@barefootjs/jsx",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.0",
|
|
4
4
|
"description": "JSX compiler for BarefootJS - transforms JSX to server HTML + client JS",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"directory": "packages/jsx"
|
|
54
54
|
},
|
|
55
55
|
"dependencies": {
|
|
56
|
-
"@barefootjs/shared": "0.
|
|
56
|
+
"@barefootjs/shared": "0.14.0"
|
|
57
57
|
},
|
|
58
58
|
"peerDependencies": {
|
|
59
59
|
"@barefootjs/client": ">=0.2.0",
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
import { describe, test, expect } from 'bun:test'
|
|
11
11
|
import {
|
|
12
|
+
PROFILE_SCHEMA_VERSION,
|
|
12
13
|
buildStaticBudget,
|
|
13
14
|
diffStaticBudget,
|
|
14
15
|
formatStaticBudget,
|
|
@@ -179,6 +180,73 @@ describe('buildStaticBudget (SR5)', () => {
|
|
|
179
180
|
expect(b.subscriptions).toBe(0)
|
|
180
181
|
expect(b.crossComponentOnly).toBe(false)
|
|
181
182
|
})
|
|
183
|
+
|
|
184
|
+
test('exposes the handlers --scenario auto would fire, name + loc (#1841 A1)', () => {
|
|
185
|
+
// Two handlers on distinct elements/events. The static list is the coverage
|
|
186
|
+
// gap an agent can read before any run.
|
|
187
|
+
const src = `
|
|
188
|
+
'use client'
|
|
189
|
+
import { createSignal } from '@barefootjs/client'
|
|
190
|
+
export function Form() {
|
|
191
|
+
const [q, setQ] = createSignal('')
|
|
192
|
+
return (
|
|
193
|
+
<div>
|
|
194
|
+
<input onInput={(e) => setQ(e.currentTarget.value)} />
|
|
195
|
+
<button onClick={() => setQ('')}>Clear</button>
|
|
196
|
+
</div>
|
|
197
|
+
)
|
|
198
|
+
}
|
|
199
|
+
`
|
|
200
|
+
const b = buildStaticBudget(src, 'Form.tsx', 'Form')
|
|
201
|
+
expect(b.handlers.length).toBe(2)
|
|
202
|
+
// `name` is `<event>@<slotId>` — the slotId joins to dynamic coverage.
|
|
203
|
+
expect(b.handlers.every(h => /^\w+@\w+$/.test(h.name))).toBe(true)
|
|
204
|
+
const events = b.handlers.map(h => h.name.split('@')[0]).sort()
|
|
205
|
+
expect(events).toEqual(['click', 'input'])
|
|
206
|
+
// Each handler carries a source location.
|
|
207
|
+
for (const h of b.handlers) {
|
|
208
|
+
expect(h.loc.file).toContain('Form.tsx')
|
|
209
|
+
expect(h.loc.line).toBeGreaterThan(0)
|
|
210
|
+
}
|
|
211
|
+
})
|
|
212
|
+
|
|
213
|
+
test('handlers is empty when the component binds none', () => {
|
|
214
|
+
const src = `
|
|
215
|
+
'use client'
|
|
216
|
+
import { createSignal } from '@barefootjs/client'
|
|
217
|
+
export function Display() {
|
|
218
|
+
const [n] = createSignal(0)
|
|
219
|
+
return <div>{n()}</div>
|
|
220
|
+
}
|
|
221
|
+
`
|
|
222
|
+
const b = buildStaticBudget(src, 'Display.tsx', 'Display')
|
|
223
|
+
expect(b.handlers).toEqual([])
|
|
224
|
+
})
|
|
225
|
+
|
|
226
|
+
test('renders a handlers section in text output when present, omits it otherwise', () => {
|
|
227
|
+
const withHandler = formatStaticBudget(buildStaticBudget(counterSource, 'Counter.tsx', 'Counter'))
|
|
228
|
+
expect(withHandler).toMatch(/handlers \(1\):/)
|
|
229
|
+
expect(withHandler).toMatch(/click@\w+\s+Counter\.tsx:\d+/)
|
|
230
|
+
|
|
231
|
+
const noHandler = `
|
|
232
|
+
'use client'
|
|
233
|
+
import { createSignal } from '@barefootjs/client'
|
|
234
|
+
export function Display() {
|
|
235
|
+
const [n] = createSignal(0)
|
|
236
|
+
return <div>{n()}</div>
|
|
237
|
+
}
|
|
238
|
+
`
|
|
239
|
+
expect(formatStaticBudget(buildStaticBudget(noHandler, 'Display.tsx', 'Display'))).not.toContain('handlers (')
|
|
240
|
+
})
|
|
241
|
+
})
|
|
242
|
+
|
|
243
|
+
describe('schemaVersion (#1841)', () => {
|
|
244
|
+
test('every JSON mode carries the schema version', () => {
|
|
245
|
+
const budget = buildStaticBudget(counterSource, 'Counter.tsx', 'Counter')
|
|
246
|
+
expect(budget.schemaVersion).toBe(PROFILE_SCHEMA_VERSION)
|
|
247
|
+
const diff = diffStaticBudget(budget, buildStaticBudget(memoChainSource, 'Calc.tsx', 'Calc'))
|
|
248
|
+
expect(diff.schemaVersion).toBe(PROFILE_SCHEMA_VERSION)
|
|
249
|
+
})
|
|
182
250
|
})
|
|
183
251
|
|
|
184
252
|
describe('diffStaticBudget (SR6)', () => {
|
|
@@ -345,6 +413,7 @@ describe('buildProfileReport (dynamic, SR1–SR4 + analyses)', () => {
|
|
|
345
413
|
]
|
|
346
414
|
const r = buildProfileReport({ source: src, filePath: 'Calc.tsx', scenario: 'auto', events })
|
|
347
415
|
expect(r.kind).toBe('profile')
|
|
416
|
+
expect(r.schemaVersion).toBe(PROFILE_SCHEMA_VERSION)
|
|
348
417
|
expect(r.componentName).toBe('Calc')
|
|
349
418
|
expect(r.turns).toBe(1)
|
|
350
419
|
expect(r.hotSubscribers.subscribers[0].name).toBe('a')
|
package/src/index.ts
CHANGED
|
@@ -285,6 +285,7 @@ export type { WrapReason } from './ir-to-client-js/reactivity.ts'
|
|
|
285
285
|
// Reactive performance profiler (#1690). Static half (SR5 budget, SR6 diff) +
|
|
286
286
|
// dynamic half (SR2/SR4 join, SR7 report, v1 analyses).
|
|
287
287
|
export {
|
|
288
|
+
PROFILE_SCHEMA_VERSION,
|
|
288
289
|
buildStaticBudget,
|
|
289
290
|
formatStaticBudget,
|
|
290
291
|
diffStaticBudget,
|
|
@@ -306,6 +307,7 @@ export type {
|
|
|
306
307
|
StaticBudget,
|
|
307
308
|
StaticBudgetOptions,
|
|
308
309
|
FanOutEntry,
|
|
310
|
+
BudgetHandler,
|
|
309
311
|
BudgetDiff,
|
|
310
312
|
FanOutChange,
|
|
311
313
|
ProfileReport,
|
package/src/profiler.ts
CHANGED
|
@@ -32,8 +32,30 @@ import {
|
|
|
32
32
|
import { listComponentFunctions, createProgramForFile } from './analyzer.ts'
|
|
33
33
|
import type { ProfilerEvent } from '@barefootjs/shared'
|
|
34
34
|
|
|
35
|
+
/**
|
|
36
|
+
* Schema version for the machine-readable `bf debug profile --json` output
|
|
37
|
+
* (#1841). Bumped when the shape of `StaticBudget` / `ProfileReport` /
|
|
38
|
+
* `BudgetDiff` changes in a way a consumer must notice. An agent can branch on
|
|
39
|
+
* this before trusting any other field — the contract is "same major version =
|
|
40
|
+
* additive only".
|
|
41
|
+
*/
|
|
42
|
+
export const PROFILE_SCHEMA_VERSION = 1
|
|
43
|
+
|
|
35
44
|
// -- Static budget (SR5) ------------------------------------------------------
|
|
36
45
|
|
|
46
|
+
/** An event handler the IR knows about — the unit `--scenario auto` fires. */
|
|
47
|
+
export interface BudgetHandler {
|
|
48
|
+
/**
|
|
49
|
+
* `<eventName>@<slotId>` (e.g. `click@s1`). The slotId is the stable join
|
|
50
|
+
* key: it is the element marker `--scenario auto` dispatches against and the
|
|
51
|
+
* id the coverage report counts, so an agent can map a handler listed here to
|
|
52
|
+
* its dynamic coverage without running first.
|
|
53
|
+
*/
|
|
54
|
+
name: string
|
|
55
|
+
/** Source location of the handler binding (1-indexed line). */
|
|
56
|
+
loc: { file: string; line: number }
|
|
57
|
+
}
|
|
58
|
+
|
|
37
59
|
export interface FanOutEntry {
|
|
38
60
|
/** Signal name (the reactive source whose change fans out). */
|
|
39
61
|
signal: string
|
|
@@ -55,6 +77,8 @@ export interface FanOutEntry {
|
|
|
55
77
|
}
|
|
56
78
|
|
|
57
79
|
export interface StaticBudget {
|
|
80
|
+
/** Machine-readable output contract version (#1841). See `PROFILE_SCHEMA_VERSION`. */
|
|
81
|
+
schemaVersion: number
|
|
58
82
|
componentName: string
|
|
59
83
|
sourceFile: string
|
|
60
84
|
kind: 'static-budget'
|
|
@@ -70,6 +94,14 @@ export interface StaticBudget {
|
|
|
70
94
|
memoChainLongest: string[]
|
|
71
95
|
/** Per-signal fan-out, descending, hottest first. */
|
|
72
96
|
fanOut: FanOutEntry[]
|
|
97
|
+
/**
|
|
98
|
+
* Event handlers the IR knows about — the exact set `--scenario auto` would
|
|
99
|
+
* fire — as name + source location (#1841). Exposed statically so an agent
|
|
100
|
+
* can predict the coverage gap and reference handler names *before* any run.
|
|
101
|
+
* Empty when this component binds no handlers (they may live in composed
|
|
102
|
+
* children — see `crossComponentOnly`).
|
|
103
|
+
*/
|
|
104
|
+
handlers: BudgetHandler[]
|
|
73
105
|
/**
|
|
74
106
|
* True when the component declares reactive state (signals/memos) but nothing
|
|
75
107
|
* in *this* component subscribes to it — every consumer is in a composed child
|
|
@@ -124,6 +156,22 @@ export function buildStaticBudget(
|
|
|
124
156
|
})
|
|
125
157
|
.sort((a, b) => b.subscribers - a.subscribers)
|
|
126
158
|
|
|
159
|
+
// Event handlers, in source order — the same `graph.domBindings` event slots
|
|
160
|
+
// the auto scenario fires (scenario-driver discovers handlers from here), so
|
|
161
|
+
// the static list and the dynamic coverage share one identity (slotId).
|
|
162
|
+
const handlers: BudgetHandler[] = graph.domBindings
|
|
163
|
+
.filter(b => b.type === 'event')
|
|
164
|
+
// Event bindings always carry `loc` (IREvent.loc is required), and coverage's
|
|
165
|
+
// turn→binding join keys on it too — so skip any loc-less binding rather than
|
|
166
|
+
// emit an invalid (line 0) location that a consumer would have to special-case.
|
|
167
|
+
.flatMap(b => {
|
|
168
|
+
if (!b.loc) return []
|
|
169
|
+
// Label is `<event> handler "<slot>"` — the same parse the scenario driver
|
|
170
|
+
// and coverage join use. Fall back to a neutral `event` if it ever drifts.
|
|
171
|
+
const eventName = b.label.match(/^(\w+)\s+handler/)?.[1] ?? 'event'
|
|
172
|
+
return [{ name: `${eventName}@${b.slotId}`, loc: { file: b.loc.file, line: b.loc.start.line } }]
|
|
173
|
+
})
|
|
174
|
+
|
|
127
175
|
const { depth, chain } = longestMemoChain(graph)
|
|
128
176
|
|
|
129
177
|
// Reactive state exists, yet nothing in *this* component observes it. The
|
|
@@ -141,6 +189,7 @@ export function buildStaticBudget(
|
|
|
141
189
|
const crossComponentOnly = hasReactiveState && !observedInComponent
|
|
142
190
|
|
|
143
191
|
return {
|
|
192
|
+
schemaVersion: PROFILE_SCHEMA_VERSION,
|
|
144
193
|
componentName: summary.componentName,
|
|
145
194
|
sourceFile: summary.sourceFile,
|
|
146
195
|
kind: 'static-budget',
|
|
@@ -152,6 +201,7 @@ export function buildStaticBudget(
|
|
|
152
201
|
memoChainDepth: depth,
|
|
153
202
|
memoChainLongest: chain,
|
|
154
203
|
fanOut,
|
|
204
|
+
handlers,
|
|
155
205
|
crossComponentOnly,
|
|
156
206
|
}
|
|
157
207
|
}
|
|
@@ -254,6 +304,13 @@ export function formatStaticBudget(b: StaticBudget): string {
|
|
|
254
304
|
lines.push(` ${f.signal.padEnd(12)} → ${f.subscribers} subscribers${detail}${f.hot ? ' ⚠ high' : ''}`)
|
|
255
305
|
}
|
|
256
306
|
}
|
|
307
|
+
if (b.handlers.length > 0) {
|
|
308
|
+
lines.push(` handlers (${b.handlers.length}):`)
|
|
309
|
+
for (const h of b.handlers) {
|
|
310
|
+
const file = h.loc.file.split('/').pop() ?? h.loc.file
|
|
311
|
+
lines.push(` ${h.name.padEnd(16)} ${file}:${h.loc.line}`)
|
|
312
|
+
}
|
|
313
|
+
}
|
|
257
314
|
if (b.crossComponentOnly) {
|
|
258
315
|
lines.push(
|
|
259
316
|
` ⓘ compound: ${b.signals} signal(s) / ${b.memos} memo(s) but 0 in-component subscriptions —`,
|
|
@@ -281,6 +338,8 @@ export interface BudgetDiff {
|
|
|
281
338
|
* component with no reactive state (#1849 B2).
|
|
282
339
|
*/
|
|
283
340
|
kind: 'diff'
|
|
341
|
+
/** Machine-readable output contract version (#1841). See `PROFILE_SCHEMA_VERSION`. */
|
|
342
|
+
schemaVersion: number
|
|
284
343
|
componentName: string
|
|
285
344
|
signals: number
|
|
286
345
|
memos: number
|
|
@@ -318,6 +377,7 @@ export function diffStaticBudget(base: StaticBudget, head: StaticBudget): Budget
|
|
|
318
377
|
|
|
319
378
|
const d: Omit<BudgetDiff, 'regressed'> = {
|
|
320
379
|
kind: 'diff',
|
|
380
|
+
schemaVersion: PROFILE_SCHEMA_VERSION,
|
|
321
381
|
componentName: head.componentName,
|
|
322
382
|
signals: head.signals - base.signals,
|
|
323
383
|
memos: head.memos - base.memos,
|
|
@@ -1312,6 +1372,8 @@ export interface ProfileCoverage {
|
|
|
1312
1372
|
|
|
1313
1373
|
export interface ProfileReport {
|
|
1314
1374
|
kind: 'profile'
|
|
1375
|
+
/** Machine-readable output contract version (#1841). See `PROFILE_SCHEMA_VERSION`. */
|
|
1376
|
+
schemaVersion: number
|
|
1315
1377
|
componentName: string
|
|
1316
1378
|
sourceFile: string
|
|
1317
1379
|
/** Scenario label (e.g. `'auto'` or a scenario file name). */
|
|
@@ -1464,6 +1526,7 @@ export function buildProfileReport(input: ProfileReportInput): ProfileReport {
|
|
|
1464
1526
|
|
|
1465
1527
|
return {
|
|
1466
1528
|
kind: 'profile',
|
|
1529
|
+
schemaVersion: PROFILE_SCHEMA_VERSION,
|
|
1467
1530
|
componentName: primary.componentName,
|
|
1468
1531
|
sourceFile: primary.sourceFile,
|
|
1469
1532
|
scenario,
|