type-fns 1.20.2 → 1.21.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.
@@ -0,0 +1,16 @@
1
+ import { AssessIsOfTypeMethod } from '../wrappers/withAssure';
2
+ /**
3
+ * what: a standalone assure function that takes a value and a type.check, returning the value if it passes or throwing if it doesn't
4
+ * why:
5
+ * - enables inline type narrowing with runtime validation in a single expression
6
+ * - useful when you want to assure a value satisfies a type guard without pre-wrapping the guard with `asAssure` or `withAssure`
7
+ *
8
+ * example:
9
+ * ```ts
10
+ * const uuid: Uuid = assure('821e33d6-a330-425d-a393-f97e39113046', isUuid); // passes
11
+ * const uuid: Uuid = assure('not a uuid', isUuid); // throws AssureIsOfTypeRejectionError
12
+ * ```
13
+ */
14
+ export declare const assure: <I, C extends I>(input: I, check: AssessIsOfTypeMethod<I, C>, options?: {
15
+ name: string;
16
+ }) => C;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.assure = void 0;
4
+ const withAssure_1 = require("../wrappers/withAssure");
5
+ /**
6
+ * what: a standalone assure function that takes a value and a type.check, returning the value if it passes or throwing if it doesn't
7
+ * why:
8
+ * - enables inline type narrowing with runtime validation in a single expression
9
+ * - useful when you want to assure a value satisfies a type guard without pre-wrapping the guard with `asAssure` or `withAssure`
10
+ *
11
+ * example:
12
+ * ```ts
13
+ * const uuid: Uuid = assure('821e33d6-a330-425d-a393-f97e39113046', isUuid); // passes
14
+ * const uuid: Uuid = assure('not a uuid', isUuid); // throws AssureIsOfTypeRejectionError
15
+ * ```
16
+ */
17
+ const assure = (input, check, options) => {
18
+ const name = options?.name ?? check.name;
19
+ if (check(input))
20
+ return input;
21
+ throw new withAssure_1.AssureIsOfTypeRejectionError(`assure.rejection: input does not satisfy type.check '${name}'`, {
22
+ check: name,
23
+ input: input === undefined ? 'undefined' : input,
24
+ });
25
+ };
26
+ exports.assure = assure;
27
+ //# sourceMappingURL=assure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assure.js","sourceRoot":"","sources":["../../src/guards/assure.ts"],"names":[],"mappings":";;;AAAA,uDAGgC;AAEhC;;;;;;;;;;;GAWG;AACI,MAAM,MAAM,GAAG,CACpB,KAAQ,EACR,KAAiC,EACjC,OAA0B,EACvB,EAAE;IACL,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC;IACzC,IAAI,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/B,MAAM,IAAI,yCAA4B,CACpC,wDAAwD,IAAI,GAAG,EAC/D;QACE,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK;KACjD,CACF,CAAC;AACJ,CAAC,CAAC;AAdW,QAAA,MAAM,UAcjB"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const test_fns_1 = require("test-fns");
4
+ const withAssure_1 = require("../wrappers/withAssure");
5
+ const assure_1 = require("./assure");
6
+ describe('assure', () => {
7
+ // example type guards for testing
8
+ const isString = (input) => typeof input === 'string';
9
+ const isNumber = (input) => typeof input === 'number';
10
+ const isPositive = (input) => input > 0;
11
+ const isNonEmptyString = (input) => input.length > 0;
12
+ describe('happy path', () => {
13
+ it('should return the value when it satisfies a string check', () => {
14
+ const result = (0, assure_1.assure)('hello', isString);
15
+ expect(result).toEqual('hello');
16
+ });
17
+ it('should return the value when it satisfies a number check', () => {
18
+ const result = (0, assure_1.assure)(42, isNumber);
19
+ expect(result).toEqual(42);
20
+ });
21
+ it('should return the value when it satisfies a narrowing check on already-typed input', () => {
22
+ const result = (0, assure_1.assure)(5, isPositive);
23
+ expect(result).toEqual(5);
24
+ });
25
+ });
26
+ describe('rejection boundaries', () => {
27
+ it('should throw when string check receives a number', () => {
28
+ const error = (0, test_fns_1.getError)(() => (0, assure_1.assure)(123, isString));
29
+ expect(error).toBeInstanceOf(withAssure_1.AssureIsOfTypeRejectionError);
30
+ expect(error.message).toContain("input does not satisfy type.check 'isString'");
31
+ });
32
+ it('should throw when number check receives a string', () => {
33
+ const error = (0, test_fns_1.getError)(() => (0, assure_1.assure)('not a number', isNumber));
34
+ expect(error).toBeInstanceOf(withAssure_1.AssureIsOfTypeRejectionError);
35
+ expect(error.message).toContain("input does not satisfy type.check 'isNumber'");
36
+ });
37
+ it('should throw when positive check receives zero', () => {
38
+ const error = (0, test_fns_1.getError)(() => (0, assure_1.assure)(0, isPositive));
39
+ expect(error).toBeInstanceOf(withAssure_1.AssureIsOfTypeRejectionError);
40
+ expect(error.message).toContain("input does not satisfy type.check 'isPositive'");
41
+ });
42
+ it('should throw when positive check receives a negative number', () => {
43
+ const error = (0, test_fns_1.getError)(() => (0, assure_1.assure)(-1, isPositive));
44
+ expect(error).toBeInstanceOf(withAssure_1.AssureIsOfTypeRejectionError);
45
+ expect(error.message).toContain("input does not satisfy type.check 'isPositive'");
46
+ });
47
+ it('should throw when non-empty string check receives an empty string', () => {
48
+ const error = (0, test_fns_1.getError)(() => (0, assure_1.assure)('', isNonEmptyString));
49
+ expect(error).toBeInstanceOf(withAssure_1.AssureIsOfTypeRejectionError);
50
+ expect(error.message).toContain("input does not satisfy type.check 'isNonEmptyString'");
51
+ });
52
+ });
53
+ describe('edge cases', () => {
54
+ it('should handle null input', () => {
55
+ const error = (0, test_fns_1.getError)(() => (0, assure_1.assure)(null, isString));
56
+ expect(error).toBeInstanceOf(withAssure_1.AssureIsOfTypeRejectionError);
57
+ expect(error.message).toContain("input does not satisfy type.check 'isString'");
58
+ });
59
+ it('should handle undefined input and include it in error context', () => {
60
+ const error = (0, test_fns_1.getError)(() => (0, assure_1.assure)(undefined, isString));
61
+ expect(error).toBeInstanceOf(withAssure_1.AssureIsOfTypeRejectionError);
62
+ expect(error.message).toContain("input does not satisfy type.check 'isString'");
63
+ });
64
+ it('should handle falsy values that pass the check', () => {
65
+ const result = (0, assure_1.assure)(0, isNumber);
66
+ expect(result).toEqual(0);
67
+ });
68
+ it('should handle empty string that passes a string check', () => {
69
+ const result = (0, assure_1.assure)('', isString);
70
+ expect(result).toEqual('');
71
+ });
72
+ });
73
+ describe('custom name option', () => {
74
+ it('should use custom name in error message when provided', () => {
75
+ const error = (0, test_fns_1.getError)(() => (0, assure_1.assure)('test', isNumber, { name: 'customNumberCheck' }));
76
+ expect(error.message).toContain("input does not satisfy type.check 'customNumberCheck'");
77
+ });
78
+ it('should use function name when custom name is not provided', () => {
79
+ const error = (0, test_fns_1.getError)(() => (0, assure_1.assure)('test', isNumber));
80
+ expect(error.message).toContain("input does not satisfy type.check 'isNumber'");
81
+ });
82
+ it('should handle anonymous functions gracefully', () => {
83
+ const error = (0, test_fns_1.getError)(() => (0, assure_1.assure)('test', (input) => typeof input === 'number'));
84
+ expect(error).toBeInstanceOf(withAssure_1.AssureIsOfTypeRejectionError);
85
+ });
86
+ });
87
+ describe('type narrowing', () => {
88
+ it('should narrow union types', () => {
89
+ const input = 'hello';
90
+ const result = (0, assure_1.assure)(input, isString); // narrows to string
91
+ // @ts-expect-error - result is string, not number
92
+ const badResult = (0, assure_1.assure)(input, isString);
93
+ expect(result).toBeDefined();
94
+ expect(badResult).toBeDefined();
95
+ });
96
+ it('should narrow unknown to specific type', () => {
97
+ const input = 42;
98
+ const result = (0, assure_1.assure)(input, isNumber); // narrows to number
99
+ // @ts-expect-error - result is number, not string
100
+ const badResult = (0, assure_1.assure)(input, isNumber);
101
+ expect(result).toBeDefined();
102
+ expect(badResult).toBeDefined();
103
+ });
104
+ it('should work with branded types', () => {
105
+ const isUserId = (input) => input.startsWith('user_');
106
+ const result = (0, assure_1.assure)('user_123', isUserId); // narrows to UserId
107
+ // @ts-expect-error - result is UserId, not number
108
+ const badResult = (0, assure_1.assure)('user_123', isUserId);
109
+ expect(result).toBeDefined();
110
+ expect(badResult).toBeDefined();
111
+ const error = (0, test_fns_1.getError)(() => (0, assure_1.assure)('invalid', isUserId));
112
+ expect(error).toBeInstanceOf(withAssure_1.AssureIsOfTypeRejectionError);
113
+ });
114
+ it('should work with enum checks', () => {
115
+ let Status;
116
+ (function (Status) {
117
+ Status["ACTIVE"] = "ACTIVE";
118
+ Status["INACTIVE"] = "INACTIVE";
119
+ })(Status || (Status = {}));
120
+ const isStatus = (input) => Object.values(Status).includes(input);
121
+ const result = (0, assure_1.assure)('ACTIVE', isStatus); // narrows to Status
122
+ // @ts-expect-error - result is Status, not number
123
+ const badResult = (0, assure_1.assure)('ACTIVE', isStatus);
124
+ expect(result).toBeDefined();
125
+ expect(badResult).toBeDefined();
126
+ const error = (0, test_fns_1.getError)(() => (0, assure_1.assure)('INVALID', isStatus));
127
+ expect(error).toBeInstanceOf(withAssure_1.AssureIsOfTypeRejectionError);
128
+ });
129
+ });
130
+ });
131
+ //# sourceMappingURL=assure.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assure.test.js","sourceRoot":"","sources":["../../src/guards/assure.test.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -18,3 +18,4 @@ export * from './wrappers/withAssure';
18
18
  export * from './checks/isKeyOf';
