effect-app 4.0.0-beta.7 → 4.0.0-beta.71

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.
Files changed (139) hide show
  1. package/CHANGELOG.md +313 -0
  2. package/dist/Config/SecretURL.js +2 -2
  3. package/dist/Config.d.ts +7 -0
  4. package/dist/Config.d.ts.map +1 -0
  5. package/dist/Config.js +6 -0
  6. package/dist/ConfigProvider.d.ts +39 -0
  7. package/dist/ConfigProvider.d.ts.map +1 -0
  8. package/dist/ConfigProvider.js +42 -0
  9. package/dist/Context.d.ts +40 -0
  10. package/dist/Context.d.ts.map +1 -0
  11. package/dist/Context.js +66 -0
  12. package/dist/Effect.d.ts +8 -7
  13. package/dist/Effect.d.ts.map +1 -1
  14. package/dist/Effect.js +3 -2
  15. package/dist/Layer.d.ts +5 -4
  16. package/dist/Layer.d.ts.map +1 -1
  17. package/dist/Layer.js +1 -1
  18. package/dist/Operations.d.ts +61 -25
  19. package/dist/Operations.d.ts.map +1 -1
  20. package/dist/Pure.d.ts +2 -2
  21. package/dist/Pure.d.ts.map +1 -1
  22. package/dist/Pure.js +13 -13
  23. package/dist/Schema/Class.d.ts +39 -1
  24. package/dist/Schema/Class.d.ts.map +1 -1
  25. package/dist/Schema/Class.js +89 -12
  26. package/dist/Schema/SpecialJsonSchema.d.ts +21 -0
  27. package/dist/Schema/SpecialJsonSchema.d.ts.map +1 -0
  28. package/dist/Schema/SpecialJsonSchema.js +59 -0
  29. package/dist/Schema/SpecialOpenApi.d.ts +32 -0
  30. package/dist/Schema/SpecialOpenApi.d.ts.map +1 -0
  31. package/dist/Schema/SpecialOpenApi.js +123 -0
  32. package/dist/Schema/brand.d.ts +8 -5
  33. package/dist/Schema/brand.d.ts.map +1 -1
  34. package/dist/Schema/brand.js +1 -1
  35. package/dist/Schema/email.d.ts.map +1 -1
  36. package/dist/Schema/email.js +9 -4
  37. package/dist/Schema/ext.d.ts +81 -45
  38. package/dist/Schema/ext.d.ts.map +1 -1
  39. package/dist/Schema/ext.js +94 -49
  40. package/dist/Schema/moreStrings.d.ts +6 -6
  41. package/dist/Schema/moreStrings.d.ts.map +1 -1
  42. package/dist/Schema/moreStrings.js +14 -9
  43. package/dist/Schema/numbers.d.ts +11 -11
  44. package/dist/Schema/numbers.d.ts.map +1 -1
  45. package/dist/Schema/numbers.js +10 -9
  46. package/dist/Schema/phoneNumber.d.ts.map +1 -1
  47. package/dist/Schema/phoneNumber.js +8 -3
  48. package/dist/Schema/strings.d.ts +4 -4
  49. package/dist/Schema/strings.d.ts.map +1 -1
  50. package/dist/Schema.d.ts +22 -55
  51. package/dist/Schema.d.ts.map +1 -1
  52. package/dist/Schema.js +43 -64
  53. package/dist/client/apiClientFactory.d.ts +3 -3
  54. package/dist/client/apiClientFactory.d.ts.map +1 -1
  55. package/dist/client/apiClientFactory.js +14 -15
  56. package/dist/client/errors.d.ts +17 -9
  57. package/dist/client/errors.d.ts.map +1 -1
  58. package/dist/client/errors.js +35 -10
  59. package/dist/client/makeClient.d.ts +13 -12
  60. package/dist/client/makeClient.d.ts.map +1 -1
  61. package/dist/client/makeClient.js +5 -2
  62. package/dist/http/Request.d.ts.map +1 -1
  63. package/dist/http/Request.js +5 -5
  64. package/dist/ids.d.ts +3 -3
  65. package/dist/ids.d.ts.map +1 -1
  66. package/dist/ids.js +3 -2
  67. package/dist/index.d.ts +3 -8
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +4 -9
  70. package/dist/middleware.d.ts +2 -2
  71. package/dist/middleware.d.ts.map +1 -1
  72. package/dist/middleware.js +3 -3
  73. package/dist/rpc/MiddlewareMaker.d.ts +4 -3
  74. package/dist/rpc/MiddlewareMaker.d.ts.map +1 -1
  75. package/dist/rpc/MiddlewareMaker.js +7 -6
  76. package/dist/rpc/RpcContextMap.d.ts +2 -2
  77. package/dist/rpc/RpcContextMap.d.ts.map +1 -1
  78. package/dist/rpc/RpcContextMap.js +4 -4
  79. package/dist/rpc/RpcMiddleware.d.ts +4 -3
  80. package/dist/rpc/RpcMiddleware.d.ts.map +1 -1
  81. package/dist/rpc/RpcMiddleware.js +1 -1
  82. package/dist/utils/gen.d.ts +1 -1
  83. package/dist/utils/gen.d.ts.map +1 -1
  84. package/dist/utils/logger.d.ts +2 -2
  85. package/dist/utils/logger.d.ts.map +1 -1
  86. package/dist/utils/logger.js +3 -3
  87. package/dist/utils.d.ts +18 -0
  88. package/dist/utils.d.ts.map +1 -1
  89. package/dist/utils.js +24 -5
  90. package/package.json +29 -17
  91. package/src/Config/SecretURL.ts +1 -1
  92. package/src/Config.ts +14 -0
  93. package/src/ConfigProvider.ts +48 -0
  94. package/src/{ServiceMap.ts → Context.ts} +57 -64
  95. package/src/Effect.ts +11 -9
  96. package/src/Layer.ts +5 -4
  97. package/src/Pure.ts +17 -18
  98. package/src/Schema/Class.ts +114 -16
  99. package/src/Schema/SpecialJsonSchema.ts +69 -0
  100. package/src/Schema/SpecialOpenApi.ts +130 -0
  101. package/src/Schema/brand.ts +13 -7
  102. package/src/Schema/email.ts +10 -2
  103. package/src/Schema/ext.ts +182 -80
  104. package/src/Schema/moreStrings.ts +20 -10
  105. package/src/Schema/numbers.ts +9 -8
  106. package/src/Schema/phoneNumber.ts +8 -1
  107. package/src/Schema.ts +79 -103
  108. package/src/client/apiClientFactory.ts +18 -18
  109. package/src/client/errors.ts +46 -12
  110. package/src/client/makeClient.ts +32 -12
  111. package/src/http/Request.ts +7 -4
  112. package/src/ids.ts +3 -2
  113. package/src/index.ts +3 -11
  114. package/src/middleware.ts +2 -2
  115. package/src/rpc/MiddlewareMaker.ts +8 -7
  116. package/src/rpc/RpcContextMap.ts +6 -5
  117. package/src/rpc/RpcMiddleware.ts +5 -4
  118. package/src/utils/gen.ts +1 -1
  119. package/src/utils/logger.ts +2 -2
  120. package/src/utils.ts +26 -4
  121. package/test/dist/moreStrings.test.d.ts.map +1 -0
  122. package/test/dist/rpc.test.d.ts.map +1 -1
  123. package/test/dist/secretURL.test.d.ts.map +1 -0
  124. package/test/dist/special.test.d.ts.map +1 -0
  125. package/test/moreStrings.test.ts +17 -0
  126. package/test/rpc.test.ts +26 -5
  127. package/test/schema.test.ts +396 -3
  128. package/test/secretURL.test.ts +157 -0
  129. package/test/special.test.ts +732 -0
  130. package/test/utils.test.ts +1 -1
  131. package/tsconfig.base.json +0 -1
  132. package/tsconfig.json +0 -1
  133. package/dist/ServiceMap.d.ts +0 -44
  134. package/dist/ServiceMap.d.ts.map +0 -1
  135. package/dist/ServiceMap.js +0 -91
  136. package/dist/Struct.d.ts +0 -44
  137. package/dist/Struct.d.ts.map +0 -1
  138. package/dist/Struct.js +0 -29
  139. package/src/Struct.ts +0 -54
