@codefast/di-testing 0.1.0 → 0.1.1
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
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# @codefast/di-testing
|
|
2
2
|
|
|
3
|
+
## 0.1.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#774](https://github.com/codefastlabs/codefast/pull/774) [`176e95a`](https://github.com/codefastlabs/codefast/commit/176e95a32b44fa16d81a22e4a48f53176837c839) Thanks [@thevuong](https://github.com/thevuong)! - Fold di's reserved `slotName` criterion into slot addressing, so `{ name: "x" }` and `{ tag: slotName.of("x") }` — one
|
|
8
|
+
slot to the container — are one slot to TestBed too: a mock registered with either spelling now matches a dependency
|
|
9
|
+
declared with the other, and `mocks.get(token, options)` accepts both.
|
|
10
|
+
- Updated dependencies [[`96af502`](https://github.com/codefastlabs/codefast/commit/96af502ed8dd7fc02c4440d03b40dc6677b7bcec)]:
|
|
11
|
+
- @codefast/di@0.8.0
|
|
12
|
+
|
|
3
13
|
## 0.1.0
|
|
4
14
|
|
|
5
15
|
### Minor Changes
|
|
@@ -60,7 +60,8 @@ export interface BoundMock {
|
|
|
60
60
|
* Folds an `InjectOptions` into slot criteria, or `undefined` when it names no criterion.
|
|
61
61
|
*
|
|
62
62
|
* @remarks Tags are copied and deduplicated by identity — di interns each `(key, value)` pair, so a
|
|
63
|
-
* repeated pair is the same object.
|
|
63
|
+
* repeated pair is the same object. A reserved `slotName` criterion folds into `name`, so both
|
|
64
|
+
* spellings address one slot.
|
|
64
65
|
*
|
|
65
66
|
* @since 0.1.0
|
|
66
67
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock-binder.d.ts","sourceRoot":"","sources":["../../src/discovery/mock-binder.ts"],"names":[],"mappings":"AAAA,sGAAsG;AAEtG,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAMrH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,OAAO,CAAA;CAAE,GACzE;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GACnD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC;AAEtE;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;CAC1C;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;CACjC;AAED;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;AAErF;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;CAC9B;
|
|
1
|
+
{"version":3,"file":"mock-binder.d.ts","sourceRoot":"","sources":["../../src/discovery/mock-binder.ts"],"names":[],"mappings":"AAAA,sGAAsG;AAEtG,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAMrH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,OAAO,CAAA;CAAE,GACzE;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GACnD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC;AAEtE;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;CAC1C;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;CACjC;AAED;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;AAErF;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;CAC9B;AAsBD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,GAAG,YAAY,GAAG,SAAS,CAU9F;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAE/E;AAiDD;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CACvB,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,aAAa,CAAC,cAAc,CAAC,EAC3C,SAAS,EAAE,WAAW,CAAC,aAAa,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC,EACrE,WAAW,EAAE,WAAW,EACxB,OAAO,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,GACjC,WAAW,CAAC,aAAa,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,CA4ItD"}
|
|
@@ -1,14 +1,28 @@
|
|
|
1
1
|
/** Binds a unit's discovered dependencies onto a container as mocks — the sole container coupling. */
|
|
2
|
-
import { tokenName } from "@codefast/di";
|
|
2
|
+
import { slotName, tokenName } from "@codefast/di";
|
|
3
3
|
import { OverrideMismatchError, UndeclaredDependencyError } from "#/errors/errors";
|
|
4
4
|
import { createAutoMock } from "#/mocking/auto-mock";
|
|
5
5
|
/** The name prefix `usingAll` elements are bound under, so identical constants keep distinct slots. */
|
|
6
6
|
const ALL_ELEMENT_SLOT_PREFIX = "di-testing:all:";
|
|
7
|
+
/**
|
|
8
|
+
* One name and plain tag set, with di's reserved criterion folded into the name.
|
|
9
|
+
*
|
|
10
|
+
* @remarks di treats `{name: "x"}` and `{tag: slotName.of("x")}` as one slot, so addressing here
|
|
11
|
+
* must too — mirroring `bindingSlotToResolveOptions` in di.
|
|
12
|
+
*/
|
|
13
|
+
function foldReservedName(name, tags) {
|
|
14
|
+
const reserved = tags.find((tag) => tag.key === slotName);
|
|
15
|
+
if (reserved === undefined) {
|
|
16
|
+
return { name, tags };
|
|
17
|
+
}
|
|
18
|
+
return { name: name ?? reserved.value, tags: tags.filter((tag) => tag.key !== slotName) };
|
|
19
|
+
}
|
|
7
20
|
/**
|
|
8
21
|
* Folds an `InjectOptions` into slot criteria, or `undefined` when it names no criterion.
|
|
9
22
|
*
|
|
10
23
|
* @remarks Tags are copied and deduplicated by identity — di interns each `(key, value)` pair, so a
|
|
11
|
-
* repeated pair is the same object.
|
|
24
|
+
* repeated pair is the same object. A reserved `slotName` criterion folds into `name`, so both
|
|
25
|
+
* spellings address one slot.
|
|
12
26
|
*
|
|
13
27
|
* @since 0.1.0
|
|
14
28
|
*/
|
|
@@ -16,12 +30,12 @@ export function normalizeCriteria(options) {
|
|
|
16
30
|
if (options === undefined) {
|
|
17
31
|
return undefined;
|
|
18
32
|
}
|
|
19
|
-
const
|
|
20
|
-
const tags = [...new Set(
|
|
21
|
-
if (
|
|
33
|
+
const merged = options.tag === undefined ? (options.tags ?? []) : [options.tag, ...(options.tags ?? [])];
|
|
34
|
+
const { name, tags } = foldReservedName(options.name, [...new Set(merged)]);
|
|
35
|
+
if (name === undefined && tags.length === 0) {
|
|
22
36
|
return undefined;
|
|
23
37
|
}
|
|
24
|
-
return { name
|
|
38
|
+
return { name, tags };
|
|
25
39
|
}
|
|
26
40
|
/**
|
|
27
41
|
* Returns whether two criteria address the same slot — equal name and the same tag set.
|
|
@@ -47,15 +61,16 @@ function tagSetEquals(left, right) {
|
|
|
47
61
|
}
|
|
48
62
|
/** Returns the slot's own criteria, or `undefined` for an unconstrained slot. */
|
|
49
63
|
function criteriaOfSlot(slot) {
|
|
50
|
-
const tags = slot.tags ?? [];
|
|
51
|
-
if (
|
|
64
|
+
const { name, tags } = foldReservedName(slot.name, slot.tags ?? []);
|
|
65
|
+
if (name === undefined && tags.length === 0) {
|
|
52
66
|
return undefined;
|
|
53
67
|
}
|
|
54
|
-
return { name
|
|
68
|
+
return { name, tags };
|
|
55
69
|
}
|
|
56
70
|
/** Returns whether an override's criteria address exactly this slot. */
|
|
57
71
|
function matchesSlot(criteria, slot) {
|
|
58
|
-
|
|
72
|
+
const folded = foldReservedName(slot.name, slot.tags ?? []);
|
|
73
|
+
return criteria.name === folded.name && tagSetEquals(criteria.tags, folded.tags);
|
|
59
74
|
}
|
|
60
75
|
/** A readable rendering of criteria for error messages. */
|
|
61
76
|
function describeCriteria(criteria) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock-binder.js","sourceRoot":"","sources":["../../src/discovery/mock-binder.ts"],"names":[],"mappings":"AAAA,sGAAsG;AAGtG,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"mock-binder.js","sourceRoot":"","sources":["../../src/discovery/mock-binder.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codefast/di-testing",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Solitary and sociable auto-mocking test beds for @codefast/di",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"auto-mock",
|
|
@@ -132,11 +132,11 @@
|
|
|
132
132
|
"expect-type": "^1.4.0",
|
|
133
133
|
"typescript": "^7.0.2",
|
|
134
134
|
"vitest": "^4.1.11",
|
|
135
|
-
"@codefast/di": "0.
|
|
135
|
+
"@codefast/di": "0.8.0",
|
|
136
136
|
"@codefast/typescript-config": "0.8.0"
|
|
137
137
|
},
|
|
138
138
|
"peerDependencies": {
|
|
139
|
-
"@codefast/di": ">=0.
|
|
139
|
+
"@codefast/di": ">=0.8.0"
|
|
140
140
|
},
|
|
141
141
|
"engines": {
|
|
142
142
|
"node": ">=24.0.0"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/** Binds a unit's discovered dependencies onto a container as mocks — the sole container coupling. */
|
|
2
2
|
|
|
3
3
|
import type { BindingTag, Constructor, Container, DependencyKey, DependencySlot, InjectOptions } from "@codefast/di";
|
|
4
|
-
import { tokenName } from "@codefast/di";
|
|
4
|
+
import { slotName, tokenName } from "@codefast/di";
|
|
5
5
|
|
|
6
6
|
import { OverrideMismatchError, UndeclaredDependencyError } from "#/errors/errors";
|
|
7
7
|
import type { DeepPartial } from "#/mocking/auto-mock";
|
|
@@ -64,11 +64,29 @@ export interface BoundMock {
|
|
|
64
64
|
/** The name prefix `usingAll` elements are bound under, so identical constants keep distinct slots. */
|
|
65
65
|
const ALL_ELEMENT_SLOT_PREFIX = "di-testing:all:";
|
|
66
66
|
|
|
67
|
+
/**
|
|
68
|
+
* One name and plain tag set, with di's reserved criterion folded into the name.
|
|
69
|
+
*
|
|
70
|
+
* @remarks di treats `{name: "x"}` and `{tag: slotName.of("x")}` as one slot, so addressing here
|
|
71
|
+
* must too — mirroring `bindingSlotToResolveOptions` in di.
|
|
72
|
+
*/
|
|
73
|
+
function foldReservedName(
|
|
74
|
+
name: string | undefined,
|
|
75
|
+
tags: ReadonlyArray<BindingTag>,
|
|
76
|
+
): { name: string | undefined; tags: ReadonlyArray<BindingTag> } {
|
|
77
|
+
const reserved = tags.find((tag) => tag.key === slotName);
|
|
78
|
+
if (reserved === undefined) {
|
|
79
|
+
return { name, tags };
|
|
80
|
+
}
|
|
81
|
+
return { name: name ?? (reserved.value as string), tags: tags.filter((tag) => tag.key !== slotName) };
|
|
82
|
+
}
|
|
83
|
+
|
|
67
84
|
/**
|
|
68
85
|
* Folds an `InjectOptions` into slot criteria, or `undefined` when it names no criterion.
|
|
69
86
|
*
|
|
70
87
|
* @remarks Tags are copied and deduplicated by identity — di interns each `(key, value)` pair, so a
|
|
71
|
-
* repeated pair is the same object.
|
|
88
|
+
* repeated pair is the same object. A reserved `slotName` criterion folds into `name`, so both
|
|
89
|
+
* spellings address one slot.
|
|
72
90
|
*
|
|
73
91
|
* @since 0.1.0
|
|
74
92
|
*/
|
|
@@ -76,12 +94,12 @@ export function normalizeCriteria(options: InjectOptions | undefined): SlotCrite
|
|
|
76
94
|
if (options === undefined) {
|
|
77
95
|
return undefined;
|
|
78
96
|
}
|
|
79
|
-
const
|
|
80
|
-
const tags = [...new Set(
|
|
81
|
-
if (
|
|
97
|
+
const merged = options.tag === undefined ? (options.tags ?? []) : [options.tag, ...(options.tags ?? [])];
|
|
98
|
+
const { name, tags } = foldReservedName(options.name, [...new Set(merged)]);
|
|
99
|
+
if (name === undefined && tags.length === 0) {
|
|
82
100
|
return undefined;
|
|
83
101
|
}
|
|
84
|
-
return { name
|
|
102
|
+
return { name, tags };
|
|
85
103
|
}
|
|
86
104
|
|
|
87
105
|
/**
|
|
@@ -110,16 +128,17 @@ function tagSetEquals(left: ReadonlyArray<BindingTag>, right: ReadonlyArray<Bind
|
|
|
110
128
|
|
|
111
129
|
/** Returns the slot's own criteria, or `undefined` for an unconstrained slot. */
|
|
112
130
|
function criteriaOfSlot(slot: DependencySlot): SlotCriteria | undefined {
|
|
113
|
-
const tags = slot.tags ?? [];
|
|
114
|
-
if (
|
|
131
|
+
const { name, tags } = foldReservedName(slot.name, slot.tags ?? []);
|
|
132
|
+
if (name === undefined && tags.length === 0) {
|
|
115
133
|
return undefined;
|
|
116
134
|
}
|
|
117
|
-
return { name
|
|
135
|
+
return { name, tags };
|
|
118
136
|
}
|
|
119
137
|
|
|
120
138
|
/** Returns whether an override's criteria address exactly this slot. */
|
|
121
139
|
function matchesSlot(criteria: SlotCriteria, slot: DependencySlot): boolean {
|
|
122
|
-
|
|
140
|
+
const folded = foldReservedName(slot.name, slot.tags ?? []);
|
|
141
|
+
return criteria.name === folded.name && tagSetEquals(criteria.tags, folded.tags);
|
|
123
142
|
}
|
|
124
143
|
|
|
125
144
|
/** A readable rendering of criteria for error messages. */
|