@happyvertical/smrt-scanner 0.51.32 → 0.51.33

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.
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Numeric-precision lint for money and rate fields (#2361).
3
+ *
4
+ * SMRT infers a `number` field's column type from the *initializer literal*:
5
+ * `= 0` compiles to INTEGER and `= 0.0` compiles to DECIMAL
6
+ * (`manifest-adapter.ts`, inference steps 3 and 3.5). The rule is silent, and
7
+ * SQLite's type affinity happily stores a REAL in an INTEGER column — so a
8
+ * mistyped field passes every SQLite suite and then behaves differently in
9
+ * production on PostgreSQL.
10
+ *
11
+ * Two vocabularies, opposite answers:
12
+ *
13
+ * - **Money is exact**, so it is stored as *integer minor units* — cents,
14
+ * satoshis. `$19.99` is `1999`. A money field declared `= 0.0` becomes a
15
+ * float column, which reintroduces binary-fraction error into amounts that
16
+ * must balance, and invites callers to write major units.
17
+ * - **Rates are inherently fractional** — `taxRate`, `confidence`, a percentage
18
+ * — so they must be DECIMAL. INTEGER would truncate every meaningful value
19
+ * (a confidence in `[0, 1]` collapses to 0 or 1) and PostgreSQL rejects the
20
+ * write outright with `22P02`.
21
+ *
22
+ * Matching is head-noun based rather than substring based, which is what keeps
23
+ * it usable as a repo-wide gate: `amountCents` and `totalTokensUsed` name a
24
+ * unit or a count as their head and are left alone, while `totalAmount`,
25
+ * `amountPaid` and a bare `total` are money. JSDoc prose is deliberately NOT
26
+ * matched — the head-noun signal is precise, and scanning prose for the same
27
+ * vocabulary would make the gate fire on documentation wording.
28
+ */
29
+ import type { RawClassDefinition } from './types.js';
30
+ /** Which rule a field falls under, if any. */
31
+ export type NumericPrecisionKind = 'money' | 'rate';
32
+ /** One field whose declared precision contradicts its name. */
33
+ export interface NumericPrecisionFinding {
34
+ /** `money` wants INTEGER minor units; `rate` wants DECIMAL. */
35
+ kind: NumericPrecisionKind;
36
+ /** Declaring class, e.g. `Invoice`. */
37
+ className: string;
38
+ /** Field name, e.g. `totalAmount`. */
39
+ fieldName: string;
40
+ /** File the class was scanned from. */
41
+ filePath: string;
42
+ /**
43
+ * 1-based line of the field declaration, or `0` when it could not be
44
+ * resolved. The OXC AST nodes this scanner consumes do not carry `loc`, so
45
+ * the line is recovered from the source text when a caller passes it to
46
+ * {@link lintNumericPrecision}.
47
+ */
48
+ line: number;
49
+ /** The initializer that triggered the finding. */
50
+ initializer: string;
51
+ /** Human-readable explanation naming the rule. */
52
+ message: string;
53
+ /** The accepted fixes. */
54
+ remedy: string;
55
+ }
56
+ /**
57
+ * Split an identifier into lowercase words on camelCase, PascalCase, digits,
58
+ * and underscores. `totalAmountCents` → `['total', 'amount', 'cents']`.
59
+ */
60
+ export declare function splitIdentifierWords(name: string): string[];
61
+ /**
62
+ * Classify an identifier as money, a rate, or neither.
63
+ *
64
+ * The head noun is the last word, or the last word before a trailing qualifier
65
+ * such as `Paid`. A rate word anywhere in the name wins outright: `taxRate` is
66
+ * a rate even though `tax` is money, and that precedence is what stops the two
67
+ * vocabularies from fighting over the same field.
68
+ */
69
+ export declare function classifyNumericFieldName(name: string): NumericPrecisionKind | undefined;
70
+ /**
71
+ * Cheap pre-filter so callers can skip parsing files that cannot produce a
72
+ * finding.
73
+ *
74
+ * Conservative by construction: every condition here is textually implied by a
75
+ * finding. A reported field lives in a class carrying `@smrt` or
76
+ * `extends Smrt…`, is initialized to a number, and has a money or rate word at
77
+ * one of the boundaries the head-noun splitter cuts on. It may still return
78
+ * `true` for a file the AST pass then clears — that is the intended direction.
79
+ *
80
+ * @param source - Full file contents.
81
+ * @returns `false` only when the file provably cannot produce a finding.
82
+ */
83
+ export declare function sourceMayContainNumericPrecisionIssue(source: string): boolean;
84
+ /**
85
+ * Report every persisted `number` field whose declared precision contradicts
86
+ * its name — money declared decimal, or a rate declared integer.
87
+ *
88
+ * @param classes - Raw class definitions from `parseFile` / `OxcScanner`.
89
+ * @param sourceText - Optional contents of the scanned file, used only to
90
+ * recover declaration line numbers the AST does not carry.
91
+ * @returns One finding per offending field, in declaration order.
92
+ */
93
+ export declare function lintNumericPrecision(classes: RawClassDefinition[], sourceText?: string): NumericPrecisionFinding[];
94
+ //# sourceMappingURL=numeric-precision-lint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"numeric-precision-lint.d.ts","sourceRoot":"","sources":["../src/numeric-precision-lint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAsB,MAAM,YAAY,CAAC;AA2EzE,8CAA8C;AAC9C,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,MAAM,CAAC;AAEpD,+DAA+D;AAC/D,MAAM,WAAW,uBAAuB;IACtC,+DAA+D;IAC/D,IAAI,EAAE,oBAAoB,CAAC;IAC3B,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAO3D;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,GACX,oBAAoB,GAAG,SAAS,CASlC;AAwCD;;;;;;;;;;;;GAYG;AACH,wBAAgB,qCAAqC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAM7E;AA8HD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,kBAAkB,EAAE,EAC7B,UAAU,CAAC,EAAE,MAAM,GAClB,uBAAuB,EAAE,CA6B3B"}
@@ -0,0 +1,505 @@
1
+ /**
2
+ * OXC-based TypeScript parser for SMRT class extraction
3
+ *
4
+ * Uses oxc-parser for high-performance syntactic parsing of TypeScript files.
5
+ * Extracts @smrt() decorated classes with their fields, methods, and inheritance.
6
+ *
7
+ * @see https://oxc.rs/docs/guide/usage/parser.html
8
+ */
9
+ import { getLineColumn } from './source-location.js';
10
+ import type { AgentSurface, FileScanResult } from './types.js';
11
+ export { getLineColumn };
12
+ interface Position {
13
+ line: number;
14
+ column: number;
15
+ }
16
+ interface SourceLocation {
17
+ start: Position;
18
+ end: Position;
19
+ }
20
+ interface BaseNode {
21
+ type: string;
22
+ loc?: SourceLocation;
23
+ range?: [number, number];
24
+ start?: number;
25
+ end?: number;
26
+ }
27
+ interface ImportDeclaration extends BaseNode {
28
+ type: 'ImportDeclaration';
29
+ specifiers?: ImportSpecifierLike[];
30
+ source: Literal;
31
+ }
32
+ type ImportSpecifierLike = ImportSpecifier | ImportNamespaceSpecifier | ImportDefaultSpecifier;
33
+ interface ImportSpecifier extends BaseNode {
34
+ type: 'ImportSpecifier';
35
+ imported: Identifier;
36
+ local: Identifier;
37
+ }
38
+ interface ImportNamespaceSpecifier extends BaseNode {
39
+ type: 'ImportNamespaceSpecifier';
40
+ local: Identifier;
41
+ }
42
+ interface ImportDefaultSpecifier extends BaseNode {
43
+ type: 'ImportDefaultSpecifier';
44
+ local: Identifier;
45
+ }
46
+ type Statement = ClassDeclaration | ExportNamedDeclaration | ExportDefaultDeclaration | ImportDeclaration | TSTypeAliasDeclaration | TSEnumDeclaration | VariableDeclaration;
47
+ interface VariableDeclaration extends BaseNode {
48
+ type: 'VariableDeclaration';
49
+ kind: 'const' | 'let' | 'var';
50
+ declarations: VariableDeclarator[];
51
+ }
52
+ interface VariableDeclarator extends BaseNode {
53
+ type: 'VariableDeclarator';
54
+ id: Identifier | Pattern;
55
+ init: Expression | null;
56
+ }
57
+ interface ClassDeclaration extends BaseNode {
58
+ type: 'ClassDeclaration';
59
+ id: Identifier | null;
60
+ superClass: Expression | null;
61
+ superTypeParameters?: TSTypeParameterInstantiation;
62
+ superTypeArguments?: TSTypeParameterInstantiation;
63
+ body: ClassBody;
64
+ decorators?: Decorator[];
65
+ }
66
+ interface TSTypeAliasDeclaration extends BaseNode {
67
+ type: 'TSTypeAliasDeclaration';
68
+ id: Identifier;
69
+ typeAnnotation: TSType;
70
+ }
71
+ interface TSEnumDeclaration extends BaseNode {
72
+ type: 'TSEnumDeclaration';
73
+ id: Identifier;
74
+ body?: TSEnumBody;
75
+ members?: TSEnumMember[];
76
+ }
77
+ interface TSEnumBody extends BaseNode {
78
+ type: 'TSEnumBody';
79
+ members: TSEnumMember[];
80
+ }
81
+ interface TSEnumMember extends BaseNode {
82
+ type: 'TSEnumMember';
83
+ initializer?: Expression;
84
+ }
85
+ interface ClassBody extends BaseNode {
86
+ type: 'ClassBody';
87
+ body: ClassElement[];
88
+ }
89
+ type ClassElement = PropertyDefinition | MethodDefinition;
90
+ interface PropertyDefinition extends BaseNode {
91
+ type: 'PropertyDefinition';
92
+ key: Expression;
93
+ value: Expression | null;
94
+ computed: boolean;
95
+ static: boolean;
96
+ readonly?: boolean;
97
+ optional?: boolean;
98
+ accessibility?: 'public' | 'private' | 'protected';
99
+ typeAnnotation?: TSTypeAnnotation;
100
+ decorators?: Decorator[];
101
+ }
102
+ interface MethodDefinition extends BaseNode {
103
+ type: 'MethodDefinition';
104
+ key: Expression;
105
+ value: FunctionExpression;
106
+ kind: 'constructor' | 'method' | 'get' | 'set';
107
+ computed: boolean;
108
+ static: boolean;
109
+ accessibility?: 'public' | 'private' | 'protected';
110
+ decorators?: Decorator[];
111
+ }
112
+ interface FunctionExpression extends BaseNode {
113
+ type: 'FunctionExpression';
114
+ async: boolean;
115
+ params: Pattern[];
116
+ returnType?: TSTypeAnnotation;
117
+ body: BlockStatement;
118
+ }
119
+ interface BlockStatement extends BaseNode {
120
+ type: 'BlockStatement';
121
+ body: Statement[];
122
+ }
123
+ type Pattern = Identifier | AssignmentPattern | RestElement | ObjectPattern | ArrayPattern;
124
+ interface Identifier extends BaseNode {
125
+ type: 'Identifier';
126
+ name: string;
127
+ typeAnnotation?: TSTypeAnnotation;
128
+ optional?: boolean;
129
+ }
130
+ interface AssignmentPattern extends BaseNode {
131
+ type: 'AssignmentPattern';
132
+ left: Pattern;
133
+ right: Expression;
134
+ }
135
+ interface RestElement extends BaseNode {
136
+ type: 'RestElement';
137
+ argument: Pattern;
138
+ typeAnnotation?: TSTypeAnnotation;
139
+ }
140
+ interface ObjectPattern extends BaseNode {
141
+ type: 'ObjectPattern';
142
+ properties: (Property | RestElement)[];
143
+ typeAnnotation?: TSTypeAnnotation;
144
+ }
145
+ interface ArrayPattern extends BaseNode {
146
+ type: 'ArrayPattern';
147
+ elements: (Pattern | null)[];
148
+ typeAnnotation?: TSTypeAnnotation;
149
+ }
150
+ interface Property extends BaseNode {
151
+ type: 'Property';
152
+ key: Expression;
153
+ value: Expression | Pattern;
154
+ kind: 'init' | 'get' | 'set';
155
+ method: boolean;
156
+ shorthand: boolean;
157
+ computed: boolean;
158
+ }
159
+ type Expression = Identifier | Literal | CallExpression | MemberExpression | ObjectExpression | ArrayExpression | NewExpression | UnaryExpression;
160
+ interface Literal extends BaseNode {
161
+ type: 'Literal';
162
+ value: string | number | boolean | null | RegExp | bigint;
163
+ raw?: string;
164
+ }
165
+ interface UnaryExpression extends BaseNode {
166
+ type: 'UnaryExpression';
167
+ operator: string;
168
+ argument: Expression;
169
+ }
170
+ interface CallExpression extends BaseNode {
171
+ type: 'CallExpression';
172
+ callee: Expression;
173
+ arguments: Expression[];
174
+ typeParameters?: TSTypeParameterInstantiation;
175
+ }
176
+ interface MemberExpression extends BaseNode {
177
+ type: 'MemberExpression';
178
+ object: Expression;
179
+ property: Expression;
180
+ computed: boolean;
181
+ }
182
+ interface ObjectExpression extends BaseNode {
183
+ type: 'ObjectExpression';
184
+ properties: (Property | SpreadElement)[];
185
+ }
186
+ interface SpreadElement extends BaseNode {
187
+ type: 'SpreadElement';
188
+ argument: Expression;
189
+ }
190
+ interface ArrayExpression extends BaseNode {
191
+ type: 'ArrayExpression';
192
+ elements: (Expression | SpreadElement | null)[];
193
+ }
194
+ interface NewExpression extends BaseNode {
195
+ type: 'NewExpression';
196
+ callee: Expression;
197
+ arguments: Expression[];
198
+ }
199
+ interface Decorator extends BaseNode {
200
+ type: 'Decorator';
201
+ expression: Expression;
202
+ }
203
+ interface ExportNamedDeclaration extends BaseNode {
204
+ type: 'ExportNamedDeclaration';
205
+ declaration: Statement | null;
206
+ specifiers: ExportSpecifier[];
207
+ }
208
+ interface ExportDefaultDeclaration extends BaseNode {
209
+ type: 'ExportDefaultDeclaration';
210
+ declaration: Statement | Expression;
211
+ }
212
+ interface ExportSpecifier extends BaseNode {
213
+ type: 'ExportSpecifier';
214
+ local: Identifier;
215
+ exported: Identifier;
216
+ }
217
+ interface TSTypeAnnotation extends BaseNode {
218
+ type: 'TSTypeAnnotation';
219
+ typeAnnotation: TSType;
220
+ }
221
+ type TSType = TSStringKeyword | TSNumberKeyword | TSBooleanKeyword | TSAnyKeyword | TSUnknownKeyword | TSNeverKeyword | TSObjectKeyword | TSBigIntKeyword | TSSymbolKeyword | TSVoidKeyword | TSNullKeyword | TSUndefinedKeyword | TSThisType | TSTypeReference | TSArrayType | TSUnionType | TSTypeLiteral | TSLiteralType | TSFunctionType;
222
+ interface TSLiteralType extends BaseNode {
223
+ type: 'TSLiteralType';
224
+ literal?: Literal;
225
+ }
226
+ interface TSFunctionType extends BaseNode {
227
+ type: 'TSFunctionType';
228
+ }
229
+ interface TSStringKeyword extends BaseNode {
230
+ type: 'TSStringKeyword';
231
+ }
232
+ interface TSNumberKeyword extends BaseNode {
233
+ type: 'TSNumberKeyword';
234
+ }
235
+ interface TSBooleanKeyword extends BaseNode {
236
+ type: 'TSBooleanKeyword';
237
+ }
238
+ interface TSAnyKeyword extends BaseNode {
239
+ type: 'TSAnyKeyword';
240
+ }
241
+ interface TSUnknownKeyword extends BaseNode {
242
+ type: 'TSUnknownKeyword';
243
+ }
244
+ interface TSNeverKeyword extends BaseNode {
245
+ type: 'TSNeverKeyword';
246
+ }
247
+ interface TSObjectKeyword extends BaseNode {
248
+ type: 'TSObjectKeyword';
249
+ }
250
+ interface TSBigIntKeyword extends BaseNode {
251
+ type: 'TSBigIntKeyword';
252
+ }
253
+ interface TSSymbolKeyword extends BaseNode {
254
+ type: 'TSSymbolKeyword';
255
+ }
256
+ interface TSVoidKeyword extends BaseNode {
257
+ type: 'TSVoidKeyword';
258
+ }
259
+ interface TSNullKeyword extends BaseNode {
260
+ type: 'TSNullKeyword';
261
+ }
262
+ interface TSUndefinedKeyword extends BaseNode {
263
+ type: 'TSUndefinedKeyword';
264
+ }
265
+ interface TSThisType extends BaseNode {
266
+ type: 'TSThisType';
267
+ }
268
+ interface TSTypeReference extends BaseNode {
269
+ type: 'TSTypeReference';
270
+ typeName: Identifier | TSQualifiedName;
271
+ typeParameters?: TSTypeParameterInstantiation;
272
+ typeArguments?: TSTypeParameterInstantiation;
273
+ }
274
+ interface TSQualifiedName extends BaseNode {
275
+ type: 'TSQualifiedName';
276
+ left: Identifier | TSQualifiedName;
277
+ right: Identifier;
278
+ }
279
+ interface TSArrayType extends BaseNode {
280
+ type: 'TSArrayType';
281
+ elementType: TSType;
282
+ }
283
+ interface TSUnionType extends BaseNode {
284
+ type: 'TSUnionType';
285
+ types: TSType[];
286
+ }
287
+ interface TSTypeLiteral extends BaseNode {
288
+ type: 'TSTypeLiteral';
289
+ members: TSTypeElement[];
290
+ }
291
+ type TSTypeElement = TSPropertySignature | TSMethodSignature | TSIndexSignature;
292
+ interface TSPropertySignature extends BaseNode {
293
+ type: 'TSPropertySignature';
294
+ key: Expression;
295
+ typeAnnotation?: TSTypeAnnotation;
296
+ optional?: boolean;
297
+ readonly?: boolean;
298
+ }
299
+ interface TSMethodSignature extends BaseNode {
300
+ type: 'TSMethodSignature';
301
+ key: Expression;
302
+ params: Pattern[];
303
+ returnType?: TSTypeAnnotation;
304
+ }
305
+ interface TSIndexSignature extends BaseNode {
306
+ type: 'TSIndexSignature';
307
+ parameters: Identifier[];
308
+ typeAnnotation?: TSTypeAnnotation;
309
+ }
310
+ interface TSTypeParameterInstantiation extends BaseNode {
311
+ type: 'TSTypeParameterInstantiation';
312
+ params: TSType[];
313
+ }
314
+ /**
315
+ * Parse a single TypeScript file and extract SMRT class definitions.
316
+ *
317
+ * Reads the file from disk, runs oxc-parser on it, and returns all class
318
+ * definitions found, any parse errors, accumulated type aliases, and
319
+ * `@happyvertical/smrt-*` import metadata.
320
+ *
321
+ * @param filePath - Absolute path to the `.ts` or `.tsx` file to parse.
322
+ * @returns A {@link FileScanResult} containing classes, errors, type aliases,
323
+ * SMRT imports, and timing information for the file.
324
+ *
325
+ * @example
326
+ * ```typescript
327
+ * import { parseFile } from '@happyvertical/smrt-scanner';
328
+ *
329
+ * const result = parseFile('/project/src/models/Product.ts');
330
+ * console.log(result.classes.map((c) => c.className));
331
+ * // ['Product', 'ProductCollection']
332
+ * ```
333
+ *
334
+ * @see {@link parseSource} to parse a source string directly (e.g. in tests).
335
+ */
336
+ export declare function parseFile(filePath: string): FileScanResult;
337
+ /**
338
+ * Read one file for agent-surface declarations ONLY (#2591).
339
+ *
340
+ * Exists because the agent surface must not be confined to the class scan's
341
+ * `include` glob: an application that scans `src/lib/objects/**` for its models
342
+ * — the shipped template does exactly that — would otherwise never see a
343
+ * `src/lib/agent/Foo.intents.ts` sidecar, and the declaration would vanish from
344
+ * every artifact with no diagnostic. Silent omission is the one failure this
345
+ * matcher exists to prevent, so declarations are discovered on their own terms.
346
+ *
347
+ * The token pre-filter runs before the parse, so a file that declares nothing
348
+ * costs one read and one `String.includes`.
349
+ *
350
+ * @returns The file's surface, or `undefined` when it declares nothing or
351
+ * cannot be read.
352
+ */
353
+ export declare function parseAgentSurfaceFile(filePath: string): AgentSurface | undefined;
354
+ /**
355
+ * Parse TypeScript source text directly and extract SMRT class definitions.
356
+ *
357
+ * Identical to {@link parseFile} but accepts a source string instead of a
358
+ * file path. Primarily used in tests and tooling that constructs source
359
+ * programmatically.
360
+ *
361
+ * @param sourceText - Raw TypeScript source code to parse.
362
+ * @param filename - Virtual filename used to determine the parser language
363
+ * mode (`.ts`, `.tsx`, `.js`, `.jsx`) and to populate `filePath` fields in
364
+ * the result. Defaults to `'test.ts'`.
365
+ * @returns A {@link FileScanResult} containing classes, errors, type aliases,
366
+ * and SMRT import metadata extracted from the source text.
367
+ *
368
+ * @example
369
+ * ```typescript
370
+ * import { parseSource } from '@happyvertical/smrt-scanner';
371
+ *
372
+ * const src = `
373
+ * import { smrt } from '@happyvertical/smrt-core';
374
+ * @smrt()
375
+ * export class Widget extends SmrtObject {
376
+ * label: string = '';
377
+ * }
378
+ * `;
379
+ * const result = parseSource(src, 'Widget.ts');
380
+ * console.log(result.classes[0].className); // 'Widget'
381
+ * ```
382
+ *
383
+ * @see {@link parseFile} to parse a file from disk.
384
+ */
385
+ export declare function parseSource(sourceText: string, filename?: string): FileScanResult;
386
+ /**
387
+ * Whether a key is safe to assign as an own property on a plain object built
388
+ * from parsed AST. See {@link FORBIDDEN_OBJECT_KEYS}.
389
+ *
390
+ * @internal Exported for testing.
391
+ */
392
+ export declare function isSafeObjectKey(key: string): boolean;
393
+ /**
394
+ * Extract `@happyvertical/smrt-*` import declarations from an OXC program body.
395
+ *
396
+ * Scans the top-level AST statements for `ImportDeclaration` nodes whose
397
+ * module specifier begins with `@happyvertical/smrt-` and collects the
398
+ * PascalCase identifiers being imported. The result is used for tree-shaking:
399
+ * only externally imported SMRT classes that appear in project source are
400
+ * included in the generated manifest.
401
+ *
402
+ * Handles all import forms:
403
+ * - Side-effect imports — `import '@happyvertical/smrt-messages'` (recorded as `'*'`)
404
+ * - Named imports — `import { Person, Organization } from '@happyvertical/smrt-profiles'`
405
+ * - Renamed named imports — `import { Person as PersonBase } from '...'` (records original name `Person`)
406
+ * - Namespace imports — `import * as Profiles from '@happyvertical/smrt-profiles'` (recorded as `'*'`)
407
+ * - Default imports — `import SomeClass from '@happyvertical/smrt-profiles'`
408
+ *
409
+ * Only PascalCase identifiers are recorded; utility function names (lowercase)
410
+ * are ignored.
411
+ *
412
+ * @param body - The top-level statement array from the OXC-parsed `Program` node.
413
+ * @returns A `Map` keyed by package name (e.g. `'@happyvertical/smrt-profiles'`)
414
+ * whose values are `Set`s of the imported PascalCase class names (or `'*'`
415
+ * for namespace imports).
416
+ *
417
+ * @example
418
+ * ```typescript
419
+ * import { parseSource, extractSmrtImports } from '@happyvertical/smrt-scanner';
420
+ * import { parseSync } from 'oxc-parser';
421
+ *
422
+ * const src = `import { Person, Organization } from '@happyvertical/smrt-profiles';`;
423
+ * const { program } = parseSync('file.ts', src, { lang: 'ts' });
424
+ * const imports = extractSmrtImports(program.body);
425
+ * // Map { '@happyvertical/smrt-profiles' => Set { 'Person', 'Organization' } }
426
+ * ```
427
+ *
428
+ * @internal Exported for testing; use {@link OxcScanner.scanSmrtImports} for
429
+ * production use cases.
430
+ */
431
+ export declare function extractSmrtImports(body: Statement[]): Map<string, Set<string>>;
432
+ /**
433
+ * Extract type alias declarations from program body.
434
+ * Maps alias names to their resolved type strings.
435
+ * e.g., `type Status = 'active' | 'inactive'` → { Status: "'active' | 'inactive'" }
436
+ * @internal Exported for testing
437
+ */
438
+ export declare function extractTypeAliases(body: Statement[]): Record<string, string>;
439
+ /**
440
+ * A spread inside an `@smrt()` or `@method()` config that could not be
441
+ * resolved statically.
442
+ *
443
+ * Recorded rather than silently dropped: an unresolvable spread may carry
444
+ * `api`/`mcp`/`cli` keys, and because an absent surface key means *default
445
+ * open* (full CRUD), dropping it silently turns a deliberate lockdown into a
446
+ * public surface. The same reasoning covers `@method({ expose: false })`,
447
+ * where a dropped key restores the default-routed behavior the author was
448
+ * withholding. See issues #2100 and #2686.
449
+ */
450
+ interface UnresolvedSpread {
451
+ /** Source text of the spread, e.g. `...IMPORTED_SURFACE`. */
452
+ expression: string;
453
+ /** Byte offset of the spread node, for line/column resolution. */
454
+ start?: number;
455
+ /**
456
+ * Decorator whose config the expression appeared in, for the diagnostic.
457
+ * Defaults to `@smrt()` when omitted.
458
+ */
459
+ decorator?: string;
460
+ }
461
+ /**
462
+ * A module-scope `const` object literal available for spread resolution.
463
+ *
464
+ * `unresolved` carries any spread inside the constant's OWN initializer that
465
+ * could not be resolved (e.g. `const CFG = { ...IMPORTED }`). Such a constant
466
+ * is "tainted": `value` is only a partial view of what it holds at runtime.
467
+ * Resolving a decorator spread against it silently would reintroduce the
468
+ * silent-drop failure mode one level removed, so the taint is replayed into the
469
+ * use site's diagnostics instead.
470
+ */
471
+ interface ModuleConstant {
472
+ value: Record<string, unknown>;
473
+ unresolved: UnresolvedSpread[];
474
+ unsafeReferences: UnresolvedSpread[];
475
+ dependencies: Array<{
476
+ name: string;
477
+ start?: number;
478
+ }>;
479
+ }
480
+ /**
481
+ * Collect module-scope `const NAME = { ... }` object literals so that
482
+ * `@smrt({ ...NAME })` can be resolved at scan time.
483
+ *
484
+ * Declaration order is honoured: a constant may spread an earlier constant, and
485
+ * each is extracted against the map built so far. Only `const` is considered —
486
+ * `let`/`var` could be reassigned between declaration and decorator evaluation,
487
+ * so treating them as static would be unsound.
488
+ *
489
+ * Imported constants are intentionally NOT resolved (that would require
490
+ * cross-file resolution); they surface as unresolved spreads and are reported
491
+ * as scan errors instead of being silently dropped.
492
+ *
493
+ * A constant whose own initializer contains an unresolvable spread is recorded
494
+ * as TAINTED rather than dropped: its extracted value is only partial, so any
495
+ * decorator that spreads it replays the taint into its own diagnostics. Without
496
+ * that, `const CFG = { ...IMPORTED }` followed by `@smrt({ ...CFG })` would
497
+ * resolve cleanly against a partial object and report nothing — the exact
498
+ * silent-drop failure mode this guard exists to prevent, one level removed.
499
+ *
500
+ * @param body - Top-level statement array from the OXC-parsed `Program` node.
501
+ * @param sourceText - Full source text, used for nested value reconstruction.
502
+ * @returns Map of constant name to its extracted value plus any taint.
503
+ */
504
+ export declare function extractModuleObjectConstants(body: Statement[], sourceText: string): Map<string, ModuleConstant>;
505
+ //# sourceMappingURL=oxc-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oxc-parser.d.ts","sourceRoot":"","sources":["../src/oxc-parser.ts"],"names":[],"mappings":"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"}