effect-app 4.0.0-beta.306 → 4.0.0-beta.308
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 +17 -0
- package/dist/Model/Repository/ext.d.ts +14 -14
- package/dist/Model/Repository/ext.d.ts.map +1 -1
- package/dist/Model/Repository/ext.js +15 -13
- package/dist/Model/query/dsl.d.ts +34 -14
- package/dist/Model/query/dsl.d.ts.map +1 -1
- package/dist/Model/query/dsl.js +43 -43
- package/dist/Model/query/new-kid-interpreter.js +1 -1
- package/dist/ids.js +1 -1
- package/package.json +1 -1
- package/src/Model/Repository/ext.ts +44 -45
- package/src/Model/query/dsl.ts +105 -68
- package/src/Model/query/new-kid-interpreter.ts +8 -8
- package/src/ids.ts +1 -1
- package/tsconfig.json +6 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# @effect-app/prelude
|
|
2
2
|
|
|
3
|
+
## 4.0.0-beta.308
|
|
4
|
+
|
|
5
|
+
## 4.0.0-beta.307
|
|
6
|
+
|
|
7
|
+
### Patch Changes
|
|
8
|
+
|
|
9
|
+
- 40585ca: Keep tag-aware `ProjectableFromDomain` for `projectComputed` only; restore loose key-presence guard for `project()` so view DTOs with reshaped fields keep typechecking.
|
|
10
|
+
- ad0ede6: Keep tag-aware `ProjectableGuard` on both `project()` and `projectComputed` (no loose key-only paper-over).
|
|
11
|
+
|
|
12
|
+
Hardening:
|
|
13
|
+
|
|
14
|
+
- single-literal tags allow dual same-tag domain variants (KeysOfUnion of matched members)
|
|
15
|
+
- multi-tag / string tags still require keys on every matched member
|
|
16
|
+
- optional projection/domain keys checked by key presence only (not optional-assignability)
|
|
17
|
+
|
|
18
|
+
Call sites must project domain-owned fields per tagged state.
|
|
19
|
+
|
|
3
20
|
## 4.0.0-beta.306
|
|
4
21
|
|
|
5
22
|
### Patch Changes
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { NonEmptyArray } from "../../Array.js";
|
|
2
|
-
import { type InvalidStateError, NotFoundError, type OptimisticConcurrencyException } from "../../client/errors.js";
|
|
2
|
+
import { type DatabaseError, type InvalidStateError, NotFoundError, type OptimisticConcurrencyException } from "../../client/errors.js";
|
|
3
3
|
import * as Effect from "../../Effect.js";
|
|
4
4
|
import { type FixEnv, type PureEnv } from "../../Pure.js";
|
|
5
5
|
import type { FieldValues } from "../filter/types.js";
|
|
@@ -9,48 +9,48 @@ interface BatchOptions {
|
|
|
9
9
|
readonly batch?: true | number;
|
|
10
10
|
}
|
|
11
11
|
export declare const extendRepo: <T, Encoded extends FieldValues, Evt, ItemType extends string, IdKey extends keyof T & keyof Encoded, RSchema, RPublish, RProvided = never>(repo: Repository<T, Encoded, Evt, ItemType, IdKey, RSchema, RPublish, RProvided>) => Repository<T, Encoded, Evt, ItemType, IdKey, RSchema, RPublish, RProvided> & {
|
|
12
|
-
request: (id: T[IdKey]) => Effect.Effect<T, NotFoundError<ItemType>, never>;
|
|
13
|
-
get: (id: T[IdKey]) => Effect.Effect<T,
|
|
12
|
+
request: (id: T[IdKey]) => Effect.Effect<T, DatabaseError | NotFoundError<ItemType>, never>;
|
|
13
|
+
get: (id: T[IdKey]) => Effect.Effect<T, DatabaseError | NotFoundError<ItemType>, RSchema>;
|
|
14
14
|
log: (evt: Evt) => import("../../Pure.js").PureLogT<any>;
|
|
15
15
|
/**
|
|
16
16
|
* Enables chunked writes for large batches via `options.batch`.
|
|
17
17
|
* Note: batching breaks transactional properties because chunks are saved independently.
|
|
18
18
|
*/
|
|
19
|
-
save: (itemOrItems: T | ReadonlyArray<T>, options?: BatchOptions) => Effect.Effect<void, InvalidStateError | OptimisticConcurrencyException,
|
|
20
|
-
saveWithEvents: (events: Iterable<Evt>) => (...items: NonEmptyArray<T>) => Effect.Effect<void,
|
|
19
|
+
save: (itemOrItems: T | ReadonlyArray<T>, options?: BatchOptions) => Effect.Effect<void, DatabaseError | InvalidStateError | OptimisticConcurrencyException, RPublish | RSchema>;
|
|
20
|
+
saveWithEvents: (events: Iterable<Evt>) => (...items: NonEmptyArray<T>) => Effect.Effect<void, DatabaseError | InvalidStateError | OptimisticConcurrencyException, RPublish | RSchema>;
|
|
21
21
|
/**
|
|
22
22
|
* Enables chunked deletes for large batches via `options.batch`.
|
|
23
23
|
* Note: batching breaks transactional properties because chunks are removed independently.
|
|
24
24
|
*/
|
|
25
|
-
remove: (itemOrItems: T | ReadonlyArray<T>, options?: BatchOptions) => Effect.Effect<void,
|
|
25
|
+
remove: (itemOrItems: T | ReadonlyArray<T>, options?: BatchOptions) => Effect.Effect<void, DatabaseError, RPublish | RSchema>;
|
|
26
26
|
/**
|
|
27
27
|
* Enables chunked deletes for large batches via `options.batch`.
|
|
28
28
|
* Note: batching breaks transactional properties because chunks are removed independently.
|
|
29
29
|
*/
|
|
30
|
-
removeById: (idOrIds: T[IdKey] | ReadonlyArray<T[IdKey]>, options?: BatchOptions) => Effect.Effect<void,
|
|
30
|
+
removeById: (idOrIds: T[IdKey] | ReadonlyArray<T[IdKey]>, options?: BatchOptions) => Effect.Effect<void, DatabaseError, RSchema>;
|
|
31
31
|
queryAndSavePure: {
|
|
32
|
-
<A, E2, R2, T2 extends T>(q: (q: Query<Encoded>) => QueryEnd<Encoded, "one">, pure: Effect.Effect<A, E2, FixEnv<R2, Evt, T, T2>>): Effect.Effect<A, InvalidStateError | OptimisticConcurrencyException | NotFoundError<ItemType> | E2, Exclude<R2, {
|
|
32
|
+
<A, E2, R2, T2 extends T>(q: (q: Query<Encoded>) => QueryEnd<Encoded, "one">, pure: Effect.Effect<A, E2, FixEnv<R2, Evt, T, T2>>): Effect.Effect<A, (DatabaseError | InvalidStateError | OptimisticConcurrencyException) | NotFoundError<ItemType> | E2, RSchema | RPublish | Exclude<R2, {
|
|
33
33
|
env: PureEnv<Evt, T, T2>;
|
|
34
34
|
}>>;
|
|
35
|
-
<A, E2, R2, T2 extends T>(q: (q: Query<Encoded>) => Query<Encoded> | QueryWhere<Encoded> | QueryEnd<Encoded>, pure: Effect.Effect<A, E2, FixEnv<R2, Evt, readonly T[], readonly T2[]>>): Effect.Effect<A, InvalidStateError | OptimisticConcurrencyException | E2, RSchema | RPublish | Exclude<R2, {
|
|
35
|
+
<A, E2, R2, T2 extends T>(q: (q: Query<Encoded>) => Query<Encoded> | QueryWhere<Encoded> | QueryEnd<Encoded>, pure: Effect.Effect<A, E2, FixEnv<R2, Evt, readonly T[], readonly T2[]>>): Effect.Effect<A, (DatabaseError | InvalidStateError | OptimisticConcurrencyException) | E2, RSchema | RPublish | Exclude<R2, {
|
|
36
36
|
env: PureEnv<Evt, readonly T[], readonly T2[]>;
|
|
37
37
|
}>>;
|
|
38
|
-
<A, E2, R2, T2 extends T>(q: (q: Query<Encoded>) => Query<Encoded> | QueryWhere<Encoded> | QueryEnd<Encoded>, pure: Effect.Effect<A, E2, FixEnv<R2, Evt, readonly T[], readonly T2[]>>, batch: "batched" | number): Effect.Effect<A[], InvalidStateError | OptimisticConcurrencyException | E2, RSchema | RPublish | Exclude<R2, {
|
|
38
|
+
<A, E2, R2, T2 extends T>(q: (q: Query<Encoded>) => Query<Encoded> | QueryWhere<Encoded> | QueryEnd<Encoded>, pure: Effect.Effect<A, E2, FixEnv<R2, Evt, readonly T[], readonly T2[]>>, batch: "batched" | number): Effect.Effect<A[], (DatabaseError | InvalidStateError | OptimisticConcurrencyException) | E2, RSchema | RPublish | Exclude<R2, {
|
|
39
39
|
env: PureEnv<Evt, readonly T[], readonly T2[]>;
|
|
40
40
|
}>>;
|
|
41
41
|
};
|
|
42
42
|
saveManyWithPure: {
|
|
43
|
-
<R, A, E, S1 extends T, S2 extends T>(items: Iterable<S1>, pure: Effect.Effect<A, E, FixEnv<R, Evt, readonly S1[], readonly S2[]>>): Effect.Effect<A, InvalidStateError | OptimisticConcurrencyException | E, RSchema | RPublish | Exclude<R, {
|
|
43
|
+
<R, A, E, S1 extends T, S2 extends T>(items: Iterable<S1>, pure: Effect.Effect<A, E, FixEnv<R, Evt, readonly S1[], readonly S2[]>>): Effect.Effect<A, (DatabaseError | InvalidStateError | OptimisticConcurrencyException) | E, RSchema | RPublish | Exclude<R, {
|
|
44
44
|
env: PureEnv<Evt, readonly S1[], readonly S2[]>;
|
|
45
45
|
}>>;
|
|
46
|
-
<R, A, E, S1 extends T, S2 extends T>(items: Iterable<S1>, pure: Effect.Effect<A, E, FixEnv<R, Evt, readonly S1[], readonly S2[]>>, batch: "batched" | number): Effect.Effect<A[], InvalidStateError | OptimisticConcurrencyException | E, RSchema | RPublish | Exclude<R, {
|
|
46
|
+
<R, A, E, S1 extends T, S2 extends T>(items: Iterable<S1>, pure: Effect.Effect<A, E, FixEnv<R, Evt, readonly S1[], readonly S2[]>>, batch: "batched" | number): Effect.Effect<A[], (DatabaseError | InvalidStateError | OptimisticConcurrencyException) | E, RSchema | RPublish | Exclude<R, {
|
|
47
47
|
env: PureEnv<Evt, readonly S1[], readonly S2[]>;
|
|
48
48
|
}>>;
|
|
49
49
|
};
|
|
50
|
-
byIdAndSaveWithPure: <R, A, E, S2 extends T>(id: T[IdKey], pure: Effect.Effect<A, E, FixEnv<R, Evt, T, S2>>) => Effect.Effect<A, InvalidStateError | OptimisticConcurrencyException | NotFoundError<ItemType> | E, RSchema | RPublish | Exclude<R, {
|
|
50
|
+
byIdAndSaveWithPure: <R, A, E, S2 extends T>(id: T[IdKey], pure: Effect.Effect<A, E, FixEnv<R, Evt, T, S2>>) => Effect.Effect<A, (DatabaseError | InvalidStateError | OptimisticConcurrencyException) | NotFoundError<ItemType> | E, RSchema | RPublish | Exclude<R, {
|
|
51
51
|
env: PureEnv<Evt, T, S2>;
|
|
52
52
|
}>>;
|
|
53
|
-
saveWithPure: <R, A, E, S1 extends T, S2 extends T>(item: S1, pure: Effect.Effect<A, E, FixEnv<R, Evt, S1, S2>>) => Effect.Effect<A, E |
|
|
53
|
+
saveWithPure: <R, A, E, S1 extends T, S2 extends T>(item: S1, pure: Effect.Effect<A, E, FixEnv<R, Evt, S1, S2>>) => Effect.Effect<A, E | DatabaseError | InvalidStateError | OptimisticConcurrencyException, RPublish | RSchema | Exclude<R, {
|
|
54
54
|
env: PureEnv<Evt, S1, S2>;
|
|
55
55
|
}>>;
|
|
56
56
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ext.d.ts","sourceRoot":"","sources":["../../../src/Model/Repository/ext.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,EAAE,KAAK,iBAAiB,EAAE,aAAa,EAAE,KAAK,8BAA8B,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"ext.d.ts","sourceRoot":"","sources":["../../../src/Model/Repository/ext.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,19 +37,21 @@ export const extendRepo = (repo) => {
|
|
|
37
37
|
function saveManyWithPureBatched_(items, pure, batchSize = 100) {
|
|
38
38
|
return Effect.forEach(Array.chunksOf(items, batchSize), (batch) => saveAllWithEffectInt(runTerm(pure, batch)));
|
|
39
39
|
}
|
|
40
|
-
const queryAndSavePure = (q, pure, batch) =>
|
|
40
|
+
const queryAndSavePure = ((q, pure, batch) =>
|
|
41
|
+
// Overload dispatch: query returns T | T[]; pure helpers are generic on item shape.
|
|
42
|
+
// Runtime path is query → pure term → saveAndPublish (which raises DatabaseError).
|
|
43
|
+
repo.query(q).pipe(Effect.andThen((_) => Array.isArray(_)
|
|
41
44
|
? batch === undefined
|
|
42
45
|
? saveManyWithPure_(_, pure)
|
|
43
46
|
: saveManyWithPureBatched_(_, pure, batch === "batched" ? 100 : batch)
|
|
44
|
-
: saveWithPure_(_, pure)));
|
|
45
|
-
const saveManyWithPure = (items, pure, batch) => batch
|
|
46
|
-
? Effect.forEach(Array.chunksOf(items, batch === "batched" ? 100 : batch), (
|
|
47
|
-
: saveAllWithEffectInt(runTerm(pure, [...items]));
|
|
47
|
+
: saveWithPure_(_, pure))));
|
|
48
|
+
const saveManyWithPure = ((items, pure, batch) => batch
|
|
49
|
+
? Effect.forEach(Array.chunksOf([...items], batch === "batched" ? 100 : batch), (batchItems) => saveAllWithEffectInt(runTerm(pure, batchItems)))
|
|
50
|
+
: saveAllWithEffectInt(runTerm(pure, [...items])));
|
|
48
51
|
const byIdAndSaveWithPure = (id, pure) => get(id).pipe(Effect.flatMap((item) => saveWithPure_(item, pure)));
|
|
49
52
|
const _request = Request.tagged(`Get${repo.itemType}`);
|
|
50
53
|
const requestResolver = RequestResolver
|
|
51
54
|
.make((entries, _key) => repo.query(Q.where(repo.idKey, "in", entries.map((_) => _.request.id)))
|
|
52
|
-
// TODO
|
|
53
55
|
.pipe(Effect.andThen((items) => Effect.forEach(entries, (entry) => Request.complete(Array
|
|
54
56
|
.findFirst(items, (_) => _[repo.idKey] === entry.request.id)
|
|
55
57
|
.pipe(Option.match({
|
|
@@ -66,7 +68,7 @@ export const extendRepo = (repo) => {
|
|
|
66
68
|
* Enables chunked writes for large batches via `options.batch`.
|
|
67
69
|
* Note: batching breaks transactional properties because chunks are saved independently.
|
|
68
70
|
*/
|
|
69
|
-
save: (
|
|
71
|
+
save: (itemOrItems, options) => {
|
|
70
72
|
const items = asReadonlyArray(itemOrItems);
|
|
71
73
|
if (!Array.isReadonlyArrayNonEmpty(items)) {
|
|
72
74
|
return Effect.void;
|
|
@@ -76,13 +78,13 @@ export const extendRepo = (repo) => {
|
|
|
76
78
|
return repo.saveAndPublish(items);
|
|
77
79
|
}
|
|
78
80
|
return Effect.forEach(Array.chunksOf(items, batchSize), (batch) => repo.saveAndPublish(batch), { discard: true });
|
|
79
|
-
}
|
|
81
|
+
},
|
|
80
82
|
saveWithEvents: (events) => (...items) => repo.saveAndPublish(items, events),
|
|
81
83
|
/**
|
|
82
84
|
* Enables chunked deletes for large batches via `options.batch`.
|
|
83
85
|
* Note: batching breaks transactional properties because chunks are removed independently.
|
|
84
86
|
*/
|
|
85
|
-
remove: (
|
|
87
|
+
remove: (itemOrItems, options) => {
|
|
86
88
|
const items = asReadonlyArray(itemOrItems);
|
|
87
89
|
if (!Array.isReadonlyArrayNonEmpty(items)) {
|
|
88
90
|
return Effect.void;
|
|
@@ -92,12 +94,12 @@ export const extendRepo = (repo) => {
|
|
|
92
94
|
return repo.removeAndPublish(items);
|
|
93
95
|
}
|
|
94
96
|
return Effect.forEach(Array.chunksOf(items, batchSize), (batch) => repo.removeAndPublish(batch), { discard: true });
|
|
95
|
-
}
|
|
97
|
+
},
|
|
96
98
|
/**
|
|
97
99
|
* Enables chunked deletes for large batches via `options.batch`.
|
|
98
100
|
* Note: batching breaks transactional properties because chunks are removed independently.
|
|
99
101
|
*/
|
|
100
|
-
removeById: (
|
|
102
|
+
removeById: (idOrIds, options) => {
|
|
101
103
|
const ids = asReadonlyArray(idOrIds);
|
|
102
104
|
if (!Array.isReadonlyArrayNonEmpty(ids)) {
|
|
103
105
|
return Effect.void;
|
|
@@ -107,7 +109,7 @@ export const extendRepo = (repo) => {
|
|
|
107
109
|
return repo.removeById(ids);
|
|
108
110
|
}
|
|
109
111
|
return Effect.forEach(Array.chunksOf(ids, batchSize), (batch) => repo.removeById(batch), { discard: true });
|
|
110
|
-
}
|
|
112
|
+
},
|
|
111
113
|
queryAndSavePure,
|
|
112
114
|
saveManyWithPure,
|
|
113
115
|
byIdAndSaveWithPure,
|
|
@@ -119,4 +121,4 @@ export const extendRepo = (repo) => {
|
|
|
119
121
|
...exts
|
|
120
122
|
};
|
|
121
123
|
};
|
|
122
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
124
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL01vZGVsL1JlcG9zaXRvcnkvZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCx3REFBd0Q7QUFDeEQsT0FBTyxLQUFLLElBQUksTUFBTSxhQUFhLENBQUE7QUFDbkMsT0FBTyxLQUFLLE9BQU8sTUFBTSxnQkFBZ0IsQ0FBQTtBQUN6QyxPQUFPLEtBQUssZUFBZSxNQUFNLHdCQUF3QixDQUFBO0FBQ3pELE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUE7QUFFdkMsT0FBTyxFQUE4QyxhQUFhLEVBQXVDLE1BQU0sd0JBQXdCLENBQUE7QUFDdkksT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQTtBQUN6QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3pDLE9BQU8sRUFBNkIsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ2xFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFHdEMsT0FBTyxLQUFLLENBQUMsTUFBTSxhQUFhLENBQUE7QUFPaEMsTUFBTSxlQUFlLEdBQUcsQ0FBSSxXQUFpQyxFQUFvQixFQUFFLENBQ2pGLFVBQVUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztJQUNuQyxDQUFDLENBQUMsV0FBK0I7SUFDakMsQ0FBQyxDQUFDLENBQUMsV0FBZ0IsQ0FBQyxDQUFBO0FBRXhCLE1BQU0sWUFBWSxHQUFHLENBQUMsS0FBcUIsRUFBRSxFQUFFLENBQzdDLEtBQUssS0FBSyxJQUFJO0lBQ1osQ0FBQyxDQUFDLEdBQUc7SUFDTCxDQUFDLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUM7UUFDbEUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFD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
|
|
@@ -25,12 +25,20 @@ type ExtractExclusiveness<T> = T extends QueryTogether<any, any, infer Exclusive
|
|
|
25
25
|
type ExtractFieldValues<T> = T extends QueryTogether<infer TFieldValues, any, any, any, any, any, any> ? TFieldValues : never;
|
|
26
26
|
type ExtractFieldValuesRefined<T> = T extends QueryTogether<any, infer TFieldValuesRefined, any, any, any, any, any> ? TFieldValuesRefined : never;
|
|
27
27
|
type KeysOfUnion<T> = T extends T ? keyof T : never;
|
|
28
|
+
/** Peel Schema `tag`/`Literal` brands down to the underlying literal value. */
|
|
28
29
|
type LiteralValue<T> = T extends {
|
|
29
30
|
readonly literal: infer L;
|
|
30
|
-
} ? L : T;
|
|
31
|
+
} ? L : T extends string | number | boolean | null | bigint ? T : never;
|
|
32
|
+
type TagKey<T> = [LiteralValue<T>] extends [never] ? (string extends T ? string : [T] extends [PropertyKey] ? T : T) : LiteralValue<T>;
|
|
31
33
|
type ExtractTagged<From, Tag> = From extends {
|
|
32
34
|
readonly _tag: infer FromTag;
|
|
33
|
-
} ? [
|
|
35
|
+
} ? [TagKey<FromTag>] extends [TagKey<Tag>] ? From : never : never;
|
|
36
|
+
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
|
|
37
|
+
/**
|
|
38
|
+
* True when `Tag` is a single tag token (string literal or opaque brand like
|
|
39
|
+
* Schema.tag<"packing">), not a union of tags and not bare `string`.
|
|
40
|
+
*/
|
|
41
|
+
type IsSingleLiteralTag<Tag> = string extends Tag ? false : [Tag] extends [UnionToIntersection<Tag>] ? true : false;
|
|
34
42
|
/**
|
|
35
43
|
* Domain shape that may supply stored fields for projection member `I`.
|
|
36
44
|
*
|
|
@@ -52,28 +60,40 @@ type ProjectableSource<I, From> = I extends {
|
|
|
52
60
|
* field types may be narrowed by the projection).
|
|
53
61
|
*
|
|
54
62
|
* Uses `keyof Source` (not `KeysOfUnion` of the whole domain union) so a field
|
|
55
|
-
* owned only by some tags cannot be required on every branch
|
|
63
|
+
* owned only by some tags cannot be required on every branch — except for a
|
|
64
|
+
* single literal tag that maps to several domain variants (same `_tag`,
|
|
65
|
+
* different payloads), where `KeysOfUnion` allows each variant's keys.
|
|
56
66
|
*/
|
|
57
67
|
/**
|
|
58
68
|
* Keys the domain may supply for projection member `I`.
|
|
59
|
-
* -
|
|
69
|
+
* - Single-literal tagged `I` (`_tag: "packing"`): keys of *any* same-tag
|
|
70
|
+
* domain variant (`KeysOfUnion`) — dual packing/closed shapes stay projectable.
|
|
71
|
+
* - Multi-tag / string-tagged `I` (`_tag: "a"|"b"` or `string`): keys of the
|
|
72
|
+
* *intersection* of matched domain members (`keyof` of the source union) so
|
|
73
|
+
* a flat multi-tag DTO cannot claim state-only fields (e.g. `batchId` on
|
|
74
|
+
* `initial`).
|
|
60
75
|
* - Untagged `I` (plain project DTOs): keys present on *any* domain member
|
|
61
76
|
* (`KeysOfUnion`), matching historical `project()` behavior.
|
|
62
77
|
*/
|
|
63
78
|
type ProjectableDomainKeys<I, From> = I extends {
|
|
64
|
-
readonly _tag:
|
|
65
|
-
} ? keyof ProjectableSource<I, From> : KeysOfUnion<From>;
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
79
|
+
readonly _tag: infer Tag;
|
|
80
|
+
} ? (IsSingleLiteralTag<Tag> extends true ? KeysOfUnion<ProjectableSource<I, From>> : keyof ProjectableSource<I, From>) : KeysOfUnion<From>;
|
|
81
|
+
/**
|
|
82
|
+
* Keys on projection member `I` that are neither computed (`ExtraKeys`) nor
|
|
83
|
+
* present on the matching domain source. Key presence only — nested field
|
|
84
|
+
* types may be narrowed by the projection, and optional domain/projection
|
|
85
|
+
* keys must not fail via `{ k?: T } extends { k: T }` (the old `-?` mapped
|
|
86
|
+
* assignability check rejected legitimate optionalKey fields like closed.batchId).
|
|
87
|
+
*/
|
|
88
|
+
type UnprojectableKeys<I, From, ExtraKeys extends PropertyKey> = {
|
|
89
|
+
[K in keyof I]-?: K extends ExtraKeys ? never : K extends ProjectableDomainKeys<I, From> ? never : K;
|
|
90
|
+
}[keyof I];
|
|
69
91
|
/**
|
|
70
92
|
* Distribute over tagged-union projection Encoded types. A non-distributive
|
|
71
|
-
*
|
|
72
|
-
*
|
|
93
|
+
* check against a union only sees `keyof (A|B)` (key intersection) and misses
|
|
94
|
+
* branch-only fields like cancel-only omissions.
|
|
73
95
|
*/
|
|
74
|
-
type IsProjectableMember<I, From, ExtraKeys extends PropertyKey> = [I] extends [
|
|
75
|
-
ProjectableEncodedMember<I, From, ExtraKeys>
|
|
76
|
-
] ? true : false;
|
|
96
|
+
type IsProjectableMember<I, From, ExtraKeys extends PropertyKey> = [I] extends [FieldValues] ? ([UnprojectableKeys<I, From, ExtraKeys>] extends [never] ? true : false) : false;
|
|
77
97
|
/**
|
|
78
98
|
* `unknown` when every member of projection Encoded `I` is projectable from
|
|
79
99
|
* domain Encoded `From` (plus optional ExtraKeys for computed fields); `never`
|