@effect/platform 0.72.1 → 0.73.0

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 (67) hide show
  1. package/README.md +2159 -356
  2. package/Url/package.json +6 -0
  3. package/dist/cjs/HttpApi.js +22 -18
  4. package/dist/cjs/HttpApi.js.map +1 -1
  5. package/dist/cjs/HttpApiEndpoint.js.map +1 -1
  6. package/dist/cjs/HttpApiGroup.js.map +1 -1
  7. package/dist/cjs/HttpApiSchema.js +33 -4
  8. package/dist/cjs/HttpApiSchema.js.map +1 -1
  9. package/dist/cjs/HttpApiSecurity.js +2 -0
  10. package/dist/cjs/HttpApiSecurity.js.map +1 -1
  11. package/dist/cjs/OpenApi.js +132 -142
  12. package/dist/cjs/OpenApi.js.map +1 -1
  13. package/dist/cjs/OpenApiJsonSchema.js +7 -4
  14. package/dist/cjs/OpenApiJsonSchema.js.map +1 -1
  15. package/dist/cjs/Runtime.js.map +1 -1
  16. package/dist/cjs/Url.js +259 -0
  17. package/dist/cjs/Url.js.map +1 -0
  18. package/dist/cjs/index.js +3 -1
  19. package/dist/dts/HttpApi.d.ts +4 -2
  20. package/dist/dts/HttpApi.d.ts.map +1 -1
  21. package/dist/dts/HttpApiBuilder.d.ts +1 -1
  22. package/dist/dts/HttpApiBuilder.d.ts.map +1 -1
  23. package/dist/dts/HttpApiEndpoint.d.ts +16 -8
  24. package/dist/dts/HttpApiEndpoint.d.ts.map +1 -1
  25. package/dist/dts/HttpApiGroup.d.ts +1 -2
  26. package/dist/dts/HttpApiGroup.d.ts.map +1 -1
  27. package/dist/dts/HttpApiSchema.d.ts.map +1 -1
  28. package/dist/dts/HttpApiSecurity.d.ts +2 -0
  29. package/dist/dts/HttpApiSecurity.d.ts.map +1 -1
  30. package/dist/dts/OpenApi.d.ts +102 -111
  31. package/dist/dts/OpenApi.d.ts.map +1 -1
  32. package/dist/dts/OpenApiJsonSchema.d.ts.map +1 -1
  33. package/dist/dts/Runtime.d.ts +48 -0
  34. package/dist/dts/Runtime.d.ts.map +1 -1
  35. package/dist/dts/Url.d.ts +591 -0
  36. package/dist/dts/Url.d.ts.map +1 -0
  37. package/dist/dts/index.d.ts +4 -0
  38. package/dist/dts/index.d.ts.map +1 -1
  39. package/dist/esm/HttpApi.js +22 -18
  40. package/dist/esm/HttpApi.js.map +1 -1
  41. package/dist/esm/HttpApiEndpoint.js.map +1 -1
  42. package/dist/esm/HttpApiGroup.js.map +1 -1
  43. package/dist/esm/HttpApiSchema.js +30 -3
  44. package/dist/esm/HttpApiSchema.js.map +1 -1
  45. package/dist/esm/HttpApiSecurity.js +2 -0
  46. package/dist/esm/HttpApiSecurity.js.map +1 -1
  47. package/dist/esm/OpenApi.js +132 -141
  48. package/dist/esm/OpenApi.js.map +1 -1
  49. package/dist/esm/OpenApiJsonSchema.js +4 -2
  50. package/dist/esm/OpenApiJsonSchema.js.map +1 -1
  51. package/dist/esm/Runtime.js.map +1 -1
  52. package/dist/esm/Url.js +248 -0
  53. package/dist/esm/Url.js.map +1 -0
  54. package/dist/esm/index.js +4 -0
  55. package/dist/esm/index.js.map +1 -1
  56. package/package.json +10 -2
  57. package/src/HttpApi.ts +25 -26
  58. package/src/HttpApiBuilder.ts +1 -1
  59. package/src/HttpApiEndpoint.ts +22 -13
  60. package/src/HttpApiGroup.ts +2 -3
  61. package/src/HttpApiSchema.ts +33 -8
  62. package/src/HttpApiSecurity.ts +2 -0
  63. package/src/OpenApi.ts +244 -272
  64. package/src/OpenApiJsonSchema.ts +9 -1
  65. package/src/Runtime.ts +48 -0
  66. package/src/Url.ts +632 -0
  67. package/src/index.ts +5 -0
