type-plus 5.4.1 → 5.5.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/README.md CHANGED
@@ -370,6 +370,7 @@ JSONTypes.get<string>(someJson, 'a', 'b', 1, 'c') // miku
370
370
 
371
371
  ### Promise utilities
372
372
 
373
+ - `AwaitedProp<T, V>`: `Awaited` on specified props `P` in `T`.
373
374
  - `isPromise<R>(subject: any)`: `isPromise()` type guard.
374
375
  - `MaybePromise<T>`: Alias of `T | Promise<T>`.
375
376
  - `PromiseValue<P>`: Gets the type within the Promise.
@@ -5,27 +5,31 @@ export type ContextBaseShape = Record<string | symbol, any>;
5
5
  * @param context the current context.
6
6
  * @return an additional context with new properties.
7
7
  */
8
- export type ContextExtender<Current, Additional> = (context: Current) => Additional;
8
+ export type ContextExtender<Current, Additional> = ((context: Current) => Additional);
9
9
  export type ContextBuilder<Init extends ContextBaseShape, Ctx extends ContextBaseShape> = {
10
10
  /**
11
11
  * Extends the context using an extender.
12
+ *
13
+ * @type Additional The additional context to be added by the `extender`.
14
+ * By default this is inferred by the `extender`.
15
+ * But you can also explicitly specify it,
16
+ * if the type is a superset of the actual return type of the `extender`.
12
17
  * @param extender function that add new props to the context.
13
18
  *
14
- * The extender only need to return a new object with new properties.
19
+ * The extender only need to return a new object with additional properties.
20
+ * The builder will merge that with the current context.
15
21
  *
16
- * Do not need to merge the existing context with the new props.
17
- * The builder will do that for you.
22
+ * If the extender specify an existing property,
23
+ * it overrides the existing value.
18
24
  */
19
- extend<Current extends ContextBaseShape = Ctx, Additional extends ContextBaseShape = ContextBaseShape>(extender: ContextExtender<Current, Additional>): ContextBuilder<Init, LeftJoin<Ctx, Additional>>;
25
+ extend<Additional extends ContextBaseShape = ContextBaseShape>(extender: ContextExtender<Ctx, Additional>): ContextBuilder<Init, LeftJoin<Ctx, Additional>>;
20
26
  /**
21
27
  * Build and return the context.
22
28
  */
23
29
  build(): Ctx;
24
30
  };
