effect 3.3.0 → 3.3.2

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 (72) hide show
  1. package/dist/cjs/Chunk.js +28 -14
  2. package/dist/cjs/Chunk.js.map +1 -1
  3. package/dist/cjs/Config.js.map +1 -1
  4. package/dist/cjs/Either.js +1 -1
  5. package/dist/cjs/Either.js.map +1 -1
  6. package/dist/cjs/Option.js +1 -1
  7. package/dist/cjs/Option.js.map +1 -1
  8. package/dist/cjs/Predicate.js +41 -1
  9. package/dist/cjs/Predicate.js.map +1 -1
  10. package/dist/cjs/Redacted.js +50 -1
  11. package/dist/cjs/Redacted.js.map +1 -1
  12. package/dist/cjs/Stream.js.map +1 -1
  13. package/dist/cjs/Struct.js.map +1 -1
  14. package/dist/cjs/internal/cause.js +1 -1
  15. package/dist/cjs/internal/cause.js.map +1 -1
  16. package/dist/cjs/internal/config.js +1 -1
  17. package/dist/cjs/internal/config.js.map +1 -1
  18. package/dist/cjs/internal/fiberRuntime.js +1 -1
  19. package/dist/cjs/internal/fiberRuntime.js.map +1 -1
  20. package/dist/cjs/internal/version.js +1 -1
  21. package/dist/dts/Chunk.d.ts +23 -5
  22. package/dist/dts/Chunk.d.ts.map +1 -1
  23. package/dist/dts/Config.d.ts +1 -1
  24. package/dist/dts/Config.d.ts.map +1 -1
  25. package/dist/dts/Either.d.ts.map +1 -1
  26. package/dist/dts/Option.d.ts.map +1 -1
  27. package/dist/dts/Predicate.d.ts +42 -2
  28. package/dist/dts/Predicate.d.ts.map +1 -1
  29. package/dist/dts/Redacted.d.ts +54 -0
  30. package/dist/dts/Redacted.d.ts.map +1 -1
  31. package/dist/dts/Stream.d.ts +0 -3
  32. package/dist/dts/Stream.d.ts.map +1 -1
  33. package/dist/dts/Struct.d.ts +7 -7
  34. package/dist/dts/Struct.d.ts.map +1 -1
  35. package/dist/dts/index.d.ts +5 -0
  36. package/dist/dts/index.d.ts.map +1 -1
  37. package/dist/esm/Chunk.js +28 -11
  38. package/dist/esm/Chunk.js.map +1 -1
  39. package/dist/esm/Config.js.map +1 -1
  40. package/dist/esm/Either.js +1 -1
  41. package/dist/esm/Either.js.map +1 -1
  42. package/dist/esm/Option.js +1 -1
  43. package/dist/esm/Option.js.map +1 -1
  44. package/dist/esm/Predicate.js +41 -1
  45. package/dist/esm/Predicate.js.map +1 -1
  46. package/dist/esm/Redacted.js +50 -1
  47. package/dist/esm/Redacted.js.map +1 -1
  48. package/dist/esm/Stream.js.map +1 -1
  49. package/dist/esm/Struct.js.map +1 -1
  50. package/dist/esm/index.js +5 -0
  51. package/dist/esm/index.js.map +1 -1
  52. package/dist/esm/internal/cause.js +1 -1
  53. package/dist/esm/internal/cause.js.map +1 -1
  54. package/dist/esm/internal/config.js +1 -1
  55. package/dist/esm/internal/config.js.map +1 -1
  56. package/dist/esm/internal/fiberRuntime.js +1 -1
  57. package/dist/esm/internal/fiberRuntime.js.map +1 -1
  58. package/dist/esm/internal/version.js +1 -1
  59. package/package.json +1 -1
  60. package/src/Chunk.ts +36 -11
  61. package/src/Config.ts +1 -1
  62. package/src/Either.ts +2 -3
  63. package/src/Option.ts +1 -1
  64. package/src/Predicate.ts +43 -3
  65. package/src/Redacted.ts +55 -1
  66. package/src/Stream.ts +0 -3
  67. package/src/Struct.ts +8 -13
  68. package/src/index.ts +5 -0
  69. package/src/internal/cause.ts +1 -1
  70. package/src/internal/config.ts +2 -2
  71. package/src/internal/fiberRuntime.ts +1 -1
  72. package/src/internal/version.ts +1 -1
