justus 0.0.1 → 0.0.5

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,158 @@
1
+ // src/dts-generator.ts
2
+ import ts from "typescript";
3
+ import {
4
+ AllOfValidator,
5
+ AnyArrayValidator,
6
+ AnyNumberValidator,
7
+ AnyObjectValidator,
8
+ AnyStringValidator,
9
+ AnyValidator,
10
+ ArrayValidator,
11
+ assertSchema,
12
+ BooleanValidator,
13
+ ConstantValidator,
14
+ DateValidator,
15
+ getValidator,
16
+ NumberValidator,
17
+ ObjectValidator,
18
+ OneOfValidator,
19
+ StringValidator,
20
+ TupleValidator,
21
+ URLValidator,
22
+ Validator
23
+ } from "./index.mjs";
24
+ var generators = /* @__PURE__ */ new Map();
25
+ function registerTypeGenerator(validator, generator) {
26
+ assertSchema(validator.prototype instanceof Validator, "Not a `Validator` class");
27
+ generators.set(validator, generator);
28
+ }
29
+ function generateTypes(validations) {
30
+ const validators = /* @__PURE__ */ new Map();
31
+ const references = /* @__PURE__ */ new Map();
32
+ Object.entries(validations).forEach(([name, validation]) => {
33
+ const validator = getValidator(validation);
34
+ if (!references.has(validator))
35
+ references.set(validator, name);
36
+ validators.set(name, validator);
37
+ });
38
+ const types = [];
39
+ for (const [name, validator] of validators.entries()) {
40
+ const referenceable = new Map(references);
41
+ if (referenceable.get(validator) === name) {
42
+ referenceable.delete(validator);
43
+ }
44
+ const type = generateTypeNode(validator, referenceable);
45
+ const modifiers = [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)];
46
+ const decl = ts.factory.createTypeAliasDeclaration(void 0, modifiers, name, [], type);
47
+ types.push(decl);
48
+ }
49
+ return ts.createPrinter().printList(ts.ListFormat.SourceFileStatements, ts.factory.createNodeArray(types), ts.createSourceFile("types.d.ts", "", ts.ScriptTarget.Latest));
50
+ }
51
+ function generateTypeNode(validator, references) {
52
+ const reference = references.get(validator);
53
+ if (reference)
54
+ return ts.factory.createTypeReferenceNode(reference);
55
+ const generator = generators.get(validator.constructor);
56
+ assertSchema(!!generator, `Type generator for "${validator.constructor.name}" not found`);
57
+ return generator(validator, references);
58
+ }
59
+ var anyType = ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword);
60
+ var anyArrayType = ts.factory.createArrayTypeNode(anyType);
61
+ var booleanType = ts.factory.createKeywordTypeNode(ts.SyntaxKind.BooleanKeyword);
62
+ var numberType = ts.factory.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword);
63
+ var neverType = ts.factory.createKeywordTypeNode(ts.SyntaxKind.NeverKeyword);
64
+ var stringType = ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword);
65
+ var recordType = ts.factory.createMappedTypeNode(void 0, ts.factory.createTypeParameterDeclaration("key", stringType), void 0, void 0, anyType, void 0);
66
+ var readonlyKeyword = [ts.factory.createModifier(ts.SyntaxKind.ReadonlyKeyword)];
67
+ var optionalKeyword = ts.factory.createToken(ts.SyntaxKind.QuestionToken);
68
+ registerTypeGenerator(AnyValidator, () => anyType);
69
+ registerTypeGenerator(AnyArrayValidator, () => anyArrayType);
70
+ registerTypeGenerator(AnyNumberValidator, () => numberType);
71
+ registerTypeGenerator(AnyObjectValidator, () => recordType);
72
+ registerTypeGenerator(AnyStringValidator, () => stringType);
73
+ registerTypeGenerator(BooleanValidator, () => booleanType);
74
+ registerTypeGenerator(DateValidator, () => ts.factory.createTypeReferenceNode("Date"));
75
+ registerTypeGenerator(URLValidator, () => ts.factory.createTypeReferenceNode("URL"));
76
+ registerTypeGenerator(ArrayValidator, (validator, references) => {
77
+ const itemType = generateTypeNode(validator.items, references);
78
+ return ts.factory.createArrayTypeNode(itemType);
79
+ });
80
+ registerTypeGenerator(ConstantValidator, (validator) => {
81
+ const literal = typeof validator.constant === "number" ? ts.factory.createNumericLiteral(validator.constant) : typeof validator.constant === "string" ? ts.factory.createStringLiteral(validator.constant) : validator.constant === false ? ts.factory.createFalse() : validator.constant === true ? ts.factory.createTrue() : validator.constant === null ? ts.factory.createNull() : void 0;
82
+ assertSchema(!!literal, `Invalid constant "${validator.constant}"`);
83
+ return ts.factory.createLiteralTypeNode(literal);
84
+ });
85
+ registerTypeGenerator(NumberValidator, (validator) => {
86
+ if (!validator.brand)
87
+ return numberType;
88
+ const signature = ts.factory.createPropertySignature(void 0, `__brand_${validator.brand}`, void 0, neverType);
89
+ const literal = ts.factory.createTypeLiteralNode([signature]);
90
+ return ts.factory.createIntersectionTypeNode([numberType, literal]);
91
+ });
92
+ registerTypeGenerator(StringValidator, (validator) => {
93
+ if (!validator.brand)
94
+ return stringType;
95
+ const signature = ts.factory.createPropertySignature(void 0, `__brand_${validator.brand}`, void 0, neverType);
96
+ const literal = ts.factory.createTypeLiteralNode([signature]);
97
+ return ts.factory.createIntersectionTypeNode([stringType, literal]);
98
+ });
99
+ registerTypeGenerator(TupleValidator, (validator, references) => {
100
+ const members = validator.members;
101
+ const { count, first, next } = members.reduce(({ count: count2, first: first2, next: next2 }, { single }, i) => {
102
+ if (!single) {
103
+ if (i < first2)
104
+ first2 = i;
105
+ next2 = i + 1;
106
+ count2 += 1;
107
+ }
108
+ return { count: count2, first: first2, next: next2 };
109
+ }, { count: 0, first: members.length, next: -1 });
110
+ if (count < 2) {
111
+ const types2 = members.map(({ single, validator: validator2 }) => {
112
+ const memberType = generateTypeNode(validator2, references);
113
+ if (single)
114
+ return generateTypeNode(validator2, references);
115
+ const arrayType = ts.factory.createArrayTypeNode(memberType);
116
+ return ts.factory.createRestTypeNode(arrayType);
117
+ });
118
+ return ts.factory.createTupleTypeNode(types2);
119
+ }
120
+ const before = members.slice(0, first).map(({ validator: validator2 }) => generateTypeNode(validator2, references));
121
+ const types = members.slice(first, next).map(({ validator: validator2 }) => generateTypeNode(validator2, references));
122
+ const after = members.slice(next).map(({ validator: validator2 }) => generateTypeNode(validator2, references));
123
+ const union = ts.factory.createUnionTypeNode(types);
124
+ const array = ts.factory.createArrayTypeNode(union);
125
+ const rest = ts.factory.createRestTypeNode(array);
126
+ return ts.factory.createTupleTypeNode([...before, rest, ...after]);
127
+ });
128
+ registerTypeGenerator(AllOfValidator, (validator, references) => {
129
+ const members = validator.validators.map((validator2) => generateTypeNode(validator2, references));
130
+ return ts.factory.createIntersectionTypeNode(members);
131
+ });
132
+ registerTypeGenerator(OneOfValidator, (validator, references) => {
133
+ const members = validator.validators.map((validator2) => generateTypeNode(validator2, references));
134
+ return ts.factory.createUnionTypeNode(members);
135
+ });
136
+ registerTypeGenerator(ObjectValidator, (validator, references) => {
137
+ const properties = [];
138
+ for (const [key, property] of validator.properties.entries()) {
139
+ const { validator: validator2, readonly, optional } = property || { optional: true };
140
+ const type = validator2 ? generateTypeNode(validator2, references) : neverType;
141
+ const signature = ts.factory.createPropertySignature(readonly ? readonlyKeyword : void 0, key, optional ? optionalKeyword : void 0, type);
142
+ properties.push(signature);
143
+ }
144
+ if (validator.additionalProperties) {
145
+ const extra = ts.factory.createMappedTypeNode(void 0, ts.factory.createTypeParameterDeclaration("key", stringType), void 0, void 0, generateTypeNode(validator.additionalProperties, references), void 0);
146
+ if (properties.length == 0)
147
+ return extra;
148
+ const type = ts.factory.createTypeLiteralNode(properties);
149
+ return ts.factory.createIntersectionTypeNode([type, extra]);
150
+ } else {
151
+ return ts.factory.createTypeLiteralNode(properties);
152
+ }
153
+ });
154
+ export {
155
+ generateTypes,
156
+ registerTypeGenerator
157
+ };
158
+ //# sourceMappingURL=dts-generator.mjs.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/dts-generator.ts"],
4
+ "mappings": "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",
5
+ "names": []
6
+ }