effect-app 4.0.0-beta.43 → 4.0.0-beta.45

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 CHANGED
@@ -1,5 +1,17 @@
1
1
  # @effect-app/prelude
2
2
 
3
+ ## 4.0.0-beta.45
4
+
5
+ ### Patch Changes
6
+
7
+ - 10b55ff: update packages
8
+
9
+ ## 4.0.0-beta.44
10
+
11
+ ### Patch Changes
12
+
13
+ - a37aa38: Update to effect beta 43
14
+
3
15
  ## 4.0.0-beta.43
4
16
 
5
17
  ## 4.0.0-beta.42
@@ -18,8 +18,43 @@ type HasFields<Fields extends Struct.Fields> = {
18
18
  export type Class<Self, S extends S.Top & {
19
19
  readonly fields: Struct.Fields;
20
20
  }, Inherited> = S.Class<Self, S, Inherited>;
21
+ /**
22
+ * Like `Schema.Class`, but the resulting class accepts plain objects matching
23
+ * the struct schema during encoding — not only `instanceof` or type-id
24
+ * checks.
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * import { Schema } from "effect"
29
+ * import { Class } from "./Class.js"
30
+ *
31
+ * class A extends Class<A>("A")({ a: Schema.String }) {}
32
+ *
33
+ * // Construction works as normal:
34
+ * new A({ a: "hello" })
35
+ *
36
+ * // Encoding accepts plain objects:
37
+ * Schema.encodeUnknownSync(A)({ a: "hello" }) // { a: "hello" }
38
+ * ```
39
+ */
21
40
  export declare const Class: <Self = never>(identifier: string) => <Fields extends S.Struct.Fields>(fieldsOr: Fields | HasFields<Fields>, annotations?: ClassAnnotations<Self>) => [Self] extends [never] ? MissingSelfGeneric<"Class"> : EnhancedClass<Self, S.Struct<Fields>, {}>;
22
- export declare const TaggedClass: <Self = never>(identifier?: string) => <Tag extends string, Fields extends S.Struct.Fields>(tag: Tag, fieldsOr: Fields | HasFields<Fields>, annotations?: ClassAnnotations<Self>) => [Self] extends [never] ? MissingSelfGeneric<"Class"> : EnhancedClass<Self, S.Struct<{
41
+ /**
42
+ * Like `Schema.TaggedClass`, but the resulting class accepts plain objects
43
+ * matching the struct schema during encoding.
44
+ *
45
+ * @example
46
+ * ```ts
47
+ * import { Schema } from "effect"
48
+ * import { TaggedClass } from "./Class.js"
49
+ *
50
+ * class Circle extends TaggedClass<Circle>()("Circle", {
51
+ * radius: Schema.Number
52
+ * }) {}
53
+ *
54
+ * Schema.encodeUnknownSync(Circle)({ _tag: "Circle", radius: 5 })
55
+ * ```
56
+ */
57
+ export declare const TaggedClass: <Self = never>(identifier?: string) => <Tag extends string, Fields extends S.Struct.Fields>(tag: Tag, fieldsOr: Fields | HasFields<Fields>, annotations?: ClassAnnotations<Self>) => [Self] extends [never] ? MissingSelfGeneric<"TaggedClass"> : EnhancedClass<Self, S.Struct<{
23
58
  readonly _tag: S.tag<Tag>;
24
59
  } & Fields>, {}>;
25
60
  export declare const ExtendedClass: <Self, _SelfFrom>(identifier: string) => <Fields extends S.Struct.Fields>(fieldsOr: Fields | HasFields<Fields>, annotations?: ClassAnnotations<Self>) => EnhancedClass<Self, S.Struct<Fields>, {}>;
@@ -1 +1 @@
1
- {"version":3,"file":"Class.d.ts","sourceRoot":"","sources":["../../src/Schema/Class.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Class.d.ts","sourceRoot":"","sources":["../../src/Schema/Class.ts"],"names":[],"mappings":"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"}
@@ -1,22 +1,105 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
- import { pipe, Struct as Struct2 } from "effect";
2
+ import { Effect, Option, pipe, Schema, SchemaAST, SchemaIssue, Struct as Struct2 } from "effect";
3
3
  import * as S from "effect/Schema";
4
+ /**
5
+ * Build a modified Declaration that accepts struct-matching values during
6
+ * encoding, given the original Declaration and the class's fields.
7
+ */
8
+ function makeRelaxedDeclaration(ast, fields, cls) {
9
+ const structSchema = Schema.Struct(fields);
10
+ const isStructValue = Schema.is(structSchema);
11
+ return new SchemaAST.Declaration(ast.typeParameters, () => (input, self) => {
12
+ if (input instanceof cls || isStructValue(input)) {
13
+ return Effect.succeed(input);
14
+ }
15
+ return Effect.fail(new SchemaIssue.InvalidType(self, Option.some(input)));
16
+ }, ast.annotations, ast.checks, ast.encoding, ast.context);
17
+ }
18
+ // ---------------------------------------------------------------------------
19
+ // Class — like Schema.Class but with relaxed encoding
20
+ // ---------------------------------------------------------------------------
21
+ /**
22
+ * Like `Schema.Class`, but the resulting class accepts plain objects matching
23
+ * the struct schema during encoding — not only `instanceof` or type-id
24
+ * checks.
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * import { Schema } from "effect"
29
+ * import { Class } from "./Class.js"
30
+ *
31
+ * class A extends Class<A>("A")({ a: Schema.String }) {}
32
+ *
33
+ * // Construction works as normal:
34
+ * new A({ a: "hello" })
35
+ *
36
+ * // Encoding accepts plain objects:
37
+ * Schema.encodeUnknownSync(A)({ a: "hello" }) // { a: "hello" }
38
+ * ```
39
+ */
4
40
  export const Class = (identifier) => (fields, annotations) => {
5
- const cls = S.Class;
6
- return class extends cls(identifier)(fields, annotations) {
7
- // static readonly include = include(fields)
41
+ // Build the original Schema.Class
42
+ const Base = S.Class(identifier)(fields, annotations);
43
+ // Get the original ast getter from the base class
44
+ const originalAstDescriptor = Object.getOwnPropertyDescriptor(Base, "ast");
45
+ // Cache per-class to avoid recomputing
46
+ const astCache = new WeakMap();
47
+ return class extends Base {
48
+ static get ast() {
49
+ let cached = astCache.get(this);
50
+ if (cached !== undefined)
51
+ return cached;
52
+ // Call the original getter with `this` bound to the actual user class,
53
+ // so getClassSchema(this) creates a schema that uses `new this(...)`.
54
+ const originalAst = originalAstDescriptor.get.call(this);
55
+ cached = makeRelaxedDeclaration(originalAst, Base.fields, this);
56
+ astCache.set(this, cached);
57
+ return cached;
58
+ }
8
59
  static pick = (...selection) => pipe(this["fields"], Struct2.pick(selection));
9
60
  static omit = (...selection) => pipe(this["fields"], Struct2.omit(selection));
10
61
  };
11
62
  };
63
+ // ---------------------------------------------------------------------------
64
+ // TaggedClass — like Schema.TaggedClass but with relaxed encoding
65
+ // ---------------------------------------------------------------------------
66
+ /**
67
+ * Like `Schema.TaggedClass`, but the resulting class accepts plain objects
68
+ * matching the struct schema during encoding.
69
+ *
70
+ * @example
71
+ * ```ts
72
+ * import { Schema } from "effect"
73
+ * import { TaggedClass } from "./Class.js"
74
+ *
75
+ * class Circle extends TaggedClass<Circle>()("Circle", {
76
+ * radius: Schema.Number
77
+ * }) {}
78
+ *
79
+ * Schema.encodeUnknownSync(Circle)({ _tag: "Circle", radius: 5 })
80
+ * ```
81
+ */
12
82
  export const TaggedClass = (identifier) => (tag, fields, annotations) => {
13
- const cls = S.TaggedClass;
14
- return class extends cls(identifier)(tag, fields, annotations) {
15
- // static readonly include = include(fields)
83
+ const Base = S.TaggedClass(identifier)(tag, fields, annotations);
84
+ const originalAstDescriptor = Object.getOwnPropertyDescriptor(Base, "ast");
85
+ const astCache = new WeakMap();
86
+ return class extends Base {
87
+ static get ast() {
88
+ let cached = astCache.get(this);
89
+ if (cached !== undefined)
90
+ return cached;
91
+ const originalAst = originalAstDescriptor.get.call(this);
92
+ cached = makeRelaxedDeclaration(originalAst, Base.fields, this);
93
+ astCache.set(this, cached);
94
+ return cached;
95
+ }
16
96
  static pick = (...selection) => pipe(this["fields"], Struct2.pick(selection));
17
97
  static omit = (...selection) => pipe(this["fields"], Struct2.omit(selection));
18
98
  };
19
99
  };
100
+ // ---------------------------------------------------------------------------
101
+ // ExtendedClass — like Class but with extra type parameter for hierarchies
102
+ // ---------------------------------------------------------------------------
20
103
  export const ExtendedClass = Class;
21
104
  export const ExtendedTaggedClass = TaggedClass;
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvU2NoZW1hL0NsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sSUFBSSxPQUFPLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFFaEQsT0FBTyxLQUFLLENBQUMsTUFBTSxlQUFlLENBQUE7QUEyQmxDLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FRWixDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLEVBQUU7SUFDMUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQVksQ0FBQTtJQUMxQixPQUFPLEtBQU0sU0FBUSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQztRQUN2RCw0Q0FBNEM7UUFDNUMsTUFBTSxDQUFVLElBQUksR0FBRyxDQUFDLEdBQUcsU0FBZ0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUE7UUFDN0YsTUFBTSxDQUFVLElBQUksR0FBRyxDQUFDLEdBQUcsU0FBZ0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUE7S0FDdkYsQ0FBQTtBQUNWLENBQUMsQ0FBQTtBQUVILE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FTbEIsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsRUFBRTtJQUMvQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsV0FBa0IsQ0FBQTtJQUNoQyxPQUFPLEtBQU0sU0FBUSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUM7UUFDNUQsNENBQTRDO1FBQzVDLE1BQU0sQ0FBVSxJQUFJLEdBQUcsQ0FBQyxHQUFHLFNBQWdCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFBO1FBQzdGLE1BQU0sQ0FBVSxJQUFJLEdBQUcsQ0FBQyxHQUFHLFNBQWdCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFBO0tBQ3ZGLENBQUE7QUFDVixDQUFDLENBQUE7QUFFSCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBT3RCLEtBQVksQ0FBQTtBQWFoQixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FXNUIsV0FBa0IsQ0FBQSJ9
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvU2NoZW1hL0NsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxJQUFJLE9BQU8sRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUVoRyxPQUFPLEtBQUssQ0FBQyxNQUFNLGVBQWUsQ0FBQTtBQXdCbEM7OztHQUdHO0FBQ0gsU0FBUyxzQkFBc0IsQ0FDN0IsR0FBMEIsRUFDMUIsTUFBNEIsRUFDNUIsR0FBUTtJQUVSLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDMUMsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUM3QyxPQUFPLElBQUksU0FBUyxDQUFDLFdBQVcsQ0FDOUIsR0FBRyxDQUFDLGNBQWMsRUFDbEIsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFjLEVBQUUsSUFBMkIsRUFBRSxFQUFFO1FBQ3BELElBQUksS0FBSyxZQUFZLEdBQUcsSUFBSSxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNqRCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDOUIsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQzNFLENBQUMsRUFDRCxHQUFHLENBQUMsV0FBVyxFQUNmLEdBQUcsQ0FBQyxNQUFNLEVBQ1YsR0FBRyxDQUFDLFFBQVEsRUFDWixHQUFHLENBQUMsT0FBTyxDQUNaLENBQUE7QUFDSCxDQUFDO0FBRUQsOEVBQThF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
@@ -0,0 +1,40 @@
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 { type JsonSchema, type Schema } 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 declare function specialJsonSchemaDocument(schema: Schema.Top, options?: Schema.ToJsonSchemaOptions): JsonSchema.Document<"draft-2020-12">;
40
+ //# sourceMappingURL=SpecialJsonSchema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpecialJsonSchema.d.ts","sourceRoot":"","sources":["../../src/Schema/SpecialJsonSchema.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAa,KAAK,UAAU,EAAE,KAAK,MAAM,EAAwB,MAAM,QAAQ,CAAA;AAEtF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,CAAC,GAAG,EAClB,OAAO,CAAC,EAAE,MAAM,CAAC,mBAAmB,GACnC,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC,CAStC"}
@@ -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.d.ts CHANGED
@@ -16,6 +16,8 @@ export * from "./Schema/moreStrings.js";
16
16
  export * from "./Schema/numbers.js";
17
17
  export * from "./Schema/phoneNumber.js";
18
18
  export * from "./Schema/schema.js";
19
+ export * from "./Schema/SpecialJsonSchema.js";
20
+ export * from "./Schema/SpecialOpenApi.js";
19
21
  export * from "./Schema/strings.js";
20
22
  export { NonEmptyString } from "./Schema/strings.js";
21
23
  export * as SchemaIssue from "effect/SchemaIssue";
@@ -1 +1 @@
1
- {"version":3,"file":"Schema.d.ts","sourceRoot":"","sources":["../src/Schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,KAAK,CAAC,MAAM,eAAe,CAAA;AAClC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAEvD,OAAO,EAAE,KAAK,IAAI,MAAM,EAAE,KAAK,KAAK,IAAI,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAE5E,OAAO,EAAE,WAAW,IAAI,YAAY,EAAE,KAAK,WAAW,IAAI,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAG1G,cAAc,eAAe,CAAA;AAE7B,OAAO,EAAE,gBAAgB,IAAI,WAAW,EAAE,MAAM,eAAe,CAAA;AAE/D,cAAc,mBAAmB,CAAA;AACjC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEtD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AACjI,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEzD,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,yBAAyB,CAAA;AACvC,cAAc,qBAAqB,CAAA;AACnC,cAAc,yBAAyB,CAAA;AACvC,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEpD,OAAO,KAAK,WAAW,MAAM,oBAAoB,CAAA;AACjD,OAAO,KAAK,YAAY,MAAM,qBAAqB,CAAA;AAEnD,OAAO,EAAE,IAAI,IAAI,KAAK,EAAE,MAAM,eAAe,CAAA;AAE7C,eAAO,MAAM,MAAM,eAAW,CAAA;AAC9B,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAA;AAElC,MAAM,WAAW,gBAAgB;IAC/B,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAA;CACvB;AAKD,eAAO,MAAM,KAAK,iGAOf,CAAA;AAEH,MAAM,MAAM,KAAK,GAAG,SAAS,CAAA;AAE7B,eAAO,MAAM,WAAW,mQAQrB,CAAA;AAEH,MAAM,MAAM,WAAW,GAAG,eAAe,CAAA;AAqCzC,eAAO,MAAM,IAAI,GACf,OAAO,SAAS,qBAAqB,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,CAAC,EAE7F,MAAM,OAAO,KAMR,CAAC,CAAC,QAAQ,CACb,GACG,KAAK,IAAI,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GACzD,CACF,CAAA;AAEH,KAAK,kBAAkB,GAAG,qBAAqB,CAC7C,CAAC,CAAC,GAAG,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CACrD,CAAA;AAED,KAAK,eAAe,CAAC,OAAO,SAAS,kBAAkB,IAAI,CAAC,CAAC,QAAQ,CACnE;KACG,KAAK,IAAI,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;CACzD,CACF,CAAA;AAED,KAAK,mBAAmB,CAAC,OAAO,SAAS,kBAAkB,IAAI,CAAC,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAChG,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,OAAO,CAAC,CAAA;CACxC,CAAA;AAMD,eAAO,MAAM,iBAAiB,GAAI,OAAO,SAAS,kBAAkB,EAClE,QAAQ,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KACvB,mBAAmB,CAAC,OAAO,CAAsC,CAAA;AAEpE,eAAO,MAAM,WAAW,GACtB,OAAO,SAAS,kBAAkB,EAClC,GAAG,GAAG,OAAO,KAAG,mBAAmB,CAAC,OAAO,CAA0C,CAAA"}
1
+ {"version":3,"file":"Schema.d.ts","sourceRoot":"","sources":["../src/Schema.ts"],"names":[],"mappings":"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"}