type-plus 4.15.1 → 4.16.0

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.
Files changed (37) hide show
  1. package/README.md +4 -1
  2. package/cjs/nominal-types/Brand.d.ts +3 -3
  3. package/cjs/nominal-types/Brand.d.ts.map +1 -1
  4. package/cjs/nominal-types/Brand.spec.js +51 -5
  5. package/cjs/nominal-types/Brand.spec.js.map +1 -1
  6. package/cjs/promise/MaybePromise.d.ts +22 -0
  7. package/cjs/promise/MaybePromise.d.ts.map +1 -0
  8. package/cjs/promise/MaybePromise.js +12 -0
  9. package/cjs/promise/MaybePromise.js.map +1 -0
  10. package/cjs/promise/MaybePromise.spec.d.ts +2 -0
  11. package/cjs/promise/MaybePromise.spec.d.ts.map +1 -0
  12. package/cjs/promise/MaybePromise.spec.js +69 -0
  13. package/cjs/promise/MaybePromise.spec.js.map +1 -0
  14. package/cjs/promise/index.d.ts +2 -1
  15. package/cjs/promise/index.d.ts.map +1 -1
  16. package/cjs/promise/index.js +1 -0
  17. package/cjs/promise/index.js.map +1 -1
  18. package/esm/nominal-types/Brand.d.ts +3 -3
  19. package/esm/nominal-types/Brand.d.ts.map +1 -1
  20. package/esm/nominal-types/Brand.spec.js +51 -5
  21. package/esm/nominal-types/Brand.spec.js.map +1 -1
  22. package/esm/promise/MaybePromise.d.ts +22 -0
  23. package/esm/promise/MaybePromise.d.ts.map +1 -0
  24. package/esm/promise/MaybePromise.js +8 -0
  25. package/esm/promise/MaybePromise.js.map +1 -0
  26. package/esm/promise/MaybePromise.spec.d.ts +2 -0
  27. package/esm/promise/MaybePromise.spec.d.ts.map +1 -0
  28. package/esm/promise/MaybePromise.spec.js +21 -0
  29. package/esm/promise/MaybePromise.spec.js.map +1 -0
  30. package/esm/promise/index.d.ts +2 -1
  31. package/esm/promise/index.d.ts.map +1 -1
  32. package/esm/promise/index.js +1 -0
  33. package/esm/promise/index.js.map +1 -1
  34. package/package.json +1 -1
  35. package/ts/nominal-types/Brand.ts +32 -32
  36. package/ts/promise/MaybePromise.ts +28 -0
  37. package/ts/promise/index.ts +2 -1
package/README.md CHANGED
@@ -368,12 +368,15 @@ JSONTypes.get<string>(someJson, 'a', 'b', 1, 'c') // miku
368
368
  - `SpreadRecord<A, B>`: type for `{...a, ...b}` when both `a` and `b` are `Record`\
369
369
  for array, just do `[...A, ...B]`.
370
370
 
371
- ### Promise function
371
+ ### Promise utilities
372
372
 
373
373
  - `isPromise<R>(subject: any)`: `isPromise()` type guard.
374
+ - `MaybePromise<T>`: Alias of `T | Promise<T>`.
374
375
  - `PromiseValue<P>`: Gets the type within the Promise.
375
376
  - `PromiseValueMerge<P1, P2, ...P9>`: Merge the values of multiple promises.
376
377
  - `mapSeries()`: Similar to `bluebird.mapSeries()` but works with `async`/`await`.
378
+ - `transformMaybePromise(value, transformer)`: Apply the `transformer` to the `value`.\
379
+ It is also exported under `MaybePromise.transform()`.
377
380
 
378
381
  ### Type manipulation
379
382
 
@@ -4,11 +4,11 @@ import { typeSym, valueSym } from './types.js';
4
4
  * Create a "branded" version of a type.
5
5
  * TypeScript won't allow implicit conversion to this type
6
6
  */
