@zzzen/pyright-internal 1.2.0-dev.20260913 → 1.2.0-dev.20260920

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 (74) hide show
  1. package/dist/analyzer/checker.js +2 -3
  2. package/dist/analyzer/checker.js.map +1 -1
  3. package/dist/analyzer/program.js +1 -0
  4. package/dist/analyzer/program.js.map +1 -1
  5. package/dist/analyzer/typeCacheUtils.d.ts +1 -0
  6. package/dist/analyzer/typeCacheUtils.js +28 -1
  7. package/dist/analyzer/typeCacheUtils.js.map +1 -1
  8. package/dist/analyzer/typeEvaluator.d.ts +1 -1
  9. package/dist/analyzer/typeEvaluator.js +7 -10
  10. package/dist/analyzer/typeEvaluator.js.map +1 -1
  11. package/dist/analyzer/typeEvaluatorTypes.d.ts +1 -0
  12. package/dist/analyzer/typedDicts.js +3 -7
  13. package/dist/analyzer/typedDicts.js.map +1 -1
  14. package/dist/analyzer/types.js +7 -0
  15. package/dist/analyzer/types.js.map +1 -1
  16. package/dist/common/configOptions.d.ts +1 -0
  17. package/dist/common/configOptions.js +16 -0
  18. package/dist/common/configOptions.js.map +1 -1
  19. package/dist/common/envVarUtils.js +3 -3
  20. package/dist/common/envVarUtils.js.map +1 -1
  21. package/dist/tests/envVarUtils.test.js +16 -0
  22. package/dist/tests/envVarUtils.test.js.map +1 -1
  23. package/dist/tests/evaluationTrace.integration.test.d.ts +1 -0
  24. package/dist/tests/evaluationTrace.integration.test.js +266 -0
  25. package/dist/tests/evaluationTrace.integration.test.js.map +1 -0
  26. package/dist/tests/evaluationTrace.test.d.ts +1 -0
  27. package/dist/tests/evaluationTrace.test.js +422 -0
  28. package/dist/tests/evaluationTrace.test.js.map +1 -0
  29. package/dist/tests/evaluationTrace.viewer.test.d.ts +1 -0
  30. package/dist/tests/evaluationTrace.viewer.test.js +529 -0
  31. package/dist/tests/evaluationTrace.viewer.test.js.map +1 -0
  32. package/dist/tests/mypyPrimerAnalysis.test.js +1193 -47
  33. package/dist/tests/mypyPrimerAnalysis.test.js.map +1 -1
  34. package/dist/tests/mypyPrimerMcp.test.d.ts +1 -0
  35. package/dist/tests/mypyPrimerMcp.test.js +186 -0
  36. package/dist/tests/mypyPrimerMcp.test.js.map +1 -0
  37. package/dist/tests/typeCacheUtils.test.js +15 -0
  38. package/dist/tests/typeCacheUtils.test.js.map +1 -1
  39. package/dist/tests/typeEvaluator7.test.js +4 -0
  40. package/dist/tests/typeEvaluator7.test.js.map +1 -1
  41. package/dist/trace/capture.d.ts +31 -0
  42. package/dist/trace/capture.js +272 -0
  43. package/dist/trace/capture.js.map +1 -0
  44. package/dist/trace/cli.d.ts +1 -0
  45. package/dist/trace/cli.js +196 -0
  46. package/dist/trace/cli.js.map +1 -0
  47. package/dist/trace/nativeAdapter.d.ts +16 -0
  48. package/dist/trace/nativeAdapter.js +422 -0
  49. package/dist/trace/nativeAdapter.js.map +1 -0
  50. package/dist/trace/nativeBridge.d.ts +46 -0
  51. package/dist/trace/nativeBridge.js +416 -0
  52. package/dist/trace/nativeBridge.js.map +1 -0
  53. package/dist/trace/reader.d.ts +83 -0
  54. package/dist/trace/reader.js +296 -0
  55. package/dist/trace/reader.js.map +1 -0
  56. package/dist/trace/recorder.d.ts +59 -0
  57. package/dist/trace/recorder.js +303 -0
  58. package/dist/trace/recorder.js.map +1 -0
  59. package/dist/trace/runtimeLoader.d.ts +23 -0
  60. package/dist/trace/runtimeLoader.js +172 -0
  61. package/dist/trace/runtimeLoader.js.map +1 -0
  62. package/dist/trace/viewerAssets.d.ts +2 -0
  63. package/dist/trace/viewerAssets.js +76 -0
  64. package/dist/trace/viewerAssets.js.map +1 -0
  65. package/dist/trace/viewerClient.d.ts +1 -0
  66. package/dist/trace/viewerClient.js +485 -0
  67. package/dist/trace/viewerClient.js.map +1 -0
  68. package/dist/trace/viewerModel.d.ts +308 -0
  69. package/dist/trace/viewerModel.js +524 -0
  70. package/dist/trace/viewerModel.js.map +1 -0
  71. package/dist/trace/viewerServer.d.ts +7 -0
  72. package/dist/trace/viewerServer.js +185 -0
  73. package/dist/trace/viewerServer.js.map +1 -0
  74. package/package.json +4 -2
