go2typebox 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.
Files changed (42) hide show
  1. package/README.md +56 -0
  2. package/dist/generator.d.ts +14 -0
  3. package/dist/generator.d.ts.map +1 -0
  4. package/dist/generator.js +165 -0
  5. package/dist/generator.js.map +1 -0
  6. package/dist/go2typebox.d.ts +54 -0
  7. package/dist/go2typebox.d.ts.map +1 -0
  8. package/dist/go2typebox.js +219 -0
  9. package/dist/go2typebox.js.map +1 -0
  10. package/dist/index.d.ts +10 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +15 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/parser.d.ts +10 -0
  15. package/dist/parser.d.ts.map +1 -0
  16. package/dist/parser.js +87 -0
  17. package/dist/parser.js.map +1 -0
  18. package/dist/pruneTypeboxFile.d.ts +18 -0
  19. package/dist/pruneTypeboxFile.d.ts.map +1 -0
  20. package/dist/pruneTypeboxFile.js +192 -0
  21. package/dist/pruneTypeboxFile.js.map +1 -0
  22. package/dist/sorter.d.ts +15 -0
  23. package/dist/sorter.d.ts.map +1 -0
  24. package/dist/sorter.js +113 -0
  25. package/dist/sorter.js.map +1 -0
  26. package/dist/standardizeTypeboxTypes.d.ts +48 -0
  27. package/dist/standardizeTypeboxTypes.d.ts.map +1 -0
  28. package/dist/standardizeTypeboxTypes.js +351 -0
  29. package/dist/standardizeTypeboxTypes.js.map +1 -0
  30. package/dist/types.d.ts +67 -0
  31. package/dist/types.d.ts.map +1 -0
  32. package/dist/types.js +3 -0
  33. package/dist/types.js.map +1 -0
  34. package/dist/utils.d.ts +19 -0
  35. package/dist/utils.d.ts.map +1 -0
  36. package/dist/utils.js +64 -0
  37. package/dist/utils.js.map +1 -0
  38. package/dist/writer.d.ts +16 -0
  39. package/dist/writer.d.ts.map +1 -0
  40. package/dist/writer.js +105 -0
  41. package/dist/writer.js.map +1 -0
  42. package/package.json +53 -0
