@develia/commons 0.4.8 → 0.4.9
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/dist/cjs/cancellable-promise.js +60 -0
- package/dist/cjs/cancellable-promise.js.map +1 -0
- package/dist/cjs/index.js +3 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/parse.js +69 -0
- package/dist/cjs/parse.js.map +1 -0
- package/dist/esm/cancellable-promise.js +57 -0
- package/dist/esm/cancellable-promise.js.map +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/parse.js +64 -0
- package/dist/esm/parse.js.map +1 -0
- package/dist/types/cancellable-promise.d.ts +13 -0
- package/dist/types/cancellable-promise.d.ts.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/parse.d.ts +16 -0
- package/dist/types/parse.d.ts.map +1 -0
- package/dist/web/cancellable-promise.js +57 -0
- package/dist/web/cancellable-promise.js.map +1 -0
- package/dist/web/index.js +1 -0
- package/dist/web/index.js.map +1 -1
- package/dist/web/parse.js +64 -0
- package/dist/web/parse.js.map +1 -0
- package/package.json +1 -1
- package/src/cancellable-promise.ts +77 -0
- package/src/index.ts +2 -1
- package/src/parse.ts +241 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
class CancellablePromise extends Promise {
|
|
4
|
+
static get [Symbol.species]() {
|
|
5
|
+
return Promise;
|
|
6
|
+
}
|
|
7
|
+
constructor(executor) {
|
|
8
|
+
const controller = new AbortController();
|
|
9
|
+
super((resolve, reject) => {
|
|
10
|
+
controller.signal.addEventListener("abort", () => {
|
|
11
|
+
reject(controller.signal.reason);
|
|
12
|
+
});
|
|
13
|
+
executor(resolve, reject, controller.signal);
|
|
14
|
+
});
|
|
15
|
+
this._controller = controller;
|
|
16
|
+
}
|
|
17
|
+
get cancelled() {
|
|
18
|
+
return this._controller.signal.aborted;
|
|
19
|
+
}
|
|
20
|
+
cancel(reason = new Error("Promesa cancelada")) {
|
|
21
|
+
if (!this.cancelled) {
|
|
22
|
+
this._controller.abort(reason);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
static async compete(promises) {
|
|
26
|
+
return await Promise.race(promises).then((resultado) => {
|
|
27
|
+
for (const p of promises) {
|
|
28
|
+
p.cancel();
|
|
29
|
+
}
|
|
30
|
+
return resultado;
|
|
31
|
+
}, (error) => {
|
|
32
|
+
for (const p of promises) {
|
|
33
|
+
p.cancel();
|
|
34
|
+
}
|
|
35
|
+
throw error;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
static async cooperate(promises) {
|
|
39
|
+
try {
|
|
40
|
+
return await Promise.all(promises);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
for (const p of promises) {
|
|
44
|
+
p.cancel();
|
|
45
|
+
}
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
static withTimeout(executor, ms) {
|
|
50
|
+
return new CancellablePromise((resolve, reject, signal) => {
|
|
51
|
+
const timer = setTimeout(() => {
|
|
52
|
+
reject(new Error(`Timeout: ${ms}ms`));
|
|
53
|
+
}, ms);
|
|
54
|
+
signal.addEventListener("abort", () => clearTimeout(timer));
|
|
55
|
+
executor(resolve, reject, signal);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.default = CancellablePromise;
|
|
60
|
+
//# sourceMappingURL=cancellable-promise.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cancellable-promise.js","sourceRoot":"","sources":["../../src/cancellable-promise.ts"],"names":[],"mappings":";;AAMA,MAAqB,kBAAsB,SAAQ,OAAU;IAIzD,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;QACvB,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,YAAY,QAAuC;QAC/C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QAEzC,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACtB,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;gBAC7C,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;YAEH,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAClC,CAAC;IAED,IAAI,SAAS;QACT,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,SAAkB,IAAI,KAAK,CAAC,mBAAmB,CAAC;QACnD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAO,CAAI,QAAiC;QACrD,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CACpC,CAAC,SAAS,EAAE,EAAE;YACV,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACvB,CAAC,CAAC,MAAM,EAAE,CAAC;YACf,CAAC;YACD,OAAO,SAAS,CAAC;QACrB,CAAC,EACD,CAAC,KAAK,EAAE,EAAE;YACN,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACvB,CAAC,CAAC,MAAM,EAAE,CAAC;YACf,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC,CACJ,CAAC;IACN,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,SAAS,CAAI,QAAiC;QACvD,IAAI,CAAC;YACD,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACvB,CAAC,CAAC,MAAM,EAAE,CAAC;YACf,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,MAAM,CAAC,WAAW,CAAI,QAAuC,EAAE,EAAU;QACrE,OAAO,IAAI,kBAAkB,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACzD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC1B,MAAM,CAAC,IAAI,KAAK,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC;YAC1C,CAAC,EAAE,EAAE,CAAC,CAAC;YAEP,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5D,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;AAtED,qCAsEC"}
|
package/dist/cjs/index.js
CHANGED
|
@@ -17,7 +17,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
17
17
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
18
|
};
|
|
19
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
exports.formToObject = exports.submitForm = exports.ajaxSubmission = exports.ajaxSubmit = exports.CleanURLSearchParams = exports.From = exports.from = exports.Lazy = exports.AsyncPoolExecutor = exports.Stopwatch = exports.TimeSpan = exports.Timer = exports.Order = exports.KeyValuePair = exports.TypeCode = exports.Type = void 0;
|
|
20
|
+
exports.formToObject = exports.submitForm = exports.ajaxSubmission = exports.ajaxSubmit = exports.CleanURLSearchParams = exports.From = exports.from = exports.Lazy = exports.AsyncPoolExecutor = exports.Stopwatch = exports.TimeSpan = exports.Timer = exports.Order = exports.KeyValuePair = exports.CancellablePromise = exports.TypeCode = exports.Type = void 0;
|
|
21
21
|
__exportStar(require("./types.js"), exports);
|
|
22
22
|
var type_js_1 = require("./type.js");
|
|
23
23
|
Object.defineProperty(exports, "Type", { enumerable: true, get: function () { return __importDefault(type_js_1).default; } });
|
|
@@ -26,6 +26,8 @@ Object.defineProperty(exports, "TypeCode", { enumerable: true, get: function ()
|
|
|
26
26
|
__exportStar(require("./utilities.js"), exports);
|
|
27
27
|
__exportStar(require("./string.js"), exports);
|
|
28
28
|
__exportStar(require("./math.js"), exports);
|
|
29
|
+
var cancellable_promise_js_1 = require("./cancellable-promise.js");
|
|
30
|
+
Object.defineProperty(exports, "CancellablePromise", { enumerable: true, get: function () { return __importDefault(cancellable_promise_js_1).default; } });
|
|
29
31
|
var key_value_pair_js_1 = require("./key-value-pair.js");
|
|
30
32
|
Object.defineProperty(exports, "KeyValuePair", { enumerable: true, get: function () { return __importDefault(key_value_pair_js_1).default; } });
|
|
31
33
|
var order_js_1 = require("./order.js");
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAGA,6CAA2B;AAC3B,qCAA0C;AAAlC,gHAAA,OAAO,OAAQ;AACvB,+CAAmD;AAA3C,yHAAA,OAAO,OAAY;AAG3B,iDAA+B;AAC/B,8CAA4B;AAC5B,4CAA0B;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAGA,6CAA2B;AAC3B,qCAA0C;AAAlC,gHAAA,OAAO,OAAQ;AACvB,+CAAmD;AAA3C,yHAAA,OAAO,OAAY;AAG3B,iDAA+B;AAC/B,8CAA4B;AAC5B,4CAA0B;AAC1B,mEAAuE;AAA/D,6IAAA,OAAO,OAAsB;AAGrC,yDAA4D;AAApD,kIAAA,OAAO,OAAgB;AAC/B,uCAA4C;AAApC,kHAAA,OAAO,OAAS;AAGxB,uCAA4C;AAApC,kHAAA,OAAO,OAAS;AACxB,6CAAkD;AAA1C,wHAAA,OAAO,OAAY;AAC3B,+CAAoD;AAA5C,0HAAA,OAAO,OAAa;AAC5B,mEAAsE;AAA9D,4IAAA,OAAO,OAAqB;AAGpC,qCAA0C;AAAlC,gHAAA,OAAO,OAAQ;AACvB,qCAAgD;AAAxC,gHAAA,OAAO,OAAQ;AAAE,+FAAA,IAAI,OAAA;AAG7B,2EAA6E;AAArE,mJAAA,OAAO,OAAwB;AAEvC,+CAAwF;AAAhF,sGAAA,UAAU,OAAA;AAAE,0GAAA,cAAc,OAAA;AAAE,sGAAA,UAAU,OAAA;AAAE,wGAAA,YAAY,OAAA;AAI5D,6CAA2B;AAE3B,yDAAuC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseInteger = parseInteger;
|
|
4
|
+
exports.parseDecimal = parseDecimal;
|
|
5
|
+
exports.parseBoolean = parseBoolean;
|
|
6
|
+
function stripThousands(value, separator) {
|
|
7
|
+
if (!separator)
|
|
8
|
+
return value;
|
|
9
|
+
return value.split(separator).join("");
|
|
10
|
+
}
|
|
11
|
+
function parseInteger(value, options = {}) {
|
|
12
|
+
if (value === null || value === undefined)
|
|
13
|
+
return null;
|
|
14
|
+
if (typeof value === "number") {
|
|
15
|
+
return Number.isFinite(value) ? Math.trunc(value) : null;
|
|
16
|
+
}
|
|
17
|
+
const { radix = 10, thousandsSeparator } = options;
|
|
18
|
+
const cleaned = stripThousands(value.trim(), thousandsSeparator);
|
|
19
|
+
if (cleaned === "")
|
|
20
|
+
return null;
|
|
21
|
+
if (radix === 10 && !/^[+-]?\d+$/.test(cleaned))
|
|
22
|
+
return null;
|
|
23
|
+
const parsed = Number.parseInt(cleaned, radix);
|
|
24
|
+
return Number.isNaN(parsed) ? null : parsed;
|
|
25
|
+
}
|
|
26
|
+
function parseDecimal(value, options = {}) {
|
|
27
|
+
if (value === null || value === undefined)
|
|
28
|
+
return null;
|
|
29
|
+
if (typeof value === "number") {
|
|
30
|
+
return Number.isFinite(value) ? value : null;
|
|
31
|
+
}
|
|
32
|
+
const { decimalSeparator = ".", thousandsSeparator } = options;
|
|
33
|
+
let cleaned = stripThousands(value.trim(), thousandsSeparator);
|
|
34
|
+
if (cleaned === "")
|
|
35
|
+
return null;
|
|
36
|
+
if (decimalSeparator === ",") {
|
|
37
|
+
const commaCount = (cleaned.match(/,/g) || []).length;
|
|
38
|
+
if (commaCount > 1)
|
|
39
|
+
return null;
|
|
40
|
+
cleaned = cleaned.replace(",", ".");
|
|
41
|
+
}
|
|
42
|
+
if (!/^[+-]?\d+(\.\d+)?$/.test(cleaned))
|
|
43
|
+
return null;
|
|
44
|
+
const parsed = Number.parseFloat(cleaned);
|
|
45
|
+
return Number.isNaN(parsed) || !Number.isFinite(parsed) ? null : parsed;
|
|
46
|
+
}
|
|
47
|
+
const DEFAULT_TRUTHY = ["true", "1", "yes", "si", "sí", "on"];
|
|
48
|
+
const DEFAULT_FALSY = ["false", "0", "no", "off"];
|
|
49
|
+
function parseBoolean(value, options = {}) {
|
|
50
|
+
if (value === null || value === undefined)
|
|
51
|
+
return null;
|
|
52
|
+
if (typeof value === "boolean")
|
|
53
|
+
return value;
|
|
54
|
+
if (typeof value === "number") {
|
|
55
|
+
return Number.isFinite(value) ? value !== 0 : null;
|
|
56
|
+
}
|
|
57
|
+
const { extraTruthy = [], extraFalsy = [] } = options;
|
|
58
|
+
const normalized = value.trim().toLowerCase();
|
|
59
|
+
if (normalized === "")
|
|
60
|
+
return null;
|
|
61
|
+
const truthy = [...DEFAULT_TRUTHY, ...extraTruthy.map((s) => s.toLowerCase())];
|
|
62
|
+
const falsy = [...DEFAULT_FALSY, ...extraFalsy.map((s) => s.toLowerCase())];
|
|
63
|
+
if (truthy.includes(normalized))
|
|
64
|
+
return true;
|
|
65
|
+
if (falsy.includes(normalized))
|
|
66
|
+
return false;
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/parse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export default class CancellablePromise extends Promise {
|
|
2
|
+
static get [Symbol.species]() {
|
|
3
|
+
return Promise;
|
|
4
|
+
}
|
|
5
|
+
constructor(executor) {
|
|
6
|
+
const controller = new AbortController();
|
|
7
|
+
super((resolve, reject) => {
|
|
8
|
+
controller.signal.addEventListener("abort", () => {
|
|
9
|
+
reject(controller.signal.reason);
|
|
10
|
+
});
|
|
11
|
+
executor(resolve, reject, controller.signal);
|
|
12
|
+
});
|
|
13
|
+
this._controller = controller;
|
|
14
|
+
}
|
|
15
|
+
get cancelled() {
|
|
16
|
+
return this._controller.signal.aborted;
|
|
17
|
+
}
|
|
18
|
+
cancel(reason = new Error("Promesa cancelada")) {
|
|
19
|
+
if (!this.cancelled) {
|
|
20
|
+
this._controller.abort(reason);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
static async compete(promises) {
|
|
24
|
+
return await Promise.race(promises).then((resultado) => {
|
|
25
|
+
for (const p of promises) {
|
|
26
|
+
p.cancel();
|
|
27
|
+
}
|
|
28
|
+
return resultado;
|
|
29
|
+
}, (error) => {
|
|
30
|
+
for (const p of promises) {
|
|
31
|
+
p.cancel();
|
|
32
|
+
}
|
|
33
|
+
throw error;
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
static async cooperate(promises) {
|
|
37
|
+
try {
|
|
38
|
+
return await Promise.all(promises);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
for (const p of promises) {
|
|
42
|
+
p.cancel();
|
|
43
|
+
}
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
static withTimeout(executor, ms) {
|
|
48
|
+
return new CancellablePromise((resolve, reject, signal) => {
|
|
49
|
+
const timer = setTimeout(() => {
|
|
50
|
+
reject(new Error(`Timeout: ${ms}ms`));
|
|
51
|
+
}, ms);
|
|
52
|
+
signal.addEventListener("abort", () => clearTimeout(timer));
|
|
53
|
+
executor(resolve, reject, signal);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=cancellable-promise.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cancellable-promise.js","sourceRoot":"","sources":["../../src/cancellable-promise.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,OAAO,OAAO,kBAAsB,SAAQ,OAAU;IAIzD,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;QACvB,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,YAAY,QAAuC;QAC/C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QAEzC,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACtB,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;gBAC7C,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;YAEH,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAClC,CAAC;IAED,IAAI,SAAS;QACT,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,SAAkB,IAAI,KAAK,CAAC,mBAAmB,CAAC;QACnD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAO,CAAI,QAAiC;QACrD,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CACpC,CAAC,SAAS,EAAE,EAAE;YACV,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACvB,CAAC,CAAC,MAAM,EAAE,CAAC;YACf,CAAC;YACD,OAAO,SAAS,CAAC;QACrB,CAAC,EACD,CAAC,KAAK,EAAE,EAAE;YACN,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACvB,CAAC,CAAC,MAAM,EAAE,CAAC;YACf,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC,CACJ,CAAC;IACN,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,SAAS,CAAI,QAAiC;QACvD,IAAI,CAAC;YACD,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACvB,CAAC,CAAC,MAAM,EAAE,CAAC;YACf,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,MAAM,CAAC,WAAW,CAAI,QAAuC,EAAE,EAAU;QACrE,OAAO,IAAI,kBAAkB,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACzD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC1B,MAAM,CAAC,IAAI,KAAK,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC;YAC1C,CAAC,EAAE,EAAE,CAAC,CAAC;YAEP,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5D,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACP,CAAC;CACJ"}
|
package/dist/esm/index.js
CHANGED
|
@@ -4,6 +4,7 @@ export { default as TypeCode } from './type-code.js';
|
|
|
4
4
|
export * from './utilities.js';
|
|
5
5
|
export * from './string.js';
|
|
6
6
|
export * from './math.js';
|
|
7
|
+
export { default as CancellablePromise } from "./cancellable-promise.js";
|
|
7
8
|
export { default as KeyValuePair } from './key-value-pair.js';
|
|
8
9
|
export { default as Order } from './order.js';
|
|
9
10
|
export { default as Timer } from './timer.js';
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAC,OAAO,IAAI,IAAI,EAAC,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAC,OAAO,IAAI,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AAGnD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAC,OAAO,IAAI,IAAI,EAAC,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAC,OAAO,IAAI,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AAGnD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAC,OAAO,IAAI,kBAAkB,EAAC,MAAM,0BAA0B,CAAC;AAGvE,OAAO,EAAC,OAAO,IAAI,YAAY,EAAC,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAC,OAAO,IAAI,KAAK,EAAC,MAAM,YAAY,CAAC;AAG5C,OAAO,EAAC,OAAO,IAAI,KAAK,EAAC,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAC,OAAO,IAAI,QAAQ,EAAC,MAAM,eAAe,CAAC;AAClD,OAAO,EAAC,OAAO,IAAI,SAAS,EAAC,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAC,OAAO,IAAI,iBAAiB,EAAC,MAAM,0BAA0B,CAAC;AAGtE,OAAO,EAAC,OAAO,IAAI,IAAI,EAAC,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAC,OAAO,IAAI,IAAI,EAAE,IAAI,EAAC,MAAM,WAAW,CAAC;AAGhD,OAAO,EAAC,OAAO,IAAI,oBAAoB,EAAC,MAAM,8BAA8B,CAAC;AAE7E,OAAO,EAAC,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAIxF,cAAc,YAAY,CAAC;AAE3B,cAAc,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
function stripThousands(value, separator) {
|
|
2
|
+
if (!separator)
|
|
3
|
+
return value;
|
|
4
|
+
return value.split(separator).join("");
|
|
5
|
+
}
|
|
6
|
+
export function parseInteger(value, options = {}) {
|
|
7
|
+
if (value === null || value === undefined)
|
|
8
|
+
return null;
|
|
9
|
+
if (typeof value === "number") {
|
|
10
|
+
return Number.isFinite(value) ? Math.trunc(value) : null;
|
|
11
|
+
}
|
|
12
|
+
const { radix = 10, thousandsSeparator } = options;
|
|
13
|
+
const cleaned = stripThousands(value.trim(), thousandsSeparator);
|
|
14
|
+
if (cleaned === "")
|
|
15
|
+
return null;
|
|
16
|
+
if (radix === 10 && !/^[+-]?\d+$/.test(cleaned))
|
|
17
|
+
return null;
|
|
18
|
+
const parsed = Number.parseInt(cleaned, radix);
|
|
19
|
+
return Number.isNaN(parsed) ? null : parsed;
|
|
20
|
+
}
|
|
21
|
+
export function parseDecimal(value, options = {}) {
|
|
22
|
+
if (value === null || value === undefined)
|
|
23
|
+
return null;
|
|
24
|
+
if (typeof value === "number") {
|
|
25
|
+
return Number.isFinite(value) ? value : null;
|
|
26
|
+
}
|
|
27
|
+
const { decimalSeparator = ".", thousandsSeparator } = options;
|
|
28
|
+
let cleaned = stripThousands(value.trim(), thousandsSeparator);
|
|
29
|
+
if (cleaned === "")
|
|
30
|
+
return null;
|
|
31
|
+
if (decimalSeparator === ",") {
|
|
32
|
+
const commaCount = (cleaned.match(/,/g) || []).length;
|
|
33
|
+
if (commaCount > 1)
|
|
34
|
+
return null;
|
|
35
|
+
cleaned = cleaned.replace(",", ".");
|
|
36
|
+
}
|
|
37
|
+
if (!/^[+-]?\d+(\.\d+)?$/.test(cleaned))
|
|
38
|
+
return null;
|
|
39
|
+
const parsed = Number.parseFloat(cleaned);
|
|
40
|
+
return Number.isNaN(parsed) || !Number.isFinite(parsed) ? null : parsed;
|
|
41
|
+
}
|
|
42
|
+
const DEFAULT_TRUTHY = ["true", "1", "yes", "si", "sí", "on"];
|
|
43
|
+
const DEFAULT_FALSY = ["false", "0", "no", "off"];
|
|
44
|
+
export function parseBoolean(value, options = {}) {
|
|
45
|
+
if (value === null || value === undefined)
|
|
46
|
+
return null;
|
|
47
|
+
if (typeof value === "boolean")
|
|
48
|
+
return value;
|
|
49
|
+
if (typeof value === "number") {
|
|
50
|
+
return Number.isFinite(value) ? value !== 0 : null;
|
|
51
|
+
}
|
|
52
|
+
const { extraTruthy = [], extraFalsy = [] } = options;
|
|
53
|
+
const normalized = value.trim().toLowerCase();
|
|
54
|
+
if (normalized === "")
|
|
55
|
+
return null;
|
|
56
|
+
const truthy = [...DEFAULT_TRUTHY, ...extraTruthy.map((s) => s.toLowerCase())];
|
|
57
|
+
const falsy = [...DEFAULT_FALSY, ...extraFalsy.map((s) => s.toLowerCase())];
|
|
58
|
+
if (truthy.includes(normalized))
|
|
59
|
+
return true;
|
|
60
|
+
if (falsy.includes(normalized))
|
|
61
|
+
return false;
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/parse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
type CancellablePromiseExecutor<T> = (resolve: (value: T | PromiseLike<T>) => void, reject: (reason?: unknown) => void, signal: AbortSignal) => void;
|
|
2
|
+
export default class CancellablePromise<T> extends Promise<T> {
|
|
3
|
+
private _controller;
|
|
4
|
+
static get [Symbol.species](): PromiseConstructor;
|
|
5
|
+
constructor(executor: CancellablePromiseExecutor<T>);
|
|
6
|
+
get cancelled(): boolean;
|
|
7
|
+
cancel(reason?: unknown): void;
|
|
8
|
+
static compete<T>(promises: CancellablePromise<T>[]): Promise<T>;
|
|
9
|
+
static cooperate<T>(promises: CancellablePromise<T>[]): Promise<T[]>;
|
|
10
|
+
static withTimeout<T>(executor: CancellablePromiseExecutor<T>, ms: number): CancellablePromise<T>;
|
|
11
|
+
}
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=cancellable-promise.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cancellable-promise.d.ts","sourceRoot":"","sources":["../../src/cancellable-promise.ts"],"names":[],"mappings":"AAAA,KAAK,0BAA0B,CAAC,CAAC,IAAI,CACjC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,EAC5C,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,EAClC,MAAM,EAAE,WAAW,KAClB,IAAI,CAAC;AAEV,MAAM,CAAC,OAAO,OAAO,kBAAkB,CAAC,CAAC,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAC;IAEzD,OAAO,CAAC,WAAW,CAAkB;IAErC,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,uBAE1B;gBAEW,QAAQ,EAAE,0BAA0B,CAAC,CAAC,CAAC;IAcnD,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,MAAM,CAAC,MAAM,GAAE,OAAwC,GAAG,IAAI;WAMjD,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC;WAiBzD,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAW1E,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,0BAA0B,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC;CAUpG"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ export { default as TypeCode } from './type-code.js';
|
|
|
4
4
|
export * from './utilities.js';
|
|
5
5
|
export * from './string.js';
|
|
6
6
|
export * from './math.js';
|
|
7
|
+
export { default as CancellablePromise } from "./cancellable-promise.js";
|
|
7
8
|
export { default as KeyValuePair } from './key-value-pair.js';
|
|
8
9
|
export { default as Order } from './order.js';
|
|
9
10
|
export { default as Timer } from './timer.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAC,OAAO,IAAI,IAAI,EAAC,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAC,OAAO,IAAI,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AAGnD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAC,OAAO,IAAI,IAAI,EAAC,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAC,OAAO,IAAI,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AAGnD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAC,OAAO,IAAI,kBAAkB,EAAC,MAAM,0BAA0B,CAAC;AAGvE,OAAO,EAAC,OAAO,IAAI,YAAY,EAAC,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAC,OAAO,IAAI,KAAK,EAAC,MAAM,YAAY,CAAC;AAG5C,OAAO,EAAC,OAAO,IAAI,KAAK,EAAC,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAC,OAAO,IAAI,QAAQ,EAAC,MAAM,eAAe,CAAC;AAClD,OAAO,EAAC,OAAO,IAAI,SAAS,EAAC,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAC,OAAO,IAAI,iBAAiB,EAAC,MAAM,0BAA0B,CAAC;AAGtE,OAAO,EAAC,OAAO,IAAI,IAAI,EAAC,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAC,OAAO,IAAI,IAAI,EAAE,IAAI,EAAC,MAAM,WAAW,CAAC;AAGhD,OAAO,EAAC,OAAO,IAAI,oBAAoB,EAAC,MAAM,8BAA8B,CAAC;AAE7E,OAAO,EAAC,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAIxF,cAAc,YAAY,CAAC;AAE3B,cAAc,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface ParseBooleanOptions {
|
|
2
|
+
extraTruthy?: string[];
|
|
3
|
+
extraFalsy?: string[];
|
|
4
|
+
}
|
|
5
|
+
export interface ParseIntegerOptions {
|
|
6
|
+
radix?: number;
|
|
7
|
+
thousandsSeparator?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ParseDecimalOptions {
|
|
10
|
+
decimalSeparator?: "." | ",";
|
|
11
|
+
thousandsSeparator?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function parseInteger(value: string | number | null | undefined, options?: ParseIntegerOptions): number | null;
|
|
14
|
+
export declare function parseDecimal(value: string | number | null | undefined, options?: ParseDecimalOptions): number | null;
|
|
15
|
+
export declare function parseBoolean(value: string | number | boolean | null | undefined, options?: ParseBooleanOptions): boolean | null;
|
|
16
|
+
//# sourceMappingURL=parse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/parse.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,mBAAmB;IAMhC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAOvB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAKD,MAAM,WAAW,mBAAmB;IAKhC,KAAK,CAAC,EAAE,MAAM,CAAC;IAOf,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAKD,MAAM,WAAW,mBAAmB;IAKhC,gBAAgB,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC;IAO7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAuCD,wBAAgB,YAAY,CACxB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EACzC,OAAO,GAAE,mBAAwB,GAClC,MAAM,GAAG,IAAI,CAiBf;AAgCD,wBAAgB,YAAY,CACxB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EACzC,OAAO,GAAE,mBAAwB,GAClC,MAAM,GAAG,IAAI,CAwBf;AA2CD,wBAAgB,YAAY,CACxB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,EACnD,OAAO,GAAE,mBAAwB,GAClC,OAAO,GAAG,IAAI,CAsBhB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export default class CancellablePromise extends Promise {
|
|
2
|
+
static get [Symbol.species]() {
|
|
3
|
+
return Promise;
|
|
4
|
+
}
|
|
5
|
+
constructor(executor) {
|
|
6
|
+
const controller = new AbortController();
|
|
7
|
+
super((resolve, reject) => {
|
|
8
|
+
controller.signal.addEventListener("abort", () => {
|
|
9
|
+
reject(controller.signal.reason);
|
|
10
|
+
});
|
|
11
|
+
executor(resolve, reject, controller.signal);
|
|
12
|
+
});
|
|
13
|
+
this._controller = controller;
|
|
14
|
+
}
|
|
15
|
+
get cancelled() {
|
|
16
|
+
return this._controller.signal.aborted;
|
|
17
|
+
}
|
|
18
|
+
cancel(reason = new Error("Promesa cancelada")) {
|
|
19
|
+
if (!this.cancelled) {
|
|
20
|
+
this._controller.abort(reason);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
static async compete(promises) {
|
|
24
|
+
return await Promise.race(promises).then((resultado) => {
|
|
25
|
+
for (const p of promises) {
|
|
26
|
+
p.cancel();
|
|
27
|
+
}
|
|
28
|
+
return resultado;
|
|
29
|
+
}, (error) => {
|
|
30
|
+
for (const p of promises) {
|
|
31
|
+
p.cancel();
|
|
32
|
+
}
|
|
33
|
+
throw error;
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
static async cooperate(promises) {
|
|
37
|
+
try {
|
|
38
|
+
return await Promise.all(promises);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
for (const p of promises) {
|
|
42
|
+
p.cancel();
|
|
43
|
+
}
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
static withTimeout(executor, ms) {
|
|
48
|
+
return new CancellablePromise((resolve, reject, signal) => {
|
|
49
|
+
const timer = setTimeout(() => {
|
|
50
|
+
reject(new Error(`Timeout: ${ms}ms`));
|
|
51
|
+
}, ms);
|
|
52
|
+
signal.addEventListener("abort", () => clearTimeout(timer));
|
|
53
|
+
executor(resolve, reject, signal);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=cancellable-promise.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cancellable-promise.js","sourceRoot":"","sources":["../../src/cancellable-promise.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,OAAO,OAAO,kBAAsB,SAAQ,OAAU;IAIzD,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;QACvB,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,YAAY,QAAuC;QAC/C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QAEzC,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACtB,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;gBAC7C,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;YAEH,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAClC,CAAC;IAED,IAAI,SAAS;QACT,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,SAAkB,IAAI,KAAK,CAAC,mBAAmB,CAAC;QACnD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAO,CAAI,QAAiC;QACrD,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CACpC,CAAC,SAAS,EAAE,EAAE;YACV,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACvB,CAAC,CAAC,MAAM,EAAE,CAAC;YACf,CAAC;YACD,OAAO,SAAS,CAAC;QACrB,CAAC,EACD,CAAC,KAAK,EAAE,EAAE;YACN,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACvB,CAAC,CAAC,MAAM,EAAE,CAAC;YACf,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC,CACJ,CAAC;IACN,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,SAAS,CAAI,QAAiC;QACvD,IAAI,CAAC;YACD,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACvB,CAAC,CAAC,MAAM,EAAE,CAAC;YACf,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,MAAM,CAAC,WAAW,CAAI,QAAuC,EAAE,EAAU;QACrE,OAAO,IAAI,kBAAkB,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACzD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC1B,MAAM,CAAC,IAAI,KAAK,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC;YAC1C,CAAC,EAAE,EAAE,CAAC,CAAC;YAEP,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5D,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACP,CAAC;CACJ"}
|
package/dist/web/index.js
CHANGED
|
@@ -4,6 +4,7 @@ export { default as TypeCode } from './type-code.js';
|
|
|
4
4
|
export * from './utilities.js';
|
|
5
5
|
export * from './string.js';
|
|
6
6
|
export * from './math.js';
|
|
7
|
+
export { default as CancellablePromise } from "./cancellable-promise.js";
|
|
7
8
|
export { default as KeyValuePair } from './key-value-pair.js';
|
|
8
9
|
export { default as Order } from './order.js';
|
|
9
10
|
export { default as Timer } from './timer.js';
|
package/dist/web/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAC,OAAO,IAAI,IAAI,EAAC,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAC,OAAO,IAAI,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AAGnD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAC,OAAO,IAAI,IAAI,EAAC,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAC,OAAO,IAAI,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AAGnD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAC,OAAO,IAAI,kBAAkB,EAAC,MAAM,0BAA0B,CAAC;AAGvE,OAAO,EAAC,OAAO,IAAI,YAAY,EAAC,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAC,OAAO,IAAI,KAAK,EAAC,MAAM,YAAY,CAAC;AAG5C,OAAO,EAAC,OAAO,IAAI,KAAK,EAAC,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAC,OAAO,IAAI,QAAQ,EAAC,MAAM,eAAe,CAAC;AAClD,OAAO,EAAC,OAAO,IAAI,SAAS,EAAC,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAC,OAAO,IAAI,iBAAiB,EAAC,MAAM,0BAA0B,CAAC;AAGtE,OAAO,EAAC,OAAO,IAAI,IAAI,EAAC,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAC,OAAO,IAAI,IAAI,EAAE,IAAI,EAAC,MAAM,WAAW,CAAC;AAGhD,OAAO,EAAC,OAAO,IAAI,oBAAoB,EAAC,MAAM,8BAA8B,CAAC;AAE7E,OAAO,EAAC,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAIxF,cAAc,YAAY,CAAC;AAE3B,cAAc,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
function stripThousands(value, separator) {
|
|
2
|
+
if (!separator)
|
|
3
|
+
return value;
|
|
4
|
+
return value.split(separator).join("");
|
|
5
|
+
}
|
|
6
|
+
export function parseInteger(value, options = {}) {
|
|
7
|
+
if (value === null || value === undefined)
|
|
8
|
+
return null;
|
|
9
|
+
if (typeof value === "number") {
|
|
10
|
+
return Number.isFinite(value) ? Math.trunc(value) : null;
|
|
11
|
+
}
|
|
12
|
+
const { radix = 10, thousandsSeparator } = options;
|
|
13
|
+
const cleaned = stripThousands(value.trim(), thousandsSeparator);
|
|
14
|
+
if (cleaned === "")
|
|
15
|
+
return null;
|
|
16
|
+
if (radix === 10 && !/^[+-]?\d+$/.test(cleaned))
|
|
17
|
+
return null;
|
|
18
|
+
const parsed = Number.parseInt(cleaned, radix);
|
|
19
|
+
return Number.isNaN(parsed) ? null : parsed;
|
|
20
|
+
}
|
|
21
|
+
export function parseDecimal(value, options = {}) {
|
|
22
|
+
if (value === null || value === undefined)
|
|
23
|
+
return null;
|
|
24
|
+
if (typeof value === "number") {
|
|
25
|
+
return Number.isFinite(value) ? value : null;
|
|
26
|
+
}
|
|
27
|
+
const { decimalSeparator = ".", thousandsSeparator } = options;
|
|
28
|
+
let cleaned = stripThousands(value.trim(), thousandsSeparator);
|
|
29
|
+
if (cleaned === "")
|
|
30
|
+
return null;
|
|
31
|
+
if (decimalSeparator === ",") {
|
|
32
|
+
const commaCount = (cleaned.match(/,/g) || []).length;
|
|
33
|
+
if (commaCount > 1)
|
|
34
|
+
return null;
|
|
35
|
+
cleaned = cleaned.replace(",", ".");
|
|
36
|
+
}
|
|
37
|
+
if (!/^[+-]?\d+(\.\d+)?$/.test(cleaned))
|
|
38
|
+
return null;
|
|
39
|
+
const parsed = Number.parseFloat(cleaned);
|
|
40
|
+
return Number.isNaN(parsed) || !Number.isFinite(parsed) ? null : parsed;
|
|
41
|
+
}
|
|
42
|
+
const DEFAULT_TRUTHY = ["true", "1", "yes", "si", "sí", "on"];
|
|
43
|
+
const DEFAULT_FALSY = ["false", "0", "no", "off"];
|
|
44
|
+
export function parseBoolean(value, options = {}) {
|
|
45
|
+
if (value === null || value === undefined)
|
|
46
|
+
return null;
|
|
47
|
+
if (typeof value === "boolean")
|
|
48
|
+
return value;
|
|
49
|
+
if (typeof value === "number") {
|
|
50
|
+
return Number.isFinite(value) ? value !== 0 : null;
|
|
51
|
+
}
|
|
52
|
+
const { extraTruthy = [], extraFalsy = [] } = options;
|
|
53
|
+
const normalized = value.trim().toLowerCase();
|
|
54
|
+
if (normalized === "")
|
|
55
|
+
return null;
|
|
56
|
+
const truthy = [...DEFAULT_TRUTHY, ...extraTruthy.map((s) => s.toLowerCase())];
|
|
57
|
+
const falsy = [...DEFAULT_FALSY, ...extraFalsy.map((s) => s.toLowerCase())];
|
|
58
|
+
if (truthy.includes(normalized))
|
|
59
|
+
return true;
|
|
60
|
+
if (falsy.includes(normalized))
|
|
61
|
+
return false;
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/parse.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
type CancellablePromiseExecutor<T> = (
|
|
2
|
+
resolve: (value: T | PromiseLike<T>) => void,
|
|
3
|
+
reject: (reason?: unknown) => void,
|
|
4
|
+
signal: AbortSignal
|
|
5
|
+
) => void;
|
|
6
|
+
|
|
7
|
+
export default class CancellablePromise<T> extends Promise<T> {
|
|
8
|
+
|
|
9
|
+
private _controller: AbortController;
|
|
10
|
+
|
|
11
|
+
static get [Symbol.species]() {
|
|
12
|
+
return Promise;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
constructor(executor: CancellablePromiseExecutor<T>) {
|
|
16
|
+
const controller = new AbortController();
|
|
17
|
+
|
|
18
|
+
super((resolve, reject) => {
|
|
19
|
+
controller.signal.addEventListener("abort", () => {
|
|
20
|
+
reject(controller.signal.reason);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
executor(resolve, reject, controller.signal);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
this._controller = controller;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
get cancelled(): boolean {
|
|
30
|
+
return this._controller.signal.aborted;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
cancel(reason: unknown = new Error("Promesa cancelada")): void {
|
|
34
|
+
if (!this.cancelled) {
|
|
35
|
+
this._controller.abort(reason);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
static async compete<T>(promises: CancellablePromise<T>[]): Promise<T> {
|
|
40
|
+
return await Promise.race(promises).then(
|
|
41
|
+
(resultado) => {
|
|
42
|
+
for (const p of promises) {
|
|
43
|
+
p.cancel();
|
|
44
|
+
}
|
|
45
|
+
return resultado;
|
|
46
|
+
},
|
|
47
|
+
(error) => {
|
|
48
|
+
for (const p of promises) {
|
|
49
|
+
p.cancel();
|
|
50
|
+
}
|
|
51
|
+
throw error;
|
|
52
|
+
}
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
static async cooperate<T>(promises: CancellablePromise<T>[]): Promise<T[]> {
|
|
57
|
+
try {
|
|
58
|
+
return await Promise.all(promises);
|
|
59
|
+
} catch (error) {
|
|
60
|
+
for (const p of promises) {
|
|
61
|
+
p.cancel();
|
|
62
|
+
}
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
static withTimeout<T>(executor: CancellablePromiseExecutor<T>, ms: number): CancellablePromise<T> {
|
|
68
|
+
return new CancellablePromise<T>((resolve, reject, signal) => {
|
|
69
|
+
const timer = setTimeout(() => {
|
|
70
|
+
reject(new Error(`Timeout: ${ms}ms`));
|
|
71
|
+
}, ms);
|
|
72
|
+
|
|
73
|
+
signal.addEventListener("abort", () => clearTimeout(timer));
|
|
74
|
+
executor(resolve, reject, signal);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -9,6 +9,7 @@ export {default as TypeCode} from './type-code.js';
|
|
|
9
9
|
export * from './utilities.js';
|
|
10
10
|
export * from './string.js';
|
|
11
11
|
export * from './math.js';
|
|
12
|
+
export {default as CancellablePromise} from "./cancellable-promise.js";
|
|
12
13
|
|
|
13
14
|
// ─── Data Structures ────────────────────────────────
|
|
14
15
|
export {default as KeyValuePair} from './key-value-pair.js';
|
|
@@ -27,7 +28,7 @@ export {default as from, From} from './from.js';
|
|
|
27
28
|
// ─── Web ─────────────────────────────────────────────
|
|
28
29
|
export {default as CleanURLSearchParams} from './clean-url-search-params.js';
|
|
29
30
|
/** @deprecated */
|
|
30
|
-
export {
|
|
31
|
+
export {ajaxSubmit, ajaxSubmission, submitForm, formToObject} from './browser/index.js';
|
|
31
32
|
|
|
32
33
|
// ─── Deprecated ──────────────────────────────────────
|
|
33
34
|
/** @deprecated */
|
package/src/parse.ts
ADDED
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
// parse.ts
|
|
2
|
+
/**
|
|
3
|
+
* Options for {@link parseBoolean}.
|
|
4
|
+
*/
|
|
5
|
+
export interface ParseBooleanOptions {
|
|
6
|
+
/**
|
|
7
|
+
* Additional strings to consider as `true`.
|
|
8
|
+
* These are matched case-insensitively.
|
|
9
|
+
* @example ["oui", "ja"]
|
|
10
|
+
*/
|
|
11
|
+
extraTruthy?: string[];
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Additional strings to consider as `false`.
|
|
15
|
+
* These are matched case-insensitively.
|
|
16
|
+
* @example ["non", "nein"]
|
|
17
|
+
*/
|
|
18
|
+
extraFalsy?: string[];
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Options for {@link parseInteger}.
|
|
23
|
+
*/
|
|
24
|
+
export interface ParseIntegerOptions {
|
|
25
|
+
/**
|
|
26
|
+
* Numeric base for conversion.
|
|
27
|
+
* @default 10
|
|
28
|
+
*/
|
|
29
|
+
radix?: number;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Thousands separator to strip before parsing.
|
|
33
|
+
* @example "." for "1.234.567" → 1234567
|
|
34
|
+
* @example "," for "1,234,567" → 1234567
|
|
35
|
+
*/
|
|
36
|
+
thousandsSeparator?: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Options for {@link parseDecimal}.
|
|
41
|
+
*/
|
|
42
|
+
export interface ParseDecimalOptions {
|
|
43
|
+
/**
|
|
44
|
+
* Character used as decimal point.
|
|
45
|
+
* @default "."
|
|
46
|
+
*/
|
|
47
|
+
decimalSeparator?: "." | ",";
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Thousands separator to strip before parsing.
|
|
51
|
+
* @example "." for "1.234,56" (EU format)
|
|
52
|
+
* @example "," for "1,234.56" (US format)
|
|
53
|
+
*/
|
|
54
|
+
thousandsSeparator?: string;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// ============================================
|
|
58
|
+
// HELPERS
|
|
59
|
+
// ============================================
|
|
60
|
+
|
|
61
|
+
function stripThousands(value: string, separator?: string): string {
|
|
62
|
+
if (!separator) return value;
|
|
63
|
+
return value.split(separator).join("");
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// ============================================
|
|
67
|
+
// parseInteger
|
|
68
|
+
// ============================================
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Safely parses a value into an integer.
|
|
72
|
+
* Returns `null` if the value cannot be parsed.
|
|
73
|
+
*
|
|
74
|
+
* - `null` or `undefined` → `null`
|
|
75
|
+
* - `number` → returned as-is (floats are truncated)
|
|
76
|
+
* - `string` → parsed with the given options
|
|
77
|
+
*
|
|
78
|
+
* @param value - The value to parse.
|
|
79
|
+
* @param options - Optional parsing configuration.
|
|
80
|
+
* @returns The parsed integer, or `null` on failure.
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```ts
|
|
84
|
+
* parseInteger(42) // 42
|
|
85
|
+
* parseInteger(3.7) // 3
|
|
86
|
+
* parseInteger(null) // null
|
|
87
|
+
* parseInteger(undefined) // null
|
|
88
|
+
* parseInteger("42") // 42
|
|
89
|
+
* parseInteger("1.234.567", { thousandsSeparator: "." }) // 1234567
|
|
90
|
+
* parseInteger("FF", { radix: 16 }) // 255
|
|
91
|
+
* parseInteger("abc") // null
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
export function parseInteger(
|
|
95
|
+
value: string | number | null | undefined,
|
|
96
|
+
options: ParseIntegerOptions = {}
|
|
97
|
+
): number | null {
|
|
98
|
+
if (value === null || value === undefined) return null;
|
|
99
|
+
|
|
100
|
+
if (typeof value === "number") {
|
|
101
|
+
return Number.isFinite(value) ? Math.trunc(value) : null;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const { radix = 10, thousandsSeparator } = options;
|
|
105
|
+
|
|
106
|
+
const cleaned = stripThousands(value.trim(), thousandsSeparator);
|
|
107
|
+
|
|
108
|
+
if (cleaned === "") return null;
|
|
109
|
+
if (radix === 10 && !/^[+-]?\d+$/.test(cleaned)) return null;
|
|
110
|
+
|
|
111
|
+
const parsed = Number.parseInt(cleaned, radix);
|
|
112
|
+
|
|
113
|
+
return Number.isNaN(parsed) ? null : parsed;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// ============================================
|
|
117
|
+
// parseDecimal
|
|
118
|
+
// ============================================
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Safely parses a value into a floating-point number.
|
|
122
|
+
* Returns `null` if the value cannot be parsed.
|
|
123
|
+
*
|
|
124
|
+
* - `null` or `undefined` → `null`
|
|
125
|
+
* - `number` → returned as-is (if finite)
|
|
126
|
+
* - `string` → parsed with the given options
|
|
127
|
+
*
|
|
128
|
+
* Supports custom decimal and thousands separators, making it suitable
|
|
129
|
+
* for both US (`1,234.56`) and EU (`1.234,56`) number formats.
|
|
130
|
+
*
|
|
131
|
+
* @param value - The value to parse.
|
|
132
|
+
* @param options - Optional parsing configuration.
|
|
133
|
+
* @returns The parsed float, or `null` on failure.
|
|
134
|
+
*
|
|
135
|
+
* @example
|
|
136
|
+
* ```ts
|
|
137
|
+
* parseDecimal(3.14) // 3.14
|
|
138
|
+
* parseDecimal(null) // null
|
|
139
|
+
* parseDecimal(undefined) // null
|
|
140
|
+
* parseDecimal("3.14") // 3.14
|
|
141
|
+
* parseDecimal("3,14", { decimalSeparator: "," }) // 3.14
|
|
142
|
+
* parseDecimal("1.234,56", { decimalSeparator: ",", thousandsSeparator: "." }) // 1234.56
|
|
143
|
+
* parseDecimal("abc") // null
|
|
144
|
+
* ```
|
|
145
|
+
*/
|
|
146
|
+
export function parseDecimal(
|
|
147
|
+
value: string | number | null | undefined,
|
|
148
|
+
options: ParseDecimalOptions = {}
|
|
149
|
+
): number | null {
|
|
150
|
+
if (value === null || value === undefined) return null;
|
|
151
|
+
|
|
152
|
+
if (typeof value === "number") {
|
|
153
|
+
return Number.isFinite(value) ? value : null;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const { decimalSeparator = ".", thousandsSeparator } = options;
|
|
157
|
+
|
|
158
|
+
let cleaned = stripThousands(value.trim(), thousandsSeparator);
|
|
159
|
+
|
|
160
|
+
if (cleaned === "") return null;
|
|
161
|
+
|
|
162
|
+
if (decimalSeparator === ",") {
|
|
163
|
+
const commaCount = (cleaned.match(/,/g) || []).length;
|
|
164
|
+
if (commaCount > 1) return null;
|
|
165
|
+
cleaned = cleaned.replace(",", ".");
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if (!/^[+-]?\d+(\.\d+)?$/.test(cleaned)) return null;
|
|
169
|
+
|
|
170
|
+
const parsed = Number.parseFloat(cleaned);
|
|
171
|
+
|
|
172
|
+
return Number.isNaN(parsed) || !Number.isFinite(parsed) ? null : parsed;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// ============================================
|
|
176
|
+
// parseBoolean
|
|
177
|
+
// ============================================
|
|
178
|
+
|
|
179
|
+
const DEFAULT_TRUTHY = ["true", "1", "yes", "si", "sí", "on"];
|
|
180
|
+
const DEFAULT_FALSY = ["false", "0", "no", "off"];
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Safely parses a value into a boolean.
|
|
184
|
+
* Returns `null` if the value cannot be interpreted as boolean.
|
|
185
|
+
*
|
|
186
|
+
* - `null` or `undefined` → `null`
|
|
187
|
+
* - `boolean` → returned as-is
|
|
188
|
+
* - `number` → `0` is `false`, any other finite number is `true`
|
|
189
|
+
* - `string` → matched case-insensitively against known truthy/falsy values
|
|
190
|
+
*
|
|
191
|
+
* Default truthy: `"true"`, `"1"`, `"yes"`, `"si"`, `"sí"`, `"on"`
|
|
192
|
+
* Default falsy: `"false"`, `"0"`, `"no"`, `"off"`
|
|
193
|
+
*
|
|
194
|
+
* @param value - The value to parse.
|
|
195
|
+
* @param options - Optional parsing configuration.
|
|
196
|
+
* @returns The parsed boolean, or `null` on failure.
|
|
197
|
+
*
|
|
198
|
+
* @example
|
|
199
|
+
* ```ts
|
|
200
|
+
* parseBoolean(true) // true
|
|
201
|
+
* parseBoolean(false) // false
|
|
202
|
+
* parseBoolean(1) // true
|
|
203
|
+
* parseBoolean(0) // false
|
|
204
|
+
* parseBoolean(null) // null
|
|
205
|
+
* parseBoolean(undefined) // null
|
|
206
|
+
* parseBoolean("yes") // true
|
|
207
|
+
* parseBoolean("no") // false
|
|
208
|
+
* parseBoolean("sí") // true
|
|
209
|
+
* parseBoolean("TRUE") // true
|
|
210
|
+
* parseBoolean("oui") // null
|
|
211
|
+
* parseBoolean("oui", { extraTruthy: ["oui"] }) // true
|
|
212
|
+
* parseBoolean("nein", { extraFalsy: ["nein"] }) // false
|
|
213
|
+
* parseBoolean("whatever") // null
|
|
214
|
+
* ```
|
|
215
|
+
*/
|
|
216
|
+
export function parseBoolean(
|
|
217
|
+
value: string | number | boolean | null | undefined,
|
|
218
|
+
options: ParseBooleanOptions = {}
|
|
219
|
+
): boolean | null {
|
|
220
|
+
if (value === null || value === undefined) return null;
|
|
221
|
+
|
|
222
|
+
if (typeof value === "boolean") return value;
|
|
223
|
+
|
|
224
|
+
if (typeof value === "number") {
|
|
225
|
+
return Number.isFinite(value) ? value !== 0 : null;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
const { extraTruthy = [], extraFalsy = [] } = options;
|
|
229
|
+
|
|
230
|
+
const normalized = value.trim().toLowerCase();
|
|
231
|
+
|
|
232
|
+
if (normalized === "") return null;
|
|
233
|
+
|
|
234
|
+
const truthy = [...DEFAULT_TRUTHY, ...extraTruthy.map((s) => s.toLowerCase())];
|
|
235
|
+
const falsy = [...DEFAULT_FALSY, ...extraFalsy.map((s) => s.toLowerCase())];
|
|
236
|
+
|
|
237
|
+
if (truthy.includes(normalized)) return true;
|
|
238
|
+
if (falsy.includes(normalized)) return false;
|
|
239
|
+
|
|
240
|
+
return null;
|
|
241
|
+
}
|