@@ -1,28 +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
- constructor(a, b = true) {
8
- super(a, b);
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;
9
58
  }
10
- // static readonly include = include(fields)
11
59
  static pick = (...selection) => pipe(this["fields"], Struct2.pick(selection));
12
60
  static omit = (...selection) => pipe(this["fields"], Struct2.omit(selection));
13
61
  };
14
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
+ */
15
82
  export const TaggedClass = (identifier) => (tag, fields, annotations) => {
16
- const cls = S.TaggedClass;
17
- return class extends cls(identifier)(tag, fields, annotations) {
18
- constructor(a, b = true) {
19
- super(a, b);
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;
20
95
  }
21
- // static readonly include = include(fields)
22
96
  static pick = (...selection) => pipe(this["fields"], Struct2.pick(selection));
23
97
  static omit = (...selection) => pipe(this["fields"], Struct2.omit(selection));
24
98
  };
25
99
  };
100
+ // ---------------------------------------------------------------------------
101
+ // ExtendedClass — like Class but with extra type parameter for hierarchies
102
+ // ---------------------------------------------------------------------------
26
103
  export const ExtendedClass = Class;
27
104
  export const ExtendedTaggedClass = TaggedClass;
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvU2NoZW1hL0NsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sSUFBSSxPQUFPLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFFaEQsT0FBTyxLQUFLLENBQUMsTUFBTSxlQUFlLENBQUE7QUF5QmxDLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FRWixDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLEVBQUU7SUFDMUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQVksQ0FBQTtJQUMxQixPQUFPLEtBQU0sU0FBUSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQztRQUN2RCxZQUFZLENBQU0sRUFBRSxDQUFDLEdBQUcsSUFBSTtZQUMxQixLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ2IsQ0FBQztRQUNELDRDQUE0QztRQUM1QyxNQUFNLENBQVUsSUFBSSxHQUFHLENBQUMsR0FBRyxTQUFnQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQTtRQUM3RixNQUFNLENBQVUsSUFBSSxHQUFHLENBQUMsR0FBRyxTQUFnQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQTtLQUN2RixDQUFBO0FBQ1YsQ0FBQyxDQUFBO0FBRUgsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQVNsQixDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxFQUFFO0lBQy9DLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxXQUFrQixDQUFBO0lBQ2hDLE9BQU8sS0FBTSxTQUFRLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQztRQUM1RCxZQUFZLENBQU0sRUFBRSxDQUFDLEdBQUcsSUFBSTtZQUMxQixLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ2IsQ0FBQztRQUNELDRDQUE0QztRQUM1QyxNQUFNLENBQVUsSUFBSSxHQUFHLENBQUMsR0FBRyxTQUFnQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQTtRQUM3RixNQUFNLENBQVUsSUFBSSxHQUFHLENBQUMsR0FBRyxTQUFnQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQTtLQUN2RixDQUFBO0FBQ1YsQ0FBQyxDQUFBO0FBRUgsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQU90QixLQUFZLENBQUE7QUFhaEIsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBVzVCLFdBQWtCLENBQUEifQ==
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvU2NoZW1hL0NsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxJQUFJLE9BQU8sRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUVoRyxPQUFPLEtBQUssQ0FBQyxNQUFNLGVBQWUsQ0FBQTtBQXdCbEM7OztHQUdHO0FBQ0gsU0FBUyxzQkFBc0IsQ0FDN0IsR0FBMEIsRUFDMUIsTUFBNEIsRUFDNUIsR0FBUTtJQUVSLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDMUMsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUM3QyxPQUFPLElBQUksU0FBUyxDQUFDLFdBQVcsQ0FDOUIsR0FBRyxDQUFDLGNBQWMsRUFDbEIsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFjLEVBQUUsSUFBMkIsRUFBRSxFQUFFO1FBQ3BELElBQUksS0FBSyxZQUFZLEdBQUcsSUFBSSxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNqRCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDOUIsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQzNFLENBQUMsRUFDRCxHQUFHLENBQUMsV0FBVyxFQUNmLEdBQUcsQ0FBQyxNQUFNLEVBQ1YsR0FBRyxDQUFDLFFBQVEsRUFDWixHQUFHLENBQUMsT0FBTyxDQUNaLENBQUE7QUFDSCxDQUFDO0FBRUQsOEVBQThF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
@@ -0,0 +1,21 @@
1
+ /**
2
+ * SpecialJsonSchema — A variant of Schema.toJsonSchemaDocument that
3
+ * post-processes the output (e.g. flattens simple allOf).
4
+ */
5
+ import { type JsonSchema, type Schema } from "effect";
6
+ /**
7
+ * Converts a schema to a JSON Schema Document (draft-2020-12), with
8
+ * post-processing that flattens simple allOf entries.
9
+ */
10
+ export declare function specialJsonSchemaDocument(schema: Schema.Top, options?: Schema.ToJsonSchemaOptions): JsonSchema.Document<"draft-2020-12">;
11
+ /**
12
+ * Flattens `allOf` entries into the parent when the parent already has a
13
+ * `type` and every `allOf` entry is a plain constraint object (no `$ref`,
14
+ * no `type`). Merged properties from `allOf` entries win on conflict.
15
+ */
16
+ export declare function flattenSimpleAllOf(obj: unknown): unknown;
17
+ /**
18
+ * Applies JSON Schema post-processing: flattens simple allOf.
19
+ */
20
+ export declare function postProcessJsonSchema(obj: JsonSchema.JsonSchema): JsonSchema.JsonSchema;
21
+ //# sourceMappingURL=SpecialJsonSchema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpecialJsonSchema.d.ts","sourceRoot":"","sources":["../../src/Schema/SpecialJsonSchema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,MAAM,EAAwB,MAAM,QAAQ,CAAA;AAE3E;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,CAAC,GAAG,EAClB,OAAO,CAAC,EAAE,MAAM,CAAC,mBAAmB,GACnC,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC,CAYtC;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CA6BxD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,CAEvF"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * SpecialJsonSchema — A variant of Schema.toJsonSchemaDocument that
3
+ * post-processes the output (e.g. flattens simple allOf).
4
+ */
5
+ import { SchemaRepresentation } from "effect";
6
+ /**
7
+ * Converts a schema to a JSON Schema Document (draft-2020-12), with
8
+ * post-processing that flattens simple allOf entries.
9
+ */
10
+ export function specialJsonSchemaDocument(schema, options) {
11
+ const doc = SchemaRepresentation.fromAST(schema.ast);
12
+ const jd = SchemaRepresentation.toJsonSchemaDocument(doc, options);
13
+ const processedDefs = {};
14
+ for (const [key, def] of Object.entries(jd.definitions)) {
15
+ processedDefs[key] = postProcessJsonSchema(def);
16
+ }
17
+ return {
18
+ dialect: "draft-2020-12",
19
+ schema: postProcessJsonSchema(jd.schema),
20
+ definitions: processedDefs
21
+ };
22
+ }
23
+ /**
24
+ * Flattens `allOf` entries into the parent when the parent already has a
25
+ * `type` and every `allOf` entry is a plain constraint object (no `$ref`,
26
+ * no `type`). Merged properties from `allOf` entries win on conflict.
27
+ */
28
+ export function flattenSimpleAllOf(obj) {
29
+ if (obj === null || typeof obj !== "object")
30
+ return obj;
31
+ if (globalThis.Array.isArray(obj)) {
32
+ return obj.map(flattenSimpleAllOf);
33
+ }
34
+ const record = obj;
35
+ const result = {};
36
+ for (const [key, value] of Object.entries(record)) {
37
+ result[key] = flattenSimpleAllOf(value);
38
+ }
39
+ if (result["type"] && globalThis.Array.isArray(result["allOf"])) {
40
+ const allOf = result["allOf"];
41
+ const canFlatten = allOf.every((entry) => typeof entry === "object" && entry !== null && !("$ref" in entry) && !("type" in entry));
42
+ if (canFlatten) {
43
+ const { allOf: _, ...rest } = result;
44
+ let merged = { ...rest };
45
+ for (const entry of allOf) {
46
+ merged = { ...merged, ...entry };
47
+ }
48
+ return merged;
49
+ }
50
+ }
51
+ return result;
52
+ }
53
+ /**
54
+ * Applies JSON Schema post-processing: flattens simple allOf.
55
+ */
56
+ export function postProcessJsonSchema(obj) {
57
+ return flattenSimpleAllOf(obj);
58
+ }
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BlY2lhbEpzb25TY2hlbWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvU2NoZW1hL1NwZWNpYWxKc29uU2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUNILE9BQU8sRUFBZ0Msb0JBQW9CLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFFM0U7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QixDQUN2QyxNQUFrQixFQUNsQixPQUFvQztJQUVwQyxNQUFNLEdBQUcsR0FBRyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3BELE1BQU0sRUFBRSxHQUFHLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUNsRSxNQUFNLGFBQWEsR0FBMkIsRUFBRSxDQUFBO0lBQ2hELEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1FBQ3hELGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNqRCxDQUFDO0lBQ0QsT0FBTztRQUNMLE9BQU8sRUFBRSxlQUFlO1FBQ3hCLE1BQU0sRUFBRSxxQkFBcUIsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ3hDLFdBQVcsRUFBRSxhQUFhO0tBQzNCLENBQUE7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxHQUFZO0lBQzdDLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1FBQUUsT0FBTyxHQUFHLENBQUE7SUFFdkQsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2xDLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO0lBQ3BDLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxHQUE4QixDQUFBO0lBQzdDLE1BQU0sTUFBTSxHQUE0QixFQUFFLENBQUE7SUFDMUMsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNsRCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDekMsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDaEUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBbUMsQ0FBQTtRQUMvRCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDdkMsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxDQUN4RixDQUFBO1FBQ0QsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFBO1lBQ3BDLElBQUksTUFBTSxHQUE0QixFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUE7WUFDakQsS0FBSyxNQUFNLEtBQUssSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxHQUFHLEVBQUUsR0FBRyxNQUFNLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQTtZQUNsQyxDQUFDO1lBQ0QsT0FBTyxNQUFNLENBQUE7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEdBQTBCO0lBQzlELE9BQU8sa0JBQWtCLENBQUMsR0FBRyxDQUEwQixDQUFBO0FBQ3pELENBQUMifQ==
@@ -0,0 +1,32 @@
1
+ /**
2
+ * SpecialOpenApi — Deduplicates `components/schemas` entries in an OpenAPI spec
3
+ * and applies JSON Schema post-processing (null removal, allOf flattening).
4
+ *
5
+ * When `OpenApi.fromApi` generates the spec, different AST nodes sharing the
6
+ * same identifier can produce duplicate entries (e.g. "X" and "X1") in
7
+ * `components.schemas`. This module provides a transform function that
8
+ * collapses those duplicates, rewrites all `$ref` pointers accordingly,
9
+ * and post-processes schemas for better codegen compatibility.
10
+ *
11
+ * Usage with the OpenApi `Transform` annotation:
12
+ *
13
+ * ```ts
14
+ * import { OpenApi } from "effect/unstable"
15
+ * import { deduplicateOpenApiSchemas } from "./SpecialOpenApi.js"
16
+ *
17
+ * const api = HttpApi.make("myApi")
18
+ * .pipe(HttpApi.annotateContext(OpenApi.annotations({ transform: deduplicateOpenApiSchemas })))
19
+ * ```
20
+ */
21
+ /**
22
+ * Deduplicates `components.schemas` entries in an OpenAPI spec.
23
+ *
24
+ * Entries sharing the same base identifier (e.g. "X" and "X1") whose JSON
25
+ * representations are identical are collapsed into a single canonical entry,
26
+ * and all `$ref` pointers throughout the spec are rewritten to point to
27
+ * the canonical key.
28
+ *
29
+ * Designed to be used as the `transform` option in `OpenApi.annotations`.
30
+ */
31
+ export declare function deduplicateOpenApiSchemas(spec: Record<string, any>): Record<string, any>;
32
+ //# sourceMappingURL=SpecialOpenApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpecialOpenApi.d.ts","sourceRoot":"","sources":["../../src/Schema/SpecialOpenApi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACxB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAqDrB"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * SpecialOpenApi — Deduplicates `components/schemas` entries in an OpenAPI spec
3
+ * and applies JSON Schema post-processing (null removal, allOf flattening).
4
+ *
5
+ * When `OpenApi.fromApi` generates the spec, different AST nodes sharing the
6
+ * same identifier can produce duplicate entries (e.g. "X" and "X1") in
7
+ * `components.schemas`. This module provides a transform function that
8
+ * collapses those duplicates, rewrites all `$ref` pointers accordingly,
9
+ * and post-processes schemas for better codegen compatibility.
10
+ *
11
+ * Usage with the OpenApi `Transform` annotation:
12
+ *
13
+ * ```ts
14
+ * import { OpenApi } from "effect/unstable"
15
+ * import { deduplicateOpenApiSchemas } from "./SpecialOpenApi.js"
16
+ *
17
+ * const api = HttpApi.make("myApi")
18
+ * .pipe(HttpApi.annotateContext(OpenApi.annotations({ transform: deduplicateOpenApiSchemas })))
19
+ * ```
20
+ */
21
+ import { postProcessJsonSchema } from "./SpecialJsonSchema.js";
22
+ /**
23
+ * Deduplicates `components.schemas` entries in an OpenAPI spec.
24
+ *
25
+ * Entries sharing the same base identifier (e.g. "X" and "X1") whose JSON
26
+ * representations are identical are collapsed into a single canonical entry,
27
+ * and all `$ref` pointers throughout the spec are rewritten to point to
28
+ * the canonical key.
29
+ *
30
+ * Designed to be used as the `transform` option in `OpenApi.annotations`.
31
+ */
32
+ export function deduplicateOpenApiSchemas(spec) {
33
+ const components = spec["components"];
34
+ if (!components)
35
+ return spec;
36
+ const schemas = components["schemas"];
37
+ if (!schemas)
38
+ return spec;
39
+ const keys = Object.keys(schemas);
40
+ if (keys.length === 0)
41
+ return spec;
42
+ // Group keys by base identifier (strip trailing digits)
43
+ const groups = new Map();
44
+ for (const key of keys) {
45
+ const base = getBaseIdentifier(key);
46
+ const fingerprint = JSON.stringify(schemas[key]);
47
+ const group = groups.get(base);
48
+ if (group === undefined) {
49
+ groups.set(base, [{ key, fingerprint }]);
50
+ }
51
+ else {
52
+ group.push({ key, fingerprint });
53
+ }
54
+ }
55
+ // Build remapping from duplicate keys to canonical keys
56
+ const remapping = new Map();
57
+ for (const [, group] of groups) {
58
+ if (group.length <= 1)
59
+ continue;
60
+ const seen = new Map(); // fingerprint -> canonical key
61
+ for (const entry of group) {
62
+ const canonical = seen.get(entry.fingerprint);
63
+ if (canonical !== undefined) {
64
+ remapping.set(entry.key, canonical);
65
+ }
66
+ else {
67
+ seen.set(entry.fingerprint, entry.key);
68
+ }
69
+ }
70
+ }
71
+ if (remapping.size === 0)
72
+ return postProcessJsonSchema(spec);
73
+ // Build new schemas object without duplicates
74
+ const newSchemas = {};
75
+ for (const key of keys) {
76
+ if (!remapping.has(key)) {
77
+ newSchemas[key] = schemas[key];
78
+ }
79
+ }
80
+ // Deep clone the spec, replace schemas, and rewrite all $ref pointers
81
+ const newSpec = structuredClone(spec);
82
+ newSpec["components"]["schemas"] = newSchemas;
83
+ rewriteRefs(newSpec, remapping);
84
+ return postProcessJsonSchema(newSpec);
85
+ }
86
+ /**
87
+ * Extracts the base identifier from a schema key by stripping trailing
88
+ * digits appended by the gen() function.
89
+ * E.g. "X1" -> "X", "X" -> "X", "MyType2" -> "MyType"
90
+ */
91
+ function getBaseIdentifier(key) {
92
+ const match = key.match(/^(.+?)(\d+)$/);
93
+ return match ? match[1] : key;
94
+ }
95
+ /**
96
+ * Recursively rewrites `$ref` values in a JSON object tree.
97
+ * Mutates the object in-place (caller should pass a deep clone).
98
+ */
99
+ function rewriteRefs(obj, remapping) {
100
+ if (obj === null || typeof obj !== "object")
101
+ return;
102
+ if (Array.isArray(obj)) {
103
+ for (const item of obj) {
104
+ rewriteRefs(item, remapping);
105
+ }
106
+ return;
107
+ }
108
+ if (typeof obj.$ref === "string") {
109
+ // OpenAPI refs look like "#/components/schemas/X1"
110
+ const prefix = "#/components/schemas/";
111
+ if (obj.$ref.startsWith(prefix)) {
112
+ const refKey = obj.$ref.slice(prefix.length);
113
+ const canonical = remapping.get(refKey);
114
+ if (canonical !== undefined) {
115
+ obj.$ref = prefix + canonical;
116
+ }
117
+ }
118
+ }
119
+ for (const value of Object.values(obj)) {
120
+ rewriteRefs(value, remapping);
121
+ }
122
+ }
123
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BlY2lhbE9wZW5BcGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvU2NoZW1hL1NwZWNpYWxPcGVuQXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUgsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFFOUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QixDQUN2QyxJQUF5QjtJQUV6QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFvQyxDQUFBO0lBQ3hFLElBQUksQ0FBQyxVQUFVO1FBQUUsT0FBTyxJQUFJLENBQUE7SUFDNUIsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBb0MsQ0FBQTtJQUN4RSxJQUFJLENBQUMsT0FBTztRQUFFLE9BQU8sSUFBSSxDQUFBO0lBRXpCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDakMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUVsQyx3REFBd0Q7SUFDeEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQXVELENBQUE7SUFDN0UsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixNQUFNLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNuQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBQ2hELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDOUIsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDMUMsQ0FBQzthQUFNLENBQUM7WUFDTixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUE7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFFRCx3REFBd0Q7SUFDeEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUE7SUFDM0MsS0FBSyxNQUFNLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUMvQixJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQztZQUFFLFNBQVE7UUFDL0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUEsQ0FBQywrQkFBK0I7UUFDdEUsS0FBSyxNQUFNLEtBQUssSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUMxQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUM3QyxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDNUIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1lBQ3JDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ3hDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxDQUFDO1FBQUUsT0FBTyxxQkFBcUIsQ0FBQyxJQUFJLENBQXdCLENBQUE7SUFFbkYsOENBQThDO0lBQzlDLE1BQU0sVUFBVSxHQUF3QixFQUFFLENBQUE7SUFDMUMsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3hCLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDaEMsQ0FBQztJQUNILENBQUM7SUFFRCxzRUFBc0U7SUFDdEUsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3JDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxVQUFVLENBQUE7SUFDN0MsV0FBVyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUUvQixPQUFPLHFCQUFxQixDQUFDLE9BQU8sQ0FBd0IsQ0FBQTtBQUM5RCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsaUJBQWlCLENBQUMsR0FBVztJQUNwQyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFBO0lBQ3ZDLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQTtBQUNoQyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxXQUFXLENBQUMsR0FBUSxFQUFFLFNBQThCO0lBQzNELElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1FBQUUsT0FBTTtJQUVuRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN2QixLQUFLLE1BQU0sSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLFdBQVcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUE7UUFDOUIsQ0FBQztRQUNELE9BQU07SUFDUixDQUFDO0lBRUQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDakMsbURBQW1EO1FBQ25ELE1BQU0sTUFBTSxHQUFHLHVCQUF1QixDQUFBO1FBQ3RDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNoQyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDNUMsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUN2QyxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDNUIsR0FBRyxDQUFDLElBQUksR0FBRyxNQUFNLEdBQUcsU0FBUyxDQUFBO1lBQy9CLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUE7SUFDL0IsQ0FBQztBQUNILENBQUMifQ==
@@ -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, Brand.BrandError>;
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
- export declare const fromBrand: <C extends Brand.Brand<string>>(constructor: Constructor<C>, options?: S.Annotations.Filter) => <Self extends S.Top>(self: Self) => S.brand<Self["~rebuild.out"], Brand.Brand.Keys<C>>;
29
- export type Brands<P> = P extends B.Brand<any> ? Brand.Brand.Brands<P> : never;
30
- export type Unbranded<P> = P extends B.Brand<any> ? Brand.Brand.Unbranded<P> : P;
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,KAAK,MAAM,cAAc,CAAA;AAC1C,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,KAAK,CAAC,UAAU,CAAC,CAAA;IAC9D;;;OAGG;IACH,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;CAC3C;AAED,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EACrD,aAAa,WAAW,CAAC,CAAC,CAAC,EAC3B,UAAU,CAAC,CAAC,WAAW,CAAC,MAAM,MAE/B,IAAI,SAAS,CAAC,CAAC,GAAG,EAAE,MAAM,IAAI,KAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAGlF,CAAA;AAED,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAClE,KAAK,CAAA;AAET,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;AAEhF,eAAO,MAAM,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,CAIvC,CAAA"}
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"}
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJhbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvU2NoZW1hL2JyYW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sS0FBSyxDQUFDLE1BQU0sY0FBYyxDQUFBO0FBR2pDLE9BQU8sS0FBSyxDQUFDLE1BQU0sZUFBZSxDQUFBO0FBeUJsQyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsQ0FDdkIsV0FBMkIsRUFDM0IsT0FBOEIsRUFDOUIsRUFBRSxDQUNKLENBQXFCLElBQVUsRUFBc0QsRUFBRTtJQUNyRixNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksT0FBTyxFQUFFLFdBQWtCLENBQUMsQ0FBQyxJQUFXLENBQUMsQ0FBQTtJQUM1RixPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUUsT0FBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQWMsQ0FBQTtBQUM5RSxDQUFDLENBQUE7QUFPRCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQWlELEdBSW5FLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFZLENBQUEifQ==
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,2BAUf,CAAA"}
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,2BAkBf,CAAA"}
@@ -2,11 +2,16 @@ import { isValidEmail } from "effect-app/validation";
2
2
  import * as S from "effect/Schema";
