@effect-app/vue 4.0.0-beta.15 → 4.0.0-beta.151
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 +958 -0
- package/dist/commander.d.ts +370 -0
- package/dist/commander.d.ts.map +1 -0
- package/dist/commander.js +587 -0
- package/dist/confirm.d.ts +19 -0
- package/dist/confirm.d.ts.map +1 -0
- package/dist/confirm.js +24 -0
- package/dist/errorReporter.d.ts +4 -4
- package/dist/errorReporter.d.ts.map +1 -1
- package/dist/errorReporter.js +12 -18
- package/dist/form.d.ts +13 -4
- package/dist/form.d.ts.map +1 -1
- package/dist/form.js +38 -9
- package/dist/index.d.ts +1 -1
- package/dist/intl.d.ts +15 -0
- package/dist/intl.d.ts.map +1 -0
- package/dist/intl.js +9 -0
- package/dist/lib.d.ts +1 -1
- package/dist/lib.d.ts.map +1 -1
- package/dist/makeClient.d.ts +84 -275
- package/dist/makeClient.d.ts.map +1 -1
- package/dist/makeClient.js +44 -351
- package/dist/makeContext.d.ts +1 -1
- package/dist/makeContext.d.ts.map +1 -1
- package/dist/makeIntl.d.ts +1 -1
- package/dist/makeIntl.d.ts.map +1 -1
- package/dist/makeUseCommand.d.ts +8 -0
- package/dist/makeUseCommand.d.ts.map +1 -0
- package/dist/makeUseCommand.js +13 -0
- package/dist/mutate.d.ts +2 -2
- package/dist/mutate.d.ts.map +1 -1
- package/dist/mutate.js +1 -1
- package/dist/query.d.ts +11 -15
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +24 -24
- package/dist/routeParams.d.ts +1 -1
- package/dist/runtime.d.ts +5 -2
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +27 -17
- package/dist/toast.d.ts +46 -0
- package/dist/toast.d.ts.map +1 -0
- package/dist/toast.js +32 -0
- package/dist/withToast.d.ts +26 -0
- package/dist/withToast.d.ts.map +1 -0
- package/dist/withToast.js +49 -0
- package/package.json +46 -46
- package/src/{experimental/commander.ts → commander.ts} +922 -249
- package/src/{experimental/confirm.ts → confirm.ts} +10 -14
- package/src/errorReporter.ts +60 -72
- package/src/form.ts +51 -12
- package/src/intl.ts +12 -0
- package/src/makeClient.ts +177 -1008
- package/src/{experimental/makeUseCommand.ts → makeUseCommand.ts} +3 -3
- package/src/query.ts +45 -46
- package/src/runtime.ts +39 -18
- package/src/{experimental/toast.ts → toast.ts} +11 -25
- package/src/{experimental/withToast.ts → withToast.ts} +15 -6
- package/test/Mutation.test.ts +130 -10
- package/test/dist/form.test.d.ts.map +1 -1
- package/test/dist/stubs.d.ts +1053 -118
- package/test/dist/stubs.d.ts.map +1 -1
- package/test/dist/stubs.js +50 -23
- package/test/form-validation-errors.test.ts +23 -19
- package/test/form.test.ts +20 -2
- package/test/makeClient.test.ts +54 -39
- package/test/stubs.ts +61 -26
- package/tsconfig.json +0 -1
- package/dist/experimental/commander.d.ts +0 -359
- package/dist/experimental/commander.d.ts.map +0 -1
- package/dist/experimental/commander.js +0 -557
- package/dist/experimental/confirm.d.ts +0 -19
- package/dist/experimental/confirm.d.ts.map +0 -1
- package/dist/experimental/confirm.js +0 -28
- package/dist/experimental/intl.d.ts +0 -16
- package/dist/experimental/intl.d.ts.map +0 -1
- package/dist/experimental/intl.js +0 -5
- package/dist/experimental/makeUseCommand.d.ts +0 -8
- package/dist/experimental/makeUseCommand.d.ts.map +0 -1
- package/dist/experimental/makeUseCommand.js +0 -13
- package/dist/experimental/toast.d.ts +0 -47
- package/dist/experimental/toast.d.ts.map +0 -1
- package/dist/experimental/toast.js +0 -41
- package/dist/experimental/withToast.d.ts +0 -25
- package/dist/experimental/withToast.d.ts.map +0 -1
- package/dist/experimental/withToast.js +0 -45
- package/src/experimental/intl.ts +0 -9
package/test/dist/stubs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stubs.d.ts","sourceRoot":"","sources":["../stubs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,oCAAoC,CAAA;AAE9E,OAAO,EAAU,KAAK,EAA0B,CAAC,EAAE,MAAM,YAAY,CAAA;AACrE,OAAO,EAAE,gBAAgB,EAAiB,MAAM,mBAAmB,CAAA;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAG9C,OAAO,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"stubs.d.ts","sourceRoot":"","sources":["../stubs.ts"],"names":[],"mappings":"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"}
|
package/test/dist/stubs.js
CHANGED
|
@@ -4,12 +4,12 @@ import { ApiClientFactory, makeRpcClient } from "effect-app/client";
|
|
|
4
4
|
import { RpcContextMap } from "effect-app/rpc";
|
|
5
5
|
import * as FetchHttpClient from "effect/unstable/http/FetchHttpClient";
|
|
6
6
|
import { ref } from "vue";
|
|
7
|
-
import { Commander } from "../src/
|
|
8
|
-
import { I18n } from "../src/
|
|
9
|
-
import {
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
import {
|
|
7
|
+
import { Commander } from "../src/commander.js";
|
|
8
|
+
import { I18n } from "../src/intl.js";
|
|
9
|
+
import { makeClient } from "../src/makeClient.js";
|
|
10
|
+
import { makeUseCommand } from "../src/makeUseCommand.js";
|
|
11
|
+
import * as Toast from "../src/toast.js";
|
|
12
|
+
import { WithToast } from "../src/withToast.js";
|
|
13
13
|
const fakeToastLayer = (toasts = []) => Layer.effect(Toast.Toast, Effect.sync(() => {
|
|
14
14
|
const dismiss = (id) => {
|
|
15
15
|
const idx = toasts.findIndex((_) => _.id === id);
|
|
@@ -19,21 +19,21 @@ const fakeToastLayer = (toasts = []) => Layer.effect(Toast.Toast, Effect.sync(()
|
|
|
19
19
|
toasts.splice(idx, 1);
|
|
20
20
|
}
|
|
21
21
|
};
|
|
22
|
-
const fakeToast = (message, options) => {
|
|
22
|
+
const fakeToast = (type) => (message, options) => {
|
|
23
23
|
const id = options?.id ?? Math.random().toString(36).substring(2, 15);
|
|
24
|
-
console.log(`Toast [${id}]: ${message}`, options);
|
|
24
|
+
console.log(`Toast [${type}][${id}]: ${message}`, options);
|
|
25
25
|
options = { ...options, id };
|
|
26
26
|
const idx = toasts.findIndex((_) => _.id === id);
|
|
27
27
|
if (idx > -1) {
|
|
28
28
|
const toast = toasts[idx];
|
|
29
29
|
clearTimeout(toast.timeoutId);
|
|
30
|
-
Object.assign(toast, { message, options });
|
|
30
|
+
Object.assign(toast, { type, message, options });
|
|
31
31
|
toast.timeoutId = setTimeout(() => {
|
|
32
32
|
toasts.splice(idx, 1);
|
|
33
33
|
}, options?.timeout ?? 3000);
|
|
34
34
|
}
|
|
35
35
|
else {
|
|
36
|
-
const toast = { id, message, options };
|
|
36
|
+
const toast = { id, type, message, options };
|
|
37
37
|
toast.timeoutId = setTimeout(() => {
|
|
38
38
|
toasts.splice(idx, 1);
|
|
39
39
|
}, options?.timeout ?? 3000);
|
|
@@ -42,10 +42,10 @@ const fakeToastLayer = (toasts = []) => Layer.effect(Toast.Toast, Effect.sync(()
|
|
|
42
42
|
return id;
|
|
43
43
|
};
|
|
44
44
|
return Toast.Toast.of(Toast.wrap({
|
|
45
|
-
error: fakeToast,
|
|
46
|
-
warning: fakeToast,
|
|
47
|
-
success: fakeToast,
|
|
48
|
-
info: fakeToast,
|
|
45
|
+
error: fakeToast("error"),
|
|
46
|
+
warning: fakeToast("warning"),
|
|
47
|
+
success: fakeToast("success"),
|
|
48
|
+
info: fakeToast("info"),
|
|
49
49
|
dismiss
|
|
50
50
|
}));
|
|
51
51
|
}));
|
|
@@ -76,29 +76,56 @@ export const useExperimental = (options) => {
|
|
|
76
76
|
};
|
|
77
77
|
export class RequestContextMap extends RpcContextMap.makeMap({}) {
|
|
78
78
|
}
|
|
79
|
-
export const {
|
|
80
|
-
export
|
|
79
|
+
export const { TaggedRequestFor } = makeRpcClient(RequestContextMap);
|
|
80
|
+
export const SomethingReq = TaggedRequestFor("Something");
|
|
81
|
+
const SomethingQuery = SomethingReq.Query;
|
|
82
|
+
const SomethingCommand = SomethingReq.Command;
|
|
83
|
+
class SomethingGetSomething2 extends SomethingQuery()("GetSomething2", {
|
|
81
84
|
id: S.String
|
|
82
|
-
}, { success: S.
|
|
85
|
+
}, { success: S.FiniteFromString }) {
|
|
83
86
|
}
|
|
84
|
-
|
|
87
|
+
class SomethingGetSomething2WithDependencies extends SomethingQuery()("GetSomething2", {
|
|
85
88
|
id: S.String
|
|
86
89
|
}, {
|
|
87
90
|
// this is intentilally fake, to simulate a codec that requires a dependency
|
|
88
|
-
success: S.
|
|
91
|
+
success: S.FiniteFromString,
|
|
89
92
|
error: S.String
|
|
90
93
|
}) {
|
|
91
94
|
}
|
|
92
|
-
|
|
95
|
+
class SomethingDoSomething extends SomethingCommand()("DoSomething", {
|
|
96
|
+
id: S.String
|
|
97
|
+
}, { success: S.FiniteFromString }) {
|
|
98
|
+
}
|
|
99
|
+
export const Something = {
|
|
100
|
+
GetSomething2: SomethingGetSomething2,
|
|
101
|
+
GetSomething2WithDependencies: SomethingGetSomething2WithDependencies,
|
|
102
|
+
DoSomething: SomethingDoSomething
|
|
103
|
+
};
|
|
104
|
+
export const SomethingElseReq = TaggedRequestFor("SomethingElse");
|
|
105
|
+
const SomethingElseQuery = SomethingElseReq.Query;
|
|
106
|
+
class SomethingElseGetSomething2 extends SomethingElseQuery()("GetSomething2", {
|
|
107
|
+
id: S.String
|
|
108
|
+
}, { success: S.FiniteFromString }) {
|
|
109
|
+
}
|
|
110
|
+
class SomethingElseGetSomething2WithDependencies extends SomethingElseQuery()("GetSomething2", {
|
|
111
|
+
id: S.String
|
|
112
|
+
}, {
|
|
113
|
+
success: S.FiniteFromString,
|
|
114
|
+
error: S.String
|
|
115
|
+
}) {
|
|
116
|
+
}
|
|
117
|
+
export const SomethingElse = {
|
|
118
|
+
GetSomething2: SomethingElseGetSomething2,
|
|
119
|
+
GetSomething2WithDependencies: SomethingElseGetSomething2WithDependencies
|
|
120
|
+
};
|
|
93
121
|
export const useClient = (options) => {
|
|
94
122
|
const FakeIntlLayer = fakeIntlLayer(options?.messages);
|
|
95
123
|
const FakeToastLayer = fakeToastLayer(options?.toasts);
|
|
96
124
|
const CommanderLayer = Commander.Default.pipe(Layer.provide([FakeIntlLayer, FakeToastLayer]));
|
|
97
125
|
const WithToastLayer = WithToast.Default.pipe(Layer.provide(FakeToastLayer));
|
|
98
126
|
const api = ApiClientFactory.layer({ url: "bogus", headers: Option.none() }).pipe(Layer.provide(FetchHttpClient.layer));
|
|
99
|
-
const
|
|
100
|
-
const layers = Layer.mergeAll(CommanderLayer, WithToastLayer, FakeToastLayer, FakeIntlLayer, api, lm);
|
|
127
|
+
const layers = Layer.mergeAll(CommanderLayer, WithToastLayer, FakeToastLayer, FakeIntlLayer, api);
|
|
101
128
|
const clientFor_ = ApiClientFactory.makeFor(Layer.empty);
|
|
102
129
|
return makeClient(() => ManagedRuntime.make(layers), clientFor_, Layer.empty);
|
|
103
130
|
};
|
|
104
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
131
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3R1YnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zdHVicy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEtBQUssSUFBSSxNQUFNLGdCQUFnQixDQUFBO0FBQ3RDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ3JFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNuRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDOUMsT0FBTyxLQUFLLGVBQWUsTUFBTSxzQ0FBc0MsQ0FBQTtBQUN2RSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sS0FBSyxDQUFBO0FBQ3pCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUMvQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDckMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBRWpELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUN6RCxPQUFPLEtBQUssS0FBSyxNQUFNLGlCQUFpQixDQUFBO0FBQ3hDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUUvQyxNQUFNLGNBQWMsR0FBRyxDQUFDLE1BQU0sR0FBVSxFQUFFLEVBQUUsRUFBRSxDQUM1QyxLQUFLLENBQUMsTUFBTSxDQUNWLEtBQUssQ0FBQyxLQUFLLEVBQ1gsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7SUFDZixNQUFNLE9BQU8sR0FBRyxDQUFDLEVBQWlCLEVBQUUsRUFBRTtRQUNwQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVB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
|
|
@@ -4,7 +4,7 @@ import { buildFieldInfoFromFieldsRoot, translate } from "../src/form.js"
|
|
|
4
4
|
// test schema with integer field
|
|
5
5
|
class TestSchema extends S.Class<TestSchema>("TestSchema")({
|
|
6
6
|
integerField: S.Int,
|
|
7
|
-
numberField: S.
|
|
7
|
+
numberField: S.Finite,
|
|
8
8
|
stringField: S.String
|
|
9
9
|
}) {}
|
|
10
10
|
|
|
@@ -137,22 +137,26 @@ it("validates integer field with valid integer", () =>
|
|
|
137
137
|
.pipe(Effect.runPromise))
|
|
138
138
|
|
|
139
139
|
it("error message format matches regex pattern", () => {
|
|
140
|
-
// test the actual error message format from Effect Schema
|
|
141
|
-
const
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
expect(
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
const
|
|
156
|
-
expect(
|
|
157
|
-
expect(
|
|
140
|
+
// test the actual error message format from Effect Schema (both old "actual" and new "got" formats)
|
|
141
|
+
const errorMessageOld = `Expected an integer, actual 59.5`
|
|
142
|
+
const errorMessageNew = `SchemaError(Expected an integer, got 59.5)`
|
|
143
|
+
|
|
144
|
+
const oldMatch = errorMessageOld.match(/Expected.*integer.*(?:actual|got)\s+([^)]+)/i)
|
|
145
|
+
expect(oldMatch).toBeTruthy()
|
|
146
|
+
expect(oldMatch![1]).toBe("59.5")
|
|
147
|
+
|
|
148
|
+
const newMatch = errorMessageNew.match(/Expected.*integer.*(?:actual|got)\s+([^)]+)/i)
|
|
149
|
+
expect(newMatch).toBeTruthy()
|
|
150
|
+
expect(newMatch![1]).toBe("59.5")
|
|
151
|
+
|
|
152
|
+
const numberErrorOld = `Expected a number, actual "not-a-number"`
|
|
153
|
+
const numberErrorNew = `SchemaError(Expected a finite number, got "not-a-number")`
|
|
154
|
+
|
|
155
|
+
const numOldMatch = numberErrorOld.match(/Expected.*number.*(?:actual|got)\s+([^)]+)/i)
|
|
156
|
+
expect(numOldMatch).toBeTruthy()
|
|
157
|
+
expect(numOldMatch![1]).toBe("\"not-a-number\"")
|
|
158
|
+
|
|
159
|
+
const numNewMatch = numberErrorNew.match(/Expected.*number.*(?:actual|got)\s+([^)]+)/i)
|
|
160
|
+
expect(numNewMatch).toBeTruthy()
|
|
161
|
+
expect(numNewMatch![1]).toBe("\"not-a-number\"")
|
|
158
162
|
})
|
package/test/form.test.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Effect, S } from "effect-app"
|
|
2
|
-
import { buildFieldInfoFromFieldsRoot, type DiscriminatedUnionFieldInfo, type FieldInfo, type NestedFieldInfo, type UnionFieldInfo } from "../src/form.js"
|
|
2
|
+
import { buildFieldInfoFromFieldsRoot, type DiscriminatedUnionFieldInfo, type FieldInfo, getMetadataFromSchema, type NestedFieldInfo, type UnionFieldInfo } from "../src/form.js"
|
|
3
3
|
|
|
4
4
|
export class NestedSchema extends S.Class<NestedSchema>("NestedSchema")({
|
|
5
5
|
shallow: S.String,
|
|
@@ -9,7 +9,11 @@ export class NestedSchema extends S.Class<NestedSchema>("NestedSchema")({
|
|
|
9
9
|
deepest: S.Number
|
|
10
10
|
})
|
|
11
11
|
}),
|
|
12
|
-
age: S.Struct({ nfs: S.NumberFromString.pipe(S.decodeTo(S.PositiveInt)) })
|
|
12
|
+
age: S.Struct({ nfs: S.NumberFromString.pipe(S.decodeTo(S.PositiveInt)) }),
|
|
13
|
+
testNumber: S.Number,
|
|
14
|
+
testFinite: S.Finite,
|
|
15
|
+
testNullableNummber: S.NullOr(S.Number),
|
|
16
|
+
testOptionalNumber: S.optional(S.Number)
|
|
13
17
|
}) {}
|
|
14
18
|
|
|
15
19
|
export class SchemaContainsClass extends S.Class<SchemaContainsClass>("SchemaContainsClass")({
|
|
@@ -156,6 +160,15 @@ function testDiscriminatedUnionFieldInfo<T extends Record<PropertyKey, any>>(duf
|
|
|
156
160
|
)
|
|
157
161
|
}
|
|
158
162
|
|
|
163
|
+
it("getMetadataFromSchema handles composed numeric schemas", () => {
|
|
164
|
+
expect(getMetadataFromSchema(S.Number.ast).type).toBe("float")
|
|
165
|
+
expect(getMetadataFromSchema(S.Finite.ast).type).toBe("float")
|
|
166
|
+
expect(getMetadataFromSchema(S.PositiveNumber.ast).type).toBe("float")
|
|
167
|
+
expect(getMetadataFromSchema(S.Int.ast).type).toBe("int")
|
|
168
|
+
expect(getMetadataFromSchema(S.PositiveInt.ast).type).toBe("int")
|
|
169
|
+
expect(getMetadataFromSchema(S.NullOr(S.Number).ast).type).toBe("float")
|
|
170
|
+
})
|
|
171
|
+
|
|
159
172
|
it("buildFieldInfo", () =>
|
|
160
173
|
Effect
|
|
161
174
|
.gen(function*() {
|
|
@@ -176,6 +189,11 @@ it("buildFieldInfo", () =>
|
|
|
176
189
|
testNestedFieldInfo(nestedFieldinfo)
|
|
177
190
|
testNestedFieldInfo(nestedFieldinfo.fields.nested)
|
|
178
191
|
testNestedFieldInfo(nestedFieldinfo.fields.age)
|
|
192
|
+
|
|
193
|
+
expect(nestedFieldinfo.fields.testNumber.type).toBe("float")
|
|
194
|
+
expect(nestedFieldinfo.fields.testFinite.type).toBe("float")
|
|
195
|
+
expect(nestedFieldinfo.fields.testNullableNummber.type).toBe("float")
|
|
196
|
+
expect(nestedFieldinfo.fields.testOptionalNumber.type).toBe("float")
|
|
179
197
|
})
|
|
180
198
|
.pipe(Effect.runPromise))
|
|
181
199
|
|
package/test/makeClient.test.ts
CHANGED
|
@@ -1,94 +1,109 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
import {
|
|
3
|
-
import { Something, useClient, useExperimental } from "./stubs.js"
|
|
4
|
-
|
|
5
|
-
it
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
2
|
+
import { makeQueryKey } from "../src/lib.js"
|
|
3
|
+
import { Something, SomethingElse, SomethingElseReq, SomethingReq, useClient, useExperimental } from "./stubs.js"
|
|
4
|
+
|
|
5
|
+
it("TaggedRequestFor .moduleName and request .id / .moduleName", () => {
|
|
6
|
+
expectTypeOf(SomethingReq.moduleName).toEqualTypeOf<"Something">()
|
|
7
|
+
expectTypeOf(SomethingElseReq.moduleName).toEqualTypeOf<"SomethingElse">()
|
|
8
|
+
|
|
9
|
+
expectTypeOf(Something.GetSomething2.moduleName).toEqualTypeOf<"Something">()
|
|
10
|
+
expectTypeOf(Something.GetSomething2.id).toEqualTypeOf<"Something.GetSomething2">()
|
|
11
|
+
expectTypeOf(Something.GetSomething2.type).toEqualTypeOf<"query">()
|
|
12
|
+
expectTypeOf(Something.DoSomething.type).toEqualTypeOf<"command">()
|
|
13
|
+
|
|
14
|
+
expectTypeOf(SomethingElse.GetSomething2.moduleName).toEqualTypeOf<"SomethingElse">()
|
|
15
|
+
expectTypeOf(SomethingElse.GetSomething2.id).toEqualTypeOf<"SomethingElse.GetSomething2">()
|
|
16
|
+
})
|
|
12
17
|
|
|
13
|
-
|
|
18
|
+
it.skip("query type tests", () => {
|
|
19
|
+
const { clientFor } = useClient()
|
|
20
|
+
const client = clientFor(Something, () => ({
|
|
21
|
+
GetSomething2WithDependencies: (queryKey) => [
|
|
22
|
+
{ filters: { queryKey } },
|
|
23
|
+
{
|
|
24
|
+
filters: {
|
|
25
|
+
queryKey: makeQueryKey(
|
|
26
|
+
SomethingElse
|
|
27
|
+
.GetSomething2
|
|
28
|
+
)
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
}))
|
|
33
|
+
|
|
34
|
+
const q = client.GetSomething2.query
|
|
35
|
+
|
|
36
|
+
const [, z] = q({ id: "a" })
|
|
14
37
|
const valz = z.value
|
|
15
38
|
expectTypeOf(valz).toEqualTypeOf<number | undefined>()
|
|
16
39
|
|
|
17
|
-
const [, a] =
|
|
40
|
+
const [, a] = q({ id: "a" }, { placeholderData: () => 123 })
|
|
18
41
|
const val1 = a.value
|
|
19
42
|
expectTypeOf(val1).toEqualTypeOf<number>()
|
|
20
43
|
|
|
21
|
-
const [, bbbb] =
|
|
44
|
+
const [, bbbb] = q({ id: "a" }, { select: (data) => data.toString() })
|
|
22
45
|
const val = bbbb.value
|
|
23
46
|
expectTypeOf(val).toEqualTypeOf<string | undefined>()
|
|
24
47
|
|
|
25
|
-
const [, ccc] =
|
|
48
|
+
const [, ccc] = q({ id: "a" }, { placeholderData: () => 123, select: (data) => data.toString() })
|
|
26
49
|
const val2 = ccc.value
|
|
27
50
|
expectTypeOf(val2).toEqualTypeOf<string>()
|
|
28
51
|
|
|
29
|
-
const [, ddd] =
|
|
52
|
+
const [, ddd] = q({ id: "a" }, { initialData: 123, select: (data) => data.toString() })
|
|
30
53
|
const val3 = ddd.value
|
|
31
54
|
expectTypeOf(val3).toEqualTypeOf<string>()
|
|
32
55
|
|
|
33
|
-
const [, eee] =
|
|
56
|
+
const [, eee] = q({ id: "a" }, { initialData: 123, placeholderData: () => 123, select: (data) => data.toString() })
|
|
34
57
|
const val4 = eee.value
|
|
35
58
|
expectTypeOf(val4).toEqualTypeOf<string>()
|
|
36
59
|
})
|
|
37
60
|
|
|
38
61
|
it.skip("works", () => {
|
|
39
|
-
const { clientFor
|
|
62
|
+
const { clientFor } = useClient()
|
|
40
63
|
const client = clientFor(Something)
|
|
41
64
|
const Command = useExperimental()
|
|
42
65
|
|
|
43
66
|
// just for jsdoc / type testing.
|
|
44
|
-
const a0 = client.GetSomething2(null as any)
|
|
45
|
-
const a00 = client.
|
|
67
|
+
const a0 = client.GetSomething2.request(null as any)
|
|
68
|
+
const a00 = client.DoSomething.mutate(null as any)
|
|
46
69
|
const a = client.GetSomething2.suspense(null as any)
|
|
47
70
|
const b = client.GetSomething2.query(null as any)
|
|
48
71
|
|
|
49
|
-
|
|
50
|
-
const c = legacy.useQuery(null as any)
|
|
51
|
-
const d = legacy.useSuspenseQuery(null as any)
|
|
52
|
-
|
|
72
|
+
// @ts-expect-error query requests no longer expose command helpers
|
|
53
73
|
const e = client.GetSomething2.wrap(null as any)
|
|
74
|
+
// @ts-expect-error query requests no longer expose command helpers
|
|
54
75
|
const f = client.GetSomething2.fn(null as any)
|
|
55
76
|
|
|
56
|
-
// @ts-expect-error
|
|
57
|
-
const e0 = client.GetSomething2WithDependencies.wrap
|
|
58
|
-
// @ts-expect-error
|
|
59
|
-
const e000 = Command.wrap(client.GetSomething2WithDependencies)
|
|
60
|
-
const e00 = client.GetSomething2WithDependencies.wrap((_) => _ as Effect.Effect<number, never, never>).handle(
|
|
61
|
-
null as any
|
|
62
|
-
)
|
|
63
|
-
const e0000 =
|
|
64
|
-
Command.wrap(client.GetSomething2WithDependencies)((_) => _ as Effect.Effect<number, never, never>).handle
|
|
77
|
+
// @ts-expect-error query requests no longer expose command helpers
|
|
78
|
+
const e0 = client.GetSomething2WithDependencies.wrap
|
|
79
|
+
// @ts-expect-error query request does not match Command.wrap mutation signature
|
|
80
|
+
const e000 = Command.wrap(client.GetSomething2WithDependencies)
|
|
65
81
|
// @ts-expect-error dependencies required that are not provided
|
|
66
82
|
const e1 = client.GetSomething2WithDependencies.suspense(null as any)
|
|
67
83
|
// @ts-expect-error dependencies required that are not provided
|
|
68
84
|
const e2 = client.GetSomething2WithDependencies.query(null as any)
|
|
85
|
+
// @ts-expect-error query requests no longer expose command helpers
|
|
69
86
|
const f0 = client.GetSomething2WithDependencies.fn(null as any)
|
|
70
87
|
|
|
71
|
-
const
|
|
72
|
-
const
|
|
88
|
+
const g0 = client.DoSomething.wrap(null as any)
|
|
89
|
+
const g = client.DoSomething.mutate.wrap(null as any)
|
|
90
|
+
// @ts-expect-error mutate no longer exposes fn, use client.DoSomething.fn
|
|
91
|
+
const h = client.DoSomething.mutate.fn(null as any)
|
|
73
92
|
|
|
74
93
|
expect(true).toBe(true)
|
|
75
94
|
console.log({
|
|
76
95
|
a,
|
|
77
96
|
a0,
|
|
78
97
|
a00,
|
|
79
|
-
c0,
|
|
80
98
|
b,
|
|
81
|
-
c,
|
|
82
|
-
d,
|
|
83
99
|
e,
|
|
84
100
|
e0,
|
|
85
|
-
e00,
|
|
86
101
|
e000,
|
|
87
|
-
e0000,
|
|
88
102
|
e1,
|
|
89
103
|
e2,
|
|
90
104
|
f,
|
|
91
105
|
f0,
|
|
106
|
+
g0,
|
|
92
107
|
g,
|
|
93
108
|
h
|
|
94
109
|
})
|
package/test/stubs.ts
CHANGED
|
@@ -6,13 +6,13 @@ import { ApiClientFactory, makeRpcClient } from "effect-app/client"
|
|
|
6
6
|
import { RpcContextMap } from "effect-app/rpc"
|
|
7
7
|
import * as FetchHttpClient from "effect/unstable/http/FetchHttpClient"
|
|
8
8
|
import { ref } from "vue"
|
|
9
|
-
import { Commander } from "../src/
|
|
10
|
-
import { I18n } from "../src/
|
|
11
|
-
import {
|
|
12
|
-
import * as Toast from "../src/experimental/toast.js"
|
|
13
|
-
import { WithToast } from "../src/experimental/withToast.js"
|
|
14
|
-
import { LegacyMutation, makeClient } from "../src/makeClient.js"
|
|
9
|
+
import { Commander } from "../src/commander.js"
|
|
10
|
+
import { I18n } from "../src/intl.js"
|
|
11
|
+
import { makeClient } from "../src/makeClient.js"
|
|
15
12
|
import { type MakeIntlReturn } from "../src/makeIntl.js"
|
|
13
|
+
import { makeUseCommand } from "../src/makeUseCommand.js"
|
|
14
|
+
import * as Toast from "../src/toast.js"
|
|
15
|
+
import { WithToast } from "../src/withToast.js"
|
|
16
16
|
|
|
17
17
|
const fakeToastLayer = (toasts: any[] = []) =>
|
|
18
18
|
Layer.effect(
|
|
@@ -26,21 +26,21 @@ const fakeToastLayer = (toasts: any[] = []) =>
|
|
|
26
26
|
toasts.splice(idx, 1)
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
|
-
const fakeToast = (message: string, options?: Toast.ToastOpts) => {
|
|
29
|
+
const fakeToast = (type: "error" | "warning" | "success" | "info") => (message: string, options?: Toast.ToastOpts) => {
|
|
30
30
|
const id = options?.id ?? Math.random().toString(36).substring(2, 15)
|
|
31
|
-
console.log(`Toast [${id}]: ${message}`, options)
|
|
31
|
+
console.log(`Toast [${type}][${id}]: ${message}`, options)
|
|
32
32
|
|
|
33
33
|
options = { ...options, id }
|
|
34
34
|
const idx = toasts.findIndex((_) => _.id === id)
|
|
35
35
|
if (idx > -1) {
|
|
36
36
|
const toast = toasts[idx]
|
|
37
37
|
clearTimeout(toast.timeoutId)
|
|
38
|
-
Object.assign(toast, { message, options })
|
|
38
|
+
Object.assign(toast, { type, message, options })
|
|
39
39
|
toast.timeoutId = setTimeout(() => {
|
|
40
40
|
toasts.splice(idx, 1)
|
|
41
41
|
}, options?.timeout ?? 3000)
|
|
42
42
|
} else {
|
|
43
|
-
const toast: any = { id, message, options }
|
|
43
|
+
const toast: any = { id, type, message, options }
|
|
44
44
|
toast.timeoutId = setTimeout(() => {
|
|
45
45
|
toasts.splice(idx, 1)
|
|
46
46
|
}, options?.timeout ?? 3000)
|
|
@@ -49,10 +49,10 @@ const fakeToastLayer = (toasts: any[] = []) =>
|
|
|
49
49
|
return id
|
|
50
50
|
}
|
|
51
51
|
return Toast.Toast.of(Toast.wrap({
|
|
52
|
-
error: fakeToast,
|
|
53
|
-
warning: fakeToast,
|
|
54
|
-
success: fakeToast,
|
|
55
|
-
info: fakeToast,
|
|
52
|
+
error: fakeToast("error"),
|
|
53
|
+
warning: fakeToast("warning"),
|
|
54
|
+
success: fakeToast("success"),
|
|
55
|
+
info: fakeToast("info"),
|
|
56
56
|
dismiss
|
|
57
57
|
})) as any
|
|
58
58
|
})
|
|
@@ -92,20 +92,56 @@ export const useExperimental = (
|
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
export class RequestContextMap extends RpcContextMap.makeMap({}) {}
|
|
95
|
-
export const {
|
|
96
|
-
|
|
95
|
+
export const { TaggedRequestFor } = makeRpcClient(RequestContextMap)
|
|
96
|
+
|
|
97
|
+
export const SomethingReq = TaggedRequestFor("Something")
|
|
98
|
+
const SomethingQuery = SomethingReq.Query
|
|
99
|
+
const SomethingCommand = SomethingReq.Command
|
|
100
|
+
|
|
101
|
+
class SomethingGetSomething2 extends SomethingQuery<SomethingGetSomething2>()("GetSomething2", {
|
|
102
|
+
id: S.String
|
|
103
|
+
}, { success: S.FiniteFromString }) {}
|
|
104
|
+
|
|
105
|
+
class SomethingGetSomething2WithDependencies
|
|
106
|
+
extends SomethingQuery<SomethingGetSomething2WithDependencies>()("GetSomething2", {
|
|
107
|
+
id: S.String
|
|
108
|
+
}, {
|
|
109
|
+
// this is intentilally fake, to simulate a codec that requires a dependency
|
|
110
|
+
success: S.FiniteFromString as S.Codec<number, string, "dep-a">,
|
|
111
|
+
error: S.String
|
|
112
|
+
})
|
|
113
|
+
{}
|
|
114
|
+
|
|
115
|
+
class SomethingDoSomething extends SomethingCommand<SomethingDoSomething>()("DoSomething", {
|
|
97
116
|
id: S.String
|
|
98
|
-
}, { success: S.
|
|
117
|
+
}, { success: S.FiniteFromString }) {}
|
|
99
118
|
|
|
100
|
-
export
|
|
119
|
+
export const Something = {
|
|
120
|
+
GetSomething2: SomethingGetSomething2,
|
|
121
|
+
GetSomething2WithDependencies: SomethingGetSomething2WithDependencies,
|
|
122
|
+
DoSomething: SomethingDoSomething
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export const SomethingElseReq = TaggedRequestFor("SomethingElse")
|
|
126
|
+
const SomethingElseQuery = SomethingElseReq.Query
|
|
127
|
+
|
|
128
|
+
class SomethingElseGetSomething2 extends SomethingElseQuery<SomethingElseGetSomething2>()("GetSomething2", {
|
|
101
129
|
id: S.String
|
|
102
|
-
}, {
|
|
103
|
-
// this is intentilally fake, to simulate a codec that requires a dependency
|
|
104
|
-
success: S.NumberFromString as S.Codec<number, string, "dep-a">,
|
|
105
|
-
error: S.String
|
|
106
|
-
}) {}
|
|
130
|
+
}, { success: S.FiniteFromString }) {}
|
|
107
131
|
|
|
108
|
-
|
|
132
|
+
class SomethingElseGetSomething2WithDependencies
|
|
133
|
+
extends SomethingElseQuery<SomethingElseGetSomething2WithDependencies>()("GetSomething2", {
|
|
134
|
+
id: S.String
|
|
135
|
+
}, {
|
|
136
|
+
success: S.FiniteFromString as S.Codec<number, string, "dep-a">,
|
|
137
|
+
error: S.String
|
|
138
|
+
})
|
|
139
|
+
{}
|
|
140
|
+
|
|
141
|
+
export const SomethingElse = {
|
|
142
|
+
GetSomething2: SomethingElseGetSomething2,
|
|
143
|
+
GetSomething2WithDependencies: SomethingElseGetSomething2WithDependencies
|
|
144
|
+
}
|
|
109
145
|
|
|
110
146
|
export const useClient = (
|
|
111
147
|
options?: { messages?: Record<string, string> | Record<string, MessageFormatElement[]>; toasts: any[] }
|
|
@@ -117,8 +153,7 @@ export const useClient = (
|
|
|
117
153
|
const api = ApiClientFactory.layer({ url: "bogus", headers: Option.none() }).pipe(
|
|
118
154
|
Layer.provide(FetchHttpClient.layer)
|
|
119
155
|
)
|
|
120
|
-
const
|
|
121
|
-
const layers = Layer.mergeAll(CommanderLayer, WithToastLayer, FakeToastLayer, FakeIntlLayer, api, lm)
|
|
156
|
+
const layers = Layer.mergeAll(CommanderLayer, WithToastLayer, FakeToastLayer, FakeIntlLayer, api)
|
|
122
157
|
|
|
123
158
|
const clientFor_ = ApiClientFactory.makeFor(Layer.empty)
|
|
124
159
|
return makeClient(() => ManagedRuntime.make(layers), clientFor_, Layer.empty)
|