7
- export declare type Brand<B extends string, T> = T extends undefined | null | number | bigint | boolean ? {
7
+ export declare type Brand<B extends string, T> = T extends object ? T & {
8
8
  [typeSym]: B;
9
- [valueSym]: T;
10
- } : T & {
9
+ } : {
11
10
  [typeSym]: B;
11
+ [valueSym]: T;
12
12
  };
13
13
  /**
14
14
  * Creates a brand creator with the specified type.
@@ -1 +1 @@
1
- {"version":3,"file":"Brand.d.ts","sourceRoot":"","sources":["../../ts/nominal-types/Brand.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE9C;;;GAGG;AACH,oBAAY,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,IACnC,CAAC,SAAS,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GACpD;IAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;CAAE,GAC/B,CAAC,GAAG;IAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;CAAE,CAAA;AAExB;;GAEG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AACvF;;GAEG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"Brand.d.ts","sourceRoot":"","sources":["../../ts/nominal-types/Brand.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE9C;;;GAGG;AACH,oBAAY,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,IACnC,CAAC,SAAS,MAAM,GACd,CAAC,GAAG;IAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;CAAE,GACpB;IAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;CAAE,CAAA;AAEnC;;GAEG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AACvF;;GAEG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA"}
@@ -3,30 +3,45 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  var index_js_1 = require("../index.js");
4
4
  var index_js_2 = require("../predicates/index.js");
5
5
  describe('brand()', function () {
6
- test('unbranded type cannot assign to branded type', function () {
6
+ it('cannot assign from unbranded type', function () {
7
7
  var a = (0, index_js_1.brand)('a', { a: 1 });
8
8
  var b = { a: 1 };
9
9
  index_js_2.isType.f();
10
10
  });
11
- test('basic use case', function () {
11
+ it('can assign to unbranded type', function () {
12
+ var a = { a: 1 };
13
+ var b = (0, index_js_1.brand)('a', { a: 1 });
14
+ index_js_2.isType.t();
15
+ });
16
+ it('cannot assign between two different brand', function () {
12
17
  var a = (0, index_js_1.brand)('a', { a: 1 });
13
18
  var b = (0, index_js_1.brand)('b', { b: 'b' });
14
19
  index_js_2.isType.f();
15
20
  (0, index_js_1.assertType)(a.a);
16
21
  (0, index_js_1.assertType)(b.b);
17
22
  });
18
- test('same brand of the same type can be assigned to each other', function () {
23
+ it('can assign betwen same brand of the same type', function () {
19
24
  var a = (0, index_js_1.brand)('a', { a: 1 });
20
25
  var b = (0, index_js_1.brand)('a', { a: 2 });
21
26
  b = a;
22
27
  expect(b.a).toBe(1);
23
28
  });
24
- test('flavor with the same name cannot be assigned to brand', function () {
29
+ it('cannot assign betwen same brand with different type', function () {
30
+ var a = (0, index_js_1.brand)('a', { a: 1 });
31
+ var b = (0, index_js_1.brand)('a', { b: 2 });
32
+ index_js_2.isType.f();
33
+ });
34
+ it('cannot assign from flavor with the same name', function () {
25
35
  var b = (0, index_js_1.brand)('x', { a: 1 });
26
36
  var f = (0, index_js_1.flavor)('x', { a: 1 });
27
37
  index_js_2.isType.f();
28
38
  });
29
- test('without subject creates a typed brand creator', function () {
39
+ it('can assign to flavor with the same name (this is a feature of flavor)', function () {
40
+ var b = (0, index_js_1.brand)('x', { a: 1 });
41
+ var f = (0, index_js_1.flavor)('x', { a: 1 });
42
+ index_js_2.isType.t();
43
+ });
44
+ it('creates a typed brand ceator when invoke without subject', function () {
30
45
  var createPerson = (0, index_js_1.brand)('person');
31
46
  var person1 = createPerson(1);
32
47
  var person2 = createPerson(2);
@@ -36,5 +51,36 @@ describe('brand()', function () {
36
51
  person2 = person1;
37
52
  index_js_2.isType.f();
38
53
  });
54
+ it('accepts null as subject', function () {
55
+ var b = (0, index_js_1.brand)('x', null);
56
+ index_js_2.isType.equal();
57
+ });
58
+ it('accepts undefined as subject', function () {
59
+ var b = (0, index_js_1.brand)('x', undefined);
60
+ index_js_2.isType.equal();
61
+ });
62
+ it('accepts function as subject', function () {
63
+ var b = (0, index_js_1.brand)('x', function boo() { });
64
+ var c = (0, index_js_1.brand)('x', function coo() { });
65
+ index_js_2.isType.equal();
66
+ index_js_2.isType.t();
67
+ index_js_2.isType.t();
68
+ });
69
+ it('can assign to another function brand based on function assignment logic', function () {
70
+ function af() { }
71
+ function bf(_) { }
72
+ function cf(_) { }
73
+ var a = (0, index_js_1.brand)('x', af);
74
+ var b = (0, index_js_1.brand)('x', bf);
75
+ var c = (0, index_js_1.brand)('x', cf);
76
+ index_js_2.isType.t();
77
+ index_js_2.isType.t();
78
+ index_js_2.isType.f();
79
+ index_js_2.isType.f();
80
+ index_js_2.isType.f();
81
+ index_js_2.isType.f();
82
+ index_js_2.isType.f();
83
+ index_js_2.isType.f();
84
+ });
39
85
  });
40
86
  //# sourceMappingURL=Brand.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Brand.spec.js","sourceRoot":"","sources":["../../ts/nominal-types/Brand.spec.ts"],"names":[],"mappings":";;AAAA,wCAAyE;AACzE,mDAA+C;AAE/C,QAAQ,CAAC,SAAS,EAAE;IAClB,IAAI,CAAC,8CAA8C,EAAE;QACnD,IAAM,CAAC,GAAG,IAAA,gBAAK,EAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC9B,IAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAA;QAClB,iBAAM,CAAC,CAAC,EAAiC,CAAA;IAC3C,CAAC,CAAC,CAAA;IACF,IAAI,CAAC,gBAAgB,EAAE;QACrB,IAAM,CAAC,GAAG,IAAA,gBAAK,EAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAU,EAAE,CAAC,CAAA;QACvC,IAAM,CAAC,GAAG,IAAA,gBAAK,EAAC,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAA;QAEhC,iBAAM,CAAC,CAAC,EAAiC,CAAA;QACzC,IAAA,qBAAU,EAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QAClB,IAAA,qBAAU,EAAS,CAAC,CAAC,CAAC,CAAC,CAAA;IACzB,CAAC,CAAC,CAAA;IACF,IAAI,CAAC,2DAA2D,EAAE;QAChE,IAAM,CAAC,GAAG,IAAA,gBAAK,EAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC9B,IAAI,CAAC,GAAG,IAAA,gBAAK,EAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAE5B,CAAC,GAAG,CAAC,CAAA;QACL,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACrB,CAAC,CAAC,CAAA;IACF,IAAI,CAAC,uDAAuD,EAAE;QAC5D,IAAM,CAAC,GAAG,IAAA,gBAAK,EAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC9B,IAAM,CAAC,GAAG,IAAA,iBAAM,EAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC/B,iBAAM,CAAC,CAAC,EAAiC,CAAA;IAC3C,CAAC,CAAC,CAAA;IACF,IAAI,CAAC,+CAA+C,EAAE;QACpD,IAAM,YAAY,GAAG,IAAA,gBAAK,EAAC,QAAQ,CAAC,CAAA;QACpC,IAAI,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAA;QAC7B,IAAI,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAA;QAE7B,IAAM,cAAc,GAAG,IAAA,gBAAK,EAAC,MAAM,CAAC,CAAA;QACpC,IAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,CAAA;QAElC,OAAO,GAAG,OAAO,CAAA;QACjB,OAAO,GAAG,OAAO,CAAA;QAEjB,iBAAM,CAAC,CAAC,EAA0C,CAAA;IACpD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"Brand.spec.js","sourceRoot":"","sources":["../../ts/nominal-types/Brand.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * `T | Promise<T>`
3
+ */
4
+ export declare type MaybePromise<T> = T | Promise<T>;
5
+ /**
6
+ * Transforms the value within the promise.
7
+ *
8
+ * @return a new promise with the transformed result.
9
+ */
10
+ export declare function transformMaybePromise<T, R>(value: Promise<T>, transformer: (value: T) => R): Promise<R>;
11
+ /**
12
+ * Transforms the value, or if the value is a promise,
13
+ * transform the resolved value of the promise.
14
+ *
15
+ * @return the transformed result,
16
+ * or if the value is a promise, a new promse with the transformed result.
17
+ */
18
+ export declare function transformMaybePromise<T, R>(value: T, transformer: (value: T) => R): T extends Promise<any> ? Promise<R> : R;
19
+ export declare const MaybePromise: {
20
+ transform: typeof transformMaybePromise;
21
+ };
22
+ //# sourceMappingURL=MaybePromise.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MaybePromise.d.ts","sourceRoot":"","sources":["../../ts/promise/MaybePromise.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,oBAAY,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;AAE5C;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;AACxG;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;AAK5H,eAAO,MAAM,YAAY;;CAExB,CAAA"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MaybePromise = exports.transformMaybePromise = void 0;
4
+ var isPromise_js_1 = require("./isPromise.js");
5
+ function transformMaybePromise(value, transformer) {
6
+ return (0, isPromise_js_1.isPromise)(value) ? value.then(transformer) : transformer(value);
7
+ }
8
+ exports.transformMaybePromise = transformMaybePromise;
9
+ exports.MaybePromise = {
10
+ transform: transformMaybePromise
11
+ };
12
+ //# sourceMappingURL=MaybePromise.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MaybePromise.js","sourceRoot":"","sources":["../../ts/promise/MaybePromise.ts"],"names":[],"mappings":";;;AAAA,+CAA0C;AAqB1C,SAAgB,qBAAqB,CAAO,KAAsB,EAAE,WAA4B;IAC9F,OAAO,IAAA,wBAAS,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;AACxE,CAAC;AAFD,sDAEC;AAEY,QAAA,YAAY,GAAG;IAC1B,SAAS,EAAE,qBAAqB;CACjC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=MaybePromise.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MaybePromise.spec.d.ts","sourceRoot":"","sources":["../../ts/promise/MaybePromise.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ var index_js_1 = require("../index.js");
40
+ describe("".concat(index_js_1.MaybePromise.transform.name, "()"), function () {
41
+ it('returns the result from the handler directly if it is not a promise', function () {
42
+ var r = index_js_1.MaybePromise.transform(1, function (v) { return String(v); });
43
+ index_js_1.isType.equal();
44
+ expect(r).toEqual('1');
45
+ });
46
+ it('returns a promise that resolves to the result from the handler', function () { return __awaiter(void 0, void 0, void 0, function () {
47
+ var r, _a;
48
+ return __generator(this, function (_b) {
49
+ switch (_b.label) {
50
+ case 0:
51
+ r = index_js_1.MaybePromise.transform(Promise.resolve(1), function (v) { return String(v); });
52
+ index_js_1.isType.equal();
53
+ expect(r).not.toEqual('1');
54
+ _a = expect;
55
+ return [4 /*yield*/, r];
56
+ case 1:
57
+ _a.apply(void 0, [_b.sent()]).toEqual('1');
58
+ return [2 /*return*/];
59
+ }
60
+ });
61
+ }); });
62
+ it('preserves the type of it is MaybePromise', function () {
63
+ var v = 1;
64
+ var r = index_js_1.MaybePromise.transform(v, function (v) { return String(v); });
65
+ index_js_1.isType.equal();
66
+ expect(r).toEqual('1');
67
+ });
68
+ });
69
+ //# sourceMappingURL=MaybePromise.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MaybePromise.spec.js","sourceRoot":"","sources":["../../ts/promise/MaybePromise.spec.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wCAAkD;AAElD,QAAQ,CAAC,UAAG,uBAAY,CAAC,SAAS,CAAC,IAAI,OAAI,EAAE;IAC3C,EAAE,CAAC,qEAAqE,EAAE;QACxE,IAAM,CAAC,GAAG,uBAAY,CAAC,SAAS,CAAC,CAAC,EAAE,UAAA,CAAC,IAAI,OAAA,MAAM,CAAC,CAAC,CAAC,EAAT,CAAS,CAAC,CAAA;QAEnD,iBAAM,CAAC,KAAK,EAA0B,CAAA;QACtC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gEAAgE,EAAE;;;;;oBAC7D,CAAC,GAAG,uBAAY,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,UAAA,CAAC,IAAI,OAAA,MAAM,CAAC,CAAC,CAAC,EAAT,CAAS,CAAC,CAAA;oBAEpE,iBAAM,CAAC,KAAK,EAAmC,CAAA;oBAC/C,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;oBAC1B,KAAA,MAAM,CAAA;oBAAC,qBAAM,CAAC,EAAA;;oBAAd,kBAAO,SAAO,EAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;;;;SAC7B,CAAC,CAAA;IAEF,EAAE,CAAC,0CAA0C,EAAE;QAC7C,IAAM,CAAC,GAAyB,CAAyB,CAAA;QACzD,IAAM,CAAC,GAAG,uBAAY,CAAC,SAAS,CAAC,CAAC,EAAE,UAAA,CAAC,IAAI,OAAA,MAAM,CAAC,CAAC,CAAC,EAAT,CAAS,CAAC,CAAA;QACnD,iBAAM,CAAC,KAAK,EAA4C,CAAA;QACxD,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -1,5 +1,6 @@
1
1
  export * from './isPromise.js';
2
+ export * from './mapSeries.js';
3
+ export * from './MaybePromise.js';
2
4
  export type { PromiseValue } from './PromiseValue.js';
3
5
  export type { PromiseValueMerge } from './PromiseValueMerge.js';
4
- export * from './mapSeries.js';
5
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,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,cAAc,gBAAgB,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,MAAM,mBAAmB,CAAA;AACrD,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA"}
@@ -16,4 +16,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./isPromise.js"), exports);
18
18
  __exportStar(require("./mapSeries.js"), exports);
19
+ __exportStar(require("./MaybePromise.js"), exports);
19
20
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../ts/promise/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA8B;AAG9B,iDAA8B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../ts/promise/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA8B;AAC9B,iDAA8B;AAC9B,oDAAiC"}
@@ -4,11 +4,11 @@ import { typeSym, valueSym } from './types.js';
4
4
  * Create a "branded" version of a type.
5
5
  * TypeScript won't allow implicit conversion to this type
6
6
  */
7
- export declare type Brand<B extends string, T> = T extends undefined | null | number | bigint | boolean ? {
7
+ export declare type Brand<B extends string, T> = T extends object ? T & {
8
8
  [typeSym]: B;
9
- [valueSym]: T;
10
- } : T & {
9
+ } : {
11
10
  [typeSym]: B;
11
+ [valueSym]: T;
12
12
  };
13
13
  /**
14
14
  * Creates a brand creator with the specified type.
@@ -1 +1 @@
1
- {"version":3,"file":"Brand.d.ts","sourceRoot":"","sources":["../../ts/nominal-types/Brand.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE9C;;;GAGG;AACH,oBAAY,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,IACnC,CAAC,SAAS,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GACpD;IAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;CAAE,GAC/B,CAAC,GAAG;IAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;CAAE,CAAA;AAExB;;GAEG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AACvF;;GAEG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"Brand.d.ts","sourceRoot":"","sources":["../../ts/nominal-types/Brand.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE9C;;;GAGG;AACH,oBAAY,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,IACnC,CAAC,SAAS,MAAM,GACd,CAAC,GAAG;IAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;CAAE,GACpB;IAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;CAAE,CAAA;AAEnC;;GAEG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AACvF;;GAEG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA"}
@@ -1,30 +1,45 @@
1
1
  import { assertType, brand, flavor } from '../index.js';
2
2
  import { isType } from '../predicates/index.js';
3
3
  describe('brand()', () => {
4
- test('unbranded type cannot assign to branded type', () => {
4
+ it('cannot assign from unbranded type', () => {
5
5
  const a = brand('a', { a: 1 });
6
6
  const b = { a: 1 };
7
7
  isType.f();
8
8
  });
9
- test('basic use case', () => {
9
+ it('can assign to unbranded type', () => {
10
+ const a = { a: 1 };
11
+ const b = brand('a', { a: 1 });
12
+ isType.t();
13
+ });
14
+ it('cannot assign between two different brand', () => {
10
15
  const a = brand('a', { a: 1 });
11
16
  const b = brand('b', { b: 'b' });
12
17
  isType.f();
13
18
  assertType(a.a);
14
19
  assertType(b.b);
15
20
  });
16
- test('same brand of the same type can be assigned to each other', () => {
21
+ it('can assign betwen same brand of the same type', () => {
17
22
  const a = brand('a', { a: 1 });
18
23
  let b = brand('a', { a: 2 });
19
24
  b = a;
20
25
  expect(b.a).toBe(1);
21
26
  });
22
- test('flavor with the same name cannot be assigned to brand', () => {
27
+ it('cannot assign betwen same brand with different type', () => {
28
+ const a = brand('a', { a: 1 });
29
+ const b = brand('a', { b: 2 });
30
+ isType.f();
31
+ });
32
+ it('cannot assign from flavor with the same name', () => {
23
33
  const b = brand('x', { a: 1 });
24
34
  const f = flavor('x', { a: 1 });
25
35
  isType.f();
26
36
  });
27
- test('without subject creates a typed brand creator', () => {
37
+ it('can assign to flavor with the same name (this is a feature of flavor)', () => {
38
+ const b = brand('x', { a: 1 });
39
+ const f = flavor('x', { a: 1 });
40
+ isType.t();
41
+ });
42
+ it('creates a typed brand ceator when invoke without subject', () => {
28
43
  const createPerson = brand('person');
29
44
  let person1 = createPerson(1);
30
45
  let person2 = createPerson(2);
@@ -34,5 +49,36 @@ describe('brand()', () => {
34
49
  person2 = person1;
35
50
  isType.f();
36
51
  });
52
+ it('accepts null as subject', () => {
53
+ const b = brand('x', null);
54
+ isType.equal();
55
+ });
56
+ it('accepts undefined as subject', () => {
57
+ const b = brand('x', undefined);
58
+ isType.equal();
59
+ });
60
+ it('accepts function as subject', () => {
61
+ const b = brand('x', function boo() { });
62
+ const c = brand('x', function coo() { });
63
+ isType.equal();
64
+ isType.t();
65
+ isType.t();
66
+ });
67
+ it('can assign to another function brand based on function assignment logic', () => {
68
+ function af() { }
69
+ function bf(_) { }
70
+ function cf(_) { }
71
+ const a = brand('x', af);
72
+ const b = brand('x', bf);
73
+ const c = brand('x', cf);
74
+ isType.t();
75
+ isType.t();
76
+ isType.f();
77
+ isType.f();
78
+ isType.f();
79
+ isType.f();
80
+ isType.f();
81
+ isType.f();
82
+ });
37
83
  });
38
84
  //# sourceMappingURL=Brand.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Brand.spec.js","sourceRoot":"","sources":["../../ts/nominal-types/Brand.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAoB,MAAM,EAAE,MAAM,aAAa,CAAA;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAE/C,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,IAAI,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC9B,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAA;QAClB,MAAM,CAAC,CAAC,EAAiC,CAAA;IAC3C,CAAC,CAAC,CAAA;IACF,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC1B,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAU,EAAE,CAAC,CAAA;QACvC,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAA;QAEhC,MAAM,CAAC,CAAC,EAAiC,CAAA;QACzC,UAAU,CAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QAClB,UAAU,CAAS,CAAC,CAAC,CAAC,CAAC,CAAA;IACzB,CAAC,CAAC,CAAA;IACF,IAAI,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACrE,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC9B,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAE5B,CAAC,GAAG,CAAC,CAAA;QACL,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACrB,CAAC,CAAC,CAAA;IACF,IAAI,CAAC,uDAAuD,EAAE,GAAG,EAAE;QACjE,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC9B,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC/B,MAAM,CAAC,CAAC,EAAiC,CAAA;IAC3C,CAAC,CAAC,CAAA;IACF,IAAI,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACzD,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAA;QACpC,IAAI,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAA;QAC7B,IAAI,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAA;QAE7B,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,CAAA;QACpC,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,CAAA;QAElC,OAAO,GAAG,OAAO,CAAA;QACjB,OAAO,GAAG,OAAO,CAAA;QAEjB,MAAM,CAAC,CAAC,EAA0C,CAAA;IACpD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"Brand.spec.js","sourceRoot":"","sources":["../../ts/nominal-types/Brand.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * `T | Promise<T>`
3
+ */
4
+ export declare type MaybePromise<T> = T | Promise<T>;
5
+ /**
6
+ * Transforms the value within the promise.
7
+ *
8
+ * @return a new promise with the transformed result.
9
+ */
10
+ export declare function transformMaybePromise<T, R>(value: Promise<T>, transformer: (value: T) => R): Promise<R>;
11
+ /**
12
+ * Transforms the value, or if the value is a promise,
13
+ * transform the resolved value of the promise.
14
+ *
15
+ * @return the transformed result,
16
+ * or if the value is a promise, a new promse with the transformed result.
17
+ */
18
+ export declare function transformMaybePromise<T, R>(value: T, transformer: (value: T) => R): T extends Promise<any> ? Promise<R> : R;
19
+ export declare const MaybePromise: {
20
+ transform: typeof transformMaybePromise;
21
+ };
22
+ //# sourceMappingURL=MaybePromise.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MaybePromise.d.ts","sourceRoot":"","sources":["../../ts/promise/MaybePromise.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,oBAAY,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;AAE5C;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;AACxG;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;AAK5H,eAAO,MAAM,YAAY;;CAExB,CAAA"}
@@ -0,0 +1,8 @@
1
+ import { isPromise } from './isPromise.js';
2
+ export function transformMaybePromise(value, transformer) {
3
+ return isPromise(value) ? value.then(transformer) : transformer(value);
4
+ }
5
+ export const MaybePromise = {
6
+ transform: transformMaybePromise
7
+ };
8
+ //# sourceMappingURL=MaybePromise.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MaybePromise.js","sourceRoot":"","sources":["../../ts/promise/MaybePromise.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAqB1C,MAAM,UAAU,qBAAqB,CAAO,KAAsB,EAAE,WAA4B;IAC9F,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;AACxE,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,SAAS,EAAE,qBAAqB;CACjC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=MaybePromise.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MaybePromise.spec.d.ts","sourceRoot":"","sources":["../../ts/promise/MaybePromise.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import { isType, MaybePromise } from '../index.js';
2
+ describe(`${MaybePromise.transform.name}()`, () => {
3
+ it('returns the result from the handler directly if it is not a promise', () => {
4
+ const r = MaybePromise.transform(1, v => String(v));
5
+ isType.equal();
6
+ expect(r).toEqual('1');
7
+ });
8
+ it('returns a promise that resolves to the result from the handler', async () => {
9
+ const r = MaybePromise.transform(Promise.resolve(1), v => String(v));
10
+ isType.equal();
11
+ expect(r).not.toEqual('1');
12
+ expect(await r).toEqual('1');
13
+ });
14
+ it('preserves the type of it is MaybePromise', () => {
15
+ const v = 1;
16
+ const r = MaybePromise.transform(v, v => String(v));
17
+ isType.equal();
18
+ expect(r).toEqual('1');
19
+ });
20
+ });
21
+ //# sourceMappingURL=MaybePromise.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MaybePromise.spec.js","sourceRoot":"","sources":["../../ts/promise/MaybePromise.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAElD,QAAQ,CAAC,GAAG,YAAY,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,GAAG,EAAE;IAChD,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,CAAC,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QAEnD,MAAM,CAAC,KAAK,EAA0B,CAAA;QACtC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,CAAC,GAAG,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QAEpE,MAAM,CAAC,KAAK,EAAmC,CAAA;QAC/C,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC1B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,GAAyB,CAAyB,CAAA;QACzD,MAAM,CAAC,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QACnD,MAAM,CAAC,KAAK,EAA4C,CAAA;QACxD,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -1,5 +1,6 @@
1
1
  export * from './isPromise.js';
2
+ export * from './mapSeries.js';
3
+ export * from './MaybePromise.js';
2
4
  export type { PromiseValue } from './PromiseValue.js';
3
5
  export type { PromiseValueMerge } from './PromiseValueMerge.js';
4
- export * from './mapSeries.js';
5
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,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,cAAc,gBAAgB,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,MAAM,mBAAmB,CAAA;AACrD,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA"}
@@ -1,3 +1,4 @@
1
1
  export * from './isPromise.js';
2
2
  export * from './mapSeries.js';
3
+ export * from './MaybePromise.js';
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../ts/promise/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAG9B,cAAc,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../ts/promise/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "type-plus",
3
- "version": "4.15.1",
3
+ "version": "4.16.0",
4
4
  "description": "Provides additional types for TypeScript.",
5
5
  "homepage": "https://github.com/unional/type-plus",
6
6
  "bugs": {
@@ -1,32 +1,32 @@
1
- // By Drew Colthorp, <https://spin.atomicobject.com/2018/01/15/typescript-flexible-nominal-typing/#comment-604580>
2
- // <https://gist.github.com/dcolthorp/aa21cf87d847ae9942106435bf47565d>
3
-
4
- import { Widen } from '../utils/index.js'
5
- import { typeSym, valueSym } from './types.js'
6
-
7
- /**
8
- * Create a "branded" version of a type.
9
- * TypeScript won't allow implicit conversion to this type
10
- */
11
- export type Brand<B extends string, T> =
12
- T extends undefined | null | number | bigint | boolean
13
- ? { [typeSym]: B, [valueSym]: T }
14
- : T & { [typeSym]: B }
15
-
16
- /**
17
- * Creates a brand creator with the specified type.
18
- */
19
- export function brand<B extends string>(type: B): <T>(subject: T) => Brand<B, Widen<T>>
20
- /**
21
- * Creates a branded value of specified type.
22
- */
23
- export function brand<B extends string, T>(type: B, subject: T): Brand<B, Widen<T>>
24
- export function brand(type: string, subject?: unknown) {
25
- if (subject === undefined) return function <T>(subject: T) { return brand(type, subject) }
26
-
27
- if (typeof subject === 'object' && subject !== null) {
28
- // if subject is not an object, the branding will exist only in type-level.
29
- (subject as { [typeSym]: string })[typeSym] = type
30
- }
31
- return subject
32
- }
1
+ // By Drew Colthorp, <https://spin.atomicobject.com/2018/01/15/typescript-flexible-nominal-typing/#comment-604580>
2
+ // <https://gist.github.com/dcolthorp/aa21cf87d847ae9942106435bf47565d>
3
+
4
+ import { Widen } from '../utils/index.js'
5
+ import { typeSym, valueSym } from './types.js'
6
+
7
+ /**
8
+ * Create a "branded" version of a type.
9
+ * TypeScript won't allow implicit conversion to this type
10
+ */
11
+ export type Brand<B extends string, T> =
12
+ T extends object
13
+ ? T & { [typeSym]: B }
14
+ : { [typeSym]: B, [valueSym]: T }
15
+
16
+ /**
17
+ * Creates a brand creator with the specified type.
18
+ */
19
+ export function brand<B extends string>(type: B): <T>(subject: T) => Brand<B, Widen<T>>
20
+ /**
21
+ * Creates a branded value of specified type.
22
+ */
23
+ export function brand<B extends string, T>(type: B, subject: T): Brand<B, Widen<T>>
24
+ export function brand(type: string, subject?: unknown) {
25
+ if (subject === undefined) return function <T>(subject: T) { return brand(type, subject) }
26
+
27
+ if (typeof subject === 'object' && subject !== null) {
28
+ // if subject is not an object, the branding will exist only in type-level.
29
+ (subject as { [typeSym]: string })[typeSym] = type
30
+ }
31
+ return subject
32
+ }
@@ -0,0 +1,28 @@
1
+ import { isPromise } from './isPromise.js'
2
+
3
+ /**
4
+ * `T | Promise<T>`
5
+ */
6
+ export type MaybePromise<T> = T | Promise<T>
7
+
8
+ /**
9
+ * Transforms the value within the promise.
10
+ *
11
+ * @return a new promise with the transformed result.
12
+ */
13
+ export function transformMaybePromise<T, R>(value: Promise<T>, transformer: (value: T) => R): Promise<R>
14
+ /**
15
+ * Transforms the value, or if the value is a promise,
16
+ * transform the resolved value of the promise.
17
+ *
18
+ * @return the transformed result,
19
+ * or if the value is a promise, a new promse with the transformed result.
20
+ */
21
+ export function transformMaybePromise<T, R>(value: T, transformer: (value: T) => R): T extends Promise<any> ? Promise<R> : R
22
+ export function transformMaybePromise<T, R>(value: MaybePromise<T>, transformer: (value: T) => R) {
23
+ return isPromise(value) ? value.then(transformer) : transformer(value)
24
+ }
25
+
26
+ export const MaybePromise = {
27
+ transform: transformMaybePromise
28
+ }
@@ -1,4 +1,5 @@
1
1
  export * from './isPromise.js'
2
+ export * from './mapSeries.js'
3
+ export * from './MaybePromise.js'
2
4
  export type { PromiseValue } from './PromiseValue.js'
3
5
  export type { PromiseValueMerge } from './PromiseValueMerge.js'
4
- export * from './mapSeries.js'