superjs-core 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/async/index.js.map +1 -1
- package/dist/collection/index.js.map +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/crypto/index.js.map +1 -1
- package/dist/date/index.js.map +1 -1
- package/dist/dep-exray/analyzer/index.d.ts +7 -0
- package/dist/dep-exray/analyzer/index.js +68 -0
- package/dist/dep-exray/analyzer/index.js.map +1 -0
- package/dist/dep-exray/cli.d.ts +1 -0
- package/dist/dep-exray/cli.js +389 -0
- package/dist/dep-exray/cli.js.map +1 -0
- package/dist/dep-exray/index.d.ts +5 -0
- package/dist/dep-exray/index.js +440 -0
- package/dist/dep-exray/index.js.map +1 -0
- package/dist/dep-exray/known-mappings.d.ts +17 -0
- package/dist/dep-exray/known-mappings.js +122 -0
- package/dist/dep-exray/known-mappings.js.map +1 -0
- package/dist/dep-exray/reporter/index.d.ts +5 -0
- package/dist/dep-exray/reporter/index.js +75 -0
- package/dist/dep-exray/reporter/index.js.map +1 -0
- package/dist/dep-exray/scanner/index.d.ts +5 -0
- package/dist/dep-exray/scanner/index.js +299 -0
- package/dist/dep-exray/scanner/index.js.map +1 -0
- package/dist/dep-exray/types.d.ts +38 -0
- package/dist/dep-exray/types.js +1 -0
- package/dist/dep-exray/types.js.map +1 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.js +439 -814
- package/dist/index.js.map +1 -1
- package/dist/io/index.js.map +1 -1
- package/dist/math/index.d.ts +1 -664
- package/dist/math/index.js +1 -822
- package/dist/math/index.js.map +1 -1
- package/dist/path/index.js.map +1 -1
- package/dist/string/index.js.map +1 -1
- package/dist/type/index.js.map +1 -1
- package/package.json +44 -4
package/dist/math/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/math/index.ts"],"sourcesContent":["/**\n * Error thrown when attempting to divide by zero.\n */\nexport class DivisionByZeroError extends Error {\n constructor() {\n super('Division by zero')\n this.name = 'DivisionByZeroError'\n }\n}\n\nfunction getPrecision(value: number): number {\n if (!isFinite(value)) return 0\n const eIndex = String(value).indexOf('e')\n if (eIndex > -1) {\n const exp = parseInt(String(value).slice(eIndex + 1), 10)\n if (exp < 0) return Math.abs(exp)\n return 0\n }\n const str = String(value)\n const dot = str.indexOf('.')\n return dot === -1 ? 0 : str.length - dot - 1\n}\n\nfunction toPrecisionFactor(a: number, b: number): number {\n return Math.pow(10, Math.max(getPrecision(a), getPrecision(b)))\n}\n\n/**\n * Safely adds two numbers, handling floating-point precision.\n *\n * @param a - First number.\n * @param b - Second number.\n * @returns The sum.\n */\nexport function add(a: number, b: number): number {\n const factor = toPrecisionFactor(a, b)\n return (Math.round(a * factor) + Math.round(b * factor)) / factor\n}\n\n/**\n * Safely subtracts two numbers, handling floating-point precision.\n *\n * @param a - First number.\n * @param b - Second number.\n * @returns The difference.\n */\nexport function sub(a: number, b: number): number {\n const factor = toPrecisionFactor(a, b)\n return (Math.round(a * factor) - Math.round(b * factor)) / factor\n}\n\n/**\n * Safely multiplies two numbers, handling floating-point precision.\n *\n * @param a - First number.\n * @param b - Second number.\n * @returns The product.\n */\nexport function mul(a: number, b: number): number {\n const factorA = toPrecisionFactor(a, 1)\n const factorB = toPrecisionFactor(1, b)\n const result = (Math.round(a * factorA) * Math.round(b * factorB)) / (factorA * factorB)\n return result\n}\n\n/**\n * Safely divides two numbers.\n *\n * @param a - The dividend.\n * @param b - The divisor.\n * @returns The quotient.\n * @throws {DivisionByZeroError} If `b` is zero.\n */\nexport function div(a: number, b: number): number {\n if (b === 0) throw new DivisionByZeroError()\n const factor = toPrecisionFactor(a, b)\n return Math.round(a * factor) / Math.round(b * factor)\n}\n\n/**\n * Rounds a number to the given precision.\n *\n * @param value - The number to round.\n * @param precision - Number of decimal places (default 0).\n * @returns The rounded value.\n */\nexport function round(value: number, precision: number = 0): number {\n const factor = Math.pow(10, precision)\n return Math.round(value * factor) / factor\n}\n\n/**\n * Floors a number to the given precision.\n *\n * @param value - The number to floor.\n * @param precision - Number of decimal places (default 0).\n * @returns The floored value.\n */\nexport function floor(value: number, precision: number = 0): number {\n const factor = Math.pow(10, precision)\n return Math.floor(value * factor) / factor\n}\n\n/**\n * Ceils a number to the given precision.\n *\n * @param value - The number to ceil.\n * @param precision - Number of decimal places (default 0).\n * @returns The ceiled value.\n */\nexport function ceil(value: number, precision: number = 0): number {\n const factor = Math.pow(10, precision)\n return Math.ceil(value * factor) / factor\n}\n\n/**\n * Checks if two numbers are approximately equal within a tolerance.\n *\n * @param a - First number.\n * @param b - Second number.\n * @param tolerance - Maximum difference (default `Number.EPSILON`).\n * @returns Whether the numbers are approximately equal.\n */\nexport function approxEqual(a: number, b: number, tolerance: number = Number.EPSILON): boolean {\n return Math.abs(a - b) <= tolerance\n}\n\n/**\n * Clamps a value within the inclusive range [min, max].\n *\n * @param value - The value to clamp.\n * @param min - The lower bound.\n * @param max - The upper bound.\n * @returns The clamped value.\n * @throws {RangeError} If `min` exceeds `max`.\n */\nexport function clamp(value: number, min: number, max: number): number {\n if (min > max) {\n throw new RangeError('Minimum value cannot exceed maximum value')\n }\n return Math.min(Math.max(value, min), max)\n}\n\n/**\n * Computes the sum of an array of numbers.\n *\n * @param values - Array of numbers.\n * @returns The total sum.\n */\nexport function sum(values: number[]): number {\n let total = 0\n for (let i = 0; i < values.length; i++) {\n total += values[i]!\n }\n return total\n}\n\n/**\n * Computes the average (mean) of an array of numbers.\n *\n * @param values - Array of numbers.\n * @returns The average.\n * @throws {RangeError} If the array is empty.\n */\nexport function average(values: number[]): number {\n if (values.length === 0) {\n throw new RangeError('Cannot compute average of an empty array')\n }\n return sum(values) / values.length\n}\n\n/**\n * Generates a random integer between `min` and `max` (inclusive).\n *\n * @param min - The minimum integer.\n * @param max - The maximum integer.\n * @returns A random integer.\n * @throws {RangeError} If arguments are not integers or `min > max`.\n */\nexport function randomInt(min: number, max: number): number {\n if (!Number.isInteger(min) || !Number.isInteger(max)) {\n throw new RangeError('Arguments must be integers')\n }\n if (min > max) {\n throw new RangeError('Minimum value cannot exceed maximum value')\n }\n return Math.floor(Math.random() * (max - min + 1)) + min\n}\n\n/**\n * Checks if a number is within the inclusive range [min, max].\n *\n * @param value - The number to check.\n * @param min - The lower bound.\n * @param max - The upper bound.\n * @returns Whether the value is in range.\n */\nexport function inRange(value: number, min: number, max: number): boolean {\n return value >= min && value <= max\n}\n\n// ─── Trigonometry ────────────────────────────────────────────────────────────\n\n/**\n * Converts radians to degrees.\n *\n * @param radians - Angle in radians.\n * @returns Angle in degrees.\n */\nexport function toDegrees(radians: number): number {\n return radians * (180 / Math.PI)\n}\n\n/**\n * Converts degrees to radians.\n *\n * @param degrees - Angle in degrees.\n * @returns Angle in radians.\n */\nexport function toRadians(degrees: number): number {\n return degrees * (Math.PI / 180)\n}\n\n/**\n * Computes the sine of an angle.\n *\n * @param angle - The angle.\n * @param unit - Unit of the angle: `'rad'` (default) or `'deg'`.\n * @returns The sine value.\n */\nexport function sin(angle: number, unit: 'rad' | 'deg' = 'rad'): number {\n const rad = unit === 'deg' ? toRadians(angle) : angle\n return Math.sin(rad)\n}\n\n/**\n * Computes the cosine of an angle.\n *\n * @param angle - The angle.\n * @param unit - Unit of the angle: `'rad'` (default) or `'deg'`.\n * @returns The cosine value.\n */\nexport function cos(angle: number, unit: 'rad' | 'deg' = 'rad'): number {\n const rad = unit === 'deg' ? toRadians(angle) : angle\n return Math.cos(rad)\n}\n\n/**\n * Computes the tangent of an angle.\n *\n * @param angle - The angle.\n * @param unit - Unit of the angle: `'rad'` (default) or `'deg'`.\n * @returns The tangent value.\n */\nexport function tan(angle: number, unit: 'rad' | 'deg' = 'rad'): number {\n const rad = unit === 'deg' ? toRadians(angle) : angle\n return Math.tan(rad)\n}\n\n/**\n * Computes the arcsine (inverse sine) of a value.\n *\n * @param value - A number between -1 and 1.\n * @returns The angle in radians.\n * @throws {RangeError} If value is outside [-1, 1].\n */\nexport function asin(value: number): number {\n if (value < -1 || value > 1) {\n throw new RangeError('Input to asin must be between -1 and 1')\n }\n return Math.asin(value)\n}\n\n/**\n * Computes the arccosine (inverse cosine) of a value.\n *\n * @param value - A number between -1 and 1.\n * @returns The angle in radians.\n * @throws {RangeError} If value is outside [-1, 1].\n */\nexport function acos(value: number): number {\n if (value < -1 || value > 1) {\n throw new RangeError('Input to acos must be between -1 and 1')\n }\n return Math.acos(value)\n}\n\n/**\n * Computes the arctangent (inverse tangent) of a value.\n *\n * @param value - Any real number.\n * @returns The angle in radians.\n */\nexport function atan(value: number): number {\n return Math.atan(value)\n}\n\n/**\n * Computes the angle whose tangent is the quotient of two numbers.\n *\n * @param y - The y-coordinate.\n * @param x - The x-coordinate.\n * @returns The angle in radians from the positive x-axis.\n */\nexport function atan2(y: number, x: number): number {\n return Math.atan2(y, x)\n}\n\n/**\n * Computes the square root of the sum of squares of the arguments (hypotenuse).\n *\n * @param values - Variable number of values.\n * @returns The hypotenuse.\n */\nexport function hypot(...values: number[]): number {\n return Math.hypot(...values)\n}\n\n// ─── Statistics ──────────────────────────────────────────────────────────────\n\n/**\n * Computes the median of a numeric array.\n *\n * @param values - Array of numbers.\n * @returns The median value.\n * @throws {RangeError} If the array is empty.\n */\nexport function median(values: number[]): number {\n if (values.length === 0) {\n throw new RangeError('Cannot compute median of an empty array')\n }\n const sorted = [...values].sort((a, b) => a - b)\n const mid = Math.floor(sorted.length / 2)\n if (sorted.length % 2 === 0) {\n return (sorted[mid - 1]! + sorted[mid]!) / 2\n }\n return sorted[mid]!\n}\n\n/**\n * Computes the mode(s) of a numeric array.\n *\n * @param values - Array of numbers.\n * @returns Array of mode values (may be multiple).\n * @throws {RangeError} If the array is empty.\n */\nexport function mode(values: number[]): number[] {\n if (values.length === 0) {\n throw new RangeError('Cannot compute mode of an empty array')\n }\n const freq = new Map<number, number>()\n let maxFreq = 0\n for (const v of values) {\n const f = (freq.get(v) ?? 0) + 1\n freq.set(v, f)\n if (f > maxFreq) maxFreq = f\n }\n if (maxFreq === 1) return []\n return Array.from(freq.entries())\n .filter(([, f]) => f === maxFreq)\n .map(([v]) => v)\n .sort((a, b) => a - b)\n}\n\n/**\n * Computes the p-th percentile of a numeric array.\n *\n * @param values - Array of numbers.\n * @param p - Percentile between 0 and 100.\n * @returns The percentile value.\n * @throws {RangeError} If array is empty or p is out of range.\n */\nexport function percentile(values: number[], p: number): number {\n if (values.length === 0) {\n throw new RangeError('Cannot compute percentile of an empty array')\n }\n if (p < 0 || p > 100) {\n throw new RangeError('Percentile must be between 0 and 100')\n }\n const sorted = [...values].sort((a, b) => a - b)\n const index = (p / 100) * (sorted.length - 1)\n const lower = Math.floor(index)\n const upper = Math.ceil(index)\n if (lower === upper) return sorted[lower]!\n return sorted[lower]! + (sorted[upper]! - sorted[lower]!) * (index - lower)\n}\n\n/**\n * Computes the quartiles (Q1, Q2, Q3) of a numeric array.\n *\n * @param values - Array of numbers.\n * @returns An object with q1, q2, q3.\n * @throws {RangeError} If the array is empty.\n */\nexport function quartiles(values: number[]): { q1: number; q2: number; q3: number } {\n if (values.length === 0) {\n throw new RangeError('Cannot compute quartiles of an empty array')\n }\n const sorted = [...values].sort((a, b) => a - b)\n if (sorted.length === 1) {\n return { q1: sorted[0]!, q2: sorted[0]!, q3: sorted[0]! }\n }\n const q2 = median(sorted)\n const mid = Math.floor(sorted.length / 2)\n const lowerHalf = sorted.slice(0, mid)\n const upperHalf = sorted.length % 2 === 0\n ? sorted.slice(mid)\n : sorted.slice(mid + 1)\n return {\n q1: median(lowerHalf),\n q2,\n q3: median(upperHalf),\n }\n}\n\n/**\n * Computes the variance of a numeric array.\n *\n * @param values - Array of numbers.\n * @param sample - If true, use sample variance (n-1). Default false.\n * @returns The variance.\n * @throws {RangeError} If array has fewer than 2 elements for sample variance.\n */\nexport function variance(values: number[], sample: boolean = false): number {\n if (values.length === 0) {\n throw new RangeError('Cannot compute variance of an empty array')\n }\n if (sample && values.length < 2) {\n throw new RangeError('Sample variance requires at least 2 values')\n }\n const mean = average(values)\n const sqDiffs = values.map(v => (v - mean) ** 2)\n const divisor = sample ? values.length - 1 : values.length\n return sum(sqDiffs) / divisor\n}\n\n/**\n * Computes the standard deviation of a numeric array.\n *\n * @param values - Array of numbers.\n * @param sample - If true, use sample standard deviation (n-1). Default false.\n * @returns The standard deviation.\n */\nexport function stddev(values: number[], sample: boolean = false): number {\n return Math.sqrt(variance(values, sample))\n}\n\n/**\n * Computes the covariance between two numeric arrays.\n *\n * @param x - First array.\n * @param y - Second array.\n * @returns The covariance.\n * @throws {RangeError} If arrays have different lengths or fewer than 2 elements.\n */\nexport function covariance(x: number[], y: number[]): number {\n if (x.length !== y.length) {\n throw new RangeError('Arrays must have the same length')\n }\n if (x.length < 2) {\n throw new RangeError('Covariance requires at least 2 values')\n }\n const meanX = average(x)\n const meanY = average(y)\n let total = 0\n for (let i = 0; i < x.length; i++) {\n total += (x[i]! - meanX) * (y[i]! - meanY)\n }\n return total / (x.length - 1)\n}\n\n/**\n * Computes the Pearson correlation coefficient between two arrays.\n *\n * @param x - First array.\n * @param y - Second array.\n * @returns The correlation coefficient between -1 and 1.\n */\nexport function correlation(x: number[], y: number[]): number {\n const cov = covariance(x, y)\n const stdX = stddev(x, true)\n const stdY = stddev(y, true)\n if (stdX === 0 || stdY === 0) return 0\n return cov / (stdX * stdY)\n}\n\n/**\n * Computes the sample skewness of a numeric array.\n *\n * @param values - Array of numbers.\n * @returns The skewness.\n */\nexport function skewness(values: number[]): number {\n if (values.length < 3) {\n throw new RangeError('Skewness requires at least 3 values')\n }\n const mean = average(values)\n const n = values.length\n const m2 = sum(values.map(v => (v - mean) ** 2)) / n\n const m3 = sum(values.map(v => (v - mean) ** 3)) / n\n if (m2 === 0) return 0\n return (m3 / Math.pow(m2, 1.5)) * Math.sqrt(n * (n - 1)) / (n - 2)\n}\n\n/**\n * Computes the excess kurtosis of a numeric array.\n *\n * @param values - Array of numbers.\n * @returns The excess kurtosis (kurtosis - 3).\n */\nexport function kurtosis(values: number[]): number {\n if (values.length < 4) {\n throw new RangeError('Kurtosis requires at least 4 values')\n }\n const mean = average(values)\n const n = values.length\n const m2 = sum(values.map(v => (v - mean) ** 2)) / n\n const m4 = sum(values.map(v => (v - mean) ** 4)) / n\n if (m2 === 0) return 0\n const kurt = m4 / (m2 * m2)\n const adjustment = ((n - 1) * (n + 1)) / ((n - 2) * (n - 3))\n return adjustment * (kurt - 3 * (n - 1) / (n + 1))\n}\n\n/**\n * Computes the weighted mean of values with given weights.\n *\n * @param values - Array of numbers.\n * @param weights - Array of weights.\n * @returns The weighted mean.\n * @throws {RangeError} If arrays differ in length or weights sum to zero.\n */\nexport function weightedMean(values: number[], weights: number[]): number {\n if (values.length !== weights.length) {\n throw new RangeError('Values and weights must have the same length')\n }\n if (values.length === 0) {\n throw new RangeError('Cannot compute weighted mean of empty arrays')\n }\n const totalWeight = sum(weights)\n if (totalWeight === 0) {\n throw new RangeError('Sum of weights cannot be zero')\n }\n let total = 0\n for (let i = 0; i < values.length; i++) {\n total += values[i]! * weights[i]!\n }\n return total / totalWeight\n}\n\n/**\n * Computes the geometric mean of a numeric array.\n *\n * @param values - Array of positive numbers.\n * @returns The geometric mean.\n * @throws {RangeError} If array is empty or contains non-positive values.\n */\nexport function geometricMean(values: number[]): number {\n if (values.length === 0) {\n throw new RangeError('Cannot compute geometric mean of an empty array')\n }\n if (values.some(v => v <= 0)) {\n throw new RangeError('Geometric mean requires positive values only')\n }\n const logSum = sum(values.map(v => Math.log(v)))\n return Math.exp(logSum / values.length)\n}\n\n/**\n * Computes the harmonic mean of a numeric array.\n *\n * @param values - Array of positive numbers.\n * @returns The harmonic mean.\n * @throws {RangeError} If array is empty or contains non-positive values.\n */\nexport function harmonicMean(values: number[]): number {\n if (values.length === 0) {\n throw new RangeError('Cannot compute harmonic mean of an empty array')\n }\n if (values.some(v => v <= 0)) {\n throw new RangeError('Harmonic mean requires positive values only')\n }\n const reciprocalSum = sum(values.map(v => 1 / v))\n return values.length / reciprocalSum\n}\n\n/**\n * Computes the z-score of a value relative to a distribution.\n *\n * @param value - The value to standardize.\n * @param mean - The mean of the distribution.\n * @param stddev - The standard deviation of the distribution.\n * @returns The z-score.\n */\nexport function zScore(value: number, mean: number, stddev: number): number {\n if (stddev === 0) return 0\n return (value - mean) / stddev\n}\n\n/**\n * Normalizes an array to [0, 1] range using min-max scaling.\n *\n * @param values - Array of numbers.\n * @returns The normalized array.\n */\nexport function normalize(values: number[]): number[] {\n if (values.length === 0) return []\n const min = Math.min(...values)\n const max = Math.max(...values)\n if (max === min) return values.map(() => 0)\n return values.map(v => (v - min) / (max - min))\n}\n\n/**\n * Standardizes an array to have mean 0 and standard deviation 1 (z-scores).\n *\n * @param values - Array of numbers.\n * @returns The standardized array.\n */\nexport function standardize(values: number[]): number[] {\n if (values.length === 0) return []\n const mean = average(values)\n const sd = stddev(values, true)\n if (sd === 0) return values.map(() => 0)\n return values.map(v => (v - mean) / sd)\n}\n\n// ─── Combinatorics & Number Theory ───────────────────────────────────────────\n\n/**\n * Computes the factorial of a non-negative integer.\n *\n * @param n - Non-negative integer.\n * @returns n!.\n * @throws {RangeError} If n is negative or not an integer.\n */\nexport function factorial(n: number): number {\n if (!Number.isInteger(n) || n < 0) {\n throw new RangeError('Factorial requires a non-negative integer')\n }\n if (n === 0 || n === 1) return 1\n let result = 1\n for (let i = 2; i <= n; i++) {\n result *= i\n }\n return result\n}\n\n/**\n * Computes the binomial coefficient \"n choose k\".\n *\n * @param n - Total number of items.\n * @param k - Number of items to choose.\n * @returns The binomial coefficient.\n * @throws {RangeError} If n < k or arguments are not non-negative integers.\n */\nexport function binomial(n: number, k: number): number {\n if (!Number.isInteger(n) || !Number.isInteger(k) || n < 0 || k < 0) {\n throw new RangeError('Binomial requires non-negative integers')\n }\n if (k > n) {\n throw new RangeError('k cannot be greater than n')\n }\n if (k === 0 || k === n) return 1\n if (k > n - k) return binomial(n, n - k)\n let result = 1\n for (let i = 1; i <= k; i++) {\n result = (result * (n - k + i)) / i\n }\n return result\n}\n\n/**\n * Computes the number of permutations \"n P k\".\n *\n * @param n - Total number of items.\n * @param k - Number of items to arrange.\n * @returns The number of permutations.\n * @throws {RangeError} If n < k or arguments are not non-negative integers.\n */\nexport function permutation(n: number, k: number): number {\n if (!Number.isInteger(n) || !Number.isInteger(k) || n < 0 || k < 0) {\n throw new RangeError('Permutation requires non-negative integers')\n }\n if (k > n) {\n throw new RangeError('k cannot be greater than n')\n }\n let result = 1\n for (let i = n; i > n - k; i--) {\n result *= i\n }\n return result\n}\n\n/**\n * Computes the greatest common divisor of two or more numbers.\n *\n * @param values - Two or more integers.\n * @returns The GCD.\n * @throws {RangeError} If fewer than 2 values are provided.\n */\nexport function gcd(...values: number[]): number {\n if (values.length < 2) {\n throw new RangeError('GCD requires at least 2 values')\n }\n const gcd2 = (a: number, b: number): number => {\n a = Math.abs(a)\n b = Math.abs(b)\n while (b !== 0) {\n const t = b\n b = a % b\n a = t\n }\n return a\n }\n return values.reduce((a, b) => gcd2(a, b))\n}\n\n/**\n * Computes the least common multiple of two or more numbers.\n *\n * @param values - Two or more integers.\n * @returns The LCM.\n * @throws {RangeError} If fewer than 2 values are provided.\n */\nexport function lcm(...values: number[]): number {\n if (values.length < 2) {\n throw new RangeError('LCM requires at least 2 values')\n }\n const lcm2 = (a: number, b: number): number => {\n if (a === 0 || b === 0) return 0\n return Math.abs(a * b) / gcd(a, b)\n }\n return values.reduce((a, b) => lcm2(a, b))\n}\n\n/**\n * Checks if a number is prime.\n *\n * @param n - Integer to check.\n * @returns True if prime.\n */\nexport function isPrime(n: number): boolean {\n if (!Number.isInteger(n) || n < 2) return false\n if (n === 2) return true\n if (n % 2 === 0) return false\n const sqrt = Math.sqrt(n)\n for (let i = 3; i <= sqrt; i += 2) {\n if (n % i === 0) return false\n }\n return true\n}\n\n/**\n * Computes the prime factors of a number.\n *\n * @param n - Integer greater than 1.\n * @returns Array of prime factors.\n * @throws {RangeError} If n is less than 2.\n */\nexport function primeFactors(n: number): number[] {\n if (!Number.isInteger(n) || n < 2) {\n throw new RangeError('Prime factors require an integer greater than 1')\n }\n const factors: number[] = []\n let num = n\n while (num % 2 === 0) {\n factors.push(2)\n num /= 2\n }\n for (let i = 3; i <= Math.sqrt(num); i += 2) {\n while (num % i === 0) {\n factors.push(i)\n num /= i\n }\n }\n if (num > 1) factors.push(num)\n return factors\n}\n\n/**\n * Computes the n-th Fibonacci number.\n *\n * @param n - Non-negative integer (0-indexed: F(0)=0, F(1)=1).\n * @returns The n-th Fibonacci number.\n * @throws {RangeError} If n is negative or not an integer.\n */\nexport function fibonacci(n: number): number {\n if (!Number.isInteger(n) || n < 0) {\n throw new RangeError('Fibonacci requires a non-negative integer')\n }\n if (n === 0) return 0\n if (n === 1) return 1\n let a = 0\n let b = 1\n for (let i = 2; i <= n; i++) {\n const temp = a + b\n a = b\n b = temp\n }\n return b\n}\n\n/**\n * Checks if a number is even.\n *\n * @param n - The number to check.\n * @returns True if even.\n */\nexport function isEven(n: number): boolean {\n return n % 2 === 0\n}\n\n/**\n * Checks if a number is odd.\n *\n * @param n - The number to check.\n * @returns True if odd.\n */\nexport function isOdd(n: number): boolean {\n return n % 2 !== 0\n}\n\n/**\n * Returns the sign of a number.\n *\n * @param n - The number.\n * @returns -1 if negative, 1 if positive, 0 if zero.\n */\nexport function sign(n: number): number {\n if (n > 0) return 1\n if (n < 0) return -1\n return 0\n}\n\n// ─── Matrix Operations ───────────────────────────────────────────────────────\n\n/**\n * Represents a 2D matrix.\n */\nexport type Matrix = number[][]\n\nfunction validateMatrix(a: Matrix): void {\n if (a.length === 0) throw new RangeError('Matrix cannot be empty')\n const cols = a[0]!.length\n if (cols === 0) throw new RangeError('Matrix rows cannot be empty')\n if (a.some(row => row.length !== cols)) {\n throw new RangeError('All rows must have the same length')\n }\n}\n\n/**\n * Adds two matrices element-wise.\n *\n * @param a - First matrix.\n * @param b - Second matrix.\n * @returns The sum matrix.\n */\nexport function matrixAdd(a: Matrix, b: Matrix): Matrix {\n if (a.length !== b.length || a[0]!.length !== b[0]!.length) {\n throw new RangeError('Matrices must have same dimensions for addition')\n }\n validateMatrix(a)\n return a.map((row, i) => row.map((val, j) => val + b[i]![j]!))\n}\n\n/**\n * Subtracts two matrices element-wise.\n *\n * @param a - First matrix.\n * @param b - Second matrix.\n * @returns The difference matrix.\n */\nexport function matrixSub(a: Matrix, b: Matrix): Matrix {\n if (a.length !== b.length || a[0]!.length !== b[0]!.length) {\n throw new RangeError('Matrices must have same dimensions for subtraction')\n }\n validateMatrix(a)\n return a.map((row, i) => row.map((val, j) => val - b[i]![j]!))\n}\n\n/**\n * Multiplies two matrices element-wise (Hadamard product).\n *\n * @param a - First matrix.\n * @param b - Second matrix.\n * @returns The element-wise product matrix.\n */\nexport function matrixMul(a: Matrix, b: Matrix): Matrix {\n if (a.length !== b.length || a[0]!.length !== b[0]!.length) {\n throw new RangeError('Matrices must have same dimensions for element-wise multiplication')\n }\n validateMatrix(a)\n return a.map((row, i) => row.map((val, j) => val * b[i]![j]!))\n}\n\n/**\n * Multiplies a matrix by a scalar.\n *\n * @param a - The matrix.\n * @param scalar - The scalar value.\n * @returns The scaled matrix.\n */\nexport function matrixScale(a: Matrix, scalar: number): Matrix {\n validateMatrix(a)\n return a.map(row => row.map(val => val * scalar))\n}\n\n/**\n * Transposes a matrix (rows become columns).\n *\n * @param a - The matrix.\n * @returns The transposed matrix.\n */\nexport function matrixTranspose(a: Matrix): Matrix {\n if (a.length === 0) return []\n validateMatrix(a)\n return a[0]!.map((_, j) => a.map(row => row[j]!))\n}\n\n/**\n * Computes the determinant of a square matrix (max 3x3).\n *\n * @param a - The square matrix.\n * @returns The determinant.\n */\nexport function matrixDeterminant(a: Matrix): number {\n validateMatrix(a)\n const n = a.length\n if (a.some(row => row.length !== n)) {\n throw new RangeError('Matrix must be square for determinant')\n }\n if (n > 3) {\n throw new RangeError('Determinant only supported for max 3x3 matrices')\n }\n if (n === 1) return a[0]![0]!\n if (n === 2) return a[0]![0]! * a[1]![1]! - a[0]![1]! * a[1]![0]!\n const [a00, a01, a02] = a[0]!\n const [a10, a11, a12] = a[1]!\n const [a20, a21, a22] = a[2]!\n return a00! * (a11! * a22! - a12! * a21!)\n - a01! * (a10! * a22! - a12! * a20!)\n + a02! * (a10! * a21! - a11! * a20!)\n}\n\n/**\n * Computes the inverse of a square matrix (max 3x3).\n *\n * @param a - The square matrix.\n * @returns The inverse matrix.\n */\nexport function matrixInverse(a: Matrix): Matrix {\n const det = matrixDeterminant(a)\n if (det === 0) throw new RangeError('Matrix is singular and cannot be inverted')\n const n = a.length\n if (n === 1) return [[1 / a[0]![0]!]]\n if (n === 2) {\n return [\n [a[1]![1]! / det, -a[0]![1]! / det],\n [-a[1]![0]! / det, a[0]![0]! / det],\n ]\n }\n const [a00, a01, a02] = a[0]!\n const [a10, a11, a12] = a[1]!\n const [a20, a21, a22] = a[2]!\n return [\n [(a11! * a22! - a12! * a21!) / det, -(a01! * a22! - a02! * a21!) / det, (a01! * a12! - a02! * a11!) / det],\n [-(a10! * a22! - a12! * a20!) / det, (a00! * a22! - a02! * a20!) / det, -(a00! * a12! - a02! * a10!) / det],\n [(a10! * a21! - a11! * a20!) / det, -(a00! * a21! - a01! * a20!) / det, (a00! * a11! - a01! * a10!) / det],\n ]\n}\n\n/**\n * Creates an n x n identity matrix.\n *\n * @param n - The size of the matrix.\n * @returns The identity matrix.\n */\nexport function matrixIdentity(n: number): Matrix {\n if (!Number.isInteger(n) || n < 1) {\n throw new RangeError('Matrix size must be a positive integer')\n }\n return Array.from({ length: n }, (_, i) =>\n Array.from({ length: n }, (_, j) => (i === j ? 1 : 0))\n )\n}\n\n/**\n * Multiplies two matrices using standard matrix multiplication (dot product).\n *\n * @param a - First matrix.\n * @param b - Second matrix.\n * @returns The product matrix.\n */\nexport function matrixMultiply(a: Matrix, b: Matrix): Matrix {\n validateMatrix(a)\n validateMatrix(b)\n if (a[0]!.length !== b.length) {\n throw new RangeError('Matrix dimensions incompatible for multiplication')\n }\n const result: Matrix = Array.from({ length: a.length }, () =>\n Array(b[0]!.length).fill(0)\n )\n for (let i = 0; i < a.length; i++) {\n for (let j = 0; j < b[0]!.length; j++) {\n for (let k = 0; k < b.length; k++) {\n result[i]![j] = (result[i]![j] ?? 0) + (a[i]![k] ?? 0) * (b[k]![j] ?? 0)\n }\n }\n }\n return result\n}\n\n/**\n * Computes the trace of a square matrix.\n *\n * @param a - The square matrix.\n * @returns The trace (sum of diagonal elements).\n */\nexport function matrixTrace(a: Matrix): number {\n validateMatrix(a)\n const n = a.length\n if (a.some(row => row.length !== n)) {\n throw new RangeError('Matrix must be square for trace')\n }\n let trace = 0\n for (let i = 0; i < n; i++) {\n trace += a[i]![i]!\n }\n return trace\n}\n\n// ─── Complex Numbers ─────────────────────────────────────────────────────────\n\n/**\n * Represents a complex number with real and imaginary parts.\n */\nexport class Complex {\n constructor(\n /** The real part. */\n public re: number,\n /** The imaginary part. */\n public im: number = 0,\n ) {}\n\n /**\n * Adds another complex number.\n *\n * @param other - The complex number to add.\n * @returns A new Complex instance.\n */\n add(other: Complex): Complex {\n return new Complex(this.re + other.re, this.im + other.im)\n }\n\n /**\n * Subtracts another complex number.\n *\n * @param other - The complex number to subtract.\n * @returns A new Complex instance.\n */\n sub(other: Complex): Complex {\n return new Complex(this.re - other.re, this.im - other.im)\n }\n\n /**\n * Multiplies by another complex number.\n *\n * @param other - The complex number to multiply by.\n * @returns A new Complex instance.\n */\n mul(other: Complex): Complex {\n return new Complex(\n this.re * other.re - this.im * other.im,\n this.re * other.im + this.im * other.re,\n )\n }\n\n /**\n * Divides by another complex number.\n *\n * @param other - The complex number to divide by.\n * @returns A new Complex instance.\n * @throws {DivisionByZeroError} If the divisor is zero.\n */\n div(other: Complex): Complex {\n const denom = other.re * other.re + other.im * other.im\n if (denom === 0) throw new DivisionByZeroError()\n return new Complex(\n (this.re * other.re + this.im * other.im) / denom,\n (this.im * other.re - this.re * other.im) / denom,\n )\n }\n\n /**\n * Computes the magnitude (absolute value) of the complex number.\n *\n * @returns The magnitude.\n */\n abs(): number {\n return Math.sqrt(this.re * this.re + this.im * this.im)\n }\n\n /**\n * Computes the complex conjugate.\n *\n * @returns A new Complex instance with negated imaginary part.\n */\n conj(): Complex {\n return new Complex(this.re, this.im === 0 ? 0 : -this.im)\n }\n\n /**\n * Computes the argument (phase angle) in radians.\n *\n * @returns The phase angle.\n */\n arg(): number {\n return Math.atan2(this.im, this.re)\n }\n\n /**\n * Raises the complex number to a real power.\n *\n * @param n - The exponent.\n * @returns A new Complex instance.\n */\n pow(n: number): Complex {\n const r = this.abs()\n const theta = this.arg()\n return Complex.fromPolar(Math.pow(r, n), theta * n)\n }\n\n /**\n * Computes the square root of the complex number.\n *\n * @returns A new Complex instance.\n */\n sqrt(): Complex {\n const r = this.abs()\n const theta = this.arg()\n return Complex.fromPolar(Math.sqrt(r), theta / 2)\n }\n\n /**\n * Computes e raised to this complex number.\n *\n * @returns A new Complex instance.\n */\n exp(): Complex {\n return new Complex(\n Math.exp(this.re) * Math.cos(this.im),\n Math.exp(this.re) * Math.sin(this.im),\n )\n }\n\n /**\n * Computes the natural logarithm of the complex number.\n *\n * @returns A new Complex instance.\n */\n log(): Complex {\n return new Complex(Math.log(this.abs()), this.arg())\n }\n\n /**\n * Computes the sine of the complex number.\n *\n * @returns A new Complex instance.\n */\n sin(): Complex {\n return new Complex(\n Math.sin(this.re) * Math.cosh(this.im),\n Math.cos(this.re) * Math.sinh(this.im),\n )\n }\n\n /**\n * Computes the cosine of the complex number.\n *\n * @returns A new Complex instance.\n */\n cos(): Complex {\n return new Complex(\n Math.cos(this.re) * Math.cosh(this.im),\n -Math.sin(this.re) * Math.sinh(this.im),\n )\n }\n\n /**\n * Returns a string representation of the complex number.\n *\n * @returns String like \"a + bi\".\n */\n toString(): string {\n if (this.im === 0) return `${this.re}`\n if (this.re === 0) return `${this.im}i`\n if (this.im < 0) return `${this.re} - ${Math.abs(this.im)}i`\n return `${this.re} + ${this.im}i`\n }\n\n /**\n * Creates a complex number from polar coordinates.\n *\n * @param r - The magnitude.\n * @param theta - The angle in radians.\n * @returns A new Complex instance.\n */\n static fromPolar(r: number, theta: number): Complex {\n return new Complex(r * Math.cos(theta), r * Math.sin(theta))\n }\n\n /** The real part. */\n get real(): number {\n return this.re\n }\n\n /** The imaginary part. */\n get imag(): number {\n return this.im\n }\n}\n\n// ─── Financial Math ──────────────────────────────────────────────────────────\n\n/**\n * Computes compound interest.\n *\n * @param principal - Initial amount.\n * @param rate - Annual interest rate (decimal, e.g. 0.05 for 5%).\n * @param time - Time in years.\n * @param n - Number of compounding periods per year (default 12).\n * @returns The future value including interest.\n */\nexport function compoundInterest(principal: number, rate: number, time: number, n: number = 12): number {\n return principal * Math.pow(1 + rate / n, n * time)\n}\n\n/**\n * Computes the future value of a present sum.\n *\n * @param pv - Present value.\n * @param rate - Periodic interest rate.\n * @param nper - Number of periods.\n * @returns Future value.\n */\nexport function futureValue(pv: number, rate: number, nper: number): number {\n return pv * Math.pow(1 + rate, nper)\n}\n\n/**\n * Computes the present value of a future sum.\n *\n * @param fv - Future value.\n * @param rate - Periodic interest rate.\n * @param nper - Number of periods.\n * @returns Present value.\n */\nexport function presentValue(fv: number, rate: number, nper: number): number {\n return fv / Math.pow(1 + rate, nper)\n}\n\n/**\n * Computes the periodic payment for a loan (PMT).\n *\n * @param rate - Periodic interest rate.\n * @param nper - Total number of payments.\n * @param pv - Present value (loan amount).\n * @param fv - Future value (default 0).\n * @returns The periodic payment amount.\n */\nexport function pmt(rate: number, nper: number, pv: number, fv: number = 0): number {\n if (rate === 0) return -(pv + fv) / nper\n const pvif = Math.pow(1 + rate, nper)\n return -(pv * pvif + fv) / ((pvif - 1) / rate)\n}\n\n/**\n * Computes the net present value (NPV) of cashflows.\n *\n * @param rate - Discount rate per period.\n * @param cashflows - Array of cashflow values (negative for outflows).\n * @returns The net present value.\n */\nexport function npv(rate: number, cashflows: number[]): number {\n if (cashflows.length === 0) return 0\n let result = 0\n for (let i = 0; i < cashflows.length; i++) {\n result += cashflows[i]! / Math.pow(1 + rate, i)\n }\n return result\n}\n\n/**\n * Computes the internal rate of return (IRR) of cashflows using Newton's method.\n *\n * @param cashflows - Array of cashflow values.\n * @returns The IRR as a decimal.\n */\nexport function irr(cashflows: number[]): number {\n if (cashflows.length < 2) {\n throw new RangeError('IRR requires at least 2 cashflows')\n }\n let guess = 0.1\n const tolerance = 1e-7\n const maxIter = 1000\n for (let i = 0; i < maxIter; i++) {\n let npvVal = 0\n let dnpv = 0\n for (let j = 0; j < cashflows.length; j++) {\n npvVal += cashflows[j]! / Math.pow(1 + guess, j)\n dnpv -= j * cashflows[j]! / Math.pow(1 + guess, j + 1)\n }\n if (Math.abs(npvVal) < tolerance) return guess\n if (dnpv === 0) return NaN\n guess -= npvVal / dnpv\n }\n return NaN\n}\n\n/**\n * Computes the return on investment (ROI).\n *\n * @param gain - The gain from the investment.\n * @param cost - The cost of the investment.\n * @returns The ROI as a decimal.\n */\nexport function roi(gain: number, cost: number): number {\n if (cost === 0) throw new RangeError('Cost cannot be zero')\n return (gain - cost) / cost\n}\n\n/**\n * Generates an amortization schedule for a loan.\n *\n * @param principal - Loan amount.\n * @param rate - Periodic interest rate.\n * @param nper - Total number of payments.\n * @returns Array of period details.\n */\nexport function amortizationSchedule(\n principal: number,\n rate: number,\n nper: number,\n): { period: number; payment: number; interest: number; principal: number; balance: number }[] {\n const payment = -pmt(rate, nper, principal)\n let balance = principal\n const schedule: { period: number; payment: number; interest: number; principal: number; balance: number }[] = []\n for (let period = 1; period <= nper; period++) {\n const interest = balance * rate\n const principalPart = payment - interest\n balance -= principalPart\n schedule.push({\n period,\n payment: Math.round(payment * 100) / 100,\n interest: Math.round(interest * 100) / 100,\n principal: Math.round(principalPart * 100) / 100,\n balance: Math.round(Math.max(balance, 0) * 100) / 100,\n })\n }\n return schedule\n}\n\n// ─── Random Distributions ────────────────────────────────────────────────────\n\n/**\n * Generates a random number from a normal (Gaussian) distribution.\n *\n * @param mean - The mean (default 0).\n * @param stddev - The standard deviation (default 1).\n * @returns A normally distributed random number.\n */\nexport function randomNormal(mean: number = 0, stddev: number = 1): number {\n let u = 0\n let v = 0\n while (u === 0) u = Math.random()\n while (v === 0) v = Math.random()\n const z = Math.sqrt(-2 * Math.log(u)) * Math.cos(2 * Math.PI * v)\n return mean + z * stddev\n}\n\n/**\n * Generates a random number from a Poisson distribution.\n *\n * @param lambda - The rate parameter (mean).\n * @returns A Poisson-distributed random integer.\n */\nexport function randomPoisson(lambda: number): number {\n if (lambda <= 0) throw new RangeError('Lambda must be positive')\n const L = Math.exp(-lambda)\n let k = 0\n let p = 1\n do {\n k++\n p *= Math.random()\n } while (p > L)\n return k - 1\n}\n\n/**\n * Generates a random number from a binomial distribution.\n *\n * @param n - Number of trials.\n * @param p - Probability of success per trial.\n * @returns Number of successes.\n */\nexport function randomBinomial(n: number, p: number): number {\n if (!Number.isInteger(n) || n < 0) throw new RangeError('n must be a non-negative integer')\n if (p < 0 || p > 1) throw new RangeError('p must be between 0 and 1')\n let successes = 0\n for (let i = 0; i < n; i++) {\n if (Math.random() < p) successes++\n }\n return successes\n}\n\n/**\n * Generates a random number from an exponential distribution.\n *\n * @param lambda - The rate parameter.\n * @returns An exponentially distributed random number.\n */\nexport function randomExponential(lambda: number): number {\n if (lambda <= 0) throw new RangeError('Lambda must be positive')\n return -Math.log(1 - Math.random()) / lambda\n}\n\n/**\n * Generates a random number from a uniform distribution.\n *\n * @param min - Lower bound (default 0).\n * @param max - Upper bound (default 1).\n * @returns A uniformly distributed random number.\n */\nexport function randomUniform(min: number = 0, max: number = 1): number {\n return Math.random() * (max - min) + min\n}\n\n// ─── Calculus ─────────────────────────────────────────────────────────────────\n\n/**\n * Computes the numerical derivative of a function at a point.\n *\n * @param f - The function.\n * @param x - The point to evaluate at.\n * @param h - Step size (default 1e-10).\n * @returns The derivative value.\n */\nexport function derivative(f: (x: number) => number, x: number, h: number = 1e-10): number {\n return (f(x + h) - f(x - h)) / (2 * h)\n}\n\n/**\n * Computes the definite integral of a function using Simpson's rule.\n *\n * @param f - The function to integrate.\n * @param a - Lower bound.\n * @param b - Upper bound.\n * @param n - Number of subintervals (must be even, default 100).\n * @returns The approximate integral value.\n */\nexport function integral(f: (x: number) => number, a: number, b: number, n: number = 100): number {\n if (n % 2 !== 0) {\n throw new RangeError('Number of subintervals must be even for Simpson\\'s rule')\n }\n const h = (b - a) / n\n let sum = f(a) + f(b)\n for (let i = 1; i < n; i++) {\n const x = a + i * h\n sum += i % 2 === 0 ? 2 * f(x) : 4 * f(x)\n }\n return (h / 3) * sum\n}\n\n/**\n * Computes the definite integral using the trapezoidal rule.\n *\n * @param f - The function to integrate.\n * @param a - Lower bound.\n * @param b - Upper bound.\n * @param n - Number of subintervals (default 100).\n * @returns The approximate integral value.\n */\nexport function trapezoidal(f: (x: number) => number, a: number, b: number, n: number = 100): number {\n const h = (b - a) / n\n let sum = (f(a) + f(b)) / 2\n for (let i = 1; i < n; i++) {\n sum += f(a + i * h)\n }\n return h * sum\n}\n\n/**\n * Finds a root of a function using Newton's method.\n *\n * @param f - The function.\n * @param guess - Initial guess.\n * @param tolerance - Convergence tolerance (default 1e-7).\n * @param maxIter - Maximum iterations (default 100).\n * @returns The root value, or NaN if not converged.\n */\nexport function newtonRoot(\n f: (x: number) => number,\n guess: number,\n tolerance: number = 1e-7,\n maxIter: number = 100,\n): number {\n let x = guess\n for (let i = 0; i < maxIter; i++) {\n const fx = f(x)\n if (Math.abs(fx) < tolerance) return x\n const df = derivative(f, x)\n if (df === 0) return NaN\n x -= fx / df\n }\n return NaN\n}\n\n/**\n * Linearly interpolates between two values.\n *\n * @param a - Start value.\n * @param b - End value.\n * @param t - Interpolation factor (0 to 1).\n * @returns The interpolated value.\n */\nexport function lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t\n}\n\n/**\n * Maps a value from one range to another.\n *\n * @param value - The input value.\n * @param inMin - Input range minimum.\n * @param inMax - Input range maximum.\n * @param outMin - Output range minimum.\n * @param outMax - Output range maximum.\n * @returns The mapped value.\n */\nexport function mapRange(value: number, inMin: number, inMax: number, outMin: number, outMax: number): number {\n if (inMax === inMin) throw new RangeError('Input range cannot be zero')\n return ((value - inMin) / (inMax - inMin)) * (outMax - outMin) + outMin\n}\n"],"mappings":"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","names":["stddev","_","sum"]}
|
|
1
|
+
{"version":3,"sources":["../../src/math/index.ts"],"sourcesContent":["/**\r\n * Error thrown when attempting to divide by zero.\r\n */\r\nexport class DivisionByZeroError extends Error {\r\n constructor() {\r\n super('Division by zero')\r\n this.name = 'DivisionByZeroError'\r\n }\r\n}\r\n\r\nfunction getPrecision(value: number): number {\r\n if (!isFinite(value)) return 0\r\n const eIndex = String(value).indexOf('e')\r\n if (eIndex > -1) {\r\n const exp = parseInt(String(value).slice(eIndex + 1), 10)\r\n if (exp < 0) return Math.abs(exp)\r\n return 0\r\n }\r\n const str = String(value)\r\n const dot = str.indexOf('.')\r\n return dot === -1 ? 0 : str.length - dot - 1\r\n}\r\n\r\nfunction toPrecisionFactor(a: number, b: number): number {\r\n return Math.pow(10, Math.max(getPrecision(a), getPrecision(b)))\r\n}\r\n\r\n/**\r\n * Safely adds two numbers, handling floating-point precision.\r\n *\r\n * @param a - First number.\r\n * @param b - Second number.\r\n * @returns The sum.\r\n */\r\nexport function add(a: number, b: number): number {\r\n const factor = toPrecisionFactor(a, b)\r\n return (Math.round(a * factor) + Math.round(b * factor)) / factor\r\n}\r\n\r\n/**\r\n * Safely subtracts two numbers, handling floating-point precision.\r\n *\r\n * @param a - First number.\r\n * @param b - Second number.\r\n * @returns The difference.\r\n */\r\nexport function sub(a: number, b: number): number {\r\n const factor = toPrecisionFactor(a, b)\r\n return (Math.round(a * factor) - Math.round(b * factor)) / factor\r\n}\r\n\r\n/**\r\n * Safely multiplies two numbers, handling floating-point precision.\r\n *\r\n * @param a - First number.\r\n * @param b - Second number.\r\n * @returns The product.\r\n */\r\nexport function mul(a: number, b: number): number {\r\n const factorA = toPrecisionFactor(a, 1)\r\n const factorB = toPrecisionFactor(1, b)\r\n const result = (Math.round(a * factorA) * Math.round(b * factorB)) / (factorA * factorB)\r\n return result\r\n}\r\n\r\n/**\r\n * Safely divides two numbers.\r\n *\r\n * @param a - The dividend.\r\n * @param b - The divisor.\r\n * @returns The quotient.\r\n * @throws {DivisionByZeroError} If `b` is zero.\r\n */\r\nexport function div(a: number, b: number): number {\r\n if (b === 0) throw new DivisionByZeroError()\r\n const factor = toPrecisionFactor(a, b)\r\n return Math.round(a * factor) / Math.round(b * factor)\r\n}\r\n\r\n/**\r\n * Rounds a number to the given precision.\r\n *\r\n * @param value - The number to round.\r\n * @param precision - Number of decimal places (default 0).\r\n * @returns The rounded value.\r\n */\r\nexport function round(value: number, precision: number = 0): number {\r\n const factor = Math.pow(10, precision)\r\n return Math.round(value * factor) / factor\r\n}\r\n\r\n/**\r\n * Floors a number to the given precision.\r\n *\r\n * @param value - The number to floor.\r\n * @param precision - Number of decimal places (default 0).\r\n * @returns The floored value.\r\n */\r\nexport function floor(value: number, precision: number = 0): number {\r\n const factor = Math.pow(10, precision)\r\n return Math.floor(value * factor) / factor\r\n}\r\n\r\n/**\r\n * Ceils a number to the given precision.\r\n *\r\n * @param value - The number to ceil.\r\n * @param precision - Number of decimal places (default 0).\r\n * @returns The ceiled value.\r\n */\r\nexport function ceil(value: number, precision: number = 0): number {\r\n const factor = Math.pow(10, precision)\r\n return Math.ceil(value * factor) / factor\r\n}\r\n\r\n/**\r\n * Checks if two numbers are approximately equal within a tolerance.\r\n *\r\n * @param a - First number.\r\n * @param b - Second number.\r\n * @param tolerance - Maximum difference (default `Number.EPSILON`).\r\n * @returns Whether the numbers are approximately equal.\r\n */\r\nexport function approxEqual(a: number, b: number, tolerance: number = Number.EPSILON): boolean {\r\n return Math.abs(a - b) <= tolerance\r\n}\r\n\r\n/**\r\n * Clamps a value within the inclusive range [min, max].\r\n *\r\n * @param value - The value to clamp.\r\n * @param min - The lower bound.\r\n * @param max - The upper bound.\r\n * @returns The clamped value.\r\n * @throws {RangeError} If `min` exceeds `max`.\r\n */\r\nexport function clamp(value: number, min: number, max: number): number {\r\n if (min > max) {\r\n throw new RangeError('Minimum value cannot exceed maximum value')\r\n }\r\n return Math.min(Math.max(value, min), max)\r\n}\r\n\r\n/**\r\n * Computes the sum of an array of numbers.\r\n *\r\n * @param values - Array of numbers.\r\n * @returns The total sum.\r\n */\r\nexport function sum(values: number[]): number {\r\n let total = 0\r\n for (let i = 0; i < values.length; i++) {\r\n total += values[i]!\r\n }\r\n return total\r\n}\r\n\r\n/**\r\n * Computes the average (mean) of an array of numbers.\r\n *\r\n * @param values - Array of numbers.\r\n * @returns The average.\r\n * @throws {RangeError} If the array is empty.\r\n */\r\nexport function average(values: number[]): number {\r\n if (values.length === 0) {\r\n throw new RangeError('Cannot compute average of an empty array')\r\n }\r\n return sum(values) / values.length\r\n}\r\n\r\n/**\r\n * Generates a random integer between `min` and `max` (inclusive).\r\n *\r\n * @param min - The minimum integer.\r\n * @param max - The maximum integer.\r\n * @returns A random integer.\r\n * @throws {RangeError} If arguments are not integers or `min > max`.\r\n */\r\nexport function randomInt(min: number, max: number): number {\r\n if (!Number.isInteger(min) || !Number.isInteger(max)) {\r\n throw new RangeError('Arguments must be integers')\r\n }\r\n if (min > max) {\r\n throw new RangeError('Minimum value cannot exceed maximum value')\r\n }\r\n return Math.floor(Math.random() * (max - min + 1)) + min\r\n}\r\n\r\n/**\r\n * Checks if a number is within the inclusive range [min, max].\r\n *\r\n * @param value - The number to check.\r\n * @param min - The lower bound.\r\n * @param max - The upper bound.\r\n * @returns Whether the value is in range.\r\n */\r\nexport function inRange(value: number, min: number, max: number): boolean {\r\n return value >= min && value <= max\r\n}\r\n"],"mappings":"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","names":[]}
|
package/dist/path/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/path/index.ts"],"sourcesContent":["const SEP = '/'\n\n/**\n * Joins path segments with the proper separator.\n *\n * @param segments - Path segments to join.\n * @returns The joined path.\n */\nexport function join(...segments: string[]): string {\n const parts: string[] = []\n for (const seg of segments) {\n if (seg === '') continue\n const split = seg.split(/[\\\\/]/)\n for (const part of split) {\n if (part === '' || part === '.') continue\n if (part === '..') {\n if (parts.length > 0 && parts[parts.length - 1] !== '..') {\n parts.pop()\n } else {\n parts.push('..')\n }\n } else {\n parts.push(part)\n }\n }\n }\n if (parts.length === 0) return '.'\n const result = parts.join(SEP)\n if (segments.length > 0 && segments[0]!.startsWith('/')) {\n return SEP + result\n }\n return result\n}\n\n/**\n * Resolves path segments to an absolute path.\n *\n * @param segments - Path segments to resolve.\n * @returns The resolved absolute path.\n */\nexport function resolve(...segments: string[]): string {\n let resolved = ''\n let isAbs = false\n\n for (const seg of segments) {\n if (seg.startsWith('/')) {\n resolved = seg\n isAbs = true\n } else if (isAbs) {\n resolved = join(resolved, seg)\n } else {\n resolved = resolved ? join(resolved, seg) : seg\n }\n }\n\n if (!isAbs) {\n resolved = join(SEP, resolved)\n }\n\n return normalize(resolved)\n}\n\n/**\n * Returns the filename from a path.\n *\n * @param p - The path.\n * @param ext - Optional extension to strip.\n * @returns The filename.\n */\nexport function basename(p: string, ext?: string): string {\n const normalized = p.replace(/[\\\\/]+$/, '')\n const idx = normalized.lastIndexOf(SEP)\n let base = idx === -1 ? normalized : normalized.slice(idx + 1)\n if (ext && base.endsWith(ext)) {\n base = base.slice(0, -ext.length)\n }\n return base\n}\n\n/**\n * Returns the directory portion of a path.\n *\n * @param p - The path.\n * @returns The directory path.\n */\nexport function dirname(p: string): string {\n if (p === SEP) return SEP\n const normalized = p.replace(/[\\\\/]+$/, '')\n if (normalized === '') return '.'\n const idx = normalized.lastIndexOf(SEP)\n if (idx === -1) return '.'\n if (idx === 0) return SEP\n return normalized.slice(0, idx)\n}\n\n/**\n * Returns the file extension from a path.\n *\n * @param p - The path.\n * @returns The extension including the dot, or empty string.\n */\nexport function extname(p: string): string {\n const base = basename(p)\n const idx = base.lastIndexOf('.')\n if (idx === -1 || idx === 0) return ''\n return base.slice(idx)\n}\n\n/**\n * Normalizes a path, resolving '..' and '.' segments.\n *\n * @param p - The path to normalize.\n * @returns The normalized path.\n */\nexport function normalize(p: string): string {\n const parts = p.split(/[\\\\/]+/)\n const stack: string[] = []\n let isAbs = p.startsWith('/')\n\n for (const part of parts) {\n if (part === '' || part === '.') continue\n if (part === '..') {\n if (stack.length > 0 && stack[stack.length - 1] !== '..') {\n stack.pop()\n } else if (!isAbs) {\n stack.push('..')\n }\n } else {\n stack.push(part)\n }\n }\n\n const result = stack.join(SEP)\n if (isAbs) return SEP + result\n if (result === '') return '.'\n return result\n}\n\n/**\n * Checks if a path is absolute.\n *\n * @param p - The path to check.\n * @returns Whether the path is absolute.\n */\nexport function isAbsolute(p: string): boolean {\n return p.startsWith('/')\n}\n\n/**\n * Computes the relative path from `from` to `to`.\n *\n * @param from - The base path.\n * @param to - The target path.\n * @returns The relative path.\n */\nexport function relative(from: string, to: string): string {\n const fromParts = normalize(from).split(SEP)\n const toParts = normalize(to).split(SEP)\n\n let i = 0\n while (i < fromParts.length && i < toParts.length && fromParts[i] === toParts[i]) {\n i++\n }\n\n const up = fromParts.slice(i).map(() => '..')\n const down = toParts.slice(i)\n const result = [...up, ...down].join(SEP)\n\n return result || '.'\n}\n\nexport interface ParsedPath {\n root: string\n dir: string\n base: string\n name: string\n ext: string\n}\n\n/**\n * Parses a path into its components.\n *\n * @param p - The path to parse.\n * @returns An object with root, dir, base, name, and ext.\n */\nexport function parse(p: string): ParsedPath {\n const root = p.startsWith(SEP) ? SEP : ''\n const base = basename(p)\n const ext = extname(base)\n const name = ext ? base.slice(0, -ext.length) : base\n const dir = root ? dirname(p) : (dirname(p) === '.' ? '' : dirname(p))\n\n return { root, dir, base, name, ext }\n}\n\n/**\n * Formats a parsed path object back into a path string.\n *\n * @param parsed - The parsed path components.\n * @returns The formatted path string.\n */\nexport function format(parsed: Partial<ParsedPath>): string {\n const { root = '', dir = '', base = '', name = '', ext = '' } = parsed\n const baseName = base || name + ext\n if (dir) {\n return dir + SEP + baseName\n }\n return root + baseName\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/path/index.ts"],"sourcesContent":["const SEP = '/'\r\n\r\n/**\r\n * Joins path segments with the proper separator.\r\n *\r\n * @param segments - Path segments to join.\r\n * @returns The joined path.\r\n */\r\nexport function join(...segments: string[]): string {\r\n const parts: string[] = []\r\n for (const seg of segments) {\r\n if (seg === '') continue\r\n const split = seg.split(/[\\\\/]/)\r\n for (const part of split) {\r\n if (part === '' || part === '.') continue\r\n if (part === '..') {\r\n if (parts.length > 0 && parts[parts.length - 1] !== '..') {\r\n parts.pop()\r\n } else {\r\n parts.push('..')\r\n }\r\n } else {\r\n parts.push(part)\r\n }\r\n }\r\n }\r\n if (parts.length === 0) return '.'\r\n const result = parts.join(SEP)\r\n if (segments.length > 0 && segments[0]!.startsWith('/')) {\r\n return SEP + result\r\n }\r\n return result\r\n}\r\n\r\n/**\r\n * Resolves path segments to an absolute path.\r\n *\r\n * @param segments - Path segments to resolve.\r\n * @returns The resolved absolute path.\r\n */\r\nexport function resolve(...segments: string[]): string {\r\n let resolved = ''\r\n let isAbs = false\r\n\r\n for (const seg of segments) {\r\n if (seg.startsWith('/')) {\r\n resolved = seg\r\n isAbs = true\r\n } else if (isAbs) {\r\n resolved = join(resolved, seg)\r\n } else {\r\n resolved = resolved ? join(resolved, seg) : seg\r\n }\r\n }\r\n\r\n if (!isAbs) {\r\n resolved = join(SEP, resolved)\r\n }\r\n\r\n return normalize(resolved)\r\n}\r\n\r\n/**\r\n * Returns the filename from a path.\r\n *\r\n * @param p - The path.\r\n * @param ext - Optional extension to strip.\r\n * @returns The filename.\r\n */\r\nexport function basename(p: string, ext?: string): string {\r\n const normalized = p.replace(/[\\\\/]+$/, '')\r\n const idx = normalized.lastIndexOf(SEP)\r\n let base = idx === -1 ? normalized : normalized.slice(idx + 1)\r\n if (ext && base.endsWith(ext)) {\r\n base = base.slice(0, -ext.length)\r\n }\r\n return base\r\n}\r\n\r\n/**\r\n * Returns the directory portion of a path.\r\n *\r\n * @param p - The path.\r\n * @returns The directory path.\r\n */\r\nexport function dirname(p: string): string {\r\n if (p === SEP) return SEP\r\n const normalized = p.replace(/[\\\\/]+$/, '')\r\n if (normalized === '') return '.'\r\n const idx = normalized.lastIndexOf(SEP)\r\n if (idx === -1) return '.'\r\n if (idx === 0) return SEP\r\n return normalized.slice(0, idx)\r\n}\r\n\r\n/**\r\n * Returns the file extension from a path.\r\n *\r\n * @param p - The path.\r\n * @returns The extension including the dot, or empty string.\r\n */\r\nexport function extname(p: string): string {\r\n const base = basename(p)\r\n const idx = base.lastIndexOf('.')\r\n if (idx === -1 || idx === 0) return ''\r\n return base.slice(idx)\r\n}\r\n\r\n/**\r\n * Normalizes a path, resolving '..' and '.' segments.\r\n *\r\n * @param p - The path to normalize.\r\n * @returns The normalized path.\r\n */\r\nexport function normalize(p: string): string {\r\n const parts = p.split(/[\\\\/]+/)\r\n const stack: string[] = []\r\n let isAbs = p.startsWith('/')\r\n\r\n for (const part of parts) {\r\n if (part === '' || part === '.') continue\r\n if (part === '..') {\r\n if (stack.length > 0 && stack[stack.length - 1] !== '..') {\r\n stack.pop()\r\n } else if (!isAbs) {\r\n stack.push('..')\r\n }\r\n } else {\r\n stack.push(part)\r\n }\r\n }\r\n\r\n const result = stack.join(SEP)\r\n if (isAbs) return SEP + result\r\n if (result === '') return '.'\r\n return result\r\n}\r\n\r\n/**\r\n * Checks if a path is absolute.\r\n *\r\n * @param p - The path to check.\r\n * @returns Whether the path is absolute.\r\n */\r\nexport function isAbsolute(p: string): boolean {\r\n return p.startsWith('/')\r\n}\r\n\r\n/**\r\n * Computes the relative path from `from` to `to`.\r\n *\r\n * @param from - The base path.\r\n * @param to - The target path.\r\n * @returns The relative path.\r\n */\r\nexport function relative(from: string, to: string): string {\r\n const fromParts = normalize(from).split(SEP)\r\n const toParts = normalize(to).split(SEP)\r\n\r\n let i = 0\r\n while (i < fromParts.length && i < toParts.length && fromParts[i] === toParts[i]) {\r\n i++\r\n }\r\n\r\n const up = fromParts.slice(i).map(() => '..')\r\n const down = toParts.slice(i)\r\n const result = [...up, ...down].join(SEP)\r\n\r\n return result || '.'\r\n}\r\n\r\nexport interface ParsedPath {\r\n root: string\r\n dir: string\r\n base: string\r\n name: string\r\n ext: string\r\n}\r\n\r\n/**\r\n * Parses a path into its components.\r\n *\r\n * @param p - The path to parse.\r\n * @returns An object with root, dir, base, name, and ext.\r\n */\r\nexport function parse(p: string): ParsedPath {\r\n const root = p.startsWith(SEP) ? SEP : ''\r\n const base = basename(p)\r\n const ext = extname(base)\r\n const name = ext ? base.slice(0, -ext.length) : base\r\n const dir = root ? dirname(p) : (dirname(p) === '.' ? '' : dirname(p))\r\n\r\n return { root, dir, base, name, ext }\r\n}\r\n\r\n/**\r\n * Formats a parsed path object back into a path string.\r\n *\r\n * @param parsed - The parsed path components.\r\n * @returns The formatted path string.\r\n */\r\nexport function format(parsed: Partial<ParsedPath>): string {\r\n const { root = '', dir = '', base = '', name = '', ext = '' } = parsed\r\n const baseName = base || name + ext\r\n if (dir) {\r\n return dir + SEP + baseName\r\n }\r\n return root + baseName\r\n}\r\n"],"mappings":"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","names":[]}
|
package/dist/string/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/string/index.ts"],"sourcesContent":["const WORD_SPLIT_RE = /[A-Z]?[a-z]+|[A-Z]+(?=[A-Z][a-z]|\\d|\\b)|\\d+/g\n\nfunction splitWords(str: string): string[] {\n return str.match(WORD_SPLIT_RE) ?? []\n}\n\n/**\n * Capitalizes the first character and lowercases the rest.\n */\nexport function capitalize(str: string): string {\n if (str.length === 0) return str\n return str[0]!.toUpperCase() + str.slice(1).toLowerCase()\n}\n\n/**\n * Converts a string to camelCase.\n */\nexport function camelCase(str: string): string {\n const words = splitWords(str)\n if (words.length === 0) return ''\n const [firstWord, ...rest] = words\n return firstWord!.toLowerCase() + rest.map(w => w[0]!.toUpperCase() + w.slice(1).toLowerCase()).join('')\n}\n\n/**\n * Converts a string to kebab-case.\n */\nexport function kebabCase(str: string): string {\n return splitWords(str).map(w => w.toLowerCase()).join('-')\n}\n\n/**\n * Converts a string to snake_case.\n */\nexport function snakeCase(str: string): string {\n return splitWords(str).map(w => w.toLowerCase()).join('_')\n}\n\n/**\n * Converts a string to PascalCase.\n */\nexport function pascalCase(str: string): string {\n return splitWords(str).map(w => w[0]!.toUpperCase() + w.slice(1).toLowerCase()).join('')\n}\n\n/**\n * Truncates a string to the specified length, appending a suffix (default \"...\").\n */\nexport function truncate(str: string, maxLength: number, suffix = '...'): string {\n if (str.length <= maxLength) return str\n return str.slice(0, Math.max(0, maxLength - suffix.length)) + suffix\n}\n\n/**\n * Simple string interpolation using {{key}} syntax.\n *\n * @example template(\"Hello {{name}}\", { name: \"world\" }) // => \"Hello world\"\n */\nexport function template(str: string, data: Record<string, string | number>): string {\n return str.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key: string) => {\n const value = data[key]\n return value !== undefined ? String(value) : `{{${key}}}`\n })\n}\n\n/**\n * Generates a UUID v4 string.\n * Uses crypto.randomUUID when available, falls back to manual implementation.\n */\nexport function uuid(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID()\n }\n const hex = '0123456789abcdef'\n const chars: string[] = []\n for (let i = 0; i < 36; i++) {\n if (i === 8 || i === 13 || i === 18 || i === 23) {\n chars.push('-')\n } else if (i === 14) {\n chars.push('4')\n } else if (i === 19) {\n chars.push(hex[Math.floor(Math.random() * 4) + 8]!)\n } else {\n chars.push(hex[Math.floor(Math.random() * 16)]!)\n }\n }\n return chars.join('')\n}\n\n/**\n * Generates a short random ID with configurable length and alphabet.\n *\n * @default size = 21, alphabet = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_-\"\n */\nexport function nanoid(size = 21, alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_-'): string {\n const len = alphabet.length\n let result = ''\n for (let i = 0; i < size; i++) {\n result += alphabet[Math.floor(Math.random() * len)]!\n }\n return result\n}\n\nconst HTML_ESCAPE_MAP: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n}\n\nconst HTML_UNESCAPE_MAP: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\",\n ''': \"'\",\n}\n\n/**\n * Escapes HTML special characters (&, <, >, \", ').\n */\nexport function escapeHtml(str: string): string {\n return str.replace(/[&<>\"']/g, ch => HTML_ESCAPE_MAP[ch] ?? ch)\n}\n\n/**\n * Unescapes common HTML entities.\n */\nexport function unescapeHtml(str: string): string {\n return str.replace(/&(?:amp|lt|gt|quot|#39|#x27);/g, entity => HTML_UNESCAPE_MAP[entity] ?? entity)\n}\n\n/**\n * Removes whitespace from both ends of a string.\n */\nexport function trim(str: string): string {\n return str.trim()\n}\n\n/**\n * Removes whitespace from the start of a string.\n */\nexport function trimStart(str: string): string {\n return str.trimStart()\n}\n\n/**\n * Removes whitespace from the end of a string.\n */\nexport function trimEnd(str: string): string {\n return str.trimEnd()\n}\n\n/**\n * Pads a string to the given length by adding characters to both sides.\n */\nexport function pad(str: string, length: number, char = ' '): string {\n const totalPadding = Math.max(0, length - str.length)\n const leftPad = Math.floor(totalPadding / 2)\n const rightPad = totalPadding - leftPad\n return char.repeat(leftPad) + str + char.repeat(rightPad)\n}\n\n/**\n * Pads the start of a string to the given length.\n */\nexport function padStart(str: string, length: number, char = ' '): string {\n return str.padStart(length, char)\n}\n\n/**\n * Pads the end of a string to the given length.\n */\nexport function padEnd(str: string, length: number, char = ' '): string {\n return str.padEnd(length, char)\n}\n\n/**\n * Reverses a string.\n */\nexport function reverse(str: string): string {\n return str.split('').reverse().join('')\n}\n\n/**\n * Splits a string into words.\n */\nexport function words(str: string): string[] {\n return splitWords(str)\n}\n\n/**\n * Converts a string to a URL-friendly slug.\n */\nexport function slugify(str: string): string {\n return str\n .toLowerCase()\n .replace(/[^\\w\\s-]/g, '')\n .replace(/[\\s_]+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-+/, '')\n .replace(/-+$/, '')\n}\n\n/**\n * Counts occurrences of a substring in a string.\n */\nexport function countOccurrences(str: string, substring: string): number {\n if (substring.length === 0 || str.length === 0) return 0\n let count = 0\n let pos = 0\n while ((pos = str.indexOf(substring, pos)) !== -1) {\n count++\n pos += substring.length\n }\n return count\n}\n"],"mappings":"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","names":["words"]}
|
|
1
|
+
{"version":3,"sources":["../../src/string/index.ts"],"sourcesContent":["const WORD_SPLIT_RE = /[A-Z]?[a-z]+|[A-Z]+(?=[A-Z][a-z]|\\d|\\b)|\\d+/g\r\n\r\nfunction splitWords(str: string): string[] {\r\n return str.match(WORD_SPLIT_RE) ?? []\r\n}\r\n\r\n/**\r\n * Capitalizes the first character and lowercases the rest.\r\n */\r\nexport function capitalize(str: string): string {\r\n if (str.length === 0) return str\r\n return str[0]!.toUpperCase() + str.slice(1).toLowerCase()\r\n}\r\n\r\n/**\r\n * Converts a string to camelCase.\r\n */\r\nexport function camelCase(str: string): string {\r\n const words = splitWords(str)\r\n if (words.length === 0) return ''\r\n const [firstWord, ...rest] = words\r\n return firstWord!.toLowerCase() + rest.map(w => w[0]!.toUpperCase() + w.slice(1).toLowerCase()).join('')\r\n}\r\n\r\n/**\r\n * Converts a string to kebab-case.\r\n */\r\nexport function kebabCase(str: string): string {\r\n return splitWords(str).map(w => w.toLowerCase()).join('-')\r\n}\r\n\r\n/**\r\n * Converts a string to snake_case.\r\n */\r\nexport function snakeCase(str: string): string {\r\n return splitWords(str).map(w => w.toLowerCase()).join('_')\r\n}\r\n\r\n/**\r\n * Converts a string to PascalCase.\r\n */\r\nexport function pascalCase(str: string): string {\r\n return splitWords(str).map(w => w[0]!.toUpperCase() + w.slice(1).toLowerCase()).join('')\r\n}\r\n\r\n/**\r\n * Truncates a string to the specified length, appending a suffix (default \"...\").\r\n */\r\nexport function truncate(str: string, maxLength: number, suffix = '...'): string {\r\n if (str.length <= maxLength) return str\r\n return str.slice(0, Math.max(0, maxLength - suffix.length)) + suffix\r\n}\r\n\r\n/**\r\n * Simple string interpolation using {{key}} syntax.\r\n *\r\n * @example template(\"Hello {{name}}\", { name: \"world\" }) // => \"Hello world\"\r\n */\r\nexport function template(str: string, data: Record<string, string | number>): string {\r\n return str.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key: string) => {\r\n const value = data[key]\r\n return value !== undefined ? String(value) : `{{${key}}}`\r\n })\r\n}\r\n\r\n/**\r\n * Generates a UUID v4 string.\r\n * Uses crypto.randomUUID when available, falls back to manual implementation.\r\n */\r\nexport function uuid(): string {\r\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\r\n return crypto.randomUUID()\r\n }\r\n const hex = '0123456789abcdef'\r\n const chars: string[] = []\r\n for (let i = 0; i < 36; i++) {\r\n if (i === 8 || i === 13 || i === 18 || i === 23) {\r\n chars.push('-')\r\n } else if (i === 14) {\r\n chars.push('4')\r\n } else if (i === 19) {\r\n chars.push(hex[Math.floor(Math.random() * 4) + 8]!)\r\n } else {\r\n chars.push(hex[Math.floor(Math.random() * 16)]!)\r\n }\r\n }\r\n return chars.join('')\r\n}\r\n\r\n/**\r\n * Generates a short random ID with configurable length and alphabet.\r\n *\r\n * @default size = 21, alphabet = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_-\"\r\n */\r\nexport function nanoid(size = 21, alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_-'): string {\r\n const len = alphabet.length\r\n let result = ''\r\n for (let i = 0; i < size; i++) {\r\n result += alphabet[Math.floor(Math.random() * len)]!\r\n }\r\n return result\r\n}\r\n\r\nconst HTML_ESCAPE_MAP: Record<string, string> = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n '\"': '"',\r\n \"'\": ''',\r\n}\r\n\r\nconst HTML_UNESCAPE_MAP: Record<string, string> = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n '"': '\"',\r\n ''': \"'\",\r\n ''': \"'\",\r\n}\r\n\r\n/**\r\n * Escapes HTML special characters (&, <, >, \", ').\r\n */\r\nexport function escapeHtml(str: string): string {\r\n return str.replace(/[&<>\"']/g, ch => HTML_ESCAPE_MAP[ch] ?? ch)\r\n}\r\n\r\n/**\r\n * Unescapes common HTML entities.\r\n */\r\nexport function unescapeHtml(str: string): string {\r\n return str.replace(/&(?:amp|lt|gt|quot|#39|#x27);/g, entity => HTML_UNESCAPE_MAP[entity] ?? entity)\r\n}\r\n\r\n/**\r\n * Removes whitespace from both ends of a string.\r\n */\r\nexport function trim(str: string): string {\r\n return str.trim()\r\n}\r\n\r\n/**\r\n * Removes whitespace from the start of a string.\r\n */\r\nexport function trimStart(str: string): string {\r\n return str.trimStart()\r\n}\r\n\r\n/**\r\n * Removes whitespace from the end of a string.\r\n */\r\nexport function trimEnd(str: string): string {\r\n return str.trimEnd()\r\n}\r\n\r\n/**\r\n * Pads a string to the given length by adding characters to both sides.\r\n */\r\nexport function pad(str: string, length: number, char = ' '): string {\r\n const totalPadding = Math.max(0, length - str.length)\r\n const leftPad = Math.floor(totalPadding / 2)\r\n const rightPad = totalPadding - leftPad\r\n return char.repeat(leftPad) + str + char.repeat(rightPad)\r\n}\r\n\r\n/**\r\n * Pads the start of a string to the given length.\r\n */\r\nexport function padStart(str: string, length: number, char = ' '): string {\r\n return str.padStart(length, char)\r\n}\r\n\r\n/**\r\n * Pads the end of a string to the given length.\r\n */\r\nexport function padEnd(str: string, length: number, char = ' '): string {\r\n return str.padEnd(length, char)\r\n}\r\n\r\n/**\r\n * Reverses a string.\r\n */\r\nexport function reverse(str: string): string {\r\n return str.split('').reverse().join('')\r\n}\r\n\r\n/**\r\n * Splits a string into words.\r\n */\r\nexport function words(str: string): string[] {\r\n return splitWords(str)\r\n}\r\n\r\n/**\r\n * Converts a string to a URL-friendly slug.\r\n */\r\nexport function slugify(str: string): string {\r\n return str\r\n .toLowerCase()\r\n .replace(/[^\\w\\s-]/g, '')\r\n .replace(/[\\s_]+/g, '-')\r\n .replace(/-+/g, '-')\r\n .replace(/^-+/, '')\r\n .replace(/-+$/, '')\r\n}\r\n\r\n/**\r\n * Counts occurrences of a substring in a string.\r\n */\r\nexport function countOccurrences(str: string, substring: string): number {\r\n if (substring.length === 0 || str.length === 0) return 0\r\n let count = 0\r\n let pos = 0\r\n while ((pos = str.indexOf(substring, pos)) !== -1) {\r\n count++\r\n pos += substring.length\r\n }\r\n return count\r\n}\r\n"],"mappings":"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","names":["words"]}
|
package/dist/type/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/type/index.ts"],"sourcesContent":["/**\n * Checks if a value is a string.\n */\nexport function isString(value: unknown): value is string {\n return typeof value === 'string'\n}\n\n/**\n * Checks if a value is a number (not NaN, not Infinity).\n */\nexport function isNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value)\n}\n\n/**\n * Checks if a value is a boolean.\n */\nexport function isBoolean(value: unknown): value is boolean {\n return typeof value === 'boolean'\n}\n\n/**\n * Checks if a value is a plain object (not null, not array, typeof 'object').\n */\nexport function isObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\n/**\n * Checks if a value is an array.\n */\nexport function isArray(value: unknown): value is unknown[] {\n return Array.isArray(value)\n}\n\n/**\n * Checks if a value is a function.\n */\nexport function isFunction(value: unknown): value is (...args: unknown[]) => unknown {\n return typeof value === 'function'\n}\n\n/**\n * Checks if a value is a Date.\n */\nexport function isDate(value: unknown): value is Date {\n return value instanceof Date && !Number.isNaN(value.getTime())\n}\n\n/**\n * Checks if a value is a RegExp.\n */\nexport function isRegExp(value: unknown): value is RegExp {\n return value instanceof RegExp\n}\n\n/**\n * Checks if a value is a Map.\n */\nexport function isMap(value: unknown): value is Map<unknown, unknown> {\n return value instanceof Map\n}\n\n/**\n * Checks if a value is a Set.\n */\nexport function isSet(value: unknown): value is Set<unknown> {\n return value instanceof Set\n}\n\n/**\n * Checks if a value is a Promise.\n */\nexport function isPromise(value: unknown): value is Promise<unknown> {\n return value instanceof Promise\n}\n\n/**\n * Checks if a value is null.\n */\nexport function isNull(value: unknown): value is null {\n return value === null\n}\n\n/**\n * Checks if a value is undefined.\n */\nexport function isUndefined(value: unknown): value is undefined {\n return value === undefined\n}\n\n/**\n * Checks if a value is null or undefined.\n */\nexport function isNil(value: unknown): value is null | undefined {\n return value === null || value === undefined\n}\n\n/**\n * Checks if a value is empty.\n * Works for strings, arrays, objects, Map, and Set.\n */\nexport function isEmpty(value: unknown): boolean {\n if (value === null || value === undefined) return true\n if (typeof value === 'string') return value.length === 0\n if (Array.isArray(value)) return value.length === 0\n if (value instanceof Map || value instanceof Set) return value.size === 0\n if (typeof value === 'object') return Object.keys(value as Record<string, unknown>).length === 0\n return false\n}\n\n/**\n * Asserts that a value is defined (not null or undefined).\n * Throws if the value is null or undefined.\n */\nexport function assertDefined<T>(value: T, message?: string): asserts value is NonNullable<T> {\n if (value === null || value === undefined) {\n throw new Error(message ?? 'Expected value to be defined')\n }\n}\n\n/**\n * Asserts that a value matches a type guard. Throws if it doesn't.\n */\nexport function assertType<T>(value: unknown, guard: (v: unknown) => v is T, message?: string): asserts value is T {\n if (!guard(value)) {\n throw new Error(message ?? 'Value does not match expected type')\n }\n}\n\n/**\n * Wraps a value in an array if it is not already one.\n */\nexport function ensureArray<T>(value: T | T[]): T[] {\n return Array.isArray(value) ? value : [value]\n}\n\n/**\n * Alias for ensureArray.\n */\nexport function castArray<T>(value: T | T[]): T[] {\n return ensureArray(value)\n}\n\n/**\n * Returns a string representation of the value's type.\n *\n * Possible values: \"string\", \"number\", \"boolean\", \"array\", \"object\", \"function\",\n * \"date\", \"regexp\", \"map\", \"set\", \"promise\", \"null\", \"undefined\", \"nan\", \"infinity\"\n */\nexport function getType(value: unknown): string {\n if (value === null) return 'null'\n if (value === undefined) return 'undefined'\n if (typeof value === 'string') return 'string'\n if (typeof value === 'boolean') return 'boolean'\n if (typeof value === 'function') return 'function'\n if (typeof value === 'number') {\n if (Number.isNaN(value)) return 'nan'\n if (!Number.isFinite(value)) return 'infinity'\n return 'number'\n }\n if (Array.isArray(value)) return 'array'\n if (value instanceof Date) return 'date'\n if (value instanceof RegExp) return 'regexp'\n if (value instanceof Map) return 'map'\n if (value instanceof Set) return 'set'\n if (value instanceof Promise) return 'promise'\n return 'object'\n}\n"],"mappings":";AAGO,SAAS,SAAS,OAAiC;AACxD,SAAO,OAAO,UAAU;AAC1B;AAKO,SAAS,SAAS,OAAiC;AACxD,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK;AAC3D;AAKO,SAAS,UAAU,OAAkC;AAC1D,SAAO,OAAO,UAAU;AAC1B;AAKO,SAAS,SAAS,OAAkD;AACzE,SAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAKO,SAAS,QAAQ,OAAoC;AAC1D,SAAO,MAAM,QAAQ,KAAK;AAC5B;AAKO,SAAS,WAAW,OAA0D;AACnF,SAAO,OAAO,UAAU;AAC1B;AAKO,SAAS,OAAO,OAA+B;AACpD,SAAO,iBAAiB,QAAQ,CAAC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC/D;AAKO,SAAS,SAAS,OAAiC;AACxD,SAAO,iBAAiB;AAC1B;AAKO,SAAS,MAAM,OAAgD;AACpE,SAAO,iBAAiB;AAC1B;AAKO,SAAS,MAAM,OAAuC;AAC3D,SAAO,iBAAiB;AAC1B;AAKO,SAAS,UAAU,OAA2C;AACnE,SAAO,iBAAiB;AAC1B;AAKO,SAAS,OAAO,OAA+B;AACpD,SAAO,UAAU;AACnB;AAKO,SAAS,YAAY,OAAoC;AAC9D,SAAO,UAAU;AACnB;AAKO,SAAS,MAAM,OAA2C;AAC/D,SAAO,UAAU,QAAQ,UAAU;AACrC;AAMO,SAAS,QAAQ,OAAyB;AAC/C,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAClD,MAAI,OAAO,UAAU,SAAU,QAAO,MAAM,WAAW;AACvD,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,WAAW;AAClD,MAAI,iBAAiB,OAAO,iBAAiB,IAAK,QAAO,MAAM,SAAS;AACxE,MAAI,OAAO,UAAU,SAAU,QAAO,OAAO,KAAK,KAAgC,EAAE,WAAW;AAC/F,SAAO;AACT;AAMO,SAAS,cAAiB,OAAU,SAAmD;AAC5F,MAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,UAAM,IAAI,MAAM,WAAW,8BAA8B;AAAA,EAC3D;AACF;AAKO,SAAS,WAAc,OAAgB,OAA+B,SAAsC;AACjH,MAAI,CAAC,MAAM,KAAK,GAAG;AACjB,UAAM,IAAI,MAAM,WAAW,oCAAoC;AAAA,EACjE;AACF;AAKO,SAAS,YAAe,OAAqB;AAClD,SAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AAC9C;AAKO,SAAS,UAAa,OAAqB;AAChD,SAAO,YAAY,KAAK;AAC1B;AAQO,SAAS,QAAQ,OAAwB;AAC9C,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI,OAAO,UAAU,UAAW,QAAO;AACvC,MAAI,OAAO,UAAU,WAAY,QAAO;AACxC,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,OAAO,MAAM,KAAK,EAAG,QAAO;AAChC,QAAI,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AACpC,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO;AACjC,MAAI,iBAAiB,KAAM,QAAO;AAClC,MAAI,iBAAiB,OAAQ,QAAO;AACpC,MAAI,iBAAiB,IAAK,QAAO;AACjC,MAAI,iBAAiB,IAAK,QAAO;AACjC,MAAI,iBAAiB,QAAS,QAAO;AACrC,SAAO;AACT;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/type/index.ts"],"sourcesContent":["/**\r\n * Checks if a value is a string.\r\n */\r\nexport function isString(value: unknown): value is string {\r\n return typeof value === 'string'\r\n}\r\n\r\n/**\r\n * Checks if a value is a number (not NaN, not Infinity).\r\n */\r\nexport function isNumber(value: unknown): value is number {\r\n return typeof value === 'number' && Number.isFinite(value)\r\n}\r\n\r\n/**\r\n * Checks if a value is a boolean.\r\n */\r\nexport function isBoolean(value: unknown): value is boolean {\r\n return typeof value === 'boolean'\r\n}\r\n\r\n/**\r\n * Checks if a value is a plain object (not null, not array, typeof 'object').\r\n */\r\nexport function isObject(value: unknown): value is Record<string, unknown> {\r\n return value !== null && typeof value === 'object' && !Array.isArray(value)\r\n}\r\n\r\n/**\r\n * Checks if a value is an array.\r\n */\r\nexport function isArray(value: unknown): value is unknown[] {\r\n return Array.isArray(value)\r\n}\r\n\r\n/**\r\n * Checks if a value is a function.\r\n */\r\nexport function isFunction(value: unknown): value is (...args: unknown[]) => unknown {\r\n return typeof value === 'function'\r\n}\r\n\r\n/**\r\n * Checks if a value is a Date.\r\n */\r\nexport function isDate(value: unknown): value is Date {\r\n return value instanceof Date && !Number.isNaN(value.getTime())\r\n}\r\n\r\n/**\r\n * Checks if a value is a RegExp.\r\n */\r\nexport function isRegExp(value: unknown): value is RegExp {\r\n return value instanceof RegExp\r\n}\r\n\r\n/**\r\n * Checks if a value is a Map.\r\n */\r\nexport function isMap(value: unknown): value is Map<unknown, unknown> {\r\n return value instanceof Map\r\n}\r\n\r\n/**\r\n * Checks if a value is a Set.\r\n */\r\nexport function isSet(value: unknown): value is Set<unknown> {\r\n return value instanceof Set\r\n}\r\n\r\n/**\r\n * Checks if a value is a Promise.\r\n */\r\nexport function isPromise(value: unknown): value is Promise<unknown> {\r\n return value instanceof Promise\r\n}\r\n\r\n/**\r\n * Checks if a value is null.\r\n */\r\nexport function isNull(value: unknown): value is null {\r\n return value === null\r\n}\r\n\r\n/**\r\n * Checks if a value is undefined.\r\n */\r\nexport function isUndefined(value: unknown): value is undefined {\r\n return value === undefined\r\n}\r\n\r\n/**\r\n * Checks if a value is null or undefined.\r\n */\r\nexport function isNil(value: unknown): value is null | undefined {\r\n return value === null || value === undefined\r\n}\r\n\r\n/**\r\n * Checks if a value is empty.\r\n * Works for strings, arrays, objects, Map, and Set.\r\n */\r\nexport function isEmpty(value: unknown): boolean {\r\n if (value === null || value === undefined) return true\r\n if (typeof value === 'string') return value.length === 0\r\n if (Array.isArray(value)) return value.length === 0\r\n if (value instanceof Map || value instanceof Set) return value.size === 0\r\n if (typeof value === 'object') return Object.keys(value as Record<string, unknown>).length === 0\r\n return false\r\n}\r\n\r\n/**\r\n * Asserts that a value is defined (not null or undefined).\r\n * Throws if the value is null or undefined.\r\n */\r\nexport function assertDefined<T>(value: T, message?: string): asserts value is NonNullable<T> {\r\n if (value === null || value === undefined) {\r\n throw new Error(message ?? 'Expected value to be defined')\r\n }\r\n}\r\n\r\n/**\r\n * Asserts that a value matches a type guard. Throws if it doesn't.\r\n */\r\nexport function assertType<T>(value: unknown, guard: (v: unknown) => v is T, message?: string): asserts value is T {\r\n if (!guard(value)) {\r\n throw new Error(message ?? 'Value does not match expected type')\r\n }\r\n}\r\n\r\n/**\r\n * Wraps a value in an array if it is not already one.\r\n */\r\nexport function ensureArray<T>(value: T | T[]): T[] {\r\n return Array.isArray(value) ? value : [value]\r\n}\r\n\r\n/**\r\n * Alias for ensureArray.\r\n */\r\nexport function castArray<T>(value: T | T[]): T[] {\r\n return ensureArray(value)\r\n}\r\n\r\n/**\r\n * Returns a string representation of the value's type.\r\n *\r\n * Possible values: \"string\", \"number\", \"boolean\", \"array\", \"object\", \"function\",\r\n * \"date\", \"regexp\", \"map\", \"set\", \"promise\", \"null\", \"undefined\", \"nan\", \"infinity\"\r\n */\r\nexport function getType(value: unknown): string {\r\n if (value === null) return 'null'\r\n if (value === undefined) return 'undefined'\r\n if (typeof value === 'string') return 'string'\r\n if (typeof value === 'boolean') return 'boolean'\r\n if (typeof value === 'function') return 'function'\r\n if (typeof value === 'number') {\r\n if (Number.isNaN(value)) return 'nan'\r\n if (!Number.isFinite(value)) return 'infinity'\r\n return 'number'\r\n }\r\n if (Array.isArray(value)) return 'array'\r\n if (value instanceof Date) return 'date'\r\n if (value instanceof RegExp) return 'regexp'\r\n if (value instanceof Map) return 'map'\r\n if (value instanceof Set) return 'set'\r\n if (value instanceof Promise) return 'promise'\r\n return 'object'\r\n}\r\n"],"mappings":";AAGO,SAAS,SAAS,OAAiC;AACxD,SAAO,OAAO,UAAU;AAC1B;AAKO,SAAS,SAAS,OAAiC;AACxD,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK;AAC3D;AAKO,SAAS,UAAU,OAAkC;AAC1D,SAAO,OAAO,UAAU;AAC1B;AAKO,SAAS,SAAS,OAAkD;AACzE,SAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAKO,SAAS,QAAQ,OAAoC;AAC1D,SAAO,MAAM,QAAQ,KAAK;AAC5B;AAKO,SAAS,WAAW,OAA0D;AACnF,SAAO,OAAO,UAAU;AAC1B;AAKO,SAAS,OAAO,OAA+B;AACpD,SAAO,iBAAiB,QAAQ,CAAC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC/D;AAKO,SAAS,SAAS,OAAiC;AACxD,SAAO,iBAAiB;AAC1B;AAKO,SAAS,MAAM,OAAgD;AACpE,SAAO,iBAAiB;AAC1B;AAKO,SAAS,MAAM,OAAuC;AAC3D,SAAO,iBAAiB;AAC1B;AAKO,SAAS,UAAU,OAA2C;AACnE,SAAO,iBAAiB;AAC1B;AAKO,SAAS,OAAO,OAA+B;AACpD,SAAO,UAAU;AACnB;AAKO,SAAS,YAAY,OAAoC;AAC9D,SAAO,UAAU;AACnB;AAKO,SAAS,MAAM,OAA2C;AAC/D,SAAO,UAAU,QAAQ,UAAU;AACrC;AAMO,SAAS,QAAQ,OAAyB;AAC/C,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAClD,MAAI,OAAO,UAAU,SAAU,QAAO,MAAM,WAAW;AACvD,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,WAAW;AAClD,MAAI,iBAAiB,OAAO,iBAAiB,IAAK,QAAO,MAAM,SAAS;AACxE,MAAI,OAAO,UAAU,SAAU,QAAO,OAAO,KAAK,KAAgC,EAAE,WAAW;AAC/F,SAAO;AACT;AAMO,SAAS,cAAiB,OAAU,SAAmD;AAC5F,MAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,UAAM,IAAI,MAAM,WAAW,8BAA8B;AAAA,EAC3D;AACF;AAKO,SAAS,WAAc,OAAgB,OAA+B,SAAsC;AACjH,MAAI,CAAC,MAAM,KAAK,GAAG;AACjB,UAAM,IAAI,MAAM,WAAW,oCAAoC;AAAA,EACjE;AACF;AAKO,SAAS,YAAe,OAAqB;AAClD,SAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AAC9C;AAKO,SAAS,UAAa,OAAqB;AAChD,SAAO,YAAY,KAAK;AAC1B;AAQO,SAAS,QAAQ,OAAwB;AAC9C,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI,OAAO,UAAU,UAAW,QAAO;AACvC,MAAI,OAAO,UAAU,WAAY,QAAO;AACxC,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,OAAO,MAAM,KAAK,EAAG,QAAO;AAChC,QAAI,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AACpC,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO;AACjC,MAAI,iBAAiB,KAAM,QAAO;AAClC,MAAI,iBAAiB,OAAQ,QAAO;AACpC,MAAI,iBAAiB,IAAK,QAAO;AACjC,MAAI,iBAAiB,IAAK,QAAO;AACjC,MAAI,iBAAiB,QAAS,QAAO;AACrC,SAAO;AACT;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "superjs-core",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Zero-dependency JavaScript standard library — core, math, date, collection, string, async, io, &
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "Zero-dependency JavaScript standard library + dependency health scanner — core, math, date, collection, string, async, io, type, crypto, path & dep-exray",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"module": "./dist/index.js",
|
|
8
8
|
"types": "./dist/index.d.ts",
|
|
9
|
+
"bin": {
|
|
10
|
+
"dep-exray": "./dist/dep-exray/cli.js"
|
|
11
|
+
},
|
|
9
12
|
"exports": {
|
|
10
13
|
".": {
|
|
11
14
|
"import": "./dist/index.js",
|
|
@@ -50,6 +53,34 @@
|
|
|
50
53
|
"./path": {
|
|
51
54
|
"import": "./dist/path/index.js",
|
|
52
55
|
"types": "./dist/path/index.d.ts"
|
|
56
|
+
},
|
|
57
|
+
"./dep-exray": {
|
|
58
|
+
"import": "./dist/dep-exray/index.js",
|
|
59
|
+
"types": "./dist/dep-exray/index.d.ts"
|
|
60
|
+
},
|
|
61
|
+
"./dep-exray/scanner": {
|
|
62
|
+
"import": "./dist/dep-exray/scanner/index.js",
|
|
63
|
+
"types": "./dist/dep-exray/scanner/index.d.ts"
|
|
64
|
+
},
|
|
65
|
+
"./dep-exray/analyzer": {
|
|
66
|
+
"import": "./dist/dep-exray/analyzer/index.js",
|
|
67
|
+
"types": "./dist/dep-exray/analyzer/index.d.ts"
|
|
68
|
+
},
|
|
69
|
+
"./dep-exray/reporter": {
|
|
70
|
+
"import": "./dist/dep-exray/reporter/index.js",
|
|
71
|
+
"types": "./dist/dep-exray/reporter/index.d.ts"
|
|
72
|
+
},
|
|
73
|
+
"./dep-exray/types": {
|
|
74
|
+
"import": "./dist/dep-exray/types.js",
|
|
75
|
+
"types": "./dist/dep-exray/types.d.ts"
|
|
76
|
+
},
|
|
77
|
+
"./dep-exray/known-mappings": {
|
|
78
|
+
"import": "./dist/dep-exray/known-mappings.js",
|
|
79
|
+
"types": "./dist/dep-exray/known-mappings.d.ts"
|
|
80
|
+
},
|
|
81
|
+
"./dep-exray/cli": {
|
|
82
|
+
"import": "./dist/dep-exray/cli.js",
|
|
83
|
+
"types": "./dist/dep-exray/cli.d.ts"
|
|
53
84
|
}
|
|
54
85
|
},
|
|
55
86
|
"files": [
|
|
@@ -65,25 +96,34 @@
|
|
|
65
96
|
"size": "size-limit",
|
|
66
97
|
"bench": "vitest bench"
|
|
67
98
|
},
|
|
99
|
+
"dependencies": {
|
|
100
|
+
"commander": "^12.0.0",
|
|
101
|
+
"picocolors": "^1.1.0"
|
|
102
|
+
},
|
|
68
103
|
"devDependencies": {
|
|
69
104
|
"@size-limit/file": "^11.0.0",
|
|
70
105
|
"@types/node": "^26.0.1",
|
|
71
106
|
"size-limit": "^11.0.0",
|
|
72
107
|
"tsup": "^8.3.0",
|
|
73
108
|
"typescript": "^5.7.0",
|
|
109
|
+
"vite": "^8.1.0",
|
|
74
110
|
"vitest": "^2.1.0"
|
|
75
111
|
},
|
|
76
112
|
"size-limit": [
|
|
77
113
|
{
|
|
78
114
|
"path": "dist/index.js",
|
|
79
|
-
"limit": "
|
|
115
|
+
"limit": "10 KB"
|
|
80
116
|
}
|
|
81
117
|
],
|
|
82
118
|
"keywords": [
|
|
83
119
|
"utilities",
|
|
84
120
|
"standard-library",
|
|
85
121
|
"typescript",
|
|
86
|
-
"zero-dependency"
|
|
122
|
+
"zero-dependency",
|
|
123
|
+
"dependency-scanner",
|
|
124
|
+
"npm-audit",
|
|
125
|
+
"bloat-detection",
|
|
126
|
+
"security"
|
|
87
127
|
],
|
|
88
128
|
"publishConfig": {
|
|
89
129
|
"access": "public"
|