@rzl-zone/build-tools 0.0.8 → 0.0.10
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/.references/index.d.cts +1 -1
- package/dist/.references/index.d.ts +1 -1
- package/dist/bundler/rolldown.cjs +2 -2
- package/dist/bundler/rolldown.d.cts +2 -2
- package/dist/bundler/rolldown.d.ts +2 -2
- package/dist/bundler/rolldown.js +1 -1
- package/dist/bundler/tsdown.cjs +3 -3
- package/dist/bundler/tsdown.d.cts +2 -2
- package/dist/bundler/tsdown.d.ts +2 -2
- package/dist/bundler/tsdown.js +3 -3
- package/dist/bundler/utils.cjs +2 -2
- package/dist/bundler/utils.d.cts +2 -2
- package/dist/bundler/utils.d.ts +2 -2
- package/dist/bundler/utils.js +2 -2
- package/dist/{client-C0ZDdv36.js → client-BmfdVI22.js} +3 -3
- package/dist/client-BmfdVI22.js.map +1 -0
- package/dist/{client-BczBMDS6.cjs → client-DnTjQyyo.cjs} +3 -3
- package/dist/client-DnTjQyyo.cjs.map +1 -0
- package/dist/commander-kit/index.cjs +5 -5
- package/dist/commander-kit/index.cjs.map +1 -1
- package/dist/commander-kit/index.d.cts +3 -3
- package/dist/commander-kit/index.d.ts +3 -3
- package/dist/commander-kit/index.js +5 -5
- package/dist/commander-kit/index.js.map +1 -1
- package/dist/{extra-CDUxrgcT.d.ts → extra-CYpD3D9p.d.ts} +2 -2
- package/dist/{extra-CnJhk-pp.d.cts → extra-Dc_eIyiW.d.cts} +2 -2
- package/dist/{fast-globe-options-B4edSsWz.d.cts → fast-globe-options-BtIrCNb6.d.cts} +3 -3
- package/dist/{fast-globe-options-CMxk8gD9.d.ts → fast-globe-options-CZ-9wIKV.d.ts} +3 -3
- package/dist/{helper-2m5t07Qe.js → helper-CWU8QYq3.js} +2 -2
- package/dist/{helper-2m5t07Qe.js.map → helper-CWU8QYq3.js.map} +1 -1
- package/dist/{helper-BRO-s2fI.cjs → helper-DvCvgDxy.cjs} +2 -2
- package/dist/{helper-BRO-s2fI.cjs.map → helper-DvCvgDxy.cjs.map} +1 -1
- package/dist/{identity-1Zk_fLSI.cjs → identity-D192lL-_.cjs} +6 -6
- package/dist/{identity-1Zk_fLSI.cjs.map → identity-D192lL-_.cjs.map} +1 -1
- package/dist/{identity-CCGqrTRL.js → identity-xuDCNgfm.js} +6 -6
- package/dist/{identity-CCGqrTRL.js.map → identity-xuDCNgfm.js.map} +1 -1
- package/dist/{index-De-ymoL3.d.cts → index-1FKLQ7ah.d.cts} +2 -2
- package/dist/{index-B3ChWfIR.d.cts → index-CEsO_rxz.d.ts} +2 -2
- package/dist/{index-DPGJBhEK.d.ts → index-DW1JFluR.d.cts} +2 -2
- package/dist/{index-C-jXEIZS.d.ts → index-qft-a5kh.d.ts} +2 -2
- package/dist/index.cjs +6 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -5
- package/dist/index.d.ts +5 -5
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/dist/{package-banner-BAbZghTB.cjs → package-banner-BHyF8RdG.cjs} +5 -5
- package/dist/{package-banner-BAbZghTB.cjs.map → package-banner-BHyF8RdG.cjs.map} +1 -1
- package/dist/{package-banner-BM84W-TO.js → package-banner-BmLNyezO.js} +5 -5
- package/dist/{package-banner-BM84W-TO.js.map → package-banner-BmLNyezO.js.map} +1 -1
- package/dist/{server-DH801yY1.js → server-BA7ruG1h.js} +3 -3
- package/dist/{server-DH801yY1.js.map → server-BA7ruG1h.js.map} +1 -1
- package/dist/{server-DL-uLx4N.cjs → server-DZvrqlyy.cjs} +3 -3
- package/dist/{server-DL-uLx4N.cjs.map → server-DZvrqlyy.cjs.map} +1 -1
- package/dist/utils/client.cjs +2 -2
- package/dist/utils/client.d.cts +25 -7
- package/dist/utils/client.d.ts +25 -7
- package/dist/utils/client.js +2 -2
- package/dist/utils/server.cjs +2 -2
- package/dist/utils/server.d.cts +2 -2
- package/dist/utils/server.d.ts +2 -2
- package/dist/utils/server.js +2 -2
- package/package.json +3 -3
- package/dist/client-BczBMDS6.cjs.map +0 -1
- package/dist/client-C0ZDdv36.js.map +0 -1
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* ========================================================================
|
|
3
3
|
* @rzl-zone/build-tools
|
|
4
4
|
* ------------------------------------------------------------------------
|
|
5
|
-
* Version: `0.0.
|
|
5
|
+
* Version: `0.0.10`
|
|
6
6
|
* Author: `Rizalvin Dwiky <rizalvindwiky1998@gmail.com>`
|
|
7
7
|
* Repository: `https://github.com/rzl-zone/rzl-zone/tree/main/packages/build-tools`
|
|
8
8
|
* ========================================================================
|
|
@@ -991,4 +991,4 @@ type OverrideTypes<T, U extends StrictOverrideConstraint<T, U, Options["strictKe
|
|
|
991
991
|
*/
|
|
992
992
|
type StrictAwaitable<T> = T | Promise<T>;
|
|
993
993
|
export { OmitStrict as a, PrettifyOptions as c, NonUndefined as i, StrictAwaitable as l, Arrayable as n, OverrideTypes as o, DefaultPrettifyOptions as r, Prettify as s, AnyString as t };
|
|
994
|
-
//# sourceMappingURL=extra-
|
|
994
|
+
//# sourceMappingURL=extra-CYpD3D9p.d.ts.map
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* ========================================================================
|
|
3
3
|
* @rzl-zone/build-tools
|
|
4
4
|
* ------------------------------------------------------------------------
|
|
5
|
-
* Version: `0.0.
|
|
5
|
+
* Version: `0.0.10`
|
|
6
6
|
* Author: `Rizalvin Dwiky <rizalvindwiky1998@gmail.com>`
|
|
7
7
|
* Repository: `https://github.com/rzl-zone/rzl-zone/tree/main/packages/build-tools`
|
|
8
8
|
* ========================================================================
|
|
@@ -991,4 +991,4 @@ type OverrideTypes<T, U extends StrictOverrideConstraint<T, U, Options["strictKe
|
|
|
991
991
|
*/
|
|
992
992
|
type StrictAwaitable<T> = T | Promise<T>;
|
|
993
993
|
export { OmitStrict as a, PrettifyOptions as c, NonUndefined as i, StrictAwaitable as l, Arrayable as n, OverrideTypes as o, DefaultPrettifyOptions as r, Prettify as s, AnyString as t };
|
|
994
|
-
//# sourceMappingURL=extra-
|
|
994
|
+
//# sourceMappingURL=extra-Dc_eIyiW.d.cts.map
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
* ========================================================================
|
|
3
3
|
* @rzl-zone/build-tools
|
|
4
4
|
* ------------------------------------------------------------------------
|
|
5
|
-
* Version: `0.0.
|
|
5
|
+
* Version: `0.0.10`
|
|
6
6
|
* Author: `Rizalvin Dwiky <rizalvindwiky1998@gmail.com>`
|
|
7
7
|
* Repository: `https://github.com/rzl-zone/rzl-zone/tree/main/packages/build-tools`
|
|
8
8
|
* ========================================================================
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import { a as OmitStrict, s as Prettify } from "./extra-
|
|
11
|
+
import { a as OmitStrict, s as Prettify } from "./extra-Dc_eIyiW.cjs";
|
|
12
12
|
import * as fg from "fast-glob";
|
|
13
13
|
|
|
14
14
|
type IfTrueGeneric<T extends boolean, K> = T extends true ? K : never;
|
|
@@ -123,4 +123,4 @@ type PatternConfig<FilesOnly extends boolean = false, ForceUnique extends boolea
|
|
|
123
123
|
*/
|
|
124
124
|
declare const defaultPatternOptions: PatternOptions;
|
|
125
125
|
export { PatternOptions as n, defaultPatternOptions as r, PatternConfig as t };
|
|
126
|
-
//# sourceMappingURL=fast-globe-options-
|
|
126
|
+
//# sourceMappingURL=fast-globe-options-BtIrCNb6.d.cts.map
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
* ========================================================================
|
|
3
3
|
* @rzl-zone/build-tools
|
|
4
4
|
* ------------------------------------------------------------------------
|
|
5
|
-
* Version: `0.0.
|
|
5
|
+
* Version: `0.0.10`
|
|
6
6
|
* Author: `Rizalvin Dwiky <rizalvindwiky1998@gmail.com>`
|
|
7
7
|
* Repository: `https://github.com/rzl-zone/rzl-zone/tree/main/packages/build-tools`
|
|
8
8
|
* ========================================================================
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import { a as OmitStrict, s as Prettify } from "./extra-
|
|
11
|
+
import { a as OmitStrict, s as Prettify } from "./extra-CYpD3D9p.js";
|
|
12
12
|
import * as fg from "fast-glob";
|
|
13
13
|
|
|
14
14
|
type IfTrueGeneric<T extends boolean, K> = T extends true ? K : never;
|
|
@@ -123,4 +123,4 @@ type PatternConfig<FilesOnly extends boolean = false, ForceUnique extends boolea
|
|
|
123
123
|
*/
|
|
124
124
|
declare const defaultPatternOptions: PatternOptions;
|
|
125
125
|
export { PatternOptions as n, defaultPatternOptions as r, PatternConfig as t };
|
|
126
|
-
//# sourceMappingURL=fast-globe-options-
|
|
126
|
+
//# sourceMappingURL=fast-globe-options-CZ-9wIKV.d.ts.map
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* ========================================================================
|
|
3
3
|
* @rzl-zone/build-tools
|
|
4
4
|
* ------------------------------------------------------------------------
|
|
5
|
-
* Version: `0.0.
|
|
5
|
+
* Version: `0.0.10`
|
|
6
6
|
* Author: `Rizalvin Dwiky <rizalvindwiky1998@gmail.com>`
|
|
7
7
|
* Repository: `https://github.com/rzl-zone/rzl-zone/tree/main/packages/build-tools`
|
|
8
8
|
* ========================================================================
|
|
@@ -212,4 +212,4 @@ const toArray = (value) => {
|
|
|
212
212
|
return isArray(value) ? value : [value];
|
|
213
213
|
};
|
|
214
214
|
export { toStringSet as S, isUndefined as _, isError as a, toArray as b, isNil as c, isNumber as d, isObject as f, isString as g, isSet as h, isBoolean as i, isNonEmptyString as l, isRegExp as m, flattenStrings as n, isFunction as o, isPlainObject as p, isArray as r, isMap as s, deepFreeze as t, isNull as u, normalizeSpaces as v, toObjectSet as x, safeStableStringify as y };
|
|
215
|
-
//# sourceMappingURL=helper-
|
|
215
|
+
//# sourceMappingURL=helper-CWU8QYq3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helper-2m5t07Qe.js","names":[],"sources":["../src/_internal/utils/helper.ts"],"sourcesContent":["import type {\n AnObjectNonArray,\n AnyFunction,\n Arrayable,\n Extends,\n IsArray,\n IsNever,\n NonPlainObject,\n OrArr,\n ReadonlyDeep\n} from \"@/_internal/types/extra\";\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport function deepFreeze<T>(value: T): ReadonlyDeep<T> {\n if (typeof value !== \"object\" || value === null) {\n return value as ReadonlyDeep<T>;\n }\n\n const seen = new WeakSet<object>();\n const stack: object[] = [value as object];\n\n while (stack.length) {\n const obj = stack.pop()!;\n\n if (seen.has(obj) || Object.isFrozen(obj)) continue;\n\n seen.add(obj);\n\n // Map\n if (isMap(obj)) {\n for (const [k, v] of obj) {\n if (typeof k === \"object\" && k !== null) stack.push(k);\n if (typeof v === \"object\" && v !== null) stack.push(v);\n }\n }\n\n // Set\n else if (isSet(obj)) {\n for (const v of obj) {\n if (typeof v === \"object\" && v !== null) stack.push(v);\n }\n }\n\n // Fast path Array\n else if (isArray(obj)) {\n for (const v of obj) {\n if (typeof v === \"object\" && v !== null) stack.push(v);\n }\n } else {\n const record = obj as Record<PropertyKey, unknown>;\n\n for (const key of Reflect.ownKeys(record)) {\n const v = record[key];\n if (typeof v === \"object\" && v !== null) stack.push(v);\n }\n\n // const descriptors = Object.getOwnPropertyDescriptors(obj);\n\n // for (const key of Reflect.ownKeys(descriptors)) {\n // const desc = descriptors[key as keyof typeof descriptors];\n // if (!desc) continue;\n\n // if (\"value\" in desc) {\n // const v = desc.value;\n // if (typeof v === \"object\" && v !== null) stack.push(v);\n // }\n // }\n }\n\n Object.freeze(obj);\n }\n\n return value as ReadonlyDeep<T>;\n}\n// ----------------------------------------------------------------\n\n/** @internal */\nexport function isObjectLoose<T>(\n value: T\n): value is Extract<T, object | AnyFunction> {\n return !isNil(value) && (isObjectOrArray(value) || isFunction(value));\n}\n\nexport function isObjectLike<T>(value: T): value is Extract<T, object> {\n return !isFunction(value) && isObjectLoose(value);\n}\n// ----------------------------------------------------------------\n\n/** ----------------------------------------------------------------\n * * ***Check whether a value is thenable (Promise-like).***\n * ----------------------------------------------------------------\n *\n * Determines whether a value implements a `.then()` method and can be\n * treated as a **thenable** object.\n *\n * This includes:\n * - Native `Promise`.\n * - Promise-like objects returned by libraries.\n * - Custom objects implementing `.then()`.\n *\n * ----------------------------------------------------------------\n *\n * @typeParam T\n * The resolved value type of the thenable.\n *\n * @param v\n * The value to check.\n *\n * @returns\n * `true` if the value is thenable, otherwise `false`.\n *\n * When `true`, the value is narrowed to `PromiseLike<T>`.\n *\n * ----------------------------------------------------------------\n *\n * @example\n * ```ts\n * isThenable(Promise.resolve(1));\n * // ➔ true\n *\n * isThenable({ then: () => {} });\n * // ➔ true\n *\n * isThenable(123);\n * // ➔ false\n * ```\n *\n * @example\n * ```ts\n * async function unwrap<T>(value: T | Promise<T>) {\n * if (isThenable<T>(value)) {\n * return await value;\n * }\n *\n * return value;\n * }\n * ```\n *\n * @remarks\n * Thenables are typically resolved before function execution to support async config factories without enforcing `Promise` instances.\n * - This function checks **behavior**, not identity.\n * - The value does **not** have to be an instance of `Promise`.\n * - Useful for async utilities, lazy evaluation, and hybrid sync/async APIs.\n *\n * @internal\n */\nexport const isThenable = <T = unknown>(v: unknown): v is PromiseLike<T> =>\n v != null &&\n (typeof v === \"object\" || typeof v === \"function\") &&\n typeof (v as PromiseLike<T>).then === \"function\";\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isRegExp = (value: unknown): value is RegExp => {\n return value instanceof RegExp;\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isString = (value: unknown): value is string => {\n return typeof value === \"string\";\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport function isSet<T = unknown>(value: Set<T>): value is Set<T>;\nexport function isSet(value: unknown): value is Set<unknown>;\nexport function isSet(value: unknown): boolean {\n return (\n Object.prototype.toString.call(value) === \"[object Set]\" ||\n value instanceof Set\n );\n}\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport function isMap<K = unknown, V = unknown>(\n value: Map<K, V>\n): value is Map<K, V>;\nexport function isMap(value: unknown): value is Map<unknown, unknown>;\nexport function isMap(value: unknown): boolean {\n return (\n Object.prototype.toString.call(value) === \"[object Map]\" ||\n value instanceof Map\n );\n}\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype ArrayFallback<T> =\n IsNever<Extract<T, unknown[] | readonly unknown[]>> extends true\n ? unknown[] & T\n : Extract<T, unknown[] | readonly unknown[]>;\n\n/** @internal */\nexport function isArray<T>(value: T): value is ArrayFallback<T>;\n// export function isArray<T>(value: T): value is IsNever<Extract<T, unknown[]>> extends true ? unknown[]: Extract<T, unknown[]>;\nexport function isArray(value: unknown): value is unknown[];\nexport function isArray(value: unknown): boolean {\n return Array.isArray(value);\n}\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isNull = (val: unknown): val is null => val === null;\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype IsPlainObjectResult<T> = unknown extends T\n ? Record<PropertyKey, unknown> & T\n : T extends object\n ? T extends NonPlainObject\n ? never\n : IsHasKeysObject<T> extends false\n ? Record<PropertyKey, unknown> & T\n : T\n : Extract<T, Record<PropertyKey, unknown>>;\n\n/** @internal */\nexport function isPlainObject<T>(value: T): value is IsPlainObjectResult<T>;\nexport function isPlainObject<T>(\n value: T\n): value is NonNullable<Extract<T, Record<PropertyKey, unknown>>>;\nexport function isPlainObject(value: unknown) {\n if (!isObject(value)) return false;\n\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype IsObject<T> = unknown extends T\n ? T & Record<PropertyKey, unknown>\n : T extends object\n ? T extends AnObjectNonArray\n ? T\n : IsHasKeysObject<T> extends false\n ? T & Record<PropertyKey, unknown>\n : IsArray<T> extends true\n ? Exclude<T, unknown[]>\n : T\n : never;\n\n/** @internal */\nexport function isObject<T extends object>(value: T): value is IsObject<T>;\nexport function isObject(value: unknown): value is Record<PropertyKey, unknown>;\nexport function isObject(value: unknown): boolean {\n return typeof value === \"object\" && !isNil(value) && !isArray(value);\n}\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype IsHasKeysObject<T> = keyof T extends never ? false : true;\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype IsObjectOrArray<T> =\n OrArr<\n [IsNever<T>, Extends<T, Record<PropertyKey, unknown>>, Extends<unknown, T>]\n > extends true\n ? T & Record<PropertyKey, unknown> & unknown[]\n : T extends object\n ? T extends unknown[]\n ? T\n : T extends AnObjectNonArray\n ? T\n : IsHasKeysObject<T> extends false\n ? T & Record<PropertyKey, unknown>\n : T\n : Extract<T, Record<PropertyKey, unknown> & unknown[]>;\n\n/** @internal */\nexport function isObjectOrArray(value: []): value is [];\nexport function isObjectOrArray<T>(value: T): value is IsObjectOrArray<T>;\nexport function isObjectOrArray<T>(value: T): boolean {\n return isArray(value) || isObject(value);\n}\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isNil = (value: unknown): value is null | undefined => {\n return value == null;\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isBoolean = (value: unknown): value is boolean => {\n return typeof value === \"boolean\";\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isUndefined = (value: unknown): value is undefined => {\n return typeof value === \"undefined\";\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isFunction = (value: unknown): value is AnyFunction => {\n return typeof value === \"function\";\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types\nexport const isNumberObject = (value: unknown): value is Number => {\n return (\n isObject(value) &&\n Object.prototype.toString.call(value) === \"[object Number]\"\n );\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types\nexport const isStringObject = (value: unknown): value is String => {\n return (\n isObject(value) &&\n Object.prototype.toString.call(value) === \"[object String]\"\n );\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types\nexport const isBooleanObject = (value: unknown): value is Boolean => {\n return (\n isObject(value) &&\n Object.prototype.toString.call(value) === \"[object Boolean]\"\n );\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isInfinityNumber = (value: unknown): boolean => {\n if (typeof value === \"number\" || isNumberObject(value)) {\n const num = Number(value);\n return num === Infinity || num === -Infinity;\n }\n return false;\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isSymbol = (value: unknown): value is symbol => {\n return typeof value === \"symbol\";\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isBigInt = (value: unknown): value is bigint => {\n return typeof value === \"bigint\";\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isNaN = (value: unknown): boolean => {\n return typeof value === \"number\"\n ? Number.isNaN(value)\n : isNumberObject(value) && Number.isNaN(value.valueOf());\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype IsNonEmptyStringOptions = {\n /** Whether to trim the string before checking, defaultValue: `true`.\n *\n * @default true */\n trim?: boolean;\n};\n\n/** @internal */\nexport const isNonEmptyString = (\n value: unknown,\n options: IsNonEmptyStringOptions = {}\n): value is string => {\n if (!isString(value)) return false;\n\n const trim = options.trim ?? true;\n\n const str = trim ? value.trim() : value;\n\n return str.length > 0;\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype IsNumberOptions = {\n /** If set to `true`, `NaN` will be considered a valid number, defaultValue: `false`.\n *\n * @default false\n */\n includeNaN?: boolean;\n};\n\n/** @internal */\nexport const isNumber = (\n value: unknown,\n options: IsNumberOptions = {}\n): value is number => {\n const includeNaN =\n isPlainObject(options) && isBoolean(options.includeNaN)\n ? options.includeNaN\n : false;\n\n const aNumber = typeof value === \"number\";\n return includeNaN ? aNumber : aNumber && !Number.isNaN(value);\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isError = (error: unknown): error is Error => {\n return (\n Object.prototype.toString.call(error) === \"[object Error]\" ||\n error instanceof Error\n );\n};\n// ----------------------------------------------------------------\n\n/** @internal */\ntype isDateOptions = {\n /** * ***Skip the validity check (`!isNaN(date.getTime())`).***\n *\n * When `true`, the function only checks that the value is an\n * instance of `Date` without verifying that it represents a valid\n * date value, default: `false`.\n *\n * @default false\n */\n skipInvalidDate?: boolean;\n};\n\n/** @internal */\nexport const isDate = (\n value: unknown,\n options: isDateOptions = {}\n): value is Date => {\n const skipInvalidDate =\n isPlainObject(options) && isBoolean(options.skipInvalidDate)\n ? options.skipInvalidDate\n : false;\n\n const instanceDate = value instanceof Date;\n\n if (skipInvalidDate) return instanceDate;\n return instanceDate && !isNaN(value.getTime());\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport type SafeStableStringifyOptions = {\n /** -------------------------------------------------\n * * ***Whether to sort **object keys** alphabetically (recursively).***\n * -------------------------------------------------\n *\n * - `true` (default): object keys are sorted to ensure stable output.\n * - `false`: preserves original insertion order of keys.\n *\n * @default true\n */\n sortKeys?: boolean;\n /** -------------------------------------------------\n * * ***Whether to sort **primitive values inside arrays**.***\n * -------------------------------------------------\n *\n * - `true`: primitive values in arrays are sorted to ensure stable output.\n * - `false` (default): arrays retain their original order; objects and nested arrays are not reordered.\n *\n * @default false\n */\n sortArray?: boolean;\n /** -------------------------------------------------\n * * ***Whether to pretty-print JSON output with 2-space indentation.***\n * -------------------------------------------------\n *\n * - `true`: output is formatted with indentation and newlines.\n * - `false` (default): produces compact single-line JSON.\n *\n * @default false\n */\n pretty?: boolean;\n /** -------------------------------------------------\n * * ***Preserve `undefined` values instead of converting them to `null`.***\n * -------------------------------------------------\n * **Controls how the internal `deepProcess` step rewrites values\n * **before** the final `JSON.stringify` call.**\n * - **Default (`false`):**\n * * Every `undefined` value (object properties **and** array elements)\n * is replaced with `null` **before** serialization, because this happens\n * first, the key is **not removed** by `JSON.stringify`.\n * - **`true`** – Leaves `undefined` untouched so the final\n * `JSON.stringify` call behaves natively:\n * * Object properties with `undefined` are **removed**.\n * * Array elements that are `undefined` become `null`.\n * @default false\n * @example\n * // ✅ keepUndefined = true: behaves like native JSON.stringify\n * safeStableStringify({ a: undefined }, { keepUndefined: true });\n * // ➔ '{}' // key removed\n *\n * // ✅ Default (false): convert undefined to null, key kept\n * safeStableStringify({ a: undefined });\n * // ➔ '{\"a\":null}' // key present, value null\n *\n * // Arrays\n * safeStableStringify([undefined]);\n * // ➔ '[null]' // same, but via pre-replacement\n * safeStableStringify([undefined], { keepUndefined: true });\n * // ➔ '[null]' // element becomes null\n */\n keepUndefined?: boolean;\n};\n\n/** @internal */\nexport const safeStableStringify = (\n value: unknown,\n options: SafeStableStringifyOptions = {}\n): string => {\n const pretty = options.pretty ?? false;\n const sortKeys = options.sortKeys ?? true;\n const sortArray = options.sortArray ?? false;\n const keepUndefined = options.keepUndefined ?? false;\n\n if (isUndefined(value)) {\n return keepUndefined ? \"undefined\" : \"null\";\n }\n\n const seen = new WeakSet();\n\n const isPrimitive = (val: unknown): boolean =>\n isNull(val) || (!isObjectOrArray(val) && !isFunction(val));\n\n const deepProcess = (val: unknown): unknown => {\n if (isNumberObject(val)) {\n const valOf = val.valueOf();\n return isNaN(valOf) || isInfinityNumber(valOf) ? null : valOf;\n }\n if (isStringObject(val)) return val.valueOf();\n if (isBooleanObject(val)) return val.valueOf();\n if (isFunction(val) || isSymbol(val)) return undefined;\n if (isBigInt(val)) return val.toString();\n if (isNaN(val) || isInfinityNumber(val)) return null;\n if (isUndefined(val)) {\n return keepUndefined ? undefined : null;\n }\n\n if (isObjectOrArray(val)) {\n if (seen.has(val)) return \"[Circular]\";\n seen.add(val);\n\n if (isDate(val)) return val.toISOString();\n if (isMap(val)) {\n return {\n map: Array.from(val.entries()).map(([k, v]) => [k, deepProcess(v)])\n };\n }\n if (isSet(val)) return { set: Array.from(val.values()).map(deepProcess) };\n\n if (isArray(val)) {\n const processedArr = val.map(deepProcess);\n if (sortArray) {\n const primitives: unknown[] = [];\n const nonPrimitives: unknown[] = [];\n\n for (const item of processedArr) {\n if (isPrimitive(item)) primitives.push(item);\n else nonPrimitives.push(item);\n }\n primitives.sort((a, b) => {\n if (isNumber(a) && isNumber(b)) return a - b;\n return String(a).localeCompare(String(b));\n });\n return [...primitives, ...nonPrimitives];\n }\n return processedArr;\n }\n\n const keys = Object.keys(val);\n if (sortKeys) {\n keys.sort((a, b) => {\n const na = Number(a);\n const nb = Number(b);\n if (!isNaN(na) && !isNaN(nb)) return na - nb;\n return a.localeCompare(b);\n });\n }\n\n const result: Record<string, unknown> = {};\n\n if (isObject(val)) {\n for (const k of keys) {\n const v = deepProcess(val[k]);\n if (!isUndefined(v)) result[k] = v;\n }\n }\n\n return result;\n }\n\n return val;\n };\n\n try {\n return JSON.stringify(deepProcess(value), null, pretty ? 2 : 0);\n } catch (err) {\n console.warn(\"Error in safeStableStringify:\", err);\n return \"{}\";\n }\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype NormalizeSpacesOptions = {\n /** If `true`, skips normalization and only trims whitespace from start & end, defaultValue: `false`.\n *\n * @default false\n */\n trimOnly?: boolean;\n /** If `false`, skips trimming value, defaultValue: `true`.\n *\n * @default true\n */\n withTrim?: boolean;\n};\n\n/** @internal */\nexport const normalizeSpaces = (\n value: string | null | undefined,\n options: NormalizeSpacesOptions = {\n withTrim: true,\n trimOnly: false\n }\n): string => {\n if (!isNonEmptyString(value)) return \"\";\n\n if (!isPlainObject(options)) {\n options = {};\n }\n\n const { trimOnly = false, withTrim = true } = options;\n\n if (trimOnly) return value.trim();\n\n if (withTrim) {\n value = value.trim();\n }\n\n // Remove all duplicate spaces (including tabs, newlines, etc.)\n return value.replace(/\\s+/g, \" \");\n};\n\n// ----------------------------------------------------------------\n\n/** ----------------------------------------------------------------\n * * ***Checks whether a value is an array of strings.***\n * ----------------------------------------------------------------\n *\n * Type guard that validates the input is an `Array` where **all**\n * elements are strings.\n *\n * @param {unknown} v - The value to test.\n *\n * @returns {boolean} `true` if the value is a `string[]`.\n *\n * @internal\n */\nexport const isStringArray = (v: unknown): v is string[] =>\n isArray(v) && v.every((i) => isString(i));\n\n/** ----------------------------------------------------------------\n * * ***Checks whether a value is a Set of strings.***\n * ----------------------------------------------------------------\n *\n * Type guard that validates the input is a `Set` where **all**\n * entries are strings.\n *\n * @param {unknown} v - The value to test.\n *\n * @returns {boolean} `true` if the value is a `Set<string>`.\n *\n * @internal\n */\nexport const isStringSet = (v: unknown): v is Set<string> =>\n isSet(v) && [...v].every((i) => isString(i));\n\n/** ----------------------------------------------------------------\n * * ***Asserts that a value is a valid pattern input.***\n * ----------------------------------------------------------------\n *\n * Runtime assertion that validates the provided value is one of the\n * supported pattern types:\n * - `string`.\n * - `string[]`.\n * - `Set<string>`.\n *\n * This function is intended to be used at API boundaries to ensure\n * type safety before further processing.\n *\n * @param {unknown} v - The value to validate.\n * @param {string|undefined} parameterKey - The key parameter to identity which is invalid, default `\"pattern\"`.\n *\n * @throws {TypeError} If the value is not a valid pattern input.\n *\n * @example\n * ```ts\n * assertValidatePatternArgs(pattern);\n * // pattern is now typed as:\n * // string | string[] | Set<string>\n * ```\n *\n * @internal\n */\nexport const assertValidatePatternArgs: (\n v: unknown,\n parameterKey?: string\n) => asserts v is string | string[] | Set<string> = (\n v: unknown,\n parameterKey: string = \"pattern\"\n) => {\n if (!isString(v) && !isStringArray(v) && !isStringSet(v)) {\n throw new TypeError(\n `The \\`${parameterKey}\\` argument must be a string, string[] or Set<string>.`\n );\n }\n};\n\n/** ----------------------------------------------------------------\n * * ***Flattens nested arrays and extracts string values only.***\n * ----------------------------------------------------------------\n *\n * Recursively flattens an input array to **infinite depth** and\n * filters out all non-string values.\n *\n * - *Normalization rules:*\n * - Nested arrays are flattened using `Array.prototype.flat(Infinity)`.\n * - Only values with `typeof === \"string\"` are kept.\n * - Non-string values are discarded.\n *\n * The returned array is always a **new instance** and does not mutate\n * the original input.\n *\n * @param {readonly unknown[]} input - Arbitrary nested array input.\n *\n * @returns {string[]} A flat array containing only string values.\n *\n * @example\n * ```ts\n * flattenStrings([\"a\", [\"b\", [\"c\"]], 1, null]);\n * // ➔ [\"a\", \"b\", \"c\"]\n * ```\n *\n * @internal\n */\nexport const flattenStrings = (input: readonly unknown[]): string[] => {\n return input.flat(Infinity).filter((v): v is string => typeof v === \"string\");\n};\n\n/** ----------------------------------------------------------------\n * * ***Normalizes pattern input into a new `Set<string>` instance.***\n * ----------------------------------------------------------------\n *\n * Converts a pattern value into a deduplicated `Set<string>` for\n * consistent internal handling.\n *\n * #### Normalization behavior\n * - `string` ➔ wrapped into a `Set`.\n * - `string[]` ➔ converted into a `Set` (duplicates removed).\n * - `Set<string>` ➔ cloned into a new `Set`.\n *\n * The returned set is **always a new instance** and the original\n * input is never mutated.\n *\n * #### Validation\n * When `withValidationType` is `true` (default), the input will be\n * validated before normalization.\n *\n * If the provided `pattern` is not one of the supported types,\n * a `TypeError` will be thrown.\n *\n * @param pattern - Pattern value to normalize.\n * @param options - Optional configuration object.\n * @param options.withValidationType - Whether to validate the input\n * before normalization. Defaults to `true`.\n * @param options.parameterKey - The key parameter to identity which is invalid, default `\"pattern\"`.\n *\n * @returns A new deduplicated `Set<string>` instance.\n *\n * @throws {TypeError}\n * Thrown when `pattern` is not a `string`, `string[]`, or `Set<string>`\n * and validation is enabled.\n *\n * @example\n * ```ts\n * toStringSet(\"a\");\n * // ➔ Set { \"a\" }\n * ```\n *\n * @example\n * ```ts\n * toStringSet([\"a\", \"b\", \"a\"]);\n * // ➔ Set { \"a\", \"b\" }\n * ```\n *\n * @example\n * ```ts\n * toStringSet(new Set([\"x\", \"y\"]));\n * // ➔ Set { \"x\", \"y\" }\n * ```\n *\n * @example\n * ```ts\n * toStringSet(123 as any);\n * // ❌ Throws TypeError\n * ```\n *\n * @example\n * ```ts\n * // Disable validation (use cautiously)\n * toStringSet(\"a\", { withValidationType: false });\n * toStringSet(123 as any, { withValidationType: false });\n * ```\n *\n * @internal\n */\nexport const toStringSet = (\n pattern: string | string[] | Set<string>,\n options: {\n withValidationType?: boolean;\n /**\n * The key parameter to identity which is invalid.\n *\n * @default \"pattern\"\n */\n parameterKey?: string;\n } = {}\n): Set<string> => {\n const { withValidationType = true, parameterKey = \"pattern\" } = options;\n if (withValidationType) assertValidatePatternArgs(pattern, parameterKey);\n\n return toObjectSet(pattern);\n};\n\n/** ----------------------------------------------------------------\n * * ***Normalizes a value into a deduplicated `Set`.***\n * ----------------------------------------------------------------\n *\n * Converts a single value, array, or existing `Set` into a `Set<T>`\n * for consistent internal handling.\n *\n * - *Normalization rules:*\n * - `T` ➔ wrapped in a `Set`.\n * - `T[]` ➔ converted to a `Set` (duplicates removed).\n * - `Set<T>` ➔ returned as-is.\n *\n * The returned `Set` is **not mutated** internally by this function.\n * If an existing `Set` is provided, it will be reused.\n *\n * @typeParam T - Value type stored in the set.\n *\n * @param {T | T[] | Set<T>} value - Value to normalize.\n *\n * @returns {Set<T>} A deduplicated set of values.\n *\n * @example\n * ```ts\n * toObjectSet(1);\n * // ➔ Set { 1 }\n * ```\n *\n * @example\n * ```ts\n * toObjectSet([1, 2, 1]);\n * // ➔ Set { 1, 2 }\n * ```\n *\n * @example\n * ```ts\n * toObjectSet(new Set([1, 2]));\n * // ➔ Set { 1, 2 }\n * ```\n *\n * @internal\n */\nexport const toObjectSet = <T>(value: T | T[] | Set<T>): Set<T> => {\n if (isSet(value)) return value;\n\n return new Set(isArray(value) ? value : [value]);\n};\n\n/** ----------------------------------------------------------------\n * * ***Normalize a value into an array.***\n * ----------------------------------------------------------------\n *\n * Converts a single value or an array-like value into a **new array**\n * with consistent typing.\n *\n * - If `value` is already an array ➔ returned as-is.\n * - If `value` is a single item ➔ wrapped in an array.\n *\n * This utility is useful for APIs or configs that accept\n * either a single value or multiple values.\n *\n * ----------------------------------------------------------------\n *\n * @typeParam T\n * The element type of the resulting array.\n *\n * @param value\n * A value or array of values.\n *\n * @returns\n * A normalized array of type `T[]`.\n *\n * ----------------------------------------------------------------\n *\n * @example\n * ```ts\n * toArray(1);\n * // ➔ [1]\n *\n * toArray(\"hello\");\n * // ➔ [\"hello\"]\n *\n * toArray([1, 2, 3]);\n * // ➔ [1, 2, 3]\n * ```\n *\n * @example\n * ```ts\n * type User = { id: number };\n *\n * toArray<User>({ id: 1 });\n * // ➔ [{ id: 1 }]\n *\n * toArray<User>([{ id: 1 }, { id: 2 }]);\n * // ➔ [{ id: 1 }, { id: 2 }]\n * ```\n *\n * @remarks\n * This function does **not** flatten nested arrays.\n * If `value` is already an array, the original reference is preserved.\n *\n * @internal\n */\nexport const toArray = <T>(value: Arrayable<T>): T[] => {\n return isArray(value) ? value : [value];\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"helper-CWU8QYq3.js","names":[],"sources":["../src/_internal/utils/helper.ts"],"sourcesContent":["import type {\n AnObjectNonArray,\n AnyFunction,\n Arrayable,\n Extends,\n IsArray,\n IsNever,\n NonPlainObject,\n OrArr,\n ReadonlyDeep\n} from \"@/_internal/types/extra\";\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport function deepFreeze<T>(value: T): ReadonlyDeep<T> {\n if (typeof value !== \"object\" || value === null) {\n return value as ReadonlyDeep<T>;\n }\n\n const seen = new WeakSet<object>();\n const stack: object[] = [value as object];\n\n while (stack.length) {\n const obj = stack.pop()!;\n\n if (seen.has(obj) || Object.isFrozen(obj)) continue;\n\n seen.add(obj);\n\n // Map\n if (isMap(obj)) {\n for (const [k, v] of obj) {\n if (typeof k === \"object\" && k !== null) stack.push(k);\n if (typeof v === \"object\" && v !== null) stack.push(v);\n }\n }\n\n // Set\n else if (isSet(obj)) {\n for (const v of obj) {\n if (typeof v === \"object\" && v !== null) stack.push(v);\n }\n }\n\n // Fast path Array\n else if (isArray(obj)) {\n for (const v of obj) {\n if (typeof v === \"object\" && v !== null) stack.push(v);\n }\n } else {\n const record = obj as Record<PropertyKey, unknown>;\n\n for (const key of Reflect.ownKeys(record)) {\n const v = record[key];\n if (typeof v === \"object\" && v !== null) stack.push(v);\n }\n\n // const descriptors = Object.getOwnPropertyDescriptors(obj);\n\n // for (const key of Reflect.ownKeys(descriptors)) {\n // const desc = descriptors[key as keyof typeof descriptors];\n // if (!desc) continue;\n\n // if (\"value\" in desc) {\n // const v = desc.value;\n // if (typeof v === \"object\" && v !== null) stack.push(v);\n // }\n // }\n }\n\n Object.freeze(obj);\n }\n\n return value as ReadonlyDeep<T>;\n}\n// ----------------------------------------------------------------\n\n/** @internal */\nexport function isObjectLoose<T>(\n value: T\n): value is Extract<T, object | AnyFunction> {\n return !isNil(value) && (isObjectOrArray(value) || isFunction(value));\n}\n\nexport function isObjectLike<T>(value: T): value is Extract<T, object> {\n return !isFunction(value) && isObjectLoose(value);\n}\n// ----------------------------------------------------------------\n\n/** ----------------------------------------------------------------\n * * ***Check whether a value is thenable (Promise-like).***\n * ----------------------------------------------------------------\n *\n * Determines whether a value implements a `.then()` method and can be\n * treated as a **thenable** object.\n *\n * This includes:\n * - Native `Promise`.\n * - Promise-like objects returned by libraries.\n * - Custom objects implementing `.then()`.\n *\n * ----------------------------------------------------------------\n *\n * @typeParam T\n * The resolved value type of the thenable.\n *\n * @param v\n * The value to check.\n *\n * @returns\n * `true` if the value is thenable, otherwise `false`.\n *\n * When `true`, the value is narrowed to `PromiseLike<T>`.\n *\n * ----------------------------------------------------------------\n *\n * @example\n * ```ts\n * isThenable(Promise.resolve(1));\n * // ➔ true\n *\n * isThenable({ then: () => {} });\n * // ➔ true\n *\n * isThenable(123);\n * // ➔ false\n * ```\n *\n * @example\n * ```ts\n * async function unwrap<T>(value: T | Promise<T>) {\n * if (isThenable<T>(value)) {\n * return await value;\n * }\n *\n * return value;\n * }\n * ```\n *\n * @remarks\n * Thenables are typically resolved before function execution to support async config factories without enforcing `Promise` instances.\n * - This function checks **behavior**, not identity.\n * - The value does **not** have to be an instance of `Promise`.\n * - Useful for async utilities, lazy evaluation, and hybrid sync/async APIs.\n *\n * @internal\n */\nexport const isThenable = <T = unknown>(v: unknown): v is PromiseLike<T> =>\n v != null &&\n (typeof v === \"object\" || typeof v === \"function\") &&\n typeof (v as PromiseLike<T>).then === \"function\";\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isRegExp = (value: unknown): value is RegExp => {\n return value instanceof RegExp;\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isString = (value: unknown): value is string => {\n return typeof value === \"string\";\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport function isSet<T = unknown>(value: Set<T>): value is Set<T>;\nexport function isSet(value: unknown): value is Set<unknown>;\nexport function isSet(value: unknown): boolean {\n return (\n Object.prototype.toString.call(value) === \"[object Set]\" ||\n value instanceof Set\n );\n}\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport function isMap<K = unknown, V = unknown>(\n value: Map<K, V>\n): value is Map<K, V>;\nexport function isMap(value: unknown): value is Map<unknown, unknown>;\nexport function isMap(value: unknown): boolean {\n return (\n Object.prototype.toString.call(value) === \"[object Map]\" ||\n value instanceof Map\n );\n}\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype ArrayFallback<T> =\n IsNever<Extract<T, unknown[] | readonly unknown[]>> extends true\n ? unknown[] & T\n : Extract<T, unknown[] | readonly unknown[]>;\n\n/** @internal */\nexport function isArray<T>(value: T): value is ArrayFallback<T>;\n// export function isArray<T>(value: T): value is IsNever<Extract<T, unknown[]>> extends true ? unknown[]: Extract<T, unknown[]>;\nexport function isArray(value: unknown): value is unknown[];\nexport function isArray(value: unknown): boolean {\n return Array.isArray(value);\n}\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isNull = (val: unknown): val is null => val === null;\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype IsPlainObjectResult<T> = unknown extends T\n ? Record<PropertyKey, unknown> & T\n : T extends object\n ? T extends NonPlainObject\n ? never\n : IsHasKeysObject<T> extends false\n ? Record<PropertyKey, unknown> & T\n : T\n : Extract<T, Record<PropertyKey, unknown>>;\n\n/** @internal */\nexport function isPlainObject<T>(value: T): value is IsPlainObjectResult<T>;\nexport function isPlainObject<T>(\n value: T\n): value is NonNullable<Extract<T, Record<PropertyKey, unknown>>>;\nexport function isPlainObject(value: unknown) {\n if (!isObject(value)) return false;\n\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype IsObject<T> = unknown extends T\n ? T & Record<PropertyKey, unknown>\n : T extends object\n ? T extends AnObjectNonArray\n ? T\n : IsHasKeysObject<T> extends false\n ? T & Record<PropertyKey, unknown>\n : IsArray<T> extends true\n ? Exclude<T, unknown[]>\n : T\n : never;\n\n/** @internal */\nexport function isObject<T extends object>(value: T): value is IsObject<T>;\nexport function isObject(value: unknown): value is Record<PropertyKey, unknown>;\nexport function isObject(value: unknown): boolean {\n return typeof value === \"object\" && !isNil(value) && !isArray(value);\n}\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype IsHasKeysObject<T> = keyof T extends never ? false : true;\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype IsObjectOrArray<T> =\n OrArr<\n [IsNever<T>, Extends<T, Record<PropertyKey, unknown>>, Extends<unknown, T>]\n > extends true\n ? T & Record<PropertyKey, unknown> & unknown[]\n : T extends object\n ? T extends unknown[]\n ? T\n : T extends AnObjectNonArray\n ? T\n : IsHasKeysObject<T> extends false\n ? T & Record<PropertyKey, unknown>\n : T\n : Extract<T, Record<PropertyKey, unknown> & unknown[]>;\n\n/** @internal */\nexport function isObjectOrArray(value: []): value is [];\nexport function isObjectOrArray<T>(value: T): value is IsObjectOrArray<T>;\nexport function isObjectOrArray<T>(value: T): boolean {\n return isArray(value) || isObject(value);\n}\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isNil = (value: unknown): value is null | undefined => {\n return value == null;\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isBoolean = (value: unknown): value is boolean => {\n return typeof value === \"boolean\";\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isUndefined = (value: unknown): value is undefined => {\n return typeof value === \"undefined\";\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isFunction = (value: unknown): value is AnyFunction => {\n return typeof value === \"function\";\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types\nexport const isNumberObject = (value: unknown): value is Number => {\n return (\n isObject(value) &&\n Object.prototype.toString.call(value) === \"[object Number]\"\n );\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types\nexport const isStringObject = (value: unknown): value is String => {\n return (\n isObject(value) &&\n Object.prototype.toString.call(value) === \"[object String]\"\n );\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types\nexport const isBooleanObject = (value: unknown): value is Boolean => {\n return (\n isObject(value) &&\n Object.prototype.toString.call(value) === \"[object Boolean]\"\n );\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isInfinityNumber = (value: unknown): boolean => {\n if (typeof value === \"number\" || isNumberObject(value)) {\n const num = Number(value);\n return num === Infinity || num === -Infinity;\n }\n return false;\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isSymbol = (value: unknown): value is symbol => {\n return typeof value === \"symbol\";\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isBigInt = (value: unknown): value is bigint => {\n return typeof value === \"bigint\";\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isNaN = (value: unknown): boolean => {\n return typeof value === \"number\"\n ? Number.isNaN(value)\n : isNumberObject(value) && Number.isNaN(value.valueOf());\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype IsNonEmptyStringOptions = {\n /** Whether to trim the string before checking, defaultValue: `true`.\n *\n * @default true */\n trim?: boolean;\n};\n\n/** @internal */\nexport const isNonEmptyString = (\n value: unknown,\n options: IsNonEmptyStringOptions = {}\n): value is string => {\n if (!isString(value)) return false;\n\n const trim = options.trim ?? true;\n\n const str = trim ? value.trim() : value;\n\n return str.length > 0;\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype IsNumberOptions = {\n /** If set to `true`, `NaN` will be considered a valid number, defaultValue: `false`.\n *\n * @default false\n */\n includeNaN?: boolean;\n};\n\n/** @internal */\nexport const isNumber = (\n value: unknown,\n options: IsNumberOptions = {}\n): value is number => {\n const includeNaN =\n isPlainObject(options) && isBoolean(options.includeNaN)\n ? options.includeNaN\n : false;\n\n const aNumber = typeof value === \"number\";\n return includeNaN ? aNumber : aNumber && !Number.isNaN(value);\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isError = (error: unknown): error is Error => {\n return (\n Object.prototype.toString.call(error) === \"[object Error]\" ||\n error instanceof Error\n );\n};\n// ----------------------------------------------------------------\n\n/** @internal */\ntype isDateOptions = {\n /** * ***Skip the validity check (`!isNaN(date.getTime())`).***\n *\n * When `true`, the function only checks that the value is an\n * instance of `Date` without verifying that it represents a valid\n * date value, default: `false`.\n *\n * @default false\n */\n skipInvalidDate?: boolean;\n};\n\n/** @internal */\nexport const isDate = (\n value: unknown,\n options: isDateOptions = {}\n): value is Date => {\n const skipInvalidDate =\n isPlainObject(options) && isBoolean(options.skipInvalidDate)\n ? options.skipInvalidDate\n : false;\n\n const instanceDate = value instanceof Date;\n\n if (skipInvalidDate) return instanceDate;\n return instanceDate && !isNaN(value.getTime());\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport type SafeStableStringifyOptions = {\n /** -------------------------------------------------\n * * ***Whether to sort **object keys** alphabetically (recursively).***\n * -------------------------------------------------\n *\n * - `true` (default): object keys are sorted to ensure stable output.\n * - `false`: preserves original insertion order of keys.\n *\n * @default true\n */\n sortKeys?: boolean;\n /** -------------------------------------------------\n * * ***Whether to sort **primitive values inside arrays**.***\n * -------------------------------------------------\n *\n * - `true`: primitive values in arrays are sorted to ensure stable output.\n * - `false` (default): arrays retain their original order; objects and nested arrays are not reordered.\n *\n * @default false\n */\n sortArray?: boolean;\n /** -------------------------------------------------\n * * ***Whether to pretty-print JSON output with 2-space indentation.***\n * -------------------------------------------------\n *\n * - `true`: output is formatted with indentation and newlines.\n * - `false` (default): produces compact single-line JSON.\n *\n * @default false\n */\n pretty?: boolean;\n /** -------------------------------------------------\n * * ***Preserve `undefined` values instead of converting them to `null`.***\n * -------------------------------------------------\n * **Controls how the internal `deepProcess` step rewrites values\n * **before** the final `JSON.stringify` call.**\n * - **Default (`false`):**\n * * Every `undefined` value (object properties **and** array elements)\n * is replaced with `null` **before** serialization, because this happens\n * first, the key is **not removed** by `JSON.stringify`.\n * - **`true`** – Leaves `undefined` untouched so the final\n * `JSON.stringify` call behaves natively:\n * * Object properties with `undefined` are **removed**.\n * * Array elements that are `undefined` become `null`.\n * @default false\n * @example\n * // ✅ keepUndefined = true: behaves like native JSON.stringify\n * safeStableStringify({ a: undefined }, { keepUndefined: true });\n * // ➔ '{}' // key removed\n *\n * // ✅ Default (false): convert undefined to null, key kept\n * safeStableStringify({ a: undefined });\n * // ➔ '{\"a\":null}' // key present, value null\n *\n * // Arrays\n * safeStableStringify([undefined]);\n * // ➔ '[null]' // same, but via pre-replacement\n * safeStableStringify([undefined], { keepUndefined: true });\n * // ➔ '[null]' // element becomes null\n */\n keepUndefined?: boolean;\n};\n\n/** @internal */\nexport const safeStableStringify = (\n value: unknown,\n options: SafeStableStringifyOptions = {}\n): string => {\n const pretty = options.pretty ?? false;\n const sortKeys = options.sortKeys ?? true;\n const sortArray = options.sortArray ?? false;\n const keepUndefined = options.keepUndefined ?? false;\n\n if (isUndefined(value)) {\n return keepUndefined ? \"undefined\" : \"null\";\n }\n\n const seen = new WeakSet();\n\n const isPrimitive = (val: unknown): boolean =>\n isNull(val) || (!isObjectOrArray(val) && !isFunction(val));\n\n const deepProcess = (val: unknown): unknown => {\n if (isNumberObject(val)) {\n const valOf = val.valueOf();\n return isNaN(valOf) || isInfinityNumber(valOf) ? null : valOf;\n }\n if (isStringObject(val)) return val.valueOf();\n if (isBooleanObject(val)) return val.valueOf();\n if (isFunction(val) || isSymbol(val)) return undefined;\n if (isBigInt(val)) return val.toString();\n if (isNaN(val) || isInfinityNumber(val)) return null;\n if (isUndefined(val)) {\n return keepUndefined ? undefined : null;\n }\n\n if (isObjectOrArray(val)) {\n if (seen.has(val)) return \"[Circular]\";\n seen.add(val);\n\n if (isDate(val)) return val.toISOString();\n if (isMap(val)) {\n return {\n map: Array.from(val.entries()).map(([k, v]) => [k, deepProcess(v)])\n };\n }\n if (isSet(val)) return { set: Array.from(val.values()).map(deepProcess) };\n\n if (isArray(val)) {\n const processedArr = val.map(deepProcess);\n if (sortArray) {\n const primitives: unknown[] = [];\n const nonPrimitives: unknown[] = [];\n\n for (const item of processedArr) {\n if (isPrimitive(item)) primitives.push(item);\n else nonPrimitives.push(item);\n }\n primitives.sort((a, b) => {\n if (isNumber(a) && isNumber(b)) return a - b;\n return String(a).localeCompare(String(b));\n });\n return [...primitives, ...nonPrimitives];\n }\n return processedArr;\n }\n\n const keys = Object.keys(val);\n if (sortKeys) {\n keys.sort((a, b) => {\n const na = Number(a);\n const nb = Number(b);\n if (!isNaN(na) && !isNaN(nb)) return na - nb;\n return a.localeCompare(b);\n });\n }\n\n const result: Record<string, unknown> = {};\n\n if (isObject(val)) {\n for (const k of keys) {\n const v = deepProcess(val[k]);\n if (!isUndefined(v)) result[k] = v;\n }\n }\n\n return result;\n }\n\n return val;\n };\n\n try {\n return JSON.stringify(deepProcess(value), null, pretty ? 2 : 0);\n } catch (err) {\n console.warn(\"Error in safeStableStringify:\", err);\n return \"{}\";\n }\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype NormalizeSpacesOptions = {\n /** If `true`, skips normalization and only trims whitespace from start & end, defaultValue: `false`.\n *\n * @default false\n */\n trimOnly?: boolean;\n /** If `false`, skips trimming value, defaultValue: `true`.\n *\n * @default true\n */\n withTrim?: boolean;\n};\n\n/** @internal */\nexport const normalizeSpaces = (\n value: string | null | undefined,\n options: NormalizeSpacesOptions = {\n withTrim: true,\n trimOnly: false\n }\n): string => {\n if (!isNonEmptyString(value)) return \"\";\n\n if (!isPlainObject(options)) {\n options = {};\n }\n\n const { trimOnly = false, withTrim = true } = options;\n\n if (trimOnly) return value.trim();\n\n if (withTrim) {\n value = value.trim();\n }\n\n // Remove all duplicate spaces (including tabs, newlines, etc.)\n return value.replace(/\\s+/g, \" \");\n};\n\n// ----------------------------------------------------------------\n\n/** ----------------------------------------------------------------\n * * ***Checks whether a value is an array of strings.***\n * ----------------------------------------------------------------\n *\n * Type guard that validates the input is an `Array` where **all**\n * elements are strings.\n *\n * @param {unknown} v - The value to test.\n *\n * @returns {boolean} `true` if the value is a `string[]`.\n *\n * @internal\n */\nexport const isStringArray = (v: unknown): v is string[] =>\n isArray(v) && v.every((i) => isString(i));\n\n/** ----------------------------------------------------------------\n * * ***Checks whether a value is a Set of strings.***\n * ----------------------------------------------------------------\n *\n * Type guard that validates the input is a `Set` where **all**\n * entries are strings.\n *\n * @param {unknown} v - The value to test.\n *\n * @returns {boolean} `true` if the value is a `Set<string>`.\n *\n * @internal\n */\nexport const isStringSet = (v: unknown): v is Set<string> =>\n isSet(v) && [...v].every((i) => isString(i));\n\n/** ----------------------------------------------------------------\n * * ***Asserts that a value is a valid pattern input.***\n * ----------------------------------------------------------------\n *\n * Runtime assertion that validates the provided value is one of the\n * supported pattern types:\n * - `string`.\n * - `string[]`.\n * - `Set<string>`.\n *\n * This function is intended to be used at API boundaries to ensure\n * type safety before further processing.\n *\n * @param {unknown} v - The value to validate.\n * @param {string|undefined} parameterKey - The key parameter to identity which is invalid, default `\"pattern\"`.\n *\n * @throws {TypeError} If the value is not a valid pattern input.\n *\n * @example\n * ```ts\n * assertValidatePatternArgs(pattern);\n * // pattern is now typed as:\n * // string | string[] | Set<string>\n * ```\n *\n * @internal\n */\nexport const assertValidatePatternArgs: (\n v: unknown,\n parameterKey?: string\n) => asserts v is string | string[] | Set<string> = (\n v: unknown,\n parameterKey: string = \"pattern\"\n) => {\n if (!isString(v) && !isStringArray(v) && !isStringSet(v)) {\n throw new TypeError(\n `The \\`${parameterKey}\\` argument must be a string, string[] or Set<string>.`\n );\n }\n};\n\n/** ----------------------------------------------------------------\n * * ***Flattens nested arrays and extracts string values only.***\n * ----------------------------------------------------------------\n *\n * Recursively flattens an input array to **infinite depth** and\n * filters out all non-string values.\n *\n * - *Normalization rules:*\n * - Nested arrays are flattened using `Array.prototype.flat(Infinity)`.\n * - Only values with `typeof === \"string\"` are kept.\n * - Non-string values are discarded.\n *\n * The returned array is always a **new instance** and does not mutate\n * the original input.\n *\n * @param {readonly unknown[]} input - Arbitrary nested array input.\n *\n * @returns {string[]} A flat array containing only string values.\n *\n * @example\n * ```ts\n * flattenStrings([\"a\", [\"b\", [\"c\"]], 1, null]);\n * // ➔ [\"a\", \"b\", \"c\"]\n * ```\n *\n * @internal\n */\nexport const flattenStrings = (input: readonly unknown[]): string[] => {\n return input.flat(Infinity).filter((v): v is string => typeof v === \"string\");\n};\n\n/** ----------------------------------------------------------------\n * * ***Normalizes pattern input into a new `Set<string>` instance.***\n * ----------------------------------------------------------------\n *\n * Converts a pattern value into a deduplicated `Set<string>` for\n * consistent internal handling.\n *\n * #### Normalization behavior\n * - `string` ➔ wrapped into a `Set`.\n * - `string[]` ➔ converted into a `Set` (duplicates removed).\n * - `Set<string>` ➔ cloned into a new `Set`.\n *\n * The returned set is **always a new instance** and the original\n * input is never mutated.\n *\n * #### Validation\n * When `withValidationType` is `true` (default), the input will be\n * validated before normalization.\n *\n * If the provided `pattern` is not one of the supported types,\n * a `TypeError` will be thrown.\n *\n * @param pattern - Pattern value to normalize.\n * @param options - Optional configuration object.\n * @param options.withValidationType - Whether to validate the input\n * before normalization. Defaults to `true`.\n * @param options.parameterKey - The key parameter to identity which is invalid, default `\"pattern\"`.\n *\n * @returns A new deduplicated `Set<string>` instance.\n *\n * @throws {TypeError}\n * Thrown when `pattern` is not a `string`, `string[]`, or `Set<string>`\n * and validation is enabled.\n *\n * @example\n * ```ts\n * toStringSet(\"a\");\n * // ➔ Set { \"a\" }\n * ```\n *\n * @example\n * ```ts\n * toStringSet([\"a\", \"b\", \"a\"]);\n * // ➔ Set { \"a\", \"b\" }\n * ```\n *\n * @example\n * ```ts\n * toStringSet(new Set([\"x\", \"y\"]));\n * // ➔ Set { \"x\", \"y\" }\n * ```\n *\n * @example\n * ```ts\n * toStringSet(123 as any);\n * // ❌ Throws TypeError\n * ```\n *\n * @example\n * ```ts\n * // Disable validation (use cautiously)\n * toStringSet(\"a\", { withValidationType: false });\n * toStringSet(123 as any, { withValidationType: false });\n * ```\n *\n * @internal\n */\nexport const toStringSet = (\n pattern: string | string[] | Set<string>,\n options: {\n withValidationType?: boolean;\n /**\n * The key parameter to identity which is invalid.\n *\n * @default \"pattern\"\n */\n parameterKey?: string;\n } = {}\n): Set<string> => {\n const { withValidationType = true, parameterKey = \"pattern\" } = options;\n if (withValidationType) assertValidatePatternArgs(pattern, parameterKey);\n\n return toObjectSet(pattern);\n};\n\n/** ----------------------------------------------------------------\n * * ***Normalizes a value into a deduplicated `Set`.***\n * ----------------------------------------------------------------\n *\n * Converts a single value, array, or existing `Set` into a `Set<T>`\n * for consistent internal handling.\n *\n * - *Normalization rules:*\n * - `T` ➔ wrapped in a `Set`.\n * - `T[]` ➔ converted to a `Set` (duplicates removed).\n * - `Set<T>` ➔ returned as-is.\n *\n * The returned `Set` is **not mutated** internally by this function.\n * If an existing `Set` is provided, it will be reused.\n *\n * @typeParam T - Value type stored in the set.\n *\n * @param {T | T[] | Set<T>} value - Value to normalize.\n *\n * @returns {Set<T>} A deduplicated set of values.\n *\n * @example\n * ```ts\n * toObjectSet(1);\n * // ➔ Set { 1 }\n * ```\n *\n * @example\n * ```ts\n * toObjectSet([1, 2, 1]);\n * // ➔ Set { 1, 2 }\n * ```\n *\n * @example\n * ```ts\n * toObjectSet(new Set([1, 2]));\n * // ➔ Set { 1, 2 }\n * ```\n *\n * @internal\n */\nexport const toObjectSet = <T>(value: T | T[] | Set<T>): Set<T> => {\n if (isSet(value)) return value;\n\n return new Set(isArray(value) ? value : [value]);\n};\n\n/** ----------------------------------------------------------------\n * * ***Normalize a value into an array.***\n * ----------------------------------------------------------------\n *\n * Converts a single value or an array-like value into a **new array**\n * with consistent typing.\n *\n * - If `value` is already an array ➔ returned as-is.\n * - If `value` is a single item ➔ wrapped in an array.\n *\n * This utility is useful for APIs or configs that accept\n * either a single value or multiple values.\n *\n * ----------------------------------------------------------------\n *\n * @typeParam T\n * The element type of the resulting array.\n *\n * @param value\n * A value or array of values.\n *\n * @returns\n * A normalized array of type `T[]`.\n *\n * ----------------------------------------------------------------\n *\n * @example\n * ```ts\n * toArray(1);\n * // ➔ [1]\n *\n * toArray(\"hello\");\n * // ➔ [\"hello\"]\n *\n * toArray([1, 2, 3]);\n * // ➔ [1, 2, 3]\n * ```\n *\n * @example\n * ```ts\n * type User = { id: number };\n *\n * toArray<User>({ id: 1 });\n * // ➔ [{ id: 1 }]\n *\n * toArray<User>([{ id: 1 }, { id: 2 }]);\n * // ➔ [{ id: 1 }, { id: 2 }]\n * ```\n *\n * @remarks\n * This function does **not** flatten nested arrays.\n * If `value` is already an array, the original reference is preserved.\n *\n * @internal\n */\nexport const toArray = <T>(value: Arrayable<T>): T[] => {\n return isArray(value) ? value : [value];\n};\n"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* ========================================================================
|
|
3
3
|
* @rzl-zone/build-tools
|
|
4
4
|
* ------------------------------------------------------------------------
|
|
5
|
-
* Version: `0.0.
|
|
5
|
+
* Version: `0.0.10`
|
|
6
6
|
* Author: `Rizalvin Dwiky <rizalvindwiky1998@gmail.com>`
|
|
7
7
|
* Repository: `https://github.com/rzl-zone/rzl-zone/tree/main/packages/build-tools`
|
|
8
8
|
* ========================================================================
|
|
@@ -374,4 +374,4 @@ Object.defineProperty(exports, 'toStringSet', {
|
|
|
374
374
|
return toStringSet;
|
|
375
375
|
}
|
|
376
376
|
});
|
|
377
|
-
//# sourceMappingURL=helper-
|
|
377
|
+
//# sourceMappingURL=helper-DvCvgDxy.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helper-BRO-s2fI.cjs","names":[],"sources":["../src/_internal/utils/helper.ts"],"sourcesContent":["import type {\n AnObjectNonArray,\n AnyFunction,\n Arrayable,\n Extends,\n IsArray,\n IsNever,\n NonPlainObject,\n OrArr,\n ReadonlyDeep\n} from \"@/_internal/types/extra\";\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport function deepFreeze<T>(value: T): ReadonlyDeep<T> {\n if (typeof value !== \"object\" || value === null) {\n return value as ReadonlyDeep<T>;\n }\n\n const seen = new WeakSet<object>();\n const stack: object[] = [value as object];\n\n while (stack.length) {\n const obj = stack.pop()!;\n\n if (seen.has(obj) || Object.isFrozen(obj)) continue;\n\n seen.add(obj);\n\n // Map\n if (isMap(obj)) {\n for (const [k, v] of obj) {\n if (typeof k === \"object\" && k !== null) stack.push(k);\n if (typeof v === \"object\" && v !== null) stack.push(v);\n }\n }\n\n // Set\n else if (isSet(obj)) {\n for (const v of obj) {\n if (typeof v === \"object\" && v !== null) stack.push(v);\n }\n }\n\n // Fast path Array\n else if (isArray(obj)) {\n for (const v of obj) {\n if (typeof v === \"object\" && v !== null) stack.push(v);\n }\n } else {\n const record = obj as Record<PropertyKey, unknown>;\n\n for (const key of Reflect.ownKeys(record)) {\n const v = record[key];\n if (typeof v === \"object\" && v !== null) stack.push(v);\n }\n\n // const descriptors = Object.getOwnPropertyDescriptors(obj);\n\n // for (const key of Reflect.ownKeys(descriptors)) {\n // const desc = descriptors[key as keyof typeof descriptors];\n // if (!desc) continue;\n\n // if (\"value\" in desc) {\n // const v = desc.value;\n // if (typeof v === \"object\" && v !== null) stack.push(v);\n // }\n // }\n }\n\n Object.freeze(obj);\n }\n\n return value as ReadonlyDeep<T>;\n}\n// ----------------------------------------------------------------\n\n/** @internal */\nexport function isObjectLoose<T>(\n value: T\n): value is Extract<T, object | AnyFunction> {\n return !isNil(value) && (isObjectOrArray(value) || isFunction(value));\n}\n\nexport function isObjectLike<T>(value: T): value is Extract<T, object> {\n return !isFunction(value) && isObjectLoose(value);\n}\n// ----------------------------------------------------------------\n\n/** ----------------------------------------------------------------\n * * ***Check whether a value is thenable (Promise-like).***\n * ----------------------------------------------------------------\n *\n * Determines whether a value implements a `.then()` method and can be\n * treated as a **thenable** object.\n *\n * This includes:\n * - Native `Promise`.\n * - Promise-like objects returned by libraries.\n * - Custom objects implementing `.then()`.\n *\n * ----------------------------------------------------------------\n *\n * @typeParam T\n * The resolved value type of the thenable.\n *\n * @param v\n * The value to check.\n *\n * @returns\n * `true` if the value is thenable, otherwise `false`.\n *\n * When `true`, the value is narrowed to `PromiseLike<T>`.\n *\n * ----------------------------------------------------------------\n *\n * @example\n * ```ts\n * isThenable(Promise.resolve(1));\n * // ➔ true\n *\n * isThenable({ then: () => {} });\n * // ➔ true\n *\n * isThenable(123);\n * // ➔ false\n * ```\n *\n * @example\n * ```ts\n * async function unwrap<T>(value: T | Promise<T>) {\n * if (isThenable<T>(value)) {\n * return await value;\n * }\n *\n * return value;\n * }\n * ```\n *\n * @remarks\n * Thenables are typically resolved before function execution to support async config factories without enforcing `Promise` instances.\n * - This function checks **behavior**, not identity.\n * - The value does **not** have to be an instance of `Promise`.\n * - Useful for async utilities, lazy evaluation, and hybrid sync/async APIs.\n *\n * @internal\n */\nexport const isThenable = <T = unknown>(v: unknown): v is PromiseLike<T> =>\n v != null &&\n (typeof v === \"object\" || typeof v === \"function\") &&\n typeof (v as PromiseLike<T>).then === \"function\";\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isRegExp = (value: unknown): value is RegExp => {\n return value instanceof RegExp;\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isString = (value: unknown): value is string => {\n return typeof value === \"string\";\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport function isSet<T = unknown>(value: Set<T>): value is Set<T>;\nexport function isSet(value: unknown): value is Set<unknown>;\nexport function isSet(value: unknown): boolean {\n return (\n Object.prototype.toString.call(value) === \"[object Set]\" ||\n value instanceof Set\n );\n}\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport function isMap<K = unknown, V = unknown>(\n value: Map<K, V>\n): value is Map<K, V>;\nexport function isMap(value: unknown): value is Map<unknown, unknown>;\nexport function isMap(value: unknown): boolean {\n return (\n Object.prototype.toString.call(value) === \"[object Map]\" ||\n value instanceof Map\n );\n}\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype ArrayFallback<T> =\n IsNever<Extract<T, unknown[] | readonly unknown[]>> extends true\n ? unknown[] & T\n : Extract<T, unknown[] | readonly unknown[]>;\n\n/** @internal */\nexport function isArray<T>(value: T): value is ArrayFallback<T>;\n// export function isArray<T>(value: T): value is IsNever<Extract<T, unknown[]>> extends true ? unknown[]: Extract<T, unknown[]>;\nexport function isArray(value: unknown): value is unknown[];\nexport function isArray(value: unknown): boolean {\n return Array.isArray(value);\n}\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isNull = (val: unknown): val is null => val === null;\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype IsPlainObjectResult<T> = unknown extends T\n ? Record<PropertyKey, unknown> & T\n : T extends object\n ? T extends NonPlainObject\n ? never\n : IsHasKeysObject<T> extends false\n ? Record<PropertyKey, unknown> & T\n : T\n : Extract<T, Record<PropertyKey, unknown>>;\n\n/** @internal */\nexport function isPlainObject<T>(value: T): value is IsPlainObjectResult<T>;\nexport function isPlainObject<T>(\n value: T\n): value is NonNullable<Extract<T, Record<PropertyKey, unknown>>>;\nexport function isPlainObject(value: unknown) {\n if (!isObject(value)) return false;\n\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype IsObject<T> = unknown extends T\n ? T & Record<PropertyKey, unknown>\n : T extends object\n ? T extends AnObjectNonArray\n ? T\n : IsHasKeysObject<T> extends false\n ? T & Record<PropertyKey, unknown>\n : IsArray<T> extends true\n ? Exclude<T, unknown[]>\n : T\n : never;\n\n/** @internal */\nexport function isObject<T extends object>(value: T): value is IsObject<T>;\nexport function isObject(value: unknown): value is Record<PropertyKey, unknown>;\nexport function isObject(value: unknown): boolean {\n return typeof value === \"object\" && !isNil(value) && !isArray(value);\n}\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype IsHasKeysObject<T> = keyof T extends never ? false : true;\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype IsObjectOrArray<T> =\n OrArr<\n [IsNever<T>, Extends<T, Record<PropertyKey, unknown>>, Extends<unknown, T>]\n > extends true\n ? T & Record<PropertyKey, unknown> & unknown[]\n : T extends object\n ? T extends unknown[]\n ? T\n : T extends AnObjectNonArray\n ? T\n : IsHasKeysObject<T> extends false\n ? T & Record<PropertyKey, unknown>\n : T\n : Extract<T, Record<PropertyKey, unknown> & unknown[]>;\n\n/** @internal */\nexport function isObjectOrArray(value: []): value is [];\nexport function isObjectOrArray<T>(value: T): value is IsObjectOrArray<T>;\nexport function isObjectOrArray<T>(value: T): boolean {\n return isArray(value) || isObject(value);\n}\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isNil = (value: unknown): value is null | undefined => {\n return value == null;\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isBoolean = (value: unknown): value is boolean => {\n return typeof value === \"boolean\";\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isUndefined = (value: unknown): value is undefined => {\n return typeof value === \"undefined\";\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isFunction = (value: unknown): value is AnyFunction => {\n return typeof value === \"function\";\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types\nexport const isNumberObject = (value: unknown): value is Number => {\n return (\n isObject(value) &&\n Object.prototype.toString.call(value) === \"[object Number]\"\n );\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types\nexport const isStringObject = (value: unknown): value is String => {\n return (\n isObject(value) &&\n Object.prototype.toString.call(value) === \"[object String]\"\n );\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types\nexport const isBooleanObject = (value: unknown): value is Boolean => {\n return (\n isObject(value) &&\n Object.prototype.toString.call(value) === \"[object Boolean]\"\n );\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isInfinityNumber = (value: unknown): boolean => {\n if (typeof value === \"number\" || isNumberObject(value)) {\n const num = Number(value);\n return num === Infinity || num === -Infinity;\n }\n return false;\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isSymbol = (value: unknown): value is symbol => {\n return typeof value === \"symbol\";\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isBigInt = (value: unknown): value is bigint => {\n return typeof value === \"bigint\";\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isNaN = (value: unknown): boolean => {\n return typeof value === \"number\"\n ? Number.isNaN(value)\n : isNumberObject(value) && Number.isNaN(value.valueOf());\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype IsNonEmptyStringOptions = {\n /** Whether to trim the string before checking, defaultValue: `true`.\n *\n * @default true */\n trim?: boolean;\n};\n\n/** @internal */\nexport const isNonEmptyString = (\n value: unknown,\n options: IsNonEmptyStringOptions = {}\n): value is string => {\n if (!isString(value)) return false;\n\n const trim = options.trim ?? true;\n\n const str = trim ? value.trim() : value;\n\n return str.length > 0;\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype IsNumberOptions = {\n /** If set to `true`, `NaN` will be considered a valid number, defaultValue: `false`.\n *\n * @default false\n */\n includeNaN?: boolean;\n};\n\n/** @internal */\nexport const isNumber = (\n value: unknown,\n options: IsNumberOptions = {}\n): value is number => {\n const includeNaN =\n isPlainObject(options) && isBoolean(options.includeNaN)\n ? options.includeNaN\n : false;\n\n const aNumber = typeof value === \"number\";\n return includeNaN ? aNumber : aNumber && !Number.isNaN(value);\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isError = (error: unknown): error is Error => {\n return (\n Object.prototype.toString.call(error) === \"[object Error]\" ||\n error instanceof Error\n );\n};\n// ----------------------------------------------------------------\n\n/** @internal */\ntype isDateOptions = {\n /** * ***Skip the validity check (`!isNaN(date.getTime())`).***\n *\n * When `true`, the function only checks that the value is an\n * instance of `Date` without verifying that it represents a valid\n * date value, default: `false`.\n *\n * @default false\n */\n skipInvalidDate?: boolean;\n};\n\n/** @internal */\nexport const isDate = (\n value: unknown,\n options: isDateOptions = {}\n): value is Date => {\n const skipInvalidDate =\n isPlainObject(options) && isBoolean(options.skipInvalidDate)\n ? options.skipInvalidDate\n : false;\n\n const instanceDate = value instanceof Date;\n\n if (skipInvalidDate) return instanceDate;\n return instanceDate && !isNaN(value.getTime());\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport type SafeStableStringifyOptions = {\n /** -------------------------------------------------\n * * ***Whether to sort **object keys** alphabetically (recursively).***\n * -------------------------------------------------\n *\n * - `true` (default): object keys are sorted to ensure stable output.\n * - `false`: preserves original insertion order of keys.\n *\n * @default true\n */\n sortKeys?: boolean;\n /** -------------------------------------------------\n * * ***Whether to sort **primitive values inside arrays**.***\n * -------------------------------------------------\n *\n * - `true`: primitive values in arrays are sorted to ensure stable output.\n * - `false` (default): arrays retain their original order; objects and nested arrays are not reordered.\n *\n * @default false\n */\n sortArray?: boolean;\n /** -------------------------------------------------\n * * ***Whether to pretty-print JSON output with 2-space indentation.***\n * -------------------------------------------------\n *\n * - `true`: output is formatted with indentation and newlines.\n * - `false` (default): produces compact single-line JSON.\n *\n * @default false\n */\n pretty?: boolean;\n /** -------------------------------------------------\n * * ***Preserve `undefined` values instead of converting them to `null`.***\n * -------------------------------------------------\n * **Controls how the internal `deepProcess` step rewrites values\n * **before** the final `JSON.stringify` call.**\n * - **Default (`false`):**\n * * Every `undefined` value (object properties **and** array elements)\n * is replaced with `null` **before** serialization, because this happens\n * first, the key is **not removed** by `JSON.stringify`.\n * - **`true`** – Leaves `undefined` untouched so the final\n * `JSON.stringify` call behaves natively:\n * * Object properties with `undefined` are **removed**.\n * * Array elements that are `undefined` become `null`.\n * @default false\n * @example\n * // ✅ keepUndefined = true: behaves like native JSON.stringify\n * safeStableStringify({ a: undefined }, { keepUndefined: true });\n * // ➔ '{}' // key removed\n *\n * // ✅ Default (false): convert undefined to null, key kept\n * safeStableStringify({ a: undefined });\n * // ➔ '{\"a\":null}' // key present, value null\n *\n * // Arrays\n * safeStableStringify([undefined]);\n * // ➔ '[null]' // same, but via pre-replacement\n * safeStableStringify([undefined], { keepUndefined: true });\n * // ➔ '[null]' // element becomes null\n */\n keepUndefined?: boolean;\n};\n\n/** @internal */\nexport const safeStableStringify = (\n value: unknown,\n options: SafeStableStringifyOptions = {}\n): string => {\n const pretty = options.pretty ?? false;\n const sortKeys = options.sortKeys ?? true;\n const sortArray = options.sortArray ?? false;\n const keepUndefined = options.keepUndefined ?? false;\n\n if (isUndefined(value)) {\n return keepUndefined ? \"undefined\" : \"null\";\n }\n\n const seen = new WeakSet();\n\n const isPrimitive = (val: unknown): boolean =>\n isNull(val) || (!isObjectOrArray(val) && !isFunction(val));\n\n const deepProcess = (val: unknown): unknown => {\n if (isNumberObject(val)) {\n const valOf = val.valueOf();\n return isNaN(valOf) || isInfinityNumber(valOf) ? null : valOf;\n }\n if (isStringObject(val)) return val.valueOf();\n if (isBooleanObject(val)) return val.valueOf();\n if (isFunction(val) || isSymbol(val)) return undefined;\n if (isBigInt(val)) return val.toString();\n if (isNaN(val) || isInfinityNumber(val)) return null;\n if (isUndefined(val)) {\n return keepUndefined ? undefined : null;\n }\n\n if (isObjectOrArray(val)) {\n if (seen.has(val)) return \"[Circular]\";\n seen.add(val);\n\n if (isDate(val)) return val.toISOString();\n if (isMap(val)) {\n return {\n map: Array.from(val.entries()).map(([k, v]) => [k, deepProcess(v)])\n };\n }\n if (isSet(val)) return { set: Array.from(val.values()).map(deepProcess) };\n\n if (isArray(val)) {\n const processedArr = val.map(deepProcess);\n if (sortArray) {\n const primitives: unknown[] = [];\n const nonPrimitives: unknown[] = [];\n\n for (const item of processedArr) {\n if (isPrimitive(item)) primitives.push(item);\n else nonPrimitives.push(item);\n }\n primitives.sort((a, b) => {\n if (isNumber(a) && isNumber(b)) return a - b;\n return String(a).localeCompare(String(b));\n });\n return [...primitives, ...nonPrimitives];\n }\n return processedArr;\n }\n\n const keys = Object.keys(val);\n if (sortKeys) {\n keys.sort((a, b) => {\n const na = Number(a);\n const nb = Number(b);\n if (!isNaN(na) && !isNaN(nb)) return na - nb;\n return a.localeCompare(b);\n });\n }\n\n const result: Record<string, unknown> = {};\n\n if (isObject(val)) {\n for (const k of keys) {\n const v = deepProcess(val[k]);\n if (!isUndefined(v)) result[k] = v;\n }\n }\n\n return result;\n }\n\n return val;\n };\n\n try {\n return JSON.stringify(deepProcess(value), null, pretty ? 2 : 0);\n } catch (err) {\n console.warn(\"Error in safeStableStringify:\", err);\n return \"{}\";\n }\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype NormalizeSpacesOptions = {\n /** If `true`, skips normalization and only trims whitespace from start & end, defaultValue: `false`.\n *\n * @default false\n */\n trimOnly?: boolean;\n /** If `false`, skips trimming value, defaultValue: `true`.\n *\n * @default true\n */\n withTrim?: boolean;\n};\n\n/** @internal */\nexport const normalizeSpaces = (\n value: string | null | undefined,\n options: NormalizeSpacesOptions = {\n withTrim: true,\n trimOnly: false\n }\n): string => {\n if (!isNonEmptyString(value)) return \"\";\n\n if (!isPlainObject(options)) {\n options = {};\n }\n\n const { trimOnly = false, withTrim = true } = options;\n\n if (trimOnly) return value.trim();\n\n if (withTrim) {\n value = value.trim();\n }\n\n // Remove all duplicate spaces (including tabs, newlines, etc.)\n return value.replace(/\\s+/g, \" \");\n};\n\n// ----------------------------------------------------------------\n\n/** ----------------------------------------------------------------\n * * ***Checks whether a value is an array of strings.***\n * ----------------------------------------------------------------\n *\n * Type guard that validates the input is an `Array` where **all**\n * elements are strings.\n *\n * @param {unknown} v - The value to test.\n *\n * @returns {boolean} `true` if the value is a `string[]`.\n *\n * @internal\n */\nexport const isStringArray = (v: unknown): v is string[] =>\n isArray(v) && v.every((i) => isString(i));\n\n/** ----------------------------------------------------------------\n * * ***Checks whether a value is a Set of strings.***\n * ----------------------------------------------------------------\n *\n * Type guard that validates the input is a `Set` where **all**\n * entries are strings.\n *\n * @param {unknown} v - The value to test.\n *\n * @returns {boolean} `true` if the value is a `Set<string>`.\n *\n * @internal\n */\nexport const isStringSet = (v: unknown): v is Set<string> =>\n isSet(v) && [...v].every((i) => isString(i));\n\n/** ----------------------------------------------------------------\n * * ***Asserts that a value is a valid pattern input.***\n * ----------------------------------------------------------------\n *\n * Runtime assertion that validates the provided value is one of the\n * supported pattern types:\n * - `string`.\n * - `string[]`.\n * - `Set<string>`.\n *\n * This function is intended to be used at API boundaries to ensure\n * type safety before further processing.\n *\n * @param {unknown} v - The value to validate.\n * @param {string|undefined} parameterKey - The key parameter to identity which is invalid, default `\"pattern\"`.\n *\n * @throws {TypeError} If the value is not a valid pattern input.\n *\n * @example\n * ```ts\n * assertValidatePatternArgs(pattern);\n * // pattern is now typed as:\n * // string | string[] | Set<string>\n * ```\n *\n * @internal\n */\nexport const assertValidatePatternArgs: (\n v: unknown,\n parameterKey?: string\n) => asserts v is string | string[] | Set<string> = (\n v: unknown,\n parameterKey: string = \"pattern\"\n) => {\n if (!isString(v) && !isStringArray(v) && !isStringSet(v)) {\n throw new TypeError(\n `The \\`${parameterKey}\\` argument must be a string, string[] or Set<string>.`\n );\n }\n};\n\n/** ----------------------------------------------------------------\n * * ***Flattens nested arrays and extracts string values only.***\n * ----------------------------------------------------------------\n *\n * Recursively flattens an input array to **infinite depth** and\n * filters out all non-string values.\n *\n * - *Normalization rules:*\n * - Nested arrays are flattened using `Array.prototype.flat(Infinity)`.\n * - Only values with `typeof === \"string\"` are kept.\n * - Non-string values are discarded.\n *\n * The returned array is always a **new instance** and does not mutate\n * the original input.\n *\n * @param {readonly unknown[]} input - Arbitrary nested array input.\n *\n * @returns {string[]} A flat array containing only string values.\n *\n * @example\n * ```ts\n * flattenStrings([\"a\", [\"b\", [\"c\"]], 1, null]);\n * // ➔ [\"a\", \"b\", \"c\"]\n * ```\n *\n * @internal\n */\nexport const flattenStrings = (input: readonly unknown[]): string[] => {\n return input.flat(Infinity).filter((v): v is string => typeof v === \"string\");\n};\n\n/** ----------------------------------------------------------------\n * * ***Normalizes pattern input into a new `Set<string>` instance.***\n * ----------------------------------------------------------------\n *\n * Converts a pattern value into a deduplicated `Set<string>` for\n * consistent internal handling.\n *\n * #### Normalization behavior\n * - `string` ➔ wrapped into a `Set`.\n * - `string[]` ➔ converted into a `Set` (duplicates removed).\n * - `Set<string>` ➔ cloned into a new `Set`.\n *\n * The returned set is **always a new instance** and the original\n * input is never mutated.\n *\n * #### Validation\n * When `withValidationType` is `true` (default), the input will be\n * validated before normalization.\n *\n * If the provided `pattern` is not one of the supported types,\n * a `TypeError` will be thrown.\n *\n * @param pattern - Pattern value to normalize.\n * @param options - Optional configuration object.\n * @param options.withValidationType - Whether to validate the input\n * before normalization. Defaults to `true`.\n * @param options.parameterKey - The key parameter to identity which is invalid, default `\"pattern\"`.\n *\n * @returns A new deduplicated `Set<string>` instance.\n *\n * @throws {TypeError}\n * Thrown when `pattern` is not a `string`, `string[]`, or `Set<string>`\n * and validation is enabled.\n *\n * @example\n * ```ts\n * toStringSet(\"a\");\n * // ➔ Set { \"a\" }\n * ```\n *\n * @example\n * ```ts\n * toStringSet([\"a\", \"b\", \"a\"]);\n * // ➔ Set { \"a\", \"b\" }\n * ```\n *\n * @example\n * ```ts\n * toStringSet(new Set([\"x\", \"y\"]));\n * // ➔ Set { \"x\", \"y\" }\n * ```\n *\n * @example\n * ```ts\n * toStringSet(123 as any);\n * // ❌ Throws TypeError\n * ```\n *\n * @example\n * ```ts\n * // Disable validation (use cautiously)\n * toStringSet(\"a\", { withValidationType: false });\n * toStringSet(123 as any, { withValidationType: false });\n * ```\n *\n * @internal\n */\nexport const toStringSet = (\n pattern: string | string[] | Set<string>,\n options: {\n withValidationType?: boolean;\n /**\n * The key parameter to identity which is invalid.\n *\n * @default \"pattern\"\n */\n parameterKey?: string;\n } = {}\n): Set<string> => {\n const { withValidationType = true, parameterKey = \"pattern\" } = options;\n if (withValidationType) assertValidatePatternArgs(pattern, parameterKey);\n\n return toObjectSet(pattern);\n};\n\n/** ----------------------------------------------------------------\n * * ***Normalizes a value into a deduplicated `Set`.***\n * ----------------------------------------------------------------\n *\n * Converts a single value, array, or existing `Set` into a `Set<T>`\n * for consistent internal handling.\n *\n * - *Normalization rules:*\n * - `T` ➔ wrapped in a `Set`.\n * - `T[]` ➔ converted to a `Set` (duplicates removed).\n * - `Set<T>` ➔ returned as-is.\n *\n * The returned `Set` is **not mutated** internally by this function.\n * If an existing `Set` is provided, it will be reused.\n *\n * @typeParam T - Value type stored in the set.\n *\n * @param {T | T[] | Set<T>} value - Value to normalize.\n *\n * @returns {Set<T>} A deduplicated set of values.\n *\n * @example\n * ```ts\n * toObjectSet(1);\n * // ➔ Set { 1 }\n * ```\n *\n * @example\n * ```ts\n * toObjectSet([1, 2, 1]);\n * // ➔ Set { 1, 2 }\n * ```\n *\n * @example\n * ```ts\n * toObjectSet(new Set([1, 2]));\n * // ➔ Set { 1, 2 }\n * ```\n *\n * @internal\n */\nexport const toObjectSet = <T>(value: T | T[] | Set<T>): Set<T> => {\n if (isSet(value)) return value;\n\n return new Set(isArray(value) ? value : [value]);\n};\n\n/** ----------------------------------------------------------------\n * * ***Normalize a value into an array.***\n * ----------------------------------------------------------------\n *\n * Converts a single value or an array-like value into a **new array**\n * with consistent typing.\n *\n * - If `value` is already an array ➔ returned as-is.\n * - If `value` is a single item ➔ wrapped in an array.\n *\n * This utility is useful for APIs or configs that accept\n * either a single value or multiple values.\n *\n * ----------------------------------------------------------------\n *\n * @typeParam T\n * The element type of the resulting array.\n *\n * @param value\n * A value or array of values.\n *\n * @returns\n * A normalized array of type `T[]`.\n *\n * ----------------------------------------------------------------\n *\n * @example\n * ```ts\n * toArray(1);\n * // ➔ [1]\n *\n * toArray(\"hello\");\n * // ➔ [\"hello\"]\n *\n * toArray([1, 2, 3]);\n * // ➔ [1, 2, 3]\n * ```\n *\n * @example\n * ```ts\n * type User = { id: number };\n *\n * toArray<User>({ id: 1 });\n * // ➔ [{ id: 1 }]\n *\n * toArray<User>([{ id: 1 }, { id: 2 }]);\n * // ➔ [{ id: 1 }, { id: 2 }]\n * ```\n *\n * @remarks\n * This function does **not** flatten nested arrays.\n * If `value` is already an array, the original reference is preserved.\n *\n * @internal\n */\nexport const toArray = <T>(value: Arrayable<T>): T[] => {\n return isArray(value) ? value : [value];\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"helper-DvCvgDxy.cjs","names":[],"sources":["../src/_internal/utils/helper.ts"],"sourcesContent":["import type {\n AnObjectNonArray,\n AnyFunction,\n Arrayable,\n Extends,\n IsArray,\n IsNever,\n NonPlainObject,\n OrArr,\n ReadonlyDeep\n} from \"@/_internal/types/extra\";\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport function deepFreeze<T>(value: T): ReadonlyDeep<T> {\n if (typeof value !== \"object\" || value === null) {\n return value as ReadonlyDeep<T>;\n }\n\n const seen = new WeakSet<object>();\n const stack: object[] = [value as object];\n\n while (stack.length) {\n const obj = stack.pop()!;\n\n if (seen.has(obj) || Object.isFrozen(obj)) continue;\n\n seen.add(obj);\n\n // Map\n if (isMap(obj)) {\n for (const [k, v] of obj) {\n if (typeof k === \"object\" && k !== null) stack.push(k);\n if (typeof v === \"object\" && v !== null) stack.push(v);\n }\n }\n\n // Set\n else if (isSet(obj)) {\n for (const v of obj) {\n if (typeof v === \"object\" && v !== null) stack.push(v);\n }\n }\n\n // Fast path Array\n else if (isArray(obj)) {\n for (const v of obj) {\n if (typeof v === \"object\" && v !== null) stack.push(v);\n }\n } else {\n const record = obj as Record<PropertyKey, unknown>;\n\n for (const key of Reflect.ownKeys(record)) {\n const v = record[key];\n if (typeof v === \"object\" && v !== null) stack.push(v);\n }\n\n // const descriptors = Object.getOwnPropertyDescriptors(obj);\n\n // for (const key of Reflect.ownKeys(descriptors)) {\n // const desc = descriptors[key as keyof typeof descriptors];\n // if (!desc) continue;\n\n // if (\"value\" in desc) {\n // const v = desc.value;\n // if (typeof v === \"object\" && v !== null) stack.push(v);\n // }\n // }\n }\n\n Object.freeze(obj);\n }\n\n return value as ReadonlyDeep<T>;\n}\n// ----------------------------------------------------------------\n\n/** @internal */\nexport function isObjectLoose<T>(\n value: T\n): value is Extract<T, object | AnyFunction> {\n return !isNil(value) && (isObjectOrArray(value) || isFunction(value));\n}\n\nexport function isObjectLike<T>(value: T): value is Extract<T, object> {\n return !isFunction(value) && isObjectLoose(value);\n}\n// ----------------------------------------------------------------\n\n/** ----------------------------------------------------------------\n * * ***Check whether a value is thenable (Promise-like).***\n * ----------------------------------------------------------------\n *\n * Determines whether a value implements a `.then()` method and can be\n * treated as a **thenable** object.\n *\n * This includes:\n * - Native `Promise`.\n * - Promise-like objects returned by libraries.\n * - Custom objects implementing `.then()`.\n *\n * ----------------------------------------------------------------\n *\n * @typeParam T\n * The resolved value type of the thenable.\n *\n * @param v\n * The value to check.\n *\n * @returns\n * `true` if the value is thenable, otherwise `false`.\n *\n * When `true`, the value is narrowed to `PromiseLike<T>`.\n *\n * ----------------------------------------------------------------\n *\n * @example\n * ```ts\n * isThenable(Promise.resolve(1));\n * // ➔ true\n *\n * isThenable({ then: () => {} });\n * // ➔ true\n *\n * isThenable(123);\n * // ➔ false\n * ```\n *\n * @example\n * ```ts\n * async function unwrap<T>(value: T | Promise<T>) {\n * if (isThenable<T>(value)) {\n * return await value;\n * }\n *\n * return value;\n * }\n * ```\n *\n * @remarks\n * Thenables are typically resolved before function execution to support async config factories without enforcing `Promise` instances.\n * - This function checks **behavior**, not identity.\n * - The value does **not** have to be an instance of `Promise`.\n * - Useful for async utilities, lazy evaluation, and hybrid sync/async APIs.\n *\n * @internal\n */\nexport const isThenable = <T = unknown>(v: unknown): v is PromiseLike<T> =>\n v != null &&\n (typeof v === \"object\" || typeof v === \"function\") &&\n typeof (v as PromiseLike<T>).then === \"function\";\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isRegExp = (value: unknown): value is RegExp => {\n return value instanceof RegExp;\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isString = (value: unknown): value is string => {\n return typeof value === \"string\";\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport function isSet<T = unknown>(value: Set<T>): value is Set<T>;\nexport function isSet(value: unknown): value is Set<unknown>;\nexport function isSet(value: unknown): boolean {\n return (\n Object.prototype.toString.call(value) === \"[object Set]\" ||\n value instanceof Set\n );\n}\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport function isMap<K = unknown, V = unknown>(\n value: Map<K, V>\n): value is Map<K, V>;\nexport function isMap(value: unknown): value is Map<unknown, unknown>;\nexport function isMap(value: unknown): boolean {\n return (\n Object.prototype.toString.call(value) === \"[object Map]\" ||\n value instanceof Map\n );\n}\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype ArrayFallback<T> =\n IsNever<Extract<T, unknown[] | readonly unknown[]>> extends true\n ? unknown[] & T\n : Extract<T, unknown[] | readonly unknown[]>;\n\n/** @internal */\nexport function isArray<T>(value: T): value is ArrayFallback<T>;\n// export function isArray<T>(value: T): value is IsNever<Extract<T, unknown[]>> extends true ? unknown[]: Extract<T, unknown[]>;\nexport function isArray(value: unknown): value is unknown[];\nexport function isArray(value: unknown): boolean {\n return Array.isArray(value);\n}\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isNull = (val: unknown): val is null => val === null;\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype IsPlainObjectResult<T> = unknown extends T\n ? Record<PropertyKey, unknown> & T\n : T extends object\n ? T extends NonPlainObject\n ? never\n : IsHasKeysObject<T> extends false\n ? Record<PropertyKey, unknown> & T\n : T\n : Extract<T, Record<PropertyKey, unknown>>;\n\n/** @internal */\nexport function isPlainObject<T>(value: T): value is IsPlainObjectResult<T>;\nexport function isPlainObject<T>(\n value: T\n): value is NonNullable<Extract<T, Record<PropertyKey, unknown>>>;\nexport function isPlainObject(value: unknown) {\n if (!isObject(value)) return false;\n\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype IsObject<T> = unknown extends T\n ? T & Record<PropertyKey, unknown>\n : T extends object\n ? T extends AnObjectNonArray\n ? T\n : IsHasKeysObject<T> extends false\n ? T & Record<PropertyKey, unknown>\n : IsArray<T> extends true\n ? Exclude<T, unknown[]>\n : T\n : never;\n\n/** @internal */\nexport function isObject<T extends object>(value: T): value is IsObject<T>;\nexport function isObject(value: unknown): value is Record<PropertyKey, unknown>;\nexport function isObject(value: unknown): boolean {\n return typeof value === \"object\" && !isNil(value) && !isArray(value);\n}\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype IsHasKeysObject<T> = keyof T extends never ? false : true;\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype IsObjectOrArray<T> =\n OrArr<\n [IsNever<T>, Extends<T, Record<PropertyKey, unknown>>, Extends<unknown, T>]\n > extends true\n ? T & Record<PropertyKey, unknown> & unknown[]\n : T extends object\n ? T extends unknown[]\n ? T\n : T extends AnObjectNonArray\n ? T\n : IsHasKeysObject<T> extends false\n ? T & Record<PropertyKey, unknown>\n : T\n : Extract<T, Record<PropertyKey, unknown> & unknown[]>;\n\n/** @internal */\nexport function isObjectOrArray(value: []): value is [];\nexport function isObjectOrArray<T>(value: T): value is IsObjectOrArray<T>;\nexport function isObjectOrArray<T>(value: T): boolean {\n return isArray(value) || isObject(value);\n}\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isNil = (value: unknown): value is null | undefined => {\n return value == null;\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isBoolean = (value: unknown): value is boolean => {\n return typeof value === \"boolean\";\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isUndefined = (value: unknown): value is undefined => {\n return typeof value === \"undefined\";\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isFunction = (value: unknown): value is AnyFunction => {\n return typeof value === \"function\";\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types\nexport const isNumberObject = (value: unknown): value is Number => {\n return (\n isObject(value) &&\n Object.prototype.toString.call(value) === \"[object Number]\"\n );\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types\nexport const isStringObject = (value: unknown): value is String => {\n return (\n isObject(value) &&\n Object.prototype.toString.call(value) === \"[object String]\"\n );\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types\nexport const isBooleanObject = (value: unknown): value is Boolean => {\n return (\n isObject(value) &&\n Object.prototype.toString.call(value) === \"[object Boolean]\"\n );\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isInfinityNumber = (value: unknown): boolean => {\n if (typeof value === \"number\" || isNumberObject(value)) {\n const num = Number(value);\n return num === Infinity || num === -Infinity;\n }\n return false;\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isSymbol = (value: unknown): value is symbol => {\n return typeof value === \"symbol\";\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isBigInt = (value: unknown): value is bigint => {\n return typeof value === \"bigint\";\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isNaN = (value: unknown): boolean => {\n return typeof value === \"number\"\n ? Number.isNaN(value)\n : isNumberObject(value) && Number.isNaN(value.valueOf());\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype IsNonEmptyStringOptions = {\n /** Whether to trim the string before checking, defaultValue: `true`.\n *\n * @default true */\n trim?: boolean;\n};\n\n/** @internal */\nexport const isNonEmptyString = (\n value: unknown,\n options: IsNonEmptyStringOptions = {}\n): value is string => {\n if (!isString(value)) return false;\n\n const trim = options.trim ?? true;\n\n const str = trim ? value.trim() : value;\n\n return str.length > 0;\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype IsNumberOptions = {\n /** If set to `true`, `NaN` will be considered a valid number, defaultValue: `false`.\n *\n * @default false\n */\n includeNaN?: boolean;\n};\n\n/** @internal */\nexport const isNumber = (\n value: unknown,\n options: IsNumberOptions = {}\n): value is number => {\n const includeNaN =\n isPlainObject(options) && isBoolean(options.includeNaN)\n ? options.includeNaN\n : false;\n\n const aNumber = typeof value === \"number\";\n return includeNaN ? aNumber : aNumber && !Number.isNaN(value);\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport const isError = (error: unknown): error is Error => {\n return (\n Object.prototype.toString.call(error) === \"[object Error]\" ||\n error instanceof Error\n );\n};\n// ----------------------------------------------------------------\n\n/** @internal */\ntype isDateOptions = {\n /** * ***Skip the validity check (`!isNaN(date.getTime())`).***\n *\n * When `true`, the function only checks that the value is an\n * instance of `Date` without verifying that it represents a valid\n * date value, default: `false`.\n *\n * @default false\n */\n skipInvalidDate?: boolean;\n};\n\n/** @internal */\nexport const isDate = (\n value: unknown,\n options: isDateOptions = {}\n): value is Date => {\n const skipInvalidDate =\n isPlainObject(options) && isBoolean(options.skipInvalidDate)\n ? options.skipInvalidDate\n : false;\n\n const instanceDate = value instanceof Date;\n\n if (skipInvalidDate) return instanceDate;\n return instanceDate && !isNaN(value.getTime());\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\nexport type SafeStableStringifyOptions = {\n /** -------------------------------------------------\n * * ***Whether to sort **object keys** alphabetically (recursively).***\n * -------------------------------------------------\n *\n * - `true` (default): object keys are sorted to ensure stable output.\n * - `false`: preserves original insertion order of keys.\n *\n * @default true\n */\n sortKeys?: boolean;\n /** -------------------------------------------------\n * * ***Whether to sort **primitive values inside arrays**.***\n * -------------------------------------------------\n *\n * - `true`: primitive values in arrays are sorted to ensure stable output.\n * - `false` (default): arrays retain their original order; objects and nested arrays are not reordered.\n *\n * @default false\n */\n sortArray?: boolean;\n /** -------------------------------------------------\n * * ***Whether to pretty-print JSON output with 2-space indentation.***\n * -------------------------------------------------\n *\n * - `true`: output is formatted with indentation and newlines.\n * - `false` (default): produces compact single-line JSON.\n *\n * @default false\n */\n pretty?: boolean;\n /** -------------------------------------------------\n * * ***Preserve `undefined` values instead of converting them to `null`.***\n * -------------------------------------------------\n * **Controls how the internal `deepProcess` step rewrites values\n * **before** the final `JSON.stringify` call.**\n * - **Default (`false`):**\n * * Every `undefined` value (object properties **and** array elements)\n * is replaced with `null` **before** serialization, because this happens\n * first, the key is **not removed** by `JSON.stringify`.\n * - **`true`** – Leaves `undefined` untouched so the final\n * `JSON.stringify` call behaves natively:\n * * Object properties with `undefined` are **removed**.\n * * Array elements that are `undefined` become `null`.\n * @default false\n * @example\n * // ✅ keepUndefined = true: behaves like native JSON.stringify\n * safeStableStringify({ a: undefined }, { keepUndefined: true });\n * // ➔ '{}' // key removed\n *\n * // ✅ Default (false): convert undefined to null, key kept\n * safeStableStringify({ a: undefined });\n * // ➔ '{\"a\":null}' // key present, value null\n *\n * // Arrays\n * safeStableStringify([undefined]);\n * // ➔ '[null]' // same, but via pre-replacement\n * safeStableStringify([undefined], { keepUndefined: true });\n * // ➔ '[null]' // element becomes null\n */\n keepUndefined?: boolean;\n};\n\n/** @internal */\nexport const safeStableStringify = (\n value: unknown,\n options: SafeStableStringifyOptions = {}\n): string => {\n const pretty = options.pretty ?? false;\n const sortKeys = options.sortKeys ?? true;\n const sortArray = options.sortArray ?? false;\n const keepUndefined = options.keepUndefined ?? false;\n\n if (isUndefined(value)) {\n return keepUndefined ? \"undefined\" : \"null\";\n }\n\n const seen = new WeakSet();\n\n const isPrimitive = (val: unknown): boolean =>\n isNull(val) || (!isObjectOrArray(val) && !isFunction(val));\n\n const deepProcess = (val: unknown): unknown => {\n if (isNumberObject(val)) {\n const valOf = val.valueOf();\n return isNaN(valOf) || isInfinityNumber(valOf) ? null : valOf;\n }\n if (isStringObject(val)) return val.valueOf();\n if (isBooleanObject(val)) return val.valueOf();\n if (isFunction(val) || isSymbol(val)) return undefined;\n if (isBigInt(val)) return val.toString();\n if (isNaN(val) || isInfinityNumber(val)) return null;\n if (isUndefined(val)) {\n return keepUndefined ? undefined : null;\n }\n\n if (isObjectOrArray(val)) {\n if (seen.has(val)) return \"[Circular]\";\n seen.add(val);\n\n if (isDate(val)) return val.toISOString();\n if (isMap(val)) {\n return {\n map: Array.from(val.entries()).map(([k, v]) => [k, deepProcess(v)])\n };\n }\n if (isSet(val)) return { set: Array.from(val.values()).map(deepProcess) };\n\n if (isArray(val)) {\n const processedArr = val.map(deepProcess);\n if (sortArray) {\n const primitives: unknown[] = [];\n const nonPrimitives: unknown[] = [];\n\n for (const item of processedArr) {\n if (isPrimitive(item)) primitives.push(item);\n else nonPrimitives.push(item);\n }\n primitives.sort((a, b) => {\n if (isNumber(a) && isNumber(b)) return a - b;\n return String(a).localeCompare(String(b));\n });\n return [...primitives, ...nonPrimitives];\n }\n return processedArr;\n }\n\n const keys = Object.keys(val);\n if (sortKeys) {\n keys.sort((a, b) => {\n const na = Number(a);\n const nb = Number(b);\n if (!isNaN(na) && !isNaN(nb)) return na - nb;\n return a.localeCompare(b);\n });\n }\n\n const result: Record<string, unknown> = {};\n\n if (isObject(val)) {\n for (const k of keys) {\n const v = deepProcess(val[k]);\n if (!isUndefined(v)) result[k] = v;\n }\n }\n\n return result;\n }\n\n return val;\n };\n\n try {\n return JSON.stringify(deepProcess(value), null, pretty ? 2 : 0);\n } catch (err) {\n console.warn(\"Error in safeStableStringify:\", err);\n return \"{}\";\n }\n};\n\n// ----------------------------------------------------------------\n\n/** @internal */\ntype NormalizeSpacesOptions = {\n /** If `true`, skips normalization and only trims whitespace from start & end, defaultValue: `false`.\n *\n * @default false\n */\n trimOnly?: boolean;\n /** If `false`, skips trimming value, defaultValue: `true`.\n *\n * @default true\n */\n withTrim?: boolean;\n};\n\n/** @internal */\nexport const normalizeSpaces = (\n value: string | null | undefined,\n options: NormalizeSpacesOptions = {\n withTrim: true,\n trimOnly: false\n }\n): string => {\n if (!isNonEmptyString(value)) return \"\";\n\n if (!isPlainObject(options)) {\n options = {};\n }\n\n const { trimOnly = false, withTrim = true } = options;\n\n if (trimOnly) return value.trim();\n\n if (withTrim) {\n value = value.trim();\n }\n\n // Remove all duplicate spaces (including tabs, newlines, etc.)\n return value.replace(/\\s+/g, \" \");\n};\n\n// ----------------------------------------------------------------\n\n/** ----------------------------------------------------------------\n * * ***Checks whether a value is an array of strings.***\n * ----------------------------------------------------------------\n *\n * Type guard that validates the input is an `Array` where **all**\n * elements are strings.\n *\n * @param {unknown} v - The value to test.\n *\n * @returns {boolean} `true` if the value is a `string[]`.\n *\n * @internal\n */\nexport const isStringArray = (v: unknown): v is string[] =>\n isArray(v) && v.every((i) => isString(i));\n\n/** ----------------------------------------------------------------\n * * ***Checks whether a value is a Set of strings.***\n * ----------------------------------------------------------------\n *\n * Type guard that validates the input is a `Set` where **all**\n * entries are strings.\n *\n * @param {unknown} v - The value to test.\n *\n * @returns {boolean} `true` if the value is a `Set<string>`.\n *\n * @internal\n */\nexport const isStringSet = (v: unknown): v is Set<string> =>\n isSet(v) && [...v].every((i) => isString(i));\n\n/** ----------------------------------------------------------------\n * * ***Asserts that a value is a valid pattern input.***\n * ----------------------------------------------------------------\n *\n * Runtime assertion that validates the provided value is one of the\n * supported pattern types:\n * - `string`.\n * - `string[]`.\n * - `Set<string>`.\n *\n * This function is intended to be used at API boundaries to ensure\n * type safety before further processing.\n *\n * @param {unknown} v - The value to validate.\n * @param {string|undefined} parameterKey - The key parameter to identity which is invalid, default `\"pattern\"`.\n *\n * @throws {TypeError} If the value is not a valid pattern input.\n *\n * @example\n * ```ts\n * assertValidatePatternArgs(pattern);\n * // pattern is now typed as:\n * // string | string[] | Set<string>\n * ```\n *\n * @internal\n */\nexport const assertValidatePatternArgs: (\n v: unknown,\n parameterKey?: string\n) => asserts v is string | string[] | Set<string> = (\n v: unknown,\n parameterKey: string = \"pattern\"\n) => {\n if (!isString(v) && !isStringArray(v) && !isStringSet(v)) {\n throw new TypeError(\n `The \\`${parameterKey}\\` argument must be a string, string[] or Set<string>.`\n );\n }\n};\n\n/** ----------------------------------------------------------------\n * * ***Flattens nested arrays and extracts string values only.***\n * ----------------------------------------------------------------\n *\n * Recursively flattens an input array to **infinite depth** and\n * filters out all non-string values.\n *\n * - *Normalization rules:*\n * - Nested arrays are flattened using `Array.prototype.flat(Infinity)`.\n * - Only values with `typeof === \"string\"` are kept.\n * - Non-string values are discarded.\n *\n * The returned array is always a **new instance** and does not mutate\n * the original input.\n *\n * @param {readonly unknown[]} input - Arbitrary nested array input.\n *\n * @returns {string[]} A flat array containing only string values.\n *\n * @example\n * ```ts\n * flattenStrings([\"a\", [\"b\", [\"c\"]], 1, null]);\n * // ➔ [\"a\", \"b\", \"c\"]\n * ```\n *\n * @internal\n */\nexport const flattenStrings = (input: readonly unknown[]): string[] => {\n return input.flat(Infinity).filter((v): v is string => typeof v === \"string\");\n};\n\n/** ----------------------------------------------------------------\n * * ***Normalizes pattern input into a new `Set<string>` instance.***\n * ----------------------------------------------------------------\n *\n * Converts a pattern value into a deduplicated `Set<string>` for\n * consistent internal handling.\n *\n * #### Normalization behavior\n * - `string` ➔ wrapped into a `Set`.\n * - `string[]` ➔ converted into a `Set` (duplicates removed).\n * - `Set<string>` ➔ cloned into a new `Set`.\n *\n * The returned set is **always a new instance** and the original\n * input is never mutated.\n *\n * #### Validation\n * When `withValidationType` is `true` (default), the input will be\n * validated before normalization.\n *\n * If the provided `pattern` is not one of the supported types,\n * a `TypeError` will be thrown.\n *\n * @param pattern - Pattern value to normalize.\n * @param options - Optional configuration object.\n * @param options.withValidationType - Whether to validate the input\n * before normalization. Defaults to `true`.\n * @param options.parameterKey - The key parameter to identity which is invalid, default `\"pattern\"`.\n *\n * @returns A new deduplicated `Set<string>` instance.\n *\n * @throws {TypeError}\n * Thrown when `pattern` is not a `string`, `string[]`, or `Set<string>`\n * and validation is enabled.\n *\n * @example\n * ```ts\n * toStringSet(\"a\");\n * // ➔ Set { \"a\" }\n * ```\n *\n * @example\n * ```ts\n * toStringSet([\"a\", \"b\", \"a\"]);\n * // ➔ Set { \"a\", \"b\" }\n * ```\n *\n * @example\n * ```ts\n * toStringSet(new Set([\"x\", \"y\"]));\n * // ➔ Set { \"x\", \"y\" }\n * ```\n *\n * @example\n * ```ts\n * toStringSet(123 as any);\n * // ❌ Throws TypeError\n * ```\n *\n * @example\n * ```ts\n * // Disable validation (use cautiously)\n * toStringSet(\"a\", { withValidationType: false });\n * toStringSet(123 as any, { withValidationType: false });\n * ```\n *\n * @internal\n */\nexport const toStringSet = (\n pattern: string | string[] | Set<string>,\n options: {\n withValidationType?: boolean;\n /**\n * The key parameter to identity which is invalid.\n *\n * @default \"pattern\"\n */\n parameterKey?: string;\n } = {}\n): Set<string> => {\n const { withValidationType = true, parameterKey = \"pattern\" } = options;\n if (withValidationType) assertValidatePatternArgs(pattern, parameterKey);\n\n return toObjectSet(pattern);\n};\n\n/** ----------------------------------------------------------------\n * * ***Normalizes a value into a deduplicated `Set`.***\n * ----------------------------------------------------------------\n *\n * Converts a single value, array, or existing `Set` into a `Set<T>`\n * for consistent internal handling.\n *\n * - *Normalization rules:*\n * - `T` ➔ wrapped in a `Set`.\n * - `T[]` ➔ converted to a `Set` (duplicates removed).\n * - `Set<T>` ➔ returned as-is.\n *\n * The returned `Set` is **not mutated** internally by this function.\n * If an existing `Set` is provided, it will be reused.\n *\n * @typeParam T - Value type stored in the set.\n *\n * @param {T | T[] | Set<T>} value - Value to normalize.\n *\n * @returns {Set<T>} A deduplicated set of values.\n *\n * @example\n * ```ts\n * toObjectSet(1);\n * // ➔ Set { 1 }\n * ```\n *\n * @example\n * ```ts\n * toObjectSet([1, 2, 1]);\n * // ➔ Set { 1, 2 }\n * ```\n *\n * @example\n * ```ts\n * toObjectSet(new Set([1, 2]));\n * // ➔ Set { 1, 2 }\n * ```\n *\n * @internal\n */\nexport const toObjectSet = <T>(value: T | T[] | Set<T>): Set<T> => {\n if (isSet(value)) return value;\n\n return new Set(isArray(value) ? value : [value]);\n};\n\n/** ----------------------------------------------------------------\n * * ***Normalize a value into an array.***\n * ----------------------------------------------------------------\n *\n * Converts a single value or an array-like value into a **new array**\n * with consistent typing.\n *\n * - If `value` is already an array ➔ returned as-is.\n * - If `value` is a single item ➔ wrapped in an array.\n *\n * This utility is useful for APIs or configs that accept\n * either a single value or multiple values.\n *\n * ----------------------------------------------------------------\n *\n * @typeParam T\n * The element type of the resulting array.\n *\n * @param value\n * A value or array of values.\n *\n * @returns\n * A normalized array of type `T[]`.\n *\n * ----------------------------------------------------------------\n *\n * @example\n * ```ts\n * toArray(1);\n * // ➔ [1]\n *\n * toArray(\"hello\");\n * // ➔ [\"hello\"]\n *\n * toArray([1, 2, 3]);\n * // ➔ [1, 2, 3]\n * ```\n *\n * @example\n * ```ts\n * type User = { id: number };\n *\n * toArray<User>({ id: 1 });\n * // ➔ [{ id: 1 }]\n *\n * toArray<User>([{ id: 1 }, { id: 2 }]);\n * // ➔ [{ id: 1 }, { id: 2 }]\n * ```\n *\n * @remarks\n * This function does **not** flatten nested arrays.\n * If `value` is already an array, the original reference is preserved.\n *\n * @internal\n */\nexport const toArray = <T>(value: Arrayable<T>): T[] => {\n return isArray(value) ? value : [value];\n};\n"],"mappings":"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"}
|
|
@@ -2,19 +2,19 @@
|
|
|
2
2
|
* ========================================================================
|
|
3
3
|
* @rzl-zone/build-tools
|
|
4
4
|
* ------------------------------------------------------------------------
|
|
5
|
-
* Version: `0.0.
|
|
5
|
+
* Version: `0.0.10`
|
|
6
6
|
* Author: `Rizalvin Dwiky <rizalvindwiky1998@gmail.com>`
|
|
7
7
|
* Repository: `https://github.com/rzl-zone/rzl-zone/tree/main/packages/build-tools`
|
|
8
8
|
* ========================================================================
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
"use strict";
|
|
12
|
-
const require_helper = require('./helper-
|
|
13
|
-
const require_server = require('./server-
|
|
14
|
-
const require_client = require('./client-
|
|
12
|
+
const require_helper = require('./helper-DvCvgDxy.cjs');
|
|
13
|
+
const require_server = require('./server-DZvrqlyy.cjs');
|
|
14
|
+
const require_client = require('./client-DnTjQyyo.cjs');
|
|
15
15
|
require("@rzl-zone/node-only");
|
|
16
16
|
var name = "@rzl-zone/build-tools";
|
|
17
|
-
var version = "0.0.
|
|
17
|
+
var version = "0.0.10";
|
|
18
18
|
const PACKAGE_META = Object.freeze({
|
|
19
19
|
name,
|
|
20
20
|
version
|
|
@@ -97,4 +97,4 @@ Object.defineProperty(exports, 'PACKAGE_META', {
|
|
|
97
97
|
return PACKAGE_META;
|
|
98
98
|
}
|
|
99
99
|
});
|
|
100
|
-
//# sourceMappingURL=identity-
|
|
100
|
+
//# sourceMappingURL=identity-D192lL-_.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity-1Zk_fLSI.cjs","names":["packageJson.name","packageJson.version","isNonEmptyString","ICONS","picocolors"],"sources":["../package.json","../src/_internal/constants/package-meta.ts","../src/commander-kit/identity/index.ts"],"sourcesContent":["","import packageJson from \"../../../package.json\";\n\n/** ----------------------------------------------------------------\n * * ***Shared package metadata derived from the package manifest.***\n * ----------------------------------------------------------------\n *\n * Centralized access to metadata sourced from the root\n * `package.json` file.\n *\n * - *This utility exists to:*\n * - Avoid repeated `package.json` imports across Node.js entry points.\n * - Ensure consistent versioning and naming.\n * - Provide a single source of truth for package-level metadata.\n *\n * - ⚠️ **Important:**\n * - This file MUST only be imported in Node.js environments.\n * - Not intended for browser or edge runtimes.\n *\n * @internal\n *\n */\nexport const PACKAGE_META = Object.freeze({\n /** Package name. */\n name: packageJson.name,\n\n /** Current package version. */\n version: packageJson.version\n});\n","import \"@rzl-zone/node-only\";\n\nimport { isNonEmptyString } from \"@/_internal/utils/helper\";\nimport { PACKAGE_META } from \"@/_internal/constants/package-meta\";\n\nimport { ICONS } from \"@/utils/server\";\nimport { picocolors } from \"@/utils/client\";\n\n/** ----------------------------------------------------------------\n * * ***Options for generating a utility command title.***\n * ----------------------------------------------------------------\n *\n * Used by `CommandIdentity.utility()`.\n */\ntype CommandUtilityTitleOptions = {\n /** ----------------------------------------------------------------\n * * ***Command name displayed in the title.***\n * ----------------------------------------------------------------\n *\n * Overrides the default command name provided in the constructor.\n *\n * @example\n * ```ts\n * { commandName: \"fix-dts-react-import\" }\n * ```\n */\n commandName?: string;\n\n /** ----------------------------------------------------------------\n * * ***Optional arrow icon override.***\n * ----------------------------------------------------------------\n *\n * If provided, this icon replaces the generator's\n * `defaultIconArrow` for this call only.\n *\n * @example\n * ```ts\n * { iconArrow: \"⇒\" }\n * ```\n */\n iconArrow?: string;\n\n /** ----------------------------------------------------------------\n * * ***Package name prefix.***\n * ----------------------------------------------------------------\n *\n * Displayed at the beginning of every generated title.\n *\n * @default \"@rzl-zone/build-tools\"\n */\n packageName?: string;\n};\n\n/** ----------------------------------------------------------------\n * * ***Options for generating a CLI command title.***\n * ----------------------------------------------------------------\n *\n * Used by `CommandIdentity.cli()`\n */\ntype CommandCliTitleOptions = Omit<\n CommandUtilityTitleOptions,\n \"packageName\"\n> & {\n /** ----------------------------------------------------------------\n * * ***Package name prefix.***\n * ----------------------------------------------------------------\n *\n * Overrides the resolved CLI package name for this call only.\n *\n * @default \"@rzl-zone/build-tools-cli\"\n */\n packageName?: string;\n};\n\n/** ----------------------------------------------------------------\n * * ***Global configuration for command identity formatting.***\n * ----------------------------------------------------------------\n *\n * Defines the default identity behavior applied to\n * all generated CLI and utility titles.\n */\ntype CommandIdentityOptions = {\n /** ----------------------------------------------------------------\n * * ***Default command name.***\n * ----------------------------------------------------------------\n *\n * Used when a command name is not provided in the respective in method `CommandIdentity.cli()` and `CommandIdentity.utility()` options.\n *\n * @example\n * ```ts\n * defaultCommandName: \"fix-dts-react-import\"\n * ```\n */\n defaultCommandName: string;\n\n /** ----------------------------------------------------------------\n * * ***Package name prefix.***\n * ----------------------------------------------------------------\n *\n * Optional base package name used for title generation.\n *\n * If not provided, an internal default will be resolved\n * depending on the title type (`CLI` or `utility`).\n */\n packageName?: string;\n\n /** ----------------------------------------------------------------\n * * ***Package version.***\n * ----------------------------------------------------------------\n *\n * Optional version displayed alongside the package name\n * in generated titles.\n *\n * If not provided, a default version will be resolved internally.\n *\n * @example\n * ```ts\n * version: \"1.2.0\"\n * ```\n */\n version?: string;\n\n /** ----------------------------------------------------------------\n * * ***Label for CLI commands.***\n * ----------------------------------------------------------------\n *\n * Optional label displayed between\n * the package name and arrow icon for CLI titles.\n */\n cliLabel?: string;\n\n /** ----------------------------------------------------------------\n * * ***Label for utility commands.***\n * ----------------------------------------------------------------\n *\n * Optional label displayed between\n * the package name and arrow icon for utility titles.\n */\n utilityLabel?: string;\n\n /** ----------------------------------------------------------------\n * * ***Default arrow icon.***\n * ----------------------------------------------------------------\n *\n * Icon displayed between the label and command name.\n *\n * @default\n * \"▶️\"\n * // or\n * \"▶\"\n */\n defaultIconArrow?: string;\n};\n\n/** ----------------------------------------------------------------\n * * ***Command identity formatter with consistent CLI styling.***\n * ----------------------------------------------------------------\n *\n * Responsible for generating formatted and colorized\n * command titles for CLI and utility commands.\n *\n * - ***Each generated title may include:***\n * - Package name.\n * - Optional label (CLI / utility).\n * - Arrow icon.\n * - Command name.\n * - Package version.\n *\n * ---\n *\n * @example\n * ```ts\n * const identity = new CommandIdentity({\n * defaultCommandName: \"fix-dts-react-import\"\n * });\n *\n * identity.cli();\n * // => \"@rzl-zone/build-tools-cli@<version> ➔ fix-dts-react-import\"\n *\n * identity.utility({ commandName: \"clean-dist\" });\n * // => \"@rzl-zone/build-tools@<version> ➔ clean-dist\"\n * ```\n *\n * @example\n * ```ts\n * const identity = new CommandIdentity({\n * defaultCommandName: \"build\",\n * version: \"2.1.0\"\n * });\n *\n * identity.cli();\n * // => \"@rzl-zone/build-tools-cli@2.1.0 ➔ build\"\n *\n * identity.utility({ commandName: \"clean-dist\" });\n * // => \"@rzl-zone/build-tools@2.1.0 ➔ clean-dist\"\n * ```\n */\nexport class CommandIdentity {\n /** Default command name.\n *\n * @internal\n */\n private _commandName: string;\n\n /** Package name.\n *\n * @internal\n */\n private _packageName: string | undefined;\n\n /** Package version.\n *\n * @internal\n */\n private _version: string;\n\n /** Label for CLI commands.\n *\n * @internal\n */\n private cliLabel: string | undefined;\n\n /** Label for utility commands.\n *\n * @internal\n */\n private utilityLabel: string | undefined;\n\n /** Default arrow icon.\n *\n * @internal\n */\n private defaultIconArrow: string;\n\n /** @internal */\n private static readonly DEFAULT_UTILITY_PACKAGE = \"@rzl-zone/build-tools\";\n /** @internal */\n private static readonly DEFAULT_CLI_PACKAGE = \"@rzl-zone/build-tools-cli\";\n\n /** ----------------------------------------------------------------\n * * ***Create a new command identity instance.***\n * ----------------------------------------------------------------\n *\n * Initializes global identity configuration\n * used by `CommandIdentity.cli()` and `CommandIdentity.utility()`.\n *\n * ---\n *\n * @param {CommandIdentityOptions} options - Global identity configuration.\n * @throws {Error} If `options.defaultCommandName` is missing or empty.\n *\n * ---\n *\n * @example\n * ```ts\n * const identity = new CommandIdentity({\n * defaultCommandName: \"fix-dts-react-import\"\n * });\n *\n * identity.cli();\n * // => \"@rzl-zone/build-tools-cli@<version> ➔ fix-dts-react-import\"\n *\n * identity.utility({ commandName: \"clean-dist\" });\n * // => \"@rzl-zone/build-tools@<version> ➔ clean-dist\"\n * ```\n *\n * @example\n * ```ts\n * const identity = new CommandIdentity({\n * defaultCommandName: \"build\",\n * version: \"2.1.0\"\n * });\n *\n * identity.cli();\n * // => \"@rzl-zone/build-tools-cli@2.1.0 ➔ build\"\n *\n * identity.utility({ commandName: \"clean-dist\" });\n * // => \"@rzl-zone/build-tools@2.1.0 ➔ clean-dist\"\n * ```\n */\n constructor(options: CommandIdentityOptions) {\n if (!isNonEmptyString(options.defaultCommandName)) {\n throw new Error(\n \"CommandIdentity: Default command name is missing, please provide in constructor method options, eg: ({ defaultCommandName: 'inject-directive' }).\"\n );\n }\n\n this._commandName = options.defaultCommandName;\n this._packageName = options.packageName;\n this._version = isNonEmptyString(options.version)\n ? options.version\n : PACKAGE_META.version;\n\n this.cliLabel = options.cliLabel;\n this.utilityLabel = options.utilityLabel;\n this.defaultIconArrow = options.defaultIconArrow ?? ICONS.arrowRight;\n }\n\n /** ----------------------------------------------------------------\n * * ***Internal title formatter.***\n * ----------------------------------------------------------------\n *\n * Shared formatter used by `CommandIdentity.cli()` and `CommandIdentity.utility()`.\n *\n * @internal\n */\n private format(props: {\n packageName: string;\n label?: string;\n name?: string;\n iconArrow?: string;\n }): string {\n const { label, name, iconArrow, packageName } = props;\n const finalName = isNonEmptyString(name) ? name : this._commandName;\n const finalLabel = isNonEmptyString(label) ? ` ${label} ` : \" \";\n\n if (!finalName) {\n throw new Error(\n \"CommandIdentity: Command name is missing. \" +\n \"Provide `defaultCommandName` in constructor or `name` in method options.\"\n );\n }\n\n const versionSuffix = isNonEmptyString(this._version)\n ? `@${this._version}`\n : \"\";\n\n return (\n `${picocolors.bold(picocolors.blue(packageName + versionSuffix))}` +\n `${picocolors.whiteBright(finalLabel)}` +\n `${picocolors.bold(picocolors.magentaBright(isNonEmptyString(iconArrow) ? iconArrow : this.defaultIconArrow))} ` +\n `${picocolors.underline(picocolors.italic(picocolors.yellowBright(finalName)))}`\n );\n }\n\n /** ----------------------------------------------------------------\n * * ***Generate a CLI command title.***\n * ----------------------------------------------------------------\n *\n * Uses the CLI default package (unless overridden)\n * and applies CLI-specific labeling.\n *\n * @param {CommandCliTitleOptions} options - CLI title configuration.\n *\n * @example\n * ```ts\n * identity.cli();\n * identity.cli({ commandName: \"build\" });\n * ```\n */\n public cli(options: CommandCliTitleOptions = {}): string {\n const packageName = isNonEmptyString(options.packageName)\n ? options.packageName\n : (this._packageName ?? CommandIdentity.DEFAULT_CLI_PACKAGE);\n\n return this.format({\n packageName,\n label: this.cliLabel,\n name: options.commandName,\n iconArrow: options.iconArrow\n });\n }\n\n /** ----------------------------------------------------------------\n * * ***Generate a utility command title.***\n * ----------------------------------------------------------------\n *\n * Uses the utility default package (unless overridden)\n * and applies utility-specific labeling.\n *\n * @param {CommandUtilityTitleOptions} options - Utility title configuration.\n *\n * @example\n * ```ts\n * identity.utility();\n * identity.utility({ commandName: \"clean-dist\", iconArrow: \"⇒\" });\n * ```\n */\n public utility(options: CommandUtilityTitleOptions = {}): string {\n const packageName = isNonEmptyString(options.packageName)\n ? options.packageName\n : (this._packageName ?? CommandIdentity.DEFAULT_UTILITY_PACKAGE);\n\n return this.format({\n packageName,\n label: this.utilityLabel,\n name: options.commandName,\n iconArrow: options.iconArrow\n });\n }\n\n /** ----------------------------------------------------------------\n * * ***Package name.***\n * ----------------------------------------------------------------\n *\n * Returns the effective package name used for title generation.\n *\n * If a custom package name has been provided via the constructor\n * or `CommandIdentity.setPackageName()`, that value will be returned.\n * Otherwise, an internal default package name (as utility) is used.\n *\n * @readonly\n */\n public get packageName(): string {\n return this._packageName ?? CommandIdentity.DEFAULT_UTILITY_PACKAGE;\n }\n\n /** ----------------------------------------------------------------\n * * ***Set package name.***\n * ----------------------------------------------------------------\n *\n * Assigns a custom package name to be used for title generation.\n *\n * - *This value overrides:*\n * - Any package name provided in the constructor.\n * - The internal default package name.\n *\n * Once set, this value will be returned by the `CommandIdentity.packageName`\n * getter and used by `CommandIdentity.cli()` and\n * `CommandIdentity.utility()` unless explicitly\n * overridden per method call.\n *\n * @param value - The new package name to assign.\n * @returns The current instance for fluent chaining.\n */\n public setPackageName(value: string): this {\n this._packageName = value;\n return this;\n }\n\n /** ----------------------------------------------------------------\n * * ***Command name.***\n * ----------------------------------------------------------------\n *\n * Returns the current command name used for title generation.\n *\n * This value is initialized via the constructor and may be\n * updated later using\n * `CommandIdentity.setCommandName()`.\n *\n * @readonly\n */\n public get commandName(): string {\n return this._commandName;\n }\n\n /** ----------------------------------------------------------------\n * * ***Set command name.***\n * ----------------------------------------------------------------\n *\n * Updates the command name used for title generation.\n *\n * This overrides the command name provided in the constructor\n * and affects subsequent calls to\n * `CommandIdentity.cli()`\n * and `CommandIdentity.utility()`,\n * unless a command name is explicitly provided per method call.\n *\n * @param value - The new command name to assign.\n * @returns The current instance for fluent chaining.\n */\n public setCommandName(value: string): this {\n this._commandName = value;\n return this;\n }\n\n /** ----------------------------------------------------------------\n * * ***Package version.***\n * ----------------------------------------------------------------\n *\n * Returns the effective version used for title generation.\n *\n * - *Resolution order:*\n * 1. If a custom version has been provided via the constructor\n * or `CommandIdentity.setVersion()`,\n * that value will be returned.\n * 2. Otherwise, the version falls back to the internally\n * resolved default package version.\n *\n * A version value is always guaranteed to be present.\n *\n * @readonly\n */\n public get version(): string {\n return this._version;\n }\n\n /** ----------------------------------------------------------------\n * * ***Set package version.***\n * ----------------------------------------------------------------\n *\n * Overrides the version used for title generation.\n *\n * If an empty or invalid value is provided,\n * the version will remain unchanged.\n *\n * @param value - The new version to assign.\n * @returns The current instance for fluent chaining.\n */\n public setVersion(value: string): this {\n if (isNonEmptyString(value)) this._version = value;\n\n return this;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACqBA,MAAa,eAAe,OAAO,OAAO;CAElCA;CAGGC;CACV,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC0KF,IAAa,kBAAb,MAAa,gBAAgB;;;;;CAK3B,AAAQ;;;;;CAMR,AAAQ;;;;;CAMR,AAAQ;;;;;CAMR,AAAQ;;;;;CAMR,AAAQ;;;;;CAMR,AAAQ;;CAGR,OAAwB,0BAA0B;;CAElD,OAAwB,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2C9C,YAAY,SAAiC;AAC3C,MAAI,CAACC,gCAAiB,QAAQ,mBAAmB,CAC/C,OAAM,IAAI,MACR,oJACD;AAGH,OAAK,eAAe,QAAQ;AAC5B,OAAK,eAAe,QAAQ;AAC5B,OAAK,WAAWA,gCAAiB,QAAQ,QAAQ,GAC7C,QAAQ,UACR,aAAa;AAEjB,OAAK,WAAW,QAAQ;AACxB,OAAK,eAAe,QAAQ;AAC5B,OAAK,mBAAmB,QAAQ,oBAAoBC,qBAAM;;;;;;;;;;CAW5D,AAAQ,OAAO,OAKJ;EACT,MAAM,EAAE,OAAO,MAAM,WAAW,gBAAgB;EAChD,MAAM,YAAYD,gCAAiB,KAAK,GAAG,OAAO,KAAK;EACvD,MAAM,aAAaA,gCAAiB,MAAM,GAAG,IAAI,MAAM,KAAK;AAE5D,MAAI,CAAC,UACH,OAAM,IAAI,MACR,qHAED;EAGH,MAAM,gBAAgBA,gCAAiB,KAAK,SAAS,GACjD,IAAI,KAAK,aACT;AAEJ,SACE,GAAGE,0BAAW,KAAKA,0BAAW,KAAK,cAAc,cAAc,CAAC,GAC7DA,0BAAW,YAAY,WAAW,GAClCA,0BAAW,KAAKA,0BAAW,cAAcF,gCAAiB,UAAU,GAAG,YAAY,KAAK,iBAAiB,CAAC,CAAC,GAC3GE,0BAAW,UAAUA,0BAAW,OAAOA,0BAAW,aAAa,UAAU,CAAC,CAAC;;;;;;;;;;;;;;;;;CAmBlF,AAAO,IAAI,UAAkC,EAAE,EAAU;EACvD,MAAM,cAAcF,gCAAiB,QAAQ,YAAY,GACrD,QAAQ,cACP,KAAK,gBAAgB,gBAAgB;AAE1C,SAAO,KAAK,OAAO;GACjB;GACA,OAAO,KAAK;GACZ,MAAM,QAAQ;GACd,WAAW,QAAQ;GACpB,CAAC;;;;;;;;;;;;;;;;;CAkBJ,AAAO,QAAQ,UAAsC,EAAE,EAAU;EAC/D,MAAM,cAAcA,gCAAiB,QAAQ,YAAY,GACrD,QAAQ,cACP,KAAK,gBAAgB,gBAAgB;AAE1C,SAAO,KAAK,OAAO;GACjB;GACA,OAAO,KAAK;GACZ,MAAM,QAAQ;GACd,WAAW,QAAQ;GACpB,CAAC;;;;;;;;;;;;;;CAeJ,IAAW,cAAsB;AAC/B,SAAO,KAAK,gBAAgB,gBAAgB;;;;;;;;;;;;;;;;;;;;CAqB9C,AAAO,eAAe,OAAqB;AACzC,OAAK,eAAe;AACpB,SAAO;;;;;;;;;;;;;;CAeT,IAAW,cAAsB;AAC/B,SAAO,KAAK;;;;;;;;;;;;;;;;;CAkBd,AAAO,eAAe,OAAqB;AACzC,OAAK,eAAe;AACpB,SAAO;;;;;;;;;;;;;;;;;;;CAoBT,IAAW,UAAkB;AAC3B,SAAO,KAAK;;;;;;;;;;;;;;CAed,AAAO,WAAW,OAAqB;AACrC,MAAIA,gCAAiB,MAAM,CAAE,MAAK,WAAW;AAE7C,SAAO"}
|
|
1
|
+
{"version":3,"file":"identity-D192lL-_.cjs","names":["packageJson.name","packageJson.version","isNonEmptyString","ICONS","picocolors"],"sources":["../package.json","../src/_internal/constants/package-meta.ts","../src/commander-kit/identity/index.ts"],"sourcesContent":["","import packageJson from \"../../../package.json\";\n\n/** ----------------------------------------------------------------\n * * ***Shared package metadata derived from the package manifest.***\n * ----------------------------------------------------------------\n *\n * Centralized access to metadata sourced from the root\n * `package.json` file.\n *\n * - *This utility exists to:*\n * - Avoid repeated `package.json` imports across Node.js entry points.\n * - Ensure consistent versioning and naming.\n * - Provide a single source of truth for package-level metadata.\n *\n * - ⚠️ **Important:**\n * - This file MUST only be imported in Node.js environments.\n * - Not intended for browser or edge runtimes.\n *\n * @internal\n *\n */\nexport const PACKAGE_META = Object.freeze({\n /** Package name. */\n name: packageJson.name,\n\n /** Current package version. */\n version: packageJson.version\n});\n","import \"@rzl-zone/node-only\";\n\nimport { isNonEmptyString } from \"@/_internal/utils/helper\";\nimport { PACKAGE_META } from \"@/_internal/constants/package-meta\";\n\nimport { ICONS } from \"@/utils/server\";\nimport { picocolors } from \"@/utils/client\";\n\n/** ----------------------------------------------------------------\n * * ***Options for generating a utility command title.***\n * ----------------------------------------------------------------\n *\n * Used by `CommandIdentity.utility()`.\n */\ntype CommandUtilityTitleOptions = {\n /** ----------------------------------------------------------------\n * * ***Command name displayed in the title.***\n * ----------------------------------------------------------------\n *\n * Overrides the default command name provided in the constructor.\n *\n * @example\n * ```ts\n * { commandName: \"fix-dts-react-import\" }\n * ```\n */\n commandName?: string;\n\n /** ----------------------------------------------------------------\n * * ***Optional arrow icon override.***\n * ----------------------------------------------------------------\n *\n * If provided, this icon replaces the generator's\n * `defaultIconArrow` for this call only.\n *\n * @example\n * ```ts\n * { iconArrow: \"⇒\" }\n * ```\n */\n iconArrow?: string;\n\n /** ----------------------------------------------------------------\n * * ***Package name prefix.***\n * ----------------------------------------------------------------\n *\n * Displayed at the beginning of every generated title.\n *\n * @default \"@rzl-zone/build-tools\"\n */\n packageName?: string;\n};\n\n/** ----------------------------------------------------------------\n * * ***Options for generating a CLI command title.***\n * ----------------------------------------------------------------\n *\n * Used by `CommandIdentity.cli()`\n */\ntype CommandCliTitleOptions = Omit<\n CommandUtilityTitleOptions,\n \"packageName\"\n> & {\n /** ----------------------------------------------------------------\n * * ***Package name prefix.***\n * ----------------------------------------------------------------\n *\n * Overrides the resolved CLI package name for this call only.\n *\n * @default \"@rzl-zone/build-tools-cli\"\n */\n packageName?: string;\n};\n\n/** ----------------------------------------------------------------\n * * ***Global configuration for command identity formatting.***\n * ----------------------------------------------------------------\n *\n * Defines the default identity behavior applied to\n * all generated CLI and utility titles.\n */\ntype CommandIdentityOptions = {\n /** ----------------------------------------------------------------\n * * ***Default command name.***\n * ----------------------------------------------------------------\n *\n * Used when a command name is not provided in the respective in method `CommandIdentity.cli()` and `CommandIdentity.utility()` options.\n *\n * @example\n * ```ts\n * defaultCommandName: \"fix-dts-react-import\"\n * ```\n */\n defaultCommandName: string;\n\n /** ----------------------------------------------------------------\n * * ***Package name prefix.***\n * ----------------------------------------------------------------\n *\n * Optional base package name used for title generation.\n *\n * If not provided, an internal default will be resolved\n * depending on the title type (`CLI` or `utility`).\n */\n packageName?: string;\n\n /** ----------------------------------------------------------------\n * * ***Package version.***\n * ----------------------------------------------------------------\n *\n * Optional version displayed alongside the package name\n * in generated titles.\n *\n * If not provided, a default version will be resolved internally.\n *\n * @example\n * ```ts\n * version: \"1.2.0\"\n * ```\n */\n version?: string;\n\n /** ----------------------------------------------------------------\n * * ***Label for CLI commands.***\n * ----------------------------------------------------------------\n *\n * Optional label displayed between\n * the package name and arrow icon for CLI titles.\n */\n cliLabel?: string;\n\n /** ----------------------------------------------------------------\n * * ***Label for utility commands.***\n * ----------------------------------------------------------------\n *\n * Optional label displayed between\n * the package name and arrow icon for utility titles.\n */\n utilityLabel?: string;\n\n /** ----------------------------------------------------------------\n * * ***Default arrow icon.***\n * ----------------------------------------------------------------\n *\n * Icon displayed between the label and command name.\n *\n * @default\n * \"▶️\"\n * // or\n * \"▶\"\n */\n defaultIconArrow?: string;\n};\n\n/** ----------------------------------------------------------------\n * * ***Command identity formatter with consistent CLI styling.***\n * ----------------------------------------------------------------\n *\n * Responsible for generating formatted and colorized\n * command titles for CLI and utility commands.\n *\n * - ***Each generated title may include:***\n * - Package name.\n * - Optional label (CLI / utility).\n * - Arrow icon.\n * - Command name.\n * - Package version.\n *\n * ---\n *\n * @example\n * ```ts\n * const identity = new CommandIdentity({\n * defaultCommandName: \"fix-dts-react-import\"\n * });\n *\n * identity.cli();\n * // => \"@rzl-zone/build-tools-cli@<version> ➔ fix-dts-react-import\"\n *\n * identity.utility({ commandName: \"clean-dist\" });\n * // => \"@rzl-zone/build-tools@<version> ➔ clean-dist\"\n * ```\n *\n * @example\n * ```ts\n * const identity = new CommandIdentity({\n * defaultCommandName: \"build\",\n * version: \"2.1.0\"\n * });\n *\n * identity.cli();\n * // => \"@rzl-zone/build-tools-cli@2.1.0 ➔ build\"\n *\n * identity.utility({ commandName: \"clean-dist\" });\n * // => \"@rzl-zone/build-tools@2.1.0 ➔ clean-dist\"\n * ```\n */\nexport class CommandIdentity {\n /** Default command name.\n *\n * @internal\n */\n private _commandName: string;\n\n /** Package name.\n *\n * @internal\n */\n private _packageName: string | undefined;\n\n /** Package version.\n *\n * @internal\n */\n private _version: string;\n\n /** Label for CLI commands.\n *\n * @internal\n */\n private cliLabel: string | undefined;\n\n /** Label for utility commands.\n *\n * @internal\n */\n private utilityLabel: string | undefined;\n\n /** Default arrow icon.\n *\n * @internal\n */\n private defaultIconArrow: string;\n\n /** @internal */\n private static readonly DEFAULT_UTILITY_PACKAGE = \"@rzl-zone/build-tools\";\n /** @internal */\n private static readonly DEFAULT_CLI_PACKAGE = \"@rzl-zone/build-tools-cli\";\n\n /** ----------------------------------------------------------------\n * * ***Create a new command identity instance.***\n * ----------------------------------------------------------------\n *\n * Initializes global identity configuration\n * used by `CommandIdentity.cli()` and `CommandIdentity.utility()`.\n *\n * ---\n *\n * @param {CommandIdentityOptions} options - Global identity configuration.\n * @throws {Error} If `options.defaultCommandName` is missing or empty.\n *\n * ---\n *\n * @example\n * ```ts\n * const identity = new CommandIdentity({\n * defaultCommandName: \"fix-dts-react-import\"\n * });\n *\n * identity.cli();\n * // => \"@rzl-zone/build-tools-cli@<version> ➔ fix-dts-react-import\"\n *\n * identity.utility({ commandName: \"clean-dist\" });\n * // => \"@rzl-zone/build-tools@<version> ➔ clean-dist\"\n * ```\n *\n * @example\n * ```ts\n * const identity = new CommandIdentity({\n * defaultCommandName: \"build\",\n * version: \"2.1.0\"\n * });\n *\n * identity.cli();\n * // => \"@rzl-zone/build-tools-cli@2.1.0 ➔ build\"\n *\n * identity.utility({ commandName: \"clean-dist\" });\n * // => \"@rzl-zone/build-tools@2.1.0 ➔ clean-dist\"\n * ```\n */\n constructor(options: CommandIdentityOptions) {\n if (!isNonEmptyString(options.defaultCommandName)) {\n throw new Error(\n \"CommandIdentity: Default command name is missing, please provide in constructor method options, eg: ({ defaultCommandName: 'inject-directive' }).\"\n );\n }\n\n this._commandName = options.defaultCommandName;\n this._packageName = options.packageName;\n this._version = isNonEmptyString(options.version)\n ? options.version\n : PACKAGE_META.version;\n\n this.cliLabel = options.cliLabel;\n this.utilityLabel = options.utilityLabel;\n this.defaultIconArrow = options.defaultIconArrow ?? ICONS.arrowRight;\n }\n\n /** ----------------------------------------------------------------\n * * ***Internal title formatter.***\n * ----------------------------------------------------------------\n *\n * Shared formatter used by `CommandIdentity.cli()` and `CommandIdentity.utility()`.\n *\n * @internal\n */\n private format(props: {\n packageName: string;\n label?: string;\n name?: string;\n iconArrow?: string;\n }): string {\n const { label, name, iconArrow, packageName } = props;\n const finalName = isNonEmptyString(name) ? name : this._commandName;\n const finalLabel = isNonEmptyString(label) ? ` ${label} ` : \" \";\n\n if (!finalName) {\n throw new Error(\n \"CommandIdentity: Command name is missing. \" +\n \"Provide `defaultCommandName` in constructor or `name` in method options.\"\n );\n }\n\n const versionSuffix = isNonEmptyString(this._version)\n ? `@${this._version}`\n : \"\";\n\n return (\n `${picocolors.bold(picocolors.blue(packageName + versionSuffix))}` +\n `${picocolors.whiteBright(finalLabel)}` +\n `${picocolors.bold(picocolors.magentaBright(isNonEmptyString(iconArrow) ? iconArrow : this.defaultIconArrow))} ` +\n `${picocolors.underline(picocolors.italic(picocolors.yellowBright(finalName)))}`\n );\n }\n\n /** ----------------------------------------------------------------\n * * ***Generate a CLI command title.***\n * ----------------------------------------------------------------\n *\n * Uses the CLI default package (unless overridden)\n * and applies CLI-specific labeling.\n *\n * @param {CommandCliTitleOptions} options - CLI title configuration.\n *\n * @example\n * ```ts\n * identity.cli();\n * identity.cli({ commandName: \"build\" });\n * ```\n */\n public cli(options: CommandCliTitleOptions = {}): string {\n const packageName = isNonEmptyString(options.packageName)\n ? options.packageName\n : (this._packageName ?? CommandIdentity.DEFAULT_CLI_PACKAGE);\n\n return this.format({\n packageName,\n label: this.cliLabel,\n name: options.commandName,\n iconArrow: options.iconArrow\n });\n }\n\n /** ----------------------------------------------------------------\n * * ***Generate a utility command title.***\n * ----------------------------------------------------------------\n *\n * Uses the utility default package (unless overridden)\n * and applies utility-specific labeling.\n *\n * @param {CommandUtilityTitleOptions} options - Utility title configuration.\n *\n * @example\n * ```ts\n * identity.utility();\n * identity.utility({ commandName: \"clean-dist\", iconArrow: \"⇒\" });\n * ```\n */\n public utility(options: CommandUtilityTitleOptions = {}): string {\n const packageName = isNonEmptyString(options.packageName)\n ? options.packageName\n : (this._packageName ?? CommandIdentity.DEFAULT_UTILITY_PACKAGE);\n\n return this.format({\n packageName,\n label: this.utilityLabel,\n name: options.commandName,\n iconArrow: options.iconArrow\n });\n }\n\n /** ----------------------------------------------------------------\n * * ***Package name.***\n * ----------------------------------------------------------------\n *\n * Returns the effective package name used for title generation.\n *\n * If a custom package name has been provided via the constructor\n * or `CommandIdentity.setPackageName()`, that value will be returned.\n * Otherwise, an internal default package name (as utility) is used.\n *\n * @readonly\n */\n public get packageName(): string {\n return this._packageName ?? CommandIdentity.DEFAULT_UTILITY_PACKAGE;\n }\n\n /** ----------------------------------------------------------------\n * * ***Set package name.***\n * ----------------------------------------------------------------\n *\n * Assigns a custom package name to be used for title generation.\n *\n * - *This value overrides:*\n * - Any package name provided in the constructor.\n * - The internal default package name.\n *\n * Once set, this value will be returned by the `CommandIdentity.packageName`\n * getter and used by `CommandIdentity.cli()` and\n * `CommandIdentity.utility()` unless explicitly\n * overridden per method call.\n *\n * @param value - The new package name to assign.\n * @returns The current instance for fluent chaining.\n */\n public setPackageName(value: string): this {\n this._packageName = value;\n return this;\n }\n\n /** ----------------------------------------------------------------\n * * ***Command name.***\n * ----------------------------------------------------------------\n *\n * Returns the current command name used for title generation.\n *\n * This value is initialized via the constructor and may be\n * updated later using\n * `CommandIdentity.setCommandName()`.\n *\n * @readonly\n */\n public get commandName(): string {\n return this._commandName;\n }\n\n /** ----------------------------------------------------------------\n * * ***Set command name.***\n * ----------------------------------------------------------------\n *\n * Updates the command name used for title generation.\n *\n * This overrides the command name provided in the constructor\n * and affects subsequent calls to\n * `CommandIdentity.cli()`\n * and `CommandIdentity.utility()`,\n * unless a command name is explicitly provided per method call.\n *\n * @param value - The new command name to assign.\n * @returns The current instance for fluent chaining.\n */\n public setCommandName(value: string): this {\n this._commandName = value;\n return this;\n }\n\n /** ----------------------------------------------------------------\n * * ***Package version.***\n * ----------------------------------------------------------------\n *\n * Returns the effective version used for title generation.\n *\n * - *Resolution order:*\n * 1. If a custom version has been provided via the constructor\n * or `CommandIdentity.setVersion()`,\n * that value will be returned.\n * 2. Otherwise, the version falls back to the internally\n * resolved default package version.\n *\n * A version value is always guaranteed to be present.\n *\n * @readonly\n */\n public get version(): string {\n return this._version;\n }\n\n /** ----------------------------------------------------------------\n * * ***Set package version.***\n * ----------------------------------------------------------------\n *\n * Overrides the version used for title generation.\n *\n * If an empty or invalid value is provided,\n * the version will remain unchanged.\n *\n * @param value - The new version to assign.\n * @returns The current instance for fluent chaining.\n */\n public setVersion(value: string): this {\n if (isNonEmptyString(value)) this._version = value;\n\n return this;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACqBA,MAAa,eAAe,OAAO,OAAO;CAElCA;CAGGC;CACV,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC0KF,IAAa,kBAAb,MAAa,gBAAgB;;;;;CAK3B,AAAQ;;;;;CAMR,AAAQ;;;;;CAMR,AAAQ;;;;;CAMR,AAAQ;;;;;CAMR,AAAQ;;;;;CAMR,AAAQ;;CAGR,OAAwB,0BAA0B;;CAElD,OAAwB,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2C9C,YAAY,SAAiC;AAC3C,MAAI,CAACC,gCAAiB,QAAQ,mBAAmB,CAC/C,OAAM,IAAI,MACR,oJACD;AAGH,OAAK,eAAe,QAAQ;AAC5B,OAAK,eAAe,QAAQ;AAC5B,OAAK,WAAWA,gCAAiB,QAAQ,QAAQ,GAC7C,QAAQ,UACR,aAAa;AAEjB,OAAK,WAAW,QAAQ;AACxB,OAAK,eAAe,QAAQ;AAC5B,OAAK,mBAAmB,QAAQ,oBAAoBC,qBAAM;;;;;;;;;;CAW5D,AAAQ,OAAO,OAKJ;EACT,MAAM,EAAE,OAAO,MAAM,WAAW,gBAAgB;EAChD,MAAM,YAAYD,gCAAiB,KAAK,GAAG,OAAO,KAAK;EACvD,MAAM,aAAaA,gCAAiB,MAAM,GAAG,IAAI,MAAM,KAAK;AAE5D,MAAI,CAAC,UACH,OAAM,IAAI,MACR,qHAED;EAGH,MAAM,gBAAgBA,gCAAiB,KAAK,SAAS,GACjD,IAAI,KAAK,aACT;AAEJ,SACE,GAAGE,0BAAW,KAAKA,0BAAW,KAAK,cAAc,cAAc,CAAC,GAC7DA,0BAAW,YAAY,WAAW,GAClCA,0BAAW,KAAKA,0BAAW,cAAcF,gCAAiB,UAAU,GAAG,YAAY,KAAK,iBAAiB,CAAC,CAAC,GAC3GE,0BAAW,UAAUA,0BAAW,OAAOA,0BAAW,aAAa,UAAU,CAAC,CAAC;;;;;;;;;;;;;;;;;CAmBlF,AAAO,IAAI,UAAkC,EAAE,EAAU;EACvD,MAAM,cAAcF,gCAAiB,QAAQ,YAAY,GACrD,QAAQ,cACP,KAAK,gBAAgB,gBAAgB;AAE1C,SAAO,KAAK,OAAO;GACjB;GACA,OAAO,KAAK;GACZ,MAAM,QAAQ;GACd,WAAW,QAAQ;GACpB,CAAC;;;;;;;;;;;;;;;;;CAkBJ,AAAO,QAAQ,UAAsC,EAAE,EAAU;EAC/D,MAAM,cAAcA,gCAAiB,QAAQ,YAAY,GACrD,QAAQ,cACP,KAAK,gBAAgB,gBAAgB;AAE1C,SAAO,KAAK,OAAO;GACjB;GACA,OAAO,KAAK;GACZ,MAAM,QAAQ;GACd,WAAW,QAAQ;GACpB,CAAC;;;;;;;;;;;;;;CAeJ,IAAW,cAAsB;AAC/B,SAAO,KAAK,gBAAgB,gBAAgB;;;;;;;;;;;;;;;;;;;;CAqB9C,AAAO,eAAe,OAAqB;AACzC,OAAK,eAAe;AACpB,SAAO;;;;;;;;;;;;;;CAeT,IAAW,cAAsB;AAC/B,SAAO,KAAK;;;;;;;;;;;;;;;;;CAkBd,AAAO,eAAe,OAAqB;AACzC,OAAK,eAAe;AACpB,SAAO;;;;;;;;;;;;;;;;;;;CAoBT,IAAW,UAAkB;AAC3B,SAAO,KAAK;;;;;;;;;;;;;;CAed,AAAO,WAAW,OAAqB;AACrC,MAAIA,gCAAiB,MAAM,CAAE,MAAK,WAAW;AAE7C,SAAO"}
|