@rickosborne/guard 2024.12.32 → 2024.12.34

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 (85) hide show
  1. package/README.md +82 -6
  2. package/cjs/index.js +2 -1
  3. package/cjs/index.js.map +1 -1
  4. package/cjs/ts/error-from-message.js +2 -1
  5. package/cjs/ts/error-from-message.js.map +1 -1
  6. package/cjs/ts/has-number.js +4 -0
  7. package/cjs/ts/has-number.js.map +1 -1
  8. package/cjs/ts/has-own.js +4 -0
  9. package/cjs/ts/has-own.js.map +1 -1
  10. package/cjs/ts/is-defined.js +30 -0
  11. package/cjs/ts/is-defined.js.map +1 -0
  12. package/cjs/ts/is-int.js +37 -1
  13. package/cjs/ts/is-int.js.map +1 -1
  14. package/cjs/ts/is-list-of.js +4 -0
  15. package/cjs/ts/is-list-of.js.map +1 -1
  16. package/cjs/ts/is-object.js +8 -0
  17. package/cjs/ts/is-object.js.map +1 -1
  18. package/cjs/ts/scrub-stack-trace.js +48 -0
  19. package/cjs/ts/scrub-stack-trace.js.map +1 -0
  20. package/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  21. package/esm/index.js +2 -1
  22. package/esm/index.js.map +1 -1
  23. package/esm/ts/error-from-message.js +2 -1
  24. package/esm/ts/error-from-message.js.map +1 -1
  25. package/esm/ts/has-number.js +4 -0
  26. package/esm/ts/has-number.js.map +1 -1
  27. package/esm/ts/has-own.js +4 -0
  28. package/esm/ts/has-own.js.map +1 -1
  29. package/esm/ts/is-defined.js +24 -0
  30. package/esm/ts/is-defined.js.map +1 -0
  31. package/esm/ts/is-int.js +35 -0
  32. package/esm/ts/is-int.js.map +1 -1
  33. package/esm/ts/is-list-of.js +4 -0
  34. package/esm/ts/is-list-of.js.map +1 -1
  35. package/esm/ts/is-object.js +8 -0
  36. package/esm/ts/is-object.js.map +1 -1
  37. package/esm/ts/scrub-stack-trace.js +46 -0
  38. package/esm/ts/scrub-stack-trace.js.map +1 -0
  39. package/esm/tsconfig.module.tsbuildinfo +1 -1
  40. package/package.json +2 -2
  41. package/types/index.d.ts +2 -1
  42. package/types/index.d.ts.map +1 -1
  43. package/types/index.js +2 -1
  44. package/types/index.js.map +1 -1
  45. package/types/ts/error-from-message.d.ts.map +1 -1
  46. package/types/ts/error-from-message.js +2 -1
  47. package/types/ts/error-from-message.js.map +1 -1
  48. package/types/ts/has-number.d.ts +4 -0
  49. package/types/ts/has-number.d.ts.map +1 -1
  50. package/types/ts/has-number.js +4 -0
  51. package/types/ts/has-number.js.map +1 -1
  52. package/types/ts/has-own.d.ts +10 -0
  53. package/types/ts/has-own.d.ts.map +1 -1
  54. package/types/ts/has-own.js +4 -0
  55. package/types/ts/has-own.js.map +1 -1
  56. package/types/ts/is-defined.d.ts +16 -0
  57. package/types/ts/is-defined.d.ts.map +1 -0
  58. package/types/ts/is-defined.js +30 -0
  59. package/types/ts/is-defined.js.map +1 -0
  60. package/types/ts/is-int.d.ts +16 -0
  61. package/types/ts/is-int.d.ts.map +1 -1
  62. package/types/ts/is-int.js +37 -1
  63. package/types/ts/is-int.js.map +1 -1
  64. package/types/ts/is-list-of.d.ts +4 -0
  65. package/types/ts/is-list-of.d.ts.map +1 -1
  66. package/types/ts/is-list-of.js +4 -0
  67. package/types/ts/is-list-of.js.map +1 -1
  68. package/types/ts/is-object.d.ts +8 -0
  69. package/types/ts/is-object.d.ts.map +1 -1
  70. package/types/ts/is-object.js +8 -0
  71. package/types/ts/is-object.js.map +1 -1
  72. package/types/ts/scrub-stack-trace.d.ts +14 -0
  73. package/types/ts/scrub-stack-trace.d.ts.map +1 -0
  74. package/types/ts/scrub-stack-trace.js +50 -0
  75. package/types/ts/scrub-stack-trace.js.map +1 -0
  76. package/types/tsconfig.types.tsbuildinfo +1 -1
  77. package/cjs/ts/assert-defined.js +0 -11
  78. package/cjs/ts/assert-defined.js.map +0 -1
  79. package/esm/ts/assert-defined.js +0 -8
  80. package/esm/ts/assert-defined.js.map +0 -1
  81. package/types/ts/assert-defined.d.ts +0 -3
  82. package/types/ts/assert-defined.d.ts.map +0 -1
  83. package/types/ts/assert-defined.js +0 -11
  84. package/types/ts/assert-defined.js.map +0 -1
  85. /package/{types/tsdoc-metadata.json → tsdoc-metadata.json} +0 -0
package/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # @rickosborne/guard
2
2
 
