@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 @@
1
+ {"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"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"}
package/dist/ast.js ADDED
@@ -0,0 +1,5 @@
1
+ // ============================================================================
2
+ // AST Node Types - The intermediate representation between parsing and emission
3
+ // ============================================================================
4
+ export {};
5
+ //# sourceMappingURL=ast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast.js","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,gFAAgF;AAChF,+EAA+E"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI entry point for ts-source-to-json-schema
4
+ *
5
+ * Usage:
6
+ * ts-source-to-json-schema <file.ts> [options]
7
+ * npx ts-source-to-json-schema src/types.ts --rootType User
8
+ *
9
+ * Reads a TypeScript file and outputs JSON Schema to stdout.
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG"}
package/dist/cli.js ADDED
@@ -0,0 +1,276 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI entry point for ts-source-to-json-schema
4
+ *
5
+ * Usage:
6
+ * ts-source-to-json-schema <file.ts> [options]
7
+ * npx ts-source-to-json-schema src/types.ts --rootType User
8
+ *
9
+ * Reads a TypeScript file and outputs JSON Schema to stdout.
10
+ */
11
+ import * as fs from 'fs';
12
+ import * as path from 'path';
13
+ import { toJsonSchema, toJsonSchemaFromFile } from './index.js';
14
+ const version = '0.1.0'; // TODO: Read from package.json
15
+ function showHelp() {
16
+ console.log(`
17
+ ts-source-to-json-schema v${version}
18
+
19
+ USAGE:
20
+ ts-source-to-json-schema <file.ts> [options]
21
+
22
+ DESCRIPTION:
23
+ Convert TypeScript type definitions to JSON Schema (2020-12 draft).
24
+
25
+ OPTIONS:
26
+ -h, --help Show this help message
27
+ -v, --version Show version number
28
+ --doctor Output diagnostic information for debugging
29
+
30
+ -r, --rootType <name> Emit this type as root (others in $defs)
31
+ -s, --includeSchema <bool> Include $schema property (default: true)
32
+ --schemaVersion <url> Custom $schema URL
33
+ --strictObjects Set additionalProperties: false globally
34
+ --additionalProperties Set additionalProperties default (true/false)
35
+ --includeJSDoc <bool> Include JSDoc comments (default: true)
36
+
37
+ --followImports <mode> Follow imports: none, local, all (default: local)
38
+ --baseDir <path> Base directory for resolving imports
39
+
40
+ EXAMPLES:
41
+ # Convert all types in a file
42
+ ts-source-to-json-schema src/types.ts
43
+
44
+ # Convert a specific root type
45
+ ts-source-to-json-schema src/api.ts --rootType ApiResponse
46
+
47
+ # Follow local imports (default)
48
+ ts-source-to-json-schema src/api.ts --followImports local
49
+
50
+ # Single file, no imports
51
+ ts-source-to-json-schema src/types.ts --followImports none
52
+
53
+ # Strict object mode (no additional properties)
54
+ ts-source-to-json-schema src/config.ts --strictObjects
55
+
56
+ # Disable JSDoc processing
57
+ ts-source-to-json-schema src/types.ts --includeJSDoc false
58
+
59
+ # Combine options
60
+ ts-source-to-json-schema src/user.ts -r User --strictObjects --followImports local
61
+ `);
62
+ }
63
+ function parseArgs(args) {
64
+ const options = {};
65
+ let filePath = null;
66
+ for (let i = 0; i < args.length; i++) {
67
+ const arg = args[i];
68
+ if (arg === '-h' || arg === '--help') {
69
+ options.help = true;
70
+ }
71
+ else if (arg === '-v' || arg === '--version') {
72
+ options.version = true;
73
+ }
74
+ else if (arg === '--doctor') {
75
+ options.doctor = true;
76
+ }
77
+ else if (arg === '-r' || arg === '--rootType') {
78
+ options.rootType = args[++i];
79
+ }
80
+ else if (arg === '-s' || arg === '--includeSchema') {
81
+ options.includeSchema = parseBoolean(args[++i]);
82
+ }
83
+ else if (arg === '--schemaVersion') {
84
+ options.schemaVersion = args[++i];
85
+ }
86
+ else if (arg === '--strictObjects') {
87
+ options.strictObjects = true;
88
+ }
89
+ else if (arg === '--additionalProperties') {
90
+ options.additionalProperties = parseBoolean(args[++i]);
91
+ }
92
+ else if (arg === '--includeJSDoc') {
93
+ options.includeJSDoc = parseBoolean(args[++i]);
94
+ }
95
+ else if (arg === '--followImports') {
96
+ const mode = args[++i];
97
+ if (!['none', 'local', 'all'].includes(mode)) {
98
+ console.error(`Invalid followImports mode: ${mode}`);
99
+ console.error('Valid options: none, local, all');
100
+ process.exit(1);
101
+ }
102
+ options.followImports = mode;
103
+ }
104
+ else if (arg === '--baseDir') {
105
+ options.baseDir = args[++i];
106
+ }
107
+ else if (arg.startsWith('-')) {
108
+ console.error(`Unknown option: ${arg}`);
109
+ console.error('Run with --help to see available options');
110
+ process.exit(1);
111
+ }
112
+ else {
113
+ // First non-flag argument is the file path
114
+ if (!filePath) {
115
+ filePath = arg;
116
+ }
117
+ else {
118
+ console.error(`Unexpected argument: ${arg}`);
119
+ process.exit(1);
120
+ }
121
+ }
122
+ }
123
+ return { filePath, options };
124
+ }
125
+ function parseBoolean(value) {
126
+ const lower = value.toLowerCase();
127
+ if (lower === 'true' || lower === '1' || lower === 'yes') {
128
+ return true;
129
+ }
130
+ if (lower === 'false' || lower === '0' || lower === 'no') {
131
+ return false;
132
+ }
133
+ console.error(`Invalid boolean value: ${value}`);
134
+ console.error('Use: true/false, yes/no, or 1/0');
135
+ process.exit(1);
136
+ }
137
+ function main() {
138
+ const args = process.argv.slice(2);
139
+ // Handle no arguments
140
+ if (args.length === 0) {
141
+ showHelp();
142
+ process.exit(0);
143
+ }
144
+ const { filePath, options } = parseArgs(args);
145
+ // Handle special flags
146
+ if (options.help) {
147
+ showHelp();
148
+ process.exit(0);
149
+ }
150
+ if (options.version) {
151
+ console.log(version);
152
+ process.exit(0);
153
+ }
154
+ // Validate file path
155
+ if (!filePath) {
156
+ console.error('Error: No input file specified');
157
+ console.error('Usage: ts-source-to-json-schema <file.ts> [options]');
158
+ console.error('Run with --help for more information');
159
+ process.exit(1);
160
+ }
161
+ // Resolve file path
162
+ const absolutePath = path.resolve(process.cwd(), filePath);
163
+ // Check if file exists (skip in doctor mode to provide diagnostics)
164
+ if (!fs.existsSync(absolutePath) && !options.doctor) {
165
+ console.error(`Error: File not found: ${filePath}`);
166
+ process.exit(1);
167
+ }
168
+ // Read TypeScript source
169
+ let source;
170
+ let readError = null;
171
+ try {
172
+ source = fs.readFileSync(absolutePath, 'utf-8');
173
+ }
174
+ catch (error) {
175
+ readError = error instanceof Error ? error : new Error(String(error));
176
+ if (!options.doctor) {
177
+ console.error(`Error reading file: ${readError.message}`);
178
+ process.exit(1);
179
+ }
180
+ source = ''; // For doctor mode
181
+ }
182
+ // Doctor mode: output comprehensive diagnostics
183
+ if (options.doctor) {
184
+ const { help, version, doctor, ...emitterOptions } = options;
185
+ const inputInfo = {
186
+ filePath: filePath,
187
+ absolutePath: absolutePath,
188
+ fileExists: fs.existsSync(absolutePath),
189
+ };
190
+ // Add file stats if file exists
191
+ if (fs.existsSync(absolutePath)) {
192
+ try {
193
+ const stats = fs.statSync(absolutePath);
194
+ inputInfo.fileSize = stats.size;
195
+ inputInfo.modified = stats.mtime.toISOString();
196
+ }
197
+ catch (error) {
198
+ // Ignore stat errors
199
+ }
200
+ }
201
+ const diagnostics = {
202
+ timestamp: new Date().toISOString(),
203
+ version: version,
204
+ environment: {
205
+ nodeVersion: process.version,
206
+ platform: process.platform,
207
+ arch: process.arch,
208
+ cwd: process.cwd(),
209
+ },
210
+ input: inputInfo,
211
+ options: emitterOptions,
212
+ };
213
+ // Add read error if present
214
+ if (readError) {
215
+ diagnostics.readError = {
216
+ message: readError.message,
217
+ stack: readError.stack,
218
+ };
219
+ }
220
+ else {
221
+ // Add source content and length
222
+ inputInfo.sourceLength = source.length;
223
+ inputInfo.sourceLines = source.split('\n').length;
224
+ inputInfo.source = source;
225
+ // Try to convert and capture result or error
226
+ try {
227
+ const schema = toJsonSchema(source, emitterOptions);
228
+ diagnostics.conversionResult = {
229
+ success: true,
230
+ schema: schema,
231
+ };
232
+ }
233
+ catch (error) {
234
+ const conversionError = error instanceof Error ? error : new Error(String(error));
235
+ diagnostics.conversionResult = {
236
+ success: false,
237
+ error: {
238
+ message: conversionError.message,
239
+ stack: conversionError.stack,
240
+ },
241
+ };
242
+ }
243
+ }
244
+ console.log(JSON.stringify(diagnostics, null, 2));
245
+ process.exit(0);
246
+ }
247
+ // Convert to JSON Schema
248
+ let schema;
249
+ try {
250
+ // Remove help, version, doctor from emitter options
251
+ const { help, version, doctor, ...emitterOptions } = options;
252
+ // Determine followImports mode (default to 'local' in CLI)
253
+ const followMode = emitterOptions.followImports ?? 'local';
254
+ if (followMode !== 'none') {
255
+ // Use file-based API with import resolution
256
+ const baseDir = emitterOptions.baseDir ?? path.dirname(absolutePath);
257
+ schema = toJsonSchemaFromFile(absolutePath, {
258
+ ...emitterOptions,
259
+ baseDir,
260
+ followImports: followMode,
261
+ });
262
+ }
263
+ else {
264
+ // Use string-based API (single file, no imports)
265
+ schema = toJsonSchema(source, emitterOptions);
266
+ }
267
+ }
268
+ catch (error) {
269
+ console.error(`Error converting to JSON Schema: ${error instanceof Error ? error.message : String(error)}`);
270
+ process.exit(1);
271
+ }
272
+ // Output JSON Schema to stdout
273
+ console.log(JSON.stringify(schema, null, 2));
274
+ }
275
+ main();
276
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ import type { Declaration } from "./ast.js";
2
+ export interface JSONSchema {
3
+ $schema?: string;
4
+ $ref?: string;
5
+ $defs?: Record<string, JSONSchema>;
6
+ type?: string | string[];
7
+ properties?: Record<string, JSONSchema>;
8
+ required?: string[];
9
+ additionalProperties?: boolean | JSONSchema;
10
+ items?: JSONSchema;
11
+ prefixItems?: JSONSchema[];
12
+ minItems?: number;
13
+ maxItems?: number;
14
+ anyOf?: JSONSchema[];
15
+ allOf?: JSONSchema[];
16
+ oneOf?: JSONSchema[];
17
+ const?: unknown;
18
+ enum?: unknown[];
19
+ description?: string;
20
+ default?: unknown;
21
+ minimum?: number;
22
+ maximum?: number;
23
+ minLength?: number;
24
+ maxLength?: number;
25
+ pattern?: string;
26
+ format?: string;
27
+ deprecated?: boolean;
28
+ readOnly?: boolean;
29
+ examples?: unknown[];
30
+ title?: string;
31
+ [key: string]: unknown;
32
+ }
33
+ export interface EmitterOptions {
34
+ /** Include $schema in the root. Default: true */
35
+ includeSchema?: boolean;
36
+ /** JSON Schema draft. Default: "https://json-schema.org/draft/2020-12/schema" */
37
+ schemaVersion?: string;
38
+ /** Set additionalProperties: false on all objects. Default: false */
39
+ strictObjects?: boolean;
40
+ /** Name of the root type to emit. If not set, emits all types under $defs */
41
+ rootType?: string;
42
+ /** Include JSDoc descriptions and tags in the schema. Default: true */
43
+ includeJSDoc?: boolean;
44
+ /** Default value for additionalProperties if not specified via JSDoc or index signature */
45
+ additionalProperties?: boolean;
46
+ /** Follow import statements: "none" (default in API), "local" (default in CLI), "all" */
47
+ followImports?: "none" | "local" | "all";
48
+ /** Base directory for resolving imports. Default: dirname(entryPath) or cwd */
49
+ baseDir?: string;
50
+ }
51
+ export declare class Emitter {
52
+ private declarations;
53
+ private options;
54
+ constructor(declarations: Declaration[], options?: EmitterOptions);
55
+ emit(): JSONSchema;
56
+ /**
57
+ * Emits schemas for all declarations at once.
58
+ * More efficient than calling emit() multiple times.
59
+ * Each schema is standalone with only its transitively referenced types in definitions.
60
+ */
61
+ emitAll(): Record<string, JSONSchema>;
62
+ /**
63
+ * Emits a declaration as a standalone schema with minimal definitions.
64
+ * Only includes types that are transitively referenced.
65
+ * Uses "definitions" (draft-07 style) instead of "$defs" for compatibility.
66
+ */
67
+ private emitDeclarationStandalone;
68
+ /**
69
+ * Recursively collects all type names that are transitively referenced by a given type.
70
+ */
71
+ private collectTransitiveReferences;
72
+ /**
73
+ * Finds all direct type references in a declaration.
74
+ */
75
+ private findDirectReferences;
76
+ /**
77
+ * Checks if a type name refers to a built-in type that shouldn't be in definitions.
78
+ */
79
+ private isBuiltInType;
80
+ /**
81
+ * Recursively converts $ref paths from #/$defs/ to #/definitions/ in a schema.
82
+ */
83
+ private convertRefsToDefinitions;
84
+ /**
85
+ * Checks if a schema contains a reference to a specific type name.
86
+ * Used to detect self-referential types.
87
+ */
88
+ private containsReference;
89
+ /**
90
+ * Checks if a type is transitively self-referential.
91
+ * This includes both direct recursion (A → A) and mutual recursion (A → B → A).
92
+ */
93
+ private isTransitivelySelfReferential;
94
+ /**
95
+ * Extracts all type names referenced in a schema.
96
+ */
97
+ private getReferencedTypes;
98
+ private emitDeclaration;
99
+ private emitInterface;
100
+ private emitTypeAlias;
101
+ private emitEnum;
102
+ private emitType;
103
+ private emitPrimitive;
104
+ private emitObjectType;
105
+ private emitTuple;
106
+ private emitUnion;
107
+ private flattenUnion;
108
+ private emitIntersection;
109
+ private emitReference;
110
+ private emitRecord;
111
+ private resolveUtilityType;
112
+ private resolvePartial;
113
+ private resolveRequired;
114
+ private resolvePick;
115
+ private resolveOmit;
116
+ private extractKeyNames;
117
+ private getProperties;
118
+ private applyJSDocTags;
119
+ }
120
+ //# sourceMappingURL=emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../src/emitter.ts"],"names":[],"mappings":"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"}