reliable-node-utils 1.0.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/LICENSE +201 -0
- package/README.md +464 -0
- package/dist/index.cjs +1064 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +643 -0
- package/dist/index.d.ts +643 -0
- package/dist/index.js +1013 -0
- package/dist/index.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/async/retry.ts","../src/async/withTimeout.ts","../src/async/pLimit.ts","../src/fn/memoize.ts","../src/guards/index.ts","../src/object/deepMerge.ts","../src/string/index.ts","../src/random/index.ts","../src/json/index.ts","../src/date/index.ts","../src/collections/index.ts","../src/identity/uniqueStore.ts","../src/identity/namesData.ts","../src/identity/providers.ts","../src/identity/nameGenerator.ts","../src/address/errors.ts","../src/address/service.ts","../src/address/providers/providerUtils.ts","../src/address/providers/uspsProvider.ts","../src/address/providers/zippopotamProvider.ts","../src/address/providers/canadaPostProvider.ts"],"names":["reject","defaultFaker","provider"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Custom error base for utilities. Enables `instanceof` checks and preserves cause.\n * @internal\n */\nexport class UtilsError extends Error {\n override readonly name: string = \"UtilsError\";\n\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Thrown when an operation is aborted via AbortSignal.\n * @public\n */\nexport class AbortError extends UtilsError {\n override readonly name = \"AbortError\";\n}\n\n/**\n * Thrown when an operation exceeds its time limit (e.g. withTimeout).\n * @public\n */\nexport class TimeoutError extends UtilsError {\n override readonly name = \"TimeoutError\";\n}\n\n/**\n * Thrown when retry exhausts all attempts without success.\n * @public\n */\nexport class RetryExhaustedError extends UtilsError {\n override readonly name = \"RetryExhaustedError\";\n\n constructor(\n message: string,\n public readonly attempt: number,\n public readonly lastError: unknown,\n options?: { cause?: unknown }\n ) {\n super(message, { ...options, cause: lastError });\n }\n}\n","import { AbortError, RetryExhaustedError } from \"../errors.js\";\n\n/**\n * Options for {@link retry}.\n * @public\n */\nexport interface RetryOptions {\n /** Maximum number of attempts (including the first). Default: 3. */\n maxAttempts?: number;\n /** Base delay in ms for exponential backoff. Default: 1000. */\n baseDelayMs?: number;\n /** Maximum delay in ms. Default: 30000. */\n maxDelayMs?: number;\n /** If true, add random jitter to delays. Default: true. */\n jitter?: boolean;\n /** Called before each retry with attempt index (1-based) and error. */\n onRetry?: (attempt: number, error: unknown) => void | Promise<void>;\n /** When aborted, retry stops and rejects with AbortError. */\n signal?: AbortSignal;\n}\n\nconst DEFAULT_OPTIONS: Required<Omit<RetryOptions, \"onRetry\" | \"signal\">> = {\n maxAttempts: 3,\n baseDelayMs: 1000,\n maxDelayMs: 30000,\n jitter: true,\n};\n\nfunction delay(ms: number, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.reject(new AbortError(\"Aborted\"));\n return new Promise((resolve, reject) => {\n const onAbort = () => {\n clearTimeout(id);\n signal?.removeEventListener(\"abort\", onAbort);\n reject(new AbortError(\"Aborted\"));\n };\n const id = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nfunction assertValidRetryOptions(\n fn: () => Promise<unknown>,\n options: Required<Omit<RetryOptions, \"onRetry\" | \"signal\">> &\n Pick<RetryOptions, \"onRetry\">\n): void {\n if (typeof fn !== \"function\") {\n throw new TypeError(\"retry: fn must be a function returning a Promise\");\n }\n if (!Number.isInteger(options.maxAttempts) || options.maxAttempts < 1) {\n throw new TypeError(\"retry: maxAttempts must be an integer >= 1\");\n }\n if (!Number.isFinite(options.baseDelayMs) || options.baseDelayMs < 0) {\n throw new TypeError(\"retry: baseDelayMs must be a finite number >= 0\");\n }\n if (!Number.isFinite(options.maxDelayMs) || options.maxDelayMs < 0) {\n throw new TypeError(\"retry: maxDelayMs must be a finite number >= 0\");\n }\n if (options.maxDelayMs < options.baseDelayMs) {\n throw new TypeError(\"retry: maxDelayMs must be >= baseDelayMs\");\n }\n if (typeof options.jitter !== \"boolean\") {\n throw new TypeError(\"retry: jitter must be a boolean\");\n }\n if (options.onRetry !== undefined && typeof options.onRetry !== \"function\") {\n throw new TypeError(\"retry: onRetry must be a function\");\n }\n}\n\nfunction clamp(min: number, value: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\n/**\n * Compute delay with optional jitter (full jitter: [0, computed]).\n * @internal\n */\nfunction computeDelay(\n attempt: number,\n baseDelayMs: number,\n maxDelayMs: number,\n jitter: boolean\n): number {\n const exponential = baseDelayMs * Math.pow(2, attempt - 1);\n const capped = clamp(baseDelayMs, exponential, maxDelayMs);\n if (!jitter) return capped;\n return Math.random() * capped;\n}\n\n/**\n * Retry an async function with exponential backoff and optional jitter.\n * Supports AbortSignal; calls onRetry before each retry.\n *\n * @param fn - Async function to run (no arguments). Return value is passed through.\n * @param options - maxAttempts, baseDelayMs, maxDelayMs, jitter, onRetry, signal\n * @returns Promise resolving to the return value of `fn`\n * @throws {TypeError} When options are invalid\n * @throws {AbortError} When `signal` is aborted\n * @throws {RetryExhaustedError} When all attempts fail (last error as cause)\n *\n * @example\n * ```ts\n * import { retry } from 'reliable-node-utils';\n *\n * const data = await retry(() => fetchJSON('/api/data'), {\n * maxAttempts: 5,\n * baseDelayMs: 500,\n * onRetry: (attempt, err) => console.warn(`Attempt ${attempt} failed`, err),\n * signal: controller.signal,\n * });\n * ```\n *\n * @example\n * ```js\n * const { retry } = require('reliable-node-utils');\n * const result = await retry(async () => callExternalApi(), { maxAttempts: 3 });\n * ```\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n options: RetryOptions = {}\n): Promise<T> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n assertValidRetryOptions(fn, opts);\n const { maxAttempts, baseDelayMs, maxDelayMs, jitter, onRetry, signal } = opts;\n let lastError: unknown;\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n if (signal?.aborted) {\n throw new AbortError(\"Aborted\");\n }\n try {\n return await fn();\n } catch (err) {\n lastError = err;\n if (attempt === maxAttempts) {\n throw new RetryExhaustedError(\n `Retry exhausted after ${maxAttempts} attempt(s)`,\n attempt,\n lastError\n );\n }\n if (onRetry) {\n await Promise.resolve(onRetry(attempt, err));\n }\n if (signal?.aborted) {\n throw new AbortError(\"Aborted\");\n }\n const waitMs = computeDelay(attempt, baseDelayMs, maxDelayMs, jitter);\n await delay(waitMs, signal);\n }\n }\n throw new RetryExhaustedError(\n `Retry exhausted after ${maxAttempts} attempt(s)`,\n maxAttempts,\n lastError!\n );\n}\n","import { AbortError, TimeoutError } from \"../errors.js\";\n\n/**\n * Options for {@link withTimeout}.\n * @public\n */\nexport interface WithTimeoutOptions {\n /** AbortSignal to respect; when aborted, the timeout is cancelled and AbortError is thrown. */\n signal?: AbortSignal;\n}\n\n/**\n * Run a promise or async function with a time limit.\n * If the time limit is exceeded, the returned promise rejects with TimeoutError.\n * Supports AbortSignal: aborting clears the timer and rejects with AbortError.\n *\n * @param promiseOrFn - A Promise or a function returning a Promise\n * @param ms - Time limit in milliseconds\n * @param options - Optional { signal }\n * @returns Promise resolving to the same value as the input promise\n * @throws {TypeError} When `ms` is negative or non-finite\n * @throws {TimeoutError} When the operation exceeds `ms`\n * @throws {AbortError} When `signal` is aborted\n *\n * @example\n * ```ts\n * import { withTimeout } from 'reliable-node-utils';\n *\n * const data = await withTimeout(fetch('/api/data').then(r => r.json()), 5000);\n * // or\n * const data = await withTimeout(() => fetch('/api/data').then(r => r.json()), 5000, {\n * signal: controller.signal,\n * });\n * ```\n *\n * @example\n * ```js\n * const { withTimeout } = require('reliable-node-utils');\n * const result = await withTimeout(longRunningTask(), 3000);\n * ```\n */\nexport async function withTimeout<T>(\n promiseOrFn: Promise<T> | (() => Promise<T>),\n ms: number,\n options: WithTimeoutOptions = {}\n): Promise<T> {\n const { signal } = options;\n\n if (!Number.isFinite(ms) || ms < 0) {\n throw new TypeError(\"withTimeout: ms must be a finite number >= 0\");\n }\n\n if (signal?.aborted) {\n throw new AbortError(\"Aborted\");\n }\n const promise = typeof promiseOrFn === \"function\" ? promiseOrFn() : promiseOrFn;\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n reject(new TimeoutError(`Operation timed out after ${ms}ms`));\n }, ms);\n });\n\n const abortHandler = () => {\n if (timeoutId !== undefined) clearTimeout(timeoutId);\n reject(new AbortError(\"Aborted\"));\n };\n let reject: (reason: unknown) => void;\n const abortPromise = new Promise<never>((_, rej) => {\n reject = rej;\n });\n signal?.addEventListener(\"abort\", abortHandler, { once: true });\n\n try {\n const result = await Promise.race([promise, timeoutPromise, abortPromise]);\n if (timeoutId !== undefined) clearTimeout(timeoutId);\n signal?.removeEventListener(\"abort\", abortHandler);\n return result;\n } catch (err) {\n if (timeoutId !== undefined) clearTimeout(timeoutId);\n signal?.removeEventListener(\"abort\", abortHandler);\n throw err;\n }\n}\n","/**\n * Concurrency limiter: run at most `concurrency` promises at a time.\n * Queues additional calls and runs them when a slot frees up.\n *\n * @param concurrency - Maximum number of concurrent executions (>= 1)\n * @returns A function that accepts an async function and its arguments, returning a Promise\n *\n * @example\n * ```ts\n * import { pLimit } from 'reliable-node-utils';\n *\n * const limit = pLimit(2);\n * const out = await Promise.all([\n * limit(() => fetch('/a')),\n * limit(() => fetch('/b')),\n * limit(() => fetch('/c')), // waits until one of the first two finishes\n * ]);\n * ```\n *\n * @example\n * ```js\n * const { pLimit } = require('reliable-node-utils');\n * const limit = pLimit(5);\n * const results = await Promise.all(urls.map(url => limit(() => fetch(url))));\n * ```\n */\nexport function pLimit(\n concurrency: number\n): <T, A extends unknown[]>(fn: (...args: A) => Promise<T>, ...args: A) => Promise<T> {\n if (\n typeof concurrency !== \"number\" ||\n concurrency < 1 ||\n !Number.isFinite(concurrency)\n ) {\n throw new TypeError(\"pLimit: concurrency must be a finite number >= 1\");\n }\n let active = 0;\n const queue: Array<() => void> = [];\n\n const run = async <T, A extends unknown[]>(\n fn: (...args: A) => Promise<T>,\n ...args: A\n ): Promise<T> => {\n const wait = (): Promise<void> =>\n new Promise((resolve) => {\n queue.push(resolve);\n });\n const next = (): void => {\n active--;\n const resolve = queue.shift();\n if (resolve) resolve();\n };\n if (active >= concurrency) {\n await wait();\n }\n active++;\n try {\n return await fn(...args);\n } finally {\n next();\n }\n };\n return run;\n}\n","/**\n * Options for {@link memoize}.\n * @public\n */\nexport interface MemoizeOptions<F extends (...args: unknown[]) => unknown> {\n /** TTL in milliseconds; entries expire after this long. Omit for no expiry. */\n ttlMs?: number;\n /** Maximum number of entries to keep (LRU eviction). Omit for unbounded. */\n maxSize?: number;\n /** Custom key function. Default: `(...args) => JSON.stringify(args)`. */\n keyFn?: (...args: Parameters<F>) => string;\n}\n\ninterface CacheEntry<T> {\n value: T;\n expiresAt: number | undefined;\n}\n\ninterface CacheLookupResult<T> {\n hit: boolean;\n value?: T;\n}\n\n/**\n * Memoize a function with optional TTL and size limit.\n * Cache key is computed via keyFn (default: JSON.stringify of arguments).\n * When maxSize is set, least-recently-used entries are evicted.\n *\n * @param fn - Function to memoize (any arity)\n * @param options - ttlMs, maxSize, keyFn\n * @returns Memoized function with the same signature\n *\n * @example\n * ```ts\n * import { memoize } from 'reliable-node-utils';\n *\n * const getData = memoize(async (id: string) => fetch(`/api/${id}`).then(r => r.json()), {\n * ttlMs: 60_000,\n * maxSize: 100,\n * keyFn: (id) => id,\n * });\n * ```\n *\n * @example\n * ```js\n * const { memoize } = require('reliable-node-utils');\n * const heavy = memoize(function (x, y) { return x + y; }, { maxSize: 50 });\n * ```\n */\nexport function memoize<F extends (...args: unknown[]) => unknown>(\n fn: F,\n options: MemoizeOptions<F> = {}\n): F {\n const {\n ttlMs,\n maxSize,\n keyFn = (...args: Parameters<F>) => JSON.stringify(args),\n } = options;\n const cache = new Map<string, CacheEntry<ReturnType<F>>>();\n const accessOrder: string[] = [];\n\n function trimToMaxSize(): void {\n if (maxSize === undefined || accessOrder.length <= maxSize) return;\n while (accessOrder.length > maxSize) {\n const key = accessOrder.shift();\n if (key !== undefined) cache.delete(key);\n }\n }\n\n function getFresh(key: string): CacheLookupResult<ReturnType<F>> {\n const entry = cache.get(key);\n if (!entry) return { hit: false };\n if (entry.expiresAt !== undefined && Date.now() > entry.expiresAt) {\n cache.delete(key);\n const i = accessOrder.indexOf(key);\n if (i !== -1) accessOrder.splice(i, 1);\n return { hit: false };\n }\n if (maxSize !== undefined) {\n const i = accessOrder.indexOf(key);\n if (i !== -1) accessOrder.splice(i, 1);\n accessOrder.push(key);\n }\n return { hit: true, value: entry.value };\n }\n\n const wrapped = function (this: unknown, ...args: Parameters<F>): ReturnType<F> {\n const key = keyFn(...args);\n const cached = getFresh(key);\n if (cached.hit) return cached.value as ReturnType<F>;\n const value = fn.apply(this, args) as ReturnType<F>;\n const expiresAt = ttlMs !== undefined ? Date.now() + ttlMs : undefined;\n if (maxSize !== undefined) {\n const existingIndex = accessOrder.indexOf(key);\n if (existingIndex !== -1) accessOrder.splice(existingIndex, 1);\n }\n cache.set(key, { value, expiresAt });\n if (maxSize !== undefined) {\n accessOrder.push(key);\n trimToMaxSize();\n }\n return value;\n } as F;\n return wrapped;\n}\n","/**\n * Runtime type guards. Use with TypeScript for correct narrowing.\n * @module guards\n */\n\n/**\n * Type predicate: narrows out `null` and `undefined`.\n *\n * @param value - Any value\n * @returns `true` if value is not `null` and not `undefined`\n *\n * @example\n * ```ts\n * const arr: (string | undefined)[] = ['a', undefined, 'b'];\n * const defined: string[] = arr.filter(isDefined);\n * ```\n *\n * @example\n * ```js\n * const { isDefined } = require('reliable-node-utils');\n * if (isDefined(maybe)) console.log(maybe.toUpperCase());\n * ```\n */\nexport function isDefined<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined;\n}\n\n/**\n * Type predicate: narrows to a non-empty string (length > 0).\n * Rejects `null`, `undefined`, non-strings, and `\"\"`.\n *\n * @param value - Any value\n * @returns `true` if value is a string with at least one character\n *\n * @example\n * ```ts\n * function greet(name: unknown) {\n * if (isNonEmptyString(name)) return `Hello, ${name}`;\n * return 'Hello, stranger';\n * }\n * ```\n *\n * @example\n * ```js\n * const { isNonEmptyString } = require('reliable-node-utils');\n * if (isNonEmptyString(input)) validate(input);\n * ```\n */\nexport function isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\n/**\n * Type predicate: narrows to a plain object (object created by `{}` or `Object.create(null)`).\n * Rejects `null`, arrays, and class instances (e.g. Date, RegExp).\n *\n * @param value - Any value\n * @returns `true` if value is a plain object (record-like)\n *\n * @example\n * ```ts\n * function mergeConfig(config: unknown) {\n * if (!isPlainObject(config)) throw new Error('Config must be an object');\n * return deepMerge(defaults, config);\n * }\n * ```\n *\n * @example\n * ```js\n * const { isPlainObject } = require('reliable-node-utils');\n * if (isPlainObject(obj)) Object.keys(obj).forEach(k => process(k, obj[k]));\n * ```\n */\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\") return false;\n const proto = Object.getPrototypeOf(value);\n return proto === null || proto === Object.prototype;\n}\n","import { isPlainObject } from \"../guards/index.js\";\n\nconst BLOCKED_KEYS = new Set([\"__proto__\", \"prototype\", \"constructor\"]);\n\n/**\n * Deep merge two values. Source `b` overrides `a`.\n * - Plain objects are merged recursively; arrays and other values are replaced by `b`.\n * - Primitives, dates, class instances: always use `b` when present (not merged).\n * - `__proto__`, `prototype`, and `constructor` keys are ignored for safety.\n *\n * @param a - Base object\n * @param b - Overrides (takes precedence)\n * @returns New object; inputs are not mutated\n *\n * @example\n * ```ts\n * import { deepMerge } from 'reliable-node-utils';\n *\n * const merged = deepMerge({ a: 1, nested: { x: 1 } }, { nested: { y: 2 } });\n * // { a: 1, nested: { x: 1, y: 2 } }\n * ```\n *\n * @example\n * ```js\n * const { deepMerge } = require('reliable-node-utils');\n * const config = deepMerge(defaults, userConfig);\n * ```\n */\nexport function deepMerge<T extends object, U extends object>(a: T, b: U): T & U {\n const result = { ...a } as T & U;\n for (const key of Object.keys(b) as (keyof U)[]) {\n const keyStr = String(key);\n if (BLOCKED_KEYS.has(keyStr)) continue;\n const bVal = b[key];\n if (bVal === undefined) continue;\n const aVal = (result as U)[key];\n if (\n isPlainObject(aVal) &&\n isPlainObject(bVal) &&\n !Array.isArray(aVal) &&\n !Array.isArray(bVal)\n ) {\n (result as Record<string, unknown>)[keyStr] = deepMerge(\n aVal as Record<string, unknown>,\n bVal as Record<string, unknown>\n );\n } else {\n (result as Record<string, unknown>)[keyStr] = bVal;\n }\n }\n return result;\n}\n","/**\n * Replace `{key}` placeholders in a template string with quoted values.\n *\n * @param template - Input template containing placeholders like `{name}`\n * @param replacements - Key/value mapping for placeholders\n * @returns Formatted string with replacements wrapped in double quotes\n *\n * @example\n * ```ts\n * const out = replaceTemplateValues(\"Hello {name}\", { name: \"Sam\" });\n * // Hello \"Sam\"\n * ```\n */\nexport function replaceTemplateValues(\n template: string,\n replacements: Record<string, unknown>\n): string {\n let result = template;\n for (const [key, value] of Object.entries(replacements)) {\n result = result.split(`{${key}}`).join(`\"${String(value)}\"`);\n }\n return result;\n}\n\n/**\n * Split a string using a delimiter.\n */\nexport function splitString(input: string, delimiter: string): string[] {\n return input.split(delimiter);\n}\n\n/**\n * Parse a strict boolean string (`true`/`false`, case-insensitive).\n *\n * @throws {Error} If input is empty or not a valid boolean string\n */\nexport function parseBooleanString(input: string | undefined | null): boolean {\n if (input === undefined || input === null || input.trim() === \"\") {\n throw new Error(\"No input provided.\");\n }\n const normalized = input.trim().toLowerCase();\n if (normalized === \"true\") return true;\n if (normalized === \"false\") return false;\n throw new Error(`Cannot convert string \"${input}\" to boolean.`);\n}\n\n/**\n * True when value is null/undefined/empty-after-trim.\n */\nexport function isNullOrEmptyString(value: string | null | undefined): boolean {\n return value === null || value === undefined || value.trim() === \"\";\n}\n\n/**\n * Convert snake_case (or mixed case) string into PascalCase.\n *\n * @example\n * ```ts\n * snakeToPascalCase(\"user_name\"); // UserName\n * ```\n */\nexport function snakeToPascalCase(input: string): string {\n return input\n .toLowerCase()\n .replace(/_([a-z])/g, (_match, char: string) => char.toUpperCase())\n .replace(/^\\w/, (char) => char.toUpperCase());\n}\n\n/**\n * Backward-compatible alias; output is PascalCase.\n */\nexport const convertToCamelCase = snakeToPascalCase;\n\n/**\n * Backward-compatible alias for legacy naming.\n */\nexport const formatStringValue = replaceTemplateValues;\n","const ALPHANUMERIC = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\nconst ALPHABETIC = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\n\nfunction assertPositiveLength(length: number, fnName: string): void {\n if (!Number.isInteger(length) || length <= 0) {\n throw new Error(`${fnName}: length must be a positive integer.`);\n }\n}\n\nfunction randomIndex(length: number, rng: () => number): number {\n return Math.floor(rng() * length);\n}\n\n/**\n * Generate random alphanumeric string.\n */\nexport function generateRandomAlphanumericString(\n length: number,\n options: { uppercase?: boolean; rng?: () => number } = {}\n): string {\n assertPositiveLength(length, \"generateRandomAlphanumericString\");\n const rng = options.rng ?? Math.random;\n let out = \"\";\n for (let i = 0; i < length; i++) {\n out += ALPHANUMERIC.charAt(randomIndex(ALPHANUMERIC.length, rng));\n }\n return (options.uppercase ?? true) ? out.toUpperCase() : out;\n}\n\n/**\n * Generate random N-digit integer (base-10).\n *\n * @throws {Error} If length is invalid\n */\nexport function generateRandomNDigitNumber(\n length: number,\n options: { rng?: () => number } = {}\n): number {\n assertPositiveLength(length, \"generateRandomNDigitNumber\");\n if (length > 15) {\n throw new Error(\n \"generateRandomNDigitNumber: length must be <= 15 for safe integers.\"\n );\n }\n const rng = options.rng ?? Math.random;\n const min = Math.pow(10, length - 1);\n const max = Math.pow(10, length) - 1;\n return Math.floor(rng() * (max - min + 1)) + min;\n}\n\n/**\n * Generate random alphabetic string (letters only).\n */\nexport function generateRandomAlphabeticString(\n length: number,\n options: { rng?: () => number } = {}\n): string {\n assertPositiveLength(length, \"generateRandomAlphabeticString\");\n const rng = options.rng ?? Math.random;\n let out = \"\";\n for (let i = 0; i < length; i++) {\n out += ALPHABETIC.charAt(randomIndex(ALPHABETIC.length, rng));\n }\n return out;\n}\n\n/**\n * Backward-compatible alias for legacy naming.\n */\nexport const getAlphaNumericString = generateRandomAlphanumericString;\n\n/**\n * Backward-compatible alias for legacy naming.\n */\nexport const generateRandomNumber = generateRandomNDigitNumber;\n\n/**\n * Backward-compatible alias for legacy naming.\n */\nexport const generateRandomString = generateRandomAlphabeticString;\n","import { isPlainObject } from \"../guards/index.js\";\n\nfunction updateAllKeysValues(\n target: Record<string, unknown>,\n updates: Record<string, string>\n): void {\n for (const [key, value] of Object.entries(target)) {\n if (updates[key] !== undefined) {\n target[key] = updates[key];\n continue;\n }\n\n if (isPlainObject(value)) {\n updateAllKeysValues(value, updates);\n continue;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n if (isPlainObject(item)) {\n updateAllKeysValues(item, updates);\n }\n }\n }\n }\n}\n\n/**\n * Parse JSON text and recursively update matching keys.\n *\n * @param jsonText - JSON string input\n * @param updates - key/value map applied across nested objects and object arrays\n * @returns Pretty-printed updated JSON text\n */\nexport function updateJsonValues(\n jsonText: string,\n updates: Record<string, string>\n): string {\n const parsed = JSON.parse(jsonText) as unknown;\n if (!isPlainObject(parsed) && !Array.isArray(parsed)) {\n throw new Error(\"updateJsonValues: root must be a JSON object or array.\");\n }\n\n if (isPlainObject(parsed)) {\n updateAllKeysValues(parsed, updates);\n } else {\n for (const item of parsed) {\n if (isPlainObject(item)) {\n updateAllKeysValues(item, updates);\n }\n }\n }\n\n return JSON.stringify(parsed, null, 2);\n}\n\n/**\n * Backward-compatible alias for legacy naming.\n */\nexport const updateJsonData = updateJsonValues;\n","import { isNullOrEmptyString } from \"../string/index.js\";\n\nexport type RelativeDateToken = \"Today\" | \"Yesterday\" | \"Year\";\n\nfunction pad2(value: number): string {\n return String(value).padStart(2, \"0\");\n}\n\nfunction formatDate(date: Date, pattern: string): string {\n return pattern\n .replaceAll(\"yyyy\", String(date.getFullYear()))\n .replaceAll(\"MM\", pad2(date.getMonth() + 1))\n .replaceAll(\"dd\", pad2(date.getDate()))\n .replaceAll(\"HH\", pad2(date.getHours()))\n .replaceAll(\"mm\", pad2(date.getMinutes()))\n .replaceAll(\"ss\", pad2(date.getSeconds()));\n}\n\n/**\n * Get a formatted date for Today/Yesterday/Year(-1 year).\n *\n * @param token - Relative token\n * @param format - Pattern (default `yyyy-MM-dd`)\n * @param now - Optional injection point for tests\n */\nexport function getRelativeDate(\n token: RelativeDateToken | string,\n format = \"yyyy-MM-dd\",\n now: Date = new Date()\n): string {\n const outputFormat = isNullOrEmptyString(format) ? \"yyyy-MM-dd\" : format;\n const date = new Date(now.getTime());\n\n switch (token) {\n case \"Year\":\n date.setFullYear(date.getFullYear() - 1);\n break;\n case \"Yesterday\":\n date.setDate(date.getDate() - 1);\n break;\n case \"Today\":\n default:\n break;\n }\n return formatDate(date, outputFormat);\n}\n\n/**\n * Backward-compatible alias for legacy naming.\n */\nexport const getDate = getRelativeDate;\n","/**\n * Rename a key in a string map and strip wrapping quotes from its value.\n *\n * @returns true if key existed and was renamed, else false.\n */\nexport function renameMapKey(\n data: Map<string, string>,\n oldKey: string,\n newKey: string\n): boolean {\n if (!data.has(oldKey)) return false;\n let value = data.get(oldKey) ?? \"\";\n value = value.replace(/^\"(.*)\"$/, \"$1\");\n data.delete(oldKey);\n data.set(newKey, value);\n return true;\n}\n\n/**\n * Backward-compatible alias for legacy naming.\n */\nexport const updateKey = renameMapKey;\n","export interface UniqueValueStore {\n has(value: string): boolean | Promise<boolean>;\n add(value: string): void | Promise<void>;\n}\n\nexport class InMemoryUniqueValueStore implements UniqueValueStore {\n private readonly values = new Set<string>();\n\n has(value: string): boolean {\n return this.values.has(value);\n }\n\n add(value: string): void {\n this.values.add(value);\n }\n}\n\nconst scopedStores = new Map<string, InMemoryUniqueValueStore>();\n\nexport function getScopedInMemoryStore(scope: string): InMemoryUniqueValueStore {\n const existing = scopedStores.get(scope);\n if (existing) return existing;\n const created = new InMemoryUniqueValueStore();\n scopedStores.set(scope, created);\n return created;\n}\n\nexport function clearScopedInMemoryStores(): void {\n scopedStores.clear();\n}\n","export const COMMON_FIRST_NAMES = [\n \"James\",\n \"Mary\",\n \"John\",\n \"Patricia\",\n \"Robert\",\n \"Jennifer\",\n \"Michael\",\n \"Linda\",\n \"William\",\n \"Elizabeth\",\n \"David\",\n \"Barbara\",\n \"Richard\",\n \"Susan\",\n \"Joseph\",\n \"Jessica\",\n \"Thomas\",\n \"Sarah\",\n \"Charles\",\n \"Karen\",\n \"Christopher\",\n \"Nancy\",\n \"Daniel\",\n \"Lisa\",\n \"Matthew\",\n \"Betty\",\n \"Anthony\",\n \"Margaret\",\n \"Mark\",\n \"Sandra\",\n \"Donald\",\n \"Ashley\",\n \"Steven\",\n \"Kimberly\",\n \"Andrew\",\n \"Emily\",\n \"Paul\",\n \"Donna\",\n \"Joshua\",\n \"Michelle\",\n \"Kenneth\",\n \"Dorothy\",\n \"Kevin\",\n \"Carol\",\n \"Brian\",\n \"Amanda\",\n \"George\",\n \"Melissa\",\n \"Timothy\",\n \"Deborah\",\n] as const;\n\nexport const COMMON_LAST_NAMES = [\n \"Smith\",\n \"Johnson\",\n \"Williams\",\n \"Brown\",\n \"Jones\",\n \"Garcia\",\n \"Miller\",\n \"Davis\",\n \"Rodriguez\",\n \"Martinez\",\n \"Hernandez\",\n \"Lopez\",\n \"Gonzalez\",\n \"Wilson\",\n \"Anderson\",\n \"Thomas\",\n \"Taylor\",\n \"Moore\",\n \"Jackson\",\n \"Martin\",\n \"Lee\",\n \"Perez\",\n \"Thompson\",\n \"White\",\n \"Harris\",\n \"Sanchez\",\n \"Clark\",\n \"Ramirez\",\n \"Lewis\",\n \"Robinson\",\n \"Walker\",\n \"Young\",\n \"Allen\",\n \"King\",\n \"Wright\",\n \"Scott\",\n \"Torres\",\n \"Nguyen\",\n \"Hill\",\n \"Flores\",\n \"Green\",\n \"Adams\",\n \"Nelson\",\n \"Baker\",\n \"Hall\",\n \"Rivera\",\n \"Campbell\",\n \"Mitchell\",\n \"Carter\",\n \"Roberts\",\n] as const;\n","import { faker as defaultFaker } from \"@faker-js/faker\";\nimport { COMMON_FIRST_NAMES, COMMON_LAST_NAMES } from \"./namesData.js\";\n\nexport interface NameProvider {\n firstName(options?: { rng?: () => number }): string;\n lastName(options?: { rng?: () => number }): string;\n}\n\ninterface FakerLike {\n person: {\n firstName: () => string;\n lastName: () => string;\n };\n}\n\nfunction pick<T>(items: readonly T[], rng: () => number): T {\n const idx = Math.floor(rng() * items.length);\n return items[Math.max(0, Math.min(items.length - 1, idx))] as T;\n}\n\n/**\n * Name provider backed by the in-repo curated dataset.\n */\nexport class StaticDatasetNameProvider implements NameProvider {\n firstName(options: { rng?: () => number } = {}): string {\n const rng = options.rng ?? Math.random;\n return pick(COMMON_FIRST_NAMES, rng);\n }\n\n lastName(options: { rng?: () => number } = {}): string {\n const rng = options.rng ?? Math.random;\n return pick(COMMON_LAST_NAMES, rng);\n }\n}\n\n/**\n * Name provider backed by `@faker-js/faker`.\n *\n * Useful for large-scale synthetic name generation without maintaining\n * in-repo name lists.\n */\nexport class FakerNameProvider implements NameProvider {\n private readonly faker: FakerLike;\n\n constructor(options: { faker?: FakerLike } = {}) {\n this.faker = options.faker ?? defaultFaker;\n }\n\n firstName(): string {\n return this.faker.person.firstName();\n }\n\n lastName(): string {\n return this.faker.person.lastName();\n }\n}\n\nexport const DEFAULT_NAME_PROVIDER = new StaticDatasetNameProvider();\n","import { getScopedInMemoryStore, type UniqueValueStore } from \"./uniqueStore.js\";\nimport { DEFAULT_NAME_PROVIDER, type NameProvider } from \"./providers.js\";\n\nexport interface NameGenerationOptions {\n /** Inject deterministic random source for tests. Default: Math.random. */\n rng?: () => number;\n /** Override name source (dataset/faker/custom). */\n provider?: NameProvider;\n}\n\nexport interface UniqueNameOptions extends NameGenerationOptions {\n /** Scope for in-memory uniqueness when no custom store is provided. */\n scope?: string;\n /** Custom persistence layer for cross-process uniqueness. */\n store?: UniqueValueStore;\n /** Maximum attempts to find an unused value. Default: 1000. */\n maxAttempts?: number;\n /** Normalize value before checking uniqueness. Default: lowercase trim. */\n normalize?: (value: string) => string;\n}\n\nfunction defaultNormalize(value: string): string {\n return value.trim().toLowerCase();\n}\n\nasync function generateUnique(\n producer: () => string,\n options: UniqueNameOptions\n): Promise<string> {\n const maxAttempts = options.maxAttempts ?? 1000;\n if (!Number.isInteger(maxAttempts) || maxAttempts < 1) {\n throw new TypeError(\"unique name generation: maxAttempts must be an integer >= 1\");\n }\n const normalize = options.normalize ?? defaultNormalize;\n const store = options.store ?? getScopedInMemoryStore(options.scope ?? \"default\");\n\n for (let i = 0; i < maxAttempts; i++) {\n const candidate = producer();\n const key = normalize(candidate);\n if (!(await store.has(key))) {\n await store.add(key);\n return candidate;\n }\n }\n\n throw new Error(\n `Unable to generate a unique value after ${maxAttempts} attempts. ` +\n \"Use a larger name pool, custom normalize, or custom store.\"\n );\n}\n\n/**\n * Generate a realistic first name from a curated common-name list.\n *\n * @example\n * ```ts\n * const first = generateFirstName();\n * ```\n */\nexport function generateFirstName(options: NameGenerationOptions = {}): string {\n const provider = options.provider ?? DEFAULT_NAME_PROVIDER;\n return provider.firstName({ rng: options.rng });\n}\n\n/**\n * Generate a realistic last name from a curated common-name list.\n *\n * @example\n * ```ts\n * const last = generateLastName();\n * ```\n */\nexport function generateLastName(options: NameGenerationOptions = {}): string {\n const provider = options.provider ?? DEFAULT_NAME_PROVIDER;\n return provider.lastName({ rng: options.rng });\n}\n\n/**\n * Generate a realistic full name.\n *\n * @example\n * ```ts\n * const fullName = generateFullName();\n * ```\n */\nexport function generateFullName(options: NameGenerationOptions = {}): string {\n return `${generateFirstName(options)} ${generateLastName(options)}`;\n}\n\n/**\n * Generate a unique first name within a scope/store.\n */\nexport function generateUniqueFirstName(\n options: UniqueNameOptions = {}\n): Promise<string> {\n return generateUnique(() => generateFirstName(options), options);\n}\n\n/**\n * Generate a unique last name within a scope/store.\n */\nexport function generateUniqueLastName(options: UniqueNameOptions = {}): Promise<string> {\n return generateUnique(() => generateLastName(options), options);\n}\n\n/**\n * Generate a unique full name within a scope/store.\n */\nexport function generateUniqueFullName(options: UniqueNameOptions = {}): Promise<string> {\n return generateUnique(() => generateFullName(options), options);\n}\n","import { UtilsError } from \"../errors.js\";\n\nexport class AddressProviderError extends UtilsError {\n override readonly name = \"AddressProviderError\";\n}\n\nexport class AddressVerificationError extends UtilsError {\n override readonly name = \"AddressVerificationError\";\n}\n\nexport class ProviderNotFoundError extends UtilsError {\n override readonly name = \"ProviderNotFoundError\";\n}\n","import { ProviderNotFoundError } from \"./errors.js\";\nimport type {\n AddressInput,\n AddressProvider,\n SupportedCountryCode,\n ValidatedPostalCodeAddress,\n VerifiedAddress,\n} from \"./types.js\";\n\nexport interface GetValidAddressByPostalCodeOptions {\n country: SupportedCountryCode;\n postalCode: string;\n providers: AddressProvider[];\n signal?: AbortSignal;\n /**\n * When true, US lookups must use the USPS provider.\n * Default: true\n */\n requireUspsForUS?: boolean;\n}\n\nexport interface VerifyAddressOptions {\n address: AddressInput;\n providers: AddressProvider[];\n /**\n * When true, US verification must use the USPS provider.\n * Default: true\n */\n requireUspsForUS?: boolean;\n}\n\nfunction pickProvider(\n providers: AddressProvider[],\n country: SupportedCountryCode,\n requireUspsForUS: boolean\n): AddressProvider {\n if (country === \"US\" && requireUspsForUS) {\n const usps = providers.find(\n (provider) => provider.supportsCountry(\"US\") && provider.name === \"USPS\"\n );\n if (!usps) {\n throw new ProviderNotFoundError(\n \"US lookup requires USPS provider, but none was configured\"\n );\n }\n return usps;\n }\n\n const provider = providers.find((p) => p.supportsCountry(country));\n if (!provider) {\n throw new ProviderNotFoundError(\n `No address provider configured for country ${country}`\n );\n }\n return provider;\n}\n\n/**\n * Resolve a valid city/state-province for a postal code.\n * For US, this can be configured to strictly require USPS.\n */\nexport async function getValidAddressByPostalCode(\n options: GetValidAddressByPostalCodeOptions\n): Promise<ValidatedPostalCodeAddress> {\n const provider = pickProvider(\n options.providers,\n options.country,\n options.requireUspsForUS ?? true\n );\n return await provider.lookupPostalCode({\n country: options.country,\n postalCode: options.postalCode,\n signal: options.signal,\n });\n}\n\n/**\n * Verify and normalize an address with the best provider for its country.\n * For US, this can be configured to strictly require USPS.\n */\nexport async function verifyAddress(\n options: VerifyAddressOptions\n): Promise<VerifiedAddress> {\n const provider = pickProvider(\n options.providers,\n options.address.country,\n options.requireUspsForUS ?? true\n );\n return await provider.verifyAddress(options.address);\n}\n","import { AddressProviderError } from \"../errors.js\";\nimport type { SupportedCountryCode } from \"../types.js\";\n\nexport function assertProviderSupportsCountry(args: {\n providerName: string;\n country: SupportedCountryCode;\n supportsCountry: (country: SupportedCountryCode) => boolean;\n}): void {\n if (!args.supportsCountry(args.country)) {\n throw new AddressProviderError(\n `${args.providerName} provider does not support country ${args.country}`\n );\n }\n}\n\nexport function normalizeComparable(value: string): string {\n return value.trim().toUpperCase().replace(/\\s+/g, \" \");\n}\n\nexport function normalizePostalComparable(value: string): string {\n return value.replace(/\\s+/g, \"\").toUpperCase();\n}\n\nexport async function fetchJsonOrThrow<T>(\n url: string,\n options: { signal?: AbortSignal; errorPrefix: string }\n): Promise<T> {\n const res = await fetch(url, { method: \"GET\", signal: options.signal });\n if (!res.ok) {\n throw new AddressProviderError(\n `${options.errorPrefix} failed with status ${res.status}`\n );\n }\n return (await res.json()) as T;\n}\n\nexport async function fetchTextOrThrow(\n url: string,\n options: { signal?: AbortSignal; errorPrefix: string }\n): Promise<string> {\n const res = await fetch(url, { method: \"GET\", signal: options.signal });\n if (!res.ok) {\n throw new AddressProviderError(\n `${options.errorPrefix} failed with status ${res.status}`\n );\n }\n return await res.text();\n}\n","import { isNonEmptyString } from \"../../guards/index.js\";\nimport { AddressProviderError, AddressVerificationError } from \"../errors.js\";\nimport type {\n AddressInput,\n AddressProvider,\n PostalCodeLookupRequest,\n SupportedCountryCode,\n ValidatedPostalCodeAddress,\n VerifiedAddress,\n} from \"../types.js\";\nimport { assertProviderSupportsCountry, fetchTextOrThrow } from \"./providerUtils.js\";\n\nexport interface UspsAddressProviderOptions {\n userId: string;\n endpoint?: string;\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\")\n .replaceAll(\"'\", \"'\");\n}\n\nfunction getTagValue(xml: string, tag: string): string | undefined {\n const match = new RegExp(`<${tag}>([^<]*)</${tag}>`, \"i\").exec(xml);\n return match?.[1]?.trim();\n}\n\nfunction normalizeUsZip(value: string): string {\n const digits = value.replace(/\\D/g, \"\").slice(0, 5);\n if (digits.length !== 5) {\n throw new TypeError(\"USPS provider: postalCode must contain at least 5 digits\");\n }\n return digits;\n}\n\nexport class UspsAddressProvider implements AddressProvider {\n readonly name = \"USPS\";\n private readonly endpoint: string;\n private readonly userId: string;\n\n constructor(options: UspsAddressProviderOptions) {\n if (!isNonEmptyString(options.userId)) {\n throw new TypeError(\"USPS provider: userId is required\");\n }\n this.userId = options.userId;\n this.endpoint = options.endpoint ?? \"https://secure.shippingapis.com/ShippingAPI.dll\";\n }\n\n supportsCountry(country: SupportedCountryCode): boolean {\n return country === \"US\";\n }\n\n async lookupPostalCode(\n request: PostalCodeLookupRequest\n ): Promise<ValidatedPostalCodeAddress> {\n assertProviderSupportsCountry({\n providerName: this.name,\n country: request.country,\n supportsCountry: this.supportsCountry.bind(this),\n });\n const zip5 = normalizeUsZip(request.postalCode);\n const xml = `<CityStateLookupRequest USERID=\"${escapeXml(this.userId)}\"><ZipCode ID=\"0\"><Zip5>${zip5}</Zip5></ZipCode></CityStateLookupRequest>`;\n const responseXml = await this.callApi(\"CityStateLookup\", xml, request.signal);\n\n const errorDescription = getTagValue(responseXml, \"Description\");\n if (errorDescription) {\n throw new AddressProviderError(`USPS CityStateLookup failed: ${errorDescription}`);\n }\n\n const city = getTagValue(responseXml, \"City\");\n const state = getTagValue(responseXml, \"State\");\n const canonicalZip = getTagValue(responseXml, \"Zip5\") ?? zip5;\n if (!city || !state) {\n throw new AddressProviderError(\"USPS CityStateLookup returned incomplete response\");\n }\n\n return {\n country: \"US\",\n postalCode: canonicalZip,\n city,\n stateProvince: state,\n source: this.name,\n uspsVerified: true,\n };\n }\n\n async verifyAddress(request: AddressInput): Promise<VerifiedAddress> {\n assertProviderSupportsCountry({\n providerName: this.name,\n country: request.country,\n supportsCountry: this.supportsCountry.bind(this),\n });\n if (!isNonEmptyString(request.addressLine1)) {\n throw new TypeError(\"USPS provider: addressLine1 is required for verification\");\n }\n\n const zip5 = normalizeUsZip(request.postalCode);\n const xml = `<AddressValidateRequest USERID=\"${escapeXml(this.userId)}\"><Address ID=\"0\"><FirmName></FirmName><Address1>${escapeXml(request.addressLine2 ?? \"\")}</Address1><Address2>${escapeXml(request.addressLine1)}</Address2><City>${escapeXml(request.city ?? \"\")}</City><State>${escapeXml(request.stateProvince ?? \"\")}</State><Zip5>${zip5}</Zip5><Zip4></Zip4></Address></AddressValidateRequest>`;\n const responseXml = await this.callApi(\"Verify\", xml, request.signal);\n\n const errorDescription = getTagValue(responseXml, \"Description\");\n if (errorDescription) {\n throw new AddressVerificationError(`USPS Verify failed: ${errorDescription}`);\n }\n\n const line1 = getTagValue(responseXml, \"Address2\");\n const line2 = getTagValue(responseXml, \"Address1\");\n const city = getTagValue(responseXml, \"City\");\n const state = getTagValue(responseXml, \"State\");\n const canonicalZip = getTagValue(responseXml, \"Zip5\");\n const zip4 = getTagValue(responseXml, \"Zip4\");\n\n if (!line1 || !city || !state || !canonicalZip) {\n throw new AddressVerificationError(\"USPS Verify returned incomplete response\");\n }\n\n return {\n country: \"US\",\n postalCode: zip4 ? `${canonicalZip}-${zip4}` : canonicalZip,\n city,\n stateProvince: state,\n addressLine1: line1,\n addressLine2: line2 || undefined,\n source: this.name,\n uspsVerified: true,\n };\n }\n\n private async callApi(api: string, xml: string, signal?: AbortSignal): Promise<string> {\n const url = `${this.endpoint}?API=${encodeURIComponent(api)}&XML=${encodeURIComponent(xml)}`;\n return await fetchTextOrThrow(url, {\n signal,\n errorPrefix: \"USPS request\",\n });\n }\n}\n","import { AddressProviderError, AddressVerificationError } from \"../errors.js\";\nimport type {\n AddressInput,\n AddressProvider,\n PostalCodeLookupRequest,\n SupportedCountryCode,\n ValidatedPostalCodeAddress,\n VerifiedAddress,\n} from \"../types.js\";\nimport {\n assertProviderSupportsCountry,\n fetchJsonOrThrow,\n normalizeComparable,\n} from \"./providerUtils.js\";\n\ninterface ZippopotamResponse {\n \"post code\": string;\n country: string;\n \"country abbreviation\": string;\n places: Array<{\n \"place name\": string;\n state: string;\n \"state abbreviation\": string;\n }>;\n}\n\nexport interface ZippopotamAddressProviderOptions {\n endpoint?: string;\n}\n\nfunction canonicalCountryCode(value: SupportedCountryCode): string {\n return value.toLowerCase();\n}\n\nfunction normalizePostalCode(value: string): string {\n const cleaned = value.trim().toUpperCase();\n if (!cleaned) throw new TypeError(\"postalCode is required\");\n return cleaned;\n}\n\nexport class ZippopotamAddressProvider implements AddressProvider {\n readonly name = \"Zippopotam\";\n private readonly endpoint: string;\n\n constructor(options: ZippopotamAddressProviderOptions = {}) {\n this.endpoint = options.endpoint ?? \"https://api.zippopotam.us\";\n }\n\n supportsCountry(country: SupportedCountryCode): boolean {\n return country === \"US\" || country === \"CA\";\n }\n\n async lookupPostalCode(\n request: PostalCodeLookupRequest\n ): Promise<ValidatedPostalCodeAddress> {\n const postalCode = normalizePostalCode(request.postalCode);\n assertProviderSupportsCountry({\n providerName: this.name,\n country: request.country,\n supportsCountry: this.supportsCountry.bind(this),\n });\n const country = canonicalCountryCode(request.country);\n const url = `${this.endpoint}/${country}/${encodeURIComponent(postalCode)}`;\n const payload = await fetchJsonOrThrow<ZippopotamResponse>(url, {\n signal: request.signal,\n errorPrefix: `Zippopotam lookup for ${request.country} ${postalCode}`,\n });\n const first = payload.places?.[0];\n if (!first) {\n throw new AddressProviderError(\"Zippopotam lookup returned no places\");\n }\n\n return {\n country: request.country,\n postalCode: payload[\"post code\"],\n city: first[\"place name\"],\n stateProvince: first[\"state abbreviation\"] || first.state,\n source: this.name,\n uspsVerified: false,\n };\n }\n\n async verifyAddress(request: AddressInput): Promise<VerifiedAddress> {\n const lookedUp = await this.lookupPostalCode(request);\n if (\n request.city &&\n normalizeComparable(request.city) !== normalizeComparable(lookedUp.city)\n ) {\n throw new AddressVerificationError(\n `City mismatch for postal code ${request.postalCode}: expected ${lookedUp.city}`\n );\n }\n if (\n request.stateProvince &&\n normalizeComparable(request.stateProvince) !==\n normalizeComparable(lookedUp.stateProvince)\n ) {\n throw new AddressVerificationError(\n `State/Province mismatch for postal code ${request.postalCode}: expected ${lookedUp.stateProvince}`\n );\n }\n\n return {\n ...lookedUp,\n addressLine1: request.addressLine1,\n addressLine2: request.addressLine2,\n };\n }\n}\n","import { isNonEmptyString } from \"../../guards/index.js\";\nimport { AddressProviderError, AddressVerificationError } from \"../errors.js\";\nimport type {\n AddressInput,\n AddressProvider,\n PostalCodeLookupRequest,\n SupportedCountryCode,\n ValidatedPostalCodeAddress,\n VerifiedAddress,\n} from \"../types.js\";\nimport {\n assertProviderSupportsCountry,\n fetchJsonOrThrow,\n normalizeComparable,\n normalizePostalComparable,\n} from \"./providerUtils.js\";\n\ninterface CanadaPostFindItem {\n Id?: string;\n Text?: string;\n Description?: string;\n}\n\ninterface CanadaPostFindResponse {\n Items?: CanadaPostFindItem[];\n}\n\ninterface CanadaPostRetrieveItem {\n Line1?: string;\n Line2?: string;\n City?: string;\n ProvinceCode?: string;\n PostalCode?: string;\n}\n\ninterface CanadaPostRetrieveResponse {\n Items?: CanadaPostRetrieveItem[];\n}\n\nexport interface CanadaPostAddressProviderOptions {\n key: string;\n findEndpoint?: string;\n retrieveEndpoint?: string;\n}\n\nfunction normalizeCanadianPostalCode(value: string): string {\n const cleaned = value.replace(/\\s+/g, \"\").toUpperCase();\n if (!/^[A-Z]\\d[A-Z]\\d[A-Z]\\d$/.test(cleaned)) {\n throw new TypeError(\n \"CanadaPost provider: postalCode must be a valid Canadian postal code (A1A1A1)\"\n );\n }\n return `${cleaned.slice(0, 3)} ${cleaned.slice(3)}`;\n}\n\nexport class CanadaPostAddressProvider implements AddressProvider {\n readonly name = \"CanadaPost\";\n private readonly key: string;\n private readonly findEndpoint: string;\n private readonly retrieveEndpoint: string;\n\n constructor(options: CanadaPostAddressProviderOptions) {\n if (!isNonEmptyString(options.key)) {\n throw new TypeError(\"CanadaPost provider: key is required\");\n }\n this.key = options.key;\n this.findEndpoint =\n options.findEndpoint ??\n \"https://ws1.postescanada-canadapost.ca/AddressComplete/Interactive/Find/v2.10/json3.ws\";\n this.retrieveEndpoint =\n options.retrieveEndpoint ??\n \"https://ws1.postescanada-canadapost.ca/AddressComplete/Interactive/Retrieve/v2.11/json3.ws\";\n }\n\n supportsCountry(country: SupportedCountryCode): boolean {\n return country === \"CA\";\n }\n\n async lookupPostalCode(\n request: PostalCodeLookupRequest\n ): Promise<ValidatedPostalCodeAddress> {\n assertProviderSupportsCountry({\n providerName: this.name,\n country: request.country,\n supportsCountry: this.supportsCountry.bind(this),\n });\n\n const postalCode = normalizeCanadianPostalCode(request.postalCode);\n const retrieved = await this.findAndRetrieve({\n searchTerm: postalCode,\n signal: request.signal,\n });\n\n if (!retrieved.city || !retrieved.provinceCode || !retrieved.postalCode) {\n throw new AddressProviderError(\"CanadaPost lookup returned incomplete response\");\n }\n\n return {\n country: \"CA\",\n postalCode: normalizeCanadianPostalCode(retrieved.postalCode),\n city: retrieved.city,\n stateProvince: retrieved.provinceCode,\n source: this.name,\n uspsVerified: false,\n };\n }\n\n async verifyAddress(request: AddressInput): Promise<VerifiedAddress> {\n assertProviderSupportsCountry({\n providerName: this.name,\n country: request.country,\n supportsCountry: this.supportsCountry.bind(this),\n });\n if (!isNonEmptyString(request.addressLine1)) {\n throw new TypeError(\n \"CanadaPost provider: addressLine1 is required for verification\"\n );\n }\n\n const searchPostal = normalizeCanadianPostalCode(request.postalCode);\n const searchTerm = [request.addressLine1, request.city, searchPostal]\n .filter(isNonEmptyString)\n .join(\" \");\n const retrieved = await this.findAndRetrieve({\n searchTerm,\n signal: request.signal,\n });\n\n if (\n !retrieved.line1 ||\n !retrieved.city ||\n !retrieved.provinceCode ||\n !retrieved.postalCode\n ) {\n throw new AddressVerificationError(\n \"CanadaPost verify returned incomplete response\"\n );\n }\n\n if (\n normalizePostalComparable(retrieved.postalCode) !==\n normalizePostalComparable(searchPostal)\n ) {\n throw new AddressVerificationError(\n `Postal code mismatch: expected ${searchPostal}, got ${retrieved.postalCode}`\n );\n }\n if (\n request.city &&\n normalizeComparable(request.city) !== normalizeComparable(retrieved.city)\n ) {\n throw new AddressVerificationError(\n `City mismatch: expected ${request.city}, got ${retrieved.city}`\n );\n }\n if (\n request.stateProvince &&\n normalizeComparable(request.stateProvince) !==\n normalizeComparable(retrieved.provinceCode)\n ) {\n throw new AddressVerificationError(\n `Province mismatch: expected ${request.stateProvince}, got ${retrieved.provinceCode}`\n );\n }\n\n return {\n country: \"CA\",\n postalCode: normalizeCanadianPostalCode(retrieved.postalCode),\n city: retrieved.city,\n stateProvince: retrieved.provinceCode,\n addressLine1: retrieved.line1,\n addressLine2: retrieved.line2,\n source: this.name,\n uspsVerified: false,\n };\n }\n\n private async findAndRetrieve(args: {\n searchTerm: string;\n signal?: AbortSignal;\n }): Promise<{\n line1?: string;\n line2?: string;\n city?: string;\n provinceCode?: string;\n postalCode?: string;\n }> {\n const findPayload = await this.callFind(args.searchTerm, args.signal);\n const firstId = findPayload.Items?.find((item) => isNonEmptyString(item.Id))?.Id;\n if (!firstId) {\n throw new AddressProviderError(\"CanadaPost find returned no candidate addresses\");\n }\n const retrieved = await this.callRetrieve(firstId, args.signal);\n const first = retrieved.Items?.[0];\n if (!first) {\n throw new AddressProviderError(\"CanadaPost retrieve returned no addresses\");\n }\n return {\n line1: first.Line1,\n line2: first.Line2,\n city: first.City,\n provinceCode: first.ProvinceCode,\n postalCode: first.PostalCode,\n };\n }\n\n private async callFind(\n searchTerm: string,\n signal?: AbortSignal\n ): Promise<CanadaPostFindResponse> {\n const params = new URLSearchParams({\n Key: this.key,\n SearchTerm: searchTerm,\n Country: \"CAN\",\n Limit: \"5\",\n });\n const url = `${this.findEndpoint}?${params.toString()}`;\n return await fetchJsonOrThrow<CanadaPostFindResponse>(url, {\n signal,\n errorPrefix: \"CanadaPost find\",\n });\n }\n\n private async callRetrieve(\n id: string,\n signal?: AbortSignal\n ): Promise<CanadaPostRetrieveResponse> {\n const params = new URLSearchParams({\n Key: this.key,\n Id: id,\n Country: \"CAN\",\n });\n const url = `${this.retrieveEndpoint}?${params.toString()}`;\n return await fetchJsonOrThrow<CanadaPostRetrieveResponse>(url, {\n signal,\n errorPrefix: \"CanadaPost retrieve\",\n });\n }\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "reliable-node-utils",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Resume-grade Node.js utilities: retry, timeout, concurrency, memoize, deepMerge, and runtime guards. ESM + CJS, TypeScript-first.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"README.md"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsup",
|
|
22
|
+
"dev": "tsup --watch",
|
|
23
|
+
"lint": "eslint src tests",
|
|
24
|
+
"lint:fix": "eslint src tests --fix",
|
|
25
|
+
"format": "prettier --write \"src/**/*.ts\" \"tests/**/*.ts\"",
|
|
26
|
+
"format:check": "prettier --check \"src/**/*.ts\" \"tests/**/*.ts\"",
|
|
27
|
+
"test": "vitest run",
|
|
28
|
+
"test:watch": "vitest",
|
|
29
|
+
"test:coverage": "vitest run --coverage",
|
|
30
|
+
"typecheck": "tsc --noEmit",
|
|
31
|
+
"version": "changeset version",
|
|
32
|
+
"release": "npm run build && npm publish --provenance --access public",
|
|
33
|
+
"prepare": "npm run build"
|
|
34
|
+
},
|
|
35
|
+
"engines": {
|
|
36
|
+
"node": ">=18"
|
|
37
|
+
},
|
|
38
|
+
"sideEffects": false,
|
|
39
|
+
"keywords": [
|
|
40
|
+
"utils",
|
|
41
|
+
"retry",
|
|
42
|
+
"timeout",
|
|
43
|
+
"concurrency",
|
|
44
|
+
"memoize",
|
|
45
|
+
"deep-merge",
|
|
46
|
+
"type-guards",
|
|
47
|
+
"node",
|
|
48
|
+
"typescript",
|
|
49
|
+
"esm",
|
|
50
|
+
"cjs"
|
|
51
|
+
],
|
|
52
|
+
"author": "",
|
|
53
|
+
"license": "Apache-2.0",
|
|
54
|
+
"repository": {
|
|
55
|
+
"type": "git",
|
|
56
|
+
"url": ""
|
|
57
|
+
},
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"@changesets/cli": "^2.27.10",
|
|
60
|
+
"@types/node": "^20.17.6",
|
|
61
|
+
"@vitest/coverage-v8": "^2.1.6",
|
|
62
|
+
"eslint": "^9.15.0",
|
|
63
|
+
"prettier": "^3.3.3",
|
|
64
|
+
"tsup": "^8.3.5",
|
|
65
|
+
"typescript": "^5.6.3",
|
|
66
|
+
"typescript-eslint": "^8.15.0",
|
|
67
|
+
"vitest": "^2.1.6"
|
|
68
|
+
},
|
|
69
|
+
"dependencies": {
|
|
70
|
+
"@faker-js/faker": "^10.3.0"
|
|
71
|
+
}
|
|
72
|
+
}
|