3
3
  Basic type guards building on [@rickosborne/typical](https://www.npmjs.com/package/@rickosborne/typical).
4
+
4
5
  ***
5
6
 
6
7
  ## API
@@ -12,17 +13,23 @@ Basic type guards building on [@rickosborne/typical](https://www.npmjs.com/packa
12
13
  <a id="api-assertdefined"></a>
13
14
 
14
15
  ```typescript
15
- declare function assertDefined<T>(value: T, messageOrError: MessageOrError): asserts value is NonNullable<T>;
16
+ function assertDefined<T>(value: T, messageOrError: MessageOrError): asserts value is NonNullable<T>;
16
17
  ```
17
18
 
19
+ Assert the given value is not null or undefined. Throws with the given message or error, otherwise.
20
+
21
+
18
22
  #### assertInt
19
23
 
20
24
  <a id="api-assertint"></a>
21
25
 
22
26
  ```typescript
23
- declare function assertInt(value: unknown, messageOrError: MessageOrError): asserts value is number;
27
+ function assertInt(value: unknown, messageOrError: MessageOrError): asserts value is number;
24
28
  ```
25
29
 
30
+ Throw if the given value is not an integer.
31
+
32
+
26
33
  #### errorFromMessageOrError
27
34
 
28
35
  <a id="api-errorfrommessageorerror"></a>
@@ -34,6 +41,17 @@ errorFromMessageOrError: (messageOrError: MessageOrError, defaultConstructor?: (
34
41
  Helper for guards which expect text or an error, or can generate one when needed.
35
42
 
36
43
 
44
+ #### expectDefined
45
+
46
+ <a id="api-expectdefined"></a>
47
+
48
+ ```typescript
49
+ expectDefined: <T>(obj: T, messageOrError: MessageOrError) => NonNullable<T>
50
+ ```
51
+
52
+ Coerce a value's type to exclude null or undefined, or throw if it actually is null or undefined.
53
+
54
+
37
55
  #### expectInt
38
56
 
39
57
  <a id="api-expectint"></a>
@@ -42,12 +60,15 @@ Helper for guards which expect text or an error, or can generate one when needed
42
60
  expectInt: (obj: unknown, messageOrError: MessageOrError) => number
43
61
  ```
44
62
 
63
+ Coerce a value's type to a number, throwing if it's not an integer.
64
+
65
+
45
66
  #### hasArray
46
67
 
47
68
  <a id="api-hasarray"></a>
48
69
 
49
70
  ```typescript
50
- declare function hasArray<Name extends string>(obj: unknown, name: Name, predicate?: undefined): obj is {
71
+ function hasArray<Name extends string>(obj: unknown, name: Name, predicate?: undefined): obj is {
51
72
  [K in Name]: unknown[];
52
73
  };
53
74
  ```
@@ -60,7 +81,7 @@ Guard for whether the given value is an object which has a property with its own
60
81
  <a id="api-hasarray"></a>
61
82
 
62
83
  ```typescript
63
- declare function hasArray<Name extends string, Item>(obj: unknown, name: Name, predicate?: (item: unknown, index: number, items: unknown[]) => item is Item): obj is {
84
+ function hasArray<Name extends string, Item>(obj: unknown, name: Name, predicate?: (item: unknown, index: number, items: unknown[]) => item is Item): obj is {
64
85
  [K in Name]: Item[];
65
86
  };
66
87
  ```
@@ -76,26 +97,46 @@ Guard for whether the given value is an object which has a property with its own
76
97
  hasNumber: <Name extends string>(obj: unknown, name: Name) => obj is { [k in Name]: string; }
77
98
  ```
78
99
 
100
+ Guard for whether an object has a property with the given name and a numeric value.
101
+
102
+
79
103
  #### hasOwn
80
104
 
81
105
  <a id="api-hasown"></a>
82
106
 
83
107
  ```typescript
84
- declare function hasOwn<Name extends string>(obj: unknown, name: Name): obj is {
108
+ function hasOwn<Name extends string>(obj: unknown, name: Name): obj is {
85
109
  [K in Name]: unknown;
86
110
  };
87
111
  ```
88
112
 
113
+ Guard for whether the given value is an object with a property with the given name. This variant does not check the value, only that the property exists.
114
+
115
+
89
116
  #### hasOwn
90
117
 
91
118
  <a id="api-hasown"></a>
92
119
 
93
120
  ```typescript
94
- declare function hasOwn<Name extends string, T>(obj: unknown, name: Name, predicate: (value: unknown) => value is T): obj is {
121
+ function hasOwn<Name extends string, T>(obj: unknown, name: Name, predicate: (value: unknown) => value is T): obj is {
95
122
  [K in Name]: T;
96
123
  };
97
124
  ```
98
125
 
126
+ Guard for whether the given value is an object with a property with the given name. This variant checks the value against the given predicate.
127
+
128
+
129
+ #### isDefined
130
+
131
+ <a id="api-isdefined"></a>
132
+
133
+ ```typescript
134
+ isDefined: <T>(obj: T) => obj is NonNullable<T>
135
+ ```
136
+
137
+ Guard to filter out null or undefined values.
138
+
139
+
99
140
  #### isInt
100
141
 
101
142
  <a id="api-isint"></a>
@@ -104,6 +145,9 @@ declare function hasOwn<Name extends string, T>(obj: unknown, name: Name, predic
104
145
  isInt: (obj: unknown) => obj is number
105
146
  ```
106
147
 
148
+ Check whether the given value is not just numeric, but is also an integer.
149
+
150
+
107
151
  #### isListOf
108
152
 
109
153
  <a id="api-islistof"></a>
@@ -112,6 +156,9 @@ isInt: (obj: unknown) => obj is number
112
156
  isListOf: <T>(list: unknown, predicate: (item: unknown, index: number, items: unknown[]) => item is T) => list is T[]
113
157
  ```
114
158
 
159
+ Guard to check if the given value is an array where all the items match the given predicate.
160
+
161
+
115
162
  #### isObject
116
163
 
117
164
  <a id="api-isobject"></a>
@@ -120,6 +167,9 @@ isListOf: <T>(list: unknown, predicate: (item: unknown, index: number, items: un
120
167
  isObject: (obj: unknown) => obj is NonNullable<object>
121
168
  ```
122
169
 
170
+ Guard to check that the given value is defined and object-like.
171
+
172
+
123
173
  #### isPlainObject
124
174
 
125
175
  <a id="api-isplainobject"></a>
@@ -128,6 +178,9 @@ isObject: (obj: unknown) => obj is NonNullable<object>
128
178
  isPlainObject: (obj: unknown) => obj is Record<never, never>
129
179
  ```
130
180
 
181
+ Guard to check that the given value is defined, is an object, and seems to be a "plain" object, descending directly from Object. This won't prevent all shenanigans, but is a low-effort check.
182
+
183
+
131
184
  #### isUnaryPredicate
132
185
 
133
186
  <a id="api-isunarypredicate"></a>
@@ -139,6 +192,29 @@ isUnaryPredicate: (obj: unknown) => obj is UnaryPredicate<unknown>
139
192
  Tests whether the given object is a function and takes at least one parameter, and could maybe act as a unary predicate. Warning! Since no type information is available at runtime, it may not actually act as a predicate!
140
193
 
141
194
 
195
+ #### maybeInt
196
+
197
+ <a id="api-maybeint"></a>
198
+
199
+ ```typescript
200
+ maybeInt: (text: string) => number | undefined
201
+ ```
202
+
203
+ Convert to an integer, if it seems like it could be done safely. See [decimal separator on Wikipedia](https://en.wikipedia.org/wiki/Decimal_separator) for details on how this is probably very wrong in many countries.
204
+
205
+
206
+ #### scrubStackTrace
207
+
208
+ <a id="api-scrubstacktrace"></a>
209
+
210
+ ```typescript
211
+ scrubStackTrace: <E extends Error>(err: E, removeIf?: Predicate<string> | RegExp | string | undefined) => E
212
+ ```
213
+
214
+ Wrap an Error in a proxy which cleans up the stack trace to be more human-readable. It filters out lines from third-party code, so you can quickly see your own code in the call stack. May optionally include some way of indicating additional lines which should be removed, so a guard function could make itself transparent, making it seem like the caller threw the error.
215
+
216
+
217
+
142
218
  ### TypeAliases
143
219
 
144
220
  #### MessageOrError
package/cjs/index.js CHANGED
@@ -14,13 +14,14 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./ts/assert-defined.js"), exports);
18
17
  __exportStar(require("./ts/error-from-message.js"), exports);
19
18
  __exportStar(require("./ts/has-array.js"), exports);
20
19
  __exportStar(require("./ts/has-number.js"), exports);
21
20
  __exportStar(require("./ts/has-own.js"), exports);
21
+ __exportStar(require("./ts/is-defined.js"), exports);
22
22
  __exportStar(require("./ts/is-int.js"), exports);
23
23
  __exportStar(require("./ts/is-list-of.js"), exports);
24
24
  __exportStar(require("./ts/is-object.js"), exports);
25
25
  __exportStar(require("./ts/is-predicate.js"), exports);
26
+ __exportStar(require("./ts/scrub-stack-trace.js"), exports);
26
27
  //# sourceMappingURL=index.js.map
package/cjs/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yDAAuC;AACvC,6DAA2C;AAC3C,oDAAkC;AAClC,qDAAmC;AACnC,kDAAgC;AAChC,iDAA+B;AAC/B,qDAAmC;AACnC,oDAAkC;AAClC,uDAAqC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6DAA2C;AAC3C,oDAAkC;AAClC,qDAAmC;AACnC,kDAAgC;AAChC,qDAAmC;AACnC,iDAA+B;AAC/B,qDAAmC;AACnC,oDAAkC;AAClC,uDAAqC;AACrC,4DAA0C"}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.errorFromMessageOrError = void 0;
4
+ const scrub_stack_trace_js_1 = require("./scrub-stack-trace.js");
4
5
  /**
5
6
  * Helper for guards which expect text or an error, or
6
7
  * can generate one when needed.
@@ -20,7 +21,7 @@ const errorFromMessageOrError = (messageOrError, defaultConstructor = Error) =>
20
21
  else {
21
22
  error = stringOrError;
22
23
  }
23
- return error;
24
+ return (0, scrub_stack_trace_js_1.scrubStackTrace)(error, " at errorFromMessageOrError ");
24
25
  };
25
26
  exports.errorFromMessageOrError = errorFromMessageOrError;
26
27
  //# sourceMappingURL=error-from-message.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"error-from-message.js","sourceRoot":"","sources":["../../../ts/error-from-message.ts"],"names":[],"mappings":";;;AAKA;;;GAGG;AACI,MAAM,uBAAuB,GAAG,CACtC,cAA8B,EAC9B,qBAAuD,KAAK,EACpD,EAAE;IACV,IAAI,aAA6B,CAAC;IAClC,IAAI,OAAO,cAAc,KAAK,UAAU,EAAE,CAAC;QAC1C,aAAa,GAAG,cAAc,EAAE,CAAC;IAClC,CAAC;SAAM,CAAC;QACP,aAAa,GAAG,cAAc,CAAC;IAChC,CAAC;IACD,IAAI,KAAY,CAAC;IACjB,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;QACvC,KAAK,GAAG,IAAI,kBAAkB,CAAC,YAAa,aAAc,EAAE,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QACP,KAAK,GAAG,aAAa,CAAC;IACvB,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC,CAAC;AAjBW,QAAA,uBAAuB,2BAiBlC"}
1
+ {"version":3,"file":"error-from-message.js","sourceRoot":"","sources":["../../../ts/error-from-message.ts"],"names":[],"mappings":";;;AAAA,iEAAyD;AAOzD;;;GAGG;AACI,MAAM,uBAAuB,GAAG,CACtC,cAA8B,EAC9B,qBAAuD,KAAK,EACpD,EAAE;IACV,IAAI,aAA6B,CAAC;IAClC,IAAI,OAAO,cAAc,KAAK,UAAU,EAAE,CAAC;QAC1C,aAAa,GAAG,cAAc,EAAE,CAAC;IAClC,CAAC;SAAM,CAAC;QACP,aAAa,GAAG,cAAc,CAAC;IAChC,CAAC;IACD,IAAI,KAAY,CAAC;IACjB,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;QACvC,KAAK,GAAG,IAAI,kBAAkB,CAAC,YAAa,aAAc,EAAE,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QACP,KAAK,GAAG,aAAa,CAAC;IACvB,CAAC;IACD,OAAO,IAAA,sCAAe,EAAC,KAAK,EAAE,8BAA8B,CAAC,CAAC;AAC/D,CAAC,CAAC;AAjBW,QAAA,uBAAuB,2BAiBlC"}
@@ -2,6 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.hasNumber = void 0;
4
4
  const has_own_js_1 = require("./has-own.js");
5
+ /**
6
+ * Guard for whether an object has a property with the given name
7
+ * and a numeric value.
8
+ */
5
9
  const hasNumber = (obj, name) => {
6
10
  return (0, has_own_js_1.hasOwn)(obj, name) && typeof obj[name] === "number";
7
11
  };
@@ -1 +1 @@
1
- {"version":3,"file":"has-number.js","sourceRoot":"","sources":["../../../ts/has-number.ts"],"names":[],"mappings":";;;AAAA,6CAAsC;AAE/B,MAAM,SAAS,GAAG,CAAsB,GAAY,EAAE,IAAU,EAAgC,EAAE;IACxG,OAAO,IAAA,mBAAM,EAAC,GAAG,EAAE,IAAI,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC;AAC3D,CAAC,CAAC;AAFW,QAAA,SAAS,aAEpB"}
1
+ {"version":3,"file":"has-number.js","sourceRoot":"","sources":["../../../ts/has-number.ts"],"names":[],"mappings":";;;AAAA,6CAAsC;AAEtC;;;GAGG;AACI,MAAM,SAAS,GAAG,CAAsB,GAAY,EAAE,IAAU,EAAkC,EAAE;IAC1G,OAAO,IAAA,mBAAM,EAAC,GAAG,EAAE,IAAI,CAAC,IAAI,OAAO,GAAG,CAAE,IAAI,CAAE,KAAK,QAAQ,CAAC;AAC7D,CAAC,CAAC;AAFW,QAAA,SAAS,aAEpB"}
package/cjs/ts/has-own.js CHANGED
@@ -2,6 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.hasOwn = hasOwn;
4
4
  const is_object_js_1 = require("./is-object.js");
5
+ /**
6
+ * Guard for whether the given value is an object with a property
7
+ * with the given name.
8
+ */
5
9
  function hasOwn(obj, name, predicate) {
6
10
  if (!(0, is_object_js_1.isObject)(obj) || !Object.hasOwn(obj, name)) {
7
11
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"has-own.js","sourceRoot":"","sources":["../../../ts/has-own.ts"],"names":[],"mappings":";;AAIA,wBAKC;AATD,iDAA0C;AAI1C,SAAgB,MAAM,CAAyB,GAAY,EAAE,IAAU,EAAE,SAA0C;IAClH,IAAI,CAAC,IAAA,uBAAQ,EAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;QACjD,OAAO,KAAK,CAAC;IACd,CAAC;IACD,OAAO,SAAS,IAAI,IAAI,IAAI,SAAS,CAAC,GAAG,CAAC,IAAwB,CAAC,CAAC,CAAC;AACtE,CAAC"}
1
+ {"version":3,"file":"has-own.js","sourceRoot":"","sources":["../../../ts/has-own.ts"],"names":[],"mappings":";;AAkBA,wBAKC;AAvBD,iDAA0C;AAc1C;;;GAGG;AACH,SAAgB,MAAM,CAAyB,GAAY,EAAE,IAAU,EAAE,SAA0C;IAClH,IAAI,CAAC,IAAA,uBAAQ,EAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;QACjD,OAAO,KAAK,CAAC;IACd,CAAC;IACD,OAAO,SAAS,IAAI,IAAI,IAAI,SAAS,CAAC,GAAG,CAAE,IAAwB,CAAE,CAAC,CAAC;AACxE,CAAC"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.expectDefined = exports.isDefined = void 0;
4
+ exports.assertDefined = assertDefined;
5
+ const error_from_message_js_1 = require("./error-from-message.js");
6
+ /**
7
+ * Assert the given value is not null or undefined.
8
+ * Throws with the given message or error, otherwise.
9
+ */
10
+ function assertDefined(value, messageOrError) {
11
+ if (value != null) {
12
+ return;
13
+ }
14
+ throw (0, error_from_message_js_1.errorFromMessageOrError)(messageOrError, RangeError);
15
+ }
16
+ /**
17
+ * Guard to filter out null or undefined values.
18
+ */
19
+ const isDefined = (obj) => obj != null;
20
+ exports.isDefined = isDefined;
21
+ /**
22
+ * Coerce a value's type to exclude null or undefined, or throw
23
+ * if it actually is null or undefined.
24
+ */
25
+ const expectDefined = (obj, messageOrError) => {
26
+ assertDefined(obj, messageOrError);
27
+ return obj;
28
+ };
29
+ exports.expectDefined = expectDefined;
30
+ //# sourceMappingURL=is-defined.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-defined.js","sourceRoot":"","sources":["../../../ts/is-defined.ts"],"names":[],"mappings":";;;AAMA,sCAQC;AAdD,mEAAuF;AAEvF;;;GAGG;AACH,SAAgB,aAAa,CAC5B,KAAQ,EACR,cAA8B;IAE9B,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QACnB,OAAO;IACR,CAAC;IACD,MAAM,IAAA,+CAAuB,EAAC,cAAc,EAAE,UAAU,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACI,MAAM,SAAS,GAAG,CAAI,GAAM,EAAyB,EAAE,CAAC,GAAG,IAAI,IAAI,CAAC;AAA9D,QAAA,SAAS,aAAqD;AAE3E;;;GAGG;AACI,MAAM,aAAa,GAAG,CAC5B,GAAM,EACN,cAA8B,EACb,EAAE;IACnB,aAAa,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACnC,OAAO,GAAG,CAAC;AACZ,CAAC,CAAC;AANW,QAAA,aAAa,iBAMxB"}
package/cjs/ts/is-int.js CHANGED
@@ -1,18 +1,54 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.expectInt = exports.isInt = void 0;
3
+ exports.maybeInt = exports.expectInt = exports.isInt = void 0;
4
4
  exports.assertInt = assertInt;
5
5
  const error_from_message_js_1 = require("./error-from-message.js");
6
+ /**
7
+ * Check whether the given value is not just numeric, but is
8
+ * also an integer.
9
+ */
6
10
  const isInt = (obj) => typeof obj === "number" && !isNaN(obj) && Math.trunc(obj) === obj && obj !== Infinity && obj !== -Infinity;
7
11
  exports.isInt = isInt;
12
+ /**
13
+ * Throw if the given value is not an integer.
14
+ */
8
15
  function assertInt(value, messageOrError) {
9
16
  if (!(0, exports.isInt)(value)) {
10
17
  throw (0, error_from_message_js_1.errorFromMessageOrError)(messageOrError, TypeError);
11
18
  }
12
19
  }
20
+ /**
21
+ * Coerce a value's type to a number, throwing if it's not an integer.
22
+ */
13
23
  const expectInt = (obj, messageOrError) => {
14
24
  assertInt(obj, messageOrError);
15
25
  return obj;
16
26
  };
17
27
  exports.expectInt = expectInt;
28
+ /**
29
+ * Convert to an integer, if it seems like it could be done safely.
30
+ * See {@link https://en.wikipedia.org/wiki/Decimal_separator | decimal separator on Wikipedia}
31
+ * for details on how this is probably very wrong in many countries.
32
+ */
33
+ const maybeInt = (text) => {
34
+ let sign = 1;
35
+ let clean = text.trim();
36
+ // This just makes the patterns below a little easier.
37
+ if (text.startsWith("-")) {
38
+ sign = -1;
39
+ clean = clean.substring(1);
40
+ }
41
+ clean = clean
42
+ .replace(/(?<=\d)[_  ](?=\d)/g, "")
43
+ .replace(/^0+[,'.·]0*$/, "0")
44
+ .replace(/^(\d+(?:,\d+)+)[.·]0*$/, (_all, digits) => digits.replace(/[^-0-9]/g, ""))
45
+ .replace(/^(\d+(?:'\d+)+)[.,]0*$/, (_all, digits) => digits.replace(/[^-0-9]/g, ""))
46
+ .replace(/^(\d+(?:\.\d+)+)[,']0*$/, (_all, digits) => digits.replace(/[^-0-9]/g, ""))
47
+ .replace(/^(\d{4,})[,'.·]0*$/, (_all, digits) => digits.replace(/[^-0-9]/g, ""));
48
+ if (/^-?(0|[1-9][0-9]*)$/.test(clean)) {
49
+ return parseInt(clean, 10) * sign;
50
+ }
51
+ return undefined;
52
+ };
53
+ exports.maybeInt = maybeInt;
18
54
  //# sourceMappingURL=is-int.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"is-int.js","sourceRoot":"","sources":["../../../ts/is-int.ts"],"names":[],"mappings":";;;AAIA,8BAIC;AARD,mEAAuF;AAEhF,MAAM,KAAK,GAAG,CAAC,GAAY,EAAiB,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC;AAApJ,QAAA,KAAK,SAA+I;AAEjK,SAAgB,SAAS,CAAC,KAAc,EAAE,cAA8B;IACvE,IAAI,CAAC,IAAA,aAAK,EAAC,KAAK,CAAC,EAAE,CAAC;QACnB,MAAM,IAAA,+CAAuB,EAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IAC1D,CAAC;AACF,CAAC;AAEM,MAAM,SAAS,GAAG,CACxB,GAAY,EACZ,cAA8B,EACrB,EAAE;IACX,SAAS,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC/B,OAAO,GAAG,CAAC;AACZ,CAAC,CAAC;AANW,QAAA,SAAS,aAMpB"}
1
+ {"version":3,"file":"is-int.js","sourceRoot":"","sources":["../../../ts/is-int.ts"],"names":[],"mappings":";;;AAWA,8BAIC;AAfD,mEAAuF;AAEvF;;;GAGG;AACI,MAAM,KAAK,GAAG,CAAC,GAAY,EAAiB,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC;AAApJ,QAAA,KAAK,SAA+I;AAEjK;;GAEG;AACH,SAAgB,SAAS,CAAC,KAAc,EAAE,cAA8B;IACvE,IAAI,CAAC,IAAA,aAAK,EAAC,KAAK,CAAC,EAAE,CAAC;QACnB,MAAM,IAAA,+CAAuB,EAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IAC1D,CAAC;AACF,CAAC;AAED;;GAEG;AACI,MAAM,SAAS,GAAG,CACxB,GAAY,EACZ,cAA8B,EACrB,EAAE;IACX,SAAS,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC/B,OAAO,GAAG,CAAC;AACZ,CAAC,CAAC;AANW,QAAA,SAAS,aAMpB;AAEF;;;;GAIG;AACI,MAAM,QAAQ,GAAG,CACvB,IAAY,EACS,EAAE;IACvB,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACxB,sDAAsD;IACtD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,IAAI,GAAG,CAAC,CAAC,CAAC;QACV,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IACD,KAAK,GAAG,KAAK;SACX,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC;SAClC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC;SAC5B,OAAO,CAAC,wBAAwB,EAAE,CAAC,IAAI,EAAE,MAAc,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;SAC3F,OAAO,CAAC,wBAAwB,EAAE,CAAC,IAAI,EAAE,MAAc,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;SAC3F,OAAO,CAAC,yBAAyB,EAAE,CAAC,IAAI,EAAE,MAAc,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;SAC5F,OAAO,CAAC,oBAAoB,EAAE,CAAC,IAAI,EAAE,MAAc,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CACxF;IACD,IAAI,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC;IACnC,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC,CAAC;AAtBW,QAAA,QAAQ,YAsBnB"}
@@ -1,6 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.isListOf = void 0;
4
+ /**
5
+ * Guard to check if the given value is an array where all the
6
+ * items match the given predicate.
7
+ */
4
8
  const isListOf = (list, predicate) => {
5
9
  return Array.isArray(list) && list.every(predicate);
6
10
  };
@@ -1 +1 @@
1
- {"version":3,"file":"is-list-of.js","sourceRoot":"","sources":["../../../ts/is-list-of.ts"],"names":[],"mappings":";;;AAAO,MAAM,QAAQ,GAAG,CACvB,IAAa,EACb,SAAwE,EAC1D,EAAE;IAChB,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AACrD,CAAC,CAAC;AALW,QAAA,QAAQ,YAKnB"}
1
+ {"version":3,"file":"is-list-of.js","sourceRoot":"","sources":["../../../ts/is-list-of.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACI,MAAM,QAAQ,GAAG,CACvB,IAAa,EACb,SAAwE,EAC1D,EAAE;IAChB,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AACrD,CAAC,CAAC;AALW,QAAA,QAAQ,YAKnB"}
@@ -1,10 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.isPlainObject = exports.isObject = void 0;
4
+ /**
5
+ * Guard to check that the given value is defined and object-like.
6
+ */
4
7
  const isObject = (obj) => {
5
8
  return obj != null && typeof obj === "object";
6
9
  };
7
10
  exports.isObject = isObject;
11
+ /**
12
+ * Guard to check that the given value is defined, is an object,
13
+ * and seems to be a "plain" object, descending directly from Object.
14
+ * This won't prevent all shenanigans, but is a low-effort check.
15
+ */
8
16
  const isPlainObject = (obj) => {
9
17
  if (!(0, exports.isObject)(obj)) {
10
18
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"is-object.js","sourceRoot":"","sources":["../../../ts/is-object.ts"],"names":[],"mappings":";;;AAAO,MAAM,QAAQ,GAAG,CAAC,GAAY,EAA8B,EAAE;IACpE,OAAO,GAAG,IAAI,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAC;AAC/C,CAAC,CAAC;AAFW,QAAA,QAAQ,YAEnB;AAEK,MAAM,aAAa,GAAG,CAAC,GAAY,EAA8B,EAAE;IACzE,IAAI,CAAC,IAAA,gBAAQ,EAAC,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,KAAK,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IAC1C,OAAO,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,MAAM,CAAC,SAAS,CAAC;AACpD,CAAC,CAAC;AANW,QAAA,aAAa,iBAMxB"}
1
+ {"version":3,"file":"is-object.js","sourceRoot":"","sources":["../../../ts/is-object.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACI,MAAM,QAAQ,GAAG,CAAC,GAAY,EAA8B,EAAE;IACpE,OAAO,GAAG,IAAI,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAC;AAC/C,CAAC,CAAC;AAFW,QAAA,QAAQ,YAEnB;AAEF;;;;GAIG;AACI,MAAM,aAAa,GAAG,CAAC,GAAY,EAA8B,EAAE;IACzE,IAAI,CAAC,IAAA,gBAAQ,EAAC,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,KAAK,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IAC1C,OAAO,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,MAAM,CAAC,SAAS,CAAC;AACpD,CAAC,CAAC;AANW,QAAA,aAAa,iBAMxB"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.scrubStackTrace = void 0;
4
+ const defaultKeepIf = (line) => {
5
+ return !line.includes("node:internal")
6
+ && (!line.includes("/node_modules/") || line.includes("@rickosborne/"));
7
+ };
8
+ /**
9
+ * Wrap an Error in a proxy which cleans up the stack trace to be
10
+ * more human-readable. It filters out lines from third-party code,
11
+ * so you can quickly see your own code in the call stack.
12
+ * May optionally include some way of indicating additional lines
13
+ * which should be removed, so a guard function could make itself
14
+ * transparent, making it seem like the caller threw the error.
15
+ * @param err - Some kind of Error.
16
+ * @param removeIf - A matcher to indicate whether a line should be removed (not kept!).
17
+ * Generally, you'll pass in the name of the calling function, calling file, or similar.
18
+ */
19
+ const scrubStackTrace = (err, removeIf) => {
20
+ let keepIf;
21
+ if (typeof removeIf === "string") {
22
+ keepIf = (line) => !line.includes(removeIf);
23
+ }
24
+ else if (removeIf instanceof RegExp) {
25
+ keepIf = (line) => !removeIf.test(line);
26
+ }
27
+ else if (typeof removeIf === "function") {
28
+ keepIf = (line) => !removeIf(line);
29
+ }
30
+ else {
31
+ keepIf = () => true;
32
+ }
33
+ let scrubbedStack;
34
+ return new Proxy(err, {
35
+ get(target, p) {
36
+ var _a;
37
+ if (p !== "stack") {
38
+ return target[p];
39
+ }
40
+ if (scrubbedStack == null) {
41
+ scrubbedStack = (_a = target.stack) === null || _a === void 0 ? void 0 : _a.split("\n").filter(defaultKeepIf).filter(keepIf).join("\n");
42
+ }
43
+ return scrubbedStack;
44
+ },
45
+ });
46
+ };
47
+ exports.scrubStackTrace = scrubStackTrace;
48
+ //# sourceMappingURL=scrub-stack-trace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scrub-stack-trace.js","sourceRoot":"","sources":["../../../ts/scrub-stack-trace.ts"],"names":[],"mappings":";;;AAEA,MAAM,aAAa,GAAG,CAAC,IAAY,EAAW,EAAE;IAC/C,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;WAClC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC;AAC1E,CAAC,CAAC;AAEF;;;;;;;;;;GAUG;AACI,MAAM,eAAe,GAAG,CAC9B,GAAM,EACN,QAA0D,EACtD,EAAE;IACN,IAAI,MAAyB,CAAC;IAC9B,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC;SAAM,IAAI,QAAQ,YAAY,MAAM,EAAE,CAAC;QACvC,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;SAAM,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC3C,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;SAAM,CAAC;QACP,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;IACrB,CAAC;IACD,IAAI,aAAiC,CAAC;IACtC,OAAO,IAAI,KAAK,CAAI,GAAG,EAAE;QACxB,GAAG,CAAC,MAAS,EAAE,CAAkB;;YAChC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC;gBACnB,OAAO,MAAM,CAAE,CAAY,CAAE,CAAC;YAC/B,CAAC;YACD,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;gBAC3B,aAAa,GAAG,MAAA,MAAM,CAAC,KAAK,0CAAE,KAAK,CAAC,IAAI,EACtC,MAAM,CAAC,aAAa,EACpB,MAAM,CAAC,MAAM,EACb,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,CAAC;YACD,OAAO,aAAa,CAAC;QACtB,CAAC;KACD,CAAC,CAAC;AACJ,CAAC,CAAC;AA7BW,QAAA,eAAe,mBA6B1B"}
@@ -1 +1 @@
1
- {"root":["../../index.ts","../../ts/assert-defined.ts","../../ts/error-from-message.ts","../../ts/has-array.ts","../../ts/has-number.ts","../../ts/has-own.ts","../../ts/is-int.ts","../../ts/is-list-of.ts","../../ts/is-object.ts","../../ts/is-predicate.ts"],"version":"5.7.2"}
1
+ {"root":["../../index.ts","../../ts/error-from-message.ts","../../ts/has-array.ts","../../ts/has-number.ts","../../ts/has-own.ts","../../ts/is-defined.ts","../../ts/is-int.ts","../../ts/is-list-of.ts","../../ts/is-object.ts","../../ts/is-predicate.ts","../../ts/scrub-stack-trace.ts"],"version":"5.7.2"}
package/esm/index.js CHANGED
@@ -1,10 +1,11 @@
1
- export * from "./ts/assert-defined.js";
2
1
  export * from "./ts/error-from-message.js";
3
2
  export * from "./ts/has-array.js";
4
3
  export * from "./ts/has-number.js";
5
4
  export * from "./ts/has-own.js";
5
+ export * from "./ts/is-defined.js";
6
6
  export * from "./ts/is-int.js";
7
7
  export * from "./ts/is-list-of.js";
8
8
  export * from "./ts/is-object.js";
9
9
  export * from "./ts/is-predicate.js";
10
+ export * from "./ts/scrub-stack-trace.js";
10
11
  //# sourceMappingURL=index.js.map
package/esm/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { scrubStackTrace } from "./scrub-stack-trace.js";
1
2
  /**
2
3
  * Helper for guards which expect text or an error, or
3
4
  * can generate one when needed.
@@ -17,6 +18,6 @@ export const errorFromMessageOrError = (messageOrError, defaultConstructor = Err
17
18
  else {
18
19
  error = stringOrError;
19
20
  }
20
- return error;
21
+ return scrubStackTrace(error, " at errorFromMessageOrError ");
21
22
  };
22
23
  //# sourceMappingURL=error-from-message.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"error-from-message.js","sourceRoot":"","sources":["../../../ts/error-from-message.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACtC,cAA8B,EAC9B,qBAAuD,KAAK,EACpD,EAAE;IACV,IAAI,aAA6B,CAAC;IAClC,IAAI,OAAO,cAAc,KAAK,UAAU,EAAE,CAAC;QAC1C,aAAa,GAAG,cAAc,EAAE,CAAC;IAClC,CAAC;SAAM,CAAC;QACP,aAAa,GAAG,cAAc,CAAC;IAChC,CAAC;IACD,IAAI,KAAY,CAAC;IACjB,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;QACvC,KAAK,GAAG,IAAI,kBAAkB,CAAC,YAAa,aAAc,EAAE,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QACP,KAAK,GAAG,aAAa,CAAC;IACvB,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC,CAAC"}
1
+ {"version":3,"file":"error-from-message.js","sourceRoot":"","sources":["../../../ts/error-from-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAOzD;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACtC,cAA8B,EAC9B,qBAAuD,KAAK,EACpD,EAAE;IACV,IAAI,aAA6B,CAAC;IAClC,IAAI,OAAO,cAAc,KAAK,UAAU,EAAE,CAAC;QAC1C,aAAa,GAAG,cAAc,EAAE,CAAC;IAClC,CAAC;SAAM,CAAC;QACP,aAAa,GAAG,cAAc,CAAC;IAChC,CAAC;IACD,IAAI,KAAY,CAAC;IACjB,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;QACvC,KAAK,GAAG,IAAI,kBAAkB,CAAC,YAAa,aAAc,EAAE,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QACP,KAAK,GAAG,aAAa,CAAC;IACvB,CAAC;IACD,OAAO,eAAe,CAAC,KAAK,EAAE,8BAA8B,CAAC,CAAC;AAC/D,CAAC,CAAC"}
@@ -1,4 +1,8 @@
1
1
  import { hasOwn } from "./has-own.js";
2
+ /**
3
+ * Guard for whether an object has a property with the given name
4
+ * and a numeric value.
5
+ */
2
6
  export const hasNumber = (obj, name) => {
3
7
  return hasOwn(obj, name) && typeof obj[name] === "number";
4
8
  };
@@ -1 +1 @@
1
- {"version":3,"file":"has-number.js","sourceRoot":"","sources":["../../../ts/has-number.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,CAAC,MAAM,SAAS,GAAG,CAAsB,GAAY,EAAE,IAAU,EAAgC,EAAE;IACxG,OAAO,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC;AAC3D,CAAC,CAAC"}
1
+ {"version":3,"file":"has-number.js","sourceRoot":"","sources":["../../../ts/has-number.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAsB,GAAY,EAAE,IAAU,EAAkC,EAAE;IAC1G,OAAO,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,OAAO,GAAG,CAAE,IAAI,CAAE,KAAK,QAAQ,CAAC;AAC7D,CAAC,CAAC"}
package/esm/ts/has-own.js CHANGED
@@ -1,4 +1,8 @@
1
1
  import { isObject } from "./is-object.js";
2
+ /**
3
+ * Guard for whether the given value is an object with a property
4
+ * with the given name.
5
+ */
2
6
  export function hasOwn(obj, name, predicate) {
3
7
  if (!isObject(obj) || !Object.hasOwn(obj, name)) {
4
8
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"has-own.js","sourceRoot":"","sources":["../../../ts/has-own.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAI1C,MAAM,UAAU,MAAM,CAAyB,GAAY,EAAE,IAAU,EAAE,SAA0C;IAClH,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;QACjD,OAAO,KAAK,CAAC;IACd,CAAC;IACD,OAAO,SAAS,IAAI,IAAI,IAAI,SAAS,CAAC,GAAG,CAAC,IAAwB,CAAC,CAAC,CAAC;AACtE,CAAC"}
1
+ {"version":3,"file":"has-own.js","sourceRoot":"","sources":["../../../ts/has-own.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAc1C;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAyB,GAAY,EAAE,IAAU,EAAE,SAA0C;IAClH,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;QACjD,OAAO,KAAK,CAAC;IACd,CAAC;IACD,OAAO,SAAS,IAAI,IAAI,IAAI,SAAS,CAAC,GAAG,CAAE,IAAwB,CAAE,CAAC,CAAC;AACxE,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { errorFromMessageOrError } from "./error-from-message.js";
2
+ /**
3
+ * Assert the given value is not null or undefined.
4
+ * Throws with the given message or error, otherwise.
5
+ */
6
+ export function assertDefined(value, messageOrError) {
7
+ if (value != null) {
8
+ return;
9
+ }
10
+ throw errorFromMessageOrError(messageOrError, RangeError);
11
+ }
12
+ /**
13
+ * Guard to filter out null or undefined values.
14
+ */
15
+ export const isDefined = (obj) => obj != null;
16
+ /**
17
+ * Coerce a value's type to exclude null or undefined, or throw
18
+ * if it actually is null or undefined.
19
+ */
20
+ export const expectDefined = (obj, messageOrError) => {
21
+ assertDefined(obj, messageOrError);
22
+ return obj;
23
+ };
24
+ //# sourceMappingURL=is-defined.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-defined.js","sourceRoot":"","sources":["../../../ts/is-defined.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAEvF;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC5B,KAAQ,EACR,cAA8B;IAE9B,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QACnB,OAAO;IACR,CAAC;IACD,MAAM,uBAAuB,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAI,GAAM,EAAyB,EAAE,CAAC,GAAG,IAAI,IAAI,CAAC;AAE3E;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC5B,GAAM,EACN,cAA8B,EACb,EAAE;IACnB,aAAa,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACnC,OAAO,GAAG,CAAC;AACZ,CAAC,CAAC"}
package/esm/ts/is-int.js CHANGED
@@ -1,12 +1,47 @@
1
1
  import { errorFromMessageOrError } from "./error-from-message.js";
2
+ /**
3
+ * Check whether the given value is not just numeric, but is
4
+ * also an integer.
5
+ */
2
6
  export const isInt = (obj) => typeof obj === "number" && !isNaN(obj) && Math.trunc(obj) === obj && obj !== Infinity && obj !== -Infinity;
7
+ /**
8
+ * Throw if the given value is not an integer.
9
+ */
3
10
  export function assertInt(value, messageOrError) {
4
11
  if (!isInt(value)) {
5
12
  throw errorFromMessageOrError(messageOrError, TypeError);
6
13
  }
7
14
  }
15
+ /**
16
+ * Coerce a value's type to a number, throwing if it's not an integer.
17
+ */
8
18
  export const expectInt = (obj, messageOrError) => {
9
19
  assertInt(obj, messageOrError);
10
20
  return obj;
11
21
  };
22
+ /**
23
+ * Convert to an integer, if it seems like it could be done safely.
24
+ * See {@link https://en.wikipedia.org/wiki/Decimal_separator | decimal separator on Wikipedia}
25
+ * for details on how this is probably very wrong in many countries.
26
+ */
27
+ export const maybeInt = (text) => {
28
+ let sign = 1;
29
+ let clean = text.trim();
30
+ // This just makes the patterns below a little easier.
31
+ if (text.startsWith("-")) {
32
+ sign = -1;
33
+ clean = clean.substring(1);
34
+ }
35
+ clean = clean
36
+ .replace(/(?<=\d)[_  ](?=\d)/g, "")
37
+ .replace(/^0+[,'.·]0*$/, "0")
38
+ .replace(/^(\d+(?:,\d+)+)[.·]0*$/, (_all, digits) => digits.replace(/[^-0-9]/g, ""))
39
+ .replace(/^(\d+(?:'\d+)+)[.,]0*$/, (_all, digits) => digits.replace(/[^-0-9]/g, ""))
40
+ .replace(/^(\d+(?:\.\d+)+)[,']0*$/, (_all, digits) => digits.replace(/[^-0-9]/g, ""))
41
+ .replace(/^(\d{4,})[,'.·]0*$/, (_all, digits) => digits.replace(/[^-0-9]/g, ""));
42
+ if (/^-?(0|[1-9][0-9]*)$/.test(clean)) {
43
+ return parseInt(clean, 10) * sign;
44
+ }
45
+ return undefined;
46
+ };
12
47
  //# sourceMappingURL=is-int.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"is-int.js","sourceRoot":"","sources":["../../../ts/is-int.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAEvF,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,GAAY,EAAiB,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC;AAEjK,MAAM,UAAU,SAAS,CAAC,KAAc,EAAE,cAA8B;IACvE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACnB,MAAM,uBAAuB,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IAC1D,CAAC;AACF,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,CACxB,GAAY,EACZ,cAA8B,EACrB,EAAE;IACX,SAAS,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC/B,OAAO,GAAG,CAAC;AACZ,CAAC,CAAC"}
1
+ {"version":3,"file":"is-int.js","sourceRoot":"","sources":["../../../ts/is-int.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAEvF;;;GAGG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,GAAY,EAAiB,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC;AAEjK;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,KAAc,EAAE,cAA8B;IACvE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACnB,MAAM,uBAAuB,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IAC1D,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CACxB,GAAY,EACZ,cAA8B,EACrB,EAAE;IACX,SAAS,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC/B,OAAO,GAAG,CAAC;AACZ,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CACvB,IAAY,EACS,EAAE;IACvB,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACxB,sDAAsD;IACtD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,IAAI,GAAG,CAAC,CAAC,CAAC;QACV,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IACD,KAAK,GAAG,KAAK;SACX,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC;SAClC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC;SAC5B,OAAO,CAAC,wBAAwB,EAAE,CAAC,IAAI,EAAE,MAAc,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;SAC3F,OAAO,CAAC,wBAAwB,EAAE,CAAC,IAAI,EAAE,MAAc,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;SAC3F,OAAO,CAAC,yBAAyB,EAAE,CAAC,IAAI,EAAE,MAAc,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;SAC5F,OAAO,CAAC,oBAAoB,EAAE,CAAC,IAAI,EAAE,MAAc,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CACxF;IACD,IAAI,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC;IACnC,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC,CAAC"}
@@ -1,3 +1,7 @@
1
+ /**
2
+ * Guard to check if the given value is an array where all the
3
+ * items match the given predicate.
4
+ */
1
5
  export const isListOf = (list, predicate) => {
2
6
  return Array.isArray(list) && list.every(predicate);
3
7
  };