osury 0.17.1 → 0.17.3

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/README.md CHANGED
@@ -158,9 +158,11 @@ The library uses **sury-ppx** for code-first approach — `@schema` annotation a
158
158
 
159
159
  ## Demo Playground
160
160
 
161
- This repository includes a local demo website for codegen exploration.
161
+ Try it online: **[osury-production.up.railway.app](https://osury-production.up.railway.app/)**
162
162
 
163
- ### Run demo
163
+ This repository also includes a local demo for development:
164
+
165
+ ### Run locally
164
166
 
165
167
  ```bash
166
168
  npm run demo
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "osury",
3
3
  "type": "module",
4
4
  "description": "Generate ReScript types with Sury schemas from OpenAPI specifications",
5
- "version": "0.17.1",
5
+ "version": "0.17.3",
6
6
  "license": "MIT",
7
7
  "bin": {
8
8
  "osury": "bin/osury.mjs"
@@ -10,6 +10,10 @@
10
10
  "files": [
11
11
  "bin/",
12
12
  "src/Codegen.res.mjs",
13
+ "src/CodegenHelpers.res.mjs",
14
+ "src/CodegenShims.res.mjs",
15
+ "src/CodegenTransforms.res.mjs",
16
+ "src/CodegenTypes.res.mjs",
13
17
  "src/Errors.res.mjs",
14
18
  "src/OpenAPIParser.res.mjs",
15
19
  "src/Schema.res.mjs",
@@ -0,0 +1,201 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+
4
+ let reservedKeywords = [
5
+ "type",
6
+ "let",
7
+ "rec",
8
+ "and",
9
+ "as",
10
+ "open",
11
+ "include",
12
+ "module",
13
+ "sig",
14
+ "struct",
15
+ "exception",
16
+ "external",
17
+ "if",
18
+ "else",
19
+ "switch",
20
+ "while",
21
+ "for",
22
+ "try",
23
+ "catch",
24
+ "when",
25
+ "true",
26
+ "false",
27
+ "assert",
28
+ "lazy",
29
+ "constraint",
30
+ "functor",
31
+ "class",
32
+ "method",
33
+ "object",
34
+ "private",
35
+ "public",
36
+ "virtual",
37
+ "mutable",
38
+ "new",
39
+ "inherit",
40
+ "initializer",
41
+ "val",
42
+ "with",
43
+ "match",
44
+ "of",
45
+ "fun",
46
+ "function",
47
+ "in",
48
+ "do",
49
+ "done",
50
+ "begin",
51
+ "end",
52
+ "then",
53
+ "to",
54
+ "downto",
55
+ "or",
56
+ "land",
57
+ "lor",
58
+ "lxor",
59
+ "lsl",
60
+ "lsr",
61
+ "asr",
62
+ "mod",
63
+ "await",
64
+ "async"
65
+ ];
66
+
67
+ function isReservedKeyword(name) {
68
+ return reservedKeywords.includes(name);
69
+ }
70
+
71
+ function lcFirst(s) {
72
+ if (s.length === 0) {
73
+ return s;
74
+ }
75
+ let first = s.charAt(0).toLowerCase();
76
+ let rest = s.slice(1);
77
+ return first + rest;
78
+ }
79
+
80
+ function ucFirst(s) {
81
+ if (s.length === 0) {
82
+ return s;
83
+ }
84
+ let first = s.charAt(0).toUpperCase();
85
+ let rest = s.slice(1);
86
+ return first + rest;
87
+ }
88
+
89
+ function isOptionalType(schema) {
90
+ if (typeof schema !== "object") {
91
+ return false;
92
+ }
93
+ switch (schema._tag) {
94
+ case "Optional" :
95
+ case "Nullable" :
96
+ return true;
97
+ default:
98
+ return false;
99
+ }
100
+ }
101
+
102
+ function isNullableType(schema) {
103
+ if (typeof schema !== "object") {
104
+ return false;
105
+ } else {
106
+ return schema._tag === "Nullable";
107
+ }
108
+ }
109
+
110
+ function getTagForType(t) {
111
+ if (typeof t !== "object") {
112
+ switch (t) {
113
+ case "String" :
114
+ return "String";
115
+ case "Number" :
116
+ return "Float";
117
+ case "Integer" :
118
+ return "Int";
119
+ case "Boolean" :
120
+ return "Bool";
121
+ case "Null" :
122
+ return "Null";
123
+ }
124
+ } else {
125
+ switch (t._tag) {
126
+ case "Optional" :
127
+ return `Option` + getTagForType(t._0);
128
+ case "Nullable" :
129
+ return `Null` + getTagForType(t._0);
130
+ case "Object" :
131
+ return "Object";
132
+ case "Array" :
133
+ return `Array` + getTagForType(t._0);
134
+ case "Ref" :
135
+ return ucFirst(t._0);
136
+ case "Enum" :
137
+ return "Enum";
138
+ case "PolyVariant" :
139
+ return "Variant";
140
+ case "Dict" :
141
+ return "Dict";
142
+ case "Union" :
143
+ return "Union";
144
+ }
145
+ }
146
+ }
147
+
148
+ function hasUnion(_schema) {
149
+ while (true) {
150
+ let schema = _schema;
151
+ if (typeof schema !== "object") {
152
+ return false;
153
+ }
154
+ switch (schema._tag) {
155
+ case "Object" :
156
+ return schema._0.some(f => hasUnion(f.type));
157
+ case "PolyVariant" :
158
+ return schema._0.some(c => hasUnion(c.payload));
159
+ case "Optional" :
160
+ case "Nullable" :
161
+ case "Array" :
162
+ case "Dict" :
163
+ _schema = schema._0;
164
+ continue;
165
+ case "Union" :
166
+ return true;
167
+ default:
168
+ return false;
169
+ }
170
+ };
171
+ }
172
+
173
+ function isPrimitiveOnlyUnion(types) {
174
+ return types.every(t => {
175
+ if (typeof t === "object") {
176
+ return false;
177
+ }
178
+ switch (t) {
179
+ case "String" :
180
+ case "Number" :
181
+ case "Integer" :
182
+ case "Boolean" :
183
+ return true;
184
+ default:
185
+ return false;
186
+ }
187
+ });
188
+ }
189
+
190
+ export {
191
+ reservedKeywords,
192
+ isReservedKeyword,
193
+ lcFirst,
194
+ ucFirst,
195
+ isOptionalType,
196
+ isNullableType,
197
+ getTagForType,
198
+ hasUnion,
199
+ isPrimitiveOnlyUnion,
200
+ }
201
+ /* No side effect */
@@ -0,0 +1,37 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+
4
+ function generateDictShim() {
5
+ return `// Generated by osury - Dict type shim for @genType
6
+ export type t<T> = { [key: string]: T };
7
+ `;
8
+ }
9
+
10
+ function generateNullableShim() {
11
+ return `/**
12
+ * Type shim for ReScript Nullable.t
13
+ *
14
+ * This file is generated by osury (not by ReScript/genType).
15
+ * It maps ReScript's option<T> to TypeScript's T | null for JSON nullable fields.
16
+ *
17
+ * ReScript side: Nullable.t<T> = option<T> (works with sury's S.null schema)
18
+ * TypeScript side: t<T> = T | null (correct JSON null representation)
19
+ */
20
+ export type t<T> = T | null;
21
+ `;
22
+ }
23
+
24
+ function generateNullableModule() {
25
+ return `// Generated by osury - Nullable type for JSON null values
26
+ // This is option<T> internally but maps to T | null in TypeScript via shim
27
+ @genType.import(("./Nullable.shim.ts", "t"))
28
+ type t<'a> = option<'a>
29
+ `;
30
+ }
31
+
32
+ export {
33
+ generateDictShim,
34
+ generateNullableShim,
35
+ generateNullableModule,
36
+ }
37
+ /* No side effect */
@@ -0,0 +1,420 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Core__Array from "@rescript/core/src/Core__Array.res.mjs";
4
+ import * as Core__Option from "@rescript/core/src/Core__Option.res.mjs";
5
+ import * as CodegenHelpers from "./CodegenHelpers.res.mjs";
6
+
7
+ function isRefPlusDictUnion(types) {
8
+ if (types.length !== 2) {
9
+ return;
10
+ }
11
+ let hasDict = types.some(t => {
12
+ if (typeof t !== "object") {
13
+ return false;
14
+ }
15
+ if (t._tag !== "Dict") {
16
+ return false;
17
+ }
18
+ let tmp = t._0;
19
+ if (typeof tmp !== "object") {
20
+ return tmp === "String";
21
+ } else {
22
+ return false;
23
+ }
24
+ });
25
+ let refName = Core__Array.findMap(types, t => {
26
+ if (typeof t !== "object" || t._tag !== "Ref") {
27
+ return;
28
+ } else {
29
+ return t._0;
30
+ }
31
+ });
32
+ if (hasDict) {
33
+ return refName;
34
+ }
35
+ }
36
+
37
+ function isPrimitivePlusDictUnion(types) {
38
+ if (types.length !== 2) {
39
+ return;
40
+ }
41
+ let hasDict = types.some(t => {
42
+ if (typeof t !== "object") {
43
+ return false;
44
+ }
45
+ if (t._tag !== "Dict") {
46
+ return false;
47
+ }
48
+ let tmp = t._0;
49
+ if (typeof tmp !== "object") {
50
+ return tmp === "String";
51
+ } else {
52
+ return false;
53
+ }
54
+ });
55
+ let primitiveName = Core__Array.findMap(types, t => {
56
+ if (typeof t === "object") {
57
+ return;
58
+ }
59
+ switch (t) {
60
+ case "String" :
61
+ return "string";
62
+ case "Number" :
63
+ return "float";
64
+ case "Integer" :
65
+ return "int";
66
+ case "Boolean" :
67
+ return "bool";
68
+ default:
69
+ return;
70
+ }
71
+ });
72
+ if (hasDict) {
73
+ return primitiveName;
74
+ }
75
+ }
76
+
77
+ function getUnionName(types) {
78
+ let names = types.map(t => {
79
+ if (typeof t !== "object") {
80
+ switch (t) {
81
+ case "String" :
82
+ return "string";
83
+ case "Number" :
84
+ return "float";
85
+ case "Integer" :
86
+ return "int";
87
+ case "Boolean" :
88
+ return "bool";
89
+ case "Null" :
90
+ return "null";
91
+ }
92
+ } else {
93
+ switch (t._tag) {
94
+ case "Array" :
95
+ return "array";
96
+ case "Ref" :
97
+ return CodegenHelpers.lcFirst(t._0);
98
+ case "Dict" :
99
+ return "dict";
100
+ default:
101
+ return "unknown";
102
+ }
103
+ }
104
+ });
105
+ if (names.length === 0) {
106
+ return "emptyUnion";
107
+ }
108
+ let first = Core__Option.getOr(names[0], "unknown");
109
+ let rest = names.slice(1);
110
+ return first + rest.map(n => "Or" + CodegenHelpers.ucFirst(n)).join("");
111
+ }
112
+
113
+ function extractUnionsFromType(_schema) {
114
+ while (true) {
115
+ let schema = _schema;
116
+ if (typeof schema !== "object") {
117
+ return [];
118
+ }
119
+ switch (schema._tag) {
120
+ case "Object" :
121
+ return schema._0.flatMap(field => extractUnionsFromType(field.type));
122
+ case "Optional" :
123
+ case "Nullable" :
124
+ case "Array" :
125
+ case "Dict" :
126
+ _schema = schema._0;
127
+ continue;
128
+ case "Union" :
129
+ let types = schema._0;
130
+ let match = isRefPlusDictUnion(types);
131
+ if (match !== undefined) {
132
+ return [];
133
+ }
134
+ let name = getUnionName(types);
135
+ return [{
136
+ name: name,
137
+ schema: schema
138
+ }];
139
+ default:
140
+ return [];
141
+ }
142
+ };
143
+ }
144
+
145
+ function extractUnions(_parentName, schema) {
146
+ if (typeof schema !== "object") {
147
+ return [];
148
+ } else if (schema._tag === "Object") {
149
+ return schema._0.flatMap(field => extractUnionsFromType(field.type));
150
+ } else {
151
+ return [];
152
+ }
153
+ }
154
+
155
+ function replaceUnionInType(schema) {
156
+ if (typeof schema !== "object") {
157
+ return schema;
158
+ }
159
+ switch (schema._tag) {
160
+ case "Optional" :
161
+ return {
162
+ _tag: "Optional",
163
+ _0: replaceUnionInType(schema._0)
164
+ };
165
+ case "Nullable" :
166
+ return {
167
+ _tag: "Nullable",
168
+ _0: replaceUnionInType(schema._0)
169
+ };
170
+ case "Object" :
171
+ let newFields = schema._0.map(field => {
172
+ let newType = replaceUnionInType(field.type);
173
+ return {
174
+ name: field.name,
175
+ type: newType,
176
+ required: field.required
177
+ };
178
+ });
179
+ return {
180
+ _tag: "Object",
181
+ _0: newFields
182
+ };
183
+ case "Array" :
184
+ return {
185
+ _tag: "Array",
186
+ _0: replaceUnionInType(schema._0)
187
+ };
188
+ case "Dict" :
189
+ return {
190
+ _tag: "Dict",
191
+ _0: replaceUnionInType(schema._0)
192
+ };
193
+ case "Union" :
194
+ let types = schema._0;
195
+ let refName = isRefPlusDictUnion(types);
196
+ if (refName !== undefined) {
197
+ return {
198
+ _tag: "Ref",
199
+ _0: refName
200
+ };
201
+ } else {
202
+ return {
203
+ _tag: "Ref",
204
+ _0: getUnionName(types)
205
+ };
206
+ }
207
+ default:
208
+ return schema;
209
+ }
210
+ }
211
+
212
+ function replaceUnions(_parentName, schema) {
213
+ if (typeof schema !== "object") {
214
+ return schema;
215
+ }
216
+ if (schema._tag !== "Object") {
217
+ return schema;
218
+ }
219
+ let newFields = schema._0.map(field => {
220
+ let newType = replaceUnionInType(field.type);
221
+ return {
222
+ name: field.name,
223
+ type: newType,
224
+ required: field.required
225
+ };
226
+ });
227
+ return {
228
+ _tag: "Object",
229
+ _0: newFields
230
+ };
231
+ }
232
+
233
+ function getDependencies(_schema) {
234
+ while (true) {
235
+ let schema = _schema;
236
+ if (typeof schema !== "object") {
237
+ return [];
238
+ }
239
+ switch (schema._tag) {
240
+ case "Object" :
241
+ return schema._0.flatMap(f => getDependencies(f.type));
242
+ case "Ref" :
243
+ return [schema._0];
244
+ case "Enum" :
245
+ return [];
246
+ case "PolyVariant" :
247
+ return schema._0.flatMap(c => getDependencies(c.payload));
248
+ case "Optional" :
249
+ case "Nullable" :
250
+ case "Array" :
251
+ case "Dict" :
252
+ _schema = schema._0;
253
+ continue;
254
+ case "Union" :
255
+ return schema._0.flatMap(getDependencies);
256
+ }
257
+ };
258
+ }
259
+
260
+ function topologicalSort(schemas) {
261
+ let schemaMap = {};
262
+ schemas.forEach(s => {
263
+ schemaMap[s.name] = s;
264
+ });
265
+ let deps = {};
266
+ schemas.forEach(s => {
267
+ let refNames = getDependencies(s.schema);
268
+ let validRefs = refNames.filter(name => Core__Option.isSome(schemaMap[name]));
269
+ deps[s.name] = validRefs;
270
+ });
271
+ let outDegree = {};
272
+ schemas.forEach(s => {
273
+ let myDeps = Core__Option.getOr(deps[s.name], []);
274
+ outDegree[s.name] = myDeps.length;
275
+ });
276
+ let reverseDeps = {};
277
+ schemas.forEach(s => {
278
+ reverseDeps[s.name] = [];
279
+ });
280
+ Object.entries(deps).forEach(param => {
281
+ let name = param[0];
282
+ param[1].forEach(refName => {
283
+ let arr = reverseDeps[refName];
284
+ if (arr !== undefined) {
285
+ arr.push(name);
286
+ return;
287
+ }
288
+ });
289
+ });
290
+ let queue = schemas.filter(s => Core__Option.getOr(outDegree[s.name], 0) === 0).map(s => s.name);
291
+ let result = [];
292
+ let visited = {};
293
+ let process = () => {
294
+ while (true) {
295
+ let name = queue.shift();
296
+ if (name === undefined) {
297
+ return;
298
+ }
299
+ if (Core__Option.isNone(visited[name])) {
300
+ visited[name] = true;
301
+ let schema = schemaMap[name];
302
+ if (schema !== undefined) {
303
+ result.push(schema);
304
+ }
305
+ let dependents = reverseDeps[name];
306
+ if (dependents !== undefined) {
307
+ dependents.forEach(depName => {
308
+ let current = Core__Option.getOr(outDegree[depName], 0);
309
+ outDegree[depName] = current - 1 | 0;
310
+ if ((current - 1 | 0) === 0) {
311
+ queue.push(depName);
312
+ return;
313
+ }
314
+ });
315
+ }
316
+ }
317
+ continue;
318
+ };
319
+ };
320
+ process();
321
+ schemas.forEach(s => {
322
+ if (Core__Option.isNone(visited[s.name])) {
323
+ result.push(s);
324
+ return;
325
+ }
326
+ });
327
+ return result;
328
+ }
329
+
330
+ function buildSkipSchemaSet(schemas) {
331
+ let skipSet = {};
332
+ schemas.forEach(s => {
333
+ if (CodegenHelpers.hasUnion(s.schema)) {
334
+ skipSet[s.name] = true;
335
+ return;
336
+ }
337
+ });
338
+ let changed = {
339
+ contents: true
340
+ };
341
+ while (changed.contents) {
342
+ changed.contents = false;
343
+ schemas.forEach(s => {
344
+ if (!Core__Option.isNone(skipSet[s.name])) {
345
+ return;
346
+ }
347
+ let refs = getDependencies(s.schema);
348
+ let refsSkipSchema = refs.some(refName => Core__Option.isSome(skipSet[refName]));
349
+ if (refsSkipSchema) {
350
+ skipSet[s.name] = true;
351
+ changed.contents = true;
352
+ return;
353
+ }
354
+ });
355
+ };
356
+ return skipSet;
357
+ }
358
+
359
+ function collectUnionWarnings(schemas) {
360
+ let seen = {};
361
+ let warnings = [];
362
+ let findUnions = _schema => {
363
+ while (true) {
364
+ let schema = _schema;
365
+ if (typeof schema !== "object") {
366
+ return [];
367
+ }
368
+ switch (schema._tag) {
369
+ case "Object" :
370
+ return schema._0.flatMap(f => findUnions(f.type));
371
+ case "Optional" :
372
+ case "Nullable" :
373
+ case "Array" :
374
+ case "Dict" :
375
+ _schema = schema._0;
376
+ continue;
377
+ case "Union" :
378
+ return [schema._0];
379
+ default:
380
+ return [];
381
+ }
382
+ };
383
+ };
384
+ schemas.forEach(s => {
385
+ let unions = findUnions(s.schema);
386
+ unions.forEach(types => {
387
+ let unionName = getUnionName(types);
388
+ if (!Core__Option.isNone(seen[unionName])) {
389
+ return;
390
+ }
391
+ seen[unionName] = true;
392
+ let refName = isRefPlusDictUnion(types);
393
+ if (refName !== undefined) {
394
+ warnings.push(`⚠ ` + unionName + `: anyOf without discriminator, simplified to ` + CodegenHelpers.lcFirst(refName));
395
+ return;
396
+ }
397
+ let primName = isPrimitivePlusDictUnion(types);
398
+ if (primName !== undefined) {
399
+ warnings.push(`⚠ ` + unionName + `: anyOf [` + primName + `, Dict] without discriminator, @tag("_tag") may not work at runtime`);
400
+ return;
401
+ }
402
+ });
403
+ });
404
+ return warnings;
405
+ }
406
+
407
+ export {
408
+ isRefPlusDictUnion,
409
+ isPrimitivePlusDictUnion,
410
+ getUnionName,
411
+ extractUnions,
412
+ extractUnionsFromType,
413
+ replaceUnions,
414
+ replaceUnionInType,
415
+ getDependencies,
416
+ topologicalSort,
417
+ buildSkipSchemaSet,
418
+ collectUnionWarnings,
419
+ }
420
+ /* No side effect */
@@ -0,0 +1,165 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as CodegenHelpers from "./CodegenHelpers.res.mjs";
4
+
5
+ function generateType(schema) {
6
+ if (typeof schema !== "object") {
7
+ switch (schema) {
8
+ case "String" :
9
+ return "string";
10
+ case "Number" :
11
+ return "float";
12
+ case "Integer" :
13
+ return "int";
14
+ case "Boolean" :
15
+ return "bool";
16
+ case "Null" :
17
+ return "unit";
18
+ }
19
+ } else {
20
+ switch (schema._tag) {
21
+ case "Optional" :
22
+ return `option<` + generateType(schema._0) + `>`;
23
+ case "Nullable" :
24
+ return `Nullable.t<` + generateType(schema._0) + `>`;
25
+ case "Object" :
26
+ return generateRecord(schema._0);
27
+ case "Array" :
28
+ return `array<` + generateType(schema._0) + `>`;
29
+ case "Ref" :
30
+ return CodegenHelpers.lcFirst(schema._0);
31
+ case "Enum" :
32
+ let variants = schema._0.map(v => `#` + v).join(" | ");
33
+ return `[` + variants + `]`;
34
+ case "PolyVariant" :
35
+ return generatePolyVariant(schema._0);
36
+ case "Dict" :
37
+ return `Dict.t<` + generateType(schema._0) + `>`;
38
+ case "Union" :
39
+ return generateUnion(schema._0);
40
+ }
41
+ }
42
+ }
43
+
44
+ function generateRecord(fields) {
45
+ if (fields.length === 0) {
46
+ return "{}";
47
+ }
48
+ let fieldStrs = fields.map(field => {
49
+ let typeStr = generateType(field.type);
50
+ let optionalType = field.required || CodegenHelpers.isOptionalType(field.type) ? typeStr : `option<` + typeStr + `>`;
51
+ let finalType = CodegenHelpers.isNullableType(field.type) ? `@s.null ` + optionalType : optionalType;
52
+ let asAttr = CodegenHelpers.isReservedKeyword(field.name) ? `@as("` + field.name + `") ` : "";
53
+ let fieldName = CodegenHelpers.isReservedKeyword(field.name) ? field.name + `_` : field.name;
54
+ return asAttr + fieldName + `: ` + finalType;
55
+ });
56
+ return `{\n ` + fieldStrs.join(",\n ") + `\n}`;
57
+ }
58
+
59
+ function generatePolyVariant(cases) {
60
+ let caseStrs = cases.map(c => {
61
+ let payloadStr = generateType(c.payload);
62
+ return `#` + c._tag + `(` + payloadStr + `)`;
63
+ });
64
+ return `[` + caseStrs.join(" | ") + `]`;
65
+ }
66
+
67
+ function generateUnion(types) {
68
+ let caseStrs = types.map(t => {
69
+ let tag = CodegenHelpers.getTagForType(t);
70
+ let payload = generateType(t);
71
+ return `#` + tag + `(` + payload + `)`;
72
+ });
73
+ return `[` + caseStrs.join(" | ") + `]`;
74
+ }
75
+
76
+ function generateInlineRecord(refName, schemasDict) {
77
+ let other = schemasDict[refName];
78
+ if (other !== undefined) {
79
+ if (typeof other !== "object" || other._tag !== "Object") {
80
+ return generateType(other);
81
+ } else {
82
+ return generateRecord(other._0);
83
+ }
84
+ } else {
85
+ return CodegenHelpers.lcFirst(refName);
86
+ }
87
+ }
88
+
89
+ function generateInlineVariantBody(types, schemasDict, tagsDict) {
90
+ return types.map(t => {
91
+ if (typeof t === "object" && t._tag === "Ref") {
92
+ let name = t._0;
93
+ let tagValue = tagsDict[name];
94
+ let tag = tagValue !== undefined ? CodegenHelpers.ucFirst(tagValue) : CodegenHelpers.ucFirst(name);
95
+ let inlineRecord = generateInlineRecord(name, schemasDict);
96
+ return tag + `(` + inlineRecord + `)`;
97
+ }
98
+ let tag$1 = CodegenHelpers.getTagForType(t);
99
+ let payload = generateType(t);
100
+ return tag$1 + `(` + payload + `)`;
101
+ }).join(" | ");
102
+ }
103
+
104
+ function generateVariantBody(types) {
105
+ return types.map(t => {
106
+ let tag = CodegenHelpers.getTagForType(t);
107
+ let payload = generateType(t);
108
+ return tag + `(` + payload + `)`;
109
+ }).join(" | ");
110
+ }
111
+
112
+ function generateTypeDefWithSkipSet(namedSchema, _skipSet, schemasDict, tagsDict) {
113
+ let typeName = CodegenHelpers.lcFirst(namedSchema.name);
114
+ let types = namedSchema.schema;
115
+ if (typeof types === "object" && types._tag === "Union") {
116
+ let types$1 = types._0;
117
+ if (CodegenHelpers.isPrimitiveOnlyUnion(types$1)) {
118
+ let variantBody = generateVariantBody(types$1);
119
+ return `@genType
120
+ @tag("_tag")
121
+ @unboxed
122
+ @schema
123
+ type ` + typeName + ` = ` + variantBody;
124
+ }
125
+ let variantBody$1 = generateInlineVariantBody(types$1, schemasDict, tagsDict);
126
+ return `@genType
127
+ @tag("_tag")
128
+ @schema
129
+ type ` + typeName + ` = ` + variantBody$1;
130
+ }
131
+ let typeBody = generateType(namedSchema.schema);
132
+ return `@genType
133
+ @schema
134
+ type ` + typeName + ` = ` + typeBody;
135
+ }
136
+
137
+ function generateTypeDef(namedSchema) {
138
+ let typeName = CodegenHelpers.lcFirst(namedSchema.name);
139
+ let types = namedSchema.schema;
140
+ if (typeof types === "object" && types._tag === "Union") {
141
+ let variantBody = generateVariantBody(types._0);
142
+ return `@genType
143
+ @tag("_tag")
144
+ @unboxed
145
+ @schema
146
+ type ` + typeName + ` = ` + variantBody;
147
+ }
148
+ let annotations = CodegenHelpers.hasUnion(namedSchema.schema) ? "@genType" : "@genType\n@schema";
149
+ let typeBody = generateType(namedSchema.schema);
150
+ return annotations + `
151
+ type ` + typeName + ` = ` + typeBody;
152
+ }
153
+
154
+ export {
155
+ generateType,
156
+ generateRecord,
157
+ generatePolyVariant,
158
+ generateUnion,
159
+ generateInlineRecord,
160
+ generateInlineVariantBody,
161
+ generateVariantBody,
162
+ generateTypeDefWithSkipSet,
163
+ generateTypeDef,
164
+ }
165
+ /* No side effect */