Skip to content
This repository was archived by the owner on Sep 17, 2023. It is now read-only.

Commit a9ac398

Browse files
committed
Initialize simple context keys with named parameters
1 parent 3e61bd5 commit a9ac398

File tree

2 files changed

+53
-25
lines changed

2 files changed

+53
-25
lines changed

src/context-registry.spec.ts

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -68,29 +68,29 @@ describe('ContextRegistry', () => {
6868
it('provides default value if provider did not provide any value', () => {
6969

7070
const defaultValue = 'default';
71-
const keyWithDefaults = new SingleContextKey(key.name, () => defaultValue);
71+
const keyWithDefaults = new SingleContextKey(key.name, { byDefault: () => defaultValue });
7272

7373
registry.provide({ a: keyWithDefaults, is: null });
7474

7575
expect(values.get(keyWithDefaults)).toBe(defaultValue);
7676
});
7777
it('provides default value if there is no provider', () => {
78-
expect(values.get(new SingleContextKey<string>(key.name, () => 'default'))).toBe('default');
78+
expect(values.get(new SingleContextKey<string>(key.name, { byDefault: () => 'default' }))).toBe('default');
7979
});
8080
it('prefers fallback value over default one', () => {
81-
expect(values.get(new SingleContextKey<string>(key.name, () => 'default'), { or: 'fallback' }))
81+
expect(values.get(new SingleContextKey<string>(key.name, { byDefault: () => 'default' }), { or: 'fallback' }))
8282
.toBe('fallback');
8383
});
8484
it('prefers default value if fallback one is absent', () => {
85-
expect(values.get(new SingleContextKey<string>(key.name, () => 'default'), {}))
85+
expect(values.get(new SingleContextKey<string>(key.name, { byDefault: () => 'default' }), {}))
8686
.toBe('default');
8787
});
8888
it('prefers `null` fallback value over key one', () => {
89-
expect(values.get(new SingleContextKey<string>(key.name, () => 'default'), { or: null }))
89+
expect(values.get(new SingleContextKey<string>(key.name, { byDefault: () => 'default' }), { or: null }))
9090
.toBeNull();
9191
});
9292
it('prefers `undefined` fallback value over key one', () => {
93-
expect(values.get(new SingleContextKey<string>(key.name, () => 'default'), { or: undefined }))
93+
expect(values.get(new SingleContextKey<string>(key.name, { byDefault: () => 'default' }), { or: undefined }))
9494
.toBeUndefined();
9595
});
9696
it('caches the value', () => {
@@ -108,7 +108,7 @@ describe('ContextRegistry', () => {
108108

109109
const value = 'default value';
110110
const defaultProviderSpy = jest.fn(() => value);
111-
const keyWithDefault = new SingleContextKey('key-with-default', defaultProviderSpy);
111+
const keyWithDefault = new SingleContextKey('key-with-default', { byDefault: defaultProviderSpy });
112112

113113
expect(values.get(keyWithDefault)).toBe(value);
114114
expect(values.get(keyWithDefault)).toBe(value);
@@ -160,14 +160,14 @@ describe('ContextRegistry', () => {
160160
it('is associated with default value if there is no provider', () => {
161161

162162
const defaultValue = ['default'];
163-
const keyWithDefaults = new MultiContextKey('key', () => defaultValue);
163+
const keyWithDefaults = new MultiContextKey('key', { byDefault: () => defaultValue });
164164

165165
expect(values.get(keyWithDefaults)).toEqual(defaultValue);
166166
});
167167
it('is associated with default value if providers did not return any values', () => {
168168

169169
const defaultValue = ['default'];
170-
const keyWithDefaults = new MultiContextKey('key', () => defaultValue);
170+
const keyWithDefaults = new MultiContextKey('key', { byDefault: () => defaultValue });
171171

172172
registry.provide({ a: keyWithDefaults, is: null });
173173
registry.provide({ a: keyWithDefaults, is: undefined });
@@ -187,32 +187,41 @@ describe('ContextRegistry', () => {
187187
expect(values.get(multiKey)).toEqual(['value']);
188188
});
189189
it('throws if there is no default value', () => {
190-
expect(() => values.get(new MultiContextKey(multiKey.name, () => null))).toThrowError();
190+
expect(() => values.get(new MultiContextKey(multiKey.name, { byDefault: () => null }))).toThrowError();
191191
});
192192
it('is associated with empty array by default', () => {
193193
expect(values.get(new MultiContextKey(multiKey.name))).toEqual([]);
194194
});
195195
it('is associated with default value is there is no value', () => {
196-
expect(values.get(new MultiContextKey<string>(multiKey.name), { or: ['default'] })).toEqual(['default']);
196+
expect(values.get(new MultiContextKey<string>(multiKey.name), { or: ['default'] }))
197+
.toEqual(['default']);
197198
});
198199
it('is associated with key default value is there is no value', () => {
199-
expect(values.get(new MultiContextKey<string>(multiKey.name, () => ['default']))).toEqual(['default']);
200+
expect(values.get(new MultiContextKey<string>(multiKey.name, { byDefault: () => ['default'] })))
201+
.toEqual(['default']);
200202
});
201203
it('prefers fallback value over default one', () => {
202204
expect(values.get(
203205
new MultiContextKey<string>(
204206
multiKey.name,
205-
() => ['key', 'default']),
206-
{ or: ['explicit', 'default'] }))
207-
.toEqual(['explicit', 'default']);
207+
{ byDefault: () => ['key', 'default'] }
208+
),
209+
{ or: ['explicit', 'default'] }
210+
)).toEqual(['explicit', 'default']);
208211
});
209212
it('prefers `null` fallback value over default one', () => {
210-
expect(values.get(new MultiContextKey<string>(multiKey.name, () => ['key', 'default']), { or: null }))
211-
.toBeNull();
213+
expect(values.get(
214+
new MultiContextKey<string>(multiKey.name, { byDefault: () => ['key', 'default'] }),
215+
{ or: null }
216+
)).toBeNull();
212217
});
213218
it('prefers `undefined` fallback value over default one', () => {
214-
expect(values.get(new MultiContextKey<string>(multiKey.name, () => ['key', 'default']), { or: undefined }))
215-
.toBeUndefined();
219+
expect(values.get(new MultiContextKey<string>(
220+
multiKey.name,
221+
{ byDefault: () => ['key', 'default'] }
222+
),
223+
{ or: undefined }
224+
)).toBeUndefined();
216225
});
217226
});
218227

src/simple-context-key.ts

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,11 @@ export abstract class SimpleContextKey<Value, Src = Value> extends ContextKey<Va
6565
* Constructs context value key.
6666
*
6767
* @param name Human-readable key name.
68+
* @param seedKey Value seed key. A new one will be constructed when omitted.
6869
*/
69-
protected constructor(name: string) {
70+
protected constructor(name: string, seedKey?: ContextSeedKey<Src, AIterable<Src>>) {
7071
super(name);
71-
this.seedKey = new SimpleSeedKey(this);
72+
this.seedKey = seedKey || new SimpleSeedKey(this);
7273
}
7374

7475
}
@@ -101,11 +102,20 @@ export class SingleContextKey<Value>
101102
* Constructs single context value key.
102103
*
103104
* @param name Human-readable key name.
105+
* @param seedKey Value seed key. A new one will be constructed when omitted.
104106
* @param byDefault Optional default value provider. If unspecified or `undefined` the key has no default
105107
* value.
106108
*/
107-
constructor(name: string, byDefault: ContextValueProvider<ContextValues, Value> = noop) {
108-
super(name);
109+
constructor(
110+
name: string,
111+
{
112+
seedKey,
113+
byDefault = noop,
114+
}: {
115+
seedKey?: ContextSeedKey<Value, AIterable<Value>>,
116+
byDefault?: ContextValueProvider<ContextValues, Value>,
117+
} = {}) {
118+
super(name, seedKey);
109119
this.byDefault = byDefault;
110120
}
111121

@@ -155,10 +165,19 @@ export class MultiContextKey<Src>
155165
* Constructs multiple context values key.
156166
*
157167
* @param name Human-readable key name.
168+
* @param seedKey Value seed key. A new one will be constructed when omitted.
158169
* @param byDefault Optional default value provider. If unspecified then the default value is empty array.
159170
*/
160-
constructor(name: string, byDefault: ContextValueProvider<ContextValues, readonly Src[]> = valuesProvider()) {
161-
super(name);
171+
constructor(
172+
name: string,
173+
{
174+
seedKey,
175+
byDefault = valuesProvider(),
176+
}: {
177+
seedKey?: ContextSeedKey<Src, AIterable<Src>>,
178+
byDefault?: ContextValueProvider<ContextValues, readonly Src[]>,
179+
} = {}) {
180+
super(name, seedKey);
162181
this.byDefault = byDefault;
163182
}
164183

0 commit comments

Comments
 (0)