osury 1.0.1 → 1.2.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.
@@ -1,794 +0,0 @@
1
- // Generated by ReScript, PLEASE EDIT WITH CARE
2
-
3
- import * as Errors from "./Errors.res.mjs";
4
- import * as Core__Array from "@rescript/core/src/Core__Array.res.mjs";
5
- import * as Core__Option from "@rescript/core/src/Core__Option.res.mjs";
6
- import * as CodegenHelpers from "./CodegenHelpers.res.mjs";
7
- import * as Primitive_object from "@rescript/runtime/lib/es6/Primitive_object.js";
8
-
9
- function collectEnumsFromType(parentType, fieldPath, _schema) {
10
- while (true) {
11
- let schema = _schema;
12
- if (typeof schema !== "object") {
13
- return [];
14
- }
15
- switch (schema._tag) {
16
- case "Object" :
17
- return schema._0.flatMap(f => collectEnumsFromType(parentType, fieldPath.concat([f.name]), f.type));
18
- case "Enum" :
19
- if (fieldPath.length > 0) {
20
- return [{
21
- parentType: parentType,
22
- fieldPath: fieldPath,
23
- values: schema._0
24
- }];
25
- } else {
26
- return [];
27
- }
28
- case "PolyVariant" :
29
- return schema._0.flatMap(c => collectEnumsFromType(parentType, fieldPath, c.payload));
30
- case "Optional" :
31
- case "Nullable" :
32
- case "Array" :
33
- case "Dict" :
34
- break;
35
- case "Union" :
36
- return schema._0.flatMap(t => collectEnumsFromType(parentType, fieldPath, t));
37
- default:
38
- return [];
39
- }
40
- _schema = schema._0;
41
- continue;
42
- };
43
- }
44
-
45
- function collectInlineEnums(schemas) {
46
- return schemas.flatMap(s => {
47
- let match = s.schema;
48
- if (typeof match !== "object") {
49
- return collectEnumsFromType(s.name, [], s.schema);
50
- } else if (match._tag === "Enum") {
51
- return [];
52
- } else {
53
- return collectEnumsFromType(s.name, [], s.schema);
54
- }
55
- });
56
- }
57
-
58
- function camelize(s) {
59
- let parts = s.replace(/-/g, "_").split("_").filter(p => p !== "");
60
- let first = parts[0];
61
- if (first === undefined) {
62
- return s;
63
- }
64
- let rest = parts.slice(1);
65
- return CodegenHelpers.lcFirst(first) + rest.map(CodegenHelpers.ucFirst).join("");
66
- }
67
-
68
- function occurrenceKey(occ) {
69
- return occ.parentType + "::" + occ.fieldPath.join("/");
70
- }
71
-
72
- function valuesCanonicalKey(values) {
73
- let cmp = (a, b) => {
74
- if (Primitive_object.lessthan(a, b)) {
75
- return -1.0;
76
- } else if (Primitive_object.greaterthan(a, b)) {
77
- return 1.0;
78
- } else {
79
- return 0.0;
80
- }
81
- };
82
- return values.toSorted(cmp).join("");
83
- }
84
-
85
- function leafFieldName(occ) {
86
- let s = occ.fieldPath[occ.fieldPath.length - 1 | 0];
87
- if (s !== undefined) {
88
- return s;
89
- } else {
90
- return "unknown";
91
- }
92
- }
93
-
94
- function replaceEnumsInType(parentType, fieldPath, names, schema) {
95
- if (typeof schema !== "object") {
96
- return schema;
97
- }
98
- switch (schema._tag) {
99
- case "Optional" :
100
- return {
101
- _tag: "Optional",
102
- _0: replaceEnumsInType(parentType, fieldPath, names, schema._0)
103
- };
104
- case "Nullable" :
105
- return {
106
- _tag: "Nullable",
107
- _0: replaceEnumsInType(parentType, fieldPath, names, schema._0)
108
- };
109
- case "Object" :
110
- return {
111
- _tag: "Object",
112
- _0: schema._0.map(f => {
113
- let newType = replaceEnumsInType(parentType, fieldPath.concat([f.name]), names, f.type);
114
- return {
115
- name: f.name,
116
- type: newType,
117
- required: f.required
118
- };
119
- })
120
- };
121
- case "Array" :
122
- return {
123
- _tag: "Array",
124
- _0: replaceEnumsInType(parentType, fieldPath, names, schema._0)
125
- };
126
- case "Enum" :
127
- if (fieldPath.length <= 0) {
128
- return schema;
129
- }
130
- let key = parentType + "::" + fieldPath.join("/");
131
- let name = names[key];
132
- if (name !== undefined) {
133
- return {
134
- _tag: "Ref",
135
- _0: CodegenHelpers.ucFirst(name)
136
- };
137
- } else {
138
- return schema;
139
- }
140
- case "PolyVariant" :
141
- return {
142
- _tag: "PolyVariant",
143
- _0: schema._0.map(c => {
144
- let payload = replaceEnumsInType(parentType, fieldPath, names, c.payload);
145
- return {
146
- _tag: c._tag,
147
- payload: payload
148
- };
149
- })
150
- };
151
- case "Dict" :
152
- return {
153
- _tag: "Dict",
154
- _0: replaceEnumsInType(parentType, fieldPath, names, schema._0)
155
- };
156
- case "Union" :
157
- return {
158
- _tag: "Union",
159
- _0: schema._0.map(t => replaceEnumsInType(parentType, fieldPath, names, t))
160
- };
161
- default:
162
- return schema;
163
- }
164
- }
165
-
166
- function replaceInlineEnums(schemas, names) {
167
- return schemas.map(s => {
168
- let match = s.schema;
169
- let newSchema;
170
- let exit = 0;
171
- if (typeof match !== "object" || match._tag !== "Enum") {
172
- exit = 1;
173
- } else {
174
- newSchema = s.schema;
175
- }
176
- if (exit === 1) {
177
- newSchema = replaceEnumsInType(s.name, [], names, s.schema);
178
- }
179
- return {
180
- name: s.name,
181
- schema: newSchema,
182
- discriminatorTag: s.discriminatorTag,
183
- discriminatorPropertyName: s.discriminatorPropertyName,
184
- fieldDiscriminators: s.fieldDiscriminators
185
- };
186
- });
187
- }
188
-
189
- function buildExtractedEnumSchemas(occurrences, names) {
190
- let seen = {};
191
- let result = [];
192
- occurrences.forEach(occ => {
193
- let key = occurrenceKey(occ);
194
- let name = names[key];
195
- if (name === undefined) {
196
- return;
197
- }
198
- let typeName = CodegenHelpers.ucFirst(name);
199
- if (Core__Option.isNone(seen[typeName])) {
200
- seen[typeName] = true;
201
- result.push({
202
- name: typeName,
203
- schema: {
204
- _tag: "Enum",
205
- _0: occ.values
206
- },
207
- discriminatorTag: undefined,
208
- discriminatorPropertyName: undefined,
209
- fieldDiscriminators: undefined
210
- });
211
- return;
212
- }
213
- });
214
- return result;
215
- }
216
-
217
- function resolveEnumNames(occurrences, topLevelNames) {
218
- let topLevelSet = {};
219
- topLevelNames.forEach(n => {
220
- topLevelSet[CodegenHelpers.lcFirst(n)] = true;
221
- });
222
- let buckets = {};
223
- occurrences.forEach(occ => {
224
- let leaf = leafFieldName(occ);
225
- let vKey = valuesCanonicalKey(occ.values);
226
- let set = buckets[leaf];
227
- if (set !== undefined) {
228
- set[vKey] = true;
229
- return;
230
- }
231
- let set$1 = {};
232
- set$1[vKey] = true;
233
- buckets[leaf] = set$1;
234
- });
235
- let result = {};
236
- occurrences.forEach(occ => {
237
- let leaf = leafFieldName(occ);
238
- let camelized = camelize(leaf);
239
- let distinctSets = Core__Option.mapOr(buckets[leaf], 1, set => Object.keys(set).length);
240
- let collidesTopLevel = Core__Option.isSome(topLevelSet[camelized]);
241
- let baseName = distinctSets > 1 || collidesTopLevel ? CodegenHelpers.lcFirst(occ.parentType) + CodegenHelpers.ucFirst(camelized) : camelized;
242
- let name = CodegenHelpers.isReservedKeyword(baseName) ? baseName + "_" : baseName;
243
- result[occurrenceKey(occ)] = name;
244
- });
245
- return result;
246
- }
247
-
248
- function isRefPlusDictUnion(types) {
249
- if (types.length !== 2) {
250
- return;
251
- }
252
- let hasDict = types.some(t => {
253
- if (typeof t !== "object") {
254
- return false;
255
- }
256
- if (t._tag !== "Dict") {
257
- return false;
258
- }
259
- let tmp = t._0;
260
- if (typeof tmp !== "object") {
261
- return tmp === "String";
262
- } else {
263
- return false;
264
- }
265
- });
266
- let refName = Core__Array.findMap(types, t => {
267
- if (typeof t !== "object" || t._tag !== "Ref") {
268
- return;
269
- } else {
270
- return t._0;
271
- }
272
- });
273
- if (hasDict) {
274
- return refName;
275
- }
276
- }
277
-
278
- function isPrimitivePlusDictUnion(types) {
279
- if (types.length !== 2) {
280
- return;
281
- }
282
- let hasDict = types.some(t => {
283
- if (typeof t !== "object") {
284
- return false;
285
- }
286
- if (t._tag !== "Dict") {
287
- return false;
288
- }
289
- let tmp = t._0;
290
- if (typeof tmp !== "object") {
291
- return tmp === "String";
292
- } else {
293
- return false;
294
- }
295
- });
296
- let primitiveName = Core__Array.findMap(types, t => {
297
- if (typeof t === "object") {
298
- return;
299
- }
300
- switch (t) {
301
- case "String" :
302
- return "string";
303
- case "Number" :
304
- return "float";
305
- case "Integer" :
306
- return "int";
307
- case "Boolean" :
308
- return "bool";
309
- default:
310
- return;
311
- }
312
- });
313
- if (hasDict) {
314
- return primitiveName;
315
- }
316
- }
317
-
318
- function getUnionName(types) {
319
- let names = types.map(t => {
320
- if (typeof t !== "object") {
321
- switch (t) {
322
- case "String" :
323
- return "string";
324
- case "Number" :
325
- return "float";
326
- case "Integer" :
327
- return "int";
328
- case "Boolean" :
329
- return "bool";
330
- case "Null" :
331
- return "null";
332
- default:
333
- return "unknown";
334
- }
335
- } else {
336
- switch (t._tag) {
337
- case "Array" :
338
- return "array";
339
- case "Ref" :
340
- return CodegenHelpers.lcFirst(t._0);
341
- case "Dict" :
342
- return "dict";
343
- default:
344
- return "unknown";
345
- }
346
- }
347
- });
348
- if (names.length === 0) {
349
- return "emptyUnion";
350
- }
351
- let first = Core__Option.getOr(names[0], "unknown");
352
- let rest = names.slice(1);
353
- return first + rest.map(n => "Or" + CodegenHelpers.ucFirst(n)).join("");
354
- }
355
-
356
- function getPolyVariantName(cases) {
357
- return getUnionName(cases.map(c => c.payload));
358
- }
359
-
360
- function extractUnionsFromType(_schema) {
361
- while (true) {
362
- let schema = _schema;
363
- if (typeof schema !== "object") {
364
- return [];
365
- }
366
- switch (schema._tag) {
367
- case "Object" :
368
- return schema._0.flatMap(field => extractUnionsFromType(field.type));
369
- case "PolyVariant" :
370
- let name = getPolyVariantName(schema._0);
371
- return [{
372
- name: name,
373
- schema: schema
374
- }];
375
- case "Optional" :
376
- case "Nullable" :
377
- case "Array" :
378
- case "Dict" :
379
- _schema = schema._0;
380
- continue;
381
- case "Union" :
382
- let types = schema._0;
383
- let match = isRefPlusDictUnion(types);
384
- if (match !== undefined) {
385
- return [];
386
- }
387
- let name$1 = getUnionName(types);
388
- return [{
389
- name: name$1,
390
- schema: schema
391
- }];
392
- default:
393
- return [];
394
- }
395
- };
396
- }
397
-
398
- function extractUnions(_parentName, schema) {
399
- if (typeof schema !== "object") {
400
- return [];
401
- } else if (schema._tag === "Object") {
402
- return schema._0.flatMap(field => extractUnionsFromType(field.type));
403
- } else {
404
- return [];
405
- }
406
- }
407
-
408
- function replaceUnionInType(schema) {
409
- if (typeof schema !== "object") {
410
- return schema;
411
- }
412
- switch (schema._tag) {
413
- case "Optional" :
414
- return {
415
- _tag: "Optional",
416
- _0: replaceUnionInType(schema._0)
417
- };
418
- case "Nullable" :
419
- return {
420
- _tag: "Nullable",
421
- _0: replaceUnionInType(schema._0)
422
- };
423
- case "Object" :
424
- let newFields = schema._0.map(field => {
425
- let newType = replaceUnionInType(field.type);
426
- return {
427
- name: field.name,
428
- type: newType,
429
- required: field.required
430
- };
431
- });
432
- return {
433
- _tag: "Object",
434
- _0: newFields
435
- };
436
- case "Array" :
437
- return {
438
- _tag: "Array",
439
- _0: replaceUnionInType(schema._0)
440
- };
441
- case "PolyVariant" :
442
- return {
443
- _tag: "Ref",
444
- _0: getPolyVariantName(schema._0)
445
- };
446
- case "Dict" :
447
- return {
448
- _tag: "Dict",
449
- _0: replaceUnionInType(schema._0)
450
- };
451
- case "Union" :
452
- let types = schema._0;
453
- let refName = isRefPlusDictUnion(types);
454
- if (refName !== undefined) {
455
- return {
456
- _tag: "Ref",
457
- _0: refName
458
- };
459
- } else {
460
- return {
461
- _tag: "Ref",
462
- _0: getUnionName(types)
463
- };
464
- }
465
- default:
466
- return schema;
467
- }
468
- }
469
-
470
- function replaceUnions(_parentName, schema) {
471
- if (typeof schema !== "object") {
472
- return schema;
473
- }
474
- if (schema._tag !== "Object") {
475
- return schema;
476
- }
477
- let newFields = schema._0.map(field => {
478
- let newType = replaceUnionInType(field.type);
479
- return {
480
- name: field.name,
481
- type: newType,
482
- required: field.required
483
- };
484
- });
485
- return {
486
- _tag: "Object",
487
- _0: newFields
488
- };
489
- }
490
-
491
- function getDependencies(_schema) {
492
- while (true) {
493
- let schema = _schema;
494
- if (typeof schema !== "object") {
495
- return [];
496
- }
497
- switch (schema._tag) {
498
- case "Object" :
499
- return schema._0.flatMap(f => getDependencies(f.type));
500
- case "Ref" :
501
- return [schema._0];
502
- case "Enum" :
503
- return [];
504
- case "PolyVariant" :
505
- return schema._0.flatMap(c => getDependencies(c.payload));
506
- case "Optional" :
507
- case "Nullable" :
508
- case "Array" :
509
- case "Dict" :
510
- _schema = schema._0;
511
- continue;
512
- case "Union" :
513
- return schema._0.flatMap(getDependencies);
514
- }
515
- };
516
- }
517
-
518
- function topologicalSort(schemas) {
519
- let schemaMap = {};
520
- schemas.forEach(s => {
521
- schemaMap[s.name] = s;
522
- });
523
- let deps = {};
524
- schemas.forEach(s => {
525
- let refNames = getDependencies(s.schema);
526
- let validRefs = refNames.filter(name => Core__Option.isSome(schemaMap[name]));
527
- deps[s.name] = validRefs;
528
- });
529
- let outDegree = {};
530
- schemas.forEach(s => {
531
- let myDeps = Core__Option.getOr(deps[s.name], []);
532
- outDegree[s.name] = myDeps.length;
533
- });
534
- let reverseDeps = {};
535
- schemas.forEach(s => {
536
- reverseDeps[s.name] = [];
537
- });
538
- Object.entries(deps).forEach(param => {
539
- let name = param[0];
540
- param[1].forEach(refName => {
541
- let arr = reverseDeps[refName];
542
- if (arr !== undefined) {
543
- arr.push(name);
544
- return;
545
- }
546
- });
547
- });
548
- let queue = schemas.filter(s => Core__Option.getOr(outDegree[s.name], 0) === 0).map(s => s.name);
549
- let result = [];
550
- let visited = {};
551
- let process = () => {
552
- while (true) {
553
- let name = queue.shift();
554
- if (name === undefined) {
555
- return;
556
- }
557
- if (Core__Option.isNone(visited[name])) {
558
- visited[name] = true;
559
- let schema = schemaMap[name];
560
- if (schema !== undefined) {
561
- result.push(schema);
562
- }
563
- let dependents = reverseDeps[name];
564
- if (dependents !== undefined) {
565
- dependents.forEach(depName => {
566
- let current = Core__Option.getOr(outDegree[depName], 0);
567
- outDegree[depName] = current - 1 | 0;
568
- if ((current - 1 | 0) === 0) {
569
- queue.push(depName);
570
- return;
571
- }
572
- });
573
- }
574
- }
575
- continue;
576
- };
577
- };
578
- process();
579
- schemas.forEach(s => {
580
- if (Core__Option.isNone(visited[s.name])) {
581
- result.push(s);
582
- return;
583
- }
584
- });
585
- return result;
586
- }
587
-
588
- function buildSkipSchemaSet(schemas) {
589
- let skipSet = {};
590
- schemas.forEach(s => {
591
- let types = s.schema;
592
- let hasInlineProblem;
593
- if (typeof types !== "object") {
594
- hasInlineProblem = CodegenHelpers.hasUnion(s.schema);
595
- } else {
596
- switch (types._tag) {
597
- case "PolyVariant" :
598
- hasInlineProblem = types._0.some(c => CodegenHelpers.hasUnion(c.payload));
599
- break;
600
- case "Union" :
601
- hasInlineProblem = types._0.some(CodegenHelpers.hasUnion);
602
- break;
603
- default:
604
- hasInlineProblem = CodegenHelpers.hasUnion(s.schema);
605
- }
606
- }
607
- if (hasInlineProblem) {
608
- skipSet[s.name] = true;
609
- return;
610
- }
611
- });
612
- let changed = {
613
- contents: true
614
- };
615
- while (changed.contents) {
616
- changed.contents = false;
617
- schemas.forEach(s => {
618
- if (!Core__Option.isNone(skipSet[s.name])) {
619
- return;
620
- }
621
- let refs = getDependencies(s.schema);
622
- let refsSkipSchema = refs.some(refName => Core__Option.isSome(skipSet[refName]));
623
- if (refsSkipSchema) {
624
- skipSet[s.name] = true;
625
- changed.contents = true;
626
- return;
627
- }
628
- });
629
- };
630
- return skipSet;
631
- }
632
-
633
- function collectUnionWarnings(schemas) {
634
- let seen = {};
635
- let warnings = [];
636
- let findUnions = _schema => {
637
- while (true) {
638
- let schema = _schema;
639
- if (typeof schema !== "object") {
640
- return [];
641
- }
642
- switch (schema._tag) {
643
- case "Object" :
644
- return schema._0.flatMap(f => findUnions(f.type));
645
- case "Optional" :
646
- case "Nullable" :
647
- case "Array" :
648
- case "Dict" :
649
- _schema = schema._0;
650
- continue;
651
- case "Union" :
652
- return [schema._0];
653
- default:
654
- return [];
655
- }
656
- };
657
- };
658
- schemas.forEach(s => {
659
- let unions = findUnions(s.schema);
660
- unions.forEach(types => {
661
- let unionName = getUnionName(types);
662
- if (!Core__Option.isNone(seen[unionName])) {
663
- return;
664
- }
665
- seen[unionName] = true;
666
- let refName = isRefPlusDictUnion(types);
667
- if (refName !== undefined) {
668
- warnings.push(`⚠ ` + unionName + `: anyOf without discriminator, simplified to ` + CodegenHelpers.lcFirst(refName));
669
- return;
670
- }
671
- let primName = isPrimitivePlusDictUnion(types);
672
- if (primName !== undefined) {
673
- warnings.push(`⚠ ` + unionName + `: anyOf [` + primName + `, Dict] without discriminator, @tag("_tag") may not work at runtime`);
674
- return;
675
- }
676
- });
677
- });
678
- return warnings;
679
- }
680
-
681
- function validateUnionDiscriminators(schemas) {
682
- let seen = {};
683
- let errors = [];
684
- let schemasDict = {};
685
- schemas.forEach(s => {
686
- schemasDict[s.name] = s.schema;
687
- });
688
- let tagsDict = {};
689
- schemas.forEach(s => {
690
- let tag = s.discriminatorTag;
691
- if (tag !== undefined) {
692
- tagsDict[s.name] = tag;
693
- return;
694
- }
695
- });
696
- let fieldDiscsDict = {};
697
- schemas.forEach(s => {
698
- let dict = s.fieldDiscriminators;
699
- if (dict !== undefined) {
700
- Object.entries(dict).forEach(param => {
701
- fieldDiscsDict[param[0]] = param[1];
702
- });
703
- return;
704
- }
705
- });
706
- let findUnions = _schema => {
707
- while (true) {
708
- let schema = _schema;
709
- if (typeof schema !== "object") {
710
- return [];
711
- }
712
- switch (schema._tag) {
713
- case "Object" :
714
- return schema._0.flatMap(f => findUnions(f.type));
715
- case "Optional" :
716
- case "Nullable" :
717
- case "Array" :
718
- case "Dict" :
719
- _schema = schema._0;
720
- continue;
721
- case "Union" :
722
- return [schema._0];
723
- default:
724
- return [];
725
- }
726
- };
727
- };
728
- schemas.forEach(s => {
729
- let unions = findUnions(s.schema);
730
- unions.forEach(types => {
731
- let unionName = getUnionName(types);
732
- if (!Core__Option.isNone(seen[unionName])) {
733
- return;
734
- }
735
- seen[unionName] = true;
736
- if (CodegenHelpers.isPrimitiveOnlyUnion(types)) {
737
- return;
738
- }
739
- let match = isRefPlusDictUnion(types);
740
- if (match !== undefined) {
741
- return;
742
- }
743
- let match$1 = isPrimitivePlusDictUnion(types);
744
- if (match$1 !== undefined) {
745
- return;
746
- }
747
- if (!Core__Option.isNone(fieldDiscsDict[unionName])) {
748
- return;
749
- }
750
- let allRefsHaveTags = types.every(t => {
751
- if (typeof t !== "object" || t._tag !== "Ref") {
752
- return true;
753
- } else {
754
- return Core__Option.isSome(tagsDict[t._0]);
755
- }
756
- });
757
- if (!allRefsHaveTags) {
758
- errors.push(Errors.makeError({
759
- TAG: "MissingDiscriminator",
760
- _0: unionName
761
- }, undefined, "Add discriminator: { propertyName: \"type\" } to the anyOf/oneOf schema, or use the _tag convention with const values", undefined));
762
- return;
763
- }
764
- });
765
- });
766
- return errors;
767
- }
768
-
769
- export {
770
- collectEnumsFromType,
771
- collectInlineEnums,
772
- camelize,
773
- occurrenceKey,
774
- valuesCanonicalKey,
775
- leafFieldName,
776
- replaceEnumsInType,
777
- replaceInlineEnums,
778
- buildExtractedEnumSchemas,
779
- resolveEnumNames,
780
- isRefPlusDictUnion,
781
- isPrimitivePlusDictUnion,
782
- getUnionName,
783
- getPolyVariantName,
784
- extractUnions,
785
- extractUnionsFromType,
786
- replaceUnions,
787
- replaceUnionInType,
788
- getDependencies,
789
- topologicalSort,
790
- buildSkipSchemaSet,
791
- collectUnionWarnings,
792
- validateUnionDiscriminators,
793
- }
794
- /* No side effect */