19
19
  export * from './types/PickAny';
20
20
  export * from './types/Empty';
21
+ export * from './guards/assure';
package/dist/index.js CHANGED
@@ -34,4 +34,5 @@ __exportStar(require("./wrappers/withAssure"), exports);
34
34
  __exportStar(require("./checks/isKeyOf"), exports);
35
35
  __exportStar(require("./types/PickAny"), exports);
36
36
  __exportStar(require("./types/Empty"), exports);
37
+ __exportStar(require("./guards/assure"), exports);
37
38
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,mDAAiC;AACjC,uDAAqC;AACrC,qDAAmC;AACnC,oDAAkC;AAClC,qDAAmC;AACnC,uDAAqC;AACrC,sDAAoC;AACpC,kDAAgC;AAChC,qDAAmC;AACnC,0DAAwC;AACxC,wDAAsC;AACtC,oDAAkC;AAClC,oDAAkC;AAClC,oDAAkC;AAClC,qDAAmC;AACnC,wDAAsC;AACtC,mDAAiC;AACjC,kDAAgC;AAChC,gDAA8B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,mDAAiC;AACjC,uDAAqC;AACrC,qDAAmC;AACnC,oDAAkC;AAClC,qDAAmC;AACnC,uDAAqC;AACrC,sDAAoC;AACpC,kDAAgC;AAChC,qDAAmC;AACnC,0DAAwC;AACxC,wDAAsC;AACtC,oDAAkC;AAClC,oDAAkC;AAClC,oDAAkC;AAClC,qDAAmC;AACnC,wDAAsC;AACtC,mDAAiC;AACjC,kDAAgC;AAChC,gDAA8B;AAC9B,kDAAgC"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "type-fns",
3
3
  "author": "ehmpathy",
