@nejs/basic-extensions 2.7.0 → 2.9.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.
- package/.vscode/settings.json +5 -0
- package/README.md +6250 -1574
- package/bin/version +100 -0
- package/dist/@nejs/basic-extensions.bundle.2.8.0.js +19 -0
- package/dist/@nejs/basic-extensions.bundle.2.8.0.js.map +7 -0
- package/dist/cjs/array.extensions.d.ts +39 -0
- package/dist/cjs/array.extensions.js +303 -0
- package/dist/cjs/array.extensions.js.map +1 -0
- package/dist/cjs/big.int.extension.d.ts +31 -0
- package/dist/cjs/big.int.extension.js +164 -0
- package/dist/cjs/big.int.extension.js.map +1 -0
- package/dist/cjs/{newClasses → classes}/asyncIterable.js +32 -44
- package/dist/cjs/classes/asyncIterable.js.map +1 -0
- package/dist/cjs/{newClasses → classes}/deferred.js +66 -138
- package/dist/cjs/classes/deferred.js.map +1 -0
- package/dist/cjs/{newClasses → classes}/descriptor.js +56 -90
- package/dist/cjs/classes/descriptor.js.map +1 -0
- package/dist/cjs/classes/index.d.ts +13 -0
- package/dist/cjs/classes/index.js +57 -0
- package/dist/cjs/classes/index.js.map +1 -0
- package/dist/cjs/classes/introspector.d.ts +20 -0
- package/dist/cjs/classes/introspector.js +130 -0
- package/dist/cjs/classes/introspector.js.map +1 -0
- package/dist/cjs/{newClasses → classes}/iterable.js +42 -63
- package/dist/cjs/classes/iterable.js.map +1 -0
- package/dist/cjs/classes/param.parser.d.ts +227 -0
- package/dist/cjs/classes/param.parser.js +242 -0
- package/dist/cjs/classes/param.parser.js.map +1 -0
- package/dist/cjs/classes/pluggable.proxy.d.ts +152 -0
- package/dist/cjs/classes/pluggable.proxy.js +444 -0
- package/dist/cjs/classes/pluggable.proxy.js.map +1 -0
- package/dist/cjs/{newClasses → classes}/refmap.js +18 -30
- package/dist/cjs/classes/refmap.js.map +1 -0
- package/dist/cjs/{newClasses → classes}/refset.js +28 -47
- package/dist/cjs/classes/refset.js.map +1 -0
- package/dist/cjs/classes/symkeys.d.ts +292 -0
- package/dist/cjs/classes/symkeys.js +424 -0
- package/dist/cjs/classes/symkeys.js.map +1 -0
- package/dist/cjs/classes/type.d.ts +56 -0
- package/dist/cjs/classes/type.js +405 -0
- package/dist/cjs/classes/type.js.map +1 -0
- package/dist/cjs/function.extensions.js +757 -0
- package/dist/cjs/function.extensions.js.map +1 -0
- package/dist/cjs/global.this.js +261 -0
- package/dist/cjs/global.this.js.map +1 -0
- package/dist/cjs/index.d.ts +4 -3
- package/dist/cjs/index.js +62 -32
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/json.extensions.d.ts +2 -0
- package/dist/cjs/json.extensions.js +108 -0
- package/dist/cjs/json.extensions.js.map +1 -0
- package/dist/{mjs/mapextensions.d.ts → cjs/map.extensions.d.ts} +1 -0
- package/dist/cjs/map.extensions.js +142 -0
- package/dist/cjs/map.extensions.js.map +1 -0
- package/dist/cjs/number.extension.d.ts +44 -0
- package/dist/cjs/number.extension.js +260 -0
- package/dist/cjs/number.extension.js.map +1 -0
- package/dist/cjs/object.extensions.d.ts +62 -0
- package/dist/cjs/object.extensions.js +1128 -0
- package/dist/cjs/object.extensions.js.map +1 -0
- package/dist/cjs/proxy.extensions.d.ts +2 -0
- package/dist/cjs/proxy.extensions.js +207 -0
- package/dist/cjs/proxy.extensions.js.map +1 -0
- package/dist/cjs/reflect.extensions.js +316 -0
- package/dist/cjs/reflect.extensions.js.map +1 -0
- package/dist/cjs/regular.expression.extensions.d.ts +2 -0
- package/dist/cjs/regular.expression.extensions.js +423 -0
- package/dist/cjs/regular.expression.extensions.js.map +1 -0
- package/dist/cjs/set.extensions.d.ts +40 -0
- package/dist/cjs/{setextensions.js → set.extensions.js} +150 -2
- package/dist/cjs/set.extensions.js.map +1 -0
- package/dist/cjs/string.extensions.js +661 -0
- package/dist/cjs/string.extensions.js.map +1 -0
- package/dist/{mjs/symbolextensions.d.ts → cjs/symbol.extensions.d.ts} +1 -0
- package/dist/cjs/symbol.extensions.js +380 -0
- package/dist/cjs/symbol.extensions.js.map +1 -0
- package/dist/cjs/{weakrefextensions.js → weakref.extensions.js} +1 -1
- package/dist/cjs/weakref.extensions.js.map +1 -0
- package/dist/mjs/array.extensions.d.ts +39 -0
- package/dist/mjs/array.extensions.js +300 -0
- package/dist/mjs/array.extensions.js.map +1 -0
- package/dist/mjs/big.int.extension.d.ts +31 -0
- package/dist/mjs/big.int.extension.js +161 -0
- package/dist/mjs/big.int.extension.js.map +1 -0
- package/dist/mjs/classes/asyncIterable.js.map +1 -0
- package/dist/mjs/classes/deferred.js.map +1 -0
- package/dist/mjs/{newClasses → classes}/descriptor.js +7 -4
- package/dist/mjs/classes/descriptor.js.map +1 -0
- package/dist/mjs/classes/index.d.ts +13 -0
- package/dist/mjs/classes/index.js +40 -0
- package/dist/mjs/classes/index.js.map +1 -0
- package/dist/mjs/classes/introspector.d.ts +20 -0
- package/dist/mjs/classes/introspector.js +126 -0
- package/dist/mjs/classes/introspector.js.map +1 -0
- package/dist/mjs/classes/iterable.js.map +1 -0
- package/dist/mjs/classes/param.parser.d.ts +227 -0
- package/dist/mjs/classes/param.parser.js +238 -0
- package/dist/mjs/classes/param.parser.js.map +1 -0
- package/dist/mjs/classes/pluggable.proxy.d.ts +152 -0
- package/dist/mjs/classes/pluggable.proxy.js +438 -0
- package/dist/mjs/classes/pluggable.proxy.js.map +1 -0
- package/dist/mjs/{newClasses → classes}/refmap.js +3 -3
- package/dist/mjs/classes/refmap.js.map +1 -0
- package/dist/mjs/classes/refset.js.map +1 -0
- package/dist/mjs/classes/symkeys.d.ts +292 -0
- package/dist/mjs/classes/symkeys.js +420 -0
- package/dist/mjs/classes/symkeys.js.map +1 -0
- package/dist/mjs/classes/type.d.ts +56 -0
- package/dist/mjs/classes/type.js +401 -0
- package/dist/mjs/classes/type.js.map +1 -0
- package/dist/mjs/function.extensions.js +754 -0
- package/dist/mjs/function.extensions.js.map +1 -0
- package/dist/mjs/global.this.js +258 -0
- package/dist/mjs/global.this.js.map +1 -0
- package/dist/mjs/index.d.ts +4 -3
- package/dist/mjs/index.js +49 -19
- package/dist/mjs/index.js.map +1 -1
- package/dist/mjs/json.extensions.d.ts +2 -0
- package/dist/mjs/json.extensions.js +105 -0
- package/dist/mjs/json.extensions.js.map +1 -0
- package/dist/{cjs/mapextensions.d.ts → mjs/map.extensions.d.ts} +1 -0
- package/dist/mjs/map.extensions.js +139 -0
- package/dist/mjs/map.extensions.js.map +1 -0
- package/dist/mjs/number.extension.d.ts +44 -0
- package/dist/mjs/number.extension.js +257 -0
- package/dist/mjs/number.extension.js.map +1 -0
- package/dist/mjs/object.extensions.d.ts +62 -0
- package/dist/mjs/object.extensions.js +1124 -0
- package/dist/mjs/object.extensions.js.map +1 -0
- package/dist/mjs/proxy.extensions.d.ts +2 -0
- package/dist/mjs/proxy.extensions.js +204 -0
- package/dist/mjs/proxy.extensions.js.map +1 -0
- package/dist/mjs/reflect.extensions.js +313 -0
- package/dist/mjs/reflect.extensions.js.map +1 -0
- package/dist/mjs/regular.expression.extensions.d.ts +2 -0
- package/dist/mjs/regular.expression.extensions.js +420 -0
- package/dist/mjs/regular.expression.extensions.js.map +1 -0
- package/dist/mjs/set.extensions.d.ts +40 -0
- package/dist/mjs/{setextensions.js → set.extensions.js} +149 -1
- package/dist/mjs/set.extensions.js.map +1 -0
- package/dist/mjs/string.extensions.js +658 -0
- package/dist/mjs/string.extensions.js.map +1 -0
- package/dist/{cjs/symbolextensions.d.ts → mjs/symbol.extensions.d.ts} +1 -0
- package/dist/mjs/symbol.extensions.js +377 -0
- package/dist/mjs/symbol.extensions.js.map +1 -0
- package/dist/mjs/{weakrefextensions.js → weakref.extensions.js} +1 -1
- package/dist/mjs/weakref.extensions.js.map +1 -0
- package/docs/index.html +24452 -5692
- package/package.json +7 -5
- package/src/array.extensions.js +322 -0
- package/src/big.int.extension.js +163 -0
- package/src/{newClasses → classes}/descriptor.js +16 -12
- package/src/classes/index.js +51 -0
- package/src/classes/introspector.js +167 -0
- package/src/classes/param.parser.js +253 -0
- package/src/classes/pluggable.proxy.js +485 -0
- package/src/{newClasses → classes}/refmap.js +5 -3
- package/src/classes/symkeys.js +464 -0
- package/src/classes/type.js +427 -0
- package/src/function.extensions.js +818 -0
- package/src/global.this.js +304 -0
- package/src/index.js +56 -23
- package/src/json.extensions.js +109 -0
- package/src/map.extensions.js +144 -0
- package/src/number.extension.js +273 -0
- package/src/object.extensions.js +1237 -0
- package/src/proxy.extensions.js +229 -0
- package/src/reflect.extensions.js +346 -0
- package/src/regular.expression.extensions.js +451 -0
- package/src/{setextensions.js → set.extensions.js} +151 -2
- package/src/string.extensions.js +734 -0
- package/src/symbol.extensions.js +389 -0
- package/tests/newClasses/refmap.test.js +3 -2
- package/tsconfig.base.json +5 -3
- package/tsconfig.cjs.json +2 -2
- package/tsconfig.esm.json +2 -2
- package/dist/@nejs/basic-extensions.bundle.2.6.0.js +0 -17
- package/dist/@nejs/basic-extensions.bundle.2.6.0.js.map +0 -7
- package/dist/cjs/arrayextensions.d.ts +0 -10
- package/dist/cjs/arrayextensions.js +0 -73
- package/dist/cjs/arrayextensions.js.map +0 -1
- package/dist/cjs/functionextensions.js +0 -202
- package/dist/cjs/functionextensions.js.map +0 -1
- package/dist/cjs/globals.js +0 -166
- package/dist/cjs/globals.js.map +0 -1
- package/dist/cjs/mapextensions.js +0 -32
- package/dist/cjs/mapextensions.js.map +0 -1
- package/dist/cjs/newClasses/asyncIterable.js.map +0 -1
- package/dist/cjs/newClasses/deferred.js.map +0 -1
- package/dist/cjs/newClasses/descriptor.js.map +0 -1
- package/dist/cjs/newClasses/iterable.js.map +0 -1
- package/dist/cjs/newClasses/refmap.js.map +0 -1
- package/dist/cjs/newClasses/refset.js.map +0 -1
- package/dist/cjs/objectextensions.d.ts +0 -11
- package/dist/cjs/objectextensions.js +0 -232
- package/dist/cjs/objectextensions.js.map +0 -1
- package/dist/cjs/reflectextensions.js +0 -111
- package/dist/cjs/reflectextensions.js.map +0 -1
- package/dist/cjs/setextensions.d.ts +0 -2
- package/dist/cjs/setextensions.js.map +0 -1
- package/dist/cjs/stringextensions.js +0 -158
- package/dist/cjs/stringextensions.js.map +0 -1
- package/dist/cjs/symbolextensions.js +0 -69
- package/dist/cjs/symbolextensions.js.map +0 -1
- package/dist/cjs/weakrefextensions.js.map +0 -1
- package/dist/mjs/arrayextensions.d.ts +0 -10
- package/dist/mjs/arrayextensions.js +0 -70
- package/dist/mjs/arrayextensions.js.map +0 -1
- package/dist/mjs/functionextensions.js +0 -199
- package/dist/mjs/functionextensions.js.map +0 -1
- package/dist/mjs/globals.js +0 -163
- package/dist/mjs/globals.js.map +0 -1
- package/dist/mjs/mapextensions.js +0 -29
- package/dist/mjs/mapextensions.js.map +0 -1
- package/dist/mjs/newClasses/asyncIterable.js.map +0 -1
- package/dist/mjs/newClasses/deferred.js.map +0 -1
- package/dist/mjs/newClasses/descriptor.js.map +0 -1
- package/dist/mjs/newClasses/iterable.js.map +0 -1
- package/dist/mjs/newClasses/refmap.js.map +0 -1
- package/dist/mjs/newClasses/refset.js.map +0 -1
- package/dist/mjs/objectextensions.d.ts +0 -11
- package/dist/mjs/objectextensions.js +0 -229
- package/dist/mjs/objectextensions.js.map +0 -1
- package/dist/mjs/reflectextensions.js +0 -108
- package/dist/mjs/reflectextensions.js.map +0 -1
- package/dist/mjs/setextensions.d.ts +0 -2
- package/dist/mjs/setextensions.js.map +0 -1
- package/dist/mjs/stringextensions.js +0 -155
- package/dist/mjs/stringextensions.js.map +0 -1
- package/dist/mjs/symbolextensions.js +0 -66
- package/dist/mjs/symbolextensions.js.map +0 -1
- package/dist/mjs/weakrefextensions.js.map +0 -1
- package/src/arrayextensions.js +0 -75
- package/src/functionextensions.js +0 -225
- package/src/globals.js +0 -196
- package/src/mapextensions.js +0 -32
- package/src/objectextensions.js +0 -256
- package/src/reflectextensions.js +0 -118
- package/src/stringextensions.js +0 -166
- package/src/symbolextensions.js +0 -69
- /package/dist/cjs/{newClasses → classes}/asyncIterable.d.ts +0 -0
- /package/dist/cjs/{newClasses → classes}/deferred.d.ts +0 -0
- /package/dist/cjs/{newClasses → classes}/descriptor.d.ts +0 -0
- /package/dist/cjs/{newClasses → classes}/iterable.d.ts +0 -0
- /package/dist/cjs/{newClasses → classes}/refmap.d.ts +0 -0
- /package/dist/cjs/{newClasses → classes}/refset.d.ts +0 -0
- /package/dist/cjs/{functionextensions.d.ts → function.extensions.d.ts} +0 -0
- /package/dist/cjs/{globals.d.ts → global.this.d.ts} +0 -0
- /package/dist/cjs/{reflectextensions.d.ts → reflect.extensions.d.ts} +0 -0
- /package/dist/cjs/{stringextensions.d.ts → string.extensions.d.ts} +0 -0
- /package/dist/cjs/{weakrefextensions.d.ts → weakref.extensions.d.ts} +0 -0
- /package/dist/mjs/{newClasses → classes}/asyncIterable.d.ts +0 -0
- /package/dist/mjs/{newClasses → classes}/asyncIterable.js +0 -0
- /package/dist/mjs/{newClasses → classes}/deferred.d.ts +0 -0
- /package/dist/mjs/{newClasses → classes}/deferred.js +0 -0
- /package/dist/mjs/{newClasses → classes}/descriptor.d.ts +0 -0
- /package/dist/mjs/{newClasses → classes}/iterable.d.ts +0 -0
- /package/dist/mjs/{newClasses → classes}/iterable.js +0 -0
- /package/dist/mjs/{newClasses → classes}/refmap.d.ts +0 -0
- /package/dist/mjs/{newClasses → classes}/refset.d.ts +0 -0
- /package/dist/mjs/{newClasses → classes}/refset.js +0 -0
- /package/dist/mjs/{functionextensions.d.ts → function.extensions.d.ts} +0 -0
- /package/dist/mjs/{globals.d.ts → global.this.d.ts} +0 -0
- /package/dist/mjs/{reflectextensions.d.ts → reflect.extensions.d.ts} +0 -0
- /package/dist/mjs/{stringextensions.d.ts → string.extensions.d.ts} +0 -0
- /package/dist/mjs/{weakrefextensions.d.ts → weakref.extensions.d.ts} +0 -0
- /package/src/{newClasses → classes}/asyncIterable.js +0 -0
- /package/src/{newClasses → classes}/deferred.js +0 -0
- /package/src/{newClasses → classes}/iterable.js +0 -0
- /package/src/{newClasses → classes}/refset.js +0 -0
- /package/src/{weakrefextensions.js → weakref.extensions.js} +0 -0
|
@@ -1,16 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
-
};
|
|
8
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
-
};
|
|
13
|
-
var _Iterable_elements, _Iterator_mapEach, _Iterator_iterable, _Iterator_iterator;
|
|
14
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
3
|
exports.IteratorExtensions = exports.IterableExtensions = exports.Iterator = exports.Iterable = void 0;
|
|
16
4
|
const extension_1 = require("@nejs/extension");
|
|
@@ -21,6 +9,11 @@ const extension_1 = require("@nejs/extension");
|
|
|
21
9
|
* `for...of` loops and other standard JavaScript iteration mechanisms.
|
|
22
10
|
*/
|
|
23
11
|
class Iterable {
|
|
12
|
+
/**
|
|
13
|
+
* Private field to store the elements of the iterable.
|
|
14
|
+
* @private
|
|
15
|
+
*/
|
|
16
|
+
#elements = [];
|
|
24
17
|
/**
|
|
25
18
|
* Constructs an instance of Iterable. It can be initialized with either an
|
|
26
19
|
* iterable object (such as an array, Set, Map, string, or any object
|
|
@@ -36,17 +29,12 @@ class Iterable {
|
|
|
36
29
|
* not an iterable.
|
|
37
30
|
*/
|
|
38
31
|
constructor(elementsOrFirstElement, ...moreElements) {
|
|
39
|
-
/**
|
|
40
|
-
* Private field to store the elements of the iterable.
|
|
41
|
-
* @private
|
|
42
|
-
*/
|
|
43
|
-
_Iterable_elements.set(this, []);
|
|
44
32
|
if (elementsOrFirstElement != null &&
|
|
45
33
|
typeof elementsOrFirstElement[Symbol.iterator] === 'function') {
|
|
46
|
-
|
|
34
|
+
this.#elements = [...elementsOrFirstElement, ...moreElements];
|
|
47
35
|
}
|
|
48
36
|
else {
|
|
49
|
-
|
|
37
|
+
this.#elements = [elementsOrFirstElement, ...moreElements];
|
|
50
38
|
}
|
|
51
39
|
}
|
|
52
40
|
/**
|
|
@@ -56,8 +44,8 @@ class Iterable {
|
|
|
56
44
|
*
|
|
57
45
|
* @returns {Generator} A generator that yields each element of the iterable.
|
|
58
46
|
*/
|
|
59
|
-
*[
|
|
60
|
-
for (const element of
|
|
47
|
+
*[Symbol.iterator]() {
|
|
48
|
+
for (const element of this.#elements) {
|
|
61
49
|
yield element;
|
|
62
50
|
}
|
|
63
51
|
}
|
|
@@ -68,7 +56,7 @@ class Iterable {
|
|
|
68
56
|
* @returns {Array} An array containing all the elements of the iterable.
|
|
69
57
|
*/
|
|
70
58
|
get asArray() {
|
|
71
|
-
return
|
|
59
|
+
return this.#elements;
|
|
72
60
|
}
|
|
73
61
|
/**
|
|
74
62
|
* Ensures that the constructor of this object instance's name
|
|
@@ -105,6 +93,13 @@ exports.Iterable = Iterable;
|
|
|
105
93
|
* `[Symbol.iterator]` property assigned to a generator function.
|
|
106
94
|
*/
|
|
107
95
|
class Iterator {
|
|
96
|
+
/**
|
|
97
|
+
* A private function that when provided has the following signature:
|
|
98
|
+
* `function mapEach(entry) -> entry`. This allows any changes to be made
|
|
99
|
+
* to each element, conditionally and programmatically, as needed before
|
|
100
|
+
* they are returned to the called code.
|
|
101
|
+
*/
|
|
102
|
+
#mapEach = undefined;
|
|
108
103
|
/**
|
|
109
104
|
* Creates a new `Iterator` object instance.
|
|
110
105
|
*
|
|
@@ -114,43 +109,12 @@ class Iterator {
|
|
|
114
109
|
* takes an entry as input and receives one as output.
|
|
115
110
|
*/
|
|
116
111
|
constructor(iterable, mapEach) {
|
|
117
|
-
/**
|
|
118
|
-
* A private function that when provided has the following signature:
|
|
119
|
-
* `function mapEach(entry) -> entry`. This allows any changes to be made
|
|
120
|
-
* to each element, conditionally and programmatically, as needed before
|
|
121
|
-
* they are returned to the called code.
|
|
122
|
-
*/
|
|
123
|
-
_Iterator_mapEach.set(this, undefined
|
|
124
|
-
/**
|
|
125
|
-
* Creates a new `Iterator` object instance.
|
|
126
|
-
*
|
|
127
|
-
* @param {object} iterable any object that has a `[Symbol.iterator]`
|
|
128
|
-
* property assigned to a generator function.
|
|
129
|
-
* @param {function} mapEach when provided `mapEach` is a callback that
|
|
130
|
-
* takes an entry as input and receives one as output.
|
|
131
|
-
*/
|
|
132
|
-
);
|
|
133
|
-
/**
|
|
134
|
-
* The object from which its iterator functionality is derived.
|
|
135
|
-
*
|
|
136
|
-
* @type {object}
|
|
137
|
-
* @private
|
|
138
|
-
*/
|
|
139
|
-
_Iterator_iterable.set(this, null);
|
|
140
|
-
/**
|
|
141
|
-
* The results of a call to the iterable's `[Symbol.iterator]`
|
|
142
|
-
* generator function.
|
|
143
|
-
*
|
|
144
|
-
* @type {object}
|
|
145
|
-
* @private
|
|
146
|
-
*/
|
|
147
|
-
_Iterator_iterator.set(this, null);
|
|
148
112
|
if (!iterable || !Reflect.has(iterable, Symbol.iterator)) {
|
|
149
113
|
throw new TypeError('Value used to instantiate Iterator is not iterable');
|
|
150
114
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
115
|
+
this.#iterable = iterable;
|
|
116
|
+
this.#iterator = iterable[Symbol.iterator]();
|
|
117
|
+
this.#mapEach = typeof mapEach === 'function' ? mapEach : undefined;
|
|
154
118
|
}
|
|
155
119
|
/**
|
|
156
120
|
* Returns a new `Array` derived from the iterable this object
|
|
@@ -160,7 +124,7 @@ class Iterator {
|
|
|
160
124
|
* iterable. The method is generated from `Array.from()`
|
|
161
125
|
*/
|
|
162
126
|
get asArray() {
|
|
163
|
-
return Array.from(
|
|
127
|
+
return Array.from(this.#iterable);
|
|
164
128
|
}
|
|
165
129
|
/**
|
|
166
130
|
* Returns the actual iterable object passed to the constructor that
|
|
@@ -169,7 +133,7 @@ class Iterator {
|
|
|
169
133
|
* @returns {object} the object containing the `[Symbol.iterator]`
|
|
170
134
|
*/
|
|
171
135
|
get iterable() {
|
|
172
|
-
return
|
|
136
|
+
return this.#iterable;
|
|
173
137
|
}
|
|
174
138
|
/**
|
|
175
139
|
* The function retrieves the next value in the iterator. If the
|
|
@@ -179,14 +143,14 @@ class Iterator {
|
|
|
179
143
|
* @returns {any} the next value
|
|
180
144
|
*/
|
|
181
145
|
next() {
|
|
182
|
-
const input =
|
|
146
|
+
const input = this.#iterator.next();
|
|
183
147
|
let output = input;
|
|
184
148
|
if (output.done) {
|
|
185
149
|
return { value: undefined, done: true };
|
|
186
150
|
}
|
|
187
151
|
else {
|
|
188
|
-
if (
|
|
189
|
-
output.value =
|
|
152
|
+
if (this.#mapEach && typeof this.#mapEach === 'function') {
|
|
153
|
+
output.value = this.#mapEach(input.value);
|
|
190
154
|
}
|
|
191
155
|
return { value: output.value, done: false };
|
|
192
156
|
}
|
|
@@ -196,7 +160,7 @@ class Iterator {
|
|
|
196
160
|
* iterated over again.
|
|
197
161
|
*/
|
|
198
162
|
reset() {
|
|
199
|
-
|
|
163
|
+
this.#iterator = this.#iterable[Symbol.iterator]();
|
|
200
164
|
}
|
|
201
165
|
/**
|
|
202
166
|
* The existence of this symbol on the object instances, indicates that
|
|
@@ -206,7 +170,7 @@ class Iterator {
|
|
|
206
170
|
* @returns {Iterator} this is returned since this object is already
|
|
207
171
|
* conforming to the expected JavaScript Iterator interface
|
|
208
172
|
*/
|
|
209
|
-
[
|
|
173
|
+
[Symbol.iterator]() {
|
|
210
174
|
return this;
|
|
211
175
|
}
|
|
212
176
|
/**
|
|
@@ -218,6 +182,21 @@ class Iterator {
|
|
|
218
182
|
get [Symbol.toStringTag]() {
|
|
219
183
|
return this.constructor.name;
|
|
220
184
|
}
|
|
185
|
+
/**
|
|
186
|
+
* The object from which its iterator functionality is derived.
|
|
187
|
+
*
|
|
188
|
+
* @type {object}
|
|
189
|
+
* @private
|
|
190
|
+
*/
|
|
191
|
+
#iterable = null;
|
|
192
|
+
/**
|
|
193
|
+
* The results of a call to the iterable's `[Symbol.iterator]`
|
|
194
|
+
* generator function.
|
|
195
|
+
*
|
|
196
|
+
* @type {object}
|
|
197
|
+
* @private
|
|
198
|
+
*/
|
|
199
|
+
#iterator = null;
|
|
221
200
|
}
|
|
222
201
|
exports.Iterator = Iterator;
|
|
223
202
|
exports.IterableExtensions = new extension_1.Extension(Iterable);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iterable.js","sourceRoot":"","sources":["../../../src/classes/iterable.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
export class ParamParser {
|
|
2
|
+
/**
|
|
3
|
+
* Attempts to parse the given parameters using the provided parsers, throwing an
|
|
4
|
+
* error if no valid parser is found. This method serves as a convenience wrapper
|
|
5
|
+
* around `safeTryParsers`, enforcing strict parsing by automatically enabling
|
|
6
|
+
* error throwing on failure.
|
|
7
|
+
*
|
|
8
|
+
* @param {any[]} parameters - The parameters to be parsed.
|
|
9
|
+
* @param {Function[]} parsers - An array of `ParamParser` subclasses to attempt
|
|
10
|
+
* parsing with.
|
|
11
|
+
* @returns {Object} An object containing the parsing result, with a `success`
|
|
12
|
+
* property indicating if parsing was successful, and a `data` property containing
|
|
13
|
+
* the parsed data if successful.
|
|
14
|
+
* @example
|
|
15
|
+
* const parameters = ['param1', 'param2'];
|
|
16
|
+
* const parsers = [Parser1, Parser2];
|
|
17
|
+
* const result = ParamParser.tryParsers(parameters, parsers);
|
|
18
|
+
* if (result.success) {
|
|
19
|
+
* console.log('Parsing successful:', result.data);
|
|
20
|
+
* } else {
|
|
21
|
+
* console.error('Parsing failed.');
|
|
22
|
+
* }
|
|
23
|
+
*/
|
|
24
|
+
static tryParsers(parameters: any[], parsers: Function[]): Object;
|
|
25
|
+
/**
|
|
26
|
+
* Tries parsing `parameters` with each parser in `parsers`. If
|
|
27
|
+
* `throwOnFail` is true, throws an error when validation fails or
|
|
28
|
+
* no valid parser is found.
|
|
29
|
+
*
|
|
30
|
+
* This method attempts to parse the given parameters using the
|
|
31
|
+
* provided list of parsers. It validates the input to ensure both
|
|
32
|
+
* `parameters` and `parsers` are arrays and that `parsers`
|
|
33
|
+
* contains at least one valid `ParamParser` subclass. If
|
|
34
|
+
* `throwOnFail` is set to true, it will throw specific errors for
|
|
35
|
+
* invalid inputs or when no parser succeeds. Otherwise, it returns
|
|
36
|
+
* an object indicating the success status and the result of
|
|
37
|
+
* parsing, if successful.
|
|
38
|
+
*
|
|
39
|
+
* @param {any[]} parameters - The parameters to be parsed.
|
|
40
|
+
* @param {Function[]} parsers - An array of `ParamParser`
|
|
41
|
+
* subclasses to attempt parsing with.
|
|
42
|
+
* @param {boolean} [throwOnFail=false] - Whether to throw an
|
|
43
|
+
* error on failure.
|
|
44
|
+
* @returns {{success: boolean, data: any}} An object with a
|
|
45
|
+
* `success` flag and `data` containing the parsing result, if
|
|
46
|
+
* successful.
|
|
47
|
+
* @throws {ParametersMustBeArrayError} If `parameters` or
|
|
48
|
+
* `parsers` are not arrays when `throwOnFail` is true.
|
|
49
|
+
* @throws {ParsersArrayMustContainParsersError} If `parsers`
|
|
50
|
+
* does not contain at least one valid `ParamParser` subclass
|
|
51
|
+
* when `throwOnFail` is true.
|
|
52
|
+
* @throws {NoValidParsersFound} If no valid parser is found
|
|
53
|
+
* and `throwOnFail` is true.
|
|
54
|
+
* @example
|
|
55
|
+
* const parameters = ['param1', 'param2'];
|
|
56
|
+
* const parsers = [Parser1, Parser2];
|
|
57
|
+
* const result = ParamParser.safeTryParsers(
|
|
58
|
+
* parameters, parsers, true
|
|
59
|
+
* );
|
|
60
|
+
*
|
|
61
|
+
* if (result.success) {
|
|
62
|
+
* console.log('Parsing successful:', result.data);
|
|
63
|
+
* } else {
|
|
64
|
+
* console.error('Parsing failed.');
|
|
65
|
+
* }
|
|
66
|
+
*/
|
|
67
|
+
static safeTryParsers(parameters: any[], parsers: Function[], throwOnFail?: boolean | undefined): {
|
|
68
|
+
success: boolean;
|
|
69
|
+
data: any;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* A custom error class that signifies no valid parsers were found
|
|
73
|
+
* during the parsing process. This error is thrown when all
|
|
74
|
+
* parsers fail to parse the given parameters and the `throwOnFail`
|
|
75
|
+
* flag is set to true in the `safeTryParsers` method.
|
|
76
|
+
*
|
|
77
|
+
* @returns {Function} A class extending Error, representing a
|
|
78
|
+
* specific error when no valid parsers are found.ound.
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* try {
|
|
82
|
+
* const result = ParamParser.safeTryParsers(
|
|
83
|
+
* parameters, parsers, true
|
|
84
|
+
* );
|
|
85
|
+
* } catch (error) {
|
|
86
|
+
* if (error instanceof ParamParser.NoValidParsersFound) {
|
|
87
|
+
* console.error(
|
|
88
|
+
* 'No valid parsers could process the parameters.'
|
|
89
|
+
* );
|
|
90
|
+
* }
|
|
91
|
+
* }
|
|
92
|
+
*/
|
|
93
|
+
static get NoValidParsersFound(): Function;
|
|
94
|
+
/**
|
|
95
|
+
* Represents an error thrown when the parameters provided to a method
|
|
96
|
+
* are not in an array format as expected. This class extends the
|
|
97
|
+
* native JavaScript `Error` class, allowing for instances of this
|
|
98
|
+
* error to be thrown and caught using standard error handling
|
|
99
|
+
* mechanisms in JavaScript.
|
|
100
|
+
*
|
|
101
|
+
* This error is specifically used in scenarios where a method
|
|
102
|
+
* expects its arguments to be provided as an array, and the
|
|
103
|
+
* validation of those arguments fails because they were not
|
|
104
|
+
* provided in an array format. It serves as a clear indicator
|
|
105
|
+
* of the nature of the error to developers, enabling them to
|
|
106
|
+
* quickly identify and rectify the issue in their code.
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* try {
|
|
110
|
+
* ParamParser.safeTryParsers(nonArrayParameters, parsers, true);
|
|
111
|
+
* } catch (error) {
|
|
112
|
+
* if (error instanceof ParamParser.ParametersMustBeArrayError) {
|
|
113
|
+
* console.error('Parameters must be provided as an array.');
|
|
114
|
+
* }
|
|
115
|
+
* }
|
|
116
|
+
*/
|
|
117
|
+
static get ParametersMustBeArrayError(): {
|
|
118
|
+
new (message?: string | undefined): {
|
|
119
|
+
name: string;
|
|
120
|
+
message: string;
|
|
121
|
+
stack?: string | undefined;
|
|
122
|
+
cause?: unknown;
|
|
123
|
+
};
|
|
124
|
+
new (message?: string | undefined, options?: ErrorOptions | undefined): {
|
|
125
|
+
name: string;
|
|
126
|
+
message: string;
|
|
127
|
+
stack?: string | undefined;
|
|
128
|
+
cause?: unknown;
|
|
129
|
+
};
|
|
130
|
+
captureStackTrace(targetObject: object, constructorOpt?: Function | undefined): void;
|
|
131
|
+
prepareStackTrace?: ((err: Error, stackTraces: NodeJS.CallSite[]) => any) | undefined;
|
|
132
|
+
stackTraceLimit: number;
|
|
133
|
+
};
|
|
134
|
+
/**
|
|
135
|
+
* A custom error class indicating that the parsers array does not
|
|
136
|
+
* contain valid parser functions. This error is thrown when the
|
|
137
|
+
* validation of parsers within `ParamParser.safeTryParsers` fails
|
|
138
|
+
* to find any instance that is a subclass of `ParamParser`. It
|
|
139
|
+
* extends the native JavaScript `Error` class, allowing it to be
|
|
140
|
+
* thrown and caught using standard error handling mechanisms.
|
|
141
|
+
*
|
|
142
|
+
* This error serves as a clear indicator to developers that the
|
|
143
|
+
* provided array of parsers does not meet the expected criteria,
|
|
144
|
+
* specifically that it must contain at least one valid parser
|
|
145
|
+
* that extends `ParamParser`. This ensures that the parsing
|
|
146
|
+
* process can be executed with at least one valid parser function.
|
|
147
|
+
*
|
|
148
|
+
* @example
|
|
149
|
+
* try {
|
|
150
|
+
* ParamParser.safeTryParsers(parameters, [], true);
|
|
151
|
+
* } catch (error) {
|
|
152
|
+
* const { ParsersArrayMustContainParsersError } = ParamParser
|
|
153
|
+
* if (error instanceof ParsersArrayMustContainParsersError) {
|
|
154
|
+
* console.error(
|
|
155
|
+
* 'The parsers array must contain at least one valid parser.'
|
|
156
|
+
* );
|
|
157
|
+
* }
|
|
158
|
+
* }
|
|
159
|
+
*/
|
|
160
|
+
static get ParsersArrayMustContainParsersError(): {
|
|
161
|
+
new (message?: string | undefined): {
|
|
162
|
+
name: string;
|
|
163
|
+
message: string;
|
|
164
|
+
stack?: string | undefined;
|
|
165
|
+
cause?: unknown;
|
|
166
|
+
};
|
|
167
|
+
new (message?: string | undefined, options?: ErrorOptions | undefined): {
|
|
168
|
+
name: string;
|
|
169
|
+
message: string;
|
|
170
|
+
stack?: string | undefined;
|
|
171
|
+
cause?: unknown;
|
|
172
|
+
};
|
|
173
|
+
captureStackTrace(targetObject: object, constructorOpt?: Function | undefined): void;
|
|
174
|
+
prepareStackTrace?: ((err: Error, stackTraces: NodeJS.CallSite[]) => any) | undefined;
|
|
175
|
+
stackTraceLimit: number;
|
|
176
|
+
};
|
|
177
|
+
/**
|
|
178
|
+
* Constructs an instance of ParamParser. It takes in parameters, an optional
|
|
179
|
+
* validator function, and an optional parser function. The parameters are
|
|
180
|
+
* validated and if successful, parsed.
|
|
181
|
+
*
|
|
182
|
+
* @param {any[]} parameters - Arguments passed in by the process.
|
|
183
|
+
* @param {((any[]) => boolean)?} [validator=() => {}] - An optional function
|
|
184
|
+
* to specify a validator without subclassing ParamParser. It should return
|
|
185
|
+
* a boolean indicating the validity of the parameters.
|
|
186
|
+
* @param {((any[]) => object)?} [parser=() => {}] - An optional function to
|
|
187
|
+
* specify a parser without subclassing ParamParser. It should return an
|
|
188
|
+
* object after parsing the input parameters.
|
|
189
|
+
*
|
|
190
|
+
* @example
|
|
191
|
+
* const parameters = ['param1', 'param2']
|
|
192
|
+
* const validator = params => params.every(param => typeof param === 'string')
|
|
193
|
+
* const parser = params => ({ params })
|
|
194
|
+
* const paramParser = new ParamParser(parameters, validator, parser)
|
|
195
|
+
* if (paramParser.success) {
|
|
196
|
+
* console.log('Parsing successful:', paramParser.results)
|
|
197
|
+
* } else {
|
|
198
|
+
* console.error('Parsing failed.')
|
|
199
|
+
* }
|
|
200
|
+
*/
|
|
201
|
+
constructor(parameters: any[], validator?: () => void, parser?: () => void);
|
|
202
|
+
args: any[];
|
|
203
|
+
parser: () => void;
|
|
204
|
+
validator: () => void;
|
|
205
|
+
result: any;
|
|
206
|
+
success: boolean;
|
|
207
|
+
results: object | undefined;
|
|
208
|
+
/**
|
|
209
|
+
* @param {object} args arguments that were previously validated
|
|
210
|
+
* by either the overloaded validate() method or the supplied
|
|
211
|
+
* validator closure.
|
|
212
|
+
* @returns {object} returns the output object, or an empty
|
|
213
|
+
* object, after parsing the input arguments or parameters.
|
|
214
|
+
*/
|
|
215
|
+
parse(args: object): object;
|
|
216
|
+
/**
|
|
217
|
+
* Walk the arguments and determine if the supplied input is
|
|
218
|
+
* a valid parsing.
|
|
219
|
+
*
|
|
220
|
+
* @param {any[]} args arguments supplied by the process.
|
|
221
|
+
* @returns {boolean} `true` if the validation is successful,
|
|
222
|
+
* `false` otherwise.
|
|
223
|
+
*/
|
|
224
|
+
validate(args: any[]): boolean;
|
|
225
|
+
}
|
|
226
|
+
export const ParamParserExtensions: Extension;
|
|
227
|
+
import { Extension } from '@nejs/extension';
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ParamParserExtensions = exports.ParamParser = void 0;
|
|
4
|
+
const extension_1 = require("@nejs/extension");
|
|
5
|
+
class ParamParser {
|
|
6
|
+
/**
|
|
7
|
+
* Constructs an instance of ParamParser. It takes in parameters, an optional
|
|
8
|
+
* validator function, and an optional parser function. The parameters are
|
|
9
|
+
* validated and if successful, parsed.
|
|
10
|
+
*
|
|
11
|
+
* @param {any[]} parameters - Arguments passed in by the process.
|
|
12
|
+
* @param {((any[]) => boolean)?} [validator=() => {}] - An optional function
|
|
13
|
+
* to specify a validator without subclassing ParamParser. It should return
|
|
14
|
+
* a boolean indicating the validity of the parameters.
|
|
15
|
+
* @param {((any[]) => object)?} [parser=() => {}] - An optional function to
|
|
16
|
+
* specify a parser without subclassing ParamParser. It should return an
|
|
17
|
+
* object after parsing the input parameters.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* const parameters = ['param1', 'param2']
|
|
21
|
+
* const validator = params => params.every(param => typeof param === 'string')
|
|
22
|
+
* const parser = params => ({ params })
|
|
23
|
+
* const paramParser = new ParamParser(parameters, validator, parser)
|
|
24
|
+
* if (paramParser.success) {
|
|
25
|
+
* console.log('Parsing successful:', paramParser.results)
|
|
26
|
+
* } else {
|
|
27
|
+
* console.error('Parsing failed.')
|
|
28
|
+
* }
|
|
29
|
+
*/
|
|
30
|
+
constructor(parameters, validator = () => { }, parser = () => { }) {
|
|
31
|
+
this.args = parameters;
|
|
32
|
+
this.parser = parser;
|
|
33
|
+
this.validator = validator;
|
|
34
|
+
this.result = undefined;
|
|
35
|
+
this.success = this.validate(this.args);
|
|
36
|
+
if (this.success) {
|
|
37
|
+
this.results = this.parse(this.args);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* @param {object} args arguments that were previously validated
|
|
42
|
+
* by either the overloaded validate() method or the supplied
|
|
43
|
+
* validator closure.
|
|
44
|
+
* @returns {object} returns the output object, or an empty
|
|
45
|
+
* object, after parsing the input arguments or parameters.
|
|
46
|
+
*/
|
|
47
|
+
parse(args) {
|
|
48
|
+
return this.parser?.(args);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Walk the arguments and determine if the supplied input is
|
|
52
|
+
* a valid parsing.
|
|
53
|
+
*
|
|
54
|
+
* @param {any[]} args arguments supplied by the process.
|
|
55
|
+
* @returns {boolean} `true` if the validation is successful,
|
|
56
|
+
* `false` otherwise.
|
|
57
|
+
*/
|
|
58
|
+
validate(args) {
|
|
59
|
+
return this.validator?.(args);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Attempts to parse the given parameters using the provided parsers, throwing an
|
|
63
|
+
* error if no valid parser is found. This method serves as a convenience wrapper
|
|
64
|
+
* around `safeTryParsers`, enforcing strict parsing by automatically enabling
|
|
65
|
+
* error throwing on failure.
|
|
66
|
+
*
|
|
67
|
+
* @param {any[]} parameters - The parameters to be parsed.
|
|
68
|
+
* @param {Function[]} parsers - An array of `ParamParser` subclasses to attempt
|
|
69
|
+
* parsing with.
|
|
70
|
+
* @returns {Object} An object containing the parsing result, with a `success`
|
|
71
|
+
* property indicating if parsing was successful, and a `data` property containing
|
|
72
|
+
* the parsed data if successful.
|
|
73
|
+
* @example
|
|
74
|
+
* const parameters = ['param1', 'param2'];
|
|
75
|
+
* const parsers = [Parser1, Parser2];
|
|
76
|
+
* const result = ParamParser.tryParsers(parameters, parsers);
|
|
77
|
+
* if (result.success) {
|
|
78
|
+
* console.log('Parsing successful:', result.data);
|
|
79
|
+
* } else {
|
|
80
|
+
* console.error('Parsing failed.');
|
|
81
|
+
* }
|
|
82
|
+
*/
|
|
83
|
+
static tryParsers(parameters, parsers) {
|
|
84
|
+
return this.safeTryParsers(parameters, parsers, true);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Tries parsing `parameters` with each parser in `parsers`. If
|
|
88
|
+
* `throwOnFail` is true, throws an error when validation fails or
|
|
89
|
+
* no valid parser is found.
|
|
90
|
+
*
|
|
91
|
+
* This method attempts to parse the given parameters using the
|
|
92
|
+
* provided list of parsers. It validates the input to ensure both
|
|
93
|
+
* `parameters` and `parsers` are arrays and that `parsers`
|
|
94
|
+
* contains at least one valid `ParamParser` subclass. If
|
|
95
|
+
* `throwOnFail` is set to true, it will throw specific errors for
|
|
96
|
+
* invalid inputs or when no parser succeeds. Otherwise, it returns
|
|
97
|
+
* an object indicating the success status and the result of
|
|
98
|
+
* parsing, if successful.
|
|
99
|
+
*
|
|
100
|
+
* @param {any[]} parameters - The parameters to be parsed.
|
|
101
|
+
* @param {Function[]} parsers - An array of `ParamParser`
|
|
102
|
+
* subclasses to attempt parsing with.
|
|
103
|
+
* @param {boolean} [throwOnFail=false] - Whether to throw an
|
|
104
|
+
* error on failure.
|
|
105
|
+
* @returns {{success: boolean, data: any}} An object with a
|
|
106
|
+
* `success` flag and `data` containing the parsing result, if
|
|
107
|
+
* successful.
|
|
108
|
+
* @throws {ParametersMustBeArrayError} If `parameters` or
|
|
109
|
+
* `parsers` are not arrays when `throwOnFail` is true.
|
|
110
|
+
* @throws {ParsersArrayMustContainParsersError} If `parsers`
|
|
111
|
+
* does not contain at least one valid `ParamParser` subclass
|
|
112
|
+
* when `throwOnFail` is true.
|
|
113
|
+
* @throws {NoValidParsersFound} If no valid parser is found
|
|
114
|
+
* and `throwOnFail` is true.
|
|
115
|
+
* @example
|
|
116
|
+
* const parameters = ['param1', 'param2'];
|
|
117
|
+
* const parsers = [Parser1, Parser2];
|
|
118
|
+
* const result = ParamParser.safeTryParsers(
|
|
119
|
+
* parameters, parsers, true
|
|
120
|
+
* );
|
|
121
|
+
*
|
|
122
|
+
* if (result.success) {
|
|
123
|
+
* console.log('Parsing successful:', result.data);
|
|
124
|
+
* } else {
|
|
125
|
+
* console.error('Parsing failed.');
|
|
126
|
+
* }
|
|
127
|
+
*/
|
|
128
|
+
static safeTryParsers(parameters, parsers, throwOnFail = false) {
|
|
129
|
+
if (!Array.isArray(parameters) || !Array.isArray(parsers)) {
|
|
130
|
+
if (throwOnFail) {
|
|
131
|
+
throw new this.ParametersMustBeArrayError(`${this.name}.tryParsers must receive two arrays as args`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (!parsers.some(parser => parser?.prototype instanceof ParamParser &&
|
|
135
|
+
typeof parser === 'function')) {
|
|
136
|
+
if (throwOnFail) {
|
|
137
|
+
throw new this.ParsersArrayMustContainParsersError(`${this.name}.tryParsers parsers argument must contain at least one ` +
|
|
138
|
+
`ParamParser derived class`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
let success = false;
|
|
142
|
+
let result = undefined;
|
|
143
|
+
for (let Parser of parsers) {
|
|
144
|
+
const parser = new Parser(parameters);
|
|
145
|
+
if (parser.success) {
|
|
146
|
+
success = true;
|
|
147
|
+
result = parser.result;
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (!success && throwOnFail) {
|
|
152
|
+
throw new this.NoValidParsersFound('No valid parsers found');
|
|
153
|
+
}
|
|
154
|
+
return { success, data: result };
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* A custom error class that signifies no valid parsers were found
|
|
158
|
+
* during the parsing process. This error is thrown when all
|
|
159
|
+
* parsers fail to parse the given parameters and the `throwOnFail`
|
|
160
|
+
* flag is set to true in the `safeTryParsers` method.
|
|
161
|
+
*
|
|
162
|
+
* @returns {Function} A class extending Error, representing a
|
|
163
|
+
* specific error when no valid parsers are found.ound.
|
|
164
|
+
*
|
|
165
|
+
* @example
|
|
166
|
+
* try {
|
|
167
|
+
* const result = ParamParser.safeTryParsers(
|
|
168
|
+
* parameters, parsers, true
|
|
169
|
+
* );
|
|
170
|
+
* } catch (error) {
|
|
171
|
+
* if (error instanceof ParamParser.NoValidParsersFound) {
|
|
172
|
+
* console.error(
|
|
173
|
+
* 'No valid parsers could process the parameters.'
|
|
174
|
+
* );
|
|
175
|
+
* }
|
|
176
|
+
* }
|
|
177
|
+
*/
|
|
178
|
+
static get NoValidParsersFound() {
|
|
179
|
+
return class NoValidParsersFound extends Error {
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Represents an error thrown when the parameters provided to a method
|
|
184
|
+
* are not in an array format as expected. This class extends the
|
|
185
|
+
* native JavaScript `Error` class, allowing for instances of this
|
|
186
|
+
* error to be thrown and caught using standard error handling
|
|
187
|
+
* mechanisms in JavaScript.
|
|
188
|
+
*
|
|
189
|
+
* This error is specifically used in scenarios where a method
|
|
190
|
+
* expects its arguments to be provided as an array, and the
|
|
191
|
+
* validation of those arguments fails because they were not
|
|
192
|
+
* provided in an array format. It serves as a clear indicator
|
|
193
|
+
* of the nature of the error to developers, enabling them to
|
|
194
|
+
* quickly identify and rectify the issue in their code.
|
|
195
|
+
*
|
|
196
|
+
* @example
|
|
197
|
+
* try {
|
|
198
|
+
* ParamParser.safeTryParsers(nonArrayParameters, parsers, true);
|
|
199
|
+
* } catch (error) {
|
|
200
|
+
* if (error instanceof ParamParser.ParametersMustBeArrayError) {
|
|
201
|
+
* console.error('Parameters must be provided as an array.');
|
|
202
|
+
* }
|
|
203
|
+
* }
|
|
204
|
+
*/
|
|
205
|
+
static get ParametersMustBeArrayError() {
|
|
206
|
+
return class ParametersMustBeArrayError extends Error {
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* A custom error class indicating that the parsers array does not
|
|
211
|
+
* contain valid parser functions. This error is thrown when the
|
|
212
|
+
* validation of parsers within `ParamParser.safeTryParsers` fails
|
|
213
|
+
* to find any instance that is a subclass of `ParamParser`. It
|
|
214
|
+
* extends the native JavaScript `Error` class, allowing it to be
|
|
215
|
+
* thrown and caught using standard error handling mechanisms.
|
|
216
|
+
*
|
|
217
|
+
* This error serves as a clear indicator to developers that the
|
|
218
|
+
* provided array of parsers does not meet the expected criteria,
|
|
219
|
+
* specifically that it must contain at least one valid parser
|
|
220
|
+
* that extends `ParamParser`. This ensures that the parsing
|
|
221
|
+
* process can be executed with at least one valid parser function.
|
|
222
|
+
*
|
|
223
|
+
* @example
|
|
224
|
+
* try {
|
|
225
|
+
* ParamParser.safeTryParsers(parameters, [], true);
|
|
226
|
+
* } catch (error) {
|
|
227
|
+
* const { ParsersArrayMustContainParsersError } = ParamParser
|
|
228
|
+
* if (error instanceof ParsersArrayMustContainParsersError) {
|
|
229
|
+
* console.error(
|
|
230
|
+
* 'The parsers array must contain at least one valid parser.'
|
|
231
|
+
* );
|
|
232
|
+
* }
|
|
233
|
+
* }
|
|
234
|
+
*/
|
|
235
|
+
static get ParsersArrayMustContainParsersError() {
|
|
236
|
+
return class ParsersArrayMustContainParsersError extends Error {
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
exports.ParamParser = ParamParser;
|
|
241
|
+
exports.ParamParserExtensions = new extension_1.Extension(ParamParser);
|
|
242
|
+
//# sourceMappingURL=param.parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"param.parser.js","sourceRoot":"","sources":["../../../src/classes/param.parser.js"],"names":[],"mappings":";;;AAAA,+CAA2C;AAE3C,MAAa,WAAW;IACtB;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,YAAY,UAAU,EAAE,SAAS,GAAG,GAAG,EAAE,GAAE,CAAC,EAAE,MAAM,GAAG,GAAG,EAAE,GAAE,CAAC;QAC7D,IAAI,CAAC,IAAI,GAAG,UAAU,CAAA;QACtB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAA;QACvB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEvC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACtC,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,IAAI;QACR,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED;;;;;;;OAOG;IACH,QAAQ,CAAC,IAAI;QACX,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO;QACnC,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;IACvD,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAyCG;IACH,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,GAAG,KAAK;QAC5D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1D,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,IAAI,IAAI,CAAC,0BAA0B,CACvC,GAAG,IAAI,CAAC,IAAI,6CAA6C,CAC1D,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,YAAY,WAAW;YACxC,OAAO,MAAM,KAAK,UAAU,CAAC,EAAE,CAAC;YAC1D,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,IAAI,IAAI,CAAC,mCAAmC,CAChD,GAAG,IAAI,CAAC,IAAI,yDAAyD;oBACrE,2BAA2B,CAC5B,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,MAAM,GAAG,SAAS,CAAC;QAEvB,KAAK,IAAI,MAAM,IAAI,OAAO,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC;YACtC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;gBACvB,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,CAAC,OAAO,IAAI,WAAW,EAAE,CAAC;YAC5B,MAAM,IAAI,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,CAAC;QAC/D,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACnC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,MAAM,KAAK,mBAAmB;QAC5B,OAAO,MAAM,mBAAoB,SAAQ,KAAK;SAAI,CAAA;IACpD,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,MAAM,KAAK,0BAA0B;QACnC,OAAO,MAAM,0BAA2B,SAAQ,KAAK;SAAI,CAAA;IAC3D,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,MAAM,KAAK,mCAAmC;QAC5C,OAAO,MAAM,mCAAoC,SAAQ,KAAK;SAAI,CAAA;IACpE,CAAC;CACF;AAxPD,kCAwPC;AAEY,QAAA,qBAAqB,GAAG,IAAI,qBAAS,CAAC,WAAW,CAAC,CAAC"}
|