@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.
@@ -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"}