4
4
  "description": "A set of types, type checks, and type guards for simpler, safer, and easier to read code.",
5
- "version": "1.20.2",
5
+ "version": "1.21.0",
6
6
  "repository": "ehmpathy/type-fns",
7
7
  "homepage": "https://github.com/ehmpathy/type-fns",
8
8
  "keywords": [
package/readme.md CHANGED
@@ -182,3 +182,28 @@ const superCoolApi = async ({
182
182
  : getConfig; // otherwise, it is the config object already
183
183
  }
184
184
  ```
185
+
186
+ ### `assure`
187
+
188
+ The `assure` function takes a value and a type check, returns the value narrowed to the checked type if it passes, or throws an error if it doesn't.
189
+
190
+ This is useful to narrow types inline with runtime validation in a single expression, without needing to wrap your type checks with `withAssure` first.
191
+
192
+ ```ts
193
+ import { assure } from 'type-fns';
194
+
195
+ // define or import a type check
196
+ type Uuid = string & { __brand: 'Uuid' };
197
+ const isUuid = (value: string): value is Uuid =>
198
+ /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value);
199
+
200
+ // use assure to narrow and validate in one expression
201
+ const uuid: Uuid = assure('821e33d6-a330-425d-a393-f97e39113046', isUuid); // returns the value as Uuid
202
+ const bad: Uuid = assure('not-a-uuid', isUuid); // throws AssureIsOfTypeRejectionError
203
+
204
+ // works great for inline validation
205
+ const processUser = (input: { uuid: string }) => {
206
+ const userUuid: Uuid = assure(input.uuid, isUuid); // throws if invalid, narrows type if valid
207
+ // ...
208
+ };
209
+ ```