@flink-app/ts-source-to-json-schema 0.1.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/LICENSE +21 -0
- package/README.md +574 -0
- package/dist/ast.d.ts +102 -0
- package/dist/ast.d.ts.map +1 -0
- package/dist/ast.js +5 -0
- package/dist/ast.js.map +1 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +276 -0
- package/dist/cli.js.map +1 -0
- package/dist/emitter.d.ts +120 -0
- package/dist/emitter.d.ts.map +1 -0
- package/dist/emitter.js +808 -0
- package/dist/emitter.js.map +1 -0
- package/dist/import-parser.d.ts +18 -0
- package/dist/import-parser.d.ts.map +1 -0
- package/dist/import-parser.js +117 -0
- package/dist/import-parser.js.map +1 -0
- package/dist/index.d.ts +99 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +177 -0
- package/dist/index.js.map +1 -0
- package/dist/module-resolver.d.ts +29 -0
- package/dist/module-resolver.d.ts.map +1 -0
- package/dist/module-resolver.js +95 -0
- package/dist/module-resolver.js.map +1 -0
- package/dist/parser.d.ts +38 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +464 -0
- package/dist/parser.js.map +1 -0
- package/dist/path-utils.d.ts +16 -0
- package/dist/path-utils.d.ts.map +1 -0
- package/dist/path-utils.js +63 -0
- package/dist/path-utils.js.map +1 -0
- package/dist/tokenizer.d.ts +9 -0
- package/dist/tokenizer.d.ts.map +1 -0
- package/dist/tokenizer.js +192 -0
- package/dist/tokenizer.js.map +1 -0
- package/package.json +59 -0
package/dist/parser.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Token } from "./tokenizer.js";
|
|
2
|
+
import type { Declaration, TypeNode } from "./ast.js";
|
|
3
|
+
export declare class ParseError extends Error {
|
|
4
|
+
token: Token;
|
|
5
|
+
constructor(message: string, token: Token);
|
|
6
|
+
}
|
|
7
|
+
export declare class Parser {
|
|
8
|
+
private tokens;
|
|
9
|
+
private pos;
|
|
10
|
+
private pendingJSDoc;
|
|
11
|
+
constructor(tokens: Token[]);
|
|
12
|
+
private peek;
|
|
13
|
+
private advance;
|
|
14
|
+
private skipNewlines;
|
|
15
|
+
private expect;
|
|
16
|
+
private match;
|
|
17
|
+
private is;
|
|
18
|
+
private consumeJSDoc;
|
|
19
|
+
private parseJSDocComment;
|
|
20
|
+
parse(): Declaration[];
|
|
21
|
+
private peekAhead;
|
|
22
|
+
private parseInterface;
|
|
23
|
+
private parseTypeAlias;
|
|
24
|
+
private parseEnum;
|
|
25
|
+
private parseObjectBody;
|
|
26
|
+
private peekIsIndexSignature;
|
|
27
|
+
private parseIndexSignature;
|
|
28
|
+
/** Entry point: handles union (lowest precedence) */
|
|
29
|
+
parseType(): TypeNode;
|
|
30
|
+
private parseUnion;
|
|
31
|
+
private parseIntersection;
|
|
32
|
+
private parsePostfix;
|
|
33
|
+
private lookAheadPastBracket;
|
|
34
|
+
private parsePrimary;
|
|
35
|
+
private parseTuple;
|
|
36
|
+
private parseTypeReference;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAa,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EACV,WAAW,EAAE,QAAQ,EAEtB,MAAM,UAAU,CAAC;AAElB,qBAAa,UAAW,SAAQ,KAAK;IACC,KAAK,EAAE,KAAK;gBAApC,OAAO,EAAE,MAAM,EAAS,KAAK,EAAE,KAAK;CAGjD;AAED,qBAAa,MAAM;IAIL,OAAO,CAAC,MAAM;IAH1B,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,YAAY,CAAsE;gBAEtE,MAAM,EAAE,KAAK,EAAE;IAMnC,OAAO,CAAC,IAAI;IASZ,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,MAAM;IAWd,OAAO,CAAC,KAAK;IAQb,OAAO,CAAC,EAAE;IASV,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,iBAAiB;IAqBzB,KAAK,IAAI,WAAW,EAAE;IA+BtB,OAAO,CAAC,SAAS;IAcjB,OAAO,CAAC,cAAc;IAgCtB,OAAO,CAAC,cAAc;IAmCtB,OAAO,CAAC,SAAS;IAoDjB,OAAO,CAAC,eAAe;IAkDvB,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,mBAAmB;IAe3B,qDAAqD;IACrD,SAAS,IAAI,QAAQ;IAIrB,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,iBAAiB;IAiBzB,OAAO,CAAC,YAAY;IAmBpB,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,YAAY;IA0DpB,OAAO,CAAC,UAAU;IA8BlB,OAAO,CAAC,kBAAkB;CAmC3B"}
|
package/dist/parser.js
ADDED
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Parser - Recursive descent parser for TypeScript type declarations
|
|
3
|
+
// ============================================================================
|
|
4
|
+
export class ParseError extends Error {
|
|
5
|
+
token;
|
|
6
|
+
constructor(message, token) {
|
|
7
|
+
super(`${message} at line ${token.line}:${token.col} (got ${token.type}: "${token.value}")`);
|
|
8
|
+
this.token = token;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export class Parser {
|
|
12
|
+
tokens;
|
|
13
|
+
pos = 0;
|
|
14
|
+
pendingJSDoc = null;
|
|
15
|
+
constructor(tokens) {
|
|
16
|
+
this.tokens = tokens;
|
|
17
|
+
}
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Token navigation
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
peek() {
|
|
22
|
+
// Skip newlines when peeking
|
|
23
|
+
let p = this.pos;
|
|
24
|
+
while (p < this.tokens.length && this.tokens[p].type === "newline") {
|
|
25
|
+
p++;
|
|
26
|
+
}
|
|
27
|
+
return this.tokens[p] ?? { type: "eof", value: "", line: 0, col: 0 };
|
|
28
|
+
}
|
|
29
|
+
advance() {
|
|
30
|
+
this.skipNewlines();
|
|
31
|
+
return this.tokens[this.pos++];
|
|
32
|
+
}
|
|
33
|
+
skipNewlines() {
|
|
34
|
+
while (this.pos < this.tokens.length && this.tokens[this.pos].type === "newline") {
|
|
35
|
+
this.pos++;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
expect(type, value) {
|
|
39
|
+
const token = this.advance();
|
|
40
|
+
if (token.type !== type || (value !== undefined && token.value !== value)) {
|
|
41
|
+
throw new ParseError(`Expected ${type}${value ? ` "${value}"` : ""}, got ${token.type} "${token.value}"`, token);
|
|
42
|
+
}
|
|
43
|
+
return token;
|
|
44
|
+
}
|
|
45
|
+
match(type, value) {
|
|
46
|
+
const next = this.peek();
|
|
47
|
+
if (next.type === type && (value === undefined || next.value === value)) {
|
|
48
|
+
return this.advance();
|
|
49
|
+
}
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
is(type, value) {
|
|
53
|
+
const next = this.peek();
|
|
54
|
+
return next.type === type && (value === undefined || next.value === value);
|
|
55
|
+
}
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
// JSDoc parsing
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
consumeJSDoc() {
|
|
60
|
+
const doc = this.pendingJSDoc;
|
|
61
|
+
this.pendingJSDoc = null;
|
|
62
|
+
return doc;
|
|
63
|
+
}
|
|
64
|
+
parseJSDocComment(raw) {
|
|
65
|
+
const lines = raw.split("\n").map(l => l.replace(/^\s*\*\s?/, "").trim());
|
|
66
|
+
const tags = {};
|
|
67
|
+
const descParts = [];
|
|
68
|
+
for (const line of lines) {
|
|
69
|
+
const tagMatch = line.match(/^@(\w+)\s*(.*)/);
|
|
70
|
+
if (tagMatch) {
|
|
71
|
+
tags[tagMatch[1]] = tagMatch[2].trim();
|
|
72
|
+
}
|
|
73
|
+
else if (line) {
|
|
74
|
+
descParts.push(line);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return { description: descParts.join(" "), tags };
|
|
78
|
+
}
|
|
79
|
+
// ---------------------------------------------------------------------------
|
|
80
|
+
// Top-level parsing
|
|
81
|
+
// ---------------------------------------------------------------------------
|
|
82
|
+
parse() {
|
|
83
|
+
const declarations = [];
|
|
84
|
+
while (!this.is("eof")) {
|
|
85
|
+
this.skipNewlines();
|
|
86
|
+
// Collect JSDoc
|
|
87
|
+
if (this.is("jsdoc")) {
|
|
88
|
+
const token = this.advance();
|
|
89
|
+
this.pendingJSDoc = this.parseJSDocComment(token.value);
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
// Skip 'export'
|
|
93
|
+
const exported = !!this.match("keyword", "export");
|
|
94
|
+
if (this.is("keyword", "interface")) {
|
|
95
|
+
declarations.push(this.parseInterface(exported));
|
|
96
|
+
}
|
|
97
|
+
else if (this.is("keyword", "type")) {
|
|
98
|
+
declarations.push(this.parseTypeAlias(exported));
|
|
99
|
+
}
|
|
100
|
+
else if (this.is("keyword", "enum") || (this.is("keyword", "const") && this.peekAhead("keyword", "enum"))) {
|
|
101
|
+
declarations.push(this.parseEnum(exported));
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
// Skip unknown tokens
|
|
105
|
+
this.advance();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return declarations;
|
|
109
|
+
}
|
|
110
|
+
peekAhead(type, value) {
|
|
111
|
+
// Look ahead past current token (skipping newlines)
|
|
112
|
+
let p = this.pos;
|
|
113
|
+
while (p < this.tokens.length && this.tokens[p].type === "newline")
|
|
114
|
+
p++;
|
|
115
|
+
p++; // skip current
|
|
116
|
+
while (p < this.tokens.length && this.tokens[p].type === "newline")
|
|
117
|
+
p++;
|
|
118
|
+
const t = this.tokens[p];
|
|
119
|
+
return t?.type === type && (value === undefined || t.value === value);
|
|
120
|
+
}
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
// Interface
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
parseInterface(exported) {
|
|
125
|
+
const jsdoc = this.consumeJSDoc();
|
|
126
|
+
this.expect("keyword", "interface");
|
|
127
|
+
const name = this.expect("identifier").value;
|
|
128
|
+
// extends clause
|
|
129
|
+
let extendsTypes;
|
|
130
|
+
if (this.match("keyword", "extends")) {
|
|
131
|
+
extendsTypes = [this.parseType()];
|
|
132
|
+
while (this.match("punctuation", ",")) {
|
|
133
|
+
extendsTypes.push(this.parseType());
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const { properties, indexSignature } = this.parseObjectBody();
|
|
137
|
+
return {
|
|
138
|
+
kind: "interface",
|
|
139
|
+
name,
|
|
140
|
+
extends: extendsTypes,
|
|
141
|
+
properties,
|
|
142
|
+
indexSignature,
|
|
143
|
+
description: jsdoc?.description,
|
|
144
|
+
tags: jsdoc?.tags,
|
|
145
|
+
exported,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
// Type alias
|
|
150
|
+
// ---------------------------------------------------------------------------
|
|
151
|
+
parseTypeAlias(exported) {
|
|
152
|
+
const jsdoc = this.consumeJSDoc();
|
|
153
|
+
this.expect("keyword", "type");
|
|
154
|
+
const name = this.expect("identifier").value;
|
|
155
|
+
// Skip generic params: type Foo<T> = ...
|
|
156
|
+
if (this.match("punctuation", "<")) {
|
|
157
|
+
let depth = 1;
|
|
158
|
+
while (depth > 0 && !this.is("eof")) {
|
|
159
|
+
if (this.is("punctuation", "<"))
|
|
160
|
+
depth++;
|
|
161
|
+
if (this.is("punctuation", ">"))
|
|
162
|
+
depth--;
|
|
163
|
+
this.advance();
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
this.expect("punctuation", "=");
|
|
167
|
+
const type = this.parseType();
|
|
168
|
+
// Optional semicolon
|
|
169
|
+
this.match("punctuation", ";");
|
|
170
|
+
return {
|
|
171
|
+
kind: "type_alias",
|
|
172
|
+
name,
|
|
173
|
+
type,
|
|
174
|
+
description: jsdoc?.description,
|
|
175
|
+
tags: jsdoc?.tags,
|
|
176
|
+
exported,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
// ---------------------------------------------------------------------------
|
|
180
|
+
// Enum
|
|
181
|
+
// ---------------------------------------------------------------------------
|
|
182
|
+
parseEnum(exported) {
|
|
183
|
+
const jsdoc = this.consumeJSDoc();
|
|
184
|
+
this.match("keyword", "const"); // const enum
|
|
185
|
+
this.expect("keyword", "enum");
|
|
186
|
+
const name = this.expect("identifier").value;
|
|
187
|
+
this.expect("punctuation", "{");
|
|
188
|
+
const members = [];
|
|
189
|
+
let autoIndex = 0;
|
|
190
|
+
while (!this.is("punctuation", "}") && !this.is("eof")) {
|
|
191
|
+
this.skipNewlines();
|
|
192
|
+
if (this.is("jsdoc")) {
|
|
193
|
+
this.advance();
|
|
194
|
+
continue;
|
|
195
|
+
} // skip member JSDoc for now
|
|
196
|
+
if (this.is("punctuation", "}"))
|
|
197
|
+
break;
|
|
198
|
+
const memberName = this.expect("identifier").value;
|
|
199
|
+
let memberValue = autoIndex;
|
|
200
|
+
if (this.match("punctuation", "=")) {
|
|
201
|
+
if (this.is("string")) {
|
|
202
|
+
memberValue = this.advance().value;
|
|
203
|
+
}
|
|
204
|
+
else if (this.is("number")) {
|
|
205
|
+
memberValue = Number(this.advance().value);
|
|
206
|
+
autoIndex = memberValue + 1;
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
// Unknown initializer, skip
|
|
210
|
+
this.advance();
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
autoIndex++;
|
|
215
|
+
}
|
|
216
|
+
members.push({ name: memberName, value: memberValue });
|
|
217
|
+
this.match("punctuation", ",");
|
|
218
|
+
}
|
|
219
|
+
this.expect("punctuation", "}");
|
|
220
|
+
return {
|
|
221
|
+
kind: "enum",
|
|
222
|
+
name,
|
|
223
|
+
members,
|
|
224
|
+
description: jsdoc?.description,
|
|
225
|
+
tags: jsdoc?.tags,
|
|
226
|
+
exported,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
// ---------------------------------------------------------------------------
|
|
230
|
+
// Object body parsing (shared between interface and inline object types)
|
|
231
|
+
// ---------------------------------------------------------------------------
|
|
232
|
+
parseObjectBody() {
|
|
233
|
+
this.expect("punctuation", "{");
|
|
234
|
+
const properties = [];
|
|
235
|
+
let indexSignature;
|
|
236
|
+
while (!this.is("punctuation", "}") && !this.is("eof")) {
|
|
237
|
+
this.skipNewlines();
|
|
238
|
+
// Collect member JSDoc
|
|
239
|
+
let memberJSDoc = null;
|
|
240
|
+
if (this.is("jsdoc")) {
|
|
241
|
+
memberJSDoc = this.parseJSDocComment(this.advance().value);
|
|
242
|
+
}
|
|
243
|
+
this.skipNewlines();
|
|
244
|
+
if (this.is("punctuation", "}"))
|
|
245
|
+
break;
|
|
246
|
+
// Index signature: [key: string]: ValueType
|
|
247
|
+
if (this.is("punctuation", "[") && this.peekIsIndexSignature()) {
|
|
248
|
+
indexSignature = this.parseIndexSignature();
|
|
249
|
+
this.match("punctuation", ";");
|
|
250
|
+
this.match("punctuation", ",");
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
// Regular property
|
|
254
|
+
const readonly = !!this.match("keyword", "readonly");
|
|
255
|
+
const propName = this.advance().value; // identifier or string
|
|
256
|
+
const optional = !!this.match("punctuation", "?");
|
|
257
|
+
this.expect("punctuation", ":");
|
|
258
|
+
const propType = this.parseType();
|
|
259
|
+
properties.push({
|
|
260
|
+
name: propName,
|
|
261
|
+
type: propType,
|
|
262
|
+
optional,
|
|
263
|
+
readonly,
|
|
264
|
+
description: memberJSDoc?.description,
|
|
265
|
+
tags: memberJSDoc?.tags,
|
|
266
|
+
});
|
|
267
|
+
// Semicolons and commas are optional
|
|
268
|
+
this.match("punctuation", ";");
|
|
269
|
+
this.match("punctuation", ",");
|
|
270
|
+
}
|
|
271
|
+
this.expect("punctuation", "}");
|
|
272
|
+
return { properties, indexSignature };
|
|
273
|
+
}
|
|
274
|
+
peekIsIndexSignature() {
|
|
275
|
+
// Look ahead: [ identifier : type ] : type
|
|
276
|
+
// Simple heuristic: after [, is there identifier then : ?
|
|
277
|
+
let p = this.pos;
|
|
278
|
+
// skip [
|
|
279
|
+
p++;
|
|
280
|
+
while (p < this.tokens.length && this.tokens[p].type === "newline")
|
|
281
|
+
p++;
|
|
282
|
+
// should be identifier
|
|
283
|
+
if (this.tokens[p]?.type !== "identifier" && this.tokens[p]?.type !== "primitive")
|
|
284
|
+
return false;
|
|
285
|
+
p++;
|
|
286
|
+
while (p < this.tokens.length && this.tokens[p].type === "newline")
|
|
287
|
+
p++;
|
|
288
|
+
// should be :
|
|
289
|
+
return this.tokens[p]?.value === ":";
|
|
290
|
+
}
|
|
291
|
+
parseIndexSignature() {
|
|
292
|
+
this.expect("punctuation", "[");
|
|
293
|
+
this.advance(); // key name (identifier)
|
|
294
|
+
this.expect("punctuation", ":");
|
|
295
|
+
const keyType = this.parseType();
|
|
296
|
+
this.expect("punctuation", "]");
|
|
297
|
+
this.expect("punctuation", ":");
|
|
298
|
+
const valueType = this.parseType();
|
|
299
|
+
return { keyType, valueType };
|
|
300
|
+
}
|
|
301
|
+
// ---------------------------------------------------------------------------
|
|
302
|
+
// Type parsing - the core recursive descent
|
|
303
|
+
// ---------------------------------------------------------------------------
|
|
304
|
+
/** Entry point: handles union (lowest precedence) */
|
|
305
|
+
parseType() {
|
|
306
|
+
return this.parseUnion();
|
|
307
|
+
}
|
|
308
|
+
parseUnion() {
|
|
309
|
+
// Handle leading |
|
|
310
|
+
this.match("punctuation", "|");
|
|
311
|
+
let left = this.parseIntersection();
|
|
312
|
+
if (this.is("punctuation", "|")) {
|
|
313
|
+
const members = [left];
|
|
314
|
+
while (this.match("punctuation", "|")) {
|
|
315
|
+
members.push(this.parseIntersection());
|
|
316
|
+
}
|
|
317
|
+
return { kind: "union", members };
|
|
318
|
+
}
|
|
319
|
+
return left;
|
|
320
|
+
}
|
|
321
|
+
parseIntersection() {
|
|
322
|
+
// Handle leading &
|
|
323
|
+
this.match("punctuation", "&");
|
|
324
|
+
let left = this.parsePostfix();
|
|
325
|
+
if (this.is("punctuation", "&")) {
|
|
326
|
+
const members = [left];
|
|
327
|
+
while (this.match("punctuation", "&")) {
|
|
328
|
+
members.push(this.parsePostfix());
|
|
329
|
+
}
|
|
330
|
+
return { kind: "intersection", members };
|
|
331
|
+
}
|
|
332
|
+
return left;
|
|
333
|
+
}
|
|
334
|
+
parsePostfix() {
|
|
335
|
+
let type = this.parsePrimary();
|
|
336
|
+
// Handle T[] and T[][] etc.
|
|
337
|
+
while (this.is("punctuation", "[")) {
|
|
338
|
+
// Check if it's [] (array) vs [number] (indexed access - not supported, skip)
|
|
339
|
+
const nextAfterBracket = this.lookAheadPastBracket();
|
|
340
|
+
if (nextAfterBracket === "]") {
|
|
341
|
+
this.advance(); // [
|
|
342
|
+
this.advance(); // ]
|
|
343
|
+
type = { kind: "array", element: type };
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
break;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
return type;
|
|
350
|
+
}
|
|
351
|
+
lookAheadPastBracket() {
|
|
352
|
+
let p = this.pos;
|
|
353
|
+
// skip [
|
|
354
|
+
p++;
|
|
355
|
+
while (p < this.tokens.length && this.tokens[p].type === "newline")
|
|
356
|
+
p++;
|
|
357
|
+
return this.tokens[p]?.value ?? "";
|
|
358
|
+
}
|
|
359
|
+
parsePrimary() {
|
|
360
|
+
const token = this.peek();
|
|
361
|
+
// Primitive types
|
|
362
|
+
if (token.type === "primitive") {
|
|
363
|
+
this.advance();
|
|
364
|
+
if (token.value === "true")
|
|
365
|
+
return { kind: "literal_boolean", value: true };
|
|
366
|
+
if (token.value === "false")
|
|
367
|
+
return { kind: "literal_boolean", value: false };
|
|
368
|
+
return { kind: "primitive", value: token.value };
|
|
369
|
+
}
|
|
370
|
+
// String literal type
|
|
371
|
+
if (token.type === "string") {
|
|
372
|
+
this.advance();
|
|
373
|
+
return { kind: "literal_string", value: token.value };
|
|
374
|
+
}
|
|
375
|
+
// Number literal type
|
|
376
|
+
if (token.type === "number") {
|
|
377
|
+
this.advance();
|
|
378
|
+
return { kind: "literal_number", value: Number(token.value) };
|
|
379
|
+
}
|
|
380
|
+
// Parenthesized type: (string | number)
|
|
381
|
+
if (this.is("punctuation", "(")) {
|
|
382
|
+
this.advance();
|
|
383
|
+
const inner = this.parseType();
|
|
384
|
+
this.expect("punctuation", ")");
|
|
385
|
+
return { kind: "parenthesized", inner };
|
|
386
|
+
}
|
|
387
|
+
// Tuple or array type: [string, number]
|
|
388
|
+
if (this.is("punctuation", "[")) {
|
|
389
|
+
return this.parseTuple();
|
|
390
|
+
}
|
|
391
|
+
// Inline object type: { foo: string; bar: number }
|
|
392
|
+
if (this.is("punctuation", "{")) {
|
|
393
|
+
const { properties, indexSignature } = this.parseObjectBody();
|
|
394
|
+
return { kind: "object", properties, indexSignature };
|
|
395
|
+
}
|
|
396
|
+
// readonly keyword before array
|
|
397
|
+
if (this.is("keyword", "readonly")) {
|
|
398
|
+
this.advance();
|
|
399
|
+
const inner = this.parsePostfix();
|
|
400
|
+
// readonly T[] is still just T[] for schema purposes
|
|
401
|
+
return inner;
|
|
402
|
+
}
|
|
403
|
+
// Type reference: SomeType, Array<T>, Record<K,V>, etc.
|
|
404
|
+
if (token.type === "identifier") {
|
|
405
|
+
return this.parseTypeReference();
|
|
406
|
+
}
|
|
407
|
+
throw new ParseError(`Unexpected token`, token);
|
|
408
|
+
}
|
|
409
|
+
parseTuple() {
|
|
410
|
+
this.expect("punctuation", "[");
|
|
411
|
+
const elements = [];
|
|
412
|
+
while (!this.is("punctuation", "]") && !this.is("eof")) {
|
|
413
|
+
const rest = !!this.match("punctuation", ".");
|
|
414
|
+
if (rest) {
|
|
415
|
+
this.expect("punctuation", ".");
|
|
416
|
+
this.expect("punctuation", ".");
|
|
417
|
+
}
|
|
418
|
+
// Check for named tuple: name: Type
|
|
419
|
+
let label;
|
|
420
|
+
if (this.is("identifier") && this.peekAhead("punctuation", ":")) {
|
|
421
|
+
label = this.advance().value;
|
|
422
|
+
this.advance(); // :
|
|
423
|
+
}
|
|
424
|
+
const type = this.parseType();
|
|
425
|
+
const optional = !!this.match("punctuation", "?");
|
|
426
|
+
elements.push({ type, optional, label, rest });
|
|
427
|
+
if (!this.match("punctuation", ","))
|
|
428
|
+
break;
|
|
429
|
+
}
|
|
430
|
+
this.expect("punctuation", "]");
|
|
431
|
+
return { kind: "tuple", elements };
|
|
432
|
+
}
|
|
433
|
+
parseTypeReference() {
|
|
434
|
+
const name = this.advance().value;
|
|
435
|
+
// Generic type arguments: Foo<Bar, Baz>
|
|
436
|
+
let typeArgs;
|
|
437
|
+
if (this.is("punctuation", "<")) {
|
|
438
|
+
this.advance(); // <
|
|
439
|
+
typeArgs = [];
|
|
440
|
+
while (!this.is("punctuation", ">") && !this.is("eof")) {
|
|
441
|
+
typeArgs.push(this.parseType());
|
|
442
|
+
if (!this.match("punctuation", ","))
|
|
443
|
+
break;
|
|
444
|
+
}
|
|
445
|
+
this.expect("punctuation", ">");
|
|
446
|
+
}
|
|
447
|
+
// Handle well-known generic types inline
|
|
448
|
+
if (name === "Array" && typeArgs?.length === 1) {
|
|
449
|
+
return { kind: "array", element: typeArgs[0] };
|
|
450
|
+
}
|
|
451
|
+
if (name === "Record" && typeArgs?.length === 2) {
|
|
452
|
+
return { kind: "record", keyType: typeArgs[0], valueType: typeArgs[1] };
|
|
453
|
+
}
|
|
454
|
+
if (name === "Promise" && typeArgs?.length === 1) {
|
|
455
|
+
// Unwrap Promise for schema purposes
|
|
456
|
+
return typeArgs[0];
|
|
457
|
+
}
|
|
458
|
+
if (typeArgs) {
|
|
459
|
+
return { kind: "reference", name, typeArgs };
|
|
460
|
+
}
|
|
461
|
+
return { kind: "reference", name };
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check if path is a relative import (./ or ../)
|
|
3
|
+
*/
|
|
4
|
+
export declare function isRelativeImport(importPath: string): boolean;
|
|
5
|
+
/**
|
|
6
|
+
* Resolve import path based on follow mode.
|
|
7
|
+
* Returns absolute path or null if should be skipped.
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolveImportPath(importPath: string, fromFilePath: string, followMode: "none" | "local" | "all"): string | null;
|
|
10
|
+
/**
|
|
11
|
+
* Try to resolve a module path with TypeScript extensions.
|
|
12
|
+
* Tries in order: exact match, .ts, .tsx, .d.ts, index.ts, index.tsx, index.d.ts
|
|
13
|
+
* Returns absolute path if found, null otherwise.
|
|
14
|
+
*/
|
|
15
|
+
export declare function resolveExtensions(basePath: string): string | null;
|
|
16
|
+
//# sourceMappingURL=path-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-utils.d.ts","sourceRoot":"","sources":["../src/path-utils.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,GACnC,MAAM,GAAG,IAAI,CAsBf;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAyBjE"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Path Utilities - Resolve import paths with TypeScript conventions
|
|
3
|
+
// ============================================================================
|
|
4
|
+
import * as path from "path";
|
|
5
|
+
import * as fs from "fs";
|
|
6
|
+
/**
|
|
7
|
+
* Check if path is a relative import (./ or ../)
|
|
8
|
+
*/
|
|
9
|
+
export function isRelativeImport(importPath) {
|
|
10
|
+
return importPath.startsWith("./") || importPath.startsWith("../");
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Resolve import path based on follow mode.
|
|
14
|
+
* Returns absolute path or null if should be skipped.
|
|
15
|
+
*/
|
|
16
|
+
export function resolveImportPath(importPath, fromFilePath, followMode) {
|
|
17
|
+
// Skip all imports in "none" mode
|
|
18
|
+
if (followMode === "none") {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
// In "local" mode, only follow relative imports
|
|
22
|
+
if (followMode === "local" && !isRelativeImport(importPath)) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
// In "all" mode, skip node_modules for now (MVP handles local only)
|
|
26
|
+
// This can be enhanced in Phase 2
|
|
27
|
+
if (followMode === "all" && !isRelativeImport(importPath)) {
|
|
28
|
+
return null; // For now, treat "all" same as "local"
|
|
29
|
+
}
|
|
30
|
+
// Resolve relative to the directory of the importing file
|
|
31
|
+
const fromDir = path.dirname(fromFilePath);
|
|
32
|
+
const resolved = path.resolve(fromDir, importPath);
|
|
33
|
+
return resolved;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Try to resolve a module path with TypeScript extensions.
|
|
37
|
+
* Tries in order: exact match, .ts, .tsx, .d.ts, index.ts, index.tsx, index.d.ts
|
|
38
|
+
* Returns absolute path if found, null otherwise.
|
|
39
|
+
*/
|
|
40
|
+
export function resolveExtensions(basePath) {
|
|
41
|
+
// Try exact match first
|
|
42
|
+
if (fs.existsSync(basePath) && fs.statSync(basePath).isFile()) {
|
|
43
|
+
return basePath;
|
|
44
|
+
}
|
|
45
|
+
// Try adding extensions
|
|
46
|
+
const extensions = [".ts", ".tsx", ".d.ts"];
|
|
47
|
+
for (const ext of extensions) {
|
|
48
|
+
const withExt = basePath + ext;
|
|
49
|
+
if (fs.existsSync(withExt) && fs.statSync(withExt).isFile()) {
|
|
50
|
+
return withExt;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Try index files (if basePath is a directory or doesn't exist yet)
|
|
54
|
+
const indexFiles = ["index.ts", "index.tsx", "index.d.ts"];
|
|
55
|
+
for (const indexFile of indexFiles) {
|
|
56
|
+
const indexPath = path.join(basePath, indexFile);
|
|
57
|
+
if (fs.existsSync(indexPath) && fs.statSync(indexPath).isFile()) {
|
|
58
|
+
return indexPath;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=path-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-utils.js","sourceRoot":"","sources":["../src/path-utils.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,oEAAoE;AACpE,+EAA+E;AAE/E,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAAkB;IACjD,OAAO,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACrE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,UAAkB,EAClB,YAAoB,EACpB,UAAoC;IAEpC,kCAAkC;IAClC,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gDAAgD;IAChD,IAAI,UAAU,KAAK,OAAO,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oEAAoE;IACpE,kCAAkC;IAClC,IAAI,UAAU,KAAK,KAAK,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC,CAAC,uCAAuC;IACtD,CAAC;IAED,0DAA0D;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAEnD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,wBAAwB;IACxB,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QAC9D,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,wBAAwB;IACxB,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,QAAQ,GAAG,GAAG,CAAC;QAC/B,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YAC5D,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAED,oEAAoE;IACpE,MAAM,UAAU,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IAC3D,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACjD,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YAChE,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type TokenType = "keyword" | "primitive" | "identifier" | "string" | "number" | "punctuation" | "jsdoc" | "newline" | "eof";
|
|
2
|
+
export interface Token {
|
|
3
|
+
type: TokenType;
|
|
4
|
+
value: string;
|
|
5
|
+
line: number;
|
|
6
|
+
col: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function tokenize(source: string): Token[];
|
|
9
|
+
//# sourceMappingURL=tokenizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../src/tokenizer.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,SAAS,GACjB,SAAS,GACT,WAAW,GACX,YAAY,GACZ,QAAQ,GACR,QAAQ,GACR,aAAa,GACb,OAAO,GACP,SAAS,GACT,KAAK,CAAC;AAEV,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAiBD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,CA0LhD"}
|