3
3
  export const Email = S
4
4
  .String
5
- .pipe(S.refine(isValidEmail, {
5
+ .pipe(S.annotate({
6
+ title: "Email",
7
+ description: "an email according to RFC 5322",
8
+ format: "email"
9
+ }), S.check(S.isMinLength(3), /* a@b */ S.isMaxLength(998)), S.refine(isValidEmail, {
6
10
  identifier: "Email",
7
11
  title: "Email",
8
12
  description: "an email according to RFC 5322",
9
- jsonSchema: { format: "email", minLength: 3, /* a@b */ maxLength: 998 },
10
- arbitrary: () => (fc) => fc.emailAddress().map((_) => _)
13
+ jsonSchema: { format: "email", minLength: 3, maxLength: 998 }
14
+ }), S.annotate({
15
+ toArbitrary: () => (fc) => fc.emailAddress().map((_) => _)
11
16
  }));
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1haWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvU2NoZW1hL2VtYWlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUNwRCxPQUFPLEtBQUssQ0FBQyxNQUFNLGVBQWUsQ0FBQTtBQVNsQyxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQztLQUNuQixNQUFNO0tBQ04sSUFBSSxDQUNILENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBeUMsRUFBRTtJQUNsRCxVQUFVLEVBQUUsT0FBTztJQUNuQixLQUFLLEVBQUUsT0FBTztJQUNkLFdBQVcsRUFBRSxnQ0FBZ0M7SUFDN0MsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFO0lBQ3ZFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBVSxDQUFDO0NBQzVFLENBQUMsQ0FDSCxDQUFBIn0=
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1haWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvU2NoZW1hL2VtYWlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUNwRCxPQUFPLEtBQUssQ0FBQyxNQUFNLGVBQWUsQ0FBQTtBQVNsQyxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQztLQUNuQixNQUFNO0tBQ04sSUFBSSxDQUNILENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDVCxLQUFLLEVBQUUsT0FBTztJQUNkLFdBQVcsRUFBRSxnQ0FBZ0M7SUFDN0MsTUFBTSxFQUFFLE9BQU87Q0FDaEIsQ0FBQyxFQUNGLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUN2RCxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQXlDLEVBQUU7SUFDbEQsVUFBVSxFQUFFLE9BQU87SUFDbkIsS0FBSyxFQUFFLE9BQU87SUFDZCxXQUFXLEVBQUUsZ0NBQWdDO0lBQzdDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFO0NBQzlELENBQUMsRUFDRixDQUFDLENBQUMsUUFBUSxDQUFDO0lBQ1QsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFVLENBQUM7Q0FDcEUsQ0FBQyxDQUNILENBQUEifQ==