effect-app 4.0.0-beta.3 → 4.0.0-beta.31
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 +165 -0
- package/dist/Effect.d.ts.map +1 -1
- package/dist/Effect.js +3 -2
- package/dist/Operations.d.ts +48 -12
- package/dist/Operations.d.ts.map +1 -1
- package/dist/Pure.d.ts.map +1 -1
- package/dist/Pure.js +11 -11
- package/dist/Schema/Class.d.ts.map +1 -1
- package/dist/Schema/Class.js +1 -7
- package/dist/Schema/brand.d.ts +8 -5
- package/dist/Schema/brand.d.ts.map +1 -1
- package/dist/Schema/brand.js +1 -1
- package/dist/Schema/email.d.ts.map +1 -1
- package/dist/Schema/email.js +4 -3
- package/dist/Schema/ext.d.ts +26 -25
- package/dist/Schema/ext.d.ts.map +1 -1
- package/dist/Schema/ext.js +13 -20
- package/dist/Schema/moreStrings.d.ts +6 -6
- package/dist/Schema/moreStrings.d.ts.map +1 -1
- package/dist/Schema/moreStrings.js +6 -4
- package/dist/Schema/phoneNumber.d.ts.map +1 -1
- package/dist/Schema/phoneNumber.js +3 -2
- package/dist/Schema.d.ts +18 -52
- package/dist/Schema.d.ts.map +1 -1
- package/dist/Schema.js +40 -61
- package/dist/ServiceMap.d.ts +3 -3
- package/dist/ServiceMap.d.ts.map +1 -1
- package/dist/ServiceMap.js +1 -1
- package/dist/client/apiClientFactory.d.ts.map +1 -1
- package/dist/client/apiClientFactory.js +8 -9
- package/dist/client/errors.d.ts.map +1 -1
- package/dist/client/errors.js +1 -1
- package/dist/client/makeClient.d.ts +8 -4
- package/dist/client/makeClient.d.ts.map +1 -1
- package/dist/client/makeClient.js +13 -15
- package/dist/http/Request.d.ts.map +1 -1
- package/dist/http/Request.js +5 -5
- package/dist/ids.d.ts +6 -6
- package/dist/ids.d.ts.map +1 -1
- package/dist/ids.js +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/utils.d.ts +18 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +24 -5
- package/package.json +3 -7
- package/src/Effect.ts +3 -2
- package/src/Pure.ts +12 -13
- package/src/Schema/Class.ts +0 -6
- package/src/Schema/brand.ts +13 -7
- package/src/Schema/email.ts +4 -2
- package/src/Schema/ext.ts +46 -38
- package/src/Schema/moreStrings.ts +16 -13
- package/src/Schema/phoneNumber.ts +3 -1
- package/src/Schema.ts +76 -100
- package/src/ServiceMap.ts +7 -6
- package/src/client/apiClientFactory.ts +12 -15
- package/src/client/errors.ts +12 -3
- package/src/client/makeClient.ts +25 -20
- package/src/http/Request.ts +7 -4
- package/src/ids.ts +1 -1
- package/src/index.ts +0 -1
- package/src/utils.ts +26 -4
- package/test/dist/moreStrings.test.d.ts.map +1 -0
- package/test/dist/rpc.test.d.ts.map +1 -1
- package/test/moreStrings.test.ts +17 -0
- package/test/rpc.test.ts +10 -0
- package/test/schema.test.ts +178 -1
- package/dist/Struct.d.ts +0 -44
- package/dist/Struct.d.ts.map +0 -1
- package/dist/Struct.js +0 -29
- package/src/Struct.ts +0 -54
package/test/schema.test.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// import { generateFromArbitrary } from "@effect-app/infra/test"
|
|
2
2
|
import { Array, S } from "effect-app"
|
|
3
|
-
import { test } from "vitest"
|
|
3
|
+
import { expect, expectTypeOf, test } from "vitest"
|
|
4
4
|
|
|
5
5
|
const A = S.Struct({ a: S.NonEmptyString255, email: S.NullOr(S.Email) })
|
|
6
6
|
test("works", () => {
|
|
@@ -23,3 +23,180 @@ test("literal default works", () => {
|
|
|
23
23
|
const s2 = S.Struct({ l: l2.withDefault })
|
|
24
24
|
expect(s2.makeUnsafe({}).l).toBe("b")
|
|
25
25
|
})
|
|
26
|
+
|
|
27
|
+
test("tagged union derives tag map and tags from v4 literal ast", () => {
|
|
28
|
+
const schema = S.TaggedUnion(
|
|
29
|
+
S.TaggedStruct("A", { a: S.String }),
|
|
30
|
+
S.TaggedStruct("B", { b: S.Number }),
|
|
31
|
+
S.TaggedStruct("C", { c: S.Boolean })
|
|
32
|
+
)
|
|
33
|
+
const caseA = schema.cases["A"]
|
|
34
|
+
const caseB = schema.cases["B"]
|
|
35
|
+
const caseC = schema.cases["C"]
|
|
36
|
+
const isAOrB = schema.isAnyOf(["A", "B"])
|
|
37
|
+
|
|
38
|
+
expect(caseA.fields._tag.ast.literal).toBe("A")
|
|
39
|
+
expect(caseB.fields._tag.ast.literal).toBe("B")
|
|
40
|
+
expect(caseC.fields._tag.ast.literal).toBe("C")
|
|
41
|
+
expect(S.decodeSync(schema.tags)("A")).toBe("A")
|
|
42
|
+
expect(S.decodeSync(schema.tags)("B")).toBe("B")
|
|
43
|
+
expect(S.decodeSync(schema.tags)("C")).toBe("C")
|
|
44
|
+
expect(() => S.decodeUnknownSync(schema.tags)("D")).toThrow()
|
|
45
|
+
|
|
46
|
+
expect(schema.guards.A({ _tag: "A", a: "ok" })).toBe(true)
|
|
47
|
+
expect(schema.guards.A({ _tag: "B", b: 1 })).toBe(false)
|
|
48
|
+
expect(schema.guards.B({ _tag: "B", b: 1 })).toBe(true)
|
|
49
|
+
expect(schema.guards.B({ _tag: "A", a: "ok" })).toBe(false)
|
|
50
|
+
expect(schema.guards.C({ _tag: "C", c: true })).toBe(true)
|
|
51
|
+
expect(schema.guards.C({ _tag: "A", a: "ok" })).toBe(false)
|
|
52
|
+
|
|
53
|
+
expect(isAOrB({ _tag: "A", a: "ok" })).toBe(true)
|
|
54
|
+
expect(isAOrB({ _tag: "B", b: 1 })).toBe(true)
|
|
55
|
+
expect(isAOrB({ _tag: "C", c: true })).toBe(false)
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
test("TaggedUnion tags returns a Literals schema with correct literal values", () => {
|
|
59
|
+
const schema = S.TaggedUnion(
|
|
60
|
+
S.TaggedStruct("X", { x: S.String }),
|
|
61
|
+
S.TaggedStruct("Y", { y: S.Number })
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
expect(schema.tags.literals).toEqual(["X", "Y"])
|
|
65
|
+
expectTypeOf(schema.tags.literals).toMatchTypeOf<readonly ["X", "Y"]>()
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
test("TaggedUnion tags.pick returns a subset of the tag literals", () => {
|
|
69
|
+
const schema = S.TaggedUnion(
|
|
70
|
+
S.TaggedStruct("A", { a: S.String }),
|
|
71
|
+
S.TaggedStruct("B", { b: S.Number }),
|
|
72
|
+
S.TaggedStruct("C", { c: S.Boolean })
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
const subset = schema.tags.pick(["A", "C"])
|
|
76
|
+
expect(subset.literals).toEqual(["A", "C"])
|
|
77
|
+
expect(S.decodeSync(subset)("A")).toBe("A")
|
|
78
|
+
expect(S.decodeSync(subset)("C")).toBe("C")
|
|
79
|
+
expect(() => S.decodeUnknownSync(subset)("B")).toThrow()
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
test("tags standalone function extracts tags from member schemas", () => {
|
|
83
|
+
const members = [
|
|
84
|
+
S.TaggedStruct("Foo", { foo: S.String }),
|
|
85
|
+
S.TaggedStruct("Bar", { bar: S.Number })
|
|
86
|
+
] as const
|
|
87
|
+
|
|
88
|
+
const tagSchema = S.tags(members)
|
|
89
|
+
expect(tagSchema.literals).toEqual(["Foo", "Bar"])
|
|
90
|
+
expect(S.decodeSync(tagSchema)("Foo")).toBe("Foo")
|
|
91
|
+
expect(S.decodeSync(tagSchema)("Bar")).toBe("Bar")
|
|
92
|
+
expect(() => S.decodeUnknownSync(tagSchema)("Baz")).toThrow()
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
test("ExtendTaggedUnion adds tags to an existing Union", () => {
|
|
96
|
+
const union = S.Union([
|
|
97
|
+
S.TaggedStruct("P", { p: S.String }),
|
|
98
|
+
S.TaggedStruct("Q", { q: S.Number })
|
|
99
|
+
])
|
|
100
|
+
const extended = S.ExtendTaggedUnion(union)
|
|
101
|
+
|
|
102
|
+
expect(extended.tags.literals).toEqual(["P", "Q"])
|
|
103
|
+
expect(S.decodeSync(extended.tags)("P")).toBe("P")
|
|
104
|
+
expect(S.decodeSync(extended.tags)("Q")).toBe("Q")
|
|
105
|
+
expect(() => S.decodeUnknownSync(extended.tags)("R")).toThrow()
|
|
106
|
+
expect(extended.cases["P"].fields._tag.ast.literal).toBe("P")
|
|
107
|
+
expect(extended.guards.P({ _tag: "P", p: "ok" })).toBe(true)
|
|
108
|
+
expect(extended.guards.P({ _tag: "Q", q: 1 })).toBe(false)
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
test("TaggedUnion match dispatches on _tag", () => {
|
|
112
|
+
const schema = S.TaggedUnion(
|
|
113
|
+
S.TaggedStruct("A", { a: S.String }),
|
|
114
|
+
S.TaggedStruct("B", { b: S.Number })
|
|
115
|
+
)
|
|
116
|
+
type T = S.Schema.Type<typeof schema>
|
|
117
|
+
|
|
118
|
+
const matcher = schema.match({
|
|
119
|
+
A: (v) => `got A: ${v.a}`,
|
|
120
|
+
B: (v) => `got B: ${v.b}`
|
|
121
|
+
})
|
|
122
|
+
expect(matcher({ _tag: "A", a: "hello" } as T)).toBe("got A: hello")
|
|
123
|
+
expect(matcher({ _tag: "B", b: 42 } as T)).toBe("got B: 42")
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
test("TaggedUnion with single member", () => {
|
|
127
|
+
const schema = S.TaggedUnion(
|
|
128
|
+
S.TaggedStruct("Only", { val: S.String })
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
expect(schema.tags.literals).toEqual(["Only"])
|
|
132
|
+
expect(S.decodeSync(schema.tags)("Only")).toBe("Only")
|
|
133
|
+
expect(() => S.decodeUnknownSync(schema.tags)("Other")).toThrow()
|
|
134
|
+
expect(schema.guards.Only({ _tag: "Only", val: "x" })).toBe(true)
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
test("TaggedUnion tags type is narrowed to the exact tag literals", () => {
|
|
138
|
+
const schema = S.TaggedUnion(
|
|
139
|
+
S.TaggedStruct("Alpha", { a: S.String }),
|
|
140
|
+
S.TaggedStruct("Beta", { b: S.Number }),
|
|
141
|
+
S.TaggedStruct("Gamma", { c: S.Boolean })
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
type Tags = S.Schema.Type<typeof schema.tags>
|
|
145
|
+
expectTypeOf<Tags>().toEqualTypeOf<"Alpha" | "Beta" | "Gamma">()
|
|
146
|
+
})
|
|
147
|
+
|
|
148
|
+
test("TaggedUnion with encodeKeys renaming a non-tag key", () => {
|
|
149
|
+
const MemberA = S.TaggedStruct("A", { firstName: S.String }).pipe(
|
|
150
|
+
S.encodeKeys({ firstName: "first_name" })
|
|
151
|
+
)
|
|
152
|
+
const MemberB = S.TaggedStruct("B", { lastName: S.Number }).pipe(
|
|
153
|
+
S.encodeKeys({ lastName: "last_name" })
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
const schema = S.TaggedUnion(MemberA, MemberB)
|
|
157
|
+
|
|
158
|
+
expect(schema.tags.literals).toEqual(["A", "B"])
|
|
159
|
+
expect(S.decodeSync(schema.tags)("A")).toBe("A")
|
|
160
|
+
expect(S.decodeSync(schema.tags)("B")).toBe("B")
|
|
161
|
+
|
|
162
|
+
// decode from encoded (snake_case) to decoded (camelCase)
|
|
163
|
+
const decoded = S.decodeUnknownSync(schema)({ _tag: "A", first_name: "Alice" })
|
|
164
|
+
expect(decoded).toEqual({ _tag: "A", firstName: "Alice" })
|
|
165
|
+
|
|
166
|
+
const decoded2 = S.decodeUnknownSync(schema)({ _tag: "B", last_name: 42 })
|
|
167
|
+
expect(decoded2).toEqual({ _tag: "B", lastName: 42 })
|
|
168
|
+
|
|
169
|
+
// encode back to snake_case
|
|
170
|
+
type T = S.Schema.Type<typeof schema>
|
|
171
|
+
const encoded = S.encodeSync(schema)({ _tag: "A", firstName: "Alice" } as T)
|
|
172
|
+
expect(encoded).toEqual({ _tag: "A", first_name: "Alice" })
|
|
173
|
+
|
|
174
|
+
// guards work on decoded values
|
|
175
|
+
expect(schema.guards.A({ _tag: "A", firstName: "Alice" })).toBe(true)
|
|
176
|
+
expect(schema.guards.A({ _tag: "B", lastName: 42 })).toBe(false)
|
|
177
|
+
expect(schema.guards.B({ _tag: "B", lastName: 42 })).toBe(true)
|
|
178
|
+
})
|
|
179
|
+
|
|
180
|
+
test("TaggedUnion with TaggedClass members", () => {
|
|
181
|
+
class Foo extends S.TaggedClass<Foo>()("Foo", { name: S.String }) {}
|
|
182
|
+
class Bar extends S.TaggedClass<Bar>()("Bar", { count: S.Number }) {}
|
|
183
|
+
|
|
184
|
+
const schema = S.TaggedUnion(Foo, Bar)
|
|
185
|
+
|
|
186
|
+
expect(schema.tags.literals).toEqual(["Foo", "Bar"])
|
|
187
|
+
expect(S.decodeSync(schema.tags)("Foo")).toBe("Foo")
|
|
188
|
+
expect(S.decodeSync(schema.tags)("Bar")).toBe("Bar")
|
|
189
|
+
expect(() => S.decodeUnknownSync(schema.tags)("Baz")).toThrow()
|
|
190
|
+
|
|
191
|
+
const decoded = S.decodeUnknownSync(schema)({ _tag: "Foo", name: "Alice" })
|
|
192
|
+
expect(decoded).toBeInstanceOf(Foo)
|
|
193
|
+
expect(decoded).toEqual(new Foo({ name: "Alice" }))
|
|
194
|
+
|
|
195
|
+
const decoded2 = S.decodeUnknownSync(schema)({ _tag: "Bar", count: 3 })
|
|
196
|
+
expect(decoded2).toBeInstanceOf(Bar)
|
|
197
|
+
expect(decoded2).toEqual(new Bar({ count: 3 }))
|
|
198
|
+
|
|
199
|
+
expect(schema.guards.Foo(new Foo({ name: "Alice" }))).toBe(true)
|
|
200
|
+
expect(schema.guards.Foo(new Bar({ count: 3 }))).toBe(false)
|
|
201
|
+
expect(schema.guards.Bar(new Bar({ count: 3 }))).toBe(true)
|
|
202
|
+
})
|
package/dist/Struct.d.ts
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import type { Types } from "effect";
|
|
2
|
-
export * from "effect/Struct";
|
|
3
|
-
/**
|
|
4
|
-
* Create a new object by picking properties of an existing object.
|
|
5
|
-
*
|
|
6
|
-
* @example
|
|
7
|
-
* import { pick } from "effect/Struct"
|
|
8
|
-
* import { pipe } from "effect/Function"
|
|
9
|
-
*
|
|
10
|
-
* assert.deepStrictEqual(pipe({ a: "a", b: 1, c: true }, pick("a", "b")), { a: "a", b: 1 })
|
|
11
|
-
* assert.deepStrictEqual(pick({ a: "a", b: 1, c: true }, "a", "b"), { a: "a", b: 1 })
|
|
12
|
-
*
|
|
13
|
-
* @since 2.0.0
|
|
14
|
-
*/
|
|
15
|
-
export declare const pick: {
|
|
16
|
-
<Keys extends Array<PropertyKey>>(keys: Keys): <S extends {
|
|
17
|
-
[K in Keys[number]]?: any;
|
|
18
|
-
}>(s: S) => Types.MatchRecord<S, {
|
|
19
|
-
[K in Keys[number]]?: S[K];
|
|
20
|
-
}, Pick<S, Keys[number]>>;
|
|
21
|
-
<S extends object, Keys extends Array<keyof S>>(s: S, keys: Keys): Types.MatchRecord<S, {
|
|
22
|
-
[K in Keys[number]]?: S[K];
|
|
23
|
-
}, Pick<S, Keys[number]>>;
|
|
24
|
-
};
|
|
25
|
-
export type DistributiveOmit<T, K extends keyof any> = T extends any ? Omit<T, K> : never;
|
|
26
|
-
/**
|
|
27
|
-
* Create a new object by omitting properties of an existing object.
|
|
28
|
-
*
|
|
29
|
-
* @example
|
|
30
|
-
* import { omit } from "effect/Struct"
|
|
31
|
-
* import { pipe } from "effect/Function"
|
|
32
|
-
*
|
|
33
|
-
* assert.deepStrictEqual(pipe({ a: "a", b: 1, c: true }, omit("c")), { a: "a", b: 1 })
|
|
34
|
-
* assert.deepStrictEqual(omit({ a: "a", b: 1, c: true }, "c"), { a: "a", b: 1 })
|
|
35
|
-
*
|
|
36
|
-
* @since 2.0.0
|
|
37
|
-
*/
|
|
38
|
-
export declare const omit: {
|
|
39
|
-
<Keys extends Array<PropertyKey>>(keys: Keys): <S extends {
|
|
40
|
-
[K in Keys[number]]?: any;
|
|
41
|
-
}>(s: S) => DistributiveOmit<S, Keys[number]>;
|
|
42
|
-
<S extends object, Keys extends Array<keyof S>>(s: S, keys: Keys): DistributiveOmit<S, Keys[number]>;
|
|
43
|
-
};
|
|
44
|
-
//# sourceMappingURL=Struct.d.ts.map
|
package/dist/Struct.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Struct.d.ts","sourceRoot":"","sources":["../src/Struct.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAGnC,cAAc,eAAe,CAAA;AAE7B;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,IAAI,EAAE;IACjB,CAAC,IAAI,SAAS,KAAK,CAAC,WAAW,CAAC,EAC9B,IAAI,EAAE,IAAI,GACT,CAAC,CAAC,SAAS;SAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG;KAAE,EACzC,CAAC,EAAE,CAAC,KACD,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE;SAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;KAAE,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IAChF,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,EAC5C,CAAC,EAAE,CAAC,EACJ,IAAI,EAAE,IAAI,GACT,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE;SAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;KAAE,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;CACjE,CAAA;AAEf,MAAM,MAAM,gBAAgB,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,GAAG,IAAI,CAAC,SAAS,GAAG,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAC7E,KAAK,CAAA;AAET;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,IAAI,EAAE;IACjB,CAAC,IAAI,SAAS,KAAK,CAAC,WAAW,CAAC,EAC9B,IAAI,EAAE,IAAI,GACT,CAAC,CAAC,SAAS;SAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG;KAAE,EAAE,CAAC,EAAE,CAAC,KAAK,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;IACvF,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,EAC5C,CAAC,EAAE,CAAC,EACJ,IAAI,EAAE,IAAI,GACT,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;CAChB,CAAA"}
|
package/dist/Struct.js
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import * as Struct from "effect/Struct";
|
|
2
|
-
export * from "effect/Struct";
|
|
3
|
-
/**
|
|
4
|
-
* Create a new object by picking properties of an existing object.
|
|
5
|
-
*
|
|
6
|
-
* @example
|
|
7
|
-
* import { pick } from "effect/Struct"
|
|
8
|
-
* import { pipe } from "effect/Function"
|
|
9
|
-
*
|
|
10
|
-
* assert.deepStrictEqual(pipe({ a: "a", b: 1, c: true }, pick("a", "b")), { a: "a", b: 1 })
|
|
11
|
-
* assert.deepStrictEqual(pick({ a: "a", b: 1, c: true }, "a", "b"), { a: "a", b: 1 })
|
|
12
|
-
*
|
|
13
|
-
* @since 2.0.0
|
|
14
|
-
*/
|
|
15
|
-
export const pick = Struct.pick;
|
|
16
|
-
/**
|
|
17
|
-
* Create a new object by omitting properties of an existing object.
|
|
18
|
-
*
|
|
19
|
-
* @example
|
|
20
|
-
* import { omit } from "effect/Struct"
|
|
21
|
-
* import { pipe } from "effect/Function"
|
|
22
|
-
*
|
|
23
|
-
* assert.deepStrictEqual(pipe({ a: "a", b: 1, c: true }, omit("c")), { a: "a", b: 1 })
|
|
24
|
-
* assert.deepStrictEqual(omit({ a: "a", b: 1, c: true }, "c"), { a: "a", b: 1 })
|
|
25
|
-
*
|
|
26
|
-
* @since 2.0.0
|
|
27
|
-
*/
|
|
28
|
-
export const omit = Struct.omit;
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RydWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1N0cnVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEtBQUssTUFBTSxNQUFNLGVBQWUsQ0FBQTtBQUV2QyxjQUFjLGVBQWUsQ0FBQTtBQUU3Qjs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBQyxNQUFNLElBQUksR0FVYixNQUFNLENBQUMsSUFBSSxDQUFBO0FBS2Y7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBUWIsTUFBTSxDQUFDLElBQVcsQ0FBQSJ9
|
package/src/Struct.ts
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
import type { Types } from "effect"
|
|
3
|
-
import * as Struct from "effect/Struct"
|
|
4
|
-
|
|
5
|
-
export * from "effect/Struct"
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Create a new object by picking properties of an existing object.
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* import { pick } from "effect/Struct"
|
|
12
|
-
* import { pipe } from "effect/Function"
|
|
13
|
-
*
|
|
14
|
-
* assert.deepStrictEqual(pipe({ a: "a", b: 1, c: true }, pick("a", "b")), { a: "a", b: 1 })
|
|
15
|
-
* assert.deepStrictEqual(pick({ a: "a", b: 1, c: true }, "a", "b"), { a: "a", b: 1 })
|
|
16
|
-
*
|
|
17
|
-
* @since 2.0.0
|
|
18
|
-
*/
|
|
19
|
-
export const pick: {
|
|
20
|
-
<Keys extends Array<PropertyKey>>(
|
|
21
|
-
keys: Keys
|
|
22
|
-
): <S extends { [K in Keys[number]]?: any }>(
|
|
23
|
-
s: S
|
|
24
|
-
) => Types.MatchRecord<S, { [K in Keys[number]]?: S[K] }, Pick<S, Keys[number]>>
|
|
25
|
-
<S extends object, Keys extends Array<keyof S>>(
|
|
26
|
-
s: S,
|
|
27
|
-
keys: Keys
|
|
28
|
-
): Types.MatchRecord<S, { [K in Keys[number]]?: S[K] }, Pick<S, Keys[number]>>
|
|
29
|
-
} = Struct.pick
|
|
30
|
-
|
|
31
|
-
export type DistributiveOmit<T, K extends keyof any> = T extends any ? Omit<T, K>
|
|
32
|
-
: never
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Create a new object by omitting properties of an existing object.
|
|
36
|
-
*
|
|
37
|
-
* @example
|
|
38
|
-
* import { omit } from "effect/Struct"
|
|
39
|
-
* import { pipe } from "effect/Function"
|
|
40
|
-
*
|
|
41
|
-
* assert.deepStrictEqual(pipe({ a: "a", b: 1, c: true }, omit("c")), { a: "a", b: 1 })
|
|
42
|
-
* assert.deepStrictEqual(omit({ a: "a", b: 1, c: true }, "c"), { a: "a", b: 1 })
|
|
43
|
-
*
|
|
44
|
-
* @since 2.0.0
|
|
45
|
-
*/
|
|
46
|
-
export const omit: {
|
|
47
|
-
<Keys extends Array<PropertyKey>>(
|
|
48
|
-
keys: Keys
|
|
49
|
-
): <S extends { [K in Keys[number]]?: any }>(s: S) => DistributiveOmit<S, Keys[number]>
|
|
50
|
-
<S extends object, Keys extends Array<keyof S>>(
|
|
51
|
-
s: S,
|
|
52
|
-
keys: Keys
|
|
53
|
-
): DistributiveOmit<S, Keys[number]>
|
|
54
|
-
} = Struct.omit as any
|