@develia/commons 0.4.14 → 0.4.15
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/array.js +27 -1
- package/dist/cjs/array.js.map +1 -1
- package/dist/cjs/async-pool-executor.js +15 -0
- package/dist/cjs/async-pool-executor.js.map +1 -1
- package/dist/cjs/browser/form-utilities.js +26 -0
- package/dist/cjs/browser/form-utilities.js.map +1 -1
- package/dist/cjs/browser/geo-location.js +5 -0
- package/dist/cjs/browser/geo-location.js.map +1 -1
- package/dist/cjs/browser/index.js.map +1 -1
- package/dist/cjs/browser/native-bridge.js +9 -0
- package/dist/cjs/browser/native-bridge.js.map +1 -1
- package/dist/cjs/cancellable-promise.js.map +1 -1
- package/dist/cjs/clean-url-search-params.js +1 -0
- package/dist/cjs/clean-url-search-params.js.map +1 -1
- package/dist/cjs/collections/cache-dictionary.js +39 -0
- package/dist/cjs/collections/cache-dictionary.js.map +1 -1
- package/dist/cjs/collections/default-map.js +25 -1
- package/dist/cjs/collections/default-map.js.map +1 -1
- package/dist/cjs/collections/default-weak-map.js +23 -3
- package/dist/cjs/collections/default-weak-map.js.map +1 -1
- package/dist/cjs/{from.js → collections/from.js} +278 -4
- package/dist/cjs/collections/from.js.map +1 -0
- package/dist/cjs/collections/index.js +3 -1
- package/dist/cjs/collections/index.js.map +1 -1
- package/dist/cjs/draft.js +37 -0
- package/dist/cjs/draft.js.map +1 -1
- package/dist/cjs/event-bus.js +1 -0
- package/dist/cjs/event-bus.js.map +1 -1
- package/dist/cjs/index.js +14 -3
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/key-value-pair.js +6 -0
- package/dist/cjs/key-value-pair.js.map +1 -1
- package/dist/cjs/lazy.js +4 -0
- package/dist/cjs/lazy.js.map +1 -1
- package/dist/cjs/math.js +19 -0
- package/dist/cjs/math.js.map +1 -1
- package/dist/cjs/order.js.map +1 -1
- package/dist/cjs/parse.js +96 -0
- package/dist/cjs/parse.js.map +1 -1
- package/dist/cjs/patch.js +10 -2
- package/dist/cjs/patch.js.map +1 -1
- package/dist/cjs/stopwatch.js +10 -0
- package/dist/cjs/stopwatch.js.map +1 -1
- package/dist/cjs/string.js +62 -0
- package/dist/cjs/string.js.map +1 -1
- package/dist/cjs/timer.js +7 -0
- package/dist/cjs/timer.js.map +1 -1
- package/dist/cjs/timespan.js +202 -0
- package/dist/cjs/timespan.js.map +1 -1
- package/dist/cjs/type-code.js.map +1 -1
- package/dist/cjs/type.js +80 -1
- package/dist/cjs/type.js.map +1 -1
- package/dist/cjs/types.js.map +1 -1
- package/dist/cjs/utilities.js +183 -0
- package/dist/cjs/utilities.js.map +1 -1
- package/dist/esm/array.js +27 -1
- package/dist/esm/array.js.map +1 -1
- package/dist/esm/async-pool-executor.js +15 -0
- package/dist/esm/async-pool-executor.js.map +1 -1
- package/dist/esm/browser/form-utilities.js +26 -0
- package/dist/esm/browser/form-utilities.js.map +1 -1
- package/dist/esm/browser/geo-location.js +5 -0
- package/dist/esm/browser/geo-location.js.map +1 -1
- package/dist/esm/browser/index.js.map +1 -1
- package/dist/esm/browser/native-bridge.js +9 -0
- package/dist/esm/browser/native-bridge.js.map +1 -1
- package/dist/esm/cancellable-promise.js.map +1 -1
- package/dist/esm/clean-url-search-params.js +1 -0
- package/dist/esm/clean-url-search-params.js.map +1 -1
- package/dist/esm/collections/cache-dictionary.js +39 -0
- package/dist/esm/collections/cache-dictionary.js.map +1 -1
- package/dist/esm/collections/default-map.js +25 -1
- package/dist/esm/collections/default-map.js.map +1 -1
- package/dist/esm/collections/default-weak-map.js +22 -2
- package/dist/esm/collections/default-weak-map.js.map +1 -1
- package/dist/esm/{from.js → collections/from.js} +278 -4
- package/dist/esm/collections/from.js.map +1 -0
- package/dist/esm/collections/index.js +1 -0
- package/dist/esm/collections/index.js.map +1 -1
- package/dist/esm/draft.js +37 -0
- package/dist/esm/draft.js.map +1 -1
- package/dist/esm/event-bus.js +1 -0
- package/dist/esm/event-bus.js.map +1 -1
- package/dist/esm/index.js +13 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/key-value-pair.js +6 -0
- package/dist/esm/key-value-pair.js.map +1 -1
- package/dist/esm/lazy.js +4 -0
- package/dist/esm/lazy.js.map +1 -1
- package/dist/esm/math.js +19 -0
- package/dist/esm/math.js.map +1 -1
- package/dist/esm/order.js.map +1 -1
- package/dist/esm/parse.js +96 -0
- package/dist/esm/parse.js.map +1 -1
- package/dist/esm/patch.js +10 -2
- package/dist/esm/patch.js.map +1 -1
- package/dist/esm/stopwatch.js +10 -0
- package/dist/esm/stopwatch.js.map +1 -1
- package/dist/esm/string.js +62 -0
- package/dist/esm/string.js.map +1 -1
- package/dist/esm/timer.js +7 -0
- package/dist/esm/timer.js.map +1 -1
- package/dist/esm/timespan.js +202 -0
- package/dist/esm/timespan.js.map +1 -1
- package/dist/esm/type-code.js.map +1 -1
- package/dist/esm/type.js +80 -1
- package/dist/esm/type.js.map +1 -1
- package/dist/esm/types.js.map +1 -1
- package/dist/esm/utilities.js +183 -0
- package/dist/esm/utilities.js.map +1 -1
- package/dist/types/array.d.ts +26 -0
- package/dist/types/array.d.ts.map +1 -1
- package/dist/types/async-pool-executor.d.ts +15 -0
- package/dist/types/async-pool-executor.d.ts.map +1 -1
- package/dist/types/browser/form-utilities.d.ts +13 -0
- package/dist/types/browser/form-utilities.d.ts.map +1 -1
- package/dist/types/browser/index.d.ts.map +1 -1
- package/dist/types/browser/native-bridge.d.ts +6 -0
- package/dist/types/browser/native-bridge.d.ts.map +1 -1
- package/dist/types/collections/cache-dictionary.d.ts +39 -0
- package/dist/types/collections/cache-dictionary.d.ts.map +1 -1
- package/dist/types/collections/default-map.d.ts +23 -0
- package/dist/types/collections/default-map.d.ts.map +1 -1
- package/dist/types/collections/default-weak-map.d.ts +20 -1
- package/dist/types/collections/default-weak-map.d.ts.map +1 -1
- package/dist/types/collections/from.d.ts +333 -0
- package/dist/types/collections/from.d.ts.map +1 -0
- package/dist/types/collections/index.d.ts +1 -0
- package/dist/types/collections/index.d.ts.map +1 -1
- package/dist/types/draft.d.ts +68 -0
- package/dist/types/draft.d.ts.map +1 -1
- package/dist/types/index.d.ts +4 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/key-value-pair.d.ts +6 -0
- package/dist/types/key-value-pair.d.ts.map +1 -1
- package/dist/types/lazy.d.ts +4 -0
- package/dist/types/lazy.d.ts.map +1 -1
- package/dist/types/math.d.ts +19 -0
- package/dist/types/math.d.ts.map +1 -1
- package/dist/types/parse.d.ts +121 -0
- package/dist/types/parse.d.ts.map +1 -1
- package/dist/types/string.d.ts +51 -0
- package/dist/types/string.d.ts.map +1 -1
- package/dist/types/timer.d.ts +7 -0
- package/dist/types/timer.d.ts.map +1 -1
- package/dist/types/timespan.d.ts +202 -0
- package/dist/types/timespan.d.ts.map +1 -1
- package/dist/types/type.d.ts +40 -0
- package/dist/types/type.d.ts.map +1 -1
- package/dist/types/utilities.d.ts +171 -0
- package/dist/types/utilities.d.ts.map +1 -1
- package/dist/web/array.js +27 -1
- package/dist/web/array.js.map +1 -1
- package/dist/web/async-pool-executor.js +15 -0
- package/dist/web/async-pool-executor.js.map +1 -1
- package/dist/web/browser/form-utilities.js +26 -0
- package/dist/web/browser/form-utilities.js.map +1 -1
- package/dist/web/browser/geo-location.js +5 -0
- package/dist/web/browser/geo-location.js.map +1 -1
- package/dist/web/browser/index.js.map +1 -1
- package/dist/web/browser/native-bridge.js +9 -0
- package/dist/web/browser/native-bridge.js.map +1 -1
- package/dist/web/cancellable-promise.js.map +1 -1
- package/dist/web/clean-url-search-params.js +1 -0
- package/dist/web/clean-url-search-params.js.map +1 -1
- package/dist/web/collections/cache-dictionary.js +39 -0
- package/dist/web/collections/cache-dictionary.js.map +1 -1
- package/dist/web/collections/default-map.js +25 -1
- package/dist/web/collections/default-map.js.map +1 -1
- package/dist/web/collections/default-weak-map.js +22 -2
- package/dist/web/collections/default-weak-map.js.map +1 -1
- package/dist/web/{from.js → collections/from.js} +279 -5
- package/dist/web/collections/from.js.map +1 -0
- package/dist/web/collections/index.js +1 -0
- package/dist/web/collections/index.js.map +1 -1
- package/dist/web/draft.js +37 -0
- package/dist/web/draft.js.map +1 -1
- package/dist/web/event-bus.js +1 -0
- package/dist/web/event-bus.js.map +1 -1
- package/dist/web/index.js +13 -1
- package/dist/web/index.js.map +1 -1
- package/dist/web/key-value-pair.js +6 -0
- package/dist/web/key-value-pair.js.map +1 -1
- package/dist/web/lazy.js +4 -0
- package/dist/web/lazy.js.map +1 -1
- package/dist/web/math.js +19 -0
- package/dist/web/math.js.map +1 -1
- package/dist/web/order.js.map +1 -1
- package/dist/web/parse.js +96 -0
- package/dist/web/parse.js.map +1 -1
- package/dist/web/patch.js +10 -2
- package/dist/web/patch.js.map +1 -1
- package/dist/web/stopwatch.js +10 -0
- package/dist/web/stopwatch.js.map +1 -1
- package/dist/web/string.js +62 -0
- package/dist/web/string.js.map +1 -1
- package/dist/web/timer.js +7 -0
- package/dist/web/timer.js.map +1 -1
- package/dist/web/timespan.js +202 -0
- package/dist/web/timespan.js.map +1 -1
- package/dist/web/type-code.js.map +1 -1
- package/dist/web/type.js +80 -1
- package/dist/web/type.js.map +1 -1
- package/dist/web/types.js.map +1 -1
- package/dist/web/utilities.js +183 -0
- package/dist/web/utilities.js.map +1 -1
- package/package.json +1 -1
- package/src/browser/index.ts +2 -2
- package/src/collections/cache-dictionary.ts +39 -1
- package/src/collections/default-map.ts +15 -9
- package/src/collections/default-weak-map.ts +14 -12
- package/src/{from.ts → collections/from.ts} +285 -15
- package/src/collections/index.ts +4 -3
- package/src/index.ts +1 -1
- package/src/timespan.ts +199 -20
- package/dist/cjs/from.js.map +0 -1
- package/dist/esm/from.js.map +0 -1
- package/dist/types/from.d.ts +0 -59
- package/dist/types/from.d.ts.map +0 -1
- package/dist/web/from.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"from.js","sourceRoot":"","sources":["../../../src/collections/from.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Consumer, EqualityComparer, UnaryFunction, Predicate, Supplier, Optional, Nullable} from \"../types.js\";\r\nimport {shallowEqual, toPairs} from \"../utilities.js\";\r\nimport KeyValuePair from \"../key-value-pair.js\";\r\nimport Order from \"../order.js\";\r\n\r\n\r\n/**\r\n * Creates a new From instance from an Iterable or a Supplier of an Iterable.\r\n * @template T - The type of elements in the source.\r\n * @param {Iterable<T> | Supplier<Iterable<T>>} source - The source data.\r\n * @returns {From<T> | From<KeyValuePair<any, any>>} A new From instance.\r\n * @throws {string} If source is null or invalid.\r\n */\r\nexport default function from<T>(source: Iterable<T> | Supplier<Iterable<T>>): From<T> | From<KeyValuePair<any, any>> {\r\n if (source == null)\r\n throw \"Source is null.\";\r\n if (typeof source === 'function')\r\n return From.fn<T>(source);\r\n if (typeof source[Symbol.iterator] === 'function') {\r\n return From.iterable<T>(source);\r\n } else if (typeof source === 'object') {\r\n return From.object(source);\r\n }\r\n\r\n throw \"Invalid source.\";\r\n}\r\n\r\n/**\r\n * A LINQ-like wrapper for iterables that provides various transformation and query methods.\r\n * @template T - The type of elements in the sequence.\r\n */\r\nexport class From<T> implements Iterable<T> {\r\n\r\n /**\r\n * Creates a From instance from an object's entries.\r\n * @param {any} obj - The object to convert to pairs.\r\n * @returns {From<KeyValuePair<any, any>>} A From instance of key-value pairs.\r\n */\r\n public static object(obj: any): From<KeyValuePair<any, any>> {\r\n return new From<KeyValuePair<any, any>>(function () {\r\n return toPairs(obj);\r\n });\r\n }\r\n\r\n\r\n private readonly _fn: Supplier<Iterable<T>>\r\n\r\n protected constructor(fn: Supplier<Iterable<T>>) {\r\n this._fn = fn;\r\n }\r\n\r\n /**\r\n * Creates a From instance from a supplier function.\r\n * @template T\r\n * @param {Supplier<Iterable<T>>} callable - A function that returns an Iterable.\r\n * @returns {From<T>} A new From instance.\r\n */\r\n public static fn<T>(callable: Supplier<Iterable<T>>): From<T> {\r\n return new From<T>(callable);\r\n }\r\n\r\n /**\r\n * Collects all elements into an array and returns a new From instance from it.\r\n * Useful for freezing the sequence and preventing multiple iterations over a generator.\r\n * @returns {From<T>} A new From instance with cached data.\r\n */\r\n public collect(): From<T> {\r\n const cache = Array.from(this);\r\n return From.iterable(cache);\r\n }\r\n\r\n /**\r\n * Creates a From instance from an Iterable.\r\n * @template T\r\n * @param {Iterable<T>} iterable - The source iterable.\r\n * @returns {From<T>} A new From instance.\r\n */\r\n public static iterable<T>(iterable: Iterable<T>): From<T> {\r\n return From.fn<T>(function* () {\r\n for (const item of iterable) {\r\n yield item;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Maps each element of the sequence into a new form.\r\n * @template R\r\n * @param {UnaryFunction<T, R>} mapper - A transformation function.\r\n * @returns {From<R>} A new From instance with the mapped elements.\r\n */\r\n public map<R>(mapper: UnaryFunction<T, R>): From<R> {\r\n const self = this;\r\n return From.fn<R>(function* () {\r\n for (let item of self) {\r\n yield mapper(item);\r\n }\r\n });\r\n }\r\n\r\n * [Symbol.iterator](): Iterator<T> {\r\n yield* this._fn();\r\n }\r\n\r\n\r\n /**\r\n * Checks if all elements in the sequence satisfy the given predicate.\r\n * @param {Predicate<T>} predicate - A function to test each element.\r\n * @returns {boolean} True if all elements satisfy the predicate.\r\n */\r\n public all(predicate: Predicate<T>): boolean {\r\n for (let item of this._fn()) {\r\n if (!predicate(item)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Checks if any element in the sequence satisfies the given predicate.\r\n * If no predicate is provided, checks if the sequence is not empty.\r\n * @param {Optional<Predicate<T>>} predicate - A function to test each element.\r\n * @returns {boolean} True if any element satisfies the predicate.\r\n */\r\n public any(predicate: Optional<Predicate<T>> = undefined): boolean {\r\n for (let item of this) {\r\n if (predicate == null || predicate(item)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets the number of elements in the sequence.\r\n * @returns {number} The count of elements.\r\n */\r\n public get length(): number {\r\n return this.count();\r\n }\r\n\r\n /**\r\n * Counts the number of elements that satisfy the given predicate.\r\n * If no predicate is provided, counts all elements.\r\n * @param {Optional<Predicate<T>>} predicate - A function to test each element.\r\n * @returns {number} The count of elements.\r\n */\r\n public count(predicate: Optional<Predicate<T>> = undefined): number {\r\n\r\n let output = 0;\r\n\r\n for (let item of this) {\r\n if (predicate == null || predicate(item)) {\r\n output++;\r\n }\r\n }\r\n\r\n return output;\r\n }\r\n\r\n /**\r\n * Filters the sequence based on a predicate.\r\n * @param {Predicate<T>} predicate - A function to test each element.\r\n * @returns {From<T>} A new From instance with the filtered elements.\r\n */\r\n public filter(predicate: Predicate<T>): From<T> {\r\n const self = this;\r\n return From.fn<T>(function* () {\r\n for (let item of self) {\r\n if (predicate(item)) {\r\n yield item;\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Checks if the sequence contains a specific value.\r\n * @param {T} value - The value to search for.\r\n * @returns {boolean} True if the value is found.\r\n */\r\n public contains(value: T): boolean {\r\n for (let item of this) {\r\n if (item === value) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n\r\n /**\r\n * Returns the first element of the sequence that satisfies a condition.\r\n * @param {Predicate<T>} [predicate] - Optional condition.\r\n * @returns {T | undefined} The first element or undefined.\r\n */\r\n public first(predicate?: Predicate<T>): T | undefined {\r\n\r\n if (predicate) {\r\n for (let item of this) {\r\n if (predicate(item)) {\r\n return item;\r\n }\r\n }\r\n } else {\r\n // noinspection LoopStatementThatDoesntLoopJS\r\n for (let item of this) {\r\n return item;\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Returns the only element of the sequence that satisfies a condition, or throws if more than one exists.\r\n * @param {Predicate<T>} [predicate] - Optional condition.\r\n * @returns {T | null} The single element or null if not found.\r\n * @throws {Error} If more than one element is found.\r\n */\r\n public single(predicate?: Predicate<T>): T | null {\r\n\r\n let found = false;\r\n let output: T | null = null;\r\n\r\n if (predicate) {\r\n for (let item of this) {\r\n if (predicate(item)) {\r\n if (found) {\r\n throw new Error(\"Sequence contains more than one element.\");\r\n }\r\n found = true;\r\n output = item;\r\n }\r\n }\r\n } else {\r\n // noinspection LoopStatementThatDoesntLoopJS\r\n for (let item of this) {\r\n if (found) {\r\n throw new Error(\"Sequence contains more than one element.\");\r\n }\r\n found = true;\r\n output = item;\r\n }\r\n }\r\n\r\n return output;\r\n }\r\n\r\n /**\r\n * Appends an item to the end of the sequence.\r\n * @param {T} item - The item to append.\r\n * @returns {From<T>} A new From instance.\r\n */\r\n public append(item: T): From<T> {\r\n const self = this;\r\n return From.fn<T>(function* () {\r\n for (let element of self) {\r\n yield element;\r\n }\r\n yield item;\r\n });\r\n }\r\n\r\n /**\r\n * Prepends an item to the beginning of the sequence.\r\n * @param {T} item - The item to prepend.\r\n * @returns {From<T>} A new From instance.\r\n */\r\n public prepend(item: T): From<T> {\r\n const self = this;\r\n return From.fn<T>(function* () {\r\n yield item;\r\n for (let element of self) {\r\n yield element;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Gets the element at a specific index.\r\n * @param {number} index - The zero-based index.\r\n * @returns {T | undefined} The element at the index or undefined.\r\n */\r\n public at(index: number): T | undefined {\r\n let idx = 0;\r\n for (let item of this) {\r\n if (idx++ === index) {\r\n return item;\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Returns the last element of the sequence that satisfies a condition.\r\n * @param {Predicate<T>} [predicate] - Optional condition.\r\n * @returns {T | undefined} The last element or undefined.\r\n */\r\n public last(predicate?: Predicate<T>): T | undefined {\r\n\r\n\r\n let last: T | undefined = undefined;\r\n\r\n if (predicate)\r\n for (let item of this) {\r\n if (!predicate || predicate(item)) {\r\n last = item;\r\n }\r\n }\r\n else {\r\n for (let item of this) {\r\n last = item;\r\n }\r\n }\r\n return last;\r\n }\r\n\r\n /**\r\n * Projects each element of a sequence to an Iterable and flattens the resulting sequences into one sequence.\r\n * @template R\r\n * @param {UnaryFunction<T, Iterable<R>>} mapper - A transformation function.\r\n * @returns {From<R>} A new From instance.\r\n */\r\n public mapMany<R>(mapper: UnaryFunction<T, Iterable<R>>): From<R> {\r\n const self = this;\r\n return From.fn(function* () {\r\n for (const item of self) {\r\n const subitems = mapper(item)\r\n for (const subitem of subitems) {\r\n yield subitem;\r\n }\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * Flattens a sequence of iterables.\r\n * @returns {From<any>} A new From instance.\r\n */\r\n public flatten(): From<any> {\r\n const self = this;\r\n return From.fn<T>(function* () {\r\n for (let item of self) {\r\n let temp = <Iterable<any>>item;\r\n for (let subitem of temp) {\r\n yield subitem\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Calculates the sum of the elements in the sequence.\r\n * @param {UnaryFunction<T, number>} [mapper] - Optional projection function.\r\n * @returns {number} The sum.\r\n */\r\n public sum(mapper?: UnaryFunction<T, number>): number {\r\n let total = 0;\r\n\r\n if (mapper)\r\n for (let item of this) {\r\n total += mapper(item);\r\n }\r\n else\r\n for (let item of this) {\r\n total += item as number;\r\n }\r\n return total;\r\n }\r\n\r\n /**\r\n * Calculates the average of the elements in the sequence.\r\n * @param {UnaryFunction<T, number>} [mapper] - Optional projection function.\r\n * @returns {number} The average.\r\n */\r\n public avg(mapper?: UnaryFunction<T, number>): number {\r\n let total = 0;\r\n let count = 0;\r\n\r\n if (mapper)\r\n for (let item of this) {\r\n total += mapper(item);\r\n count++;\r\n }\r\n else\r\n for (let item of this) {\r\n total += item as number;\r\n count++;\r\n }\r\n return count > 0 ? total / count : 0;\r\n }\r\n\r\n /**\r\n * Returns the maximum value in the sequence.\r\n * @param {UnaryFunction<T, number>} mapper - Projection function.\r\n * @returns {number} The maximum value.\r\n */\r\n public max(mapper: UnaryFunction<T, number>): number {\r\n let max = -Infinity;\r\n for (let item of this) {\r\n let value = mapper(item);\r\n max = value > max ? value : max;\r\n }\r\n return max;\r\n }\r\n\r\n /**\r\n * Returns the minimum value in the sequence.\r\n * @param {UnaryFunction<T, number>} mapper - Projection function.\r\n * @returns {number} The minimum value.\r\n */\r\n public min(mapper: UnaryFunction<T, number>): number {\r\n let min = Infinity;\r\n for (let item of this) {\r\n let value = mapper(item);\r\n min = value < min ? value : min;\r\n }\r\n return min;\r\n }\r\n\r\n /**\r\n * Returns the element with the maximum value.\r\n * @param {UnaryFunction<T, number>} mapper - Projection function.\r\n * @returns {T | undefined} The element with the maximum value.\r\n */\r\n public maxBy(mapper: UnaryFunction<T, number>): T | undefined {\r\n let max = -Infinity;\r\n let maxItem: T | undefined;\r\n for (let item of this) {\r\n let value = mapper(item);\r\n if (value > max) {\r\n max = value;\r\n maxItem = item;\r\n }\r\n }\r\n return maxItem;\r\n }\r\n\r\n /**\r\n * Returns the element with the minimum value.\r\n * @param {UnaryFunction<T, number>} mapper - Projection function.\r\n * @returns {T | undefined} The element with the minimum value.\r\n */\r\n public minBy(mapper: UnaryFunction<T, number>): T | undefined {\r\n let min = Infinity;\r\n let minItem: T | undefined;\r\n for (let item of this) {\r\n let value = mapper(item);\r\n if (value < min) {\r\n min = value;\r\n minItem = item;\r\n }\r\n }\r\n return minItem;\r\n }\r\n\r\n /**\r\n * Sorts the elements of the sequence.\r\n * @template R\r\n * @param {UnaryFunction<T, R>} mapper - Projection function for the key to sort by.\r\n * @param {Order} [order] - Ascending or Descending.\r\n * @returns {From<T>} A new From instance.\r\n */\r\n public orderBy<R>(mapper: UnaryFunction<T, R>, order: Order = Order.Ascending): From<T> {\r\n const array = Array.from(this._fn());\r\n if (order == Order.Ascending) {\r\n array.sort((a, b) => {\r\n const aValue = mapper(a);\r\n const bValue = mapper(b);\r\n return aValue > bValue ? 1 : bValue > aValue ? -1 : 0;\r\n });\r\n } else if (order == Order.Descending) {\r\n array.sort((a, b) => {\r\n const aValue = mapper(a);\r\n const bValue = mapper(b);\r\n return aValue > bValue ? 1 : bValue < aValue ? -1 : 0;\r\n });\r\n } else {\r\n throw new Error(\"invalid order argument\");\r\n }\r\n\r\n return From.iterable(array);\r\n }\r\n\r\n /**\r\n * Groups the elements of the sequence.\r\n * @template TKey\r\n * @param {UnaryFunction<T, TKey>} keySelector - Function to extract the key for each element.\r\n * @param {EqualityComparer<TKey>} [equalityComparer] - Optional comparer for keys.\r\n * @returns {From<Grouping<TKey, T>>} A new From instance.\r\n */\r\n public groupBy<TKey>(keySelector: UnaryFunction<T, TKey>, equalityComparer?: EqualityComparer<TKey>): From<Grouping<TKey, T>> {\r\n\r\n equalityComparer = (equalityComparer == null ? shallowEqual : equalityComparer);\r\n const self = this;\r\n\r\n return From.fn<Grouping<TKey, T>>(function* () {\r\n const groups: Array<[TKey, T[]]> = [];\r\n for (let item of self) {\r\n const key = keySelector(item);\r\n let found = false;\r\n for (let [entryKey, group] of groups) {\r\n if (equalityComparer(key, entryKey)) {\r\n group.push(item);\r\n found = true;\r\n break;\r\n }\r\n }\r\n if (!found) {\r\n groups.push([key, [item]]);\r\n }\r\n }\r\n yield* groups.map(([key, values]) => new Grouping<TKey, T>(key, values));\r\n });\r\n }\r\n\r\n /**\r\n * Returns a specified number of contiguous elements from the start of the sequence.\r\n * @param {number} n - The number of elements to return.\r\n * @returns {From<T>} A new From instance.\r\n */\r\n public head(n: number): From<T> {\r\n\r\n const self = this;\r\n return From.fn<T>(function* () {\r\n let count = 0;\r\n for (let item of self) {\r\n if (count++ < n) {\r\n yield item;\r\n } else {\r\n return;\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Returns a specified number of contiguous elements from the end of the sequence.\r\n * @param {number} n - The number of elements to return.\r\n * @returns {From<T>} A new From instance.\r\n */\r\n public tail(n: number): From<T> {\r\n\r\n const self = this;\r\n return From.fn<T>(function* () {\r\n let buffer = [];\r\n for (let item of self) {\r\n buffer.push(item);\r\n if (buffer.length > n) {\r\n buffer.shift();\r\n }\r\n }\r\n yield* buffer;\r\n });\r\n }\r\n\r\n /**\r\n * Performs the specified action on each element of the sequence.\r\n * @param {Consumer<T>} action - The action to perform.\r\n */\r\n public forEach(action: Consumer<T>): void {\r\n for (let item of this) {\r\n action(item);\r\n }\r\n }\r\n\r\n /**\r\n * Converts the sequence to an array.\r\n * @returns {T[]} The array.\r\n */\r\n public toArray(): T[] {\r\n return Array.from(this);\r\n }\r\n\r\n /**\r\n * Converts the sequence to a record.\r\n * @template R\r\n * @param {UnaryFunction<T, string | symbol | number>} keySelector - Key selector.\r\n * @param {UnaryFunction<T, R>} valueSelector - Value selector.\r\n * @returns {Record<string | symbol | number, R>} The record.\r\n */\r\n public toRecord<R>(keySelector: UnaryFunction<T, string | symbol | number>, valueSelector: UnaryFunction<T, R>): Record<string | symbol | number, R> {\r\n const output: Record<string | symbol | number, R> = {};\r\n\r\n for (let item of this) {\r\n output[keySelector(item)] = valueSelector(item);\r\n }\r\n return output;\r\n }\r\n\r\n /**\r\n * Converts the sequence to a Map.\r\n * @template RKey, RValue\r\n * @param {UnaryFunction<T, RKey>} keySelector - Key selector.\r\n * @param {UnaryFunction<T, RValue>} valueSelector - Value selector.\r\n * @returns {Map<RKey, RValue>} The map.\r\n */\r\n public toMap<RKey, RValue>(keySelector: UnaryFunction<T, RKey>, valueSelector: UnaryFunction<T, RValue>): Map<RKey, RValue> {\r\n const map = new Map<any, any>();\r\n\r\n for (let item of this) {\r\n const key = keySelector(item);\r\n const value = valueSelector(item);\r\n map.set(key, value);\r\n }\r\n\r\n return map;\r\n }\r\n\r\n\r\n /**\r\n * Returns elements that are instances of a specific primitive type.\r\n * @param {string} type - The type string (e.g., 'string', 'number').\r\n * @returns {From<T>} A new From instance.\r\n */\r\n public instancesOf(type: string): From<T> {\r\n return this.filter(item => typeof item === type);\r\n }\r\n\r\n /**\r\n * Checks if all elements are instances of a specific class.\r\n * @param {new (...args: any[]) => any} type - The class constructor.\r\n * @returns {boolean} True if all elements are instances of the type.\r\n */\r\n public allInstanceOf(type: new (...args: any[]) => any): boolean {\r\n for (let item of this) {\r\n if (!(item instanceof type)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Returns distinct elements from the sequence.\r\n * @param {EqualityComparer<T>} [eq_comparer] - Optional equality comparer.\r\n * @returns {From<T>} A new From instance.\r\n */\r\n public distinct(eq_comparer?: EqualityComparer<T>): From<T> {\r\n\r\n if (eq_comparer == null)\r\n eq_comparer = shallowEqual;\r\n\r\n const self = this;\r\n return From.fn<T>(function* () {\r\n\r\n const included = [];\r\n\r\n for (let item of self) {\r\n if (!From.iterable(included).any(x => eq_comparer(x, item))) {\r\n included.push(item);\r\n yield item;\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Inserts an item at a specific index.\r\n * @param {T} item - The item to insert.\r\n * @param {number} index - The zero-based index.\r\n * @returns {From<T>} A new From instance.\r\n */\r\n public insert(item: T, index: number): From<T> {\r\n\r\n const self = this;\r\n return From.fn<T>(function* () {\r\n let i = 0;\r\n let inserted = false;\r\n for (let existingItem of self) {\r\n if (i === index) {\r\n yield item;\r\n inserted = true;\r\n }\r\n yield existingItem;\r\n i++;\r\n }\r\n if (!inserted) {\r\n yield item;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Bypasses a specified number of elements in a sequence and then returns the remaining elements.\r\n * @param {number} n - The number of elements to skip.\r\n * @returns {From<T>} A new From instance.\r\n */\r\n public skip(n: number): From<T> {\r\n const self = this;\r\n return From.fn<T>(function* () {\r\n let i = 0;\r\n for (let item of self) {\r\n if (i >= n) {\r\n yield item;\r\n }\r\n i++;\r\n }\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Concatenates two sequences.\r\n * @param {Iterable<T>} other - The other sequence.\r\n * @returns {From<T>} A new From instance.\r\n */\r\n public union(other: Iterable<T>): From<T> {\r\n const self = this;\r\n return From.fn<T>(function* () {\r\n yield* self;\r\n yield* other;\r\n });\r\n }\r\n\r\n /**\r\n * Correlates the elements of two sequences based on matching keys.\r\n * @template T2, R, R2\r\n * @param {Iterable<T2>} other - The other sequence.\r\n * @param {UnaryFunction<T, R>} thisKeySelector - Key selector for this sequence.\r\n * @param {UnaryFunction<T2, R>} otherKeySelector - Key selector for the other sequence.\r\n * @param {(thisItem: T, otherItem: T2) => R2} resultSelector - Function to create a result element from two matching elements.\r\n * @returns {From<R2>} A new From instance.\r\n */\r\n public innerJoin<T2, R, R2>(other: Iterable<T2>, thisKeySelector: UnaryFunction<T, R>, otherKeySelector: UnaryFunction<T2, R>, resultSelector: (thisItem: T, otherItem: T2) => R2): From<R2> {\r\n\r\n const self = this;\r\n return From.fn<R2>(() => {\r\n const otherByKey = new Map<R, T2>();\r\n for (let item of other) {\r\n otherByKey.set(otherKeySelector(item), item);\r\n }\r\n return Array.from(self)\r\n .filter(item => otherByKey.has(thisKeySelector(item)))\r\n .map(item => resultSelector(item, otherByKey.get(thisKeySelector(item))!));\r\n });\r\n }\r\n\r\n /**\r\n * Performs a left join on two sequences.\r\n * @template U, K, R\r\n * @param {Iterable<U>} other - The other sequence.\r\n * @param {UnaryFunction<T, K>} thisKeySelector - Key selector for this sequence.\r\n * @param {UnaryFunction<U, K>} otherKeySelector - Key selector for the other sequence.\r\n * @param {(thisItem: T, otherItem: U | undefined) => R} resultSelector - Function to create a result element.\r\n * @returns {From<R>} A new From instance.\r\n */\r\n public leftJoin<U, K, R>(other: Iterable<U>, thisKeySelector: UnaryFunction<T, K>, otherKeySelector: UnaryFunction<U, K>, resultSelector: (thisItem: T, otherItem: U | undefined) => R): From<R> {\r\n\r\n const self = this;\r\n return From.fn<R>(() => {\r\n const otherByKey = new Map<K, U>();\r\n for (let item of other) {\r\n otherByKey.set(otherKeySelector(item), item);\r\n }\r\n return Array.from(self).map(item => resultSelector(item, otherByKey.get(thisKeySelector(item))));\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Performs a left group join on two sequences.\r\n * @template U, K, R\r\n * @param {Iterable<U>} other - The other sequence.\r\n * @param {UnaryFunction<T, K>} thisKeySelector - Key selector for this sequence.\r\n * @param {UnaryFunction<U, K>} otherKeySelector - Key selector for the other sequence.\r\n * @param {(thisItem: T, otherItems: Array<U>) => R} resultSelector - Function to create a result element.\r\n * @returns {From<R>} A new From instance.\r\n */\r\n public leftGroupJoin<U, K, R>(other: Iterable<U>, thisKeySelector: UnaryFunction<T, K>, otherKeySelector: UnaryFunction<U, K>, resultSelector: (thisItem: T, otherItems: Array<U>) => R): From<R> {\r\n\r\n const self = this;\r\n return From.fn<R>(() => {\r\n const otherByKeys = new Map<K, Array<U>>();\r\n for (let item of other) {\r\n const key = otherKeySelector(item);\r\n if (!otherByKeys.has(key)) {\r\n otherByKeys.set(key, []);\r\n }\r\n otherByKeys.get(key)!.push(item);\r\n }\r\n return Array.from(self).map(item => resultSelector(item, otherByKeys.get(thisKeySelector(item)) || []));\r\n });\r\n }\r\n\r\n /**\r\n * Performs a right group join on two sequences.\r\n * @template U, K, R\r\n * @param {Iterable<U>} other - The other sequence.\r\n * @param {UnaryFunction<T, K>} thisKeySelector - Key selector for this sequence.\r\n * @param {UnaryFunction<U, K>} otherKeySelector - Key selector for the other sequence.\r\n * @param {(thisItems: Array<T>, otherItem: U) => R} resultSelector - Function to create a result element.\r\n * @returns {From<R>} A new From instance.\r\n */\r\n public rightGroupJoin<U, K, R>(other: Iterable<U>, thisKeySelector: UnaryFunction<T, K>, otherKeySelector: UnaryFunction<U, K>, resultSelector: (thisItems: Array<T>, otherItem: U) => R): From<R> {\r\n\r\n const self = this;\r\n return From.fn<R>(() => {\r\n const thisByKeys = new Map<K, Array<T>>();\r\n for (let item of self) {\r\n const key = thisKeySelector(item);\r\n if (!thisByKeys.has(key)) {\r\n thisByKeys.set(key, []);\r\n }\r\n thisByKeys.get(key)!.push(item);\r\n }\r\n return Array.from(other).map(item => resultSelector(thisByKeys.get(otherKeySelector(item)) || [], item));\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Performs a right join on two sequences.\r\n * @template U, K, R\r\n * @param {Iterable<U>} other - The other sequence.\r\n * @param {UnaryFunction<T, K>} thisKeySelector - Key selector for this sequence.\r\n * @param {UnaryFunction<U, K>} otherKeySelector - Key selector for the other sequence.\r\n * @param {(thisItem: T | undefined, otherItem: U) => R} resultSelector - Function to create a result element.\r\n * @returns {From<R>} A new From instance.\r\n */\r\n public rightJoin<U, K, R>(other: Iterable<U>, thisKeySelector: UnaryFunction<T, K>, otherKeySelector: UnaryFunction<U, K>, resultSelector: (thisItem: T | undefined, otherItem: U) => R): From<R> {\r\n\r\n const self = this;\r\n return From.fn<R>(() => {\r\n const thisByKey = new Map<K, T>();\r\n for (let item of self) {\r\n thisByKey.set(thisKeySelector(item), item);\r\n }\r\n return Array.from(other).map(item => resultSelector(thisByKey.get(otherKeySelector(item)), item));\r\n });\r\n }\r\n\r\n}\r\n\r\n/**\r\n * Represents a group of elements that have a common key.\r\n * @template TKey, T\r\n */\r\nexport class Grouping<TKey, T> extends From<T> {\r\n\r\n private readonly _key: TKey;\r\n\r\n /**\r\n * Gets the key of the group.\r\n */\r\n public get key(): TKey {\r\n return this._key;\r\n }\r\n\r\n /**\r\n * @param {TKey} key - The group key.\r\n * @param {Array<T>} values - The values in the group.\r\n */\r\n public constructor(key: TKey, values: Array<T>) {\r\n super(() => values);\r\n this._key = key;\r\n }\r\n}"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { default as DefaultWeakMap } from './default-weak-map.js';
|
|
2
2
|
export { default as DefaultMap } from './default-map.js';
|
|
3
3
|
export { default as CacheDictionary } from './cache-dictionary.js';
|
|
4
|
+
export { default as from } from './from.js';
|
|
4
5
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/collections/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,IAAI,cAAc,EAAC,MAAM,uBAAuB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/collections/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,IAAI,cAAc,EAAC,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAC,OAAO,IAAI,UAAU,EAAC,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAC,OAAO,IAAI,eAAe,EAAC,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAC,OAAO,IAAI,IAAI,EAAC,MAAM,WAAW,CAAC","sourcesContent":["export {default as DefaultWeakMap} from './default-weak-map.js';\r\nexport {default as DefaultMap} from './default-map.js';\r\nexport {default as CacheDictionary} from './cache-dictionary.js';\r\nexport {default as from} from './from.js';"]}
|
package/dist/esm/draft.js
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
// ─────────────────────────────────────────────
|
|
2
|
+
// deepDraft (internal)
|
|
3
|
+
// ─────────────────────────────────────────────
|
|
4
|
+
/**
|
|
5
|
+
* Recursively wrap a value so that nested objects/arrays become child drafts
|
|
6
|
+
* linked to a parent. Primitives, `Date`, `RegExp`, `Map` and `Set` instances
|
|
7
|
+
* are cloned but not wrapped.
|
|
8
|
+
*
|
|
9
|
+
* @param value - The value to process.
|
|
10
|
+
* @param parentLink - Optional link to a parent draft for change propagation.
|
|
11
|
+
* @returns A drafted value (or a plain clone for non-wrappable types).
|
|
12
|
+
*/
|
|
1
13
|
function deepDraft(value, parentLink) {
|
|
2
14
|
if (value === null || typeof value !== "object")
|
|
3
15
|
return value;
|
|
@@ -21,6 +33,22 @@ function deepDraft(value, parentLink) {
|
|
|
21
33
|
}
|
|
22
34
|
return draft(value, parentLink);
|
|
23
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Create a draft proxy over `original`. The proxy exposes the same properties
|
|
38
|
+
* as the original (with nested objects wrapped as child drafts) plus the
|
|
39
|
+
* control methods `commit`, `rollback`, `isModified`, `modifiedProps` and
|
|
40
|
+
* `setModified`.
|
|
41
|
+
*
|
|
42
|
+
* Mutations on the draft do not affect the original until `commit()` is called.
|
|
43
|
+
* Nested mutations bubble up: modifying a deep property marks every ancestor
|
|
44
|
+
* draft as modified at the corresponding key.
|
|
45
|
+
*
|
|
46
|
+
* @template T - The shape of the wrapped object.
|
|
47
|
+
* @param original - The object to wrap. It will only be mutated on `commit()`.
|
|
48
|
+
* @param parentLink - Internal link used when this draft is a child of another.
|
|
49
|
+
* Do not pass manually.
|
|
50
|
+
* @returns A draft proxy over a deep copy of `original`.
|
|
51
|
+
*/
|
|
24
52
|
export default function draft(original, parentLink) {
|
|
25
53
|
const copy = Array.isArray(original)
|
|
26
54
|
? []
|
|
@@ -31,6 +59,10 @@ export default function draft(original, parentLink) {
|
|
|
31
59
|
parentLink.parent.setModified(parentLink.keyInParent, modified);
|
|
32
60
|
}
|
|
33
61
|
};
|
|
62
|
+
/**
|
|
63
|
+
* Apply commit for a single key: delegate to the child draft if present,
|
|
64
|
+
* otherwise copy the value into `original`.
|
|
65
|
+
*/
|
|
34
66
|
const applyCommit = (key) => {
|
|
35
67
|
const val = copy[key];
|
|
36
68
|
if (val !== null &&
|
|
@@ -46,6 +78,10 @@ export default function draft(original, parentLink) {
|
|
|
46
78
|
delete original[key];
|
|
47
79
|
}
|
|
48
80
|
};
|
|
81
|
+
/**
|
|
82
|
+
* Apply rollback for a single key: delegate to the child draft if present,
|
|
83
|
+
* otherwise restore the value from `original`.
|
|
84
|
+
*/
|
|
49
85
|
const applyRollback = (key) => {
|
|
50
86
|
const val = copy[key];
|
|
51
87
|
if (val !== null &&
|
|
@@ -113,6 +149,7 @@ export default function draft(original, parentLink) {
|
|
|
113
149
|
},
|
|
114
150
|
};
|
|
115
151
|
const isMethodKey = (prop) => typeof prop === "string" && prop in methods;
|
|
152
|
+
// Populate `copy` with child drafts linked to this draft.
|
|
116
153
|
for (const key of Reflect.ownKeys(original)) {
|
|
117
154
|
copy[key] = deepDraft(original[key], {
|
|
118
155
|
parent: methods,
|
package/dist/esm/draft.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"draft.js","sourceRoot":"","sources":["../../src/draft.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"draft.js","sourceRoot":"","sources":["../../src/draft.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Methods injected into a draft proxy in addition to the original object's properties.\n *\n * @template T - The shape of the wrapped object.\n */\ntype DraftMethods<T> = {\n /**\n * Apply pending changes to the original object.\n *\n * @param key - Optional property key. If provided, commits only that property.\n * If omitted, commits every modified property recursively.\n * @returns `true` when a single-property commit was applied,\n * `false` when the property was not modified,\n * `void` when committing the whole draft.\n */\n commit(key?: keyof T): boolean | void;\n\n /**\n * Discard pending changes, restoring values from the original object.\n *\n * @param key - Optional property key. If provided, rolls back only that property.\n * If omitted, rolls back every modified property recursively.\n * @returns `true` when a single-property rollback was applied,\n * `false` when the property was not modified,\n * `void` when rolling back the whole draft.\n */\n rollback(key?: keyof T): boolean | void;\n\n /**\n * Check whether the draft (or a specific property) has pending changes.\n *\n * @param key - Optional property key. If omitted, checks the whole draft.\n * @returns `true` if there are pending changes.\n */\n isModified(key?: keyof T): boolean;\n\n /**\n * Get the list of property keys with pending changes at this draft level.\n *\n * @returns Array of modified property keys (does not recurse into children).\n */\n modifiedProps(): (keyof T)[];\n\n /**\n * Manually mark (or unmark) a property as modified.\n * Primarily used by child drafts to notify their parent, but also\n * available for advanced manual control.\n *\n * @param key - Property key to flag.\n * @param modified - `true` to mark as modified (default), `false` to clear.\n */\n setModified(key: keyof T, modified?: boolean): void;\n};\n\n/**\n * A draft proxy: the original object's properties plus draft control methods.\n *\n * @template T - The shape of the wrapped object.\n */\nexport type Draft<T extends object> = T & DraftMethods<T>;\n\n/**\n * Link from a child draft to its parent, used to propagate modification status.\n */\ntype ParentLink = {\n /** Parent draft methods reference (we only need `setModified`). */\n parent: { setModified(key: PropertyKey, modified?: boolean): void };\n /** Key under which this draft is stored in the parent. */\n keyInParent: PropertyKey;\n};\n\n// ─────────────────────────────────────────────\n// deepDraft (internal)\n// ─────────────────────────────────────────────\n\n/**\n * Recursively wrap a value so that nested objects/arrays become child drafts\n * linked to a parent. Primitives, `Date`, `RegExp`, `Map` and `Set` instances\n * are cloned but not wrapped.\n *\n * @param value - The value to process.\n * @param parentLink - Optional link to a parent draft for change propagation.\n * @returns A drafted value (or a plain clone for non-wrappable types).\n */\nfunction deepDraft(value: any, parentLink?: ParentLink): any {\n if (value === null || typeof value !== \"object\") return value;\n if (value instanceof Date) return new Date(value);\n if (value instanceof RegExp) return new RegExp(value);\n\n if (value instanceof Map) {\n const copy = new Map();\n for (const [k, v] of value) {\n copy.set(deepDraft(k), deepDraft(v));\n }\n return copy;\n }\n if (value instanceof Set) {\n const copy = new Set();\n for (const v of value) {\n copy.add(deepDraft(v));\n }\n return copy;\n }\n\n return draft(value, parentLink);\n}\n\n/**\n * Create a draft proxy over `original`. The proxy exposes the same properties\n * as the original (with nested objects wrapped as child drafts) plus the\n * control methods `commit`, `rollback`, `isModified`, `modifiedProps` and\n * `setModified`.\n *\n * Mutations on the draft do not affect the original until `commit()` is called.\n * Nested mutations bubble up: modifying a deep property marks every ancestor\n * draft as modified at the corresponding key.\n *\n * @template T - The shape of the wrapped object.\n * @param original - The object to wrap. It will only be mutated on `commit()`.\n * @param parentLink - Internal link used when this draft is a child of another.\n * Do not pass manually.\n * @returns A draft proxy over a deep copy of `original`.\n */\nexport default function draft<T extends object>(\n original: T,\n parentLink?: ParentLink\n): Draft<T> {\n const copy: any = Array.isArray(original)\n ? []\n : Object.create(Object.getPrototypeOf(original));\n\n const touched = new Set<PropertyKey>();\n\n const notifyParent = (modified: boolean): void => {\n if (parentLink) {\n parentLink.parent.setModified(parentLink.keyInParent, modified);\n }\n };\n\n /**\n * Apply commit for a single key: delegate to the child draft if present,\n * otherwise copy the value into `original`.\n */\n const applyCommit = (key: PropertyKey): void => {\n const val = copy[key];\n if (\n val !== null &&\n typeof val === \"object\" &&\n \"commit\" in val\n ) {\n (val as Draft<any>).commit();\n return;\n }\n if (key in copy) {\n (original as any)[key] = copy[key];\n } else {\n delete (original as any)[key];\n }\n };\n /**\n * Apply rollback for a single key: delegate to the child draft if present,\n * otherwise restore the value from `original`.\n */\n const applyRollback = (key: PropertyKey): void => {\n const val = copy[key];\n if (\n val !== null &&\n typeof val === \"object\" &&\n \"rollback\" in val\n ) {\n (val as Draft<any>).rollback();\n return;\n }\n if (key in original) {\n copy[key] = (original as any)[key];\n } else {\n delete copy[key];\n }\n };\n\n const methods: DraftMethods<T> = {\n commit(key) {\n if (key === undefined) {\n for (const k of touched) applyCommit(k);\n touched.clear();\n notifyParent(false);\n return;\n }\n if (!touched.has(key)) return false;\n applyCommit(key);\n touched.delete(key);\n if (touched.size === 0) notifyParent(false);\n return true;\n },\n\n rollback(key) {\n if (key === undefined) {\n for (const k of touched) applyRollback(k);\n touched.clear();\n notifyParent(false);\n return;\n }\n if (!touched.has(key)) return false;\n applyRollback(key);\n touched.delete(key);\n if (touched.size === 0) notifyParent(false);\n return true;\n },\n\n isModified(key) {\n return key === undefined ? touched.size > 0 : touched.has(key);\n },\n\n modifiedProps() {\n return [...touched] as (keyof T)[];\n },\n\n setModified(key, modified = true) {\n if (modified) {\n touched.add(key);\n notifyParent(true);\n } else {\n touched.delete(key);\n if (touched.size === 0) notifyParent(false);\n }\n },\n };\n\n const isMethodKey = (prop: PropertyKey): prop is keyof DraftMethods<T> =>\n typeof prop === \"string\" && prop in methods;\n\n // Populate `copy` with child drafts linked to this draft.\n for (const key of Reflect.ownKeys(original)) {\n copy[key] = deepDraft((original as any)[key], {\n parent: methods,\n keyInParent: key,\n });\n }\n\n return new Proxy(copy, {\n get(target, prop, receiver) {\n if (isMethodKey(prop)) return (methods as any)[prop];\n return Reflect.get(target, prop, receiver);\n },\n\n set(target, prop, value, receiver) {\n if (isMethodKey(prop)) {\n throw new Error(`\"${String(prop)}\" is a reserved draft property`);\n }\n const wrapped = deepDraft(value, {\n parent: methods,\n keyInParent: prop,\n });\n touched.add(prop);\n notifyParent(true);\n return Reflect.set(target, prop, wrapped, receiver);\n },\n\n deleteProperty(target, prop) {\n if (isMethodKey(prop)) {\n throw new Error(`\"${String(prop)}\" is a reserved draft property`);\n }\n touched.add(prop);\n notifyParent(true);\n return Reflect.deleteProperty(target, prop);\n },\n }) as Draft<T>;\n}"]}
|
package/dist/esm/event-bus.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../../src/event-bus.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../../src/event-bus.ts"],"names":[],"mappings":"AAAA,WAAW;AAEX,MAAM,OAAgB,KAAK;IAGvB;QACI,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;IAChC,CAAC;IAED,QAAQ;QACJ,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC;IACvE,CAAC;CACJ;AAUD,MAAM,OAAO,QAAQ;IAArB;QAOY,cAAS,GAAG,IAAI,GAAG,EAA8B,CAAC;IAsD9D,CAAC;IA1DG,MAAM,KAAK,MAAM;QACb,OAAO,IAAI,CAAC,SAAS,KAAd,IAAI,CAAC,SAAS,GAAK,IAAI,QAAQ,EAAE,EAAC;IAC7C,CAAC;IAID,EAAE,CAAkB,IAAmB,EAAE,OAAmB;QACxD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC;YAC3B,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE,CAAC,OAAO,CAAC,KAAU,CAAC;SACjD,CAAC,CAAC;IACP,CAAC;IAED,GAAG,CAAkB,IAAmB,EAAE,OAAmB;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ;YAAE,OAAO;QAEtB,IAAI,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;QAC9D,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC9B,CAAC;IACL,CAAC;IAED,IAAI,CAAkB,KAAQ;QAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ;YAAE,OAAO;QAEtB,KAAK,MAAM,OAAO,IAAI,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC;gBACD,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CAAC,kCAAkC,KAAK,CAAC,WAAW,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;YAClF,CAAC;QACL,CAAC;IACL,CAAC;IAED,IAAI,CAAkB,IAAmB,EAAE,OAAmB;QAC1D,MAAM,OAAO,GAAe,CAAC,KAAQ,EAAE,EAAE;YACrC,OAAO,CAAC,KAAK,CAAC,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC5B,CAAC,CAAC;QACF,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAkB,IAAmB;QACtC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,QAAQ;QACJ,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED,YAAY,CAAkB,IAAmB;QAC7C,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACvD,CAAC;;AA3Dc,kBAAS,GAAoB,IAAI,AAAxB,CAAyB","sourcesContent":["// event.ts\r\n\r\nexport abstract class Event {\r\n readonly timestamp: Date;\r\n\r\n protected constructor() {\r\n this.timestamp = new Date();\r\n }\r\n\r\n toString(): string {\r\n return `${this.constructor.name}(${this.timestamp.toISOString()})`;\r\n }\r\n}\r\n\r\ntype EventClass<T extends Event> = new (...args: any[]) => T;\r\ntype Handler<T extends Event> = (event: T) => void;\r\n\r\ninterface HandlerWrapper {\r\n original: Function;\r\n wrapped: (event: Event) => void;\r\n}\r\n\r\nexport class EventBus {\r\n private static _instance: EventBus | null = null;\r\n\r\n static get shared(): EventBus {\r\n return this._instance ??= new EventBus();\r\n }\r\n\r\n private _handlers = new Map<Function, HandlerWrapper[]>();\r\n\r\n on<T extends Event>(type: EventClass<T>, handler: Handler<T>): void {\r\n if (!this._handlers.has(type)) {\r\n this._handlers.set(type, []);\r\n }\r\n this._handlers.get(type)!.push({\r\n original: handler,\r\n wrapped: (event: Event) => handler(event as T),\r\n });\r\n }\r\n\r\n off<T extends Event>(type: EventClass<T>, handler: Handler<T>): void {\r\n const handlers = this._handlers.get(type);\r\n if (!handlers) return;\r\n\r\n let index = handlers.findIndex((h) => h.original === handler);\r\n if (index !== -1) {\r\n handlers.splice(index, 1);\r\n }\r\n }\r\n\r\n emit<T extends Event>(event: T): void {\r\n const handlers = this._handlers.get(event.constructor);\r\n if (!handlers) return;\r\n\r\n for (const handler of [...handlers]) {\r\n try {\r\n handler.wrapped(event);\r\n } catch (e) {\r\n console.error(`[EventBus] Error en handler de ${event.constructor.name}:`, e);\r\n }\r\n }\r\n }\r\n\r\n once<T extends Event>(type: EventClass<T>, handler: Handler<T>): void {\r\n const wrapper: Handler<T> = (event: T) => {\r\n handler(event);\r\n this.off(type, wrapper);\r\n };\r\n this.on(type, wrapper);\r\n }\r\n\r\n clear<T extends Event>(type: EventClass<T>): void {\r\n this._handlers.delete(type);\r\n }\r\n\r\n clearAll(): void {\r\n this._handlers.clear();\r\n }\r\n\r\n hasListeners<T extends Event>(type: EventClass<T>): boolean {\r\n return (this._handlers.get(type)?.length ?? 0) > 0;\r\n }\r\n}"]}
|
package/dist/esm/index.js
CHANGED
|
@@ -1,22 +1,34 @@
|
|
|
1
|
+
// src/index.ts
|
|
2
|
+
// ─── Types ───────────────────────────────────────────
|
|
1
3
|
export * from './types.js';
|
|
2
4
|
export { default as Type } from './type.js';
|
|
3
5
|
export { default as TypeCode } from './type-code.js';
|
|
6
|
+
// ─── Utilities ───────────────────────────────────────
|
|
4
7
|
export * from './utilities.js';
|
|
5
8
|
export * from './string.js';
|
|
6
9
|
export * from './math.js';
|
|
7
10
|
export { default as CancellablePromise } from "./cancellable-promise.js";
|
|
11
|
+
// ─── Data Structures ────────────────────────────────
|
|
8
12
|
export { default as KeyValuePair } from './key-value-pair.js';
|
|
9
13
|
export { default as Order } from './order.js';
|
|
14
|
+
// ─── Async & Timing ─────────────────────────────────
|
|
10
15
|
export { default as Timer } from './timer.js';
|
|
11
16
|
export { default as TimeSpan } from './timespan.js';
|
|
12
17
|
export { default as Stopwatch } from './stopwatch.js';
|
|
13
18
|
export { default as AsyncPoolExecutor } from './async-pool-executor.js';
|
|
19
|
+
// ─── Patterns ────────────────────────────────────────
|
|
14
20
|
export { default as Lazy } from './lazy.js';
|
|
15
|
-
export { default as from
|
|
21
|
+
export { default as from } from './collections/from.js';
|
|
16
22
|
export { EventBus, Event } from './event-bus.js';
|
|
23
|
+
// ─── Draft ────────────────────────────────────────
|
|
17
24
|
export { default as draft } from './draft.js';
|
|
25
|
+
// ─── Web ─────────────────────────────────────────────
|
|
18
26
|
export { default as CleanURLSearchParams } from './clean-url-search-params.js';
|
|
27
|
+
/** @deprecated */
|
|
19
28
|
export { ajaxSubmit, ajaxSubmission, submitForm, formToObject } from './browser/index.js';
|
|
29
|
+
// ─── Deprecated ──────────────────────────────────────
|
|
30
|
+
/** @deprecated */
|
|
20
31
|
export * from './array.js';
|
|
32
|
+
/** @deprecated */
|
|
21
33
|
export * from './collections/index.js';
|
|
22
34
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,eAAe;AAEf,wDAAwD;AACxD,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAC,OAAO,IAAI,IAAI,EAAC,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAC,OAAO,IAAI,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AAEnD,wDAAwD;AACxD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAC,OAAO,IAAI,kBAAkB,EAAC,MAAM,0BAA0B,CAAC;AAEvE,uDAAuD;AACvD,OAAO,EAAC,OAAO,IAAI,YAAY,EAAC,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAC,OAAO,IAAI,KAAK,EAAC,MAAM,YAAY,CAAC;AAE5C,uDAAuD;AACvD,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;AAEtE,wDAAwD;AACxD,OAAO,EAAC,OAAO,IAAI,IAAI,EAAC,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAC,OAAO,IAAI,IAAI,EAAC,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAC,QAAQ,EAAE,KAAK,EAAC,MAAM,gBAAgB,CAAC;AAE/C,qDAAqD;AACrD,OAAO,EAAC,OAAO,IAAI,KAAK,EAAC,MAAM,YAAY,CAAC;AAE5C,wDAAwD;AACxD,OAAO,EAAC,OAAO,IAAI,oBAAoB,EAAC,MAAM,8BAA8B,CAAC;AAC7E,mBAAmB;AACnB,OAAO,EAAC,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAIxF,wDAAwD;AACxD,mBAAmB;AACnB,cAAc,YAAY,CAAC;AAC3B,mBAAmB;AACnB,cAAc,wBAAwB,CAAC","sourcesContent":["// src/index.ts\r\n\r\n// ─── Types ───────────────────────────────────────────\r\nexport * from './types.js';\r\nexport {default as Type} from './type.js';\r\nexport {default as TypeCode} from './type-code.js';\r\n\r\n// ─── Utilities ───────────────────────────────────────\r\nexport * from './utilities.js';\r\nexport * from './string.js';\r\nexport * from './math.js';\r\nexport {default as CancellablePromise} from \"./cancellable-promise.js\";\r\n\r\n// ─── Data Structures ────────────────────────────────\r\nexport {default as KeyValuePair} from './key-value-pair.js';\r\nexport {default as Order} from './order.js';\r\n\r\n// ─── Async & Timing ─────────────────────────────────\r\nexport {default as Timer} from './timer.js';\r\nexport {default as TimeSpan} from './timespan.js';\r\nexport {default as Stopwatch} from './stopwatch.js';\r\nexport {default as AsyncPoolExecutor} from './async-pool-executor.js';\r\n\r\n// ─── Patterns ────────────────────────────────────────\r\nexport {default as Lazy} from './lazy.js';\r\nexport {default as from} from './collections/from.js';\r\nexport {EventBus, Event} from './event-bus.js';\r\n\r\n// ─── Draft ────────────────────────────────────────\r\nexport {default as draft} from './draft.js';\r\n\r\n// ─── Web ─────────────────────────────────────────────\r\nexport {default as CleanURLSearchParams} from './clean-url-search-params.js';\r\n/** @deprecated */\r\nexport {ajaxSubmit, ajaxSubmission, submitForm, formToObject} from './browser/index.js';\r\n\r\n\r\n\r\n// ─── Deprecated ──────────────────────────────────────\r\n/** @deprecated */\r\nexport * from './array.js';\r\n/** @deprecated */\r\nexport * from './collections/index.js';"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"key-value-pair.js","sourceRoot":"","sources":["../../src/key-value-pair.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"key-value-pair.js","sourceRoot":"","sources":["../../src/key-value-pair.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,YAAY;IAC7B,IAAI,KAAK;QACL,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,IAAI,GAAG;QACH,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;IAKD,YAAY,GAAS,EAAE,KAAa;QAChC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACxB,CAAC;CAGJ","sourcesContent":["/**\r\n * Represents a pair of key and value.\r\n *\r\n * @template TKey The type of the key.\r\n * @template TValue The type of the value.\r\n */\r\nexport default class KeyValuePair<TKey, TValue> {\r\n get value(): TValue {\r\n return this._value;\r\n }\r\n\r\n get key(): TKey {\r\n return this._key;\r\n }\r\n\r\n private readonly _key: TKey;\r\n private readonly _value: TValue;\r\n\r\n constructor(key: TKey, value: TValue) {\r\n this._key = key;\r\n this._value = value;\r\n }\r\n\r\n\r\n}"]}
|
package/dist/esm/lazy.js
CHANGED
package/dist/esm/lazy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lazy.js","sourceRoot":"","sources":["../../src/lazy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lazy.js","sourceRoot":"","sources":["../../src/lazy.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,IAAI;IAKrB,YAAY,MAAmB;QAJvB,kBAAa,GAAG,KAAK,CAAC;QACtB,WAAM,GAAgB,IAAI,CAAC;QAI/B,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;IACjC,CAAC;IAED,IAAI,YAAY;QACZ,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED,IAAW,KAAK;QACZ,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACpC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC9B,CAAC;QACD,OAAO,IAAI,CAAC,MAAW,CAAC;IAC5B,CAAC;IAED,KAAK;QACD,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACvB,CAAC;CACJ","sourcesContent":["import type {Nullable, Supplier} from \"./types.js\";\r\n\r\n\r\n/**\r\n * Represents a lazy value that is created only when it is accessed for the first time.\r\n * @template T The type of the lazy value.\r\n */\r\nexport default class Lazy<T> {\r\n private _valueCreated = false;\r\n private _value: Nullable<T> = null;\r\n private readonly _factoryMethod: Supplier<T>;\r\n\r\n constructor(getter: Supplier<T>) {\r\n this._factoryMethod = getter;\r\n }\r\n\r\n get valueCreated(): boolean {\r\n return this._valueCreated;\r\n }\r\n\r\n public get value(): T {\r\n if (!this._valueCreated) {\r\n this._value = this._factoryMethod();\r\n this._valueCreated = true;\r\n }\r\n return this._value as T;\r\n }\r\n\r\n reset(): void {\r\n this._valueCreated = false;\r\n this._value = null;\r\n }\r\n}"]}
|
package/dist/esm/math.js
CHANGED
|
@@ -1,6 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Linearly interpolates a number between two ranges.
|
|
3
|
+
*
|
|
4
|
+
* @param {number} n - The number to interpolate.
|
|
5
|
+
* @param {number} inMin - The minimum value of the input range.
|
|
6
|
+
* @param {number} inMax - The maximum value of the input range.
|
|
7
|
+
* @param {number} outMin - The minimum value of the output range.
|
|
8
|
+
* @param {number} outMax - The maximum value of the output range.
|
|
9
|
+
*
|
|
10
|
+
* @return {number} - The interpolated value.
|
|
11
|
+
*/
|
|
1
12
|
export function lerp(n, inMin, inMax, outMin, outMax) {
|
|
2
13
|
return outMin + (outMax - outMin) * ((n - inMin) / (inMax - inMin));
|
|
3
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Clamps a number between a minimum and maximum value.
|
|
17
|
+
*
|
|
18
|
+
* @param {number} n - The value to be clamped.
|
|
19
|
+
* @param {number} min - The minimum value.
|
|
20
|
+
* @param {number} max - The maximum value.
|
|
21
|
+
* @return {number} The clamped value.
|
|
22
|
+
*/
|
|
4
23
|
export function clamp(n, min, max) {
|
|
5
24
|
if (n <= min)
|
|
6
25
|
return min;
|
package/dist/esm/math.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"math.js","sourceRoot":"","sources":["../../src/math.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"math.js","sourceRoot":"","sources":["../../src/math.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,UAAU,IAAI,CAAC,CAAS,EAAE,KAAa,EAAE,KAAa,EAAE,MAAc,EAAE,MAAc;IACxF,OAAO,MAAM,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAA;AACvE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,KAAK,CAAC,CAAS,EAAE,GAAW,EAAE,GAAW;IACrD,IAAI,CAAC,IAAI,GAAG;QACR,OAAO,GAAG,CAAC;IACf,IAAI,CAAC,IAAI,GAAG;QACR,OAAO,GAAG,CAAC;IACf,OAAO,CAAC,CAAA;AACZ,CAAC","sourcesContent":["/**\r\n * Linearly interpolates a number between two ranges.\r\n *\r\n * @param {number} n - The number to interpolate.\r\n * @param {number} inMin - The minimum value of the input range.\r\n * @param {number} inMax - The maximum value of the input range.\r\n * @param {number} outMin - The minimum value of the output range.\r\n * @param {number} outMax - The maximum value of the output range.\r\n *\r\n * @return {number} - The interpolated value.\r\n */\r\nexport function lerp(n: number, inMin: number, inMax: number, outMin: number, outMax: number): number {\r\n return outMin + (outMax - outMin) * ((n - inMin) / (inMax - inMin))\r\n}\r\n\r\n/**\r\n * Clamps a number between a minimum and maximum value.\r\n *\r\n * @param {number} n - The value to be clamped.\r\n * @param {number} min - The minimum value.\r\n * @param {number} max - The maximum value.\r\n * @return {number} The clamped value.\r\n */\r\nexport function clamp(n: number, min: number, max: number): number {\r\n if (n <= min)\r\n return min;\r\n if (n >= max)\r\n return max;\r\n return n\r\n}\r\n"]}
|
package/dist/esm/order.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"order.js","sourceRoot":"","sources":["../../src/order.ts"],"names":[],"mappings":"AAAA,IAAK,KAGJ;AAHD,WAAK,KAAK;IACN,0BAAiB,CAAA;IACjB,4BAAmB,CAAA;AACvB,CAAC,EAHI,KAAK,KAAL,KAAK,QAGT;AAED,eAAe,KAAK,CAAC"}
|
|
1
|
+
{"version":3,"file":"order.js","sourceRoot":"","sources":["../../src/order.ts"],"names":[],"mappings":"AAAA,IAAK,KAGJ;AAHD,WAAK,KAAK;IACN,0BAAiB,CAAA;IACjB,4BAAmB,CAAA;AACvB,CAAC,EAHI,KAAK,KAAL,KAAK,QAGT;AAED,eAAe,KAAK,CAAC","sourcesContent":["enum Order {\r\n Ascending = \"asc\",\r\n Descending = \"desc\"\r\n}\r\n\r\nexport default Order;"]}
|
package/dist/esm/parse.js
CHANGED
|
@@ -1,8 +1,38 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// HELPERS
|
|
3
|
+
// ============================================
|
|
1
4
|
function stripThousands(value, separator) {
|
|
2
5
|
if (!separator)
|
|
3
6
|
return value;
|
|
4
7
|
return value.split(separator).join("");
|
|
5
8
|
}
|
|
9
|
+
// ============================================
|
|
10
|
+
// parseInteger
|
|
11
|
+
// ============================================
|
|
12
|
+
/**
|
|
13
|
+
* Safely parses a value into an integer.
|
|
14
|
+
* Returns `null` if the value cannot be parsed.
|
|
15
|
+
*
|
|
16
|
+
* - `null` or `undefined` → `null`
|
|
17
|
+
* - `number` → returned as-is (floats are truncated)
|
|
18
|
+
* - `string` → parsed with the given options
|
|
19
|
+
*
|
|
20
|
+
* @param value - The value to parse.
|
|
21
|
+
* @param options - Optional parsing configuration.
|
|
22
|
+
* @returns The parsed integer, or `null` on failure.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* parseInteger(42) // 42
|
|
27
|
+
* parseInteger(3.7) // 3
|
|
28
|
+
* parseInteger(null) // null
|
|
29
|
+
* parseInteger(undefined) // null
|
|
30
|
+
* parseInteger("42") // 42
|
|
31
|
+
* parseInteger("1.234.567", { thousandsSeparator: "." }) // 1234567
|
|
32
|
+
* parseInteger("FF", { radix: 16 }) // 255
|
|
33
|
+
* parseInteger("abc") // null
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
6
36
|
export function parseInteger(value, options = {}) {
|
|
7
37
|
if (value === null || value === undefined)
|
|
8
38
|
return null;
|
|
@@ -18,6 +48,35 @@ export function parseInteger(value, options = {}) {
|
|
|
18
48
|
const parsed = Number.parseInt(cleaned, radix);
|
|
19
49
|
return Number.isNaN(parsed) ? null : parsed;
|
|
20
50
|
}
|
|
51
|
+
// ============================================
|
|
52
|
+
// parseDecimal
|
|
53
|
+
// ============================================
|
|
54
|
+
/**
|
|
55
|
+
* Safely parses a value into a floating-point number.
|
|
56
|
+
* Returns `null` if the value cannot be parsed.
|
|
57
|
+
*
|
|
58
|
+
* - `null` or `undefined` → `null`
|
|
59
|
+
* - `number` → returned as-is (if finite)
|
|
60
|
+
* - `string` → parsed with the given options
|
|
61
|
+
*
|
|
62
|
+
* Supports custom decimal and thousands separators, making it suitable
|
|
63
|
+
* for both US (`1,234.56`) and EU (`1.234,56`) number formats.
|
|
64
|
+
*
|
|
65
|
+
* @param value - The value to parse.
|
|
66
|
+
* @param options - Optional parsing configuration.
|
|
67
|
+
* @returns The parsed float, or `null` on failure.
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```ts
|
|
71
|
+
* parseDecimal(3.14) // 3.14
|
|
72
|
+
* parseDecimal(null) // null
|
|
73
|
+
* parseDecimal(undefined) // null
|
|
74
|
+
* parseDecimal("3.14") // 3.14
|
|
75
|
+
* parseDecimal("3,14", { decimalSeparator: "," }) // 3.14
|
|
76
|
+
* parseDecimal("1.234,56", { decimalSeparator: ",", thousandsSeparator: "." }) // 1234.56
|
|
77
|
+
* parseDecimal("abc") // null
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
21
80
|
export function parseDecimal(value, options = {}) {
|
|
22
81
|
if (value === null || value === undefined)
|
|
23
82
|
return null;
|
|
@@ -39,8 +98,45 @@ export function parseDecimal(value, options = {}) {
|
|
|
39
98
|
const parsed = Number.parseFloat(cleaned);
|
|
40
99
|
return Number.isNaN(parsed) || !Number.isFinite(parsed) ? null : parsed;
|
|
41
100
|
}
|
|
101
|
+
// ============================================
|
|
102
|
+
// parseBoolean
|
|
103
|
+
// ============================================
|
|
42
104
|
const DEFAULT_TRUTHY = ["true", "1", "yes", "si", "sí", "on"];
|
|
43
105
|
const DEFAULT_FALSY = ["false", "0", "no", "off"];
|
|
106
|
+
/**
|
|
107
|
+
* Safely parses a value into a boolean.
|
|
108
|
+
* Returns `null` if the value cannot be interpreted as boolean.
|
|
109
|
+
*
|
|
110
|
+
* - `null` or `undefined` → `null`
|
|
111
|
+
* - `boolean` → returned as-is
|
|
112
|
+
* - `number` → `0` is `false`, any other finite number is `true`
|
|
113
|
+
* - `string` → matched case-insensitively against known truthy/falsy values
|
|
114
|
+
*
|
|
115
|
+
* Default truthy: `"true"`, `"1"`, `"yes"`, `"si"`, `"sí"`, `"on"`
|
|
116
|
+
* Default falsy: `"false"`, `"0"`, `"no"`, `"off"`
|
|
117
|
+
*
|
|
118
|
+
* @param value - The value to parse.
|
|
119
|
+
* @param options - Optional parsing configuration.
|
|
120
|
+
* @returns The parsed boolean, or `null` on failure.
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* ```ts
|
|
124
|
+
* parseBoolean(true) // true
|
|
125
|
+
* parseBoolean(false) // false
|
|
126
|
+
* parseBoolean(1) // true
|
|
127
|
+
* parseBoolean(0) // false
|
|
128
|
+
* parseBoolean(null) // null
|
|
129
|
+
* parseBoolean(undefined) // null
|
|
130
|
+
* parseBoolean("yes") // true
|
|
131
|
+
* parseBoolean("no") // false
|
|
132
|
+
* parseBoolean("sí") // true
|
|
133
|
+
* parseBoolean("TRUE") // true
|
|
134
|
+
* parseBoolean("oui") // null
|
|
135
|
+
* parseBoolean("oui", { extraTruthy: ["oui"] }) // true
|
|
136
|
+
* parseBoolean("nein", { extraFalsy: ["nein"] }) // false
|
|
137
|
+
* parseBoolean("whatever") // null
|
|
138
|
+
* ```
|
|
139
|
+
*/
|
|
44
140
|
export function parseBoolean(value, options = {}) {
|
|
45
141
|
if (value === null || value === undefined)
|
|
46
142
|
return null;
|
package/dist/esm/parse.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/parse.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/parse.ts"],"names":[],"mappings":"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","sourcesContent":["// parse.ts\r\n/**\r\n * Options for {@link parseBoolean}.\r\n */\r\nexport interface ParseBooleanOptions {\r\n /**\r\n * Additional strings to consider as `true`.\r\n * These are matched case-insensitively.\r\n * @example [\"oui\", \"ja\"]\r\n */\r\n extraTruthy?: string[];\r\n\r\n /**\r\n * Additional strings to consider as `false`.\r\n * These are matched case-insensitively.\r\n * @example [\"non\", \"nein\"]\r\n */\r\n extraFalsy?: string[];\r\n}\r\n\r\n/**\r\n * Options for {@link parseInteger}.\r\n */\r\nexport interface ParseIntegerOptions {\r\n /**\r\n * Numeric base for conversion.\r\n * @default 10\r\n */\r\n radix?: number;\r\n\r\n /**\r\n * Thousands separator to strip before parsing.\r\n * @example \".\" for \"1.234.567\" → 1234567\r\n * @example \",\" for \"1,234,567\" → 1234567\r\n */\r\n thousandsSeparator?: string;\r\n}\r\n\r\n/**\r\n * Options for {@link parseDecimal}.\r\n */\r\nexport interface ParseDecimalOptions {\r\n /**\r\n * Character used as decimal point.\r\n * @default \".\"\r\n */\r\n decimalSeparator?: \".\" | \",\";\r\n\r\n /**\r\n * Thousands separator to strip before parsing.\r\n * @example \".\" for \"1.234,56\" (EU format)\r\n * @example \",\" for \"1,234.56\" (US format)\r\n */\r\n thousandsSeparator?: string;\r\n}\r\n\r\n// ============================================\r\n// HELPERS\r\n// ============================================\r\n\r\nfunction stripThousands(value: string, separator?: string): string {\r\n if (!separator) return value;\r\n return value.split(separator).join(\"\");\r\n}\r\n\r\n// ============================================\r\n// parseInteger\r\n// ============================================\r\n\r\n/**\r\n * Safely parses a value into an integer.\r\n * Returns `null` if the value cannot be parsed.\r\n *\r\n * - `null` or `undefined` → `null`\r\n * - `number` → returned as-is (floats are truncated)\r\n * - `string` → parsed with the given options\r\n *\r\n * @param value - The value to parse.\r\n * @param options - Optional parsing configuration.\r\n * @returns The parsed integer, or `null` on failure.\r\n *\r\n * @example\r\n * ```ts\r\n * parseInteger(42) // 42\r\n * parseInteger(3.7) // 3\r\n * parseInteger(null) // null\r\n * parseInteger(undefined) // null\r\n * parseInteger(\"42\") // 42\r\n * parseInteger(\"1.234.567\", { thousandsSeparator: \".\" }) // 1234567\r\n * parseInteger(\"FF\", { radix: 16 }) // 255\r\n * parseInteger(\"abc\") // null\r\n * ```\r\n */\r\nexport function parseInteger(\r\n value: string | number | null | undefined,\r\n options: ParseIntegerOptions = {}\r\n): number | null {\r\n if (value === null || value === undefined) return null;\r\n\r\n if (typeof value === \"number\") {\r\n return Number.isFinite(value) ? Math.trunc(value) : null;\r\n }\r\n\r\n const { radix = 10, thousandsSeparator } = options;\r\n\r\n const cleaned = stripThousands(value.trim(), thousandsSeparator);\r\n\r\n if (cleaned === \"\") return null;\r\n if (radix === 10 && !/^[+-]?\\d+$/.test(cleaned)) return null;\r\n\r\n const parsed = Number.parseInt(cleaned, radix);\r\n\r\n return Number.isNaN(parsed) ? null : parsed;\r\n}\r\n\r\n// ============================================\r\n// parseDecimal\r\n// ============================================\r\n\r\n/**\r\n * Safely parses a value into a floating-point number.\r\n * Returns `null` if the value cannot be parsed.\r\n *\r\n * - `null` or `undefined` → `null`\r\n * - `number` → returned as-is (if finite)\r\n * - `string` → parsed with the given options\r\n *\r\n * Supports custom decimal and thousands separators, making it suitable\r\n * for both US (`1,234.56`) and EU (`1.234,56`) number formats.\r\n *\r\n * @param value - The value to parse.\r\n * @param options - Optional parsing configuration.\r\n * @returns The parsed float, or `null` on failure.\r\n *\r\n * @example\r\n * ```ts\r\n * parseDecimal(3.14) // 3.14\r\n * parseDecimal(null) // null\r\n * parseDecimal(undefined) // null\r\n * parseDecimal(\"3.14\") // 3.14\r\n * parseDecimal(\"3,14\", { decimalSeparator: \",\" }) // 3.14\r\n * parseDecimal(\"1.234,56\", { decimalSeparator: \",\", thousandsSeparator: \".\" }) // 1234.56\r\n * parseDecimal(\"abc\") // null\r\n * ```\r\n */\r\nexport function parseDecimal(\r\n value: string | number | null | undefined,\r\n options: ParseDecimalOptions = {}\r\n): number | null {\r\n if (value === null || value === undefined) return null;\r\n\r\n if (typeof value === \"number\") {\r\n return Number.isFinite(value) ? value : null;\r\n }\r\n\r\n const { decimalSeparator = \".\", thousandsSeparator } = options;\r\n\r\n let cleaned = stripThousands(value.trim(), thousandsSeparator);\r\n\r\n if (cleaned === \"\") return null;\r\n\r\n if (decimalSeparator === \",\") {\r\n const commaCount = (cleaned.match(/,/g) || []).length;\r\n if (commaCount > 1) return null;\r\n cleaned = cleaned.replace(\",\", \".\");\r\n }\r\n\r\n if (!/^[+-]?\\d+(\\.\\d+)?$/.test(cleaned)) return null;\r\n\r\n const parsed = Number.parseFloat(cleaned);\r\n\r\n return Number.isNaN(parsed) || !Number.isFinite(parsed) ? null : parsed;\r\n}\r\n\r\n// ============================================\r\n// parseBoolean\r\n// ============================================\r\n\r\nconst DEFAULT_TRUTHY = [\"true\", \"1\", \"yes\", \"si\", \"sí\", \"on\"];\r\nconst DEFAULT_FALSY = [\"false\", \"0\", \"no\", \"off\"];\r\n\r\n/**\r\n * Safely parses a value into a boolean.\r\n * Returns `null` if the value cannot be interpreted as boolean.\r\n *\r\n * - `null` or `undefined` → `null`\r\n * - `boolean` → returned as-is\r\n * - `number` → `0` is `false`, any other finite number is `true`\r\n * - `string` → matched case-insensitively against known truthy/falsy values\r\n *\r\n * Default truthy: `\"true\"`, `\"1\"`, `\"yes\"`, `\"si\"`, `\"sí\"`, `\"on\"`\r\n * Default falsy: `\"false\"`, `\"0\"`, `\"no\"`, `\"off\"`\r\n *\r\n * @param value - The value to parse.\r\n * @param options - Optional parsing configuration.\r\n * @returns The parsed boolean, or `null` on failure.\r\n *\r\n * @example\r\n * ```ts\r\n * parseBoolean(true) // true\r\n * parseBoolean(false) // false\r\n * parseBoolean(1) // true\r\n * parseBoolean(0) // false\r\n * parseBoolean(null) // null\r\n * parseBoolean(undefined) // null\r\n * parseBoolean(\"yes\") // true\r\n * parseBoolean(\"no\") // false\r\n * parseBoolean(\"sí\") // true\r\n * parseBoolean(\"TRUE\") // true\r\n * parseBoolean(\"oui\") // null\r\n * parseBoolean(\"oui\", { extraTruthy: [\"oui\"] }) // true\r\n * parseBoolean(\"nein\", { extraFalsy: [\"nein\"] }) // false\r\n * parseBoolean(\"whatever\") // null\r\n * ```\r\n */\r\nexport function parseBoolean(\r\n value: string | number | boolean | null | undefined,\r\n options: ParseBooleanOptions = {}\r\n): boolean | null {\r\n if (value === null || value === undefined) return null;\r\n\r\n if (typeof value === \"boolean\") return value;\r\n\r\n if (typeof value === \"number\") {\r\n return Number.isFinite(value) ? value !== 0 : null;\r\n }\r\n\r\n const { extraTruthy = [], extraFalsy = [] } = options;\r\n\r\n const normalized = value.trim().toLowerCase();\r\n\r\n if (normalized === \"\") return null;\r\n\r\n const truthy = [...DEFAULT_TRUTHY, ...extraTruthy.map((s) => s.toLowerCase())];\r\n const falsy = [...DEFAULT_FALSY, ...extraFalsy.map((s) => s.toLowerCase())];\r\n\r\n if (truthy.includes(normalized)) return true;\r\n if (falsy.includes(normalized)) return false;\r\n\r\n return null;\r\n}"]}
|
package/dist/esm/patch.js
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Devuelve un Map donde:
|
|
3
|
+
* - clave -> null (método añadido nuevo)
|
|
4
|
+
* - clave -> descriptorOriginal (método sustituido)
|
|
5
|
+
*/
|
|
1
6
|
export function patch(targetOrCtor, fns) {
|
|
2
7
|
const target = typeof targetOrCtor === "function" ? targetOrCtor.prototype : targetOrCtor;
|
|
3
8
|
const result = new Map();
|
|
@@ -16,11 +21,14 @@ export function patch(targetOrCtor, fns) {
|
|
|
16
21
|
});
|
|
17
22
|
result.set(key, prev ?? null);
|
|
18
23
|
}
|
|
19
|
-
catch {
|
|
24
|
+
catch { /* ignorar */
|
|
20
25
|
}
|
|
21
26
|
}
|
|
22
27
|
return result;
|
|
23
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Revierte un patch a partir del mapa devuelto por `patch`.
|
|
31
|
+
*/
|
|
24
32
|
export function unpatch(targetOrCtor, changes) {
|
|
25
33
|
const target = typeof targetOrCtor === "function" ? targetOrCtor.prototype : targetOrCtor;
|
|
26
34
|
for (const [key, prev] of changes) {
|
|
@@ -33,7 +41,7 @@ export function unpatch(targetOrCtor, changes) {
|
|
|
33
41
|
Object.defineProperty(target, key, prev);
|
|
34
42
|
}
|
|
35
43
|
}
|
|
36
|
-
catch {
|
|
44
|
+
catch { /* ignorar */
|
|
37
45
|
}
|
|
38
46
|
}
|
|
39
47
|
}
|
package/dist/esm/patch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patch.js","sourceRoot":"","sources":["../../src/patch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"patch.js","sourceRoot":"","sources":["../../src/patch.ts"],"names":[],"mappings":"AAoBA;;;;GAIG;AACH,MAAM,UAAU,KAAK,CACjB,YAAiB,EACjB,GAAmB;IAEnB,MAAM,MAAM,GAAG,OAAO,YAAY,KAAK,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;IAE1F,MAAM,MAAM,GAAG,IAAI,GAAG,EAA0C,CAAC;IACjE,MAAM,OAAO,GACT,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAQ,CAAC;IAEzE,KAAK,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,UAAyB,GAAG,IAAe;YACtD,OAAQ,EAAU,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;QACtC,CAAC,CAAC;QACF,IAAI,CAAC;YACD,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE;gBAC/B,KAAK,EAAE,MAAM;gBACb,QAAQ,EAAE,IAAI;gBACd,YAAY,EAAE,IAAI;gBAClB,UAAU,EAAE,KAAK;aACpB,CAAC,CAAC;YACH,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC,CAAC,aAAa;QACvB,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAYD;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,YAAiB,EAAE,OAAoD;IAC3F,MAAM,MAAM,GAAG,OAAO,YAAY,KAAK,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;IAC1F,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;QAChC,IAAI,CAAC;YACD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAChB,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;oBAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;YAC9E,CAAC;iBAAM,CAAC;gBACJ,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YAC7C,CAAC;QACL,CAAC;QAAC,MAAM,CAAC,CAAC,aAAa;QACvB,CAAC;IACL,CAAC;AACL,CAAC","sourcesContent":["import type {Constructor} from \"./types.js\";\r\n\r\nexport type PureMethod<T extends object, A extends any[] = any[], R = any> =\r\n (obj: T, ...args: A) => R;\r\n\r\nexport type PatchSpec<T extends object> =\r\n | Record<string, PureMethod<T, any[], any>>\r\n | Map<PropertyKey, PureMethod<T, any[], any>>;\r\n\r\n\r\nexport function patch<C extends Constructor<any>>(\r\n targetOrCtor: C,\r\n fns: PatchSpec<InstanceType<C>>\r\n): Map<PropertyKey, PropertyDescriptor | null>;\r\n\r\nexport function patch<T extends object>(\r\n targetOrCtor: T,\r\n fns: PatchSpec<T>\r\n): Map<PropertyKey, PropertyDescriptor | null>;\r\n\r\n/**\r\n * Devuelve un Map donde:\r\n * - clave -> null (método añadido nuevo)\r\n * - clave -> descriptorOriginal (método sustituido)\r\n */\r\nexport function patch(\r\n targetOrCtor: any,\r\n fns: PatchSpec<any>\r\n): Map<PropertyKey, PropertyDescriptor | null> {\r\n const target = typeof targetOrCtor === \"function\" ? targetOrCtor.prototype : targetOrCtor;\r\n\r\n const result = new Map<PropertyKey, PropertyDescriptor | null>();\r\n const entries: Array<[PropertyKey, PureMethod<any>]> =\r\n fns instanceof Map ? [...fns.entries()] : Object.entries(fns) as any;\r\n\r\n for (const [key, fn] of entries) {\r\n const prev = Object.getOwnPropertyDescriptor(target, key);\r\n const method = function (this: unknown, ...args: unknown[]) {\r\n return (fn as any)(this, ...args);\r\n };\r\n try {\r\n Object.defineProperty(target, key, {\r\n value: method,\r\n writable: true,\r\n configurable: true,\r\n enumerable: false,\r\n });\r\n result.set(key, prev ?? null);\r\n } catch { /* ignorar */\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n// Overloads unpatch\r\nexport function unpatch<C extends Constructor<any>>(\r\n targetOrCtor: C,\r\n changes: Map<PropertyKey, PropertyDescriptor | null>\r\n): void;\r\nexport function unpatch<T extends object>(\r\n targetOrCtor: T,\r\n changes: Map<PropertyKey, PropertyDescriptor | null>\r\n): void;\r\n\r\n/**\r\n * Revierte un patch a partir del mapa devuelto por `patch`.\r\n */\r\nexport function unpatch(targetOrCtor: any, changes: Map<PropertyKey, PropertyDescriptor | null>): void {\r\n const target = typeof targetOrCtor === \"function\" ? targetOrCtor.prototype : targetOrCtor;\r\n for (const [key, prev] of changes) {\r\n try {\r\n if (prev === null) {\r\n if (Object.prototype.hasOwnProperty.call(target, key)) delete target[key];\r\n } else {\r\n Object.defineProperty(target, key, prev);\r\n }\r\n } catch { /* ignorar */\r\n }\r\n }\r\n}"]}
|