type-plus 4.15.1 → 4.15.2

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.
@@ -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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"}
@@ -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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "type-plus",
3
- "version": "4.15.1",
3
+ "version": "4.15.2",
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
+ }