@@ -0,0 +1,591 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import * as Cause from "effect/Cause";
5
+ import * as Either from "effect/Either";
6
+ import * as UrlParams from "./UrlParams.js";
7
+ /**
8
+ * Parses a URL string into a `URL` object, returning an `Either` type for safe
9
+ * error handling.
10
+ *
11
+ * **Details**
12
+ *
13
+ * This function converts a string into a `URL` object, enabling safe URL
14
+ * parsing with built-in error handling. If the string is invalid or fails to
15
+ * parse, this function does not throw an error; instead, it wraps the error in
16
+ * a `IllegalArgumentException` and returns it as the `Left` value of an
17
+ * `Either`. The `Right` value contains the successfully parsed `URL`.
18
+ *
19
+ * An optional `base` parameter can be provided to resolve relative URLs. If
20
+ * specified, the function interprets the input `url` as relative to this
21
+ * `base`. This is especially useful when dealing with URLs that might not be
22
+ * fully qualified.
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * import { Url } from "@effect/platform"
27
+ * import { Either } from "effect"
28
+ *
29
+ * // Parse an absolute URL
30
+ * //
31
+ * // ┌─── Either<URL, IllegalArgumentException>
32
+ * // ▼
33
+ * const parsed = Url.fromString("https://example.com/path")
34
+ *
35
+ * if (Either.isRight(parsed)) {
36
+ * console.log("Parsed URL:", parsed.right.toString())
37
+ * } else {
38
+ * console.log("Error:", parsed.left.message)
39
+ * }
40
+ * // Output: Parsed URL: https://example.com/path
41
+ *
42
+ * // Parse a relative URL with a base
43
+ * const relativeParsed = Url.fromString("/relative-path", "https://example.com")
44
+ *
45
+ * if (Either.isRight(relativeParsed)) {
46
+ * console.log("Parsed relative URL:", relativeParsed.right.toString())
47
+ * } else {
48
+ * console.log("Error:", relativeParsed.left.message)
49
+ * }
50
+ * // Output: Parsed relative URL: https://example.com/relative-path
51
+ * ```
52
+ *
53
+ * @since 1.0.0
54
+ * @category Constructors
55
+ */
56
+ export declare const fromString: {
57
+ /**
58
+ * Parses a URL string into a `URL` object, returning an `Either` type for safe
59
+ * error handling.
60
+ *
61
+ * **Details**
62
+ *
63
+ * This function converts a string into a `URL` object, enabling safe URL
64
+ * parsing with built-in error handling. If the string is invalid or fails to
65
+ * parse, this function does not throw an error; instead, it wraps the error in
66
+ * a `IllegalArgumentException` and returns it as the `Left` value of an
67
+ * `Either`. The `Right` value contains the successfully parsed `URL`.
68
+ *
69
+ * An optional `base` parameter can be provided to resolve relative URLs. If
70
+ * specified, the function interprets the input `url` as relative to this
71
+ * `base`. This is especially useful when dealing with URLs that might not be
72
+ * fully qualified.
73
+ *
74
+ * @example
75
+ * ```ts
76
+ * import { Url } from "@effect/platform"
77
+ * import { Either } from "effect"
78
+ *
79
+ * // Parse an absolute URL
80
+ * //
81
+ * // ┌─── Either<URL, IllegalArgumentException>
82
+ * // ▼
83
+ * const parsed = Url.fromString("https://example.com/path")
84
+ *
85
+ * if (Either.isRight(parsed)) {
86
+ * console.log("Parsed URL:", parsed.right.toString())
87
+ * } else {
88
+ * console.log("Error:", parsed.left.message)
89
+ * }
90
+ * // Output: Parsed URL: https://example.com/path
91
+ *
92
+ * // Parse a relative URL with a base
93
+ * const relativeParsed = Url.fromString("/relative-path", "https://example.com")
94
+ *
95
+ * if (Either.isRight(relativeParsed)) {
96
+ * console.log("Parsed relative URL:", relativeParsed.right.toString())
97
+ * } else {
98
+ * console.log("Error:", relativeParsed.left.message)
99
+ * }
100
+ * // Output: Parsed relative URL: https://example.com/relative-path
101
+ * ```
102
+ *
103
+ * @since 1.0.0
104
+ * @category Constructors
105
+ */
106
+ (url: string, base?: string | URL | undefined): Either.Either<URL, Cause.IllegalArgumentException>;
107
+ };
108
+ /**
109
+ * This function clones the original `URL` object and applies a callback to the
110
+ * clone, allowing multiple updates at once.
111
+ *
112
+ * @example
113
+ * ```ts
114
+ * import { Url } from "@effect/platform"
115
+ *
116
+ * const myUrl = new URL("https://example.com")
117
+ *
118
+ * const mutatedUrl = Url.mutate(myUrl, (url) => {
119
+ * url.username = "user"
120
+ * url.password = "pass"
121
+ * })
122
+ *
123
+ * console.log("Mutated:", mutatedUrl.toString())
124
+ * // Output: Mutated: https://user:pass@example.com/
125
+ * ```
126
+ *
127
+ * @since 1.0.0
128
+ * @category Modifiers
129
+ */
130
+ export declare const mutate: {
131
+ /**
132
+ * This function clones the original `URL` object and applies a callback to the
133
+ * clone, allowing multiple updates at once.
134
+ *
135
+ * @example
136
+ * ```ts
137
+ * import { Url } from "@effect/platform"
138
+ *
139
+ * const myUrl = new URL("https://example.com")
140
+ *
141
+ * const mutatedUrl = Url.mutate(myUrl, (url) => {
142
+ * url.username = "user"
143
+ * url.password = "pass"
144
+ * })
145
+ *
146
+ * console.log("Mutated:", mutatedUrl.toString())
147
+ * // Output: Mutated: https://user:pass@example.com/
148
+ * ```
149
+ *
150
+ * @since 1.0.0
151
+ * @category Modifiers
152
+ */
153
+ (f: (url: URL) => void): (self: URL) => URL;
154
+ /**
155
+ * This function clones the original `URL` object and applies a callback to the
156
+ * clone, allowing multiple updates at once.
157
+ *
158
+ * @example
159
+ * ```ts
160
+ * import { Url } from "@effect/platform"
161
+ *
162
+ * const myUrl = new URL("https://example.com")
163
+ *
164
+ * const mutatedUrl = Url.mutate(myUrl, (url) => {
165
+ * url.username = "user"
166
+ * url.password = "pass"
167
+ * })
168
+ *
169
+ * console.log("Mutated:", mutatedUrl.toString())
170
+ * // Output: Mutated: https://user:pass@example.com/
171
+ * ```
172
+ *
173
+ * @since 1.0.0
174
+ * @category Modifiers
175
+ */
176
+ (self: URL, f: (url: URL) => void): URL;
177
+ };
178
+ /**
179
+ * Updates the hash fragment of the URL.
180
+ *
181
+ * @since 1.0.0
182
+ * @category Setters
183
+ */
184
+ export declare const setHash: {
185
+ /**
186
+ * Updates the hash fragment of the URL.
187
+ *
188
+ * @since 1.0.0
189
+ * @category Setters
190
+ */
191
+ (hash: string): (url: URL) => URL;
192
+ /**
193
+ * Updates the hash fragment of the URL.
194
+ *
195
+ * @since 1.0.0
196
+ * @category Setters
197
+ */
198
+ (url: URL, hash: string): URL;
199
+ };
200
+ /**
201
+ * Updates the host (domain and port) of the URL.
202
+ *
203
+ * @since 1.0.0
204
+ * @category Setters
205
+ */
206
+ export declare const setHost: {
207
+ /**
208
+ * Updates the host (domain and port) of the URL.
209
+ *
210
+ * @since 1.0.0
211
+ * @category Setters
212
+ */
213
+ (host: string): (url: URL) => URL;
214
+ /**
215
+ * Updates the host (domain and port) of the URL.
216
+ *
217
+ * @since 1.0.0
218
+ * @category Setters
219
+ */
220
+ (url: URL, host: string): URL;
221
+ };
222
+ /**
223
+ * Updates the domain of the URL without modifying the port.
224
+ *
225
+ * @since 1.0.0
226
+ * @category Setters
227
+ */
228
+ export declare const setHostname: {
229
+ /**
230
+ * Updates the domain of the URL without modifying the port.
231
+ *
232
+ * @since 1.0.0
233
+ * @category Setters
234
+ */
235
+ (hostname: string): (url: URL) => URL;
236
+ /**
237
+ * Updates the domain of the URL without modifying the port.
238
+ *
239
+ * @since 1.0.0
240
+ * @category Setters
241
+ */
242
+ (url: URL, hostname: string): URL;
243
+ };
244
+ /**
245
+ * Replaces the entire URL string.
246
+ *
247
+ * @since 1.0.0
248
+ * @category Setters
249
+ */
250
+ export declare const setHref: {
251
+ /**
252
+ * Replaces the entire URL string.
253
+ *
254
+ * @since 1.0.0
255
+ * @category Setters
256
+ */
257
+ (href: string): (url: URL) => URL;
258
+ /**
259
+ * Replaces the entire URL string.
260
+ *
261
+ * @since 1.0.0
262
+ * @category Setters
263
+ */
264
+ (url: URL, href: string): URL;
265
+ };
266
+ /**
267
+ * Updates the password used for authentication.
268
+ *
269
+ * @since 1.0.0
270
+ * @category Setters
271
+ */
272
+ export declare const setPassword: {
273
+ /**
274
+ * Updates the password used for authentication.
275
+ *
276
+ * @since 1.0.0
277
+ * @category Setters
278
+ */
279
+ (password: string): (url: URL) => URL;
280
+ /**
281
+ * Updates the password used for authentication.
282
+ *
283
+ * @since 1.0.0
284
+ * @category Setters
285
+ */
286
+ (url: URL, password: string): URL;
287
+ };
288
+ /**
289
+ * Updates the path of the URL.
290
+ *
291
+ * @since 1.0.0
292
+ * @category Setters
293
+ */
294
+ export declare const setPathname: {
295
+ /**
296
+ * Updates the path of the URL.
297
+ *
298
+ * @since 1.0.0
299
+ * @category Setters
300
+ */
301
+ (pathname: string): (url: URL) => URL;
302
+ /**
303
+ * Updates the path of the URL.
304
+ *
305
+ * @since 1.0.0
306
+ * @category Setters
307
+ */
308
+ (url: URL, pathname: string): URL;
309
+ };
310
+ /**
311
+ * Updates the port of the URL.
312
+ *
313
+ * @since 1.0.0
314
+ * @category Setters
315
+ */
316
+ export declare const setPort: {
317
+ /**
318
+ * Updates the port of the URL.
319
+ *
320
+ * @since 1.0.0
321
+ * @category Setters
322
+ */
323
+ (port: string): (url: URL) => URL;
324
+ /**
325
+ * Updates the port of the URL.
326
+ *
327
+ * @since 1.0.0
328
+ * @category Setters
329
+ */
330
+ (url: URL, port: string): URL;
331
+ };
332
+ /**
333
+ * Updates the protocol (e.g., `http`, `https`).
334
+ *
335
+ * @since 1.0.0
336
+ * @category Setters
337
+ */
338
+ export declare const setProtocol: {
339
+ /**
340
+ * Updates the protocol (e.g., `http`, `https`).
341
+ *
342
+ * @since 1.0.0
343
+ * @category Setters
344
+ */
345
+ (protocol: string): (url: URL) => URL;
346
+ /**
347
+ * Updates the protocol (e.g., `http`, `https`).
348
+ *
349
+ * @since 1.0.0
350
+ * @category Setters
351
+ */
352
+ (url: URL, protocol: string): URL;
353
+ };
354
+ /**
355
+ * Updates the query string of the URL.
356
+ *
357
+ * @since 1.0.0
358
+ * @category Setters
359
+ */
360
+ export declare const setSearch: {
361
+ /**
362
+ * Updates the query string of the URL.
363
+ *
364
+ * @since 1.0.0
365
+ * @category Setters
366
+ */
367
+ (search: string): (url: URL) => URL;
368
+ /**
369
+ * Updates the query string of the URL.
370
+ *
371
+ * @since 1.0.0
372
+ * @category Setters
373
+ */
374
+ (url: URL, search: string): URL;
375
+ };
376
+ /**
377
+ * Updates the username used for authentication.
378
+ *
379
+ * @since 1.0.0
380
+ * @category Setters
381
+ */
382
+ export declare const setUsername: {
383
+ /**
384
+ * Updates the username used for authentication.
385
+ *
386
+ * @since 1.0.0
387
+ * @category Setters
388
+ */
389
+ (username: string): (url: URL) => URL;
390
+ /**
391
+ * Updates the username used for authentication.
392
+ *
393
+ * @since 1.0.0
394
+ * @category Setters
395
+ */
396
+ (url: URL, username: string): URL;
397
+ };
398
+ /**
399
+ * Updates the query parameters of a URL.
400
+ *
401
+ * **Details**
402
+ *
403
+ * This function allows you to set or replace the query parameters of a `URL`
404
+ * object using the provided `UrlParams`. It creates a new `URL` object with the
405
+ * updated parameters, leaving the original object unchanged.
406
+ *
407
+ * @example
408
+ * ```ts
409
+ * import { Url, UrlParams } from "@effect/platform"
410
+ *
411
+ * const myUrl = new URL("https://example.com?foo=bar")
412
+ *
413
+ * // Write parameters
414
+ * const updatedUrl = Url.setUrlParams(
415
+ * myUrl,
416
+ * UrlParams.fromInput([["key", "value"]])
417
+ * )
418
+ *
419
+ * console.log(updatedUrl.toString())
420
+ * // Output: https://example.com/?key=value
421
+ * ```
422
+ *
423
+ * @since 1.0.0
424
+ * @category Setters
425
+ */
426
+ export declare const setUrlParams: {
427
+ /**
428
+ * Updates the query parameters of a URL.
429
+ *
430
+ * **Details**
431
+ *
432
+ * This function allows you to set or replace the query parameters of a `URL`
433
+ * object using the provided `UrlParams`. It creates a new `URL` object with the
434
+ * updated parameters, leaving the original object unchanged.
435
+ *
436
+ * @example
437
+ * ```ts
438
+ * import { Url, UrlParams } from "@effect/platform"
439
+ *
440
+ * const myUrl = new URL("https://example.com?foo=bar")
441
+ *
442
+ * // Write parameters
443
+ * const updatedUrl = Url.setUrlParams(
444
+ * myUrl,
445
+ * UrlParams.fromInput([["key", "value"]])
446
+ * )
447
+ *
448
+ * console.log(updatedUrl.toString())
449
+ * // Output: https://example.com/?key=value
450
+ * ```
451
+ *
452
+ * @since 1.0.0
453
+ * @category Setters
454
+ */
455
+ (urlParams: UrlParams.UrlParams): (url: URL) => URL;
456
+ /**
457
+ * Updates the query parameters of a URL.
458
+ *
459
+ * **Details**
460
+ *
461
+ * This function allows you to set or replace the query parameters of a `URL`
462
+ * object using the provided `UrlParams`. It creates a new `URL` object with the
463
+ * updated parameters, leaving the original object unchanged.
464
+ *
465
+ * @example
466
+ * ```ts
467
+ * import { Url, UrlParams } from "@effect/platform"
468
+ *
469
+ * const myUrl = new URL("https://example.com?foo=bar")
470
+ *
471
+ * // Write parameters
472
+ * const updatedUrl = Url.setUrlParams(
473
+ * myUrl,
474
+ * UrlParams.fromInput([["key", "value"]])
475
+ * )
476
+ *
477
+ * console.log(updatedUrl.toString())
478
+ * // Output: https://example.com/?key=value
479
+ * ```
480
+ *
481
+ * @since 1.0.0
482
+ * @category Setters
483
+ */
484
+ (url: URL, urlParams: UrlParams.UrlParams): URL;
485
+ };
486
+ /**
487
+ * Retrieves the query parameters from a URL.
488
+ *
489
+ * **Details**
490
+ *
491
+ * This function extracts the query parameters from a `URL` object and returns
492
+ * them as `UrlParams`. The resulting structure can be easily manipulated or
493
+ * inspected.
494
+ *
495
+ * @example
496
+ * ```ts
497
+ * import { Url } from "@effect/platform"
498
+ *
499
+ * const myUrl = new URL("https://example.com?foo=bar")
500
+ *
501
+ * // Read parameters
502
+ * const params = Url.urlParams(myUrl)
503
+ *
504
+ * console.log(params)
505
+ * // Output: [ [ 'foo', 'bar' ] ]
506
+ * ```
507
+ *
508
+ * @since 1.0.0
509
+ * @category Getters
510
+ */
511
+ export declare const urlParams: (url: URL) => UrlParams.UrlParams;
512
+ /**
513
+ * Reads, modifies, and updates the query parameters of a URL.
514
+ *
515
+ * **Details**
516
+ *
517
+ * This function provides a functional way to interact with query parameters by
518
+ * reading the current parameters, applying a transformation function, and then
519
+ * writing the updated parameters back to the URL. It returns a new `URL` object
520
+ * with the modified parameters, ensuring immutability.
521
+ *
522
+ * @example
523
+ * ```ts
524
+ * import { Url, UrlParams } from "@effect/platform"
525
+ *
526
+ * const myUrl = new URL("https://example.com?foo=bar")
527
+ *
528
+ * const changedUrl = Url.modifyUrlParams(myUrl, UrlParams.append("key", "value"))
529
+ *
530
+ * console.log(changedUrl.toString())
531
+ * // Output: https://example.com/?foo=bar&key=value
532
+ * ```
533
+ *
534
+ * @since 1.0.0
535
+ * @category Modifiers
536
+ */
537
+ export declare const modifyUrlParams: {
538
+ /**
539
+ * Reads, modifies, and updates the query parameters of a URL.
540
+ *
541
+ * **Details**
542
+ *
543
+ * This function provides a functional way to interact with query parameters by
544
+ * reading the current parameters, applying a transformation function, and then
545
+ * writing the updated parameters back to the URL. It returns a new `URL` object
546
+ * with the modified parameters, ensuring immutability.
547
+ *
548
+ * @example
549
+ * ```ts
550
+ * import { Url, UrlParams } from "@effect/platform"
551
+ *
552
+ * const myUrl = new URL("https://example.com?foo=bar")
553
+ *
554
+ * const changedUrl = Url.modifyUrlParams(myUrl, UrlParams.append("key", "value"))
555
+ *
556
+ * console.log(changedUrl.toString())
557
+ * // Output: https://example.com/?foo=bar&key=value
558
+ * ```
559
+ *
560
+ * @since 1.0.0
561
+ * @category Modifiers
562
+ */
563
+ (f: (urlParams: UrlParams.UrlParams) => UrlParams.UrlParams): (url: URL) => URL;
564
+ /**
565
+ * Reads, modifies, and updates the query parameters of a URL.
566
+ *
567
+ * **Details**
568
+ *
569
+ * This function provides a functional way to interact with query parameters by
570
+ * reading the current parameters, applying a transformation function, and then
571
+ * writing the updated parameters back to the URL. It returns a new `URL` object
572
+ * with the modified parameters, ensuring immutability.
573
+ *
574
+ * @example
575
+ * ```ts
576
+ * import { Url, UrlParams } from "@effect/platform"
577
+ *
578
+ * const myUrl = new URL("https://example.com?foo=bar")
579
+ *
580
+ * const changedUrl = Url.modifyUrlParams(myUrl, UrlParams.append("key", "value"))
581
+ *
582
+ * console.log(changedUrl.toString())
583
+ * // Output: https://example.com/?foo=bar&key=value
584
+ * ```
585
+ *
586
+ * @since 1.0.0
587
+ * @category Modifiers
588
+ */
589
+ (url: URL, f: (urlParams: UrlParams.UrlParams) => UrlParams.UrlParams): URL;
590
+ };
591
+ //# sourceMappingURL=Url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Url.d.ts","sourceRoot":"","sources":["../../src/Url.ts"],"names":[],"mappings":"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"}
@@ -199,6 +199,10 @@ export * as Terminal from "./Terminal.js";
199
199
  * @since 1.0.0