@@ -0,0 +1,351 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.collapseRedundantPrefixedSchemaAliases = collapseRedundantPrefixedSchemaAliases;
37
+ exports.unwrapInlineSchemaRefs = unwrapInlineSchemaRefs;
38
+ exports.standardizeTypeboxTypes = standardizeTypeboxTypes;
39
+ const child_process_1 = require("child_process");
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const EXPORT_CONST = /^export const (\w+)\s*=/;
43
+ /** Escapes a string for safe use inside a `RegExp` constructor. */
44
+ function escapeRegex(s) {
45
+ return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
46
+ }
47
+ /**
48
+ * Drops trivial aliases like `export const TypesFooSchema = FooSchema` (same for `Models*`),
49
+ * rewrites all references to the canonical schema name, and removes matching `export type TypesFoo` / `ModelsFoo`.
50
+ *
51
+ * @param content - Full TypeBox module source.
52
+ * @returns Transformed source.
53
+ */
54
+ function collapseRedundantPrefixedSchemaAliases(content) {
55
+ const aliasDecl = /export const (Types|Models)(\w+Schema)\s*=\s*(?:\r?\n\s*)?(\w+Schema)\s*;/g;
56
+ const pairs = [];
57
+ let m;
58
+ const scan = new RegExp(aliasDecl.source, aliasDecl.flags);
59
+ while ((m = scan.exec(content)) !== null) {
60
+ const suffix = m[2];
61
+ const rhs = m[3];
62
+ if (suffix !== rhs)
63
+ continue;
64
+ pairs.push({ from: `${m[1]}${suffix}`, to: rhs });
65
+ }
66
+ let out = content.replace(aliasDecl, (full, _prefix, suffix, rhs) => suffix === rhs ? '' : full);
67
+ pairs.sort((a, b) => b.from.length - a.from.length);
68
+ for (const { from, to } of pairs) {
69
+ out = out.replace(new RegExp(`\\b${escapeRegex(from)}\\b`, 'g'), to);
70
+ }
71
+ out = out.replace(/export type (Types|Models)\w+\s*=\s*Static<\s*(?:\r?\n\s*)?typeof \w+Schema\s*(?:\r?\n\s*)?>\s*;\s*/g, '');
72
+ return out.replace(/\n{3,}/g, '\n\n');
73
+ }
74
+ /**
75
+ * Appends `Schema` to exported const names that lack it and updates references in type lines.
76
+ */
77
+ function addSchemaPostfix(content) {
78
+ const lines = content.split(/\r?\n/);
79
+ const constNames = new Set();
80
+ for (const line of lines) {
81
+ const m = line.match(EXPORT_CONST);
82
+ if (m)
83
+ constNames.add(m[1]);
84
+ }
85
+ const toRename = [...constNames].filter((n) => !n.endsWith('Schema'));
86
+ toRename.sort((a, b) => b.length - a.length);
87
+ /** Replaces bare schema identifiers with their `*Schema` suffixed names. */
88
+ function renameSchemaIdents(text) {
89
+ let out = text;
90
+ for (const n of toRename) {
91
+ out = out.replace(new RegExp(`\\b${escapeRegex(n)}\\b`, 'g'), `${n}Schema`);
92
+ }
93
+ return out;
94
+ }
95
+ return lines
96
+ .map((line) => {
97
+ const typeDecl = line.match(/^export type (\w+)\s*=\s*(.*)$/);
98
+ if (typeDecl) {
99
+ const [, typeName, rhs] = typeDecl;
100
+ return `export type ${typeName} = ${renameSchemaIdents(rhs)}`;
101
+ }
102
+ return renameSchemaIdents(line);
103
+ })
104
+ .join('\n');
105
+ }
106
+ /** Uppercases the first character; empty string is returned unchanged. */
107
+ function capitalizeFirstLetter(str) {
108
+ if (str.length === 0)
109
+ return str;
110
+ return str[0].toUpperCase() + str.slice(1);
111
+ }
112
+ /** Collects names from `export type` and `export const` lines. */
113
+ function collectExportedIdentifiers(lines) {
114
+ const names = new Set();
115
+ for (const line of lines) {
116
+ const typeM = line.match(/^export type (\w+)/);
117
+ if (typeM)
118
+ names.add(typeM[1]);
119
+ const constM = line.match(/^export const (\w+)/);
120
+ if (constM)
121
+ names.add(constM[1]);
122
+ }
123
+ return names;
124
+ }
125
+ /** Renames exported symbols that start with a lowercase letter to PascalCase when unambiguous. */
126
+ function renameExportedSymbolsToPascalCase(content) {
127
+ const lines = content.split(/\r?\n/);
128
+ const exportedNames = collectExportedIdentifiers(lines);
129
+ const renames = [];
130
+ for (const name of exportedNames) {
131
+ if (!/^[a-z]/.test(name))
132
+ continue;
133
+ const to = capitalizeFirstLetter(name);
134
+ if (to === name)
135
+ continue;
136
+ if (exportedNames.has(to)) {
137
+ console.warn(`Skipping rename ${name} → ${to}: an export named ${to} already exists`);
138
+ continue;
139
+ }
140
+ renames.push({ from: name, to });
141
+ }
142
+ renames.sort((a, b) => b.from.length - a.from.length);
143
+ let out = content;
144
+ for (const { from, to } of renames) {
145
+ out = out.replace(new RegExp(`\\b${escapeRegex(from)}\\b`, 'g'), to);
146
+ }
147
+ return out;
148
+ }
149
+ /** Advances `i` past ASCII whitespace. */
150
+ function skipWs(s, i) {
151
+ while (i < s.length && /\s/.test(s[i]))
152
+ i++;
153
+ return i;
154
+ }
155
+ /**
156
+ * Finds the index of the `)` that closes the `(` at `openIdx`, respecting strings and escapes.
157
+ * @throws If no matching closing parenthesis is found.
158
+ */
159
+ function findMatchingParen(s, openIdx) {
160
+ let depth = 0;
161
+ let inStr = false;
162
+ let strQ = '';
163
+ for (let i = openIdx; i < s.length; i++) {
164
+ const c = s[i];
165
+ if (inStr) {
166
+ if (c === '\\' && strQ !== '`') {
167
+ i++;
168
+ continue;
169
+ }
170
+ if (c === strQ)
171
+ inStr = false;
172
+ continue;
173
+ }
174
+ if (c === '"' || c === "'" || c === '`') {
175
+ inStr = true;
176
+ strQ = c;
177
+ continue;
178
+ }
179
+ if (c === '(')
180
+ depth++;
181
+ else if (c === ')') {
182
+ depth--;
183
+ if (depth === 0)
184
+ return i;
185
+ }
186
+ }
187
+ throw new Error(`No matching closing parenthesis from index ${openIdx}`);
188
+ }
189
+ /**
190
+ * If `s` at `pos` starts with `Type.Object(` or `Type.Record(`, returns the full call expression span.
191
+ */
192
+ function extractTypeObjectOrRecord(s, pos) {
193
+ const slice = s.slice(pos);
194
+ const m = slice.match(/^Type\.(Object|Record)\s*\(/);
195
+ if (!m)
196
+ return null;
197
+ const openParen = pos + m[0].length - 1;
198
+ const closeParen = findMatchingParen(s, openParen);
199
+ return { expr: s.slice(pos, closeParen + 1), end: closeParen + 1 };
200
+ }
201
+ const RPC_CONST = /export const ((?:Request|Response)\w+Schema)\s*=\s*/g;
202
+ /**
203
+ * Wraps bare `Type.Object` / `Type.Record` RPC schema exports with `getRequestSchema`, `getResponseSchema`, or `getRequestArrSchema`.
204
+ */
205
+ function wrapWithJsonRpcRequestSchema(content, requestArrSchemaNames) {
206
+ const replacements = [];
207
+ for (const m of content.matchAll(RPC_CONST)) {
208
+ const name = m[1];
209
+ const valueStart = m.index + m[0].length;
210
+ const pos = skipWs(content, valueStart);
211
+ const rest = content.slice(pos);
212
+ if (rest.startsWith('getRequestSchema(') ||
213
+ rest.startsWith('getResponseSchema(') ||
214
+ rest.startsWith('getRequestArrSchema(')) {
215
+ continue;
216
+ }
217
+ const extracted = extractTypeObjectOrRecord(content, pos);
218
+ if (!extracted)
219
+ continue;
220
+ const useArr = requestArrSchemaNames?.has(name) ?? false;
221
+ const isResponse = name.startsWith('Response');
222
+ const wrapper = useArr
223
+ ? 'getRequestArrSchema'
224
+ : isResponse
225
+ ? 'getResponseSchema'
226
+ : 'getRequestSchema';
227
+ let end = extracted.end;
228
+ end = skipWs(content, end);
229
+ const hadSemi = content[end] === ';';
230
+ const replaceTo = hadSemi ? end + 1 : end;
231
+ const text = `export const ${name} = ${wrapper}(${extracted.expr})${hadSemi ? '' : ';'}`;
232
+ replacements.push({ from: m.index, to: replaceTo, text });
233
+ }
234
+ replacements.sort((a, b) => b.from - a.from);
235
+ let out = content;
236
+ for (const r of replacements) {
237
+ out = out.slice(0, r.from) + r.text + out.slice(r.to);
238
+ }
239
+ return out;
240
+ }
241
+ /**
242
+ * Ensures an import from `helpersImportPath` exists for whichever JSON-RPC helper names appear in `content`.
243
+ */
244
+ function ensureRpcHelpersImports(content, helpersImportPath) {
245
+ const wanted = [];
246
+ if (/\bgetRequestSchema\b/.test(content))
247
+ wanted.push('getRequestSchema');
248
+ if (/\bgetResponseSchema\b/.test(content))
249
+ wanted.push('getResponseSchema');
250
+ if (/\bgetRequestArrSchema\b/.test(content))
251
+ wanted.push('getRequestArrSchema');
252
+ if (wanted.length === 0)
253
+ return content;
254
+ const q = helpersImportPath.includes(`'`) ? '"' : "'";
255
+ const rpcImport = `import { ${wanted.join(', ')} } from ${q}${helpersImportPath}${q};\n`;
256
+ const escPath = escapeRegex(helpersImportPath);
257
+ const existingImportRe = new RegExp(`import\\s+\\{[^}]*\\}\\s+from\\s+['"]${escPath}['"];\\s*\\n?`);
258
+ if (existingImportRe.test(content)) {
259
+ return content.replace(existingImportRe, rpcImport);
260
+ }
261
+ const typeboxImport = content.match(/import\s+\{[^}]+\}\s+from\s+['"]@sinclair\/typebox['"];\s*\n/);
262
+ if (typeboxImport && typeboxImport.index !== undefined) {
263
+ const ins = typeboxImport.index + typeboxImport[0].length;
264
+ return content.slice(0, ins) + rpcImport + content.slice(ins);
265
+ }
266
+ return rpcImport + content;
267
+ }
268
+ const DEFAULT_AUTO_GEN_MARKER = 'WARNING: this file is generated automatically';
269
+ /**
270
+ * TypeBox ≥0.34: replaces `Type.Ref(x)` with inline `XSchema` for same-file const references.
271
+ *
272
+ * @param content - Module source.
273
+ * @returns Source with refs unwrapped (repeated until stable).
274
+ */
275
+ function unwrapInlineSchemaRefs(content) {
276
+ const re = /Type\.Ref\(\s*([A-Za-z_]\w*Schema)\s*\)/g;
277
+ let prev;
278
+ let out = content;
279
+ do {
280
+ prev = out;
281
+ out = out.replace(re, '$1');
282
+ } while (out !== prev);
283
+ return out;
284
+ }
285
+ /** Prepends an auto-generated file banner if `markerLine` is not already present. */
286
+ function ensureGeneratedTypeboxBanner(content, markerLine) {
287
+ if (content.includes(markerLine))
288
+ return content;
289
+ return `/**
290
+ * ${markerLine} (Go → TypeBox). Do not edit by hand —
291
+ * changes will be lost on the next generation run.
292
+ */
293
+
294
+ ${content}`;
295
+ }
296
+ /** Prepends `eslint-disable max-lines` when the file exceeds `maxLines` and the directive is missing. */
297
+ function ensureEslintDisableMaxLines(content, maxLines) {
298
+ const lineCount = content.split(/\r?\n/).length;
299
+ if (lineCount <= maxLines)
300
+ return content;
301
+ if (/\/\*\s*eslint-disable\s+max-lines\s*\*\//.test(content))
302
+ return content;
303
+ return `/* eslint-disable max-lines */\n${content}`;
304
+ }
305
+ /** Runs Prettier on `targetFilePath` using `command` (path appended as last argument). */
306
+ function runPrettierOnTarget(targetFilePath, command) {
307
+ const absolute = path.resolve(targetFilePath);
308
+ const rel = path.relative(process.cwd(), absolute);
309
+ const arg = rel.startsWith('..') ? absolute : rel;
310
+ const cmd = `${command.trim()} "${arg}"`;
311
+ (0, child_process_1.execSync)(cmd, {
312
+ stdio: 'ignore',
313
+ cwd: process.cwd(),
314
+ });
315
+ console.log('✅ File formatted successfully with Prettier');
316
+ }
317
+ /**
318
+ * Post-processes a generated TypeBox file: schema postfix, PascalCase exports, unwrap `Type.Ref`,
319
+ * optional JSON-RPC wrappers, redundant alias collapse, banner, max-lines eslint, and Prettier.
320
+ *
321
+ * @param targetFilePath - File to read and write in place.
322
+ * @param options - Pipeline toggles and JSON-RPC / Prettier settings.
323
+ */
324
+ async function standardizeTypeboxTypes(targetFilePath, options) {
325
+ const maxLines = options?.maxLinesForEslintDisable ?? 1000;
326
+ const runPrettier = options?.runPrettier !== false;
327
+ const prettierCommand = options?.prettierCommand ?? 'npx prettier --write --log-level silent';
328
+ const addBanner = options?.addGeneratedBanner !== false;
329
+ const marker = options?.autoGeneratedMarkerLine ?? DEFAULT_AUTO_GEN_MARKER;
330
+ const raw = fs.readFileSync(targetFilePath, 'utf8');
331
+ const lines = raw.split(/\r?\n/);
332
+ let pipeline = addSchemaPostfix(lines.join('\n'));
333
+ pipeline = renameExportedSymbolsToPascalCase(pipeline);
334
+ pipeline = unwrapInlineSchemaRefs(pipeline);
335
+ if (options?.jsonRpc) {
336
+ const arrNames = new Set(options.jsonRpc.requestArrSchemaNames ?? []);
337
+ pipeline = wrapWithJsonRpcRequestSchema(pipeline, arrNames);
338
+ pipeline = ensureRpcHelpersImports(pipeline, options.jsonRpc.helpersImportPath);
339
+ }
340
+ pipeline = collapseRedundantPrefixedSchemaAliases(pipeline);
341
+ if (addBanner) {
342
+ pipeline = ensureGeneratedTypeboxBanner(pipeline, marker);
343
+ }
344
+ pipeline = ensureEslintDisableMaxLines(pipeline, maxLines);
345
+ fs.writeFileSync(targetFilePath, pipeline, 'utf8');
346
+ console.log('✅ Done: Schema postfix, PascalCase, unwrap Type.Ref:', targetFilePath);
347
+ if (runPrettier) {
348
+ runPrettierOnTarget(targetFilePath, prettierCommand);
349
+ }
350
+ }
351
+ //# sourceMappingURL=standardizeTypeboxTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standardizeTypeboxTypes.js","sourceRoot":"","sources":["../src/standardizeTypeboxTypes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ export interface GoField {
2
+ name: string;
3
+ /** JSON key from the `json` tag, otherwise camelCase of the Go field name */
4
+ jsonName: string;
5
+ type: string;
6
+ isPointer: boolean;
7
+ /** `json:"...,omitempty"` — when nil the key may be omitted */
8
+ jsonOmitempty: boolean;
9
+ isArray: boolean;
10
+ arrayDepth: number;
11
+ tags?: string;
12
+ }
13
+ export interface GoStruct {
14
+ name: string;
15
+ fields: GoField[];
16
+ dependencies: string[];
17
+ }
18
+ export type GoTypeAliasMap = Map<string, string>;
19
+ /** `type Row []Element` — type name → element type and `[]` depth (supports `[][]T`). */
20
+ export type GoSliceTypeAliasMap = Map<string, {
21
+ elementType: string;
22
+ arrayDepth: number;
23
+ }>;
24
+ export type EmptyStructStrategy = 'object' | 'recordUnknown';
25
+ export type WriteMode = 'overwrite' | 'append';
26
+ /**
27
+ * `verbose` — full log per .go file; `silent` — only the final «✅ Wrote TypeBox…» after merge
28
+ * and the same lines as standardize/prune. Default: `silent`.
29
+ */
30
+ export type Go2TypeboxLogMode = 'verbose' | 'silent';
31
+ export interface ConvertGoToTypeboxOptions {
32
+ mode?: WriteMode;
33
+ emptyStructStrategy?: EmptyStructStrategy;
34
+ /**
35
+ * When true (default), runs Prettier on the generated file.
36
+ * Set false if you format the output yourself.
37
+ */
38
+ formatWithPrettier?: boolean;
39
+ /** Overrides the log mode from the constructor. */
40
+ logMode?: Go2TypeboxLogMode;
41
+ /**
42
+ * Suppress warnings about unknown Go types and empty .go files without structs
43
+ * (useful for generation scripts that only need the final ✅ line).
44
+ */
45
+ suppressWarnings?: boolean;
46
+ }
47
+ export interface Go2TypeboxLogger {
48
+ log: (message: string) => void;
49
+ warn: (message: string) => void;
50
+ error: (message: string, error?: unknown) => void;
51
+ }
52
+ export interface Go2TypeboxConfig {
53
+ /**
54
+ * Command to format the output file; must accept the file path as the last argument.
55
+ * Default: `npx prettier --write --log-level silent`
56
+ */
57
+ prettierCommand?: string;
58
+ /**
59
+ * Logger adapter (default: `console`).
60
+ */
61
+ logger?: Go2TypeboxLogger;
62
+ /** Default `silent`. */
63
+ logMode?: Go2TypeboxLogMode;
64
+ /** Default false. See `ConvertGoToTypeboxOptions.suppressWarnings`. */
65
+ suppressWarnings?: boolean;
66
+ }
67
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,+DAA+D;IAC/D,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,MAAM,cAAc,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEjD,yFAAyF;AACzF,MAAM,MAAM,mBAAmB,GAAG,GAAG,CACnC,MAAM,EACN;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAC5C,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,eAAe,CAAC;AAE7D,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE/C;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAErD,MAAM,WAAW,yBAAyB;IACxC,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,mDAAmD;IACnD,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CACnD;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;OAEG;IACH,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,wBAAwB;IACxB,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
1
+ /** Returns the identifier after the last `.` in a qualified Go type (e.g. `pkg.Foo` → `Foo`). */
2
+ export declare function stripGoPackagePrefix(goType: string): string;
3
+ /** Escapes a string for safe use inside a `RegExp` constructor. */
4
+ export declare function escapeRegex(s: string): string;
5
+ /** Uppercases the first character; empty string is returned unchanged. */
6
+ export declare function capitalizeFirstLetter(str: string): string;
7
+ /** Ensures exported TypeScript names start with an uppercase letter when the Go name does. */
8
+ export declare function toPascalExportName(name: string): string;
9
+ /** Removes Go line comments (`//`) and block comments from source (for simpler regex parsing). */
10
+ export declare function removeComments(content: string): string;
11
+ /** Lowercases the first character of `str`. */
12
+ export declare function toCamelCase(str: string): string;
13
+ /**
14
+ * JSON key from `json:"name,omitempty"` when present; otherwise camelCase of the Go field name.
15
+ */
16
+ export declare function jsonNameFromStructTags(tags: string | undefined, goFieldName: string): string;
17
+ /** True if the `json` struct tag lists `omitempty`. */
18
+ export declare function hasJsonOmitempty(tags: string | undefined): boolean;
19
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED,mEAAmE;AACnE,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,0EAA0E;AAC1E,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGzD;AAED,8FAA8F;AAC9F,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,kGAAkG;AAClG,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAItD;AAED,+CAA+C;AAC/C,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,WAAW,EAAE,MAAM,GAClB,MAAM,CAMR;AAED,uDAAuD;AACvD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAQlE"}
package/dist/utils.js ADDED
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.stripGoPackagePrefix = stripGoPackagePrefix;
4
+ exports.escapeRegex = escapeRegex;
5
+ exports.capitalizeFirstLetter = capitalizeFirstLetter;
6
+ exports.toPascalExportName = toPascalExportName;
7
+ exports.removeComments = removeComments;
8
+ exports.toCamelCase = toCamelCase;
9
+ exports.jsonNameFromStructTags = jsonNameFromStructTags;
10
+ exports.hasJsonOmitempty = hasJsonOmitempty;
11
+ /** Returns the identifier after the last `.` in a qualified Go type (e.g. `pkg.Foo` → `Foo`). */
12
+ function stripGoPackagePrefix(goType) {
13
+ const lastDot = goType.lastIndexOf('.');
14
+ return lastDot >= 0 ? goType.slice(lastDot + 1) : goType;
15
+ }
16
+ /** Escapes a string for safe use inside a `RegExp` constructor. */
17
+ function escapeRegex(s) {
18
+ return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
19
+ }
20
+ /** Uppercases the first character; empty string is returned unchanged. */
21
+ function capitalizeFirstLetter(str) {
22
+ if (str.length === 0)
23
+ return str;
24
+ return str[0].toUpperCase() + str.slice(1);
25
+ }
26
+ /** Ensures exported TypeScript names start with an uppercase letter when the Go name does. */
27
+ function toPascalExportName(name) {
28
+ return /^[a-z]/.test(name) ? capitalizeFirstLetter(name) : name;
29
+ }
30
+ /** Removes Go line comments (`//`) and block comments from source (for simpler regex parsing). */
31
+ function removeComments(content) {
32
+ let result = content.replace(/\/\/.*$/gm, '');
33
+ result = result.replace(/\/\*[\s\S]*?\*\//g, '');
34
+ return result;
35
+ }
36
+ /** Lowercases the first character of `str`. */
37
+ function toCamelCase(str) {
38
+ return str.charAt(0).toLowerCase() + str.slice(1);
39
+ }
40
+ /**
41
+ * JSON key from `json:"name,omitempty"` when present; otherwise camelCase of the Go field name.
42
+ */
43
+ function jsonNameFromStructTags(tags, goFieldName) {
44
+ if (!tags)
45
+ return toCamelCase(goFieldName);
46
+ const m = tags.match(/json:"([^"]*)"/);
47
+ if (!m)
48
+ return toCamelCase(goFieldName);
49
+ const key = m[1].split(',')[0].trim();
50
+ return key || toCamelCase(goFieldName);
51
+ }
52
+ /** True if the `json` struct tag lists `omitempty`. */
53
+ function hasJsonOmitempty(tags) {
54
+ if (!tags)
55
+ return false;
56
+ const m = tags.match(/json:"([^"]*)"/);
57
+ if (!m)
58
+ return false;
59
+ return m[1]
60
+ .split(',')
61
+ .slice(1)
62
+ .some((opt) => opt.trim() === 'omitempty');
63
+ }
64
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;AACA,oDAGC;AAGD,kCAEC;AAGD,sDAGC;AAGD,gDAEC;AAGD,wCAIC;AAGD,kCAEC;AAKD,wDASC;AAGD,4CAQC;AAzDD,iGAAiG;AACjG,SAAgB,oBAAoB,CAAC,MAAc;IACjD,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxC,OAAO,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AAC3D,CAAC;AAED,mEAAmE;AACnE,SAAgB,WAAW,CAAC,CAAS;IACnC,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,0EAA0E;AAC1E,SAAgB,qBAAqB,CAAC,GAAW;IAC/C,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IACjC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,8FAA8F;AAC9F,SAAgB,kBAAkB,CAAC,IAAY;IAC7C,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAClE,CAAC;AAED,kGAAkG;AAClG,SAAgB,cAAc,CAAC,OAAe;IAC5C,IAAI,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC9C,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;IACjD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+CAA+C;AAC/C,SAAgB,WAAW,CAAC,GAAW;IACrC,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,SAAgB,sBAAsB,CACpC,IAAwB,EACxB,WAAmB;IAEnB,IAAI,CAAC,IAAI;QAAE,OAAO,WAAW,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACvC,IAAI,CAAC,CAAC;QAAE,OAAO,WAAW,CAAC,WAAW,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACtC,OAAO,GAAG,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC;AACzC,CAAC;AAED,uDAAuD;AACvD,SAAgB,gBAAgB,CAAC,IAAwB;IACvD,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACvC,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrB,OAAO,CAAC,CAAC,CAAC,CAAC;SACR,KAAK,CAAC,GAAG,CAAC;SACV,KAAK,CAAC,CAAC,CAAC;SACR,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,WAAW,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { EmptyStructStrategy, GoStruct, GoSliceTypeAliasMap, GoTypeAliasMap, WriteMode } from './types';
2
+ /**
3
+ * Writes or appends generated TypeBox for `sortedStructs` to `outputFile` according to `mode`.
4
+ * In append mode, skips structs already present and merges imports when needed.
5
+ */
6
+ export declare function writeOutputFile(params: {
7
+ outputFile: string;
8
+ sortedStructs: GoStruct[];
9
+ structMap: Map<string, GoStruct>;
10
+ typeAliases?: GoTypeAliasMap;
11
+ sliceTypeAliases?: GoSliceTypeAliasMap;
12
+ mode: WriteMode;
13
+ emptyStructStrategy: EmptyStructStrategy;
14
+ warn?: (msg: string) => void;
15
+ }): void;
16
+ //# sourceMappingURL=writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../src/writer.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,mBAAmB,EACnB,QAAQ,EACR,mBAAmB,EACnB,cAAc,EACd,SAAS,EACV,MAAM,SAAS,CAAC;AAsCjB;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,QAAQ,EAAE,CAAC;IAC1B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,cAAc,CAAC;IAC7B,gBAAgB,CAAC,EAAE,mBAAmB,CAAC;IACvC,IAAI,EAAE,SAAS,CAAC;IAChB,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B,GAAG,IAAI,CAoDP"}