@putkoff/abstract-utilities 1.0.31 → 1.0.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cjs/index.js CHANGED
@@ -2040,7 +2040,6 @@ function exponential(i, k) {
2040
2040
  return i * (10 ** (k));
2041
2041
  }
2042
2042
 
2043
- // Time
2044
2043
  const SECOND = 1;
2045
2044
  const ZEPTOSECOND = exponential(SECOND, -21);
2046
2045
  const ATTOSECOND = exponential(SECOND, -18);
@@ -2064,66 +2063,147 @@ const SECONDS_PER_DAY = DAY;
2064
2063
  const PI = Math.PI;
2065
2064
  const PI2 = 2 * PI;
2066
2065
  // Distance
2067
- const M_IN_KM = 1000;
2068
- const M_IN_MI = 1609.34;
2069
- const M_IN_FT = 0.3048;
2070
- const KM_IN_M = 1 / M_IN_KM;
2071
- const MI_IN_M = 1 / M_IN_MI;
2072
- const FT_IN_M = 1 / M_IN_FT;
2066
+ const METERS_PER_KM = 1000;
2067
+ const METERS_PER_MILE = 1609.34;
2068
+ const METERS_PER_FOOT = 0.3048;
2069
+ const KMS_PER_METER = 1 / METERS_PER_KM;
2070
+ const MILES_PER_METER = 1 / METERS_PER_MILE;
2071
+ const FEET_PER_METER = 1 / METERS_PER_FOOT;
2073
2072
  const MIN_IN_S = 1 / MINUTE;
2074
2073
  const HOUR_IN_S = 1 / HOUR;
2075
2074
  const DAY_IN_S = 1 / DAY;
2076
2075
  const YEAR_IN_S = 1 / YEAR;
2077
2076
  const MONTH_IN_S = 1 / MONTH;
2078
- const MiPerH_TO_MPerS = M_IN_MI * HOUR_IN_S;
2077
+ const MiPerH_TO_MPerS = METERS_PER_MILE * HOUR_IN_S;
2079
2078
  const MPerS_TO_MiPerH = 1 / MiPerH_TO_MPerS;
2080
2079
 