200
200
  */
201
201
  export * as Transferable from "./Transferable.js";
202
+ /**
203
+ * @since 1.0.0
204
+ */
205
+ export * as Url from "./Url.js";
202
206
  /**
203
207
  * @since 1.0.0
204
208
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -169,31 +169,32 @@ export const reflect = (self, options) => {
169
169
  };
170
170
  // -------------------------------------------------------------------------------------
171
171
  const emptyMap = /*#__PURE__*/new Map();
172
- const extractMembers = (topAst, inherited, getStatus) => {
172
+ const extractMembers = (ast, inherited, getStatus) => {
173
173
  const members = new Map(inherited);
174
- function process(ast) {
175
- if (ast._tag === "NeverKeyword") {
174
+ function process(type) {
175
+ if (AST.isNeverKeyword(type)) {
176
176
  return;
177
177
  }
178
- ast = AST.annotations(ast, {
179
- ...HttpApiSchema.extractAnnotations(topAst.annotations),
180
- ...ast.annotations
181
- });
182
- const status = getStatus(ast);
183
- const emptyDecodeable = HttpApiSchema.getEmptyDecodeable(ast);
178
+ const annotations = HttpApiSchema.extractAnnotations(ast.annotations);
179
+ // Avoid changing the reference unless necessary
180
+ // Otherwise, deduplication of the ASTs below will not be possible
181
+ if (!Record.isEmptyRecord(annotations)) {
182
+ type = AST.annotations(type, {
183
+ ...annotations,
184
+ ...type.annotations
185
+ });
186
+ }
187
+ const status = getStatus(type);
188
+ const emptyDecodeable = HttpApiSchema.getEmptyDecodeable(type);
184
189
  const current = members.get(status);
185
190
  members.set(status, {
186
- description: (current ? current.description : Option.none()).pipe(Option.orElse(() => getDescriptionOrIdentifier(ast))),
187
- ast: (current ? current.ast : Option.none()).pipe(Option.map(current => AST.Union.make(current._tag === "Union" ? [...current.types, ast] : [current, ast])), Option.orElse(() => !emptyDecodeable && AST.encodedAST(ast)._tag === "VoidKeyword" ? Option.none() : Option.some(ast)))
191
+ description: (current ? current.description : Option.none()).pipe(Option.orElse(() => getDescriptionOrIdentifier(type))),
192
+ ast: (current ? current.ast : Option.none()).pipe(
193
+ // Deduplicate the ASTs
194
+ Option.map(current => HttpApiSchema.UnionUnifyAST(current, type)), Option.orElse(() => !emptyDecodeable && AST.isVoidKeyword(AST.encodedAST(type)) ? Option.none() : Option.some(type)))
188
195
  });
189
196
  }
190
- if (topAst._tag === "Union") {
191
- for (const type of topAst.types) {
192
- process(type);
193
- }
194
- } else {
195
- process(topAst);
196
- }
197
+ HttpApiSchema.extractUnionTypes(ast).forEach(process);
197
198
  return members;
198
199
  };
199
200
  const extractPayloads = topAst => {
@@ -235,6 +236,9 @@ const getDescriptionOrIdentifier = ast => {
235
236
  return Option.fromNullable(annotations[AST.DescriptionAnnotationId] ?? annotations[AST.IdentifierAnnotationId]);
236
237
  };
237
238
  /**
239
+ * Adds additional schemas to components/schemas.
240
+ * The provided schemas must have a `identifier` annotation.
241
+ *
238
242
  * @since 1.0.0
239
243
  * @category tags
240
244
  */