@happyvertical/smrt-scanner 0.51.31 → 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.
- package/AGENTS.md +9 -0
- package/dist/agent-surface.d.ts +224 -0
- package/dist/agent-surface.d.ts.map +1 -0
- package/dist/cli.d.ts +21 -1
- package/dist/cli.d.ts.map +1 -0
- package/dist/discovery.d.ts +15 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/index.d.ts +29 -2061
- package/dist/index.d.ts.map +1 -0
- package/dist/inheritance-resolver.d.ts +226 -0
- package/dist/inheritance-resolver.d.ts.map +1 -0
- package/dist/knowledge-discovery.d.ts +48 -0
- package/dist/knowledge-discovery.d.ts.map +1 -0
- package/dist/knowledge-graph.d.ts +113 -0
- package/dist/knowledge-graph.d.ts.map +1 -0
- package/dist/knowledge.d.ts +3 -0
- package/dist/knowledge.d.ts.map +1 -0
- package/dist/knowledge.js +301 -0
- package/dist/knowledge.js.map +1 -0
- package/dist/manifest-adapter.d.ts +297 -0
- package/dist/manifest-adapter.d.ts.map +1 -0
- package/dist/numeric-precision-lint.d.ts +94 -0
- package/dist/numeric-precision-lint.d.ts.map +1 -0
- package/dist/oxc-parser.d.ts +505 -0
- package/dist/oxc-parser.d.ts.map +1 -0
- package/dist/scanner.d.ts +266 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/source-location.d.ts +22 -0
- package/dist/source-location.d.ts.map +1 -0
- package/dist/types.d.ts +497 -522
- package/dist/types.d.ts.map +1 -0
- package/dist/verify-completeness.d.ts +60 -0
- package/dist/verify-completeness.d.ts.map +1 -0
- package/package.json +6 -1
|
@@ -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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"}
|