2081
- // Conversion helpers
2082
- const toMeters = (v, unit) => {
2083
- switch (unit) {
2084
- case 'km': return v * M_IN_KM;
2085
- case 'mi': return v * M_IN_MI;
2086
- case 'ft': return v * M_IN_FT;
2087
- default: return v; // meters
2088
- }
2080
+ // conversions.ts
2081
+ /*───────────────────────────────────────────────────────────────
2082
+ 🧭 CANONICAL MAPPINGS
2083
+ ───────────────────────────────────────────────────────────────*/
2084
+ const DIST_ALIASES = {
2085
+ m: "m", meter: "m", meters: "m",
2086
+ km: "km", kms: "km", kilometer: "km", kilometers: "km",
2087
+ mi: "mi", mile: "mi", miles: "mi",
2088
+ ft: "ft", f: "ft", foot: "ft", feet: "ft",
2089
2089
  };
2090
- const toSeconds = (v, unit) => {
2091
- switch (unit) {
2092
- case 'min': return v * MINUTE;
2093
- case 'h': return v * HOUR;
2094
- case 'day': return v * DAY;
2095
- default: return v;
2096
- }
2090
+ const TIME_ALIASES = {
2091
+ s: "s", sec: "s", second: "s", seconds: "s",
2092
+ min: "min", m: "min", minute: "min", minutes: "min",
2093
+ h: "h", hr: "h", hour: "h", hours: "h",
2094
+ day: "day", d: "day", days: "day",
2097
2095
  };
2098
- const fromMeters = (d, unit) => {
2099
- switch (unit) {
2100
- case 'km': return d / M_IN_KM;
2101
- case 'mi': return d / M_IN_MI;
2102
- case 'ft': return d / M_IN_FT;
2103
- default: return d; // meters
2104
- }
2096
+ const DIST_FACTORS = {
2097
+ m: 1,
2098
+ km: METERS_PER_KM,
2099
+ mi: METERS_PER_MILE,
2100
+ ft: METERS_PER_FOOT,
2105
2101
  };
2106
- const velocityToMs = (value, unit) => {
2107
- switch (unit) {
2108
- case 'km/s': return value * M_IN_KM;
2109
- case 'mph': return value * MiPerH_TO_MPerS; // 1 mph = 0.44704 m/s
2110
- case 'ft/s': return value * M_IN_FT; // 1 ft/s = 0.3048 m/s
2111
- default: return value; // m/s
2112
- }
2102
+ const TIME_FACTORS = {
2103
+ s: 1,
2104
+ min: MINUTE,
2105
+ h: HOUR,
2106
+ day: DAY,
2113
2107
  };
2114
- const velocityFromMs = (value, unit) => {
2115
- switch (unit) {
2116
- case 'km/s': return value * KM_IN_M;
2117
- case 'mph': return value * MPerS_TO_MiPerH;
2118
- case 'ft/s': return value * FT_IN_M;
2119
- default: return value;
2120
- }
2108
+ /*───────────────────────────────────────────────────────────────
2109
+ 🔍 CANONICALIZATION HELPERS
2110
+ ───────────────────────────────────────────────────────────────*/
2111
+ function canonDist(u) {
2112
+ const key = (u !== null && u !== void 0 ? u : "m").toString().toLowerCase();
2113
+ const canon = DIST_ALIASES[key];
2114
+ if (!canon)
2115
+ throw new Error(`Unknown distance unit: ${u}`);
2116
+ return canon;
2117
+ }
2118
+ function canonTime(u) {
2119
+ const key = (u !== null && u !== void 0 ? u : "s").toString().toLowerCase();
2120
+ const canon = TIME_ALIASES[key];
2121
+ if (!canon)
2122
+ throw new Error(`Unknown time unit: ${u}`);
2123
+ return canon;
2124
+ }
2125
+ /*───────────────────────────────────────────────────────────────
2126
+ ⚖️ NORMALIZATION HELPERS
2127
+ ───────────────────────────────────────────────────────────────*/
2128
+ function distanceToMeters(d, unit) {
2129
+ const u = canonDist(unit);
2130
+ return safeMultiply(d, DIST_FACTORS[u]);
2131
+ }
2132
+ function metersToDistance(v, unit) {
2133
+ const u = canonDist(unit);
2134
+ return safeDivide(v, DIST_FACTORS[u]);
2135
+ }
2136
+ function timeToSeconds(t, unit) {
2137
+ const u = canonTime(unit);
2138
+ return safeMultiply(t, TIME_FACTORS[u]);
2139
+ }
2140
+ function secondsToTime(v, unit) {
2141
+ const u = canonTime(unit);
2142
+ return safeDivide(v, TIME_FACTORS[u]);
2143
+ }
2144
+ /*───────────────────────────────────────────────────────────────
2145
+ 🚀 SPEED CONVERSIONS (normalize / unnormalize)
2146
+ ───────────────────────────────────────────────────────────────*/
2147
+ function speedToMps(v, distUnit, timeUnit) {
2148
+ const du = canonDist(distUnit);
2149
+ const tu = canonTime(timeUnit);
2150
+ return v * (DIST_FACTORS[du] / TIME_FACTORS[tu]);
2151
+ }
2152
+ function mpsToSpeed(vMps, distUnit, timeUnit) {
2153
+ const du = canonDist(distUnit);
2154
+ const tu = canonTime(timeUnit);
2155
+ return vMps * (TIME_FACTORS[tu] / DIST_FACTORS[du]);
2156
+ }
2157
+ /*───────────────────────────────────────────────────────────────
2158
+ 🎯 UNIVERSAL CONVERTERS
2159
+ ───────────────────────────────────────────────────────────────*/
2160
+ function convertDistance({ d, fromDist, toDist, vOnly = true, }) {
2161
+ const m = distanceToMeters(d, fromDist);
2162
+ const D = canonDist(toDist !== null && toDist !== void 0 ? toDist : "m");
2163
+ const out = metersToDistance(m, D);
2164
+ return vOnly ? out : { d: out, D };
2165
+ }
2166
+ function convertTime({ t, fromTime, toTime, vOnly = true, }) {
2167
+ const sec = timeToSeconds(t, fromTime);
2168
+ const T = canonTime(toTime !== null && toTime !== void 0 ? toTime : "s");
2169
+ const out = secondsToTime(sec, T);
2170
+ return vOnly ? out : { t: out, T };
2171
+ }
2172
+ function convertSpeed({ v, fromDist, fromTime, toDist, toTime, vOnly = true, }) {
2173
+ const mps = speedToMps(v, fromDist, fromTime);
2174
+ const d = canonDist(toDist !== null && toDist !== void 0 ? toDist : "m");
2175
+ const t = canonTime(toTime !== null && toTime !== void 0 ? toTime : "s");
2176
+ const out = mpsToSpeed(mps, d, t);
2177
+ return vOnly ? out : { v: out, d, t };
2178
+ }
2179
+ const DistanceConverter = {
2180
+ normalize: distanceToMeters,
2181
+ unnormalize: metersToDistance,
2182
+ };
2183
+ const TimeConverter = {
2184
+ normalize: timeToSeconds,
2185
+ unnormalize: secondsToTime,
2121
2186
  };
2122
- const fromMps = (v, dist_unit, time_unit) => {
2123
- const dist_conv = toMeters(1, dist_unit);
2124
- const time_conv = toSeconds(1, time_unit);
2125
- return v * (time_conv / dist_conv);
2187
+ const SpeedConverter = {
2188
+ normalize: (v, [du, tu]) => speedToMps(v, du, tu),
2189
+ unnormalize: (v, [du, tu]) => mpsToSpeed(v, du, tu),
2126
2190
  };
2191
+ /*───────────────────────────────────────────────────────────────
2192
+ 🧩 COMPATIBILITY WRAPPERS (legacy aliases)
2193
+ ───────────────────────────────────────────────────────────────*/
2194
+ const toMeters = distanceToMeters;
2195
+ const fromMeters = metersToDistance;
2196
+ const toSeconds = timeToSeconds;
2197
+ const fromSeconds = secondsToTime;
2198
+ const velocityToMs = (value, unit) => speedToMps(value, unit, "s");
2199
+ const velocityFromMs = (value, unit) => mpsToSpeed(value, unit, "s");
2200
+ /** Non-canonical helper for arbitrary rate conversion, e.g. ft/day → m/s */
2201
+ const fromMps = (v, dist_unit, time_unit) => mpsToSpeed(v, dist_unit, time_unit);
2202
+ /*───────────────────────────────────────────────────────────────
2203
+ 📊 UTILITIES
2204
+ ───────────────────────────────────────────────────────────────*/
2205
+ const isFiniteNum = (x) => Number.isFinite(x);
2206
+ const fmt = (n, digits = 2) => isFiniteNum(n) ? n.toFixed(digits) : "N/A";
2127
2207
 
2128
2208
  function Button(_a) {
2129
2209
  var { children, color = 'gray', variant = 'default', className = '' } = _a, rest = __rest(_a, ["children", "color", "variant", "className"]);
@@ -2294,26 +2374,29 @@ exports.DAY = DAY;
2294
2374
  exports.DAY_IN_S = DAY_IN_S;
2295
2375
  exports.DECISECOND = DECISECOND;
2296
2376
  exports.DEV_PREFIX = DEV_PREFIX;
2377
+ exports.DIST_ALIASES = DIST_ALIASES;
2378
+ exports.DIST_FACTORS = DIST_FACTORS;
2297
2379
  exports.DOMAIN_NAME = DOMAIN_NAME;
2380
+ exports.DistanceConverter = DistanceConverter;
2381
+ exports.FEET_PER_METER = FEET_PER_METER;
2298
2382
  exports.FEMTOSECOND = FEMTOSECOND;
2299
- exports.FT_IN_M = FT_IN_M;
2300
2383
  exports.HOUR = HOUR;
2301
2384
  exports.HOUR_IN_S = HOUR_IN_S;
2302
2385
  exports.Input = Input;
2303
- exports.KM_IN_M = KM_IN_M;
2386
+ exports.KMS_PER_METER = KMS_PER_METER;
2304
2387
  exports.MEDIA_TYPES = MEDIA_TYPES;
2388
+ exports.METERS_PER_FOOT = METERS_PER_FOOT;
2389
+ exports.METERS_PER_KM = METERS_PER_KM;
2390
+ exports.METERS_PER_MILE = METERS_PER_MILE;
2305
2391
  exports.MICROSECOND = MICROSECOND;
2392
+ exports.MILES_PER_METER = MILES_PER_METER;
2306
2393
  exports.MILISECOND = MILISECOND;
2307
2394
  exports.MIME_TYPES = MIME_TYPES;
2308
2395
  exports.MINUTE = MINUTE;
2309
2396
  exports.MIN_IN_S = MIN_IN_S;
2310
- exports.MI_IN_M = MI_IN_M;
2311
2397
  exports.MONTH = MONTH;
2312
2398
  exports.MONTH_IN_S = MONTH_IN_S;
2313
2399
  exports.MPerS_TO_MiPerH = MPerS_TO_MiPerH;
2314
- exports.M_IN_FT = M_IN_FT;
2315
- exports.M_IN_KM = M_IN_KM;
2316
- exports.M_IN_MI = M_IN_MI;
2317
2400
  exports.MiPerH_TO_MPerS = MiPerH_TO_MPerS;
2318
2401
  exports.NANOSECOND = NANOSECOND;
2319
2402
  exports.PI = PI;
@@ -2326,7 +2409,11 @@ exports.SECONDS_PER_DAY = SECONDS_PER_DAY;
2326
2409
  exports.SECONDS_PER_HOUR = SECONDS_PER_HOUR;
2327
2410
  exports.SECONDS_PER_MINUTE = SECONDS_PER_MINUTE;
2328
2411
  exports.SUB_DIR = SUB_DIR;
2412
+ exports.SpeedConverter = SpeedConverter;
2329
2413
  exports.Spinner = Spinner;
2414
+ exports.TIME_ALIASES = TIME_ALIASES;
2415
+ exports.TIME_FACTORS = TIME_FACTORS;
2416
+ exports.TimeConverter = TimeConverter;
2330
2417
  exports.YEAR = YEAR;
2331
2418
  exports.YEAR_IN_S = YEAR_IN_S;
2332
2419
  exports.ZEPTOSECOND = ZEPTOSECOND;
@@ -2341,6 +2428,8 @@ exports.assure_number = assure_number;
2341
2428
  exports.assure_string = assure_string;
2342
2429
  exports.callStorage = callStorage;
2343
2430
  exports.callWindowMethod = callWindowMethod;
2431
+ exports.canonDist = canonDist;
2432
+ exports.canonTime = canonTime;
2344
2433
  exports.capitalize = capitalize;
2345
2434
  exports.capitalize_str = capitalize_str;
2346
2435
  exports.checkResponse = checkResponse;
@@ -2348,10 +2437,14 @@ exports.cleanArray = cleanArray;
2348
2437
  exports.cleanText = cleanText;
2349
2438
  exports.confirmType = confirmType;
2350
2439
  exports.confirm_type = confirm_type;
2440
+ exports.convertDistance = convertDistance;
2441
+ exports.convertSpeed = convertSpeed;
2442
+ exports.convertTime = convertTime;
2351
2443
  exports.create_list_string = create_list_string;
2352
2444
  exports.currentUsername = currentUsername;
2353
2445
  exports.currentUsernames = currentUsernames;
2354
2446
  exports.decodeJwt = decodeJwt;
2447
+ exports.distanceToMeters = distanceToMeters;
2355
2448
  exports.eatAll = eatAll;
2356
2449
  exports.eatEnd = eatEnd;
2357
2450
  exports.eatInner = eatInner;
@@ -2368,9 +2461,11 @@ exports.exponential = exponential;
2368
2461
  exports.fetchIndexHtml = fetchIndexHtml;
2369
2462
  exports.fetchIndexHtmlContainer = fetchIndexHtmlContainer;
2370
2463
  exports.fetchIt = fetchIt;
2464
+ exports.fmt = fmt;
2371
2465
  exports.formatNumber = formatNumber;
2372
2466
  exports.fromMeters = fromMeters;
2373
2467
  exports.fromMps = fromMps;
2468
+ exports.fromSeconds = fromSeconds;
2374
2469
  exports.geAuthsUtilsDirectory = geAuthsUtilsDirectory;
2375
2470
  exports.geBackupsUtilsDirectory = geBackupsUtilsDirectory;
2376
2471
  exports.geConstantsUtilsDirectory = geConstantsUtilsDirectory;
@@ -2444,6 +2539,7 @@ exports.get_window = get_window;
2444
2539
  exports.get_window_location = get_window_location;
2445
2540
  exports.get_window_parts = get_window_parts;
2446
2541
  exports.get_window_pathname = get_window_pathname;
2542
+ exports.isFiniteNum = isFiniteNum;
2447
2543
  exports.isLoggedIn = isLoggedIn;
2448
2544
  exports.isMediaType = isMediaType;
2449
2545
  exports.isNum = isNum;
@@ -2454,6 +2550,8 @@ exports.is_media_type = is_media_type;
2454
2550
  exports.loadConfig = loadConfig;
2455
2551
  exports.make_path = make_path;
2456
2552
  exports.make_sanitized_path = make_sanitized_path;
2553
+ exports.metersToDistance = metersToDistance;
2554
+ exports.mpsToSpeed = mpsToSpeed;
2457
2555
  exports.normalizeUrl = normalizeUrl;
2458
2556
  exports.parseResult = parseResult;
2459
2557
  exports.path_to_url = path_to_url;
@@ -2468,7 +2566,10 @@ exports.safeMultiply = safeMultiply;
2468
2566
  exports.safeNums = safeNums;
2469
2567
  exports.safeStorage = safeStorage;
2470
2568
  exports.sanitizeFilename = sanitizeFilename;
2569
+ exports.secondsToTime = secondsToTime;
2570
+ exports.speedToMps = speedToMps;
2471
2571
  exports.stripPrefixes = stripPrefixes;
2572
+ exports.timeToSeconds = timeToSeconds;
2472
2573
  exports.toMeters = toMeters;
2473
2574
  exports.toSeconds = toSeconds;
2474
2575
  exports.truncateString = truncateString;