@@ -0,0 +1,296 @@
1
+ "use strict";
2
+ /*
3
+ * reader.ts
4
+ * Copyright (c) Microsoft Corporation.
5
+ * Licensed under the MIT license.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.TraceReader = void 0;
9
+ exports.readTrace = readTrace;
10
+ const recordKinds = new Set([
11
+ 'header',
12
+ 'footer',
13
+ 'entity',
14
+ 'state',
15
+ 'observation',
16
+ 'edge',
17
+ 'program',
18
+ 'enter',
19
+ 'exit',
20
+ 'return',
21
+ 'throw',
22
+ 'branch',
23
+ 'collection-attempt',
24
+ 'collection',
25
+ 'generation',
26
+ 'field-write',
27
+ 'checkpoint',
28
+ 'owner-state',
29
+ 'summary',
30
+ ]);
31
+ function readTrace(text, maxBytes = 128 * 1024 * 1024) {
32
+ if (Buffer.byteLength(text) > maxBytes) {
33
+ throw new Error('Artifact exceeds reader byte limit');
34
+ }
35
+ const records = [];
36
+ for (const line of text.trimEnd().split('\n')) {
37
+ const value = JSON.parse(line);
38
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
39
+ throw new Error('Invalid trace record');
40
+ }
41
+ const record = value;
42
+ if (record.seq !== records.length + 1 ||
43
+ typeof record.kind !== 'string' ||
44
+ !recordKinds.has(record.kind) ||
45
+ !record.data ||
46
+ typeof record.data !== 'object' ||
47
+ Array.isArray(record.data)) {
48
+ throw new Error(`Invalid trace record at sequence ${records.length + 1}`);
49
+ }
50
+ const requiredStrings = {
51
+ entity: ['id', 'category'],
52
+ state: ['entity', 'cause', 'writer'],
53
+ observation: ['entity', 'cause'],
54
+ edge: ['relation', 'from', 'to'],
55
+ enter: ['span', 'label', 'site', 'role'],
56
+ exit: ['span', 'label'],
57
+ return: ['span', 'label'],
58
+ throw: ['span'],
59
+ checkpoint: ['span', 'phase'],
60
+ 'owner-state': ['span', 'phase'],
61
+ };
62
+ if (requiredStrings[record.kind]?.some((key) => typeof record.data[key] !== 'string')) {
63
+ throw new Error(`Invalid ${record.kind} payload at sequence ${record.seq}`);
64
+ }
65
+ if (record.kind === 'state' &&
66
+ (!Number.isSafeInteger(record.data.version) ||
67
+ Number(record.data.version) < 1 ||
68
+ !Array.isArray(record.data.fields) ||
69
+ !record.data.fields.every((field) => Array.isArray(field) && field.length === 2 && typeof field[0] === 'string'))) {
70
+ throw new Error(`Invalid state payload at sequence ${record.seq}`);
71
+ }
72
+ records.push(record);
73
+ }
74
+ const header = records[0];
75
+ if (header?.kind !== 'header' || header.data.schema !== 'pyright-evaluation-trace' || header.data.version !== 1) {
76
+ throw new Error('Unsupported trace schema/version');
77
+ }
78
+ if (records[records.length - 1]?.kind !== 'footer') {
79
+ throw new Error('Incomplete artifact: footer missing (do not interpret as complete capture)');
80
+ }
81
+ if (records.slice(1, -1).some((r) => r.kind === 'header' || r.kind === 'footer')) {
82
+ throw new Error('Multiple runs or misplaced header/footer in artifact');
83
+ }
84
+ return records;
85
+ }
86
+ class TraceReader {
87
+ constructor(records) {
88
+ this.records = records;
89
+ this._histories = new Map();
90
+ this._entries = new Map();
91
+ for (const record of records) {
92
+ if (record.kind === 'enter') {
93
+ this._entries.set(String(record.data.span), record);
94
+ }
95
+ if (record.kind === 'state') {
96
+ const id = String(record.data.entity);
97
+ const history = this._histories.get(id) ?? [];
98
+ history.push(record);
99
+ this._histories.set(id, history);
100
+ }
101
+ }
102
+ }
103
+ timeline(kind, span) {
104
+ const spans = span ? this._descendants(span) : undefined;
105
+ return this.records.filter((r) => (!kind || r.kind === kind) && (!spans || spans.has(String(r.data.span))));
106
+ }
107
+ history(entity, at = Infinity) {
108
+ return (this._histories.get(entity) ?? []).filter((r) => r.seq <= at);
109
+ }
110
+ latest(entity, at = Infinity) {
111
+ const history = this.history(entity, at);
112
+ return history[history.length - 1] ?? null;
113
+ }
114
+ neighborhood(entity, relation) {
115
+ return this.records.filter((r) => r.kind === 'edge' &&
116
+ (r.data.from === entity || r.data.to === entity) &&
117
+ (!relation || r.data.relation === relation));
118
+ }
119
+ pairs() {
120
+ const baselines = new Map();
121
+ const pairs = [];
122
+ for (const r of this.records) {
123
+ if (r.kind !== 'enter' || r.data.label !== '_trial' || !r.data.operation) {
124
+ continue;
125
+ }
126
+ const key = JSON.stringify(r.data.operation);
127
+ if (r.data.role === 'baseline') {
128
+ baselines.set(key, String(r.data.span));
129
+ }
130
+ else if (r.data.role === 'candidate' && baselines.has(key)) {
131
+ pairs.push({ operation: r.data.operation, baseline: baselines.get(key), replay: String(r.data.span) });
132
+ }
133
+ }
134
+ return pairs;
135
+ }
136
+ diff(baseline, replay) {
137
+ for (const span of [baseline, replay]) {
138
+ if (!this.records.some((r) => r.kind === 'enter' && r.data.span === span)) {
139
+ throw new Error(`Unknown evaluation span ${span}`);
140
+ }
141
+ }
142
+ const summarize = (span) => {
143
+ const events = this.timeline(undefined, span);
144
+ const counts = {};
145
+ for (const r of events) {
146
+ const key = `${r.kind}:${r.data.label ?? ''}:${r.data.method ?? ''}`;
147
+ counts[key] = (counts[key] ?? 0) + 1;
148
+ }
149
+ const first = events[0]?.seq;
150
+ const last = events[events.length - 1]?.seq;
151
+ const changes = first === undefined || last === undefined
152
+ ? []
153
+ : this.records.filter((r) => r.kind === 'state' && r.seq >= first && r.seq <= last && r.data.previous !== null);
154
+ return {
155
+ counts,
156
+ boundaries: events.filter((r) => ['checkpoint', 'owner-state', 'throw'].includes(r.kind) ||
157
+ (r.data.span === span && ['enter', 'return', 'exit'].includes(r.kind))),
158
+ firstResult: this.firstResult(span),
159
+ changes,
160
+ };
161
+ };
162
+ const left = summarize(baseline);
163
+ const right = summarize(replay);
164
+ const all = this.timeline(undefined, baseline);
165
+ const after = all[all.length - 1]?.seq ?? 0;
166
+ const beforeReplay = this.timeline(undefined, replay)[0]?.seq ?? 0;
167
+ const changedEntities = [...new Set(left.changes.map((r) => String(r.data.entity)))];
168
+ return {
169
+ baseline: left,
170
+ replay: right,
171
+ boundaryComparisons: this.boundaryComparisons(baseline, replay),
172
+ survivingObservations: changedEntities.map((entity) => ({
173
+ entity,
174
+ afterBaseline: this.latest(entity, after),
175
+ beforeReplay: this.latest(entity, beforeReplay),
176
+ meaning: 'latest observations only; unobserved intervals do not establish persistence',
177
+ })),
178
+ coverage: this.records[this.records.length - 1],
179
+ conclusion: 'Observed differences, not a reuse certificate or universal equivalence',
180
+ };
181
+ }
182
+ boundaryComparisons(baseline, replay) {
183
+ const boundaries = [
184
+ this.checkpoint(baseline, 'entry'),
185
+ this.checkpoint(baseline, 'complete-live'),
186
+ this.checkpoint(baseline, 'unwind'),
187
+ this.checkpoint(replay, 'entry'),
188
+ this.checkpoint(replay, 'complete-live'),
189
+ this.checkpoint(replay, 'unwind'),
190
+ ];
191
+ const observed = boundaries.map((boundary) => {
192
+ const entities = new Map();
193
+ if (boundary) {
194
+ const cause = `${boundary.data.span}:${boundary.data.phase}`;
195
+ for (const record of this.records) {
196
+ if (record.kind === 'observation' && record.data.cause === cause) {
197
+ const entity = String(record.data.entity);
198
+ const state = this._histories.get(entity)?.find((s) => s.data.version === record.data.version);
199
+ if (state) {
200
+ entities.set(entity, { state, observation: record });
201
+ }
202
+ }
203
+ }
204
+ }
205
+ return entities;
206
+ });
207
+ const same = (a, b) => !a || !b
208
+ ? 'unobserved'
209
+ : JSON.stringify(a.data.fields) === JSON.stringify(b.data.fields)
210
+ ? 'same-fields'
211
+ : 'changed-fields';
212
+ const entities = [...new Set(observed.flatMap((map) => [...map.keys()]))];
213
+ return {
214
+ order: [
215
+ 'baseline-entry',
216
+ 'baseline-live',
217
+ 'baseline-unwind',
218
+ 'replay-entry',
219
+ 'replay-live',
220
+ 'replay-unwind',
221
+ ],
222
+ entities: entities.map((entity) => {
223
+ const states = observed.map((map) => map.get(entity)?.state);
224
+ return {
225
+ entity,
226
+ versions: states.map((s) => s?.data.version ?? null),
227
+ // Owner-state snapshots can follow the checkpoint marker. A
228
+ // cell links its actual observation, not the marker or the
229
+ // earlier sequence that first introduced an unchanged version.
230
+ observationSequences: observed.map((map) => map.get(entity)?.observation.seq ?? null),
231
+ stateSequences: states.map((s) => s?.seq ?? null),
232
+ complete: states.map((s) => s?.data.complete ?? false),
233
+ baselineChange: same(states[0], states[1]),
234
+ unwindChange: same(states[1], states[2]),
235
+ betweenTrials: same(states[2], states[3]),
236
+ replayChange: same(states[3], states[4]),
237
+ observedMutationSurvived: same(states[0], states[1]) === 'changed-fields' && same(states[1], states[2]) === 'same-fields',
238
+ };
239
+ }),
240
+ meaning: 'Own fields observed at both boundaries only. Missing/depth-limited children remain unknown.',
241
+ };
242
+ }
243
+ checkpoint(span, phase) {
244
+ const matches = this.timeline('checkpoint', span).filter((r) => r.data.phase === phase && this._belongsToScope(String(r.data.span), span));
245
+ // Missing or ambiguous boundaries are unknown, not a descendant's state.
246
+ return matches.length === 1 ? matches[0] : null;
247
+ }
248
+ firstResult(span) {
249
+ const entry = this._entries.get(span);
250
+ const args = entry?.data.args;
251
+ const expression = JSON.stringify(entry?.data.label === 'getTypeOfExpression' && args && typeof args === 'object' && !Array.isArray(args)
252
+ ? args.node
253
+ : entry?.data.expression);
254
+ const events = this.timeline(undefined, span);
255
+ const call = events.find((r) => r.kind === 'enter' &&
256
+ r.data.label === 'getTypeOfExpression' &&
257
+ this._belongsToScope(String(r.data.span), span) &&
258
+ r.data.args &&
259
+ !Array.isArray(r.data.args) &&
260
+ typeof r.data.args === 'object' &&
261
+ JSON.stringify(r.data.args.node) === expression);
262
+ return events.find((r) => r.kind === 'return' && r.data.span === call?.data.span) ?? null;
263
+ }
264
+ _belongsToScope(candidate, scope) {
265
+ const seen = new Set();
266
+ let current = candidate;
267
+ while (current !== undefined && !seen.has(current)) {
268
+ seen.add(current);
269
+ const entry = this._entries.get(current);
270
+ if (!entry) {
271
+ return false;
272
+ }
273
+ if (current === scope) {
274
+ return true;
275
+ }
276
+ // The nearest trial owns its descendants, even for the same expression
277
+ // or logical role. Ordinary scopes still work without a trial ancestor.
278
+ if (entry.data.label === '_trial') {
279
+ return false;
280
+ }
281
+ current = typeof entry.data.parent === 'string' ? entry.data.parent : undefined;
282
+ }
283
+ return false;
284
+ }
285
+ _descendants(span) {
286
+ const spans = new Set([span]);
287
+ for (const r of this.records) {
288
+ if (r.kind === 'enter' && spans.has(String(r.data.parent))) {
289
+ spans.add(String(r.data.span));
290
+ }
291
+ }
292
+ return spans;
293
+ }
294
+ }
295
+ exports.TraceReader = TraceReader;
296
+ //# sourceMappingURL=reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reader.js","sourceRoot":"","sources":["../../../../../src/trace/reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ export type Json = null | boolean | number | string | Json[] | {
2
+ [key: string]: Json;
3
+ };
4
+ export type Atom = null | boolean | number | string | {
5
+ ref: string;
6
+ } | {
7
+ special: string;
8
+ };
9
+ export interface TraceRecord {
10
+ seq: number;
11
+ kind: string;
12
+ data: {
13
+ [key: string]: Json;
14
+ };
15
+ }
16
+ export interface Limits {
17
+ events: number;
18
+ entities: number;
19
+ bytes: number;
20
+ depth: number;
21
+ properties: number;
22
+ snapshotEntities: number;
23
+ stringLength: number;
24
+ }
25
+ export declare const defaultLimits: Limits;
26
+ export declare function own(value: unknown, key: string): unknown;
27
+ export declare function isObject(value: unknown): value is object;
28
+ export declare class Recorder {
29
+ private readonly _sink;
30
+ readonly run: string;
31
+ readonly limits: Limits;
32
+ private _ids;
33
+ private _states;
34
+ private _nextEntity;
35
+ private _nextOccurrence;
36
+ private _sequence;
37
+ private _bytes;
38
+ private _ended;
39
+ private _exhausted;
40
+ private _gaps;
41
+ private _dropped;
42
+ constructor(_sink: (record: TraceRecord) => void, provenance: {
43
+ [key: string]: Json;
44
+ }, limits?: Partial<Limits>, run?: string);
45
+ get active(): boolean;
46
+ occurrence(): string;
47
+ gap(reason: string): void;
48
+ atom(value: unknown): Atom;
49
+ observe(value: unknown, cause: string, depth?: number): Atom;
50
+ values(values: Record<string, unknown>, cause: string, depth?: number): {
51
+ [key: string]: Json;
52
+ };
53
+ emit(kind: string, data: {
54
+ [key: string]: Json;
55
+ }): void;
56
+ finish(status: 'completed' | 'threw' | 'recorder-failed', error?: string | null): void;
57
+ private _category;
58
+ private _write;
59
+ }
@@ -0,0 +1,303 @@
1
+ "use strict";
2
+ /*
3
+ * recorder.ts
4
+ * Copyright (c) Microsoft Corporation.
5
+ * Licensed under the MIT license.
6
+ *
7
+ * Developer-only, bounded observations. Nothing in the analyzer imports this module.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.Recorder = exports.defaultLimits = void 0;
11
+ exports.own = own;
12
+ exports.isObject = isObject;
13
+ const crypto_1 = require("crypto");
14
+ const util_1 = require("util");
15
+ exports.defaultLimits = {
16
+ events: 200000,
17
+ entities: 50000,
18
+ bytes: 64 * 1024 * 1024,
19
+ depth: 3,
20
+ properties: 80,
21
+ snapshotEntities: 200,
22
+ stringLength: 4096,
23
+ };
24
+ function own(value, key) {
25
+ if (!isObject(value) || util_1.types.isProxy(value)) {
26
+ return undefined;
27
+ }
28
+ return Object.getOwnPropertyDescriptor(value, key)?.value;
29
+ }
30
+ function isObject(value) {
31
+ return (typeof value === 'object' && value !== null) || typeof value === 'function';
32
+ }
33
+ class Recorder {
34
+ constructor(_sink, provenance, limits = {}, run = (0, crypto_1.randomUUID)()) {
35
+ this._sink = _sink;
36
+ this._ids = new WeakMap();
37
+ this._states = new Map();
38
+ this._nextEntity = 0;
39
+ this._nextOccurrence = 0;
40
+ this._sequence = 0;
41
+ this._bytes = 0;
42
+ this._ended = false;
43
+ this._exhausted = false;
44
+ this._gaps = new Set();
45
+ this._dropped = 0;
46
+ this.run = run;
47
+ if (!run || run.length > 128) {
48
+ throw new Error('Run identity must contain 1-128 characters');
49
+ }
50
+ this.limits = { ...exports.defaultLimits, ...limits };
51
+ for (const [name, value] of Object.entries(this.limits)) {
52
+ if (!Number.isSafeInteger(value) || value < 1) {
53
+ throw new Error(`Invalid trace limit ${name}: ${value}`);
54
+ }
55
+ }
56
+ if (this.limits.bytes < 4096) {
57
+ throw new Error('Trace byte limit must leave at least 4096 bytes for metadata and footer');
58
+ }
59
+ if (Buffer.byteLength(JSON.stringify(provenance)) > this.limits.bytes - 3072) {
60
+ this.gap('provenance-byte-budget');
61
+ provenance = { omitted: 'provenance exceeds byte budget' };
62
+ }
63
+ this._write('header', {
64
+ schema: 'pyright-evaluation-trace',
65
+ version: 1,
66
+ run,
67
+ provenance,
68
+ limits: { ...this.limits },
69
+ });
70
+ }
71
+ get active() {
72
+ return !this._ended && !this._exhausted;
73
+ }
74
+ occurrence() {
75
+ return `${this.run}:s${++this._nextOccurrence}`;
76
+ }
77
+ gap(reason) {
78
+ this._gaps.add(this._gaps.size < 16 ? reason.slice(0, 64) : 'additional-coverage-gaps');
79
+ }
80
+ atom(value) {
81
+ if (value === null || typeof value === 'boolean') {
82
+ return value;
83
+ }
84
+ if (typeof value === 'string') {
85
+ if (value.length > this.limits.stringLength) {
86
+ this.gap('stringLength');
87
+ return { special: `truncated-string:${value.slice(0, this.limits.stringLength)}` };
88
+ }
89
+ return value;
90
+ }
91
+ if (typeof value === 'number') {
92
+ return Number.isFinite(value) && !Object.is(value, -0)
93
+ ? value
94
+ : { special: Object.is(value, -0) ? '-0' : String(value) };
95
+ }
96
+ if (!isObject(value)) {
97
+ return { special: typeof value === 'bigint' ? `bigint:${value}` : typeof value };
98
+ }
99
+ let id = this._ids.get(value);
100
+ if (!id) {
101
+ if (this._nextEntity >= this.limits.entities || !this.active) {
102
+ this.gap('entities');
103
+ return { special: 'unobserved-entity' };
104
+ }
105
+ id = `${this.run}:e${++this._nextEntity}`;
106
+ this._ids.set(value, id);
107
+ this.emit('entity', { id, category: this._category(value) });
108
+ }
109
+ return { ref: id };
110
+ }
111
+ // Snapshot versions describe observations, not universal mutation counters. A
112
+ // changed child does not imply that a referencing map or Type was replaced.
113
+ observe(value, cause, depth = this.limits.depth) {
114
+ const root = this.atom(value);
115
+ if (!this.active || !isObject(value)) {
116
+ return root;
117
+ }
118
+ const seen = new Set();
119
+ const visit = (object, remaining) => {
120
+ if (seen.has(object) || !this.active) {
121
+ return;
122
+ }
123
+ if (seen.size >= this.limits.snapshotEntities) {
124
+ this.gap('snapshotEntities');
125
+ return;
126
+ }
127
+ seen.add(object);
128
+ const atom = this.atom(object);
129
+ if (typeof atom !== 'object' || atom === null || !('ref' in atom)) {
130
+ return;
131
+ }
132
+ const fields = [];
133
+ const children = [];
134
+ let complete = true;
135
+ const add = (name, child) => {
136
+ const atom = this.atom(child);
137
+ fields.push([name, atom]);
138
+ if (atom &&
139
+ typeof atom === 'object' &&
140
+ 'special' in atom &&
141
+ (atom.special === 'unobserved-entity' || atom.special.startsWith('truncated-string:'))) {
142
+ complete = false;
143
+ }
144
+ if (isObject(child)) {
145
+ children.push(child);
146
+ }
147
+ };
148
+ if (util_1.types.isProxy(object) || typeof object === 'function') {
149
+ fields.push(['opaque', { special: util_1.types.isProxy(object) ? 'proxy' : 'function' }]);
150
+ complete = false;
151
+ this.gap(util_1.types.isProxy(object) ? 'opaque-proxy' : 'opaque-function');
152
+ }
153
+ else if (util_1.types.isMap(object) || util_1.types.isSet(object)) {
154
+ const entries = util_1.types.isMap(object)
155
+ ? Map.prototype.entries.call(object)
156
+ : Set.prototype.values.call(object);
157
+ let index = 0;
158
+ for (const entry of entries) {
159
+ if (index >= this.limits.properties) {
160
+ complete = false;
161
+ this.gap('properties');
162
+ break;
163
+ }
164
+ if (util_1.types.isMap(object)) {
165
+ const [key, child] = entry;
166
+ add(`key:${index}`, key);
167
+ add(`value:${index}`, child);
168
+ }
169
+ else {
170
+ add(`${index}`, entry);
171
+ }
172
+ index++;
173
+ }
174
+ }
175
+ else if (util_1.types.isWeakMap(object) || util_1.types.isWeakSet(object)) {
176
+ fields.push(['opaque', { special: 'weak-collection' }]);
177
+ complete = false;
178
+ this.gap('opaque-weak-collection');
179
+ }
180
+ else {
181
+ const names = Object.getOwnPropertyNames(object);
182
+ complete = names.length <= this.limits.properties;
183
+ if (!complete) {
184
+ this.gap('properties');
185
+ }
186
+ for (const name of names.slice(0, this.limits.properties)) {
187
+ const descriptor = Object.getOwnPropertyDescriptor(object, name);
188
+ if ('value' in descriptor) {
189
+ add(name, descriptor.value);
190
+ }
191
+ else {
192
+ fields.push([name, { special: 'accessor-not-invoked' }]);
193
+ complete = false;
194
+ this.gap('opaque-accessor');
195
+ }
196
+ }
197
+ if (Object.getOwnPropertySymbols(object).length) {
198
+ complete = false;
199
+ this.gap('symbol-properties');
200
+ }
201
+ }
202
+ const fingerprint = JSON.stringify({ fields, complete });
203
+ const previous = this._states.get(atom.ref);
204
+ if (!previous || previous.fingerprint !== fingerprint) {
205
+ const version = (previous?.version ?? 0) + 1;
206
+ this._states.set(atom.ref, { fingerprint, version });
207
+ this.emit('state', {
208
+ entity: atom.ref,
209
+ version,
210
+ previous: previous?.version ?? null,
211
+ cause,
212
+ writer: 'unknown-between-observations',
213
+ complete,
214
+ fields,
215
+ });
216
+ for (const [field, child] of fields) {
217
+ if (typeof child === 'object' && child !== null && 'ref' in child) {
218
+ this.emit('edge', { relation: 'reference', from: atom.ref, to: child.ref, field, version });
219
+ }
220
+ }
221
+ }
222
+ this.emit('observation', {
223
+ entity: atom.ref,
224
+ version: this._states.get(atom.ref).version,
225
+ cause,
226
+ complete,
227
+ });
228
+ if (remaining > 0) {
229
+ for (const child of children) {
230
+ // Parse-tree links would otherwise swamp type/state observations.
231
+ if (typeof own(child, 'nodeType') !== 'number') {
232
+ visit(child, remaining - 1);
233
+ }
234
+ }
235
+ }
236
+ else if (children.length) {
237
+ this.gap('depth');
238
+ }
239
+ };
240
+ visit(value, depth);
241
+ return root;
242
+ }
243
+ values(values, cause, depth) {
244
+ return Object.fromEntries(Object.entries(values).map(([key, value]) => [key, this.observe(value, cause, depth)]));
245
+ }
246
+ emit(kind, data) {
247
+ if (!this.active) {
248
+ this._dropped++;
249
+ return;
250
+ }
251
+ const size = Buffer.byteLength(JSON.stringify({ seq: this._sequence + 1, kind, data })) + 1;
252
+ if (this._sequence >= this.limits.events || this._bytes + size > this.limits.bytes - 2048) {
253
+ this._exhausted = true;
254
+ this._dropped++;
255
+ this.gap('event-or-byte-budget');
256
+ return;
257
+ }
258
+ this._write(kind, data);
259
+ }
260
+ finish(status, error = null) {
261
+ if (this._ended) {
262
+ throw new Error('Recorder already finished');
263
+ }
264
+ this._ended = true;
265
+ this._write('footer', {
266
+ status,
267
+ error: error?.slice(0, 512) ?? null,
268
+ exhausted: this._exhausted,
269
+ gaps: [...this._gaps],
270
+ dropped: this._dropped,
271
+ entities: this._nextEntity,
272
+ occurrences: this._nextOccurrence,
273
+ coverage: 'observed-domains-only; not proof of no other dependencies or effects',
274
+ });
275
+ this._states.clear();
276
+ this._ids = new WeakMap();
277
+ }
278
+ _category(value) {
279
+ if (util_1.types.isProxy(value)) {
280
+ return 'opaque-proxy';
281
+ }
282
+ if (typeof value === 'function') {
283
+ return 'function';
284
+ }
285
+ if (typeof own(value, 'nodeType') === 'number') {
286
+ return 'parse-node';
287
+ }
288
+ if (typeof own(value, 'category') === 'number' && own(value, 'flags') !== undefined) {
289
+ return 'type';
290
+ }
291
+ if (own(value, 'type') !== undefined) {
292
+ return 'type-bearing-object';
293
+ }
294
+ return util_1.types.isMap(value) ? 'map' : util_1.types.isSet(value) ? 'set' : Array.isArray(value) ? 'array' : 'object';
295
+ }
296
+ _write(kind, data) {
297
+ const record = { seq: ++this._sequence, kind, data };
298
+ this._bytes += Buffer.byteLength(JSON.stringify(record)) + 1;
299
+ this._sink(record);
300
+ }
301
+ }
302
+ exports.Recorder = Recorder;
303
+ //# sourceMappingURL=recorder.js.map