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.
- package/README.md +153 -34
- package/dist/dts-generator.js +166 -0
- package/dist/dts-generator.js.map +6 -0
- package/dist/dts-generator.mjs +158 -0
- package/dist/dts-generator.mjs.map +6 -0
- package/dist/{index.cjs → index.js} +246 -124
- package/dist/index.js.map +6 -0
- package/dist/index.mjs +218 -121
- package/dist/index.mjs.map +2 -2
- package/dts-generator.d.ts +13 -0
- package/{dist/index.d.ts → index.d.ts} +171 -40
- package/package.json +27 -16
- package/src/dts-generator.ts +276 -0
- package/src/errors.ts +3 -3
- package/src/index.ts +32 -8
- package/src/schema.ts +6 -6
- package/src/types.ts +15 -6
- package/src/validators/array.ts +14 -12
- package/src/validators/date.ts +3 -3
- package/src/validators/number.ts +54 -22
- package/src/validators/object.ts +67 -48
- package/src/validators/string.ts +25 -11
- package/src/validators/tuple.ts +17 -13
- package/src/validators/union.ts +3 -3
- package/src/validators/url.ts +140 -0
- package/dist/index.cjs.map +0 -6
|
@@ -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
|
+
}
|