effect-app 4.0.0-beta.6 → 4.0.0-beta.60
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/CHANGELOG.md +265 -0
- package/dist/Config.d.ts +7 -0
- package/dist/Config.d.ts.map +1 -0
- package/dist/Config.js +6 -0
- package/dist/ConfigProvider.d.ts +39 -0
- package/dist/ConfigProvider.d.ts.map +1 -0
- package/dist/ConfigProvider.js +42 -0
- package/dist/{ServiceMap.d.ts → Context.d.ts} +9 -12
- package/dist/Context.d.ts.map +1 -0
- package/dist/Context.js +87 -0
- package/dist/Effect.d.ts +8 -7
- package/dist/Effect.d.ts.map +1 -1
- package/dist/Effect.js +3 -2
- package/dist/Layer.d.ts +5 -4
- package/dist/Layer.d.ts.map +1 -1
- package/dist/Layer.js +1 -1
- package/dist/Operations.d.ts +51 -15
- package/dist/Operations.d.ts.map +1 -1
- package/dist/Pure.d.ts +2 -2
- package/dist/Pure.d.ts.map +1 -1
- package/dist/Pure.js +13 -13
- package/dist/Schema/Class.d.ts +39 -1
- package/dist/Schema/Class.d.ts.map +1 -1
- package/dist/Schema/Class.js +89 -12
- package/dist/Schema/SpecialJsonSchema.d.ts +40 -0
- package/dist/Schema/SpecialJsonSchema.d.ts.map +1 -0
- package/dist/Schema/SpecialJsonSchema.js +199 -0
- package/dist/Schema/SpecialOpenApi.d.ts +30 -0
- package/dist/Schema/SpecialOpenApi.d.ts.map +1 -0
- package/dist/Schema/SpecialOpenApi.js +120 -0
- package/dist/Schema/brand.d.ts +8 -5
- package/dist/Schema/brand.d.ts.map +1 -1
- package/dist/Schema/brand.js +1 -1
- package/dist/Schema/email.d.ts.map +1 -1
- package/dist/Schema/email.js +4 -3
- package/dist/Schema/ext.d.ts +142 -44
- package/dist/Schema/ext.d.ts.map +1 -1
- package/dist/Schema/ext.js +145 -35
- package/dist/Schema/moreStrings.d.ts.map +1 -1
- package/dist/Schema/moreStrings.js +6 -4
- package/dist/Schema/numbers.d.ts +8 -8
- package/dist/Schema/numbers.js +2 -2
- package/dist/Schema/phoneNumber.d.ts.map +1 -1
- package/dist/Schema/phoneNumber.js +3 -2
- package/dist/Schema.d.ts +21 -54
- package/dist/Schema.d.ts.map +1 -1
- package/dist/Schema.js +43 -64
- package/dist/client/apiClientFactory.d.ts +3 -3
- package/dist/client/apiClientFactory.d.ts.map +1 -1
- package/dist/client/apiClientFactory.js +12 -13
- package/dist/client/errors.d.ts +8 -0
- package/dist/client/errors.d.ts.map +1 -1
- package/dist/client/errors.js +35 -10
- package/dist/client/makeClient.d.ts +13 -12
- package/dist/client/makeClient.d.ts.map +1 -1
- package/dist/client/makeClient.js +5 -2
- package/dist/http/Request.d.ts.map +1 -1
- package/dist/http/Request.js +5 -5
- package/dist/ids.d.ts +1 -1
- package/dist/ids.d.ts.map +1 -1
- package/dist/ids.js +1 -1
- package/dist/index.d.ts +6 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -9
- package/dist/middleware.d.ts +2 -2
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +3 -3
- package/dist/rpc/MiddlewareMaker.d.ts +4 -3
- package/dist/rpc/MiddlewareMaker.d.ts.map +1 -1
- package/dist/rpc/MiddlewareMaker.js +6 -5
- package/dist/rpc/RpcContextMap.d.ts +2 -2
- package/dist/rpc/RpcContextMap.d.ts.map +1 -1
- package/dist/rpc/RpcContextMap.js +4 -4
- package/dist/rpc/RpcMiddleware.d.ts +4 -3
- package/dist/rpc/RpcMiddleware.d.ts.map +1 -1
- package/dist/rpc/RpcMiddleware.js +1 -1
- package/dist/utils/gen.d.ts +1 -1
- package/dist/utils/gen.d.ts.map +1 -1
- package/dist/utils/logger.d.ts +2 -2
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +3 -3
- package/dist/utils.d.ts +18 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +24 -5
- package/package.json +29 -17
- package/src/Config.ts +14 -0
- package/src/ConfigProvider.ts +48 -0
- package/src/{ServiceMap.ts → Context.ts} +16 -17
- package/src/Effect.ts +11 -9
- package/src/Layer.ts +5 -4
- package/src/Pure.ts +17 -18
- package/src/Schema/Class.ts +114 -16
- package/src/Schema/SpecialJsonSchema.ts +216 -0
- package/src/Schema/SpecialOpenApi.ts +126 -0
- package/src/Schema/brand.ts +13 -7
- package/src/Schema/email.ts +4 -2
- package/src/Schema/ext.ts +222 -57
- package/src/Schema/moreStrings.ts +10 -6
- package/src/Schema/numbers.ts +2 -2
- package/src/Schema/phoneNumber.ts +3 -1
- package/src/Schema.ts +79 -103
- package/src/client/apiClientFactory.ts +16 -19
- package/src/client/errors.ts +46 -12
- package/src/client/makeClient.ts +32 -12
- package/src/http/Request.ts +7 -4
- package/src/ids.ts +1 -1
- package/src/index.ts +6 -9
- package/src/middleware.ts +2 -2
- package/src/rpc/MiddlewareMaker.ts +7 -6
- package/src/rpc/RpcContextMap.ts +6 -5
- package/src/rpc/RpcMiddleware.ts +5 -4
- package/src/utils/gen.ts +1 -1
- package/src/utils/logger.ts +2 -2
- package/src/utils.ts +26 -4
- package/test/dist/moreStrings.test.d.ts.map +1 -0
- package/test/dist/rpc.test.d.ts.map +1 -1
- package/test/dist/special.test.d.ts.map +1 -0
- package/test/moreStrings.test.ts +17 -0
- package/test/rpc.test.ts +26 -5
- package/test/schema.test.ts +292 -1
- package/test/special.test.ts +525 -0
- package/test/utils.test.ts +1 -1
- package/tsconfig.base.json +0 -1
- package/tsconfig.json +0 -1
- package/dist/ServiceMap.d.ts.map +0 -1
- package/dist/ServiceMap.js +0 -91
- package/dist/Struct.d.ts +0 -44
- package/dist/Struct.d.ts.map +0 -1
- package/dist/Struct.js +0 -29
- package/src/Struct.ts +0 -54
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SpecialJsonSchema — A variant of Schema.toJsonSchemaDocument that deduplicates
|
|
3
|
+
* references sharing the same identifier when they produce identical
|
|
4
|
+
* representations (based on a string fingerprint).
|
|
5
|
+
*
|
|
6
|
+
* Without this, two different AST nodes that have the same identifier and
|
|
7
|
+
* resolve to the same JSON Schema representation can end up as separate $defs
|
|
8
|
+
* entries (e.g. "X" and "X1"). This converter collapses them into one.
|
|
9
|
+
*/
|
|
10
|
+
import { Formatter, SchemaRepresentation } from "effect";
|
|
11
|
+
/**
|
|
12
|
+
* Converts a schema to a JSON Schema Document (draft-2020-12), with an
|
|
13
|
+
* extra deduplication pass that collapses references sharing the same
|
|
14
|
+
* base identifier when their representations are identical.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* import { Schema, SchemaGetter, Option, Predicate } from "effect"
|
|
19
|
+
* import { specialJsonSchemaDocument } from "./SpecialJsonSchema.js"
|
|
20
|
+
*
|
|
21
|
+
* const X = Schema.String.annotate({ title: "X", identifier: "X" })
|
|
22
|
+
*
|
|
23
|
+
* const s = Schema.Struct({
|
|
24
|
+
* a: Schema.NullOr(X).pipe(
|
|
25
|
+
* Schema.encodeTo(Schema.optionalKey(X), {
|
|
26
|
+
* decode: SchemaGetter.transformOptional(Option.orElseSome(() => null)),
|
|
27
|
+
* encode: SchemaGetter.transformOptional(Option.filter(Predicate.isNotNull))
|
|
28
|
+
* })
|
|
29
|
+
* ),
|
|
30
|
+
* b: Schema.NullOr(X),
|
|
31
|
+
* c: X
|
|
32
|
+
* })
|
|
33
|
+
*
|
|
34
|
+
* // Without dedup: $defs would contain both "X" and "X1" (identical).
|
|
35
|
+
* // With specialJsonSchemaDocument: only "X" is emitted.
|
|
36
|
+
* const doc = specialJsonSchemaDocument(s)
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export function specialJsonSchemaDocument(schema, options) {
|
|
40
|
+
const doc = SchemaRepresentation.fromAST(schema.ast);
|
|
41
|
+
const deduped = deduplicateReferences(doc);
|
|
42
|
+
const jd = SchemaRepresentation.toJsonSchemaDocument(deduped, options);
|
|
43
|
+
return {
|
|
44
|
+
dialect: "draft-2020-12",
|
|
45
|
+
schema: jd.schema,
|
|
46
|
+
definitions: jd.definitions
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Deduplicates references in a Document: when multiple $ref keys share
|
|
51
|
+
* the same base identifier (e.g. "X" and "X1") and their representations
|
|
52
|
+
* are identical (by string fingerprint), the duplicates are collapsed into
|
|
53
|
+
* the first entry found for that identifier.
|
|
54
|
+
*/
|
|
55
|
+
function deduplicateReferences(doc) {
|
|
56
|
+
const refs = doc.references;
|
|
57
|
+
const refKeys = Object.keys(refs);
|
|
58
|
+
if (refKeys.length === 0)
|
|
59
|
+
return doc;
|
|
60
|
+
// Group references by base identifier (strip trailing digits added by gen())
|
|
61
|
+
const identifierGroups = new Map();
|
|
62
|
+
for (const key of refKeys) {
|
|
63
|
+
const base = getBaseIdentifier(key);
|
|
64
|
+
const fingerprint = Formatter.format(refs[key]);
|
|
65
|
+
const group = identifierGroups.get(base);
|
|
66
|
+
if (group === undefined) {
|
|
67
|
+
identifierGroups.set(base, [{ key, fingerprint }]);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
group.push({ key, fingerprint });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Build a mapping from duplicate keys to their canonical key
|
|
74
|
+
const remapping = new Map();
|
|
75
|
+
for (const [, group] of identifierGroups) {
|
|
76
|
+
const seen = new Map(); // fingerprint -> canonical key
|
|
77
|
+
for (const entry of group) {
|
|
78
|
+
const canonical = seen.get(entry.fingerprint);
|
|
79
|
+
if (canonical !== undefined) {
|
|
80
|
+
remapping.set(entry.key, canonical);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
seen.set(entry.fingerprint, entry.key);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (remapping.size === 0)
|
|
88
|
+
return doc;
|
|
89
|
+
// Build new references, excluding duplicates
|
|
90
|
+
const newRefs = {};
|
|
91
|
+
for (const key of refKeys) {
|
|
92
|
+
if (!remapping.has(key)) {
|
|
93
|
+
newRefs[key] = refs[key];
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Rewrite $ref pointers throughout the document
|
|
97
|
+
const newRepresentation = rewriteRefs(doc.representation, remapping);
|
|
98
|
+
const rewrittenRefs = {};
|
|
99
|
+
for (const [key, rep] of Object.entries(newRefs)) {
|
|
100
|
+
rewrittenRefs[key] = rewriteRefs(rep, remapping);
|
|
101
|
+
}
|
|
102
|
+
return { representation: newRepresentation, references: rewrittenRefs };
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Extracts the base identifier from a reference key by stripping trailing
|
|
106
|
+
* digits appended by the gen() function during fromASTs.
|
|
107
|
+
* E.g. "X1" -> "X", "X" -> "X", "MyType2" -> "MyType"
|
|
108
|
+
*/
|
|
109
|
+
function getBaseIdentifier(key) {
|
|
110
|
+
const match = key.match(/^(.+?)(\d+)$/);
|
|
111
|
+
return match ? match[1] : key;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Recursively rewrites $ref pointers in a Representation tree.
|
|
115
|
+
*/
|
|
116
|
+
function rewriteRefs(rep, remapping) {
|
|
117
|
+
switch (rep._tag) {
|
|
118
|
+
case "Reference": {
|
|
119
|
+
const target = remapping.get(rep.$ref);
|
|
120
|
+
return target !== undefined ? { ...rep, $ref: target } : rep;
|
|
121
|
+
}
|
|
122
|
+
case "Declaration":
|
|
123
|
+
return {
|
|
124
|
+
...rep,
|
|
125
|
+
typeParameters: rep.typeParameters.map((tp) => rewriteRefs(tp, remapping)),
|
|
126
|
+
encodedSchema: rewriteRefs(rep.encodedSchema, remapping)
|
|
127
|
+
};
|
|
128
|
+
case "Suspend":
|
|
129
|
+
return {
|
|
130
|
+
...rep,
|
|
131
|
+
thunk: rewriteRefs(rep.thunk, remapping)
|
|
132
|
+
};
|
|
133
|
+
case "Arrays":
|
|
134
|
+
return {
|
|
135
|
+
...rep,
|
|
136
|
+
elements: rep.elements.map((e) => ({ ...e, type: rewriteRefs(e.type, remapping) })),
|
|
137
|
+
rest: rep.rest.map((r) => rewriteRefs(r, remapping))
|
|
138
|
+
};
|
|
139
|
+
case "Objects":
|
|
140
|
+
return {
|
|
141
|
+
...rep,
|
|
142
|
+
propertySignatures: rep.propertySignatures.map((ps) => ({
|
|
143
|
+
...ps,
|
|
144
|
+
type: rewriteRefs(ps.type, remapping)
|
|
145
|
+
})),
|
|
146
|
+
indexSignatures: rep.indexSignatures.map((is) => ({
|
|
147
|
+
...is,
|
|
148
|
+
parameter: rewriteRefs(is.parameter, remapping),
|
|
149
|
+
type: rewriteRefs(is.type, remapping)
|
|
150
|
+
})),
|
|
151
|
+
checks: rewriteChecks(rep.checks, remapping)
|
|
152
|
+
};
|
|
153
|
+
case "Union":
|
|
154
|
+
return {
|
|
155
|
+
...rep,
|
|
156
|
+
types: rep.types.map((t) => rewriteRefs(t, remapping))
|
|
157
|
+
};
|
|
158
|
+
case "TemplateLiteral":
|
|
159
|
+
return {
|
|
160
|
+
...rep,
|
|
161
|
+
parts: rep.parts.map((p) => rewriteRefs(p, remapping))
|
|
162
|
+
};
|
|
163
|
+
case "String": {
|
|
164
|
+
if (rep.contentSchema !== undefined) {
|
|
165
|
+
return {
|
|
166
|
+
...rep,
|
|
167
|
+
contentSchema: rewriteRefs(rep.contentSchema, remapping)
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
return rep;
|
|
171
|
+
}
|
|
172
|
+
default:
|
|
173
|
+
// Leaf nodes: Null, Undefined, Void, Never, Unknown, Any, Boolean,
|
|
174
|
+
// Symbol, Number, BigInt, Literal, UniqueSymbol, ObjectKeyword, Enum
|
|
175
|
+
return rep;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
179
|
+
function rewriteChecks(checks, remapping) {
|
|
180
|
+
return checks.map((c) => {
|
|
181
|
+
switch (c._tag) {
|
|
182
|
+
case "Filter": {
|
|
183
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
184
|
+
const meta = c.meta;
|
|
185
|
+
if (meta && meta._tag === "isPropertyNames" && meta.propertyNames) {
|
|
186
|
+
return {
|
|
187
|
+
...c,
|
|
188
|
+
meta: { ...meta, propertyNames: rewriteRefs(meta.propertyNames, remapping) }
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
return c;
|
|
192
|
+
}
|
|
193
|
+
case "FilterGroup":
|
|
194
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
195
|
+
return { ...c, checks: rewriteChecks(c.checks, remapping) };
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BlY2lhbEpzb25TY2hlbWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvU2NoZW1hL1NwZWNpYWxKc29uU2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBQ0gsT0FBTyxFQUFFLFNBQVMsRUFBZ0Msb0JBQW9CLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFFdEY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUNILE1BQU0sVUFBVSx5QkFBeUIsQ0FDdkMsTUFBa0IsRUFDbEIsT0FBb0M7SUFFcEMsTUFBTSxHQUFHLEdBQUcsb0JBQW9CLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNwRCxNQUFNLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUMxQyxNQUFNLEVBQUUsR0FBRyxvQkFBb0IsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDdEUsT0FBTztRQUNMLE9BQU8sRUFBRSxlQUFlO1FBQ3hCLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTTtRQUNqQixXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVc7S0FDNUIsQ0FBQTtBQUNILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMscUJBQXFCLENBQzVCLEdBQWtDO0lBRWxDLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUE7SUFDM0IsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNqQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sR0FBRyxDQUFBO0lBRXBDLDZFQUE2RTtJQUM3RSxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUF1RCxDQUFBO0lBQ3ZGLEtBQUssTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDMUIsTUFBTSxJQUFJLEdB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
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SpecialOpenApi — Deduplicates `components/schemas` entries in an OpenAPI spec.
|
|
3
|
+
*
|
|
4
|
+
* When `OpenApi.fromApi` generates the spec, different AST nodes sharing the
|
|
5
|
+
* same identifier can produce duplicate entries (e.g. "X" and "X1") in
|
|
6
|
+
* `components.schemas`. This module provides a transform function that
|
|
7
|
+
* collapses those duplicates and rewrites all `$ref` pointers accordingly.
|
|
8
|
+
*
|
|
9
|
+
* Usage with the OpenApi `Transform` annotation:
|
|
10
|
+
*
|
|
11
|
+
* ```ts
|
|
12
|
+
* import { OpenApi } from "effect/unstable"
|
|
13
|
+
* import { deduplicateOpenApiSchemas } from "./SpecialOpenApi.js"
|
|
14
|
+
*
|
|
15
|
+
* const api = HttpApi.make("myApi")
|
|
16
|
+
* .pipe(HttpApi.annotateContext(OpenApi.annotations({ transform: deduplicateOpenApiSchemas })))
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Deduplicates `components.schemas` entries in an OpenAPI spec.
|
|
21
|
+
*
|
|
22
|
+
* Entries sharing the same base identifier (e.g. "X" and "X1") whose JSON
|
|
23
|
+
* representations are identical are collapsed into a single canonical entry,
|
|
24
|
+
* and all `$ref` pointers throughout the spec are rewritten to point to
|
|
25
|
+
* the canonical key.
|
|
26
|
+
*
|
|
27
|
+
* Designed to be used as the `transform` option in `OpenApi.annotations`.
|
|
28
|
+
*/
|
|
29
|
+
export declare function deduplicateOpenApiSchemas(spec: Record<string, any>): Record<string, any>;
|
|
30
|
+
//# sourceMappingURL=SpecialOpenApi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpecialOpenApi.d.ts","sourceRoot":"","sources":["../../src/Schema/SpecialOpenApi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACxB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAqDrB"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SpecialOpenApi — Deduplicates `components/schemas` entries in an OpenAPI spec.
|
|
3
|
+
*
|
|
4
|
+
* When `OpenApi.fromApi` generates the spec, different AST nodes sharing the
|
|
5
|
+
* same identifier can produce duplicate entries (e.g. "X" and "X1") in
|
|
6
|
+
* `components.schemas`. This module provides a transform function that
|
|
7
|
+
* collapses those duplicates and rewrites all `$ref` pointers accordingly.
|
|
8
|
+
*
|
|
9
|
+
* Usage with the OpenApi `Transform` annotation:
|
|
10
|
+
*
|
|
11
|
+
* ```ts
|
|
12
|
+
* import { OpenApi } from "effect/unstable"
|
|
13
|
+
* import { deduplicateOpenApiSchemas } from "./SpecialOpenApi.js"
|
|
14
|
+
*
|
|
15
|
+
* const api = HttpApi.make("myApi")
|
|
16
|
+
* .pipe(HttpApi.annotateContext(OpenApi.annotations({ transform: deduplicateOpenApiSchemas })))
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Deduplicates `components.schemas` entries in an OpenAPI spec.
|
|
21
|
+
*
|
|
22
|
+
* Entries sharing the same base identifier (e.g. "X" and "X1") whose JSON
|
|
23
|
+
* representations are identical are collapsed into a single canonical entry,
|
|
24
|
+
* and all `$ref` pointers throughout the spec are rewritten to point to
|
|
25
|
+
* the canonical key.
|
|
26
|
+
*
|
|
27
|
+
* Designed to be used as the `transform` option in `OpenApi.annotations`.
|
|
28
|
+
*/
|
|
29
|
+
export function deduplicateOpenApiSchemas(spec) {
|
|
30
|
+
const components = spec["components"];
|
|
31
|
+
if (!components)
|
|
32
|
+
return spec;
|
|
33
|
+
const schemas = components["schemas"];
|
|
34
|
+
if (!schemas)
|
|
35
|
+
return spec;
|
|
36
|
+
const keys = Object.keys(schemas);
|
|
37
|
+
if (keys.length === 0)
|
|
38
|
+
return spec;
|
|
39
|
+
// Group keys by base identifier (strip trailing digits)
|
|
40
|
+
const groups = new Map();
|
|
41
|
+
for (const key of keys) {
|
|
42
|
+
const base = getBaseIdentifier(key);
|
|
43
|
+
const fingerprint = JSON.stringify(schemas[key]);
|
|
44
|
+
const group = groups.get(base);
|
|
45
|
+
if (group === undefined) {
|
|
46
|
+
groups.set(base, [{ key, fingerprint }]);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
group.push({ key, fingerprint });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Build remapping from duplicate keys to canonical keys
|
|
53
|
+
const remapping = new Map();
|
|
54
|
+
for (const [, group] of groups) {
|
|
55
|
+
if (group.length <= 1)
|
|
56
|
+
continue;
|
|
57
|
+
const seen = new Map(); // fingerprint -> canonical key
|
|
58
|
+
for (const entry of group) {
|
|
59
|
+
const canonical = seen.get(entry.fingerprint);
|
|
60
|
+
if (canonical !== undefined) {
|
|
61
|
+
remapping.set(entry.key, canonical);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
seen.set(entry.fingerprint, entry.key);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (remapping.size === 0)
|
|
69
|
+
return spec;
|
|
70
|
+
// Build new schemas object without duplicates
|
|
71
|
+
const newSchemas = {};
|
|
72
|
+
for (const key of keys) {
|
|
73
|
+
if (!remapping.has(key)) {
|
|
74
|
+
newSchemas[key] = schemas[key];
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Deep clone the spec, replace schemas, and rewrite all $ref pointers
|
|
78
|
+
const newSpec = structuredClone(spec);
|
|
79
|
+
newSpec["components"]["schemas"] = newSchemas;
|
|
80
|
+
rewriteRefs(newSpec, remapping);
|
|
81
|
+
return newSpec;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Extracts the base identifier from a schema key by stripping trailing
|
|
85
|
+
* digits appended by the gen() function.
|
|
86
|
+
* E.g. "X1" -> "X", "X" -> "X", "MyType2" -> "MyType"
|
|
87
|
+
*/
|
|
88
|
+
function getBaseIdentifier(key) {
|
|
89
|
+
const match = key.match(/^(.+?)(\d+)$/);
|
|
90
|
+
return match ? match[1] : key;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Recursively rewrites `$ref` values in a JSON object tree.
|
|
94
|
+
* Mutates the object in-place (caller should pass a deep clone).
|
|
95
|
+
*/
|
|
96
|
+
function rewriteRefs(obj, remapping) {
|
|
97
|
+
if (obj === null || typeof obj !== "object")
|
|
98
|
+
return;
|
|
99
|
+
if (Array.isArray(obj)) {
|
|
100
|
+
for (const item of obj) {
|
|
101
|
+
rewriteRefs(item, remapping);
|
|
102
|
+
}
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (typeof obj.$ref === "string") {
|
|
106
|
+
// OpenAPI refs look like "#/components/schemas/X1"
|
|
107
|
+
const prefix = "#/components/schemas/";
|
|
108
|
+
if (obj.$ref.startsWith(prefix)) {
|
|
109
|
+
const refKey = obj.$ref.slice(prefix.length);
|
|
110
|
+
const canonical = remapping.get(refKey);
|
|
111
|
+
if (canonical !== undefined) {
|
|
112
|
+
obj.$ref = prefix + canonical;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
for (const value of Object.values(obj)) {
|
|
117
|
+
rewriteRefs(value, remapping);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BlY2lhbE9wZW5BcGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvU2NoZW1hL1NwZWNpYWxPcGVuQXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSx5QkFBeUIsQ0FDdkMsSUFBeUI7SUFFekIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBb0MsQ0FBQTtJQUN4RSxJQUFJLENBQUMsVUFBVTtRQUFFLE9BQU8sSUFBSSxDQUFBO0lBQzVCLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQW9DLENBQUE7SUFDeEUsSUFBSSxDQUFDLE9BQU87UUFBRSxPQUFPLElBQUksQ0FBQTtJQUV6QixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ2pDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUE7SUFFbEMsd0RBQXdEO0lBQ3hELE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUF1RCxDQUFBO0lBQzdFLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsTUFBTSxJQUFJLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDbkMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUNoRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzlCLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQzFDLENBQUM7YUFBTSxD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
|
package/dist/Schema/brand.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { Option } from "effect";
|
|
2
2
|
import * as B from "effect/Brand";
|
|
3
|
-
import type * as Brand from "effect/Brand";
|
|
4
3
|
import type * as Result from "effect/Result";
|
|
5
4
|
import * as S from "effect/Schema";
|
|
6
5
|
export interface Constructor<in out A extends B.Brand<any>> {
|
|
@@ -18,15 +17,19 @@ export interface Constructor<in out A extends B.Brand<any>> {
|
|
|
18
17
|
* Constructs a branded type from a value of type `A`, returning `Result.succeed`
|
|
19
18
|
* if the provided `A` is valid, `Result.fail` otherwise.
|
|
20
19
|
*/
|
|
21
|
-
result(args: Unbranded<A>): Result.Result<A,
|
|
20
|
+
result(args: Unbranded<A>): Result.Result<A, B.BrandError>;
|
|
22
21
|
/**
|
|
23
22
|
* Attempts to refine the provided value of type `A`, returning `true` if
|
|
24
23
|
* the provided `A` is valid, `false` otherwise.
|
|
25
24
|
*/
|
|
26
25
|
is(a: Unbranded<A>): a is Unbranded<A> & A;
|
|
27
26
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
type BrandAnnotations<C extends B.Brand<any>> = S.Annotations.Filter & (C extends string ? {
|
|
28
|
+
readonly toArbitrary?: S.Annotations.ToArbitrary.Declaration<C, readonly []>;
|
|
29
|
+
} : {});
|
|
30
|
+
export declare const fromBrand: <C extends B.Brand<any>>(constructor: Constructor<C>, options?: BrandAnnotations<C>) => <Self extends S.Top>(self: Self) => S.brand<Self["~rebuild.out"], B.Brand.Keys<C>>;
|
|
31
|
+
export type Brands<P> = P extends B.Brand<any> ? B.Brand.Brands<P> : never;
|
|
32
|
+
export type Unbranded<P> = P extends B.Brand<any> ? B.Brand.Unbranded<P> : P;
|
|
31
33
|
export declare const nominal: <A extends B.Brand<any>>() => Constructor<A>;
|
|
34
|
+
export {};
|
|
32
35
|
//# sourceMappingURL=brand.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brand.d.ts","sourceRoot":"","sources":["../../src/Schema/brand.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACpC,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AACjC,OAAO,KAAK,KAAK,
|
|
1
|
+
{"version":3,"file":"brand.d.ts","sourceRoot":"","sources":["../../src/Schema/brand.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACpC,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AACjC,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,CAAC,MAAM,eAAe,CAAA;AAElC,MAAM,WAAW,WAAW,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;IACxD;;;OAGG;IACH,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IACvB;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IAC5C;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAA;IAC1D;;;OAGG;IACH,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;CAC3C;AAED,KAAK,gBAAgB,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IACxC,CAAC,CAAC,WAAW,CAAC,MAAM,GACpB,CACA,CAAC,SAAS,MAAM,GAAG;IAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAA;CAAE,GAC/F,EAAE,CACP,CAAA;AAEH,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAC9C,aAAa,WAAW,CAAC,CAAC,CAAC,EAC3B,UAAU,gBAAgB,CAAC,CAAC,CAAC,MAE9B,IAAI,SAAS,CAAC,CAAC,GAAG,EAAE,MAAM,IAAI,KAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAG9E,CAAA;AAED,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAC9D,KAAK,CAAA;AAET,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;AAE5E,eAAO,MAAM,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,CAIvC,CAAA"}
|
package/dist/Schema/brand.js
CHANGED
|
@@ -5,4 +5,4 @@ export const fromBrand = (constructor, options) => (self) => {
|
|
|
5
5
|
return options ? branded.pipe(S.annotate(options)) : branded;
|
|
6
6
|
};
|
|
7
7
|
export const nominal = () => B.nominal();
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJhbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvU2NoZW1hL2JyYW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sS0FBSyxDQUFDLE1BQU0sY0FBYyxDQUFBO0FBRWpDLE9BQU8sS0FBSyxDQUFDLE1BQU0sZUFBZSxDQUFBO0FBZ0NsQyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsQ0FDdkIsV0FBMkIsRUFDM0IsT0FBNkIsRUFDN0IsRUFBRSxDQUNKLENBQXFCLElBQVUsRUFBa0QsRUFBRTtJQUNqRixNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksT0FBTyxFQUFFLFdBQWtCLENBQUMsQ0FBQyxJQUFXLENBQUMsQ0FBQTtJQUM1RixPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUUsT0FBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQWMsQ0FBQTtBQUM5RSxDQUFDLENBQUE7QUFPRCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQWlELEdBSW5FLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFZLENBQUEifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../src/Schema/email.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,CAAC,MAAM,eAAe,CAAA;AAClC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAEvD,MAAM,WAAW,UAAW,SAAQ,QAAQ,CAAC,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;CAAG;AAEvF,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,UAAU,CAAA;AAEvC,eAAO,MAAM,KAAK,
|
|
1
|
+
{"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../src/Schema/email.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,CAAC,MAAM,eAAe,CAAA;AAClC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAEvD,MAAM,WAAW,UAAW,SAAQ,QAAQ,CAAC,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;CAAG;AAEvF,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,UAAU,CAAA;AAEvC,eAAO,MAAM,KAAK,2BAYf,CAAA"}
|
package/dist/Schema/email.js
CHANGED
|
@@ -6,7 +6,8 @@ export const Email = S
|
|
|
6
6
|
identifier: "Email",
|
|
7
7
|
title: "Email",
|
|
8
8
|
description: "an email according to RFC 5322",
|
|
9
|
-
jsonSchema: { format: "email", minLength: 3, /* a@b */ maxLength: 998 }
|
|
10
|
-
|
|
9
|
+
jsonSchema: { format: "email", minLength: 3, /* a@b */ maxLength: 998 }
|
|
10
|
+
}), S.annotate({
|
|
11
|
+
toArbitrary: () => (fc) => fc.emailAddress().map((_) => _)
|
|
11
12
|
}));
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1haWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvU2NoZW1hL2VtYWlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUNwRCxPQUFPLEtBQUssQ0FBQyxNQUFNLGVBQWUsQ0FBQTtBQVNsQyxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQztLQUNuQixNQUFNO0tBQ04sSUFBSSxDQUNILENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBeUMsRUFBRTtJQUNsRCxVQUFVLEVBQUUsT0FBTztJQUNuQixLQUFLLEVBQUUsT0FBTztJQUNkLFdBQVcsRUFBRSxnQ0FBZ0M7SUFDN0MsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFO0NBQ3hFLENBQUMsRUFDRixDQUFDLENBQUMsUUFBUSxDQUFDO0lBQ1QsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFVLENBQUM7Q0FDcEUsQ0FBQyxDQUNILENBQUEifQ==
|