25
31
  /**
26
- * A fluent context builder.
27
- *
28
- * The initializer and transformer
32
+ * Creates a context builder.
29
33
  *
30
34
  * @param init The initial context or an context initializer.
31
35
  * @return the context builder where you can
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../ts/functional/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAElD,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,CAAA;AAE3D;;;;GAIG;AACH,MAAM,MAAM,eAAe,CACzB,OAAO,EACP,UAAU,IACR,CAAC,OAAO,EAAE,OAAO,KAAK,UAAU,CAAA;AAEpC,MAAM,MAAM,cAAc,CACxB,IAAI,SAAS,gBAAgB,EAC7B,GAAG,SAAS,gBAAgB,IAC1B;IACF;;;;;;;;OAQG;IACH,MAAM,CACJ,OAAO,SAAS,gBAAgB,GAAG,GAAG,EACtC,UAAU,SAAS,gBAAgB,GAAG,gBAAgB,EACtD,QAAQ,EAAE,eAAe,CAAC,OAAO,EAAE,UAAU,CAAC,GAC5C,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;IACpD;;OAEG;IACH,KAAK,IAAI,GAAG,CAAA;CACb,CAAA;AAED;;;;;;;;;GASG;AACH,wBAAgB,OAAO,CACrB,IAAI,SAAS,gBAAgB,EAC7B,GAAG,SAAS,gBAAgB,GAAG,IAAI,EACnC,IAAI,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAKvD"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../ts/functional/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAElD,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,CAAA;AAE3D;;;;GAIG;AACH,MAAM,MAAM,eAAe,CACzB,OAAO,EACP,UAAU,IACR,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,UAAU,CAAC,CAAA;AAEtC,MAAM,MAAM,cAAc,CACxB,IAAI,SAAS,gBAAgB,EAC7B,GAAG,SAAS,gBAAgB,IAC1B;IACF;;;;;;;;;;;;;;OAcG;IACH,MAAM,CACJ,UAAU,SAAS,gBAAgB,GAAG,gBAAgB,EACtD,QAAQ,EAAE,eAAe,CAAC,GAAG,EAAE,UAAU,CAAC,GACxC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;IACpD;;OAEG;IACH,KAAK,IAAI,GAAG,CAAA;CACb,CAAA;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CACrB,IAAI,SAAS,gBAAgB,EAC7B,GAAG,SAAS,gBAAgB,GAAG,IAAI,EACnC,IAAI,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAKvD"}
@@ -13,9 +13,7 @@ var __assign = (this && this.__assign) || function () {
13
13
  Object.defineProperty(exports, "__esModule", { value: true });
14
14
  exports.context = void 0;
15
15
  /**
16
- * A fluent context builder.
17
- *
18
- * The initializer and transformer
16
+ * Creates a context builder.
19
17
  *
20
18
  * @param init The initial context or an context initializer.
21
19
  * @return the context builder where you can
@@ -25,19 +23,24 @@ exports.context = void 0;
25
23
  function context(init) {
26
24
  // eslint-disable-next-line @typescript-eslint/no-unsafe-return
27
25
  return typeof init === 'function'
28
- ? contextBuilder({}, [init])
26
+ ? contextBuilder({}, [[init]])
29
27
  : contextBuilder(init !== null && init !== void 0 ? init : {}, []);
30
28
  }
31
29
  exports.context = context;
32
- function contextBuilder(init, transformers) {
30
+ /* eslint-disable */
31
+ function contextBuilder(init, extenders) {
33
32
  return {
34
- extend: function (transformer) {
35
- return contextBuilder(init, transformers.concat(transformer));
33
+ extend: function (extender) {
34
+ return contextBuilder(init, extenders.concat([[extender]]));
36
35
  },
37
36
  build: function () {
38
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
39
- return transformers.reduce(function (p, t) { return (__assign(__assign({}, p), t(p))); }, init);
37
+ return extenders.reduce(function (p, _a, i) {
38
+ var t = _a[0];
39
+ var v = typeof t === 'function' ? extenders[i][0] = t(p) : t;
40
+ return __assign(__assign({}, p), v);
41
+ }, init);
40
42
  }
41
43
  };
42
44
  }
45
+ /* eslint-enable */
43
46
  //# sourceMappingURL=context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../ts/functional/context.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAsCA;;;;;;;;;GASG;AACH,SAAgB,OAAO,CAGrB,IAA0B;IAC1B,+DAA+D;IAC/D,OAAO,OAAO,IAAI,KAAK,UAAU;QAC/B,CAAC,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,cAAc,CAAC,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,EAAE,EAAE,EAAE,CAAQ,CAAA;AAC3C,CAAC;AARD,0BAQC;AAED,SAAS,cAAc,CAAC,IAAsB,EAAE,YAAyC;IACvF,OAAO;QACL,MAAM,YAAC,WAAsC;YAC3C,OAAO,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAA;QAC/D,CAAC;QACD,KAAK;YACH,+DAA+D;YAC/D,OAAO,YAAY,CAAC,MAAM,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,uBAAM,CAAC,GAAK,CAAC,CAAC,CAAC,CAAC,EAAG,EAAnB,CAAmB,EAAE,IAAI,CAAC,CAAA;QACjE,CAAC;KACF,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../ts/functional/context.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AA2CA;;;;;;;GAOG;AACH,SAAgB,OAAO,CAGrB,IAA0B;IAC1B,+DAA+D;IAC/D,OAAO,OAAO,IAAI,KAAK,UAAU;QAC/B,CAAC,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9B,CAAC,CAAC,cAAc,CAAC,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,EAAE,EAAE,EAAE,CAAQ,CAAA;AAC3C,CAAC;AARD,0BAQC;AAED,oBAAoB;AACpB,SAAS,cAAc,CAAC,IAAsB,EAAE,SAAmD;IACjG,OAAO;QACL,MAAM,YAAC,QAAmC;YACxC,OAAO,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;QAC7D,CAAC;QACD,KAAK;YACH,OAAO,SAAS,CAAC,MAAM,CAAC,UAAC,CAAC,EAAE,EAAG,EAAE,CAAC;oBAAL,CAAC,QAAA;gBAC5B,IAAM,CAAC,GAAG,OAAO,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;gBAC9D,6BAAY,CAAC,GAAK,CAAC,EAAE;YACvB,CAAC,EAAE,IAAI,CAAC,CAAA;QACV,CAAC;KACF,CAAA;AACH,CAAC;AACD,mBAAmB"}
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ var assertron_1 = require("assertron");
3
4
  var index_js_1 = require("../index.js");
4
5
  describe("".concat(index_js_1.context.name, "()"), function () {
5
6
  it('allows no param', function () {
@@ -43,5 +44,39 @@ describe("".concat(index_js_1.context.name, "()"), function () {
43
44
  index_js_1.isType.equal();
44
45
  expect(r).toEqual({ a: 1, b: 2, c: 3 });
45
46
  });
47
+ it('can specify additional type during extend', function () {
48
+ var r = (0, index_js_1.context)({ a: 1 })
49
+ .extend(function (ctx) { return ({ b: ctx.a + 1 }); })
50
+ .build();
51
+ index_js_1.isType.equal();
52
+ expect(r).toEqual({ a: 1, b: 2 });
53
+ });
54
+ it('invoke each extender only once', function () {
55
+ var o = new assertron_1.AssertOrder(4);
56
+ var c1 = (0, index_js_1.context)({ a: 1 })
57
+ .extend(function () {
58
+ o.once(1);
59
+ return ({ b: 2 });
60
+ })
61
+ .extend(function () {
62
+ o.once(2);
63
+ return ({ c: 3 });
64
+ });
65
+ var c2 = c1.extend(function () {
66
+ o.once(3);
67
+ return ({ d: 4 });
68
+ });
69
+ var c3 = c1.extend(function () {
70
+ o.once(4);
71
+ return ({ e: 5 });
72
+ });
73
+ var r2 = c2.build();
74
+ var r3 = c3.build();
75
+ var r1 = c1.build();
76
+ expect(r2).toEqual({ a: 1, b: 2, c: 3, d: 4 });
77
+ expect(r3).toEqual({ a: 1, b: 2, c: 3, e: 5 });
78
+ expect(r1).toEqual({ a: 1, b: 2, c: 3 });
79
+ o.end();
80
+ });
46
81
  });
47
82
  //# sourceMappingURL=context.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.spec.js","sourceRoot":"","sources":["../../ts/functional/context.spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context.spec.js","sourceRoot":"","sources":["../../ts/functional/context.spec.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,13 @@
1
+ import type { AnyRecord } from '../index.js';
1
2
  /**
2
3
  * Gets value type from Promise
3
4
  * @deprecated Use `Awaited<T>` instead.
4
5
  */
5
6
  export type PromiseValue<P extends Promise<any>> = P extends Promise<infer T> ? T : never;
7
+ /**
8
+ * Await on specific props V on type T
9
+ */
10
+ export type AwaitedProp<T extends AnyRecord, K extends keyof T> = {
11
+ [k in keyof T]: k extends K ? Awaited<T[k]> : T[k];
12
+ };
6
13
  //# sourceMappingURL=PromiseValue.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PromiseValue.d.ts","sourceRoot":"","sources":["../../ts/promise/PromiseValue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA"}
1
+ {"version":3,"file":"PromiseValue.d.ts","sourceRoot":"","sources":["../../ts/promise/PromiseValue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAE5C;;;GAGG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AAEzF;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,CAAA"}
@@ -5,4 +5,12 @@ test('extract value from Promise', function () {
5
5
  var y = '';
6
6
  index_js_1.assertType.isString(y);
7
7
  });
8
+ describe('AwaitedProp<T, V>', function () {
9
+ it('awaits one of the props', function () {
10
+ index_js_1.isType.equal();
11
+ });
12
+ it('awaits multiple props', function () {
13
+ index_js_1.isType.equal();
14
+ });
15
+ });
8
16
  //# sourceMappingURL=PromiseValue.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PromiseValue.spec.js","sourceRoot":"","sources":["../../ts/promise/PromiseValue.spec.ts"],"names":[],"mappings":";;AAAA,wCAAsD;AAEtD,IAAI,CAAC,4BAA4B,EAAE;IACjC,IAAM,CAAC,GAAkC,EAAE,CAAA;IAC3C,qBAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;AACxB,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"PromiseValue.spec.js","sourceRoot":"","sources":["../../ts/promise/PromiseValue.spec.ts"],"names":[],"mappings":";;AAAA,wCAA2E;AAE3E,IAAI,CAAC,4BAA4B,EAAE;IACjC,IAAM,CAAC,GAAkC,EAAE,CAAA;IAC3C,qBAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;AACxB,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,mBAAmB,EAAE;IAC5B,EAAE,CAAC,yBAAyB,EAAE;QAG5B,iBAAM,CAAC,KAAK,EAAqC,CAAA;IACnD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uBAAuB,EAAE;QAQ1B,iBAAM,CAAC,KAAK,EAKL,CAAA;IACT,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -1,6 +1,6 @@
1
1
  export * from './isPromise.js';
2
2
  export * from './mapSeries.js';
3
3
  export * from './MaybePromise.js';
4
- export type { PromiseValue } from './PromiseValue.js';
4
+ export type { PromiseValue, AwaitedProp } from './PromiseValue.js';
5
5
  export type { PromiseValueMerge } from './PromiseValueMerge.js';
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../ts/promise/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../ts/promise/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAClE,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA"}
@@ -5,27 +5,31 @@ export type ContextBaseShape = Record<string | symbol, any>;
5
5
  * @param context the current context.
6
6
  * @return an additional context with new properties.
7
7
  */
8
- export type ContextExtender<Current, Additional> = (context: Current) => Additional;
8
+ export type ContextExtender<Current, Additional> = ((context: Current) => Additional);
9
9
  export type ContextBuilder<Init extends ContextBaseShape, Ctx extends ContextBaseShape> = {
10
10
  /**
11
11
  * Extends the context using an extender.
12
+ *
13
+ * @type Additional The additional context to be added by the `extender`.
14
+ * By default this is inferred by the `extender`.
15
+ * But you can also explicitly specify it,
16
+ * if the type is a superset of the actual return type of the `extender`.
12
17
  * @param extender function that add new props to the context.
13
18
  *
14
- * The extender only need to return a new object with new properties.
19
+ * The extender only need to return a new object with additional properties.
20
+ * The builder will merge that with the current context.
15
21
  *
16
- * Do not need to merge the existing context with the new props.
17
- * The builder will do that for you.
22
+ * If the extender specify an existing property,
23
+ * it overrides the existing value.
18
24
  */
19
- extend<Current extends ContextBaseShape = Ctx, Additional extends ContextBaseShape = ContextBaseShape>(extender: ContextExtender<Current, Additional>): ContextBuilder<Init, LeftJoin<Ctx, Additional>>;
25
+ extend<Additional extends ContextBaseShape = ContextBaseShape>(extender: ContextExtender<Ctx, Additional>): ContextBuilder<Init, LeftJoin<Ctx, Additional>>;
20
26
  /**
21
27
  * Build and return the context.
22
28
  */
23
29
  build(): Ctx;
24
30
  };
25
31
  /**
26
- * A fluent context builder.
27
- *
28
- * The initializer and transformer
32
+ * Creates a context builder.
29
33
  *
30
34
  * @param init The initial context or an context initializer.
31
35
  * @return the context builder where you can
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../ts/functional/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAElD,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,CAAA;AAE3D;;;;GAIG;AACH,MAAM,MAAM,eAAe,CACzB,OAAO,EACP,UAAU,IACR,CAAC,OAAO,EAAE,OAAO,KAAK,UAAU,CAAA;AAEpC,MAAM,MAAM,cAAc,CACxB,IAAI,SAAS,gBAAgB,EAC7B,GAAG,SAAS,gBAAgB,IAC1B;IACF;;;;;;;;OAQG;IACH,MAAM,CACJ,OAAO,SAAS,gBAAgB,GAAG,GAAG,EACtC,UAAU,SAAS,gBAAgB,GAAG,gBAAgB,EACtD,QAAQ,EAAE,eAAe,CAAC,OAAO,EAAE,UAAU,CAAC,GAC5C,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;IACpD;;OAEG;IACH,KAAK,IAAI,GAAG,CAAA;CACb,CAAA;AAED;;;;;;;;;GASG;AACH,wBAAgB,OAAO,CACrB,IAAI,SAAS,gBAAgB,EAC7B,GAAG,SAAS,gBAAgB,GAAG,IAAI,EACnC,IAAI,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAKvD"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../ts/functional/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAElD,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,CAAA;AAE3D;;;;GAIG;AACH,MAAM,MAAM,eAAe,CACzB,OAAO,EACP,UAAU,IACR,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,UAAU,CAAC,CAAA;AAEtC,MAAM,MAAM,cAAc,CACxB,IAAI,SAAS,gBAAgB,EAC7B,GAAG,SAAS,gBAAgB,IAC1B;IACF;;;;;;;;;;;;;;OAcG;IACH,MAAM,CACJ,UAAU,SAAS,gBAAgB,GAAG,gBAAgB,EACtD,QAAQ,EAAE,eAAe,CAAC,GAAG,EAAE,UAAU,CAAC,GACxC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;IACpD;;OAEG;IACH,KAAK,IAAI,GAAG,CAAA;CACb,CAAA;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CACrB,IAAI,SAAS,gBAAgB,EAC7B,GAAG,SAAS,gBAAgB,GAAG,IAAI,EACnC,IAAI,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAKvD"}
@@ -1,7 +1,5 @@
1
1
  /**
2
- * A fluent context builder.
3
- *
4
- * The initializer and transformer
2
+ * Creates a context builder.
5
3
  *
6
4
  * @param init The initial context or an context initializer.
7
5
  * @return the context builder where you can
@@ -11,18 +9,22 @@
11
9
  export function context(init) {
12
10
  // eslint-disable-next-line @typescript-eslint/no-unsafe-return
13
11
  return typeof init === 'function'
14
- ? contextBuilder({}, [init])
12
+ ? contextBuilder({}, [[init]])
15
13
  : contextBuilder(init ?? {}, []);
16
14
  }
17
- function contextBuilder(init, transformers) {
15
+ /* eslint-disable */
16
+ function contextBuilder(init, extenders) {
18
17
  return {
19
- extend(transformer) {
20
- return contextBuilder(init, transformers.concat(transformer));
18
+ extend(extender) {
19
+ return contextBuilder(init, extenders.concat([[extender]]));
21
20
  },
22
21
  build() {
23
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
24
- return transformers.reduce((p, t) => ({ ...p, ...t(p) }), init);
22
+ return extenders.reduce((p, [t], i) => {
23
+ const v = typeof t === 'function' ? extenders[i][0] = t(p) : t;
24
+ return { ...p, ...v };
25
+ }, init);
25
26
  }
26
27
  };
27
28
  }
29
+ /* eslint-enable */
28
30
  //# sourceMappingURL=context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../ts/functional/context.ts"],"names":[],"mappings":"AAsCA;;;;;;;;;GASG;AACH,MAAM,UAAU,OAAO,CAGrB,IAA0B;IAC1B,+DAA+D;IAC/D,OAAO,OAAO,IAAI,KAAK,UAAU;QAC/B,CAAC,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,cAAc,CAAC,IAAI,IAAI,EAAE,EAAE,EAAE,CAAQ,CAAA;AAC3C,CAAC;AAED,SAAS,cAAc,CAAC,IAAsB,EAAE,YAAyC;IACvF,OAAO;QACL,MAAM,CAAC,WAAsC;YAC3C,OAAO,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAA;QAC/D,CAAC;QACD,KAAK;YACH,+DAA+D;YAC/D,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;QACjE,CAAC;KACF,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../ts/functional/context.ts"],"names":[],"mappings":"AA2CA;;;;;;;GAOG;AACH,MAAM,UAAU,OAAO,CAGrB,IAA0B;IAC1B,+DAA+D;IAC/D,OAAO,OAAO,IAAI,KAAK,UAAU;QAC/B,CAAC,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9B,CAAC,CAAC,cAAc,CAAC,IAAI,IAAI,EAAE,EAAE,EAAE,CAAQ,CAAA;AAC3C,CAAC;AAED,oBAAoB;AACpB,SAAS,cAAc,CAAC,IAAsB,EAAE,SAAmD;IACjG,OAAO;QACL,MAAM,CAAC,QAAmC;YACxC,OAAO,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;QAC7D,CAAC;QACD,KAAK;YACH,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACpC,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;gBAC9D,OAAO,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAAA;YACvB,CAAC,EAAE,IAAI,CAAC,CAAA;QACV,CAAC;KACF,CAAA;AACH,CAAC;AACD,mBAAmB"}
@@ -1,3 +1,4 @@
1
+ import { AssertOrder } from 'assertron';
1
2
  import { context, isType } from '../index.js';
2
3
  describe(`${context.name}()`, () => {
3
4
  it('allows no param', () => {
@@ -41,5 +42,39 @@ describe(`${context.name}()`, () => {
41
42
  isType.equal();
42
43
  expect(r).toEqual({ a: 1, b: 2, c: 3 });
43
44
  });
45
+ it('can specify additional type during extend', () => {
46
+ const r = context({ a: 1 })
47
+ .extend(ctx => ({ b: ctx.a + 1 }))
48
+ .build();
49
+ isType.equal();
50
+ expect(r).toEqual({ a: 1, b: 2 });
51
+ });
52
+ it('invoke each extender only once', () => {
53
+ const o = new AssertOrder(4);
54
+ const c1 = context({ a: 1 })
55
+ .extend(() => {
56
+ o.once(1);
57
+ return ({ b: 2 });
58
+ })
59
+ .extend(() => {
60
+ o.once(2);
61
+ return ({ c: 3 });
62
+ });
63
+ const c2 = c1.extend(() => {
64
+ o.once(3);
65
+ return ({ d: 4 });
66
+ });
67
+ const c3 = c1.extend(() => {
68
+ o.once(4);
69
+ return ({ e: 5 });
70
+ });
71
+ const r2 = c2.build();
72
+ const r3 = c3.build();
73
+ const r1 = c1.build();
74
+ expect(r2).toEqual({ a: 1, b: 2, c: 3, d: 4 });
75
+ expect(r3).toEqual({ a: 1, b: 2, c: 3, e: 5 });
76
+ expect(r1).toEqual({ a: 1, b: 2, c: 3 });
77
+ o.end();
78
+ });
44
79
  });
45
80
  //# sourceMappingURL=context.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.spec.js","sourceRoot":"","sources":["../../ts/functional/context.spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context.spec.js","sourceRoot":"","sources":["../../ts/functional/context.spec.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,13 @@
1
+ import type { AnyRecord } from '../index.js';
1
2
  /**
2
3
  * Gets value type from Promise
3
4
  * @deprecated Use `Awaited<T>` instead.
4
5
  */
5
6
  export type PromiseValue<P extends Promise<any>> = P extends Promise<infer T> ? T : never;
7
+ /**
8
+ * Await on specific props V on type T
9
+ */
10
+ export type AwaitedProp<T extends AnyRecord, K extends keyof T> = {
11
+ [k in keyof T]: k extends K ? Awaited<T[k]> : T[k];
12
+ };
6
13
  //# sourceMappingURL=PromiseValue.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PromiseValue.d.ts","sourceRoot":"","sources":["../../ts/promise/PromiseValue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA"}
1
+ {"version":3,"file":"PromiseValue.d.ts","sourceRoot":"","sources":["../../ts/promise/PromiseValue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAE5C;;;GAGG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AAEzF;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,CAAA"}
@@ -1,6 +1,14 @@
1
- import { assertType } from '../index.js';
1
+ import { assertType, isType } from '../index.js';
2
2
  test('extract value from Promise', () => {
3
3
  const y = '';
4
4
  assertType.isString(y);
5
5
  });
6
+ describe('AwaitedProp<T, V>', () => {
7
+ it('awaits one of the props', () => {
8
+ isType.equal();
9
+ });
10
+ it('awaits multiple props', () => {
11
+ isType.equal();
12
+ });
13
+ });
6
14
  //# sourceMappingURL=PromiseValue.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PromiseValue.spec.js","sourceRoot":"","sources":["../../ts/promise/PromiseValue.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAgB,MAAM,aAAa,CAAA;AAEtD,IAAI,CAAC,4BAA4B,EAAE,GAAG,EAAE;IACtC,MAAM,CAAC,GAAkC,EAAE,CAAA;IAC3C,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;AACxB,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"PromiseValue.spec.js","sourceRoot":"","sources":["../../ts/promise/PromiseValue.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAe,MAAM,EAAgB,MAAM,aAAa,CAAA;AAE3E,IAAI,CAAC,4BAA4B,EAAE,GAAG,EAAE;IACtC,MAAM,CAAC,GAAkC,EAAE,CAAA;IAC3C,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;AACxB,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QAGjC,MAAM,CAAC,KAAK,EAAqC,CAAA;IACnD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAQ/B,MAAM,CAAC,KAAK,EAKL,CAAA;IACT,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -1,6 +1,6 @@
1
1
  export * from './isPromise.js';
2
2
  export * from './mapSeries.js';
3
3
  export * from './MaybePromise.js';
4
- export type { PromiseValue } from './PromiseValue.js';
4
+ export type { PromiseValue, AwaitedProp } from './PromiseValue.js';
5
5
  export type { PromiseValueMerge } from './PromiseValueMerge.js';
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../ts/promise/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../ts/promise/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAClE,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "type-plus",
3
- "version": "5.4.1",
3
+ "version": "5.5.1",
4
4
  "description": "Provides additional types for TypeScript.",
5
5
  "homepage": "https://github.com/unional/type-plus",
6
6
  "bugs": {
@@ -10,7 +10,7 @@ export type ContextBaseShape = Record<string | symbol, any>
10
10
  export type ContextExtender<
11
11
  Current,
12
12
  Additional
13
- > = (context: Current) => Additional
13
+ > = ((context: Current) => Additional)
14
14
 
15
15
  export type ContextBuilder<
16
16
  Init extends ContextBaseShape,
@@ -18,17 +18,22 @@ export type ContextBuilder<
18
18
  > = {
19
19
  /**
20
20
  * Extends the context using an extender.
21
+ *
22
+ * @type Additional The additional context to be added by the `extender`.
23
+ * By default this is inferred by the `extender`.
24
+ * But you can also explicitly specify it,
25
+ * if the type is a superset of the actual return type of the `extender`.
21
26
  * @param extender function that add new props to the context.
22
27
  *
23
- * The extender only need to return a new object with new properties.
28
+ * The extender only need to return a new object with additional properties.
29
+ * The builder will merge that with the current context.
24
30
  *
25
- * Do not need to merge the existing context with the new props.
26
- * The builder will do that for you.
31
+ * If the extender specify an existing property,
32
+ * it overrides the existing value.
27
33
  */
28
34
  extend<
29
- Current extends ContextBaseShape = Ctx,
30
35
  Additional extends ContextBaseShape = ContextBaseShape
31
- >(extender: ContextExtender<Current, Additional>)
36
+ >(extender: ContextExtender<Ctx, Additional>)
32
37
  : ContextBuilder<Init, LeftJoin<Ctx, Additional>>,
33
38
  /**
34
39
  * Build and return the context.
@@ -37,9 +42,7 @@ export type ContextBuilder<
37
42
  }
38
43
 
39
44
  /**
40
- * A fluent context builder.
41
- *
42
- * The initializer and transformer
45
+ * Creates a context builder.
43
46
  *
44
47
  * @param init The initial context or an context initializer.
45
48
  * @return the context builder where you can
@@ -52,18 +55,22 @@ export function context<
52
55
  >(init?: Init | (() => Init)): ContextBuilder<Init, Ctx> {
53
56
  // eslint-disable-next-line @typescript-eslint/no-unsafe-return
54
57
  return typeof init === 'function'
55
- ? contextBuilder({}, [init])
58
+ ? contextBuilder({}, [[init]])
56
59
  : contextBuilder(init ?? {}, []) as any
57
60
  }
58
61
 
59
- function contextBuilder(init: ContextBaseShape, transformers: ContextExtender<any, any>[]) {
62
+ /* eslint-disable */
63
+ function contextBuilder(init: ContextBaseShape, extenders: Array<[ContextExtender<any, any> | any]>) {
60
64
  return {
61
- extend(transformer: ContextExtender<any, any>) {
62
- return contextBuilder(init, transformers.concat(transformer))
65
+ extend(extender: ContextExtender<any, any>) {
66
+ return contextBuilder(init, extenders.concat([[extender]]))
63
67
  },
64
68
  build() {
65
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
66
- return transformers.reduce((p, t) => ({ ...p, ...t(p) }), init)
69
+ return extenders.reduce((p, [t], i) => {
70
+ const v = typeof t === 'function' ? extenders[i][0] = t(p) : t
71
+ return { ...p, ...v }
72
+ }, init)
67
73
  }
68
74
  }
69
75
  }
76
+ /* eslint-enable */
@@ -1,5 +1,12 @@
1
+ import type { AnyRecord } from '../index.js'
2
+
1
3
  /**
2
4
  * Gets value type from Promise
3
5
  * @deprecated Use `Awaited<T>` instead.
4
6
  */
5
7
  export type PromiseValue<P extends Promise<any>> = P extends Promise<infer T> ? T : never
8
+
9
+ /**
10
+ * Await on specific props V on type T
11
+ */
12
+ export type AwaitedProp<T extends AnyRecord, K extends keyof T> = { [k in keyof T]: k extends K ? Awaited<T[k]> : T[k] }
@@ -1,5 +1,5 @@
1
1
  export * from './isPromise.js'
2
2
  export * from './mapSeries.js'
3
3
  export * from './MaybePromise.js'
4
- export type { PromiseValue } from './PromiseValue.js'
4
+ export type { PromiseValue, AwaitedProp } from './PromiseValue.js'
5
5
  export type { PromiseValueMerge } from './PromiseValueMerge.js'