package/src/Option.ts CHANGED
@@ -1057,7 +1057,7 @@ export const filter: {
1057
1057
  * @since 2.0.0
1058
1058
  */
1059
1059
  export const getEquivalence = <A>(isEquivalent: Equivalence.Equivalence<A>): Equivalence.Equivalence<Option<A>> =>
1060
- Equivalence.make((x, y) => x === y || (isNone(x) ? isNone(y) : isNone(y) ? false : isEquivalent(x.value, y.value)))
1060
+ Equivalence.make((x, y) => isNone(x) ? isNone(y) : isNone(y) ? false : isEquivalent(x.value, y.value))
1061
1061
 
1062
1062
  /**
1063
1063
  * The `Order` instance allows `Option` values to be compared with
package/src/Predicate.ts CHANGED
@@ -799,15 +799,55 @@ export const eqv: {
799
799
  } = dual(2, <A>(self: Predicate<A>, that: Predicate<A>): Predicate<A> => (a) => self(a) === that(a))
800
800
 
801
801
  /**
802
+ * Represents the logical implication combinator for predicates. In formal
803
+ * logic, the implication operator `->` denotes that if the first proposition
804
+ * (antecedent) is true, then the second proposition (consequent) must also be
805
+ * true. In simpler terms, `p implies q` can be interpreted as "if p then q". If
806
+ * the first predicate holds, then the second predicate must hold
807
+ * for the given context.
808
+ *
809
+ * In practical terms within TypeScript, `p implies q` is equivalent to `!p || (p && q)`.
810
+ *
811
+ * Note that if the antecedent is `false`, the result is `true` by default
812
+ * because the outcome of the consequent cannot be determined.
813
+ *
814
+ * This function is useful in situations where you need to enforce rules or
815
+ * constraints that are contingent on certain conditions.
816
+ * It proves especially helpful in defining property tests.
817
+ *
818
+ * The example below illustrates the transitive property of order using the
819
+ * `implies` function. In simple terms, if `a <= b` and `b <= c`, then `a <= c`
820
+ * must be true.
821
+ *
822
+ * @example
823
+ * import { Predicate } from "effect"
824
+ *
825
+ * type Triple = {
826
+ * readonly a: number
827
+ * readonly b: number
828
+ * readonly c: number
829
+ * }
830
+ *
831
+ * const transitivity = Predicate.implies(
832
+ * // antecedent
833
+ * (input: Triple) => input.a <= input.b && input.b <= input.c,
834
+ * // consequent
835
+ * (input: Triple) => input.a <= input.c
836
+ * )
837
+ *
838
+ * assert.equal(transitivity({ a: 1, b: 2, c: 3 }), true)
839
+ * // antecedent is `false`, so the result is `true`
840
+ * assert.equal(transitivity({ a: 1, b: 0, c: 0 }), true)
841
+ *
802
842
  * @category combinators
803
843
  * @since 2.0.0
804
844
  */
805
845
  export const implies: {
806
- <A>(that: Predicate<A>): (self: Predicate<A>) => Predicate<A>
807
- <A>(self: Predicate<A>, that: Predicate<A>): Predicate<A>
846
+ <A>(consequent: Predicate<A>): (antecedent: Predicate<A>) => Predicate<A>
847
+ <A>(antecedent: Predicate<A>, consequent: Predicate<A>): Predicate<A>
808
848
  } = dual(
809
849
  2,
810
- <A>(self: Predicate<A>, that: Predicate<A>): Predicate<A> => (a) => self(a) ? that(a) : true
850
+ <A>(antecedent: Predicate<A>, consequent: Predicate<A>): Predicate<A> => (a) => antecedent(a) ? consequent(a) : true
811
851
  )
812
852
 
813
853
  /**
package/src/Redacted.ts CHANGED
@@ -1,4 +1,9 @@
1
1
  /**
2
+ * The Redacted module provides functionality for handling sensitive information
3
+ * securely within your application. By using the `Redacted` data type, you can
4
+ * ensure that sensitive values are not accidentally exposed in logs or error
5
+ * messages.
6
+ *
2
7
  * @since 3.3.0
3
8
  */
4
9
  import type * as Equal from "./Equal.js"
@@ -54,26 +59,75 @@ export declare namespace Redacted {
54
59
  export const isRedacted: (u: unknown) => u is Redacted<unknown> = redacted_.isRedacted
55
60
 
56
61
  /**
62
+ * This function creates a `Redacted<A>` instance from a given value `A`,
63
+ * securely hiding its content.
64
+ *
65
+ * @example
66
+ * import { Redacted } from "effect"
67
+ *
68
+ * const API_KEY = Redacted.make("1234567890")
69
+ *
57
70
  * @since 3.3.0
58
71
  * @category constructors
59
72
  */
60
73
  export const make: <A>(value: A) => Redacted<A> = redacted_.make
61
74
 
62
75
  /**
76
+ * Retrieves the original value from a `Redacted` instance. Use this function
77
+ * with caution, as it exposes the sensitive data.
78
+ *
79
+ * @example
80
+ * import { Redacted } from "effect"
81
+ *
82
+ * const API_KEY = Redacted.make("1234567890")
83
+ *
84
+ * assert.equal(Redacted.value(API_KEY), "1234567890")
85
+ *
63
86
  * @since 3.3.0
64
87
  * @category getters
65
88
  */
66
89
  export const value: <A>(self: Redacted<A>) => A = redacted_.value
67
90
 
68
91
  /**
92
+ * Erases the underlying value of a `Redacted` instance, rendering it unusable.
93
+ * This function is intended to ensure that sensitive data does not remain in
94
+ * memory longer than necessary.
95
+ *
96
+ * @example
97
+ * import { Redacted } from "effect"
98
+ *
99
+ * const API_KEY = Redacted.make("1234567890")
100
+ *
101
+ * assert.equal(Redacted.value(API_KEY), "1234567890")
102
+ *
103
+ * Redacted.unsafeWipe(API_KEY)
104
+ *
105
+ * assert.throws(() => Redacted.value(API_KEY), new Error("Unable to get redacted value"))
106
+ *
69
107
  * @since 3.3.0
70
108
  * @category unsafe
71
109
  */
72
110
  export const unsafeWipe: <A>(self: Redacted<A>) => boolean = redacted_.unsafeWipe
73
111
 
74
112
  /**
113
+ * Generates an equivalence relation for `Redacted<A>` values based on an
114
+ * equivalence relation for the underlying values `A`. This function is useful
115
+ * for comparing `Redacted` instances without exposing their contents.
116
+ *
117
+ * @example
118
+ * import { Redacted, Equivalence } from "effect"
119
+ *
120
+ * const API_KEY1 = Redacted.make("1234567890")
121
+ * const API_KEY2 = Redacted.make("1-34567890")
122
+ * const API_KEY3 = Redacted.make("1234567890")
123
+ *
124
+ * const equivalence = Redacted.getEquivalence(Equivalence.string)
125
+ *
126
+ * assert.equal(equivalence(API_KEY1, API_KEY2), false)
127
+ * assert.equal(equivalence(API_KEY1, API_KEY3), true)
128
+ *
75
129
  * @category equivalence
76
130
  * @since 3.3.0
77
131
  */
78
132
  export const getEquivalence = <A>(isEquivalent: Equivalence.Equivalence<A>): Equivalence.Equivalence<Redacted<A>> =>
79
- Equivalence.make((x, y) => x === y || (isEquivalent(value(x), value(y))))
133
+ Equivalence.make((x, y) => isEquivalent(value(x), value(y)))
package/src/Stream.ts CHANGED
@@ -93,9 +93,6 @@ export interface StreamUnifyIgnore extends Effect.EffectUnifyIgnore {
93
93
  */
94
94
  declare module "./Effect.js" {
95
95
  interface Effect<A, E, R> extends Stream<A, E, R> {}
96
- interface EffectUnifyIgnore {
97
- Stream?: true
98
- }
99
96
  }
100
97
 
101
98
  /**
package/src/Struct.ts CHANGED
@@ -119,14 +119,14 @@ export const getOrder: <R extends { readonly [x: string]: order.Order<any> }>(
119
119
  fields: R
120
120
  ) => order.Order<{ [K in keyof R]: [R[K]] extends [order.Order<infer A>] ? A : never }> = order.struct
121
121
 
122
- type PartialTransform<O> = Partial<{ [K in keyof O]: (a: O[K]) => unknown }>
123
-
124
- type Transformed<O, T extends PartialTransform<O>> =
122
+ type Transformed<O, T> =
125
123
  & unknown
126
124
  & {
127
- [K in keyof O]: K extends keyof T ? T[K] extends (...a: any) => any ? ReturnType<T[K]> : O[K] : O[K]
125
+ [K in keyof O]: K extends keyof T ? (T[K] extends (...a: any) => any ? ReturnType<T[K]> : O[K]) : O[K]
128
126
  }
129
-
127
+ type PartialTransform<O, T> = {
128
+ [K in keyof T]: T[K] extends (a: O[K & keyof O]) => any ? T[K] : (a: O[K & keyof O]) => unknown
129
+ }
130
130
  /**
131
131
  * Transforms the values of a Struct provided a transformation function for each key.
132
132
  * If no transformation function is provided for a key, it will return the origional value for that key.
@@ -148,16 +148,11 @@ type Transformed<O, T extends PartialTransform<O>> =
148
148
  * @since 2.0.0
149
149
  */
150
150
  export const evolve: {
151
- <O, T extends PartialTransform<O>>(t: T): (
152
- obj: O
153
- ) => Transformed<O, T>
154
- <O, T extends PartialTransform<O>>(obj: O, t: T): Transformed<O, T>
151
+ <O, T>(t: PartialTransform<O, T>): (obj: O) => Transformed<O, T>
152
+ <O, T>(obj: O, t: PartialTransform<O, T>): Transformed<O, T>
155
153
  } = dual(
156
154
  2,
157
- <O, T extends PartialTransform<O>>(
158
- obj: O,
159
- t: T
160
- ): unknown & Transformed<O, T> => {
155
+ <O, T>(obj: O, t: PartialTransform<O, T>): Transformed<O, T> => {
161
156
  const out = { ...obj }
162
157
  for (const k in t) {
163
158
  if (Object.prototype.hasOwnProperty.call(obj, k)) {
package/src/index.ts CHANGED
@@ -615,6 +615,11 @@ export * as Record from "./Record.js"
615
615
  export * as RedBlackTree from "./RedBlackTree.js"
616
616
 
617
617
  /**
618
+ * The Redacted module provides functionality for handling sensitive information
619
+ * securely within your application. By using the `Redacted` data type, you can
620
+ * ensure that sensitive values are not accidentally exposed in logs or error
621
+ * messages.
622
+ *
618
623
  * @since 3.3.0
619
624
  */
620
625
  export * as Redacted from "./Redacted.js"
@@ -1055,7 +1055,7 @@ export const spanToTrace = globalValue("effect/Tracer/spanToTrace", () => new We
1055
1055
 
1056
1056
  const prettyErrorStack = (message: string, stack: string, span?: Span | undefined): string => {
1057
1057
  const out: Array<string> = [message]
1058
- const lines = stack.split("\n")
1058
+ const lines = stack.startsWith(message) ? stack.slice(message.length).split("\n") : stack.split("\n")
1059
1059
 
1060
1060
  for (let i = 1; i < lines.length; i++) {
1061
1061
  if (lines[i].includes("Generator.next")) {
@@ -180,8 +180,8 @@ export const boolean = (name?: string): Config.Config<boolean> => {
180
180
  }
181
181
 
182
182
  /** @internal */
183
- export const array = <A>(config: Config.Config<A>, name?: string): Config.Config<ReadonlyArray<A>> => {
184
- return pipe(chunk(config, name), map(Chunk.toReadonlyArray))
183
+ export const array = <A>(config: Config.Config<A>, name?: string): Config.Config<Array<A>> => {
184
+ return pipe(chunk(config, name), map(Chunk.toArray))
185
185
  }
186
186
 
187
187
  /** @internal */
@@ -1826,7 +1826,7 @@ export const all = <
1826
1826
  return allEither(effects, reconcile, options) as any
1827
1827
  }
1828
1828
 
1829
- return reconcile._tag === "Some"
1829
+ return options?.discard !== true && reconcile._tag === "Some"
1830
1830
  ? core.map(
1831
1831
  forEach(effects, identity, options as any),
1832
1832
  reconcile.value
@@ -1,4 +1,4 @@
1
- let moduleVersion = "3.3.0"
1
+ let moduleVersion = "3.3.2"
2
2
 
3
3
  export const getCurrentVersion = () => moduleVersion
4
4