@socketsecurity/lib 3.1.0 → 3.1.2

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/CHANGELOG.md CHANGED
@@ -5,6 +5,25 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [3.1.2](https://github.com/SocketDev/socket-lib/releases/tag/v3.1.2) - 2025-11-02
9
+
10
+ ### Fixed
11
+
12
+ - **External dependencies**: Fixed incorrectly marked external dependencies to use wrapper pattern
13
+ - Updated `src/constants/agents.ts` to use `require('../external/which')` instead of direct imports
14
+ - Updated `src/zod.ts` to export from `./external/zod'` instead of direct imports
15
+ - Maintains zero dependencies policy by ensuring all runtime dependencies go through the external wrapper pattern
16
+ - **Spinner**: Fixed undefined properties in setShimmer by handling defaults correctly
17
+
18
+ ## [3.1.1](https://github.com/SocketDev/socket-lib/releases/tag/v3.1.1) - 2025-11-02
19
+
20
+ ### Fixed
21
+
22
+ - **Cache TTL**: Fixed flaky test by handling persistent cache write failures gracefully
23
+ - Wrapped `cacache.put` in try/catch to prevent failures when persistent cache writes fail or are slow
24
+ - In-memory cache is updated synchronously before the persistent write, so immediate reads succeed regardless of persistent cache state
25
+ - Improves reliability in test environments and when cache directory has issues
26
+
8
27
  ## [3.1.0](https://github.com/SocketDev/socket-lib/releases/tag/v3.1.0) - 2025-11-01
9
28
 
10
29
  ### Changed
@@ -162,9 +162,12 @@ function createTtlCache(options) {
162
162
  if (opts.memoize) {
163
163
  memoCache.set(fullKey, entry);
164
164
  }
165
- await cacache.put(fullKey, JSON.stringify(entry), {
166
- metadata: { expiresAt: entry.expiresAt }
167
- });
165
+ try {
166
+ await cacache.put(fullKey, JSON.stringify(entry), {
167
+ metadata: { expiresAt: entry.expiresAt }
168
+ });
169
+ } catch {
170
+ }
168
171
  }
169
172
  async function getOrFetch(key, fetcher) {
170
173
  const cached = await get(key);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/cache-with-ttl.ts"],
4
- "sourcesContent": ["/**\n * @fileoverview Generic TTL-based caching utility using cacache.\n *\n * Provides a simple interface for caching data with time-to-live (TTL) expiration.\n * Uses cacache for persistent storage with metadata for TTL tracking.\n *\n * Features:\n * - Automatic expiration based on TTL\n * - In-memory memoization for hot data\n * - Persistent storage across process restarts\n * - Type-safe with generics\n *\n * Usage:\n * ```ts\n * const cache = createTtlCache({ ttl: 5 * 60 * 1000 }) // 5 minutes\n * const data = await cache.getOrFetch('key', async () => fetchData())\n * ```\n */\n\nimport * as cacache from './cacache'\n\nexport interface TtlCacheOptions {\n /**\n * Time-to-live in milliseconds.\n * @default 5 * 60 * 1000 (5 minutes)\n */\n ttl?: number | undefined\n /**\n * Enable in-memory memoization for hot data.\n * @default true\n */\n memoize?: boolean | undefined\n /**\n * Custom cache key prefix.\n * Must not contain wildcards (*).\n * Use clear({ prefix: \"pattern*\" }) for wildcard matching instead.\n *\n * @default 'ttl-cache'\n * @throws {TypeError} If prefix contains wildcards\n *\n * @example\n * // Valid\n * createTtlCache({ prefix: 'socket-sdk' })\n * createTtlCache({ prefix: 'my-app:cache' })\n *\n * @example\n * // Invalid - throws TypeError\n * createTtlCache({ prefix: 'socket-*' })\n */\n prefix?: string | undefined\n}\n\nexport interface TtlCacheEntry<T> {\n data: T\n expiresAt: number\n}\n\nexport interface ClearOptions {\n /**\n * Only clear in-memory memoization cache, not persistent cache.\n * Useful for forcing a refresh of cached data without removing it from disk.\n *\n * @default false\n */\n memoOnly?: boolean | undefined\n}\n\nexport interface TtlCache {\n /**\n * Get cached data without fetching.\n * Returns undefined if not found or expired.\n *\n * @param key - Cache key (must not contain wildcards)\n * @throws {TypeError} If key contains wildcards (*)\n */\n get<T>(key: string): Promise<T | undefined>\n /**\n * Get all cached entries matching a pattern.\n * Supports wildcards (*) for flexible matching.\n *\n * @param pattern - Key pattern (supports * wildcards, or use '*' for all entries)\n * @returns Map of matching entries (key -> value)\n *\n * @example\n * // Get all organization entries\n * const orgs = await cache.getAll<OrgData>('organizations:*')\n * for (const [key, org] of orgs) {\n * console.log(`${key}: ${org.name}`)\n * }\n *\n * @example\n * // Get all entries with this cache's prefix\n * const all = await cache.getAll<any>('*')\n */\n getAll<T>(pattern: string): Promise<Map<string, T>>\n /**\n * Get cached data or fetch and cache if missing/expired.\n *\n * @param key - Cache key (must not contain wildcards)\n */\n getOrFetch<T>(key: string, fetcher: () => Promise<T>): Promise<T>\n /**\n * Set cached data with TTL.\n *\n * @param key - Cache key (must not contain wildcards)\n * @throws {TypeError} If key contains wildcards (*)\n */\n set<T>(key: string, data: T): Promise<void>\n /**\n * Delete a specific cache entry.\n *\n * @param key - Cache key (must not contain wildcards)\n * @throws {TypeError} If key contains wildcards (*)\n */\n delete(key: string): Promise<void>\n /**\n * Delete all cache entries matching a pattern.\n * Supports wildcards (*) for flexible matching.\n *\n * @param pattern - Key pattern (supports * wildcards, or omit to delete all)\n * @returns Number of entries deleted\n *\n * @example\n * // Delete all entries with this cache's prefix\n * await cache.deleteAll()\n *\n * @example\n * // Delete entries matching prefix\n * await cache.deleteAll('organizations')\n *\n * @example\n * // Delete entries with wildcard pattern\n * await cache.deleteAll('scans:abc*')\n * await cache.deleteAll('npm/lodash/*')\n */\n deleteAll(pattern?: string | undefined): Promise<number>\n /**\n * Clear all cache entries (like Map.clear()).\n * Optionally clear only in-memory cache.\n *\n * @param options - Optional configuration\n * @param options.memoOnly - If true, only clears in-memory cache\n *\n * @example\n * // Clear everything (memory + disk)\n * await cache.clear()\n *\n * @example\n * // Clear only in-memory cache (force refresh)\n * await cache.clear({ memoOnly: true })\n */\n clear(options?: ClearOptions | undefined): Promise<void>\n}\n\n// 5 minutes\nconst DEFAULT_TTL_MS = 5 * 60 * 1000\nconst DEFAULT_PREFIX = 'ttl-cache'\n\n/**\n * Create a TTL-based cache instance.\n */\nexport function createTtlCache(options?: TtlCacheOptions): TtlCache {\n const opts = {\n __proto__: null,\n memoize: true,\n prefix: DEFAULT_PREFIX,\n ttl: DEFAULT_TTL_MS,\n ...options,\n } as Required<TtlCacheOptions>\n\n // Validate prefix does not contain wildcards.\n if (opts.prefix?.includes('*')) {\n throw new TypeError(\n 'Cache prefix cannot contain wildcards (*). Use clear({ prefix: \"pattern*\" }) for wildcard matching.',\n )\n }\n\n // In-memory cache for hot data\n const memoCache = new Map<string, TtlCacheEntry<any>>()\n\n // Ensure ttl is defined\n const ttl = opts.ttl ?? DEFAULT_TTL_MS\n\n /**\n * Build full cache key with prefix.\n */\n function buildKey(key: string): string {\n return `${opts.prefix}:${key}`\n }\n\n /**\n * Check if entry is expired.\n */\n function isExpired(entry: TtlCacheEntry<any>): boolean {\n return Date.now() > entry.expiresAt\n }\n\n /**\n * Create a matcher function for a pattern (with wildcard support).\n * Returns a function that tests if a key matches the pattern.\n */\n function createMatcher(pattern: string): (key: string) => boolean {\n const fullPattern = buildKey(pattern)\n const hasWildcard = pattern.includes('*')\n\n if (!hasWildcard) {\n // Simple prefix matching (fast path).\n return (key: string) => key.startsWith(fullPattern)\n }\n\n // Wildcard matching with regex.\n const escaped = fullPattern.replaceAll(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')\n const regexPattern = escaped.replaceAll('*', '.*')\n const regex = new RegExp(`^${regexPattern}`)\n return (key: string) => regex.test(key)\n }\n\n /**\n * Get cached data without fetching.\n *\n * @throws {TypeError} If key contains wildcards (*)\n */\n async function get<T>(key: string): Promise<T | undefined> {\n if (key.includes('*')) {\n throw new TypeError(\n 'Cache key cannot contain wildcards (*). Use getAll(pattern) to retrieve multiple entries.',\n )\n }\n\n const fullKey = buildKey(key)\n\n // Check in-memory cache first.\n if (opts.memoize) {\n const memoEntry = memoCache.get(fullKey)\n if (memoEntry && !isExpired(memoEntry)) {\n return memoEntry.data as T\n }\n // Remove expired memo entry.\n if (memoEntry) {\n memoCache.delete(fullKey)\n }\n }\n\n // Check persistent cache.\n const cacheEntry = await cacache.safeGet(fullKey)\n if (cacheEntry) {\n const entry = JSON.parse(\n cacheEntry.data.toString('utf8'),\n ) as TtlCacheEntry<T>\n if (!isExpired(entry)) {\n // Update in-memory cache.\n if (opts.memoize) {\n memoCache.set(fullKey, entry)\n }\n return entry.data\n }\n // Remove expired entry.\n await cacache.remove(fullKey)\n }\n\n return undefined\n }\n\n /**\n * Get all cached entries matching a pattern.\n * Supports wildcards (*) for flexible matching.\n */\n async function getAll<T>(pattern: string): Promise<Map<string, T>> {\n const results = new Map<string, T>()\n const matches = createMatcher(pattern)\n\n // Check in-memory cache first.\n if (opts.memoize) {\n for (const [key, entry] of memoCache.entries()) {\n if (!matches(key)) {\n continue\n }\n\n // Skip if expired.\n if (isExpired(entry)) {\n memoCache.delete(key)\n continue\n }\n\n // Add to results (strip cache prefix from key).\n const originalKey = key.slice((opts.prefix?.length ?? 0) + 1)\n results.set(originalKey, entry.data as T)\n }\n }\n\n // Check persistent cache for entries not in memory.\n const cacheDir = (await import('./paths')).getSocketCacacheDir()\n const cacacheModule = (await import('./cacache')) as any\n const stream = cacacheModule.getCacache().ls.stream(cacheDir)\n\n for await (const cacheEntry of stream) {\n // Skip if doesn't match our cache prefix.\n if (!cacheEntry.key.startsWith(`${opts.prefix}:`)) {\n continue\n }\n\n // Skip if doesn't match pattern.\n if (!matches(cacheEntry.key)) {\n continue\n }\n\n // Skip if already in results (from memory).\n const originalKey = cacheEntry.key.slice((opts.prefix?.length ?? 0) + 1)\n if (results.has(originalKey)) {\n continue\n }\n\n // Get entry from cache.\n try {\n const entry = await cacache.safeGet(cacheEntry.key)\n if (!entry) {\n continue\n }\n\n const parsed = JSON.parse(\n entry.data.toString('utf8'),\n ) as TtlCacheEntry<T>\n\n // Skip if expired.\n if (isExpired(parsed)) {\n await cacache.remove(cacheEntry.key)\n continue\n }\n\n // Add to results.\n results.set(originalKey, parsed.data)\n\n // Update in-memory cache.\n if (opts.memoize) {\n memoCache.set(cacheEntry.key, parsed)\n }\n } catch {\n // Ignore parse errors or other issues.\n }\n }\n\n return results\n }\n\n /**\n * Set cached data with TTL.\n *\n * @throws {TypeError} If key contains wildcards (*)\n */\n async function set<T>(key: string, data: T): Promise<void> {\n if (key.includes('*')) {\n throw new TypeError(\n 'Cache key cannot contain wildcards (*). Wildcards are only supported in clear({ prefix: \"pattern*\" }).',\n )\n }\n\n const fullKey = buildKey(key)\n const entry: TtlCacheEntry<T> = {\n data,\n expiresAt: Date.now() + ttl,\n }\n\n // Update in-memory cache.\n if (opts.memoize) {\n memoCache.set(fullKey, entry)\n }\n\n // Update persistent cache.\n await cacache.put(fullKey, JSON.stringify(entry), {\n metadata: { expiresAt: entry.expiresAt },\n })\n }\n\n /**\n * Get cached data or fetch and cache if missing/expired.\n */\n async function getOrFetch<T>(\n key: string,\n fetcher: () => Promise<T>,\n ): Promise<T> {\n const cached = await get<T>(key)\n if (cached !== undefined) {\n return cached\n }\n\n const data = await fetcher()\n await set(key, data)\n return data\n }\n\n /**\n * Delete a specific cache entry.\n *\n * @throws {TypeError} If key contains wildcards (*)\n */\n async function deleteEntry(key: string): Promise<void> {\n if (key.includes('*')) {\n throw new TypeError(\n 'Cache key cannot contain wildcards (*). Use deleteAll(pattern) to remove multiple entries.',\n )\n }\n\n const fullKey = buildKey(key)\n memoCache.delete(fullKey)\n await cacache.remove(fullKey)\n }\n\n /**\n * Delete all cache entries matching a pattern.\n * Supports wildcards (*) in patterns.\n * Delegates to cacache.clear() which handles pattern matching efficiently.\n */\n async function deleteAll(pattern?: string | undefined): Promise<number> {\n // Build full prefix/pattern by combining cache prefix with optional pattern.\n const fullPrefix = pattern ? `${opts.prefix}:${pattern}` : opts.prefix\n\n // Delete matching in-memory entries.\n if (!pattern) {\n // Delete all in-memory entries for this cache.\n memoCache.clear()\n } else {\n // Delete matching in-memory entries using shared matcher logic.\n const matches = createMatcher(pattern)\n for (const key of memoCache.keys()) {\n if (matches(key)) {\n memoCache.delete(key)\n }\n }\n }\n\n // Delete matching persistent cache entries.\n // Delegate to cacache.clear() which handles wildcards efficiently.\n const removed = await cacache.clear({ prefix: fullPrefix })\n return (removed ?? 0) as number\n }\n\n /**\n * Clear all cache entries (like Map.clear()).\n * Optionally clear only in-memory cache.\n */\n async function clear(options?: ClearOptions | undefined): Promise<void> {\n const opts = { __proto__: null, ...options } as ClearOptions\n\n // Clear in-memory cache.\n memoCache.clear()\n\n // If memoOnly, stop here.\n if (opts.memoOnly) {\n return\n }\n\n // Clear persistent cache.\n await deleteAll()\n }\n\n return {\n clear,\n delete: deleteEntry,\n deleteAll,\n get,\n getAll,\n getOrFetch,\n set,\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * @fileoverview Generic TTL-based caching utility using cacache.\n *\n * Provides a simple interface for caching data with time-to-live (TTL) expiration.\n * Uses cacache for persistent storage with metadata for TTL tracking.\n *\n * Features:\n * - Automatic expiration based on TTL\n * - In-memory memoization for hot data\n * - Persistent storage across process restarts\n * - Type-safe with generics\n *\n * Usage:\n * ```ts\n * const cache = createTtlCache({ ttl: 5 * 60 * 1000 }) // 5 minutes\n * const data = await cache.getOrFetch('key', async () => fetchData())\n * ```\n */\n\nimport * as cacache from './cacache'\n\nexport interface TtlCacheOptions {\n /**\n * Time-to-live in milliseconds.\n * @default 5 * 60 * 1000 (5 minutes)\n */\n ttl?: number | undefined\n /**\n * Enable in-memory memoization for hot data.\n * @default true\n */\n memoize?: boolean | undefined\n /**\n * Custom cache key prefix.\n * Must not contain wildcards (*).\n * Use clear({ prefix: \"pattern*\" }) for wildcard matching instead.\n *\n * @default 'ttl-cache'\n * @throws {TypeError} If prefix contains wildcards\n *\n * @example\n * // Valid\n * createTtlCache({ prefix: 'socket-sdk' })\n * createTtlCache({ prefix: 'my-app:cache' })\n *\n * @example\n * // Invalid - throws TypeError\n * createTtlCache({ prefix: 'socket-*' })\n */\n prefix?: string | undefined\n}\n\nexport interface TtlCacheEntry<T> {\n data: T\n expiresAt: number\n}\n\nexport interface ClearOptions {\n /**\n * Only clear in-memory memoization cache, not persistent cache.\n * Useful for forcing a refresh of cached data without removing it from disk.\n *\n * @default false\n */\n memoOnly?: boolean | undefined\n}\n\nexport interface TtlCache {\n /**\n * Get cached data without fetching.\n * Returns undefined if not found or expired.\n *\n * @param key - Cache key (must not contain wildcards)\n * @throws {TypeError} If key contains wildcards (*)\n */\n get<T>(key: string): Promise<T | undefined>\n /**\n * Get all cached entries matching a pattern.\n * Supports wildcards (*) for flexible matching.\n *\n * @param pattern - Key pattern (supports * wildcards, or use '*' for all entries)\n * @returns Map of matching entries (key -> value)\n *\n * @example\n * // Get all organization entries\n * const orgs = await cache.getAll<OrgData>('organizations:*')\n * for (const [key, org] of orgs) {\n * console.log(`${key}: ${org.name}`)\n * }\n *\n * @example\n * // Get all entries with this cache's prefix\n * const all = await cache.getAll<any>('*')\n */\n getAll<T>(pattern: string): Promise<Map<string, T>>\n /**\n * Get cached data or fetch and cache if missing/expired.\n *\n * @param key - Cache key (must not contain wildcards)\n */\n getOrFetch<T>(key: string, fetcher: () => Promise<T>): Promise<T>\n /**\n * Set cached data with TTL.\n *\n * @param key - Cache key (must not contain wildcards)\n * @throws {TypeError} If key contains wildcards (*)\n */\n set<T>(key: string, data: T): Promise<void>\n /**\n * Delete a specific cache entry.\n *\n * @param key - Cache key (must not contain wildcards)\n * @throws {TypeError} If key contains wildcards (*)\n */\n delete(key: string): Promise<void>\n /**\n * Delete all cache entries matching a pattern.\n * Supports wildcards (*) for flexible matching.\n *\n * @param pattern - Key pattern (supports * wildcards, or omit to delete all)\n * @returns Number of entries deleted\n *\n * @example\n * // Delete all entries with this cache's prefix\n * await cache.deleteAll()\n *\n * @example\n * // Delete entries matching prefix\n * await cache.deleteAll('organizations')\n *\n * @example\n * // Delete entries with wildcard pattern\n * await cache.deleteAll('scans:abc*')\n * await cache.deleteAll('npm/lodash/*')\n */\n deleteAll(pattern?: string | undefined): Promise<number>\n /**\n * Clear all cache entries (like Map.clear()).\n * Optionally clear only in-memory cache.\n *\n * @param options - Optional configuration\n * @param options.memoOnly - If true, only clears in-memory cache\n *\n * @example\n * // Clear everything (memory + disk)\n * await cache.clear()\n *\n * @example\n * // Clear only in-memory cache (force refresh)\n * await cache.clear({ memoOnly: true })\n */\n clear(options?: ClearOptions | undefined): Promise<void>\n}\n\n// 5 minutes\nconst DEFAULT_TTL_MS = 5 * 60 * 1000\nconst DEFAULT_PREFIX = 'ttl-cache'\n\n/**\n * Create a TTL-based cache instance.\n */\nexport function createTtlCache(options?: TtlCacheOptions): TtlCache {\n const opts = {\n __proto__: null,\n memoize: true,\n prefix: DEFAULT_PREFIX,\n ttl: DEFAULT_TTL_MS,\n ...options,\n } as Required<TtlCacheOptions>\n\n // Validate prefix does not contain wildcards.\n if (opts.prefix?.includes('*')) {\n throw new TypeError(\n 'Cache prefix cannot contain wildcards (*). Use clear({ prefix: \"pattern*\" }) for wildcard matching.',\n )\n }\n\n // In-memory cache for hot data\n const memoCache = new Map<string, TtlCacheEntry<any>>()\n\n // Ensure ttl is defined\n const ttl = opts.ttl ?? DEFAULT_TTL_MS\n\n /**\n * Build full cache key with prefix.\n */\n function buildKey(key: string): string {\n return `${opts.prefix}:${key}`\n }\n\n /**\n * Check if entry is expired.\n */\n function isExpired(entry: TtlCacheEntry<any>): boolean {\n return Date.now() > entry.expiresAt\n }\n\n /**\n * Create a matcher function for a pattern (with wildcard support).\n * Returns a function that tests if a key matches the pattern.\n */\n function createMatcher(pattern: string): (key: string) => boolean {\n const fullPattern = buildKey(pattern)\n const hasWildcard = pattern.includes('*')\n\n if (!hasWildcard) {\n // Simple prefix matching (fast path).\n return (key: string) => key.startsWith(fullPattern)\n }\n\n // Wildcard matching with regex.\n const escaped = fullPattern.replaceAll(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')\n const regexPattern = escaped.replaceAll('*', '.*')\n const regex = new RegExp(`^${regexPattern}`)\n return (key: string) => regex.test(key)\n }\n\n /**\n * Get cached data without fetching.\n *\n * @throws {TypeError} If key contains wildcards (*)\n */\n async function get<T>(key: string): Promise<T | undefined> {\n if (key.includes('*')) {\n throw new TypeError(\n 'Cache key cannot contain wildcards (*). Use getAll(pattern) to retrieve multiple entries.',\n )\n }\n\n const fullKey = buildKey(key)\n\n // Check in-memory cache first.\n if (opts.memoize) {\n const memoEntry = memoCache.get(fullKey)\n if (memoEntry && !isExpired(memoEntry)) {\n return memoEntry.data as T\n }\n // Remove expired memo entry.\n if (memoEntry) {\n memoCache.delete(fullKey)\n }\n }\n\n // Check persistent cache.\n const cacheEntry = await cacache.safeGet(fullKey)\n if (cacheEntry) {\n const entry = JSON.parse(\n cacheEntry.data.toString('utf8'),\n ) as TtlCacheEntry<T>\n if (!isExpired(entry)) {\n // Update in-memory cache.\n if (opts.memoize) {\n memoCache.set(fullKey, entry)\n }\n return entry.data\n }\n // Remove expired entry.\n await cacache.remove(fullKey)\n }\n\n return undefined\n }\n\n /**\n * Get all cached entries matching a pattern.\n * Supports wildcards (*) for flexible matching.\n */\n async function getAll<T>(pattern: string): Promise<Map<string, T>> {\n const results = new Map<string, T>()\n const matches = createMatcher(pattern)\n\n // Check in-memory cache first.\n if (opts.memoize) {\n for (const [key, entry] of memoCache.entries()) {\n if (!matches(key)) {\n continue\n }\n\n // Skip if expired.\n if (isExpired(entry)) {\n memoCache.delete(key)\n continue\n }\n\n // Add to results (strip cache prefix from key).\n const originalKey = key.slice((opts.prefix?.length ?? 0) + 1)\n results.set(originalKey, entry.data as T)\n }\n }\n\n // Check persistent cache for entries not in memory.\n const cacheDir = (await import('./paths')).getSocketCacacheDir()\n const cacacheModule = (await import('./cacache')) as any\n const stream = cacacheModule.getCacache().ls.stream(cacheDir)\n\n for await (const cacheEntry of stream) {\n // Skip if doesn't match our cache prefix.\n if (!cacheEntry.key.startsWith(`${opts.prefix}:`)) {\n continue\n }\n\n // Skip if doesn't match pattern.\n if (!matches(cacheEntry.key)) {\n continue\n }\n\n // Skip if already in results (from memory).\n const originalKey = cacheEntry.key.slice((opts.prefix?.length ?? 0) + 1)\n if (results.has(originalKey)) {\n continue\n }\n\n // Get entry from cache.\n try {\n const entry = await cacache.safeGet(cacheEntry.key)\n if (!entry) {\n continue\n }\n\n const parsed = JSON.parse(\n entry.data.toString('utf8'),\n ) as TtlCacheEntry<T>\n\n // Skip if expired.\n if (isExpired(parsed)) {\n await cacache.remove(cacheEntry.key)\n continue\n }\n\n // Add to results.\n results.set(originalKey, parsed.data)\n\n // Update in-memory cache.\n if (opts.memoize) {\n memoCache.set(cacheEntry.key, parsed)\n }\n } catch {\n // Ignore parse errors or other issues.\n }\n }\n\n return results\n }\n\n /**\n * Set cached data with TTL.\n *\n * @throws {TypeError} If key contains wildcards (*)\n */\n async function set<T>(key: string, data: T): Promise<void> {\n if (key.includes('*')) {\n throw new TypeError(\n 'Cache key cannot contain wildcards (*). Wildcards are only supported in clear({ prefix: \"pattern*\" }).',\n )\n }\n\n const fullKey = buildKey(key)\n const entry: TtlCacheEntry<T> = {\n data,\n expiresAt: Date.now() + ttl,\n }\n\n // Update in-memory cache first (synchronous and fast).\n if (opts.memoize) {\n memoCache.set(fullKey, entry)\n }\n\n // Update persistent cache (don't fail if this errors).\n // In-memory cache is already updated, so immediate reads will succeed.\n try {\n await cacache.put(fullKey, JSON.stringify(entry), {\n metadata: { expiresAt: entry.expiresAt },\n })\n } catch {\n // Ignore persistent cache errors - in-memory cache is the source of truth.\n // This can happen during test setup or if the cache directory is not accessible.\n }\n }\n\n /**\n * Get cached data or fetch and cache if missing/expired.\n */\n async function getOrFetch<T>(\n key: string,\n fetcher: () => Promise<T>,\n ): Promise<T> {\n const cached = await get<T>(key)\n if (cached !== undefined) {\n return cached\n }\n\n const data = await fetcher()\n await set(key, data)\n return data\n }\n\n /**\n * Delete a specific cache entry.\n *\n * @throws {TypeError} If key contains wildcards (*)\n */\n async function deleteEntry(key: string): Promise<void> {\n if (key.includes('*')) {\n throw new TypeError(\n 'Cache key cannot contain wildcards (*). Use deleteAll(pattern) to remove multiple entries.',\n )\n }\n\n const fullKey = buildKey(key)\n memoCache.delete(fullKey)\n await cacache.remove(fullKey)\n }\n\n /**\n * Delete all cache entries matching a pattern.\n * Supports wildcards (*) in patterns.\n * Delegates to cacache.clear() which handles pattern matching efficiently.\n */\n async function deleteAll(pattern?: string | undefined): Promise<number> {\n // Build full prefix/pattern by combining cache prefix with optional pattern.\n const fullPrefix = pattern ? `${opts.prefix}:${pattern}` : opts.prefix\n\n // Delete matching in-memory entries.\n if (!pattern) {\n // Delete all in-memory entries for this cache.\n memoCache.clear()\n } else {\n // Delete matching in-memory entries using shared matcher logic.\n const matches = createMatcher(pattern)\n for (const key of memoCache.keys()) {\n if (matches(key)) {\n memoCache.delete(key)\n }\n }\n }\n\n // Delete matching persistent cache entries.\n // Delegate to cacache.clear() which handles wildcards efficiently.\n const removed = await cacache.clear({ prefix: fullPrefix })\n return (removed ?? 0) as number\n }\n\n /**\n * Clear all cache entries (like Map.clear()).\n * Optionally clear only in-memory cache.\n */\n async function clear(options?: ClearOptions | undefined): Promise<void> {\n const opts = { __proto__: null, ...options } as ClearOptions\n\n // Clear in-memory cache.\n memoCache.clear()\n\n // If memoOnly, stop here.\n if (opts.memoOnly) {\n return\n }\n\n // Clear persistent cache.\n await deleteAll()\n }\n\n return {\n clear,\n delete: deleteEntry,\n deleteAll,\n get,\n getAll,\n getOrFetch,\n set,\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["options", "opts"]
7
7
  }
@@ -51,7 +51,7 @@ const VLT = "vlt";
51
51
  const NPX = "npx";
52
52
  const NPM_BIN_PATH = /* @__PURE__ */ (() => {
53
53
  try {
54
- const which = require('../external/which');
54
+ const which = require("../external/which");
55
55
  return which.sync("npm", { nothrow: true }) || "npm";
56
56
  } catch {
57
57
  return "npm";
@@ -61,7 +61,7 @@ const NPM_REAL_EXEC_PATH = /* @__PURE__ */ (() => {
61
61
  try {
62
62
  const { existsSync } = require("node:fs");
63
63
  const path = require("node:path");
64
- const which = require('../external/which');
64
+ const which = require("../external/which");
65
65
  const npmBin = which.sync("npm", { nothrow: true });
66
66
  if (!npmBin) {
67
67
  return void 0;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/constants/agents.ts"],
4
- "sourcesContent": ["/**\n * Package manager agent constants.\n * Agent names, lockfile names, registry URLs, and configuration field names.\n */\n\n// Agent names.\nexport const NPM = 'npm'\nexport const PNPM = 'pnpm'\nexport const YARN = 'yarn'\nexport const BUN = 'bun'\nexport const VLT = 'vlt'\nexport const NPX = 'npx'\n\n// NPM binary path - resolved at runtime using which.\nexport const NPM_BIN_PATH = /*@__PURE__*/ (() => {\n try {\n const which = /*@__PURE__*/ require('which')\n return which.sync('npm', { nothrow: true }) || 'npm'\n } catch {\n return 'npm'\n }\n})()\n\n// NPM CLI entry point - resolved at runtime from npm bin location.\n// NOTE: This is kept for backward compatibility but NPM_BIN_PATH should be used instead\n// because cli.js exports a function that must be invoked, not executed directly.\nexport const NPM_REAL_EXEC_PATH = /*@__PURE__*/ (() => {\n try {\n const { existsSync } = /*@__PURE__*/ require('node:fs')\n const path = /*@__PURE__*/ require('node:path')\n const which = /*@__PURE__*/ require('which')\n // Find npm binary using which.\n const npmBin = which.sync('npm', { nothrow: true })\n if (!npmBin) {\n return undefined\n }\n // npm bin is typically at: /path/to/node/bin/npm\n // cli.js is at: /path/to/node/lib/node_modules/npm/lib/cli.js\n // /path/to/node/bin\n const npmDir = path.dirname(npmBin)\n const nodeModulesPath = path.join(\n npmDir,\n '..',\n 'lib',\n 'node_modules',\n 'npm',\n 'lib',\n 'cli.js',\n )\n if (existsSync(nodeModulesPath)) {\n return nodeModulesPath\n }\n return undefined\n } catch {\n return undefined\n }\n})()\n\n// NPM registry URL.\nexport const NPM_REGISTRY_URL = 'https://registry.npmjs.org'\n\n// Agent variants.\nexport const YARN_BERRY = 'yarn/berry'\nexport const YARN_CLASSIC = 'yarn/classic'\n\n// Lock files.\nexport const PACKAGE_LOCK = 'package-lock'\nexport const PACKAGE_LOCK_JSON = 'package-lock.json'\nexport const NPM_SHRINKWRAP_JSON = 'npm-shrinkwrap.json'\nexport const PNPM_LOCK = 'pnpm-lock'\nexport const PNPM_LOCK_YAML = 'pnpm-lock.yaml'\nexport const YARN_LOCK = 'yarn.lock'\nexport const BUN_LOCK = 'bun.lock'\nexport const BUN_LOCKB = 'bun.lockb'\nexport const VLT_LOCK_JSON = 'vlt-lock.json'\n\n// Workspace configuration.\nexport const PNPM_WORKSPACE_YAML = 'pnpm-workspace.yaml'\n\n// Package.json fields for dependency overrides.\nexport const OVERRIDES = 'overrides'\nexport const RESOLUTIONS = 'resolutions'\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMO,MAAM,MAAM;AACZ,MAAM,OAAO;AACb,MAAM,OAAO;AACb,MAAM,MAAM;AACZ,MAAM,MAAM;AACZ,MAAM,MAAM;AAGZ,MAAM,eAA8B,uBAAM;AAC/C,MAAI;AACF,UAAM,QAAsB,QAAQ,OAAO;AAC3C,WAAO,MAAM,KAAK,OAAO,EAAE,SAAS,KAAK,CAAC,KAAK;AAAA,EACjD,QAAQ;AACN,WAAO;AAAA,EACT;AACF,GAAG;AAKI,MAAM,qBAAoC,uBAAM;AACrD,MAAI;AACF,UAAM,EAAE,WAAW,IAAkB,QAAQ,SAAS;AACtD,UAAM,OAAqB,QAAQ,WAAW;AAC9C,UAAM,QAAsB,QAAQ,OAAO;AAE3C,UAAM,SAAS,MAAM,KAAK,OAAO,EAAE,SAAS,KAAK,CAAC;AAClD,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AAIA,UAAM,SAAS,KAAK,QAAQ,MAAM;AAClC,UAAM,kBAAkB,KAAK;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,WAAW,eAAe,GAAG;AAC/B,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF,GAAG;AAGI,MAAM,mBAAmB;AAGzB,MAAM,aAAa;AACnB,MAAM,eAAe;AAGrB,MAAM,eAAe;AACrB,MAAM,oBAAoB;AAC1B,MAAM,sBAAsB;AAC5B,MAAM,YAAY;AAClB,MAAM,iBAAiB;AACvB,MAAM,YAAY;AAClB,MAAM,WAAW;AACjB,MAAM,YAAY;AAClB,MAAM,gBAAgB;AAGtB,MAAM,sBAAsB;AAG5B,MAAM,YAAY;AAClB,MAAM,cAAc;",
4
+ "sourcesContent": ["/**\n * Package manager agent constants.\n * Agent names, lockfile names, registry URLs, and configuration field names.\n */\n\n// Agent names.\nexport const NPM = 'npm'\nexport const PNPM = 'pnpm'\nexport const YARN = 'yarn'\nexport const BUN = 'bun'\nexport const VLT = 'vlt'\nexport const NPX = 'npx'\n\n// NPM binary path - resolved at runtime using which.\nexport const NPM_BIN_PATH = /*@__PURE__*/ (() => {\n try {\n const which = /*@__PURE__*/ require('../external/which')\n return which.sync('npm', { nothrow: true }) || 'npm'\n } catch {\n return 'npm'\n }\n})()\n\n// NPM CLI entry point - resolved at runtime from npm bin location.\n// NOTE: This is kept for backward compatibility but NPM_BIN_PATH should be used instead\n// because cli.js exports a function that must be invoked, not executed directly.\nexport const NPM_REAL_EXEC_PATH = /*@__PURE__*/ (() => {\n try {\n const { existsSync } = /*@__PURE__*/ require('node:fs')\n const path = /*@__PURE__*/ require('node:path')\n const which = /*@__PURE__*/ require('../external/which')\n // Find npm binary using which.\n const npmBin = which.sync('npm', { nothrow: true })\n if (!npmBin) {\n return undefined\n }\n // npm bin is typically at: /path/to/node/bin/npm\n // cli.js is at: /path/to/node/lib/node_modules/npm/lib/cli.js\n // /path/to/node/bin\n const npmDir = path.dirname(npmBin)\n const nodeModulesPath = path.join(\n npmDir,\n '..',\n 'lib',\n 'node_modules',\n 'npm',\n 'lib',\n 'cli.js',\n )\n if (existsSync(nodeModulesPath)) {\n return nodeModulesPath\n }\n return undefined\n } catch {\n return undefined\n }\n})()\n\n// NPM registry URL.\nexport const NPM_REGISTRY_URL = 'https://registry.npmjs.org'\n\n// Agent variants.\nexport const YARN_BERRY = 'yarn/berry'\nexport const YARN_CLASSIC = 'yarn/classic'\n\n// Lock files.\nexport const PACKAGE_LOCK = 'package-lock'\nexport const PACKAGE_LOCK_JSON = 'package-lock.json'\nexport const NPM_SHRINKWRAP_JSON = 'npm-shrinkwrap.json'\nexport const PNPM_LOCK = 'pnpm-lock'\nexport const PNPM_LOCK_YAML = 'pnpm-lock.yaml'\nexport const YARN_LOCK = 'yarn.lock'\nexport const BUN_LOCK = 'bun.lock'\nexport const BUN_LOCKB = 'bun.lockb'\nexport const VLT_LOCK_JSON = 'vlt-lock.json'\n\n// Workspace configuration.\nexport const PNPM_WORKSPACE_YAML = 'pnpm-workspace.yaml'\n\n// Package.json fields for dependency overrides.\nexport const OVERRIDES = 'overrides'\nexport const RESOLUTIONS = 'resolutions'\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMO,MAAM,MAAM;AACZ,MAAM,OAAO;AACb,MAAM,OAAO;AACb,MAAM,MAAM;AACZ,MAAM,MAAM;AACZ,MAAM,MAAM;AAGZ,MAAM,eAA8B,uBAAM;AAC/C,MAAI;AACF,UAAM,QAAsB,QAAQ,mBAAmB;AACvD,WAAO,MAAM,KAAK,OAAO,EAAE,SAAS,KAAK,CAAC,KAAK;AAAA,EACjD,QAAQ;AACN,WAAO;AAAA,EACT;AACF,GAAG;AAKI,MAAM,qBAAoC,uBAAM;AACrD,MAAI;AACF,UAAM,EAAE,WAAW,IAAkB,QAAQ,SAAS;AACtD,UAAM,OAAqB,QAAQ,WAAW;AAC9C,UAAM,QAAsB,QAAQ,mBAAmB;AAEvD,UAAM,SAAS,MAAM,KAAK,OAAO,EAAE,SAAS,KAAK,CAAC;AAClD,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AAIA,UAAM,SAAS,KAAK,QAAQ,MAAM;AAClC,UAAM,kBAAkB,KAAK;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,WAAW,eAAe,GAAG;AAC/B,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF,GAAG;AAGI,MAAM,mBAAmB;AAGzB,MAAM,aAAa;AACnB,MAAM,eAAe;AAGrB,MAAM,eAAe;AACrB,MAAM,oBAAoB;AAC1B,MAAM,sBAAsB;AAC5B,MAAM,YAAY;AAClB,MAAM,iBAAiB;AACvB,MAAM,YAAY;AAClB,MAAM,WAAW;AACjB,MAAM,YAAY;AAClB,MAAM,gBAAgB;AAGtB,MAAM,sBAAsB;AAG5B,MAAM,YAAY;AAClB,MAAM,cAAc;",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,31 @@
1
- 'use strict'
1
+ /**
2
+ * Bundled from @socketregistry/packageurl-js
3
+ * This is a zero-dependency bundle created by esbuild.
4
+ */
5
+ "use strict";var Ct=Object.defineProperty;var a=(e,r)=>Ct(e,"name",{value:r,configurable:!0});var Nt=Object.create,nr=Object.defineProperty,Ot=Object.getOwnPropertyDescriptor,Or=Object.getOwnPropertyNames,At=Object.getPrototypeOf,Rt=Object.prototype.hasOwnProperty,Oe=a((e,r)=>a(function(){return r||(0,e[Or(e)[0]])((r={exports:{}}).exports,r),r.exports},"__require"),"__commonJS"),kt=a((e,r)=>{for(var t in r)nr(e,t,{get:r[t],enumerable:!0})},"__export"),Ar=a((e,r,t,o)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of Or(r))!Rt.call(e,i)&&i!==t&&nr(e,i,{get:a(()=>r[i],"get"),enumerable:!(o=Ot(r,i))||o.enumerable});return e},"__copyProps"),Rr=a((e,r,t)=>(t=e!=null?Nt(At(e)):{},Ar(r||!e||!e.__esModule?nr(t,"default",{value:e,enumerable:!0}):t,e)),"__toESM"),jt=a(e=>Ar(nr({},"__esModule",{value:!0}),e),"__toCommonJS"),It=Oe({"@socketsecurity/lib/dist/types.js"(e,r){"use strict";var t=Object.defineProperty,o=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,S=Object.prototype.hasOwnProperty,v=a((w,X)=>{for(var C in X)t(w,C,{get:X[C],enumerable:!0})},"__export2"),O=a((w,X,C,I)=>{if(X&&typeof X=="object"||typeof X=="function")for(let k of i(X))!S.call(w,k)&&k!==C&&t(w,k,{get:a(()=>X[k],"get"),enumerable:!(I=o(X,k))||I.enumerable});return w},"__copyProps2"),G=a(w=>O(t({},"__esModule",{value:!0}),w),"__toCommonJS2"),U={};v(U,{PURL_Type:a(()=>L,"PURL_Type")}),r.exports=G(U);var L=(w=>(w.APK="apk",w.BITBUCKET="bitbucket",w.COCOAPODS="cocoapods",w.CARGO="cargo",w.CHROME="chrome",w.COMPOSER="composer",w.CONAN="conan",w.CONDA="conda",w.CRAN="cran",w.DEB="deb",w.DOCKER="docker",w.GEM="gem",w.GENERIC="generic",w.GITHUB="github",w.GOLANG="golang",w.HACKAGE="hackage",w.HEX="hex",w.HUGGINGFACE="huggingface",w.MAVEN="maven",w.MLFLOW="mlflow",w.NPM="npm",w.NUGET="nuget",w.OCI="oci",w.PUB="pub",w.PYPI="pypi",w.QPKG="qpkg",w.RPM="rpm",w.SWID="swid",w.SWIFT="swift",w.VCS="vcs",w))(L||{})}}),Lt=Oe({"@socketsecurity/lib/dist/constants/core.js"(e,r){"use strict";var t=Object.defineProperty,o=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,S=Object.prototype.hasOwnProperty,v=a((Q,K)=>{for(var oe in K)t(Q,oe,{get:K[oe],enumerable:!0})},"__export2"),O=a((Q,K,oe,he)=>{if(K&&typeof K=="object"||typeof K=="function")for(let de of i(K))!S.call(Q,de)&&de!==oe&&t(Q,de,{get:a(()=>K[de],"get"),enumerable:!(he=o(K,de))||he.enumerable});return Q},"__copyProps2"),G=a(Q=>O(t({},"__esModule",{value:!0}),Q),"__toCommonJS2"),U={};v(U,{COLUMN_LIMIT:a(()=>$,"COLUMN_LIMIT"),EMPTY_FILE:a(()=>I,"EMPTY_FILE"),EMPTY_VALUE:a(()=>k,"EMPTY_VALUE"),LOOP_SENTINEL:a(()=>w,"LOOP_SENTINEL"),NODE_AUTH_TOKEN:a(()=>N,"NODE_AUTH_TOKEN"),NODE_ENV:a(()=>_,"NODE_ENV"),UNDEFINED_TOKEN:a(()=>te,"UNDEFINED_TOKEN"),UNKNOWN_ERROR:a(()=>X,"UNKNOWN_ERROR"),UNKNOWN_VALUE:a(()=>C,"UNKNOWN_VALUE"),V:a(()=>ee,"V"),kInternalsSymbol:a(()=>L,"kInternalsSymbol")}),r.exports=G(U);var L=Symbol("@socketregistry.constants.internals"),w=1e6,X="Unknown error",C="<unknown>",I=`/* empty */
6
+ `,k="<value>",te=void 0,ee="v",$=80,N="NODE_AUTH_TOKEN",_="NODE_ENV"}}),Mt=Oe({"@socketsecurity/lib/dist/arrays.js"(e,r){"use strict";var t=Object.defineProperty,o=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,S=Object.prototype.hasOwnProperty,v=a((N,_)=>{for(var Q in _)t(N,Q,{get:_[Q],enumerable:!0})},"__export2"),O=a((N,_,Q,K)=>{if(_&&typeof _=="object"||typeof _=="function")for(let oe of i(_))!S.call(N,oe)&&oe!==Q&&t(N,oe,{get:a(()=>_[oe],"get"),enumerable:!(K=o(_,oe))||K.enumerable});return N},"__copyProps2"),G=a(N=>O(t({},"__esModule",{value:!0}),N),"__toCommonJS2"),U={};v(U,{arrayChunk:a(()=>I,"arrayChunk"),arrayUnique:a(()=>k,"arrayUnique"),isArray:a(()=>te,"isArray"),joinAnd:a(()=>ee,"joinAnd"),joinOr:a(()=>$,"joinOr")}),r.exports=G(U);var L;function w(){return L===void 0&&(L=new Intl.ListFormat("en",{style:"long",type:"conjunction"})),L}a(w,"getConjunctionFormatter");var X;function C(){return X===void 0&&(X=new Intl.ListFormat("en",{style:"long",type:"disjunction"})),X}a(C,"getDisjunctionFormatter");function I(N,_){let Q=_??2;if(Q<=0)throw new Error("Chunk size must be greater than 0");let{length:K}=N,oe=Math.min(K,Q),he=[];for(let de=0;de<K;de+=oe)he.push(N.slice(de,de+oe));return he}a(I,"arrayChunk");function k(N){return[...new Set(N)]}a(k,"arrayUnique");var te=Array.isArray;function ee(N){return w().format(N)}a(ee,"joinAnd");function $(N){return C().format(N)}a($,"joinOr")}}),Dt=Oe({"@socketsecurity/lib/dist/external/fast-sort.js"(e){"use strict";var r=Object.defineProperty,t=a((C,I)=>r(C,"name",{value:I,configurable:!0}),"a");Object.defineProperty(e,"__esModule",{value:!0});var o=t(function(C){return function(I,k,te){return C(I,k,te)*te}},"castComparer"),i=t(function(C,I){if(C)throw Error("Invalid sort config: "+I)},"throwInvalidConfigErrorIfTrue"),S=t(function(C){var I=C||{},k=I.asc,te=I.desc,ee=k?1:-1,$=k||te;i(!$,"Expected `asc` or `desc` property"),i(k&&te,"Ambiguous object with `asc` and `desc` config properties");var N=C.comparer&&o(C.comparer);return{order:ee,sortBy:$,comparer:N}},"unpackObjectSorter"),v=t(function(C){return t(a(function I(k,te,ee,$,N,_,Q){var K,oe;if(typeof k=="string")K=_[k],oe=Q[k];else if(typeof k=="function")K=k(_),oe=k(Q);else{var he=S(k);return I(he.sortBy,te,ee,he.order,he.comparer||C,_,Q)}var de=N(K,oe,$);return(de===0||K==null&&oe==null)&&te.length>ee?I(te[ee],te,ee+1,$,N,_,Q):de},"n"),"multiPropertySorter")},"multiPropertySorterProvider");function O(C,I,k){if(C===void 0||C===!0)return function($,N){return I($,N,k)};if(typeof C=="string")return i(C.includes("."),"String syntax not allowed for nested properties."),function($,N){return I($[C],N[C],k)};if(typeof C=="function")return function($,N){return I(C($),C(N),k)};if(Array.isArray(C)){var te=v(I);return function($,N){return te(C[0],C,1,k,I,$,N)}}var ee=S(C);return O(ee.sortBy,ee.comparer||I,ee.order)}a(O,"w"),t(O,"getSortStrategy");var G=t(function(C,I,k,te){var ee;return Array.isArray(I)?(Array.isArray(k)&&k.length<2&&(ee=k,k=ee[0]),I.sort(O(k,te,C))):I},"sortArray");function U(C){var I=o(C.comparer);return function(k){var te=Array.isArray(k)&&!C.inPlaceSorting?k.slice():k;return{asc:t(function(ee){return G(1,te,ee,I)},"asc"),desc:t(function(ee){return G(-1,te,ee,I)},"desc"),by:t(function(ee){return G(1,te,ee,I)},"by")}}}a(U,"s"),t(U,"createNewSortInstance");var L=t(function(C,I,k){return C==null?k:I==null?-k:typeof C!=typeof I?typeof C<typeof I?-1:1:C<I?-1:C>I?1:0},"defaultComparer"),w=U({comparer:L}),X=U({comparer:L,inPlaceSorting:!0});e.createNewSortInstance=U,e.defaultComparer=L,e.inPlaceSort=X,e.sort=w}}),_t=Oe({"@socketsecurity/lib/dist/external/semver.js"(e,r){"use strict";var t=Object.defineProperty,o=a((j,y)=>t(j,"name",{value:y,configurable:!0}),"o"),i=a((j,y)=>()=>(y||j((y={exports:{}}).exports,y),y.exports),"p"),S=i((j,y)=>{"use strict";var u="2.0.0",g=Number.MAX_SAFE_INTEGER||9007199254740991,p=16,l=250,m=["major","premajor","minor","preminor","patch","prepatch","prerelease"];y.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:p,MAX_SAFE_BUILD_LENGTH:l,MAX_SAFE_INTEGER:g,RELEASE_TYPES:m,SEMVER_SPEC_VERSION:u,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}}),v=i((j,y)=>{"use strict";var u=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...g)=>{}:()=>{};y.exports=u}),O=i((j,y)=>{"use strict";var{MAX_SAFE_COMPONENT_LENGTH:u,MAX_SAFE_BUILD_LENGTH:g,MAX_LENGTH:p}=S(),l=v();j=y.exports={};var m=j.re=[],T=j.safeRe=[],n=j.src=[],A=j.safeSrc=[],c=j.t={},s=0,d="[a-zA-Z0-9-]",f=[["\\s",1],["\\d",p],[d,g]],P=o(Y=>{for(let[W,Z]of f)Y=Y.split(`${W}*`).join(`${W}{0,${Z}}`).split(`${W}+`).join(`${W}{1,${Z}}`);return Y},"makeSafeRegex"),h=o((Y,W,Z)=>{let pe=P(W),fe=s++;l(Y,fe,W),c[Y]=fe,n[fe]=W,A[fe]=pe,m[fe]=new RegExp(W,Z?"g":void 0),T[fe]=new RegExp(pe,Z?"g":void 0)},"createToken");h("NUMERICIDENTIFIER","0|[1-9]\\d*"),h("NUMERICIDENTIFIERLOOSE","\\d+"),h("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${d}*`),h("MAINVERSION",`(${n[c.NUMERICIDENTIFIER]})\\.(${n[c.NUMERICIDENTIFIER]})\\.(${n[c.NUMERICIDENTIFIER]})`),h("MAINVERSIONLOOSE",`(${n[c.NUMERICIDENTIFIERLOOSE]})\\.(${n[c.NUMERICIDENTIFIERLOOSE]})\\.(${n[c.NUMERICIDENTIFIERLOOSE]})`),h("PRERELEASEIDENTIFIER",`(?:${n[c.NONNUMERICIDENTIFIER]}|${n[c.NUMERICIDENTIFIER]})`),h("PRERELEASEIDENTIFIERLOOSE",`(?:${n[c.NONNUMERICIDENTIFIER]}|${n[c.NUMERICIDENTIFIERLOOSE]})`),h("PRERELEASE",`(?:-(${n[c.PRERELEASEIDENTIFIER]}(?:\\.${n[c.PRERELEASEIDENTIFIER]})*))`),h("PRERELEASELOOSE",`(?:-?(${n[c.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${n[c.PRERELEASEIDENTIFIERLOOSE]})*))`),h("BUILDIDENTIFIER",`${d}+`),h("BUILD",`(?:\\+(${n[c.BUILDIDENTIFIER]}(?:\\.${n[c.BUILDIDENTIFIER]})*))`),h("FULLPLAIN",`v?${n[c.MAINVERSION]}${n[c.PRERELEASE]}?${n[c.BUILD]}?`),h("FULL",`^${n[c.FULLPLAIN]}$`),h("LOOSEPLAIN",`[v=\\s]*${n[c.MAINVERSIONLOOSE]}${n[c.PRERELEASELOOSE]}?${n[c.BUILD]}?`),h("LOOSE",`^${n[c.LOOSEPLAIN]}$`),h("GTLT","((?:<|>)?=?)"),h("XRANGEIDENTIFIERLOOSE",`${n[c.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`),h("XRANGEIDENTIFIER",`${n[c.NUMERICIDENTIFIER]}|x|X|\\*`),h("XRANGEPLAIN",`[v=\\s]*(${n[c.XRANGEIDENTIFIER]})(?:\\.(${n[c.XRANGEIDENTIFIER]})(?:\\.(${n[c.XRANGEIDENTIFIER]})(?:${n[c.PRERELEASE]})?${n[c.BUILD]}?)?)?`),h("XRANGEPLAINLOOSE",`[v=\\s]*(${n[c.XRANGEIDENTIFIERLOOSE]})(?:\\.(${n[c.XRANGEIDENTIFIERLOOSE]})(?:\\.(${n[c.XRANGEIDENTIFIERLOOSE]})(?:${n[c.PRERELEASELOOSE]})?${n[c.BUILD]}?)?)?`),h("XRANGE",`^${n[c.GTLT]}\\s*${n[c.XRANGEPLAIN]}$`),h("XRANGELOOSE",`^${n[c.GTLT]}\\s*${n[c.XRANGEPLAINLOOSE]}$`),h("COERCEPLAIN",`(^|[^\\d])(\\d{1,${u}})(?:\\.(\\d{1,${u}}))?(?:\\.(\\d{1,${u}}))?`),h("COERCE",`${n[c.COERCEPLAIN]}(?:$|[^\\d])`),h("COERCEFULL",n[c.COERCEPLAIN]+`(?:${n[c.PRERELEASE]})?(?:${n[c.BUILD]})?(?:$|[^\\d])`),h("COERCERTL",n[c.COERCE],!0),h("COERCERTLFULL",n[c.COERCEFULL],!0),h("LONETILDE","(?:~>?)"),h("TILDETRIM",`(\\s*)${n[c.LONETILDE]}\\s+`,!0),j.tildeTrimReplace="$1~",h("TILDE",`^${n[c.LONETILDE]}${n[c.XRANGEPLAIN]}$`),h("TILDELOOSE",`^${n[c.LONETILDE]}${n[c.XRANGEPLAINLOOSE]}$`),h("LONECARET","(?:\\^)"),h("CARETTRIM",`(\\s*)${n[c.LONECARET]}\\s+`,!0),j.caretTrimReplace="$1^",h("CARET",`^${n[c.LONECARET]}${n[c.XRANGEPLAIN]}$`),h("CARETLOOSE",`^${n[c.LONECARET]}${n[c.XRANGEPLAINLOOSE]}$`),h("COMPARATORLOOSE",`^${n[c.GTLT]}\\s*(${n[c.LOOSEPLAIN]})$|^$`),h("COMPARATOR",`^${n[c.GTLT]}\\s*(${n[c.FULLPLAIN]})$|^$`),h("COMPARATORTRIM",`(\\s*)${n[c.GTLT]}\\s*(${n[c.LOOSEPLAIN]}|${n[c.XRANGEPLAIN]})`,!0),j.comparatorTrimReplace="$1$2$3",h("HYPHENRANGE",`^\\s*(${n[c.XRANGEPLAIN]})\\s+-\\s+(${n[c.XRANGEPLAIN]})\\s*$`),h("HYPHENRANGELOOSE",`^\\s*(${n[c.XRANGEPLAINLOOSE]})\\s+-\\s+(${n[c.XRANGEPLAINLOOSE]})\\s*$`),h("STAR","(<|>)?=?\\s*\\*"),h("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$"),h("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")}),G=i((j,y)=>{"use strict";var u=Object.freeze({loose:!0}),g=Object.freeze({}),p=o(l=>l?typeof l!="object"?u:l:g,"parseOptions");y.exports=p}),U=i((j,y)=>{"use strict";var u=/^[0-9]+$/,g=o((l,m)=>{let T=u.test(l),n=u.test(m);return T&&n&&(l=+l,m=+m),l===m?0:T&&!n?-1:n&&!T?1:l<m?-1:1},"compareIdentifiers"),p=o((l,m)=>g(m,l),"rcompareIdentifiers");y.exports={compareIdentifiers:g,rcompareIdentifiers:p}}),L=i((j,y)=>{"use strict";var u=v(),{MAX_LENGTH:g,MAX_SAFE_INTEGER:p}=S(),{safeRe:l,t:m}=O(),T=G(),{compareIdentifiers:n}=U(),A=class Ee{static{a(this,"t")}static{o(this,"SemVer")}constructor(s,d){if(d=T(d),s instanceof Ee){if(s.loose===!!d.loose&&s.includePrerelease===!!d.includePrerelease)return s;s=s.version}else if(typeof s!="string")throw new TypeError(`Invalid version. Must be a string. Got type "${typeof s}".`);if(s.length>g)throw new TypeError(`version is longer than ${g} characters`);u("SemVer",s,d),this.options=d,this.loose=!!d.loose,this.includePrerelease=!!d.includePrerelease;let f=s.trim().match(d.loose?l[m.LOOSE]:l[m.FULL]);if(!f)throw new TypeError(`Invalid Version: ${s}`);if(this.raw=s,this.major=+f[1],this.minor=+f[2],this.patch=+f[3],this.major>p||this.major<0)throw new TypeError("Invalid major version");if(this.minor>p||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>p||this.patch<0)throw new TypeError("Invalid patch version");f[4]?this.prerelease=f[4].split(".").map(P=>{if(/^[0-9]+$/.test(P)){let h=+P;if(h>=0&&h<p)return h}return P}):this.prerelease=[],this.build=f[5]?f[5].split("."):[],this.format()}format(){return this.version=`${this.major}.${this.minor}.${this.patch}`,this.prerelease.length&&(this.version+=`-${this.prerelease.join(".")}`),this.version}toString(){return this.version}compare(s){if(u("SemVer.compare",this.version,this.options,s),!(s instanceof Ee)){if(typeof s=="string"&&s===this.version)return 0;s=new Ee(s,this.options)}return s.version===this.version?0:this.compareMain(s)||this.comparePre(s)}compareMain(s){return s instanceof Ee||(s=new Ee(s,this.options)),n(this.major,s.major)||n(this.minor,s.minor)||n(this.patch,s.patch)}comparePre(s){if(s instanceof Ee||(s=new Ee(s,this.options)),this.prerelease.length&&!s.prerelease.length)return-1;if(!this.prerelease.length&&s.prerelease.length)return 1;if(!this.prerelease.length&&!s.prerelease.length)return 0;let d=0;do{let f=this.prerelease[d],P=s.prerelease[d];if(u("prerelease compare",d,f,P),f===void 0&&P===void 0)return 0;if(P===void 0)return 1;if(f===void 0)return-1;if(f!==P)return n(f,P)}while(++d)}compareBuild(s){s instanceof Ee||(s=new Ee(s,this.options));let d=0;do{let f=this.build[d],P=s.build[d];if(u("build compare",d,f,P),f===void 0&&P===void 0)return 0;if(P===void 0)return 1;if(f===void 0)return-1;if(f!==P)return n(f,P)}while(++d)}inc(s,d,f){if(s.startsWith("pre")){if(!d&&f===!1)throw new Error("invalid increment argument: identifier is empty");if(d){let P=`-${d}`.match(this.options.loose?l[m.PRERELEASELOOSE]:l[m.PRERELEASE]);if(!P||P[1]!==d)throw new Error(`invalid identifier: ${d}`)}}switch(s){case"premajor":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc("pre",d,f);break;case"preminor":this.prerelease.length=0,this.patch=0,this.minor++,this.inc("pre",d,f);break;case"prepatch":this.prerelease.length=0,this.inc("patch",d,f),this.inc("pre",d,f);break;case"prerelease":this.prerelease.length===0&&this.inc("patch",d,f),this.inc("pre",d,f);break;case"release":if(this.prerelease.length===0)throw new Error(`version ${this.raw} is not a prerelease`);this.prerelease.length=0;break;case"major":(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case"minor":(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case"patch":this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case"pre":{let P=Number(f)?1:0;if(this.prerelease.length===0)this.prerelease=[P];else{let h=this.prerelease.length;for(;--h>=0;)typeof this.prerelease[h]=="number"&&(this.prerelease[h]++,h=-2);if(h===-1){if(d===this.prerelease.join(".")&&f===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(P)}}if(d){let h=[d,P];f===!1&&(h=[d]),n(this.prerelease[0],d)===0?isNaN(this.prerelease[1])&&(this.prerelease=h):this.prerelease=h}break}default:throw new Error(`invalid increment argument: ${s}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}};y.exports=A}),w=i((j,y)=>{"use strict";var u=L(),g=o((p,l,m=!1)=>{if(p instanceof u)return p;try{return new u(p,l)}catch(T){if(!m)return null;throw T}},"parse");y.exports=g}),X=i((j,y)=>{"use strict";var u=w(),g=o((p,l)=>{let m=u(p,l);return m?m.version:null},"valid");y.exports=g}),C=i((j,y)=>{"use strict";var u=w(),g=o((p,l)=>{let m=u(p.trim().replace(/^[=v]+/,""),l);return m?m.version:null},"clean");y.exports=g}),I=i((j,y)=>{"use strict";var u=L(),g=o((p,l,m,T,n)=>{typeof m=="string"&&(n=T,T=m,m=void 0);try{return new u(p instanceof u?p.version:p,m).inc(l,T,n).version}catch{return null}},"inc");y.exports=g}),k=i((j,y)=>{"use strict";var u=w(),g=o((p,l)=>{let m=u(p,null,!0),T=u(l,null,!0),n=m.compare(T);if(n===0)return null;let A=n>0,c=A?m:T,s=A?T:m,d=!!c.prerelease.length;if(s.prerelease.length&&!d){if(!s.patch&&!s.minor)return"major";if(s.compareMain(c)===0)return s.minor&&!s.patch?"minor":"patch"}let f=d?"pre":"";return m.major!==T.major?f+"major":m.minor!==T.minor?f+"minor":m.patch!==T.patch?f+"patch":"prerelease"},"diff");y.exports=g}),te=i((j,y)=>{"use strict";var u=L(),g=o((p,l)=>new u(p,l).major,"major");y.exports=g}),ee=i((j,y)=>{"use strict";var u=L(),g=o((p,l)=>new u(p,l).minor,"minor");y.exports=g}),$=i((j,y)=>{"use strict";var u=L(),g=o((p,l)=>new u(p,l).patch,"patch");y.exports=g}),N=i((j,y)=>{"use strict";var u=w(),g=o((p,l)=>{let m=u(p,l);return m&&m.prerelease.length?m.prerelease:null},"prerelease");y.exports=g}),_=i((j,y)=>{"use strict";var u=L(),g=o((p,l,m)=>new u(p,m).compare(new u(l,m)),"compare");y.exports=g}),Q=i((j,y)=>{"use strict";var u=_(),g=o((p,l,m)=>u(l,p,m),"rcompare");y.exports=g}),K=i((j,y)=>{"use strict";var u=_(),g=o((p,l)=>u(p,l,!0),"compareLoose");y.exports=g}),oe=i((j,y)=>{"use strict";var u=L(),g=o((p,l,m)=>{let T=new u(p,m),n=new u(l,m);return T.compare(n)||T.compareBuild(n)},"compareBuild");y.exports=g}),he=i((j,y)=>{"use strict";var u=oe(),g=o((p,l)=>p.sort((m,T)=>u(m,T,l)),"sort");y.exports=g}),de=i((j,y)=>{"use strict";var u=oe(),g=o((p,l)=>p.sort((m,T)=>u(T,m,l)),"rsort");y.exports=g}),Me=i((j,y)=>{"use strict";var u=_(),g=o((p,l,m)=>u(p,l,m)>0,"gt");y.exports=g}),De=i((j,y)=>{"use strict";var u=_(),g=o((p,l,m)=>u(p,l,m)<0,"lt");y.exports=g}),Be=i((j,y)=>{"use strict";var u=_(),g=o((p,l,m)=>u(p,l,m)===0,"eq");y.exports=g}),Ge=i((j,y)=>{"use strict";var u=_(),g=o((p,l,m)=>u(p,l,m)!==0,"neq");y.exports=g}),Ae=i((j,y)=>{"use strict";var u=_(),g=o((p,l,m)=>u(p,l,m)>=0,"gte");y.exports=g}),Je=i((j,y)=>{"use strict";var u=_(),g=o((p,l,m)=>u(p,l,m)<=0,"lte");y.exports=g}),Ye=i((j,y)=>{"use strict";var u=Be(),g=Ge(),p=Me(),l=Ae(),m=De(),T=Je(),n=o((A,c,s,d)=>{switch(c){case"===":return typeof A=="object"&&(A=A.version),typeof s=="object"&&(s=s.version),A===s;case"!==":return typeof A=="object"&&(A=A.version),typeof s=="object"&&(s=s.version),A!==s;case"":case"=":case"==":return u(A,s,d);case"!=":return g(A,s,d);case">":return p(A,s,d);case">=":return l(A,s,d);case"<":return m(A,s,d);case"<=":return T(A,s,d);default:throw new TypeError(`Invalid operator: ${c}`)}},"cmp");y.exports=n}),ir=i((j,y)=>{"use strict";var u=L(),g=w(),{safeRe:p,t:l}=O(),m=o((T,n)=>{if(T instanceof u)return T;if(typeof T=="number"&&(T=String(T)),typeof T!="string")return null;n=n||{};let A=null;if(!n.rtl)A=T.match(n.includePrerelease?p[l.COERCEFULL]:p[l.COERCE]);else{let h=n.includePrerelease?p[l.COERCERTLFULL]:p[l.COERCERTL],Y;for(;(Y=h.exec(T))&&(!A||A.index+A[0].length!==T.length);)(!A||Y.index+Y[0].length!==A.index+A[0].length)&&(A=Y),h.lastIndex=Y.index+Y[1].length+Y[2].length;h.lastIndex=-1}if(A===null)return null;let c=A[2],s=A[3]||"0",d=A[4]||"0",f=n.includePrerelease&&A[5]?`-${A[5]}`:"",P=n.includePrerelease&&A[6]?`+${A[6]}`:"";return g(`${c}.${s}.${d}${f}${P}`,n)},"coerce");y.exports=m}),sr=i((j,y)=>{"use strict";var u=class{static{a(this,"te")}static{o(this,"LRUCache")}constructor(){this.max=1e3,this.map=new Map}get(g){let p=this.map.get(g);if(p!==void 0)return this.map.delete(g),this.map.set(g,p),p}delete(g){return this.map.delete(g)}set(g,p){if(!this.delete(g)&&p!==void 0){if(this.map.size>=this.max){let l=this.map.keys().next().value;this.delete(l)}this.map.set(g,p)}return this}};y.exports=u}),Se=i((j,y)=>{"use strict";var u=/\s+/g,g=class tr{static{a(this,"t")}static{o(this,"Range")}constructor(b,F){if(F=m(F),b instanceof tr)return b.loose===!!F.loose&&b.includePrerelease===!!F.includePrerelease?b:new tr(b.raw,F);if(b instanceof T)return this.raw=b.value,this.set=[[b]],this.formatted=void 0,this;if(this.options=F,this.loose=!!F.loose,this.includePrerelease=!!F.includePrerelease,this.raw=b.trim().replace(u," "),this.set=this.raw.split("||").map(M=>this.parseRange(M.trim())).filter(M=>M.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let M=this.set[0];if(this.set=this.set.filter(B=>!W(B[0])),this.set.length===0)this.set=[M];else if(this.set.length>1){for(let B of this.set)if(B.length===1&&Z(B[0])){this.set=[B];break}}}this.formatted=void 0}get range(){if(this.formatted===void 0){this.formatted="";for(let b=0;b<this.set.length;b++){b>0&&(this.formatted+="||");let F=this.set[b];for(let M=0;M<F.length;M++)M>0&&(this.formatted+=" "),this.formatted+=F[M].toString().trim()}}return this.formatted}format(){return this.range}toString(){return this.range}parseRange(b){let F=((this.options.includePrerelease&&h)|(this.options.loose&&Y))+":"+b,M=l.get(F);if(M)return M;let B=this.options.loose,D=B?c[s.HYPHENRANGELOOSE]:c[s.HYPHENRANGE];b=b.replace(D,Et(this.options.includePrerelease)),n("hyphen replace",b),b=b.replace(c[s.COMPARATORTRIM],d),n("comparator trim",b),b=b.replace(c[s.TILDETRIM],f),n("tilde trim",b),b=b.replace(c[s.CARETTRIM],P),n("caret trim",b);let J=b.split(" ").map(se=>fe(se,this.options)).join(" ").split(/\s+/).map(se=>wt(se,this.options));B&&(J=J.filter(se=>(n("loose invalid filter",se,this.options),!!se.match(c[s.COMPARATORLOOSE])))),n("range list",J);let ae=new Map,re=J.map(se=>new T(se,this.options));for(let se of re){if(W(se))return[se];ae.set(se.value,se)}ae.size>1&&ae.has("")&&ae.delete("");let ie=[...ae.values()];return l.set(F,ie),ie}intersects(b,F){if(!(b instanceof tr))throw new TypeError("a Range is required");return this.set.some(M=>pe(M,F)&&b.set.some(B=>pe(B,F)&&M.every(D=>B.every(J=>D.intersects(J,F)))))}test(b){if(!b)return!1;if(typeof b=="string")try{b=new A(b,this.options)}catch{return!1}for(let F=0;F<this.set.length;F++)if(Tt(this.set[F],b,this.options))return!0;return!1}};y.exports=g;var p=sr(),l=new p,m=G(),T=Pe(),n=v(),A=L(),{safeRe:c,t:s,comparatorTrimReplace:d,tildeTrimReplace:f,caretTrimReplace:P}=O(),{FLAG_INCLUDE_PRERELEASE:h,FLAG_LOOSE:Y}=S(),W=o(R=>R.value==="<0.0.0-0","isNullSet"),Z=o(R=>R.value==="","isAny"),pe=o((R,b)=>{let F=!0,M=R.slice(),B=M.pop();for(;F&&M.length;)F=M.every(D=>B.intersects(D,b)),B=M.pop();return F},"isSatisfiable"),fe=o((R,b)=>(n("comp",R,b),R=ue(R,b),n("caret",R),R=je(R,b),n("tildes",R),R=q(R,b),n("xrange",R),R=Pt(R,b),n("stars",R),R),"parseComparator"),ce=o(R=>!R||R.toLowerCase()==="x"||R==="*","isX"),je=o((R,b)=>R.trim().split(/\s+/).map(F=>ve(F,b)).join(" "),"replaceTildes"),ve=o((R,b)=>{let F=b.loose?c[s.TILDELOOSE]:c[s.TILDE];return R.replace(F,(M,B,D,J,ae)=>{n("tilde",R,M,B,D,J,ae);let re;return ce(B)?re="":ce(D)?re=`>=${B}.0.0 <${+B+1}.0.0-0`:ce(J)?re=`>=${B}.${D}.0 <${B}.${+D+1}.0-0`:ae?(n("replaceTilde pr",ae),re=`>=${B}.${D}.${J}-${ae} <${B}.${+D+1}.0-0`):re=`>=${B}.${D}.${J} <${B}.${+D+1}.0-0`,n("tilde return",re),re})},"replaceTilde"),ue=o((R,b)=>R.trim().split(/\s+/).map(F=>ge(F,b)).join(" "),"replaceCarets"),ge=o((R,b)=>{n("caret",R,b);let F=b.loose?c[s.CARETLOOSE]:c[s.CARET],M=b.includePrerelease?"-0":"";return R.replace(F,(B,D,J,ae,re)=>{n("caret",R,B,D,J,ae,re);let ie;return ce(D)?ie="":ce(J)?ie=`>=${D}.0.0${M} <${+D+1}.0.0-0`:ce(ae)?D==="0"?ie=`>=${D}.${J}.0${M} <${D}.${+J+1}.0-0`:ie=`>=${D}.${J}.0${M} <${+D+1}.0.0-0`:re?(n("replaceCaret pr",re),D==="0"?J==="0"?ie=`>=${D}.${J}.${ae}-${re} <${D}.${J}.${+ae+1}-0`:ie=`>=${D}.${J}.${ae}-${re} <${D}.${+J+1}.0-0`:ie=`>=${D}.${J}.${ae}-${re} <${+D+1}.0.0-0`):(n("no pr"),D==="0"?J==="0"?ie=`>=${D}.${J}.${ae}${M} <${D}.${J}.${+ae+1}-0`:ie=`>=${D}.${J}.${ae}${M} <${D}.${+J+1}.0-0`:ie=`>=${D}.${J}.${ae} <${+D+1}.0.0-0`),n("caret return",ie),ie})},"replaceCaret"),q=o((R,b)=>(n("replaceXRanges",R,b),R.split(/\s+/).map(F=>dr(F,b)).join(" ")),"replaceXRanges"),dr=o((R,b)=>{R=R.trim();let F=b.loose?c[s.XRANGELOOSE]:c[s.XRANGE];return R.replace(F,(M,B,D,J,ae,re)=>{n("xRange",R,M,B,D,J,ae,re);let ie=ce(D),se=ie||ce(J),$e=se||ce(ae),ze=$e;return B==="="&&ze&&(B=""),re=b.includePrerelease?"-0":"",ie?B===">"||B==="<"?M="<0.0.0-0":M="*":B&&ze?(se&&(J=0),ae=0,B===">"?(B=">=",se?(D=+D+1,J=0,ae=0):(J=+J+1,ae=0)):B==="<="&&(B="<",se?D=+D+1:J=+J+1),B==="<"&&(re="-0"),M=`${B+D}.${J}.${ae}${re}`):se?M=`>=${D}.0.0${re} <${+D+1}.0.0-0`:$e&&(M=`>=${D}.${J}.0${re} <${D}.${+J+1}.0-0`),n("xRange return",M),M})},"replaceXRange"),Pt=o((R,b)=>(n("replaceStars",R,b),R.trim().replace(c[s.STAR],"")),"replaceStars"),wt=o((R,b)=>(n("replaceGTE0",R,b),R.trim().replace(c[b.includePrerelease?s.GTE0PRE:s.GTE0],"")),"replaceGTE0"),Et=o(R=>(b,F,M,B,D,J,ae,re,ie,se,$e,ze)=>(ce(M)?F="":ce(B)?F=`>=${M}.0.0${R?"-0":""}`:ce(D)?F=`>=${M}.${B}.0${R?"-0":""}`:J?F=`>=${F}`:F=`>=${F}${R?"-0":""}`,ce(ie)?re="":ce(se)?re=`<${+ie+1}.0.0-0`:ce($e)?re=`<${ie}.${+se+1}.0-0`:ze?re=`<=${ie}.${se}.${$e}-${ze}`:R?re=`<${ie}.${se}.${+$e+1}-0`:re=`<=${re}`,`${F} ${re}`.trim()),"hyphenReplace"),Tt=o((R,b,F)=>{for(let M=0;M<R.length;M++)if(!R[M].test(b))return!1;if(b.prerelease.length&&!F.includePrerelease){for(let M=0;M<R.length;M++)if(n(R[M].semver),R[M].semver!==T.ANY&&R[M].semver.prerelease.length>0){let B=R[M].semver;if(B.major===b.major&&B.minor===b.minor&&B.patch===b.patch)return!0}return!1}return!0},"testSet")}),Pe=i((j,y)=>{"use strict";var u=Symbol("SemVer ANY"),g=class gr{static{a(this,"t")}static{o(this,"Comparator")}static get ANY(){return u}constructor(d,f){if(f=p(f),d instanceof gr){if(d.loose===!!f.loose)return d;d=d.value}d=d.trim().split(/\s+/).join(" "),n("comparator",d,f),this.options=f,this.loose=!!f.loose,this.parse(d),this.semver===u?this.value="":this.value=this.operator+this.semver.version,n("comp",this)}parse(d){let f=this.options.loose?l[m.COMPARATORLOOSE]:l[m.COMPARATOR],P=d.match(f);if(!P)throw new TypeError(`Invalid comparator: ${d}`);this.operator=P[1]!==void 0?P[1]:"",this.operator==="="&&(this.operator=""),P[2]?this.semver=new A(P[2],this.options.loose):this.semver=u}toString(){return this.value}test(d){if(n("Comparator.test",d,this.options.loose),this.semver===u||d===u)return!0;if(typeof d=="string")try{d=new A(d,this.options)}catch{return!1}return T(d,this.operator,this.semver,this.options)}intersects(d,f){if(!(d instanceof gr))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new c(d.value,f).test(this.value):d.operator===""?d.value===""?!0:new c(this.value,f).test(d.semver):(f=p(f),f.includePrerelease&&(this.value==="<0.0.0-0"||d.value==="<0.0.0-0")||!f.includePrerelease&&(this.value.startsWith("<0.0.0")||d.value.startsWith("<0.0.0"))?!1:!!(this.operator.startsWith(">")&&d.operator.startsWith(">")||this.operator.startsWith("<")&&d.operator.startsWith("<")||this.semver.version===d.semver.version&&this.operator.includes("=")&&d.operator.includes("=")||T(this.semver,"<",d.semver,f)&&this.operator.startsWith(">")&&d.operator.startsWith("<")||T(this.semver,">",d.semver,f)&&this.operator.startsWith("<")&&d.operator.startsWith(">")))}};y.exports=g;var p=G(),{safeRe:l,t:m}=O(),T=Ye(),n=v(),A=L(),c=Se()}),_e=i((j,y)=>{"use strict";var u=Se(),g=o((p,l,m)=>{try{l=new u(l,m)}catch{return!1}return l.test(p)},"satisfies");y.exports=g}),lr=i((j,y)=>{"use strict";var u=Se(),g=o((p,l)=>new u(p,l).set.map(m=>m.map(T=>T.value).join(" ").trim().split(" ")),"toComparators");y.exports=g}),Ue=i((j,y)=>{"use strict";var u=L(),g=Se(),p=o((l,m,T)=>{let n=null,A=null,c=null;try{c=new g(m,T)}catch{return null}return l.forEach(s=>{c.test(s)&&(!n||A.compare(s)===-1)&&(n=s,A=new u(n,T))}),n},"maxSatisfying");y.exports=p}),cr=i((j,y)=>{"use strict";var u=L(),g=Se(),p=o((l,m,T)=>{let n=null,A=null,c=null;try{c=new g(m,T)}catch{return null}return l.forEach(s=>{c.test(s)&&(!n||A.compare(s)===1)&&(n=s,A=new u(n,T))}),n},"minSatisfying");y.exports=p}),ur=i((j,y)=>{"use strict";var u=L(),g=Se(),p=Me(),l=o((m,T)=>{m=new g(m,T);let n=new u("0.0.0");if(m.test(n)||(n=new u("0.0.0-0"),m.test(n)))return n;n=null;for(let A=0;A<m.set.length;++A){let c=m.set[A],s=null;c.forEach(d=>{let f=new u(d.semver.version);switch(d.operator){case">":f.prerelease.length===0?f.patch++:f.prerelease.push(0),f.raw=f.format();case"":case">=":(!s||p(f,s))&&(s=f);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${d.operator}`)}}),s&&(!n||p(n,s))&&(n=s)}return n&&m.test(n)?n:null},"minVersion");y.exports=l}),xe=i((j,y)=>{"use strict";var u=Se(),g=o((p,l)=>{try{return new u(p,l).range||"*"}catch{return null}},"validRange");y.exports=g}),Re=i((j,y)=>{"use strict";var u=L(),g=Pe(),{ANY:p}=g,l=Se(),m=_e(),T=Me(),n=De(),A=Je(),c=Ae(),s=o((d,f,P,h)=>{d=new u(d,h),f=new l(f,h);let Y,W,Z,pe,fe;switch(P){case">":Y=T,W=A,Z=n,pe=">",fe=">=";break;case"<":Y=n,W=c,Z=T,pe="<",fe="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(m(d,f,h))return!1;for(let ce=0;ce<f.set.length;++ce){let je=f.set[ce],ve=null,ue=null;if(je.forEach(ge=>{ge.semver===p&&(ge=new g(">=0.0.0")),ve=ve||ge,ue=ue||ge,Y(ge.semver,ve.semver,h)?ve=ge:Z(ge.semver,ue.semver,h)&&(ue=ge)}),ve.operator===pe||ve.operator===fe||(!ue.operator||ue.operator===pe)&&W(d,ue.semver)||ue.operator===fe&&Z(d,ue.semver))return!1}return!0},"outside");y.exports=s}),E=i((j,y)=>{"use strict";var u=Re(),g=o((p,l,m)=>u(p,l,">",m),"gtr");y.exports=g}),x=i((j,y)=>{"use strict";var u=Re(),g=o((p,l,m)=>u(p,l,"<",m),"ltr");y.exports=g}),H=i((j,y)=>{"use strict";var u=Se(),g=o((p,l,m)=>(p=new u(p,m),l=new u(l,m),p.intersects(l,m)),"intersects");y.exports=g}),z=i((j,y)=>{"use strict";var u=_e(),g=_();y.exports=(p,l,m)=>{let T=[],n=null,A=null,c=p.sort((P,h)=>g(P,h,m));for(let P of c)u(P,l,m)?(A=P,n||(n=P)):(A&&T.push([n,A]),A=null,n=null);n&&T.push([n,null]);let s=[];for(let[P,h]of T)P===h?s.push(P):!h&&P===c[0]?s.push("*"):h?P===c[0]?s.push(`<=${h}`):s.push(`${P} - ${h}`):s.push(`>=${P}`);let d=s.join(" || "),f=typeof l.raw=="string"?l.raw:String(l);return d.length<f.length?d:l}}),ne=i((j,y)=>{"use strict";var u=Se(),g=Pe(),{ANY:p}=g,l=_e(),m=_(),T=o((f,P,h={})=>{if(f===P)return!0;f=new u(f,h),P=new u(P,h);let Y=!1;e:for(let W of f.set){for(let Z of P.set){let pe=c(W,Z,h);if(Y=Y||pe!==null,pe)continue e}if(Y)return!1}return!0},"subset"),n=[new g(">=0.0.0-0")],A=[new g(">=0.0.0")],c=o((f,P,h)=>{if(f===P)return!0;if(f.length===1&&f[0].semver===p){if(P.length===1&&P[0].semver===p)return!0;h.includePrerelease?f=n:f=A}if(P.length===1&&P[0].semver===p){if(h.includePrerelease)return!0;P=A}let Y=new Set,W,Z;for(let q of f)q.operator===">"||q.operator===">="?W=s(W,q,h):q.operator==="<"||q.operator==="<="?Z=d(Z,q,h):Y.add(q.semver);if(Y.size>1)return null;let pe;if(W&&Z&&(pe=m(W.semver,Z.semver,h),pe>0||pe===0&&(W.operator!==">="||Z.operator!=="<=")))return null;for(let q of Y){if(W&&!l(q,String(W),h)||Z&&!l(q,String(Z),h))return null;for(let dr of P)if(!l(q,String(dr),h))return!1;return!0}let fe,ce,je,ve,ue=Z&&!h.includePrerelease&&Z.semver.prerelease.length?Z.semver:!1,ge=W&&!h.includePrerelease&&W.semver.prerelease.length?W.semver:!1;ue&&ue.prerelease.length===1&&Z.operator==="<"&&ue.prerelease[0]===0&&(ue=!1);for(let q of P){if(ve=ve||q.operator===">"||q.operator===">=",je=je||q.operator==="<"||q.operator==="<=",W){if(ge&&q.semver.prerelease&&q.semver.prerelease.length&&q.semver.major===ge.major&&q.semver.minor===ge.minor&&q.semver.patch===ge.patch&&(ge=!1),q.operator===">"||q.operator===">="){if(fe=s(W,q,h),fe===q&&fe!==W)return!1}else if(W.operator===">="&&!l(W.semver,String(q),h))return!1}if(Z){if(ue&&q.semver.prerelease&&q.semver.prerelease.length&&q.semver.major===ue.major&&q.semver.minor===ue.minor&&q.semver.patch===ue.patch&&(ue=!1),q.operator==="<"||q.operator==="<="){if(ce=d(Z,q,h),ce===q&&ce!==Z)return!1}else if(Z.operator==="<="&&!l(Z.semver,String(q),h))return!1}if(!q.operator&&(Z||W)&&pe!==0)return!1}return!(W&&je&&!Z&&pe!==0||Z&&ve&&!W&&pe!==0||ge||ue)},"simpleSubset"),s=o((f,P,h)=>{if(!f)return P;let Y=m(f.semver,P.semver,h);return Y>0?f:Y<0||P.operator===">"&&f.operator===">="?P:f},"higherGT"),d=o((f,P,h)=>{if(!f)return P;let Y=m(f.semver,P.semver,h);return Y<0?f:Y>0||P.operator==="<"&&f.operator==="<="?P:f},"lowerLT");y.exports=T}),le=O(),ye=S(),pr=L(),Ze=U(),er=w(),He=X(),mr=C(),ke=I(),Ce=k(),qe=te(),Hr=ee(),qr=$(),zr=N(),Vr=_(),Wr=Q(),Kr=K(),Xr=oe(),Qr=he(),Yr=de(),Zr=Me(),et=De(),rt=Be(),tt=Ge(),ot=Ae(),at=Je(),nt=Ye(),it=ir(),st=Pe(),lt=Se(),ct=_e(),ut=lr(),pt=Ue(),mt=cr(),dt=ur(),ht=xe(),ft=Re(),gt=E(),yt=x(),St=H(),vt=z(),bt=ne();r.exports={parse:er,valid:He,clean:mr,inc:ke,diff:Ce,major:qe,minor:Hr,patch:qr,prerelease:zr,compare:Vr,rcompare:Wr,compareLoose:Kr,compareBuild:Xr,sort:Qr,rsort:Yr,gt:Zr,lt:et,eq:rt,neq:tt,gte:ot,lte:at,cmp:nt,coerce:it,Comparator:st,Range:lt,satisfies:ct,toComparators:ut,maxSatisfying:pt,minSatisfying:mt,minVersion:dt,validRange:ht,outside:ft,gtr:gt,ltr:yt,intersects:St,simplifyRange:vt,subset:bt,SemVer:pr,re:le.re,src:le.src,tokens:le.t,SEMVER_SPEC_VERSION:ye.SEMVER_SPEC_VERSION,RELEASE_TYPES:ye.RELEASE_TYPES,compareIdentifiers:Ze.compareIdentifiers,rcompareIdentifiers:Ze.rcompareIdentifiers}}}),xt=Oe({"@socketsecurity/lib/dist/sorts.js"(e,r){"use strict";var t=Object.defineProperty,o=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,S=Object.prototype.hasOwnProperty,v=a(($,N)=>{for(var _ in N)t($,_,{get:N[_],enumerable:!0})},"__export2"),O=a(($,N,_,Q)=>{if(N&&typeof N=="object"||typeof N=="function")for(let K of i(N))!S.call($,K)&&K!==_&&t($,K,{get:a(()=>N[K],"get"),enumerable:!(Q=o(N,K))||Q.enumerable});return $},"__copyProps2"),G=a($=>O(t({},"__esModule",{value:!0}),$),"__toCommonJS2"),U={};v(U,{compareSemver:a(()=>ee,"compareSemver"),compareStr:a(()=>te,"compareStr"),localeCompare:a(()=>w,"localeCompare"),naturalCompare:a(()=>C,"naturalCompare"),naturalSorter:a(()=>k,"naturalSorter")}),r.exports=G(U);var L;function w($,N){return L===void 0&&(L=new Intl.Collator().compare),L($,N)}a(w,"localeCompare2");var X;function C($,N){return X===void 0&&(X=new Intl.Collator(void 0,{numeric:!0,sensitivity:"base"}).compare),X($,N)}a(C,"naturalCompare");var I;function k($){return I===void 0&&(I=Dt().createNewSortInstance({comparer:C})),I($)}a(k,"naturalSorter");function te($,N){return $<N?-1:$>N?1:0}a(te,"compareStr");function ee($,N){let _=_t(),Q=_.valid($),K=_.valid(N);return!Q&&!K?0:Q?K?_.compare($,N):1:-1}a(ee,"compareSemver")}}),$t=Oe({"@socketsecurity/lib/dist/objects.js"(e,r){"use strict";var t=Object.defineProperty,o=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,S=Object.prototype.hasOwnProperty,v=a((E,x)=>{for(var H in x)t(E,H,{get:x[H],enumerable:!0})},"__export2"),O=a((E,x,H,z)=>{if(x&&typeof x=="object"||typeof x=="function")for(let ne of i(x))!S.call(E,ne)&&ne!==H&&t(E,ne,{get:a(()=>x[ne],"get"),enumerable:!(z=o(x,ne))||z.enumerable});return E},"__copyProps2"),G=a(E=>O(t({},"__esModule",{value:!0}),E),"__toCommonJS2"),U={};v(U,{createConstantsObject:a(()=>Me,"createConstantsObject"),createLazyGetter:a(()=>de,"createLazyGetter"),defineGetter:a(()=>De,"defineGetter"),defineLazyGetter:a(()=>Be,"defineLazyGetter"),defineLazyGetters:a(()=>Ge,"defineLazyGetters"),entryKeyComparator:a(()=>Ae,"entryKeyComparator"),getKeys:a(()=>Je,"getKeys"),getOwn:a(()=>Ye,"getOwn"),getOwnPropertyValues:a(()=>ir,"getOwnPropertyValues"),hasKeys:a(()=>sr,"hasKeys"),hasOwn:a(()=>Se,"hasOwn"),isObject:a(()=>Pe,"isObject"),isObjectObject:a(()=>_e,"isObjectObject"),merge:a(()=>ur,"merge"),objectAssign:a(()=>lr,"objectAssign"),objectEntries:a(()=>Ue,"objectEntries"),objectFreeze:a(()=>cr,"objectFreeze"),toSortedObject:a(()=>xe,"toSortedObject"),toSortedObjectFromEntries:a(()=>Re,"toSortedObjectFromEntries")}),r.exports=G(U);var L=Lt(),w=Mt(),X=xt(),C=Object.defineProperties,I=Object.defineProperty,k=Object.freeze,te=Object.fromEntries,ee=Object.getOwnPropertyDescriptors,$=Object.getOwnPropertyNames,N=Object.getPrototypeOf,_=Object.hasOwn,Q=Object.keys,K=Object.prototype,oe=Object.setPrototypeOf,he=Reflect.ownKeys;function de(E,x,H){let z=L.UNDEFINED_TOKEN,{[E]:ne}={[E](){return z===L.UNDEFINED_TOKEN&&(H?.initialized?.add(E),z=x()),z}};return ne}a(de,"createLazyGetter");function Me(E,x){let H={__proto__:null,...x},z=k({__proto__:null,getters:H.getters?k(oe(xe(H.getters),null)):void 0,internals:H.internals?k(oe(xe(H.internals),null)):void 0,mixin:H.mixin?k(C({__proto__:null},ee(H.mixin))):void 0,props:E?k(oe(xe(E),null)):void 0}),ne=k({__proto__:null,initialized:new Set}),le=Ge({__proto__:null,[L.kInternalsSymbol]:k({__proto__:null,get attributes(){return z},get lazyGetterStats(){return ne},...z.internals}),kInternalsSymbol:L.kInternalsSymbol,...z.props},z.getters,ne);return z.mixin&&C(le,Re(Ue(ee(z.mixin)).filter(ye=>!_(le,ye[0])))),k(le)}a(Me,"createConstantsObject");function De(E,x,H){return I(E,x,{get:H,enumerable:!1,configurable:!0}),E}a(De,"defineGetter");function Be(E,x,H,z){return De(E,x,de(x,H,z))}a(Be,"defineLazyGetter");function Ge(E,x,H){if(x!==null&&typeof x=="object"){let z=he(x);for(let ne=0,{length:le}=z;ne<le;ne+=1){let ye=z[ne];Be(E,ye,x[ye],H)}}return E}a(Ge,"defineLazyGetters");function Ae(E,x){let H=E[0],z=x[0],ne=typeof H=="string"?H:String(H),le=typeof z=="string"?z:String(z);return(0,X.localeCompare)(ne,le)}a(Ae,"entryKeyComparator");function Je(E){return Pe(E)?Q(E):[]}a(Je,"getKeys");function Ye(E,x){if(E!=null)return _(E,x)?E[x]:void 0}a(Ye,"getOwn");function ir(E){if(E==null)return[];let x=$(E),{length:H}=x,z=Array(H);for(let ne=0;ne<H;ne+=1)z[ne]=E[x[ne]];return z}a(ir,"getOwnPropertyValues");function sr(E){if(E==null)return!1;for(let x in E)if(_(E,x))return!0;return!1}a(sr,"hasKeys");function Se(E,x){return E==null?!1:_(E,x)}a(Se,"hasOwn");function Pe(E){return E!==null&&typeof E=="object"}a(Pe,"isObject2");function _e(E){if(E===null||typeof E!="object"||(0,w.isArray)(E))return!1;let x=N(E);return x===null||x===K}a(_e,"isObjectObject");var lr=Object.assign;function Ue(E){if(E==null)return[];let x=he(E),{length:H}=x,z=Array(H),ne=E;for(let le=0;le<H;le+=1){let ye=x[le];z[le]=[ye,ne[ye]]}return z}a(Ue,"objectEntries");var cr=Object.freeze;function ur(E,x){if(!Pe(E)||!Pe(x))return E;let H=[[E,x]],z=0,{length:ne}=H;for(;z<ne;){if(z===L.LOOP_SENTINEL)throw new Error("Detected infinite loop in object crawl of merge");let{0:le,1:ye}=H[z++];if(!ye||!le)continue;let pr=(0,w.isArray)(ye),Ze=(0,w.isArray)(le);if(pr||Ze)continue;let er=he(ye);for(let He=0,{length:mr}=er;He<mr;He+=1){let ke=er[He],Ce=ye[ke],qe=le[ke];(0,w.isArray)(Ce)?le[ke]=Ce:Pe(Ce)&&Pe(qe)&&!(0,w.isArray)(qe)?H[ne++]=[qe,Ce]:le[ke]=Ce}}return E}a(ur,"merge");function xe(E){return Re(Ue(E))}a(xe,"toSortedObject");function Re(E){let x=[],H=[];for(let z of E)typeof z[0]=="symbol"?H.push(z):x.push(z);return!x.length&&!H.length?{}:te([...H.sort(Ae),...x.sort(Ae)])}a(Re,"toSortedObjectFromEntries")}}),Ft=Oe({"data/npm/legacy-names.json"(e,r){r.exports=["@antoinerey/comp-Fetch","@antoinerey/comp-VideoPlayer","@beisen/Accordion","@beisen/Approve","@beisen/AreaSelector","@beisen/AutoComplete","@beisen/AutoTree","@beisen/BaseButton","@beisen/Beaute","@beisen/BeisenCloudMobile","@beisen/BeisenCloudUI","@beisen/ButtonGroup","@beisen/ChaosUI","@beisen/ChaosUI-V1","@beisen/CheckboxList","@beisen/CommonMount","@beisen/CommonPop","@beisen/DataGrid","@beisen/DateTime","@beisen/DropDownButton","@beisen/DropDownList","@beisen/ExtendComponent","@beisen/FormUploader","@beisen/IconButton","@beisen/Loading","@beisen/MultiSelect","@beisen/NaDeStyle","@beisen/Paging","@beisen/PopLayer","@beisen/RadioList","@beisen/ReactTransformTenchmark","@beisen/Search","@beisen/selectedComponent","@beisen/Sidebar","@beisen/StaticFormLabel","@beisen/TabComponent","@beisen/Textarea","@beisen/Textbox","@beisen/TimePicker","@beisen/TitaFeed","@beisen/ToolTip","@beisen/Transfer","@beisen/Tree","@beisen/UserSelector","@chasidic/tsSchema","@chymz/DaStrap","@chymz/DaUsers","@claviska/jquery-ajaxSubmit","@cryptolize/FileSaver","@djforth/I18n_helper","@dostolu/baseController","@dostolu/exctractIntl","@dostolu/mongooseSlug","@dostolu/validationTransformer","@opam-alpha/ANSITerminal","@opam-alpha/BetterErrors","@opam-alpha/reactiveData","@pioug/MidiConvert","@smuuf/idleCat","@sycoraxya/validateJS","@tempest/endWhen","@tempest/fromPromise","@tempest/replaceError","@tempest/startWith","@tempest/throwError","@yuanhao/draft-js-mentionHashtag-plugin","3dBinPack","3DViewerComponent","4meFirst-github-example","9Wares-js","37FIS","A","ABAValidator","ABCEnd","AbokyBot","Accessor","Accessor_MongoDB","Accessor_MySQL","Accessor_Singleton","Account","accumulateArray","ACCUPLACERClient","AccuplacerClient","Acid","activaDocs","ActiveResource.js","ADBCordovaAnalytics","addTimeout","AdultJS","AesUtil","AgentX","AirBridgePlugin","airLogger","ajiThird","alaGDK","AlarmClock","alarmClock","Alchemyst","AlertLogic","alertsXYZ","ali-topSdk","AliceBot","alinkRNTest","aliOcrIdCard","AllCal.WebApp","alpacaDash","AmateurJS","AMD","AMGCryptLib","AmILate","AmILateAnand","amitTest","AmpCoreApi","amProductsearch","amqpWrapper","amrToMp3","angular-autoFields-bootstrap","angular-dateParser","angular-GAPI","angular-PubSub","Angular-test-child","Angular1","Angular2","angular2-Library","angular2-localStorage","angular2-Menu","angular2-quickstart-ngSemantic","angularApp","angularCubicColorPicker","angularjs-ES6-brunch-seed","angularjsSlider","AngularStompDK","Animated_GIF","animateJs","animateSCSS","AnimationFrame","AnimIt","Anirudhnodeapp","Anjali","annoteJS","ANSIdom","antFB","antFB-init","antFB-mobile","antFB-router-redux-ie8","AntMobileUI","AnToast","Antony","aoIoHw90B5sE1wG9","API-Documentation","APIConnect","APICreatorSDK","APlan","APM-mouse","APM.P2H","apMigStats","AporaPushNotification","App2App","applqpakTest","AppTracker","AQ","ArcusNode","AriesNode","array_handler_liz_Li","Array.prototype.forEachAsync","ArrayBuffer-shim","arrayFuncs","ArrowAulaExpress","Article-collider-packages","Arunkumar-Angular-Trial","asEvented","asJam","ASP.NET","assert","AssetPipeline","assignment2-BW","Assignment6","async_hooks","asyncBuilder","asyncEJS","AsyncHttpRequest-CordovaPlugin","AsyncProxy","AsyncStorage","asyncStorage","atom-C","atom-Fe","atom-Ge","atom-K","atom-Li","atom-Na","atom-Pb","atom-Rb","atom-Si","atom-Sn","AulaExpress","austin-vertebraeTest","authorStats","AutoFixture","autoLoader","AutoReact","AutoTasks","Autowebpcss","Avifors","AVNjs","AwesomeProject","AWSS3Drive","ax-rmdirRecursive","b_Tap","Babel","babel-preset-reactTeam","Bablic_Seo_SDK","BablicLogger","Backbone-Collection-Predefined-Filters","Backbone.Aggregator","backbone.browserStorage","Backbone.Chosen","Backbone.Marionette.Handlebars","Backbone.Mutators","Backbone.Overview","Backbone.Rpc","Backbone.Subset","baDataModel","Bag","BaiduMapManager","BandGravity","bangDM","banking-Josh-demo","BankWebservice","bannerFlip","BaremetricsCalendar","Barfer","BarneyRubble","Base","Base64","baseProject","Basic-Material-framework","BasicCredentials","basicFFmpeg","bbArray","Beegee","begineer_Practice","beijingDate","bem-countMaster","bem-countSlave","bem-getHistory","Bestpack","betterMatch","BetterRegExp","Bhellyer","BHP_MSD","BiDirectionalScrollingTable","BigAssFansAPI","BigInt","BIMserverWrapper","Binary-search-tree","binarySearch","bindAll","BinHeap","biojs-vis-RDFSchema","Biolac","Birbal","BitSetModule","BizzStream","Blackfeather","BlackMirror","Blacksmith","blacktea.jsonTemplates","Blaggie-System","BlankUp","Blink1Control2","blitzLib","Blob","BlobBuilder","BlobBuilder-browser","Blog","BlueOcean","BlueOps","Blueprint-Sugar","bluthLBC","blya!","BMFE_scaffold","Bmodule","Bo-colors-project","Boilerpipe-Scraper","Bondlib","bonTemplate","BootSideMenu","bornCordova","Botcord","Bottr-cli","Brackets","brain***_games***","Brave","BrewCore","BrianPingPong","BrianSuperComponents","BrickPlus","Brocket","Brosec","browserProxy","browserType","brush-Makefile","bTap","BtMacAddress","BubbleJS","Buffer","buffer","BufferList","Bugay","Build","BuildBox","Builder","Builders","BuildWithJavascript","BusinessObjects","Button","Buttons","Bynd","ByteBuffer","C9js","Cache-Service-Collector","Cacher","callbackQueue","CallbackRouter","callBlock-plugin","callBlock.plugin","camcardPlugin","CameraPreview","Canteen","canvas-toBlob","canvasColorPicker","Caoutchouc","Cap","Carbon","cardsJS","Cartogram-Utils","cascadeDrop","Cashew","Cat4D","catchTender","CategoryJS","catl-deploySSH","cbNetwork","CbolaInfra","CBQueue","CBuffer","ccNetViz","ccPagination","ccTpl","censoreMio","Censorify","censorify_Publish20160706","censorify_Vincent_Choe","censorifyAD","censorifyAshes","censorifyGuangyi","censorifyKatKat","censorifyRayL","censorifyTM","CETEIcean","cfUtilityService","CFViews","chadschwComponentTest0001","changelogFDV","Changling-dom","CharLS.js","Chart.Annotation.js","Chart.CallBack.js","Chart.Crosshairs.js","Chart.HorizontalBar.js","Chart.Smith.js","Chart.Zoom.drag.js","Chart.Zoom.js","ChartTime","chatSocketIo","ChattingRoom","checkForModuleDuplicates","cheferizeIt","chenouTestNode","child_process","chowYen","chrome-localIp","ChuckCSS","ChuckNorrisException","chunkArray","cjdsComponents","Class","Classy","clearInterval","ClearSilver","clearTimeout","CLI-todo","CLI-UI","cliappRafa","clientFrontEnd","ClientStorage","clipDouban","ClipJS","CloudMusicCover","CloudStore","Cls","cluster","CM-react-native-document-picker","CM1","coberturaJS","codeStr","Coeus","COFFEENODE","Coflux","colegislate-DynamoDbEventRepository","ColeTownsend","collabProvidesModules","CollectionMap","colWidth.js","com.emsaeng.cordova.plugin.AdMob","com.nickreed.cordova.plugin.brotherPrinter","com.none.alarmClock","com.zwchen.firstPlugin","com.zwchen.qqAdvice","combineJS","CometJS","Comfy","Comments","CommentsJS","comp-Fetch","Company","compareStrings","CompassSM","Complex","componentDoc","componentDoc-cli","CompoundSignal","Compress-CSS","Compression","concatAll","Concur","ConfluencePageAttacher","ConnectTheDotsDesktop","Console","console","constants","constelation-Animate_","constelation-BackgroundImage","constelation-Block","constelation-Button","constelation-Col","constelation-Event_","constelation-Flex","constelation-Inline","constelation-InlineBlock","constelation-InlineCol","constelation-InlineFlex","constelation-InlineRow","constelation-Painter","constelation-Row","constelation-Style_","constelation-Text","constelation-Video","constelation-View","ConstraintNetwork","ContactMe","ContentEdit","ContentSelect","ContentTools","convertPinyin","CoolBeans","Coolhelper","copyMe","cordova-plugin-adPlayCafebazaar","cordova-plugin-adPlayPushe","cordova-plugin-bluetoothClassic-serial","cordova-plugin-coolFunction","cordova-plugin-euroart93-smartConfig","cordova-plugin-ios-android-IAP","cordova-plugin-LineLogin","Cordova-Plugin-OpenTok-JBS","cordova-plugin-permissionScope","cordova-plugin-SchaffrathWebviewer","cordova-plugin-SDKAW","Cordova-Plugin-SystemBarDimmer","cordova-plugin-YtopPlugin","Cordova-react-redux-boilerplate","cordova-StarIO-plugin","CordovaSMS","CordovaWebSocketClientCert","coreApi","CornerCut","CornerJob","CorrespondenceAnalysis","cosBuffer","cosTask","Couch-cleaner","Couchbase-sync-gateway-REST","CouchCover","CouchDBChanges","CouchDBExternal","CountAdd_000001","cPlayer","cqjPack","Crawler","Create-React-App-SCSS-HMR","createClass","createDOC","createNpm","createServer","CRMWebAPI","crockpot-fromBinary","crockpot-fromEnglish","crockpot-fromRoman","crockpot-toEnglish","crockpot-toRoman","Cron","CropSr","crypto","CSDebug","CSDLParser","CSLogger","CSSMatrix","CSSselect","Csster","CSSwhat","CSV-JS","CTP_MARKET_DATA","cttv.bubblesView","cttv.diseaseGraph","cttv.expansionView","cttv.flowerView","cttv.speciesIcons","cttv.targetAssociationsBubbles","cttv.targetAssociationsTree","cttv.targetGeneTree","Cuber","cubicColorPicker","Cui-Dialog","CustomCamera","customComponent","customLibrary","CustomPlugin","CustomWebView","cuteLogger","cwebp-binLocal","CyberJS","D","d-fordeYoutube","D-Stats","D.Va","d3-bboxCollide","d3-pathLayout","d3.geoTile","D3.TimeSlider","Daja","Daniel_NPM_Library_Test","Dante2","DanTroy-utils","Dashboard","Dasher","dashr-widget-Weather","dashr-widget-World-Pool-Championships","Data-CSS","Data-Same-Height","dataAccess","Database-Jones","DataManager","dataStream","dateFormat-kwen","dateFormatW","DateHuatingzi","DateMaskr","dateModule","DatePicker","Datepicker.js","Dateselect","DateValidator","DateZ","Datum","Davis","dd-rc-mStock","DDEvents","deBijenkorf-protractor-tests","Debug-Tracker","Deci-mal","DeCurtis-Logger","deepEqualsWith","deepPick","defaultStr","Deferred","deferredEventEmitter","defineClass","defineJS","DelegateListener","deleteMoudles","Demo","Demo1","demoNeeeew","demoWei","demoYTC","Deneme","derivco-SoundJS","derpModule","DeskSet","Desktop-command","Devbridge-FrontEnd","Developer","deviousknightFirstNpm","devisPattern","devProxy","DFP","dgram","dgURI","diagnostics_channel","Dial","DiggernautAPI","Diogenes","DirScanner","dirStat","DirWatcher","Discord-Webhook","DiscordForge","diveSync","dkastner-JSONPath","DM.NodeJS","dns","Dock-command","docxtemplaterCopy","doLink","DOM","Domai.nr","domain","DOMArray","DOMBuilder","DOMino","DOMtastic","DOMtastic-npm","dotFormat","dotJS","DoubleCheck","Dove.js","downloadAPI","downLoadFile","DownloadManager","DownloadProxy","DPS","DQ","draftjsToHTML","dragOnZone","drakovNew","Draper","DrawPDF","Dribble","Drupal-Node.js","DT","Duckface","Dui","DVA","DvA","dVa","DXIV2Inst","DynamicBuffer","dynamoDB","DynamoDBStream","DynWorker","Easy-Peasy-Slide","easyCache","easyFe","easyRestWithABL","EasyUI","eavesTool","EBI-Icon-fonts","echartsEx","EclipseScroll","ECMASquasher","edfToHtmlConverter","edGoogleApi","edGraham","EfemerideList","efemerideList","efficientLoad","eFishCrawler","EhanAreesha","Elastic-Beanstalk-Sample-App","ElasticSlider-core","electron-isDev","ElectronAppUpdater","ElectronRouter","elementsJS","Elixirx","Elm-0.17-Gulp-Coffeescript-Stylus-Lodash-Browserify-Boilerplate","EmailClient","ember-cli-fullPagejs","ember-leaflet-geoJSON","emoJiS-interpreter","Empite","EmpiteApp","emptyObject","emptyString-loader","Encloud","encodeBase64","encodeID","energyCalculator-browser","EnglishTranslator","ensureDir","Enumjs","Environment.js","ep_disableChat","EPO_OPS_WRAPPER","equalViews-comparative-selection","eRx-build","ES-poc","es6-DOM-closest","eSlider","eslint-plugin-elemMods","EsmalteMx.ProductApi.Lambdas","Estro","ETag","eValue-bs","EVE","EventDispatcher","eventDrops","EventEmitter","EventField","EventFire","EventFire.js","EventHub","EventRelayEmitter","events","EventServer","eventstore.mongoDb","EventtownProject","EventUtil","EVEoj","EverCookie","ewdDOM","ewdGateway","ExBuffer","execSync","exFrame-configuration","exFrame-core","exFrame-generator","exFrame-logger","exFrame-mq","exFrame-rest","exFrame-rpc","exFrame-security","ExifEditor","Exitent","expectThat.jasmine-node","expectThat.mocha","Express","Express-web-app","expressApi","ExpressCart","ExpressCheckout","expressingFounder","ExpressMVC","ExpressNode","expressOne","expressSite","expressWeb","ExtraInfo","extraRedis","Eyas","EzetechT","EZVersion","F","F-chronus","f*","FabioPluginiUno","Facebook_Graph_API","facebookPhotos","FacebookYarn","factor-bundle-WA64","FAEN","Faker","Falcon","fast-artDialog","fastA_node","FastLegS","Fayer","fbRecursiveRequest","FeedbackModuleTest","feedBum","fenix-ui-DataEditor","fenix-ui-DSDEditor","Fermi-UI","FetchCallLog","fieldsValidator","fig-Componts","File","File_Reader_solly","FileBrowser","FileError","fileGlue","FileList","fileLog","FilePicker-Phonegap-iOS-Plugin","FileReader","FileSaver","FileSync","FileWriter","FileWriterSync","Finder-command","FirstApp","FirstCustomPlugin","firstModule","firstNodejsModule","firstYarn","fis-parse-requireAsyncRes","fis-postpackager-inCSSToWebP","fis3SmartyTool","FitText-UMD","Flamingo","flatToTrees","fleschDe","Flex-With-Benefits","FlickrJS","flipPage","Florence","FlowerPassword","flowMap","FLTEST","fnProxy","FontAwesome-webpack","fontEnd","FontLoader","foo!","foo~","forAsync","ForceCode","forceLock","forChangeFilesName","forEachAsync","formAnimation","formatDate","formBuilder","FormData","Formless","formValidate","FrameGenerator","freightCrane","French-stemmer","Frenchpress","FreshDocs","friendsOfTrowel-buttons-component","friendsOfTrowel-dropdowns-component","friendsOfTrowel-Forms-component","friendsOfTrowel-Layouts-component","Friggeri.net","Frog","frontBuild","Frontend-starter","FrontEndCentral-documentation","FrontJSON","FrontPress","Frozor-Logger","Fruma","fs","fs-uTool","FSM","FT232H","fuck!","Fuell","FuellDocTest","FuellSys","FuellTest","FullStack","FunDemo2","FURI","Fury","futSearch","futureDocBuilder","FyreWorks-Node","fzmFE","Gaiam","Ganescha-Bot-Jokes","gaoboHello","Garrett-pokemon","gatesJs","Gauge","gaugeJS","gaussianMixture","gbL-jsMop","GC-Sequence-Viewer","gdBuildLogs","gdBuilds","Gems.PairedDeviceClient","genData","generateIndex","generator-entityV2-widgets","generator-kittJS","generator-qccr-startKit","generator-reactpackSample","generator-zillionAngular","Gengar","GeoMatrix","GeosysDroid","GeosysTest","Gerardo","getDateformat","getExtPath","getSignature","GettyEmbeddy","ghostTools","GhostTube","GiftEditor","GirlJS","GitAzure","gitbook-plugin-prism-ASH","gitbook-plugin-specialText","gitbook-start-heroku-P8-josue-nayra","gitbook-start-heroku-P9-josue-nayra","gitForge","gitHub","GitHub-Network-Graph","GitHubTrending","gitProvider","gl-flyCamera","gl-simpleTextureGenerator","glMath","GLORB","glslCanvas","glslEditor","glslGallery","GLSlideshow","Glue","GMP","golbalModule","Goldfish","Gon","Google_Plus_API","Google_Plus_Server_Library","Google-Chrome-command","GoogleDrive","googleOAuthServer","googlePlaceAutocomplete","GoogleService-NodeJs","Gord","gPagesJS","Gps2zip","GRAD_leaveNotes","GRAD_makeFire","grad-customGear","grad-factions-VR","grad-leaveNotes","grad-makeFire","Grafar","Graph","graphLock.custom.plugin","graphQl-Mysql-Server","GridFS","GridManager","gridminCss","Gridtacular","GroupePSAConnectedCar","Grow.js","Grunt-build","grunt-checkFileSize","grunt-cmd-handlebarsWrap","grunt-ftp-getComponent","grunt-httpTohttps","grunt-latexTOpdf-conversion","grunt-Npm-grunts","grunt-po2mo-multiFiles","grunt-Replacebyrefs","grunt-syncFolder","grunt-urlCacheBuster","guideJs","gulp-addSuffix","gulp-combineHtml","gulp-imgToBase64","gulp-lowerCase","gulp-phpWebserver","gulp-spacingWord","Gulp-Tasks","GumbaJS","Gusto","gz2qiCalcModule","h2oUIKit","H5UI","H666","habibtestPublish","HackBuffer","handleStr","HansontableComponent","Haraka","HariVignesh","harmonyHubCLI","HarryPotterParty","harsh-Test-Module","Harshil","hash!","hashPage","hashTranslate","HASWallpaperManager","hasWord","HeartBeatWoT_pi","Hello","hello_test_spade69XXX","Hello_World","HelloBot","helloBySoo","helloDevelopersnodejs","HelloExpress","helloModule","HelloWorld","helloWorld","HelloWorld_hlhl_040","HelloWorldComponent","HelloWorldNodeJS","helloYJ","helpBy","helpCenter","herokuRun","Hesiir-components","HHello","Hidash","HiddenMarkovModel","hideShowPassword","highcharts-*","HighlightP","Highway","Hinclude","Hipmob","Hiraku","hm_firstPackage","HMTraining","homebridge-anelPowerControl","homebridge-bigAssFans","homebridge-CurrentAmbientLightLevel","homebridge-Homeseer","homebridge-LEDStrip","homebridge-MotionSensor","homebridge-RFbulb","Homematic-Hue-Interface","hoshiCustomContent","hoshiImageLoader","HotJS","Hotshot","hoverifyBootnav","howToNPM","Hppy","Hpy","htmlCutter","htmlKompressor","HTMLString","htmlToTree","http","http2","HTTPRequest","https","httpShell","httpTohttps","Hubik","Hubik-Demo","Hubik-Platform","Hubik-Platform-Chrome","Hubik-Plugin","Hubik-Plugin-Memory","Hubik-Plugin-Network","Hubik-Plugin-Rendering","Hubik-Util","hubot-yigeAi","HuK","hybridCrypto","i18next.mongoDb","Ian_Chu","IArray","Ibis.js","iCompute","iEnhance","IENotification","iFrameAPI","IFY-gulp-kit","II","IIF","iIndexed","iKeyed","iM880-serial-comm","imageCDN-webpack-loader","imageMagick","Imager","Imageresizer","imageTool","ImageViewer","iMagPay","iMemoized","iMessageModule","Imovie","Imp","Incheon","Index","indexedStore","inferModule-jsdoc-plugin","infieldLabel","Influxer","inputcheckMemo","inspector","INSPINIA","Insplash","inStyle","interactiveConsole","Interval","IO","IObject","ionic-gulp-browserify-typescript-postTransform","IonicSocket","iOS-HelloWorld","IOTSDK","iotsol-app-FAN","iotsol-app-test-Node-RED","iotsol-service-string-upperCase","IQVIS","Iris","iRobo-react-modal","iSecured","isElementInViewport","isEqual","iSeries","isFirefoxOrIE","isHolidayInChina","iSocketService","isPureFunction","iStorable","iTransactable","iTunes-command","iValidated","iWeYou","iZettle","iziModal","JabroniJS","jaCodeMap","Jade-Sass-Gulp-Starter","jadeBundler","jadiTest","jAlert","JamSwitch","JASON","JavaScript-101","JazzScript","jcarouselSwipe","jDataView","jDate","jetsExt","Jimmy-Johns","jingwenTest","JMSList","JMSlist.js","Jody","joi-dataURI","joi-string-dataURI","jordenAngular","jordenAngular2","JorupeCore","JorupeInstance","JOSS","JotihuntReact","Journaling-Hash","jpaCreate","jParser","JPath","jPlotter","jPlugins","JQ","jQ-validation-laravel-extras","JQDeferred","jQGA","jqGrid","jqNode","jqPaginator","jqplot.donutRenderer","jqPromise4node","jqTreeGridWithPagination","jQuery","jquery-adaptText","jquery-asAccordion","jquery-asBgPicker","jquery-asBreadcrumbs","jquery-asCheck","jquery-asChoice","jquery-asColor","jquery-asColorPicker","jquery-asDropdown","jquery-asFontEditor","jquery-asGalleryPicker","jquery-asGmap","jquery-asGradient","jquery-asHoverScroll","jquery-asIconPicker","jquery-asImagePicker","jquery-asItemList","jquery-asModal","jquery-asOffset","jquery-asPaginator","jquery-asPieProgress","jquery-asProgress","jquery-asRange","jquery-asScroll","jquery-asScrollable","jquery-asScrollbar","jquery-asSelect","jquery-asSpinner","jquery-asSwitch","jquery-asTooltip","jquery-asTree","jQuery-by-selector","jquery-dynamicNumber","jquery-idleTimeout-plus","jquery-loadingModal","jquery-navToSelect","jQuery-QueryBuilder","jquery-rsLiteGrid","jquery-rsRefPointer","jquery-rsSlideIt","jQuery-Scanner-Detection","jquery-scrollTo","jquery-scrollToTop","jquery-slidePanel","jQuery.component","jquery.customSelect","jquery.dataTables.min.js","jquery.Jcrop.js","jQuery.keyboard","jQuery.mmenu-less","jQuery.print","jquery.rsLiteGrid","jquery.rsOverview","jquery.rsRefPointer","jquery.rsSlideIt","jquery.rsSliderLens","jQuery.toggleModifier","jquery.waitforChild","jqueryPro","js-build-RomainTrouillard","JS-Entities","JS-string-minimization","JS.Responsive","jSaBOT","jsCicada","jsConcat","JSCPP","jsDAV","JSDev","jsdoc-TENSOR","jsDocGenFromJson","jsDump","jSelect","JSErrorMonitor","JSErrorMonitor-server","jsFeed","jsFiddleDownloader","JSFramework","JSLint-commonJS","JSLintCli","JSLogger","JSON","JSON-Splora","JSON.sh","JSON2","json8-isArray","json8-isBoolean","json8-isJSON","json8-isNull","json8-isNumber","json8-isObject","json8-isPrimitive","json8-isString","json8-isStructure","JSON2016","JSONloops","JSONPath","JSONPathCLI","JSONRpc","JSONSelect","JSONStream","JsonUri","JSONUtil","jsonX","JSplay","jspolyfill-array.prototype.findIndex","JSPP","JSpring","jsQueue","jsSourceCodeParser","jStat","JSUS","JSV","JSX","jsz-isType","JTemplate","JTmpl","jTool","JuliaStyles","JumanjiJS","Jupyter-Git-Extension","justifiedGallery","justJenker","JustMy.scss","JWBootstrapSwitchDirective","jWorkflow","jxLoader","JYF_restrict","K_Tasks","K--Ajax","K-Report","KAB.Client","Kahana","Kapsel-project","Katy","Kayzen-GS","KB","KB_Model","kelTool","kelTool2","KenjutsuUI","KevinLobo3377-node","KFui","kickoff-fluidVideo.css","Kid","kingBuilder","kiranApp","Kirk","Kissui","kittJS","Kiwoom-Helper","KLC3377-node","knockout.ajaxTemplateEngine","koa-artTemplate","koa-Router","koaPlus","koaVue","KonggeIm","kpPublicPerson","kpPublicVideo","krawlerWash","ktPlayer","kylpo-BackgroundImage","kylpo-Block","kylpo-Button","kylpo-Col","kylpo-Flex","kylpo-Inline","kylpo-InlineBlock","kylpo-InlineCol","kylpo-InlineFlex","kylpo-InlineRow","kylpo-Paint","kylpo-Painter","kylpo-Row","kylpo-Text","kylpo-View","kzFormDaimyo","L.TileLayer.Kartverket","L7","labBuilder","Lactate","Lade","laravel-jQvalidation","Large","lark-PM","LasStreamReader","latte_web_ladeView","latte_webServer4","lavaK","layaIdecode","Layar","Layout","LazyBoy","lazyBum","lazyConnections","lazyLoadingGrid","lcAudioPlayer","LCM","LDAP","Leaf.js","Leaflet-MovingMaker","Leaflet.AutoLayers","Leaflet.Deflate","Leaflet.GeoJSON.Encoded","Leaflet.GreatCircle","Leaflet.MultiOptionsPolyline","Leaflet.TileLayer.MBTiles","Leaflet.vector-markers","leapShell","LearningNPM","learnnode_by_HHM","leFunc","Legos","Libby-Client","LightCinematic","lihuanxiangNpm1","limitedQueue","linearJs","lineReader","Lingo","LinkedList","linkIt","LISP.js","liteParse","liuchengjunOrder0414","LiveController","LiveDocument","LiveScript","LiveScript-brunch","LiveView","liweiUitl","lizaorenqingTool","lmONE","LMUI","LMX-Data","LNS_weixin_h5","localeMaker_v1","localforage-memoryStorageDriver","LocalRecord","localStorage","localStorage-info","localStorage-mock","LoDashfromScratch","lofterG","Loganalyzer","LogbookMessageCreator","Logger","Logging","Loggy","logic2UI","LogosDistort","LogStorage.js","logStream","LOL","lolAJ","LongestCommonSubstring","loop-setTimeout","loopback-connector-rest-addCookie","lopataJs","Lorem","Losas","LP_test_task","Lucy","LUIS","LUIS_FB","Lumenize","Lush.js","LykkeFramework","M66_math_example","mac-cropSr","MacGyver","Mad.js","magentoExt","Maggi.js","Maggi.js-0.1","MagpieUI","MALjs","Mambo-UI","mangoSlugfy","mapleTree","mappumBot","Marionette-Require-Boilerplate","markupDiff","marryB","MasterDetailApplication","MaterialAngularWithNodeJS","Math","math_example_20160505163300BR","math_example_Hala","math_example_myown_ve-01119310520_V2","math_exampleCJG","math_exampleII","math_exampleX","math_ThisIsMe","math-Murasame","Math1105","mathAdd","mathExample","MathJax-node","MathJS","mathMagic","MathTest1","MatPack","Mavigator","MAX-AVT-homebridge-led","MAXAVTDemo","MAXIMjs","MaxUPS","MCom","MD5","MDLCOMPONENT","mdlReact","mdPickers","mdRangeSlider","mdToPdf","MEAN","MeanApp1","MeCab","mediaCheck","Mediany","medicalHistory","Mercury","Meridix-WebAPI-JS","Mers","MessageBus","MetaEditor","Meteor-Test-Installer","MetroTenerife","MFL-ng","MFRC522-node","mglib-GAMS.WEBCLIENT2","MIA","MicroServices","Midgard","midhunthomas_Test","mihoo_fileUpload","mini-fileSystem-WebServer","Mini-test","MiniAppOne","MiniAppTwo","minibuyCommonality","miniJsonp","MiniManager","MiniMVC","MinionCI","Minju003","Mirador","Misho_math_example","MJackpots","mjb44-playground-module-exporting-interface-and-type-method-B","mjb44-playground-module-exporting-interface-and-type-method-C","Mkoa","Mkoa-pg-session","MKOUpload","mlm603Test","mmAnimate","mmDux","MMM-alexa","mmRequest","mmRouter","mNotes","Mockery","modalDemo","modalDemo1","modalWin.js","module","ModuleBinder","modulebyAKB","ModuleC","moduleLoader","moduleTest","MoEventEmitter","Mokr","Mole","mon-appNon0","MonApp","MongoDAL","mongoose-schema-to-graphQL","mongooseSchema-to-graphQL","Monik","MonikCommon","MoniqueWeb","Monorail.js","Mopidy-Spotmop","mosesCheckIn","MovieJS","mOxie","MoxtraPlugin_1.1","MoxtraPlugin_1.2.1","mPortalUI","MQTTClient","Mr.Array","Mr.Async","Mr.Coverage","mraaStub","MrsYu","MrsYu1","msGetStarted","mSite","msJackson","mSnackbar","Mu","Muffin","MultiSlider","musuAppsas","MWS_Automation","my-awesome-nodejs-moduleHL","my-componentAnimesh","My-First-Module","My-first-Package","My-Fist-Project","my-HLabib","My1ink","MyAngularGruntt","MyAnimalModule","myappSriniAppala","myappUSBankExample","myAries","MyBlog","myCalclator","myDate","myDialog","myDu2","myDVA","myFirst-Nodejs-Module","MyFirstContribution","myfirstDemo","myFirstModule","myFirstNodeModule","myFirstNpm","myFirstPluginAji","myFirstProject","myFirstPub","myLib","myMath","MYMODAL","MyModule","myModule","myNodeJs","myNodeJsApp","myNodejsApp","myNpm","MYnpm1","myNpm0001","myNpm2","myNpm5","myNpm10","myNpm11","myNpm111","myNpm999","myNpmfei","myNpmfei1","myNpml","myNpmModule","myNpmrz1","MyPlugin","MyProject","MyProjNode","myPromise","myrikGoodModule","Mysql-Assistant","mysupermoduleXXX","myTest","Mytest_module","mytPieChart","N","N3-components","NA1","NageshTestapplication","NAME","Nameless13","NaNNaNBatman.js","nanoTest","NasimBotPlatform","NativeAds","NativeCall","NativeProject","nativescript-CallLog","nativescript-GMImagePicker","nativescript-logEntries","NavExercise","nCinoRabbit","ncURL","NDDB","neouiReact-button","Neptune","NERDERY.JS.NAT","nestedSortable","net","NeteaseCloudMusicApi","neteaseMusicApi","Netflow","Netlifer","NetMatch","NetOS","netOS","Netpath-Test","Neuro","Neuro-Company","NewModule1","newmsPong","newPackage","newPioneer","newStart","newtouchCloud","NewWebview","NexManager","NexmoJS","NFO-Generator","ng2-clockTST","ng2-dodo-materialTypeTransfer","ng2-QppWs","ng2GifPreview","NG2TableView","ngBrowserNotification","ngCart","ngChatScroller","ngComponentRouter-patched","ngCurrentGeolocation","ngDfp","ngDrag","ngFileReader","ngGen","ngGeolocation","ngHyperVideo","ngIceberg","ngImgHandler","ngIntercom","ngKit","ngPicker","ngPluralizeFilter","ngPluralizeFilter2","ngProgress-browserify","ngScroll","ngSinaEmoji","ngSmoothScroll","ngSqlite","ngTile","ngTimeInput","ngTreeView","ngUpload","ngUpload-forked","Nguyen_test","ngVue","ngYamlConfig","nHttpInterceptor","Nick_calc","NickSam_CGD","NightPro-Web","nightwatchGui","Nikmo","nImage","Nitish","nitish.kumar.IDS-LOGIC","NlpTextArea","nltco-lgpt-clean-A","nltco-lgpt-clean-B","nltco-lgpt-dedupe-simple-A","nltco-lgpt-dedupe-simple-B","nMingle","nmPhone","nMysql","NoCR","NODE","Node_POC","node-CORSproxy","Node-FacebookMessenger","Node-HelloWorld-Demo","node-iDR","node-iOS","Node-JavaScript-Preprocessor","node-localStorage","Node-Log","Node-Module-Test","node-myPow","node-red-contrib-samsungTV","node-red-contrib-wwsNodes","node-red-StefanoTest","node-TBD","NodeApp","nodeApp","nodeAuth","nodeBase","NodeBonocarmiol","nodeCalcPax","nodeCombo","nodeDemo9.26","nodeDocs","nodeEventedCommand","NodeFileBrowser","NodeFQL","nodeHCC","nodeInterface","NodeInterval","nodeIRCbot","nodeJS","NodeJS_Tutorial","nodeJs-zip","NodejsAgent","NodeJsApplication","nodejsFramework","nodejsLessons","NodeJsNote","NodeJsPractice","nodeJsPrograms","Nodejsricardo","NodeJSTraining-demo-9823742","nodejsTutorial","NodejsWebApp1","nodejsWorkSpace","NodeKeynote","nodeLearning","nodeMarvin","nodeMarvin2","NodeMini","nodeMysqlWrapper","nodeNES","nodeos-boot-multiUser","nodeos-boot-singleUser","nodeos-boot-singleUserMount","nodepackageBoopathi","nodePhpSessions","NodePlugwise","NodePlugwiseAPI","nodeQuery","nodes_Samples","NodeSDK-Base","NodeServerExtJS","NodeSSH","nodeSSO","NodeSTEP","nodeTest","NodeTestDee","nodeTTT","nodeTut","NoDevent","NodeView","nodeWebsite","NodObjC","Nonsense","NoobConfig","NoobHTTP","normalizeName","NORRIS","nOSCSender","Note.js","NotificationPushsafer","Notifly","Npm","npm-Demo","Npm-Doc-Study","npm-mydemo-pkgTest","npm-setArray","npm-wwmTest","npmCalc","npmFile","npmModel","npmModel1","npmModel2","npmTest","npmToying","npmTutorial","NPR_Test","nrRenamer","nStoreSession","nTPL","nTunes","NudeJS","nunjucks-includeData","O","O_o","o_O","O2-countdown","O2-tap","objectFitPolyfill","ObjectSnapshot","ObjJ-Node","ObservableQueue","OCA-api","ocamlAlpha","ocamlBetterErrors","OcamlBytes","ocamlBytes","ocamlRe","OhMyCache","OK-GOOGLE","Olive","onBoarding","OnCollect","OneDollar.js","oneTest","OpenBazaar-cli","OpenDolphin","OpenJPEG.js","openWeather","OperatorUI","OPFCORS","OPFSalesforce","OptionParser","OrangeTree","Orchestrator","Order","ORIENTALASIAN","os","Osifo-package","osu-ModPropertiesCalculator","OTPAutoVerification","overloadedFunction","OwnMicroService","OwnNormalizer","OwnPubSub","OwnPubSubClient","OwnPubSubServer","p2Pixi","PaasyMcPaasFace","pacemakerJS","packAdmin","Package","packageNodeCR-Jeff.json","packagePublished","packageTesting","Packery-rows","packing-template-artTemplate","Paddinator","Paginate","palindromeCalcPax","palindromePax","PanPG","Panzer","parameterBag","paramsValidator","Parse-Server-phone-number-auth","parseArgs","Parser","parseUri","Particle","Particleground.js","PassiveRedis","path","PatternLabStarter","patternReplacer","paytmGratify","PayzenJS","pDebug","pdf-to-dataURL","pdfTOthumbnail_convert","PeA_nut","Peek","PeepJS","Pega.IO","Peggy.js","Percolator","perf_hooks","performJs","pgnToJSON","PHibernate","phoeNix-cli","phoenixCLI","PhonegapAnalytics","PhonegapBeacon","PhonegapFeeds","PhonegapGeofence","PhonegapGrowth","PhonegapLocations","PhonegapPush","picardForTynt","PicoMachine","Pictionary","Pintu","pjEmojiTest","PJsonCouch","PK","PL8","placeHolder.js","PLATO","PlayStream","pluginCreater","pluginHelloWorld","pluginHelloworld","pluginTest","PlugMan","pluuuuHeader","PoistueJS","Pokeball-Scanner","PokeChat","PokedexJS","PokemonGoBot","PokemonGoNodeDashboard","polar-cookieParser","pollUntil","Polymer","POM","pomeloGlobalChannel","pomeloScale","portal-fe-devServer","PostgresClient","Postlog","PowerPlanDisplay","powerPlug","PP","ppublishDemo","Pre","Preprocessor","PrettyCSS","prettyJson","PrimaryJS","primerNodo","primo-explore-LinkedData","primo-explore-prmFacetsToLeft","primo-explore-prmFullViewAfter","primo-explore-prmLogoAfter","primo-explore-prmSearchBarAfter","PrimoEsempio","Printer","Prism","prjTemplate","Probes.js","process","proInterface","Project-A-VK","Prometheus","Promise","Promise.js","PromiseContext","promisify-syncStore","PropagAPISpecification","propCheckers","Propeller","properJSONify","Proto","proton-quark-rabbitMQ","ProtVista","ProUI-Utils","ProvaSimone","provinceCity.js","PSNjs","PTC-Creator","ptyzhuTest_20160813","PublishDemo","publishDigitalCrafts2016","PubSub","pubsubJS","pulsarDivya","punycode","PupaFM","Puppet.svg","PureBox","PureBox-Gallery-PlayEngine","purePlayer","PushMessage","PushPanel","PushPlugin_V2","pybee!batavia","Q","q-mod-cliElements","q-mod-cliPrinter","QAP-cli","QAP-SDK","Qarticles","QnA_Fore","QNtest","qqMap","qTip2","QuadMap","QuantumExperimentService","querystring","R","R.js","R2","RAD.js","Radical","raehoweNode","Rajas","random-fullName","randomCaddress","randomCname","randomCname.js","randomLib","randomNickname","RandomSelection","randomTestOne","randString","randString.js","Range.js","Rannalhi","rAppid.js","rAppid.js-server","rAppid.js-sprd","Rapydscriptify","RaspiKids","raZerdummy","RCTMessageUI","React_Components","React-Carousel","react-countTo","react-creditCard","React-ES5-To-ES6-Checklist","react-input-dateTime","react-InputText-component","react-komposer-watchQuery","react-materialUI-components","react-native-accountKit","react-native-cascadeGrid","react-native-checkBox","react-native-DebugServerHost","React-Native-Form-Field","react-native-isDeviceRooted","react-native-LoopAnimation","react-native-MultiSlider","react-native-portableView","react-native-swRefresh","react-PPT","React-Redux-Docker-Ngnix-Seed","react-refresh-infinite-tableView","React-Select-Country","React-Tabs","React-UI-Notification","react-uploadFile","reactClass","reactcordovaApp","ReactEslint","reactFormComponentTest1","reactGallery","reactHeaderComponentTest1","ReactHero","reactIntlJson-loader","ReactNaitveImagePreviewer","ReactNative-checkbox","reactNative-checkbox","reactNativeDatepicker","reactNativeLoading","ReactNativeNavbar","ReactNativeSlideyTabs","ReactNativeSocialLogin","ReactNativeStarterKit","ReactNativeToastAndroid","reactTwo","ReactUploader","readabilitySAX","ReadableFeeds","readline","ReadSettings","Reality3D","reallySimpleWeather","ReApp","ReasonDB","RecastAI-Library-JavaScript","recordType","recordWebsite","RedisCacheEngine","redisHelper","reDIx","RefreshMedia","registerSendMsg","reloadOnUpdate","remoteFileToS3","RemoteTestService","removeNPMAbsolutePaths","RentalAdvantage","repl","Replace","Replace2.0","Replen-FrontEnd","replNetServer","Require","requireAsync","Resin","resolveDependencies","responseHostInfo","ReST-API","RESTful-API","Restifytest","Restlastic","RESTLoader","Reston","RestTest","RetreveNumbers","rgbToHexa","RhinoStyle","Richard","richardUtils","rinuts-nodeunitDriver","Risks-Tables","RNBaiduMap","RNCommon","RNSVG","RNSwiftHealthkit","rNums","RobinGitHub","Robusta","RockSelect","Router","RP_Limpezas_Industriais","Rpm","RSK-Router","RT-react-toolbox","Rubytool","runQuery","runStormTest","runTestScenario","RunwayLogger","RWD-Table-Patterns","RWPromise","Safari-command","SafeObject.js","Safood-Parse","SaFood-Parse","sahibindenServer","salgueirimTeste","samepleMicroservice","samjs-mongo-isOwner","Sample","SamplePlugIn","SandboxTools","sandcastle_multiApp","Sanitizer.js","sanitizer.unescapeEntities","Sardines","Sass-Boost","Sass-JSON","Sass-layout","Saturday","SauceBreak","sayHelloByone","sbg-queueManager","sbUtils","SC-Expense-Plugin","Scaffolding","scalejs.metadataFactory","ScgiClient","Scheduler.js","schema-inspector-anyOf","scp-cleanRedis","Scrap","scriptTools","scrollAnimation","scrollPointerEvents","ScrollShow","Sdp-App","seaModel","searchBox.js","SecChat","SecureKeyStore","segnoJS","Seguranca","SegurancaBrasilcard","Select2","selfAsync","selfAutocomplete","SelfieJS","SenseJs","SenseOrm","Sentimental","SeptemTool","seqFlow","SerialDownloader","serveItQuick","Server","Service-Discovery-DLNA-SSDP","serviceDiscovery","SessionWebSocket","Set","setInterval","setRafTimeout","setTimeout","SexyJS","sfaClient","sgBase","sgCore","sgFramework","sgLayers","sgSay","Sharder","ShareSDK","SharingCMS","Shave","Sheet","SHI-Shire","sHistory","ShowNativeContact","SHPS4Node-auth","SHPS4Node-cache","SHPS4Node-commandline","SHPS4Node-Config","SHPS4Node-config","SHPS4Node-cookie","SHPS4Node-CSS","SHPS4Node-dependency","SHPS4Node-error","SHPS4Node-file","SHPS4Node-frontend","SHPS4Node-init","SHPS4Node-language","SHPS4Node-log","SHPS4Node-make","SHPS4Node-optimize","SHPS4Node-parallel","SHPS4Node-plugin","SHPS4Node-sandbox","SHPS4Node-schedule","SHPS4Node-session","SHPS4Node-SQL","shwang1aPackage1","shy-Do","shy-static-imgJoin","SignaturePrinter","Silvera","simoneDays","Simple","Simple-Cache","simple-hello-world-apiClientsideTest","simple-jQuery-slider","simpleArgsParser","simpleCsvToJson","SimpleHtdigest","SimpleQueue","SimpleRPC","Simplog","SingularityUI","sip.js-mnQf2Q2R","Sisense-node-schedule","SITA-JS-Wrapper","siteBuild","Skadi","SkelEktron","SKRCensorText","SkyLabels.js","Skype-command","slgComponents","Slidebars","Slidebars-legacy","slidePage","Slither-Server","sLog","slush-initPro","Smaller4You","Smart-Web-Proxy","SmartConfig","SmartyGrid","SMValidator","smyNpm1","Snake.js","SnipIt","SnsShare","SocialDig.js","Socialight","socketGW","SocketIPC","sortBy.js","Soumen","SoundCloud_Node_API","SpaceMagic","SpeechJS","Speedco","Speedonetzer","Sphero-Node-SDK","Spores","Spot","spotifyCurrentlyPlaying.js","SpotlightJS","Spring","SPUtility.js","SQLClient","SQProject","SquareOfNumber","Squirrel","squishMenu","Sslac","SSO","SSSDemoNPM7oct","SSuperSchool","StaceFlow","StanLee-WPTheme-Generator","star-initReact","Starr","startInt","starW-names","StaticServer","staticServer","staticSync","StatusBar","StdJSBuilder","steamAPI","STEPNode","Stewed","stickUp","stickyNavbar.js","stickyStack","StimShopPlugin","storeJSON","storkSQL","stormClient","Str.js","Stratagem","stream","string_decoder","String_module","string-DLL","string.prototype.htmlDecode","string.prototype.htmlEntityDecode","StringDistanceTS","StringMultiplier","StringScanner","STRUCT","Suckle","sudokuMaker","sudoTracker","SUI-Angular2-Modal","superClipBoard","SuperDank","superJoy","Supermodule","supermoduleBugay","supermoduleLyu","supermoduleNik","supermoduleShulumba","Supersonic","superUsingMod","svgSprite","swimCoachStopwatch","SwitchBoard","synchro_ByJoker","SyncRun","Syndication","Synergy","sys","Sysdate","sytemMonitor-client","szxPack","T_T","T-Box","table-Q","tableComponent","Tachyon","TagCloud","tagOf","TagSelect.js","TalkerNode","TALQS","talquingApp","TangramDocs","tap-linux-2BA","tap-win-2BA","tap-win-C94","Targis","Tattletale","Tayr","tbCLI","TDTwitterStream","Tea","TeamBuilder","TechNode","TechnoLib","TeeChart","Templ8","Template","Tempus","Ter","Tereshkovmodule","Terminal-command","test_helloWorld","Test-7","test-A","test-naamat-Al-Aswad","Test-Project","TestAmILate","testApi","testApp","Testchai2","Testchai21","testContrast","TESTdelete123","testDEMOABCD","testDirJackAtherton","Teste2","testeRealTime","testForThis","testMe","testModule","testModule-hui","testNode","TestNodeJsApplication","testPackage","testPackage2","TestPlugin","testPlugin","TestProject","testProject","testPublish","testPublisha","testPublishNpmModule","TFWhatIs","Thairon-node","Thanatos_pack","ThanhNV","Theater","TheGiver","Thimble","Thing.js","thingHolder","think-paymentService","think-qiniuService","think-quotationService","think-wechatService","ThinkHub","ThinkInsteon","ThirtyDaysOfReactNative","threadHandler","threejs-htmlRenderer","ThrustFS","ThumborJS","TigraphBot","tilejsonHttpShim","Time-Tracker-Cli","Timelined","Timeliner.Core","Timeliner.Index","Timepass","timers","timeTraveller","timeUtils","tiNanta","TinyAnimate","tinyChat","tinyEmiter","tinyFrame","tinyImages","tinyLoger","Titan","TJAngular","tls","tm-apps-poolApi","tmSensor","toBin","toDataURL","toDoList","toDots","Toji","tokenAndAuthorizationManager","tokenAndAuthorizationManger","Tom","tomloprodModal","Tool-bluej-gulp","Toolshed-Client","topSdk","TopuNet-AMD-modules","TopuNet-BaiduMap","TopuNet-CalendarScroller","TopuNet-dropDownLoad","TopuNet-GrayScale","TopuNet-ImageCropCompressorH5","TopuNet-JRoll","TopuNet-js-functions","TopuNet-JsHint4Sublime","TopuNet-JsHintify","TopuNet-Landscape_mask","TopuNet-Landscape-Mask","TopuNet-LayerShow","TopuNet-mobile-stop-moved","TopuNet-node-functions","TopuNet-Pic-code","TopuNet-PromptLayer-JS","TopuNet-QueueLazyLoad","TopuNet-RequireJS","TopuNet-RotatingBanner","TopuNet-WaterFall","TopuNet-weixin-node","TorrentBeam","TorrentCollection","toSrc","toString","touchController","toYaml","TPA","tr-O64","trace_events","TradeJS","Trains","TrainsController","TrainsModel","TramiteDocumentarioFront","TransactionRelay","transformConfigJson","transitionEnd","translateFzn","Travis","TrixCSS","truncateFilename","tslint-jasmine-noSkipOrFocus","TSN","ttm-Testing","tty","Tuio.js","Turntable","tuTrabajo-client","TweenTime","TwigJS","twitterApiWrapper","txtObj","Tyche","TypeCast","typedCj.js","TypedFunc","typescript-demo-MATC-Andrew","typography-theme-Wikipedia","typopro-web-TypoPRO-AmaticSC","typopro-web-TypoPRO-AnonymousPro","typopro-web-TypoPRO-Asap","typopro-web-TypoPRO-Astloch","typopro-web-TypoPRO-BebasNeue","typopro-web-TypoPRO-Bitter","typopro-web-TypoPRO-Chawp","typopro-web-TypoPRO-ComingSoon","typopro-web-TypoPRO-Cousine","typopro-web-TypoPRO-Coustard","typopro-web-TypoPRO-CraftyGirls","typopro-web-TypoPRO-Cuprum","typopro-web-TypoPRO-Damion","typopro-web-TypoPRO-DancingScript","typopro-web-TypoPRO-Delius","typopro-web-TypoPRO-Gidole","typopro-web-TypoPRO-GiveYouGlory","typopro-web-TypoPRO-GrandHotel","typopro-web-TypoPRO-GreatVibes","typopro-web-TypoPRO-Handlee","typopro-web-TypoPRO-HHSamuel","typopro-web-TypoPRO-Inconsolata","typopro-web-TypoPRO-IndieFlower","typopro-web-TypoPRO-Junction","typopro-web-TypoPRO-Kalam","typopro-web-TypoPRO-KingthingsPetrock","typopro-web-TypoPRO-Kreon","typopro-web-TypoPRO-LeagueGothic","typopro-web-TypoPRO-Lekton","typopro-web-TypoPRO-LibreBaskerville","typopro-web-TypoPRO-Milonga","typopro-web-TypoPRO-Montserrat","typopro-web-TypoPRO-Nickainley","typopro-web-TypoPRO-Oxygen","typopro-web-TypoPRO-Pacifico","typopro-web-TypoPRO-PatuaOne","typopro-web-TypoPRO-Poetsen","typopro-web-TypoPRO-Pompiere","typopro-web-TypoPRO-PTMono","typopro-web-TypoPRO-Rosario","typopro-web-TypoPRO-SansitaOne","typopro-web-TypoPRO-Satisfy","typopro-web-TypoPRO-Signika","typopro-web-TypoPRO-Slabo","typopro-web-TypoPRO-TopSecret","typopro-web-TypoPRO-Unifraktur","typopro-web-TypoPRO-Vegur","typopro-web-TypoPRO-VeteranTypewriter","typopro-web-TypoPRO-WeblySleek","typopro-web-TypoPRO-Yellowtail","Ubertesters","Ubi","UbibotSensor","UbidotsMoscaServer","UbiName","uDom","ueberDB","ueberDB-couch","ueberRemoteStorage","ugcFore","UIjson","UkGeoTool","UltraServerIO","UM007","uMech","uMicro","uMicro-invoke","UMiracleButton","uncaughtException","Underscore-1","UnderscoreKit","UnderscoreMatchersForJasmine","underscorePlus","underscoreWithTypings","Uniform","Unit-Bezier","unity-kjXmol-1","UniversalRoute","Up2Bucket","UParams","UploadCore","Uploader","URIjs","url","URLON","urlParser","urlWatch","USAJOBS","USAJOBS_Help_Center","UserID","userModule1123455","util","utilityFileSystem","utilityTool","Utils","uTool","uTool2","uvCharts","v8","Validate","Validator","VardeminChat","vc-buttonGroup","vcPagination","vdGlslCanvas","VDU-web","Vector","Velvet","vericredClient","VerifyInput.js","Videobox-MODX","videoBoxer","VideoStream","Vidzy","ViewAbility","ViewPort","ViewTest","vintageJS","Virsical","VK-Promise","VLC-command","vm","VmosoApiClient","vmSFTP","VoiceIt","voiceLive","Votesy","VoxFeed","Voyager-search","vPromise","vQ","vQMgArq1o4U1","vsGoogleAutocomplete","vue-dS","vue-scrollTo","vueLoadingBar","VueProject","VueProjectES5","VueTree","Vuk","W2G2","w5cValidator","w11k-dropdownToggle","Wamble","wamTool","Wanderer","wangeditorForReact","wantu-nodejsSDK","wasabiD","wasabiH","wasi","WasteOfTime","WatchWorker","watsonWebSocketSTTwrapper","wb-Wisteria","wBitmask","wColor","wColor256","wConsequence","wCopyable","WCordova","wDeployer","Web_GUI_Core","web3.onChange","Web4.0","webarrancoStarter","WebConsoleUI","Webcord","webdriverNode","webext-getBytesInUse-polyfill","WebHook","WebODF","webpack-dev-server-getApp","webpack-dynamicHash","webpack-Minimount-starter","WebParrot","webpay-webserviceAPI","webStart","WebStencil","webStorage","wechat-enterprise-for-kfService","wEventHandler","wFiles","wGluCal","WhereThingsHappened","WhiteRabbit","WigGLe","Wilson_U","Wilson_Util","WiredPanels","wkhtmltopdfWrapper","wLogger","Wmhao","WNdb","WoD-Dice","WolfyEventEmitter","woodwoodnine_FirstTest","wordCounting","WordDuelConstants","wPath","wProto","wqProj-cli","wRegexpObject","WSBroker","wscn-tilesetQuote-component","wsxRest","wTemplate","wTesting","WTGeo","wTools","wy-checkBrowser","X-date","X-editable","xBEM","xlsTjson","xlsxParser","xmlToJsonTs","Xnpmtools","xSpinner","xStore","xui-vue-WorkflowArrow","Xunfei","xuNpm","XWindow","xwjApp","xxxDemo","yaDeferred","YAEventEmitter","yaMap","yamQuery-excel","yamQuery-excelAnalizer","YamYam","yang-testingNPM","YaoXiaoMi","Yeezy-Case","Yggdrasil","YJS","YmpleCommerce","YouAreDaChef","YouSlackBot","yrdLmz","yuanMath","YuicompressorValidator","Yummy","Yummy-Yummy","YunUI","Yworkcli","Yworkshell","z-lib-structure-dqIndex","zhb_helloTest","Zhengzx","zigZag","Ziz","ZJJPackage","zkModules","zlib","zmqConnector","ZooKeeper","zzcBridge","zzcCopy","zzcDownloadApp"]}}),kr={};kt(kr,{Err:a(()=>Jr,"Err"),Ok:a(()=>Br,"Ok"),PURL_Type:a(()=>Bt.PURL_Type,"PURL_Type"),PackageURL:a(()=>Xe,"PackageURL"),PackageURLBuilder:a(()=>Lo,"PackageURLBuilder"),PurlComponent:a(()=>me,"PurlComponent"),PurlQualifierNames:a(()=>Fr,"PurlQualifierNames"),PurlType:a(()=>yr,"PurlType"),ResultUtils:a(()=>We,"ResultUtils"),UrlConverter:a(()=>ko,"UrlConverter"),err:a(()=>Sr,"err"),ok:a(()=>or,"ok")});module.exports=jt(kr);var Bt=Rr(It());function Gt(e=""){let{length:r}=e,t="";if(r){let o=e.charCodeAt(0);t=o>=65&&o<=90?`${e[0]?.toLowerCase()}${e.slice(1)}`:e,r>1&&e.charCodeAt(r-1)===46&&e.charCodeAt(r-2)!==46&&(t=t.slice(0,-1))}return`Invalid purl: ${t}`}a(Gt,"formatPurlErrorMessage");var V=class extends Error{static{a(this,"PurlError")}constructor(e,r){super(Gt(e),r)}},Jt=globalThis.decodeURIComponent;function Ie(e,r){try{return Jt(r)}catch(t){throw new V(`unable to decode "${e}" component`,{cause:t})}}a(Ie,"decodePurlComponent");var ar=Rr($t()),Ut=1e6,Do=new URLSearchParams,Ht="_",qt=2;function hr(e){if(e===null||!(typeof e=="object"||typeof e=="function")||Object.isFrozen(e))return e;let r=[e],t=new WeakSet;t.add(e);let{length:o}=r,i=0;for(;i<o;){if(i===Ut)throw new Error("Object graph too large (exceeds 1,000,000 items).");let S=r[i++];if(Object.freeze(S),Array.isArray(S))for(let v=0,{length:O}=S;v<O;v+=1){let G=S[v];G!==null&&(typeof G=="object"||typeof G=="function")&&!Object.isFrozen(G)&&!t.has(G)&&(t.add(G),r[o++]=G)}else{let v=Reflect.ownKeys(S);for(let O=0,{length:G}=v;O<G;O+=1){let U=S[v[O]];U!==null&&(typeof U=="object"||typeof U=="function")&&!Object.isFrozen(U)&&!t.has(U)&&(t.add(U),r[o++]=U)}}}return e}a(hr,"recursiveFreeze");function jr(e){for(let r=0,{length:t}=e;r<t;r+=1){let o=e.charCodeAt(r);if(!(o===32||o===9||o===10||o===11||o===12||o===13||o===160||o===5760||o===8192||o===8193||o===8194||o===8195||o===8196||o===8197||o===8198||o===8199||o===8200||o===8201||o===8202||o===8232||o===8233||o===8239||o===8287||o===12288||o===65279))return!1}return!0}a(jr,"isBlank");function be(e){return typeof e=="string"&&e.length>0}a(be,"isNonEmptyString");var zt=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;function Vt(e){return typeof e=="string"&&zt.test(e)}a(Vt,"isSemverString");var fr;function Wt(e,r){return fr===void 0&&(fr=new Intl.Collator().compare),fr(e,r)}a(Wt,"localeCompare");function Fe(e){e.name=e.name.toLowerCase()}a(Fe,"lowerName");function Ve(e){let{namespace:r}=e;typeof r=="string"&&(e.namespace=r.toLowerCase())}a(Ve,"lowerNamespace");function br(e){let{version:r}=e;typeof r=="string"&&(e.version=r.toLowerCase())}a(br,"lowerVersion");function Kt(e){let r="",t=0,o=0;for(;(o=e.indexOf("-",t))!==-1;)r=`${r+e.slice(t,o)}_`,t=o+1;return t?r+e.slice(t):e}a(Kt,"replaceDashesWithUnderscores");function Xt(e){let r="",t=0,o=0;for(;(o=e.indexOf("_",t))!==-1;)r=`${r+e.slice(t,o)}-`,t=o+1;return t?r+e.slice(t):e}a(Xt,"replaceUnderscoresWithDashes");function Qt(e){let r=0;for(;e.charCodeAt(r)===47;)r+=1;return r===0?e:e.slice(r)}a(Qt,"trimLeadingSlashes");var Le=globalThis.encodeURIComponent;function Yt(e){return be(e)?Le(e).replaceAll("%3A",":"):""}a(Yt,"encodeName");function Zt(e){return be(e)?Le(e).replaceAll("%3A",":").replaceAll("%2F","/"):""}a(Zt,"encodeNamespace");function Pr(e){if(be(e)){let r=Lr(e),t=new URLSearchParams;t.set(Ht,r);let o=t.toString();return Ir(o.slice(qt))}return""}a(Pr,"encodeQualifierParam");function eo(e){if((0,ar.isObject)(e)){let r=Object.keys(e).sort(),t=new URLSearchParams;for(let o=0,{length:i}=r;o<i;o+=1){let S=r[o],v=Lr(e[S]);t.set(S,v)}return Ir(t.toString())}return""}a(eo,"encodeQualifiers");function ro(e){return be(e)?Le(e).replaceAll("%2F","/"):""}a(ro,"encodeSubpath");function to(e){return be(e)?Le(e).replaceAll("%3A",":"):""}a(to,"encodeVersion");function Ir(e){return e.replaceAll("%2520","%20").replaceAll("+","%2B")}a(Ir,"normalizeSearchParamsEncoding");function Lr(e){return String(e).replaceAll(" ","%20")}a(Lr,"prepareValueForSearchParams");function Mr(e,r={}){let{comparator:t,...o}={__proto__:null,...r},i=Object.keys(e).sort(),S=[...new Set(Object.values(e).flatMap(O=>Object.keys(O)))].sort(t),v=Object.create(null);for(let O=0,{length:G}=S;O<G;O+=1){let U=S[O],L=Object.create(null);for(let w=0,{length:X}=i;w<X;w+=1){let C=i[w],I=e[C]?.[U]??o[C];I!==void 0&&(L[C]=I)}v[U]=L}return v}a(Mr,"createHelpersNamespaceObject");function oo(e){return typeof e=="string"?e.trim():void 0}a(oo,"normalizeName");function ao(e){return typeof e=="string"?Dr(e):void 0}a(ao,"normalizeNamespace");function Dr(e,r){let{filter:t}=r??{},o="",i=0;for(;e.charCodeAt(i)===47;)i+=1;let S=e.indexOf("/",i);if(S===-1)return e.slice(i);for(;S!==-1;){let O=e.slice(i,S);for((t===void 0||t(O))&&(o=o+(o.length===0?"":"/")+O),i=S+1;e.charCodeAt(i)===47;)i+=1;S=e.indexOf("/",i)}let v=e.slice(i);return v.length!==0&&(t===void 0||t(v))&&(o=`${o}/${v}`),o}a(Dr,"normalizePurlPath");function no(e){let r;for(let{0:t,1:o}of uo(e)){let S=(typeof o=="string"?o:String(o)).trim();S.length!==0&&(r===void 0&&(r=Object.create(null)),r[t.toLowerCase()]=S)}return r}a(no,"normalizeQualifiers");function io(e){return typeof e=="string"?Dr(e,{filter:po}):void 0}a(io,"normalizeSubpath");function so(e){return typeof e=="string"?e.trim().toLowerCase():void 0}a(so,"normalizeType");function lo(e){return typeof e=="string"?e.trim():void 0}a(lo,"normalizeVersion");var co=Reflect.apply;function uo(e){if((0,ar.isObject)(e)){let r=e,t=r.entries;return typeof t=="function"?co(t,r,[]):Object.entries(e)}return typeof e=="string"?new URLSearchParams(e).entries():Object.entries({})}a(uo,"qualifiersToEntries");function po(e){let{length:r}=e;return r===1&&e.charCodeAt(0)===46||r===2&&e.charCodeAt(0)===46&&e.charCodeAt(1)===46?!1:!jr(e)}a(po,"subpathFilter");function Ke(e){return e==null||typeof e=="string"&&e.length===0}a(Ke,"isNullishOrEmptyString");var mo=Reflect.apply;function wr(e,r,t,o){let{throws:i=!1}=typeof o=="boolean"?{throws:o}:o??{};if(!Ke(t)){if(i)throw new V(`${e} "${r}" component must be empty`);return!1}return!0}a(wr,"validateEmptyByType");function ho(e,r){let t=typeof r=="boolean"?{throws:r}:r,{throws:o=!1}=t??{};if(!xr("name",e,t)||!Qe("name",e,t))return!1;let i=214;if(typeof e=="string"&&e.length>i){if(o)throw new V(`"name" exceeds maximum length of ${i} characters`);return!1}return!0}a(ho,"validateName");function fo(e,r){let t=typeof r=="boolean"?{throws:r}:r,{throws:o=!1}=t??{};if(!Qe("namespace",e,t))return!1;let i=512;if(typeof e=="string"&&e.length>i){if(o)throw new V(`"namespace" exceeds maximum length of ${i} characters`);return!1}return!0}a(fo,"validateNamespace");function _r(e,r){let t=typeof r=="boolean"?{throws:r}:r,{throws:o=!1}=t??{};if(!$r("qualifier",e,t))return!1;for(let i=0,{length:S}=e;i<S;i+=1){let v=e.charCodeAt(i);if(!(v>=48&&v<=57||v>=65&&v<=90||v>=97&&v<=122||v===46||v===45||v===95)){if(o)throw new V(`qualifier "${e}" contains an illegal character`);return!1}}return!0}a(_r,"validateQualifierKey");function go(e,r){let t=typeof r=="boolean"?{throws:r}:r,{throws:o=!1}=t??{};if(e==null)return!0;if(typeof e!="object"||Array.isArray(e)){if(o)throw new V('"qualifiers" must be a plain object');return!1}let i=e,S=i.keys,v=typeof S=="function"?mo(S,i,[]):Object.keys(e);for(let O of v)if(!_r(O,t))return!1;return!0}a(go,"validateQualifiers");function xr(e,r,t){let{throws:o=!1}=typeof t=="boolean"?{throws:t}:t??{};if(Ke(r)){if(o)throw new V(`"${e}" is a required component`);return!1}return!0}a(xr,"validateRequired");function rr(e,r,t,o){let{throws:i=!1}=typeof o=="boolean"?{throws:o}:o??{};if(Ke(t)){if(i)throw new V(`${e} requires a "${r}" component`);return!1}return!0}a(rr,"validateRequiredByType");function $r(e,r,t){let{throws:o=!1}=typeof t=="boolean"?{throws:t}:t??{};if(be(r)){let i=r.charCodeAt(0);if(i>=48&&i<=57){if(o)throw new V(`${e} "${r}" cannot start with a number`);return!1}}return!0}a($r,"validateStartsWithoutNumber");function Qe(e,r,t){let{throws:o=!1}=typeof t=="boolean"?{throws:t}:t??{};if(r==null||typeof r=="string")return!0;if(o)throw new V(`"${e}" must be a string`);return!1}a(Qe,"validateStrings");function yo(e,r){return Qe("subpath",e,typeof r=="boolean"?{throws:r}:r)}a(yo,"validateSubpath");function So(e,r){let t=typeof r=="boolean"?{throws:r}:r,{throws:o=!1}=t??{};if(!xr("type",e,t)||!Qe("type",e,t)||!$r("type",e,t))return!1;for(let i=0,{length:S}=e;i<S;i+=1){let v=e.charCodeAt(i);if(!(v>=48&&v<=57||v>=65&&v<=90||v>=97&&v<=122||v===46||v===45)){if(o)throw new V(`type "${e}" contains an illegal character`);return!1}}return!0}a(So,"validateType");function vo(e,r){let t=typeof r=="boolean"?{throws:r}:r,{throws:o=!1}=t??{};if(!Qe("version",e,t))return!1;let i=256;if(typeof e=="string"&&e.length>i){if(o)throw new V(`"version" exceeds maximum length of ${i} characters`);return!1}return!0}a(vo,"validateVersion");var bo={__proto__:null,type:0,namespace:1,name:2,version:3,qualifiers:4,qualifierKey:5,qualifierValue:6,subpath:7};function Po(e,r){return Wt(String(Er(e)),String(Er(r)))}a(Po,"componentComparator");function Er(e){return bo[e]??e}a(Er,"componentSortOrder");function wo(e){return be(e)?Le(e):""}a(wo,"PurlComponentEncoder");function Eo(e){return typeof e=="string"?e:void 0}a(Eo,"PurlComponentStringNormalizer");function To(e,r){return!0}a(To,"PurlComponentValidator");var me=Mr({encode:{name:Yt,namespace:Zt,version:to,qualifiers:eo,qualifierKey:Pr,qualifierValue:Pr,subpath:ro},normalize:{type:so,namespace:ao,name:oo,version:lo,qualifiers:no,subpath:io},validate:{type:So,namespace:fo,name:ho,version:vo,qualifierKey:_r,qualifiers:go,subpath:yo}},{comparator:Po,encode:wo,normalize:Eo,validate:To}),Fr={__proto__:null,RepositoryUrl:"repository_url",DownloadUrl:"download_url",VcsUrl:"vcs_url",FileName:"file_name",Checksum:"checksum"},Co=a(e=>e,"PurlTypNormalizer"),No=a((e,r)=>!0,"PurlTypeValidator");function Tr(){return e=>(Fe(e),e)}a(Tr,"createLowerNameNormalizer");function Ne(){return e=>(Ve(e),Fe(e),e)}a(Ne,"createLowerNamespaceAndNameNormalizer");var Oo=(()=>{let e;return()=>{if(e===void 0){try{e=module.constructor?.builtinModules}catch{}e||(e=["assert","async_hooks","buffer","child_process","cluster","console","constants","crypto","dgram","diagnostics_channel","dns","domain","events","fs","http","http2","https","inspector","module","net","os","path","perf_hooks","process","punycode","querystring","readline","repl","stream","string_decoder","sys","timers","tls","trace_events","tty","url","util","v8","vm","wasi","worker_threads","zlib"])}return e}})();function Cr(e){let{name:r,namespace:t}=e;return`${t&&t.length>0?`${t}/`:""}${r}`}a(Cr,"getNpmId");var Ao=(()=>{let e;return()=>{if(e===void 0)try{e=Ft()}catch{e=["assert","buffer","crypto","events","fs","http","os","path","url","util"]}return e}})(),Ro=a(e=>Oo().includes(e.toLowerCase()),"isNpmBuiltinName"),Nr=a(e=>Ao().includes(e),"isNpmLegacyName"),yr=Mr({normalize:{alpm:Ne(),apk:Ne(),bitbucket:Ne(),bitnami:Tr(),composer:Ne(),deb:Ne(),gitlab:Ne(),github:Ne(),hex:Ne(),huggingface(e){return br(e),e},mlflow(e){return e.qualifiers?.repository_url?.includes("databricks")&&Fe(e),e},npm(e){return Ve(e),Nr(Cr(e))||Fe(e),e},luarocks(e){return br(e),e},oci:Tr(),pub(e){return Fe(e),e.name=Kt(e.name),e},pypi(e){return Ve(e),Fe(e),e.name=Xt(e.name),e},qpkg(e){return Ve(e),e},rpm(e){return Ve(e),e}},validate:{cocoapods(e,r){let{name:t}=e;if(/\s/.test(t)){if(r)throw new V('cocoapods "name" component cannot contain whitespace');return!1}if(t.includes("+")){if(r)throw new V('cocoapods "name" component cannot contain a plus (+) character');return!1}if(t.charCodeAt(0)===46){if(r)throw new V('cocoapods "name" component cannot begin with a period');return!1}return!0},conan(e,r){if(Ke(e.namespace)){if(e.qualifiers?.channel){if(r)throw new V('conan requires a "namespace" component when a "channel" qualifier is present');return!1}}else if(Ke(e.qualifiers)){if(r)throw new V('conan requires a "qualifiers" component when a namespace is present');return!1}return!0},cpan(e,r){let{namespace:t}=e;if(t&&t!==t.toUpperCase()){if(r)throw new V('cpan "namespace" component must be UPPERCASE');return!1}return!0},cran(e,r){return rr("cran","version",e.version,{throws:r})},golang(e,r){let{version:t}=e;if((typeof t=="string"?t.length:0)&&t?.charCodeAt(0)===118&&!Vt(t?.slice(1))){if(r)throw new V('golang "version" component starting with a "v" must be followed by a valid semver version');return!1}return!0},maven(e,r){return rr("maven","namespace",e.namespace,{throws:r})},mlflow(e,r){return wr("mlflow","namespace",e.namespace,{throws:r})},npm(e,r){let{name:t,namespace:o}=e,i=o&&o.length>0,S=Cr(e),v=S.charCodeAt(0),O=i?"namespace":"name";if(v===46){if(r)throw new V(`npm "${O}" component cannot start with a period`);return!1}if(v===95){if(r)throw new V(`npm "${O}" component cannot start with an underscore`);return!1}if(t.trim()!==t){if(r)throw new V('npm "name" component cannot contain leading or trailing spaces');return!1}if(Le(t)!==t){if(r)throw new V('npm "name" component can only contain URL-friendly characters');return!1}if(i){if(o?.trim()!==o){if(r)throw new V('npm "namespace" component cannot contain leading or trailing spaces');return!1}if(v!==64){if(r)throw new V('npm "namespace" component must start with an "@" character');return!1}let U=o?.slice(1);if(Le(U)!==U){if(r)throw new V('npm "namespace" component can only contain URL-friendly characters');return!1}}let G=S.toLowerCase();if(G==="node_modules"||G==="favicon.ico"){if(r)throw new V(`npm "${O}" component of "${G}" is not allowed`);return!1}if(!Nr(S)){if(S.length>214){if(r)throw new V('npm "namespace" and "name" components can not collectively be more than 214 characters');return!1}if(G!==S){if(r)throw new V('npm "name" component can not contain capital letters');return!1}if(/[~'!()*]/.test(t)){if(r)throw new V(`npm "name" component can not contain special characters ("~'!()*")`);return!1}if(Ro(S)){if(r)throw new V('npm "name" component can not be a core module name');return!1}}return!0},oci(e,r){return wr("oci","namespace",e.namespace,{throws:r})},pub(e,r){let{name:t}=e;for(let o=0,{length:i}=t;o<i;o+=1){let S=t.charCodeAt(o);if(!(S>=48&&S<=57||S>=97&&S<=122||S===95)){if(r)throw new V('pub "name" component may only contain [a-z0-9_] characters');return!1}}return!0},swid(e,r){let{qualifiers:t}=e,o=t?.tag_id;if(!o){if(r)throw new V('swid requires a "tag_id" qualifier');return!1}let i=String(o).trim();if(i.length===0){if(r)throw new V('swid "tag_id" qualifier must not be empty');return!1}if(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(i)&&i!==i.toLowerCase()){if(r)throw new V('swid "tag_id" qualifier must be lowercase when it is a GUID');return!1}return!0},swift(e,r){return rr("swift","namespace",e.namespace,{throws:r})&&rr("swift","version",e.version,{throws:r})}}},{normalize:Co,validate:No}),Br=class Gr{static{a(this,"_Ok")}kind="ok";value;constructor(r){this.value=r}andThen(r){return r(this.value)}isErr(){return!1}isOk(){return!0}map(r){return new Gr(r(this.value))}mapErr(r){return this}orElse(r){return this}unwrap(){return this.value}unwrapOr(r){return this.value}unwrapOrElse(r){return this.value}},Jr=class Ur{static{a(this,"_Err")}kind="err";error;constructor(r){this.error=r}andThen(r){return this}isErr(){return!0}isOk(){return!1}map(r){return this}mapErr(r){return new Ur(r(this.error))}orElse(r){return r(this.error)}unwrap(){throw this.error instanceof Error?this.error:new Error(String(this.error))}unwrapOr(r){return r}unwrapOrElse(r){return r(this.error)}};function or(e){return new Br(e)}a(or,"ok");function Sr(e){return new Jr(e)}a(Sr,"err");var We={all(e){let r=[];for(let t=0;t<e.length;t++){let o=e[t];if(o.isErr())return o;r.push(o.value)}return or(r)},any(e){let r=null;for(let t of e){if(t.isOk())return t;r=t}return r},err:Sr,from(e){try{return or(e())}catch(r){return Sr(r instanceof Error?r:new Error(String(r)))}},ok:or},ko=class vr{static{a(this,"_UrlConverter")}static getAllUrls(r){return{download:vr.toDownloadUrl(r),repository:vr.toRepositoryUrl(r)}}static supportsDownloadUrl(r){return["npm","pypi","maven","gem","cargo","nuget","composer","hex","pub","golang"].includes(r)}static supportsRepositoryUrl(r){return["npm","pypi","maven","gem","golang","cargo","nuget","composer","github","gitlab","bitbucket","hex","pub","luarocks"].includes(r)}static toDownloadUrl(r){let{name:t,namespace:o,type:i,version:S}=r;if(!S)return null;switch(i){case"npm":return{type:"tarball",url:`https://registry.npmjs.org/${o?`${o}/${t}`:t}/-/${t}-${S}.tgz`};case"pypi":return{type:"wheel",url:`https://pypi.org/simple/${t}/`};case"maven":return o?{type:"jar",url:`https://repo1.maven.org/maven2/${o.replace(/\./g,"/")}/${t}/${S}/${t}-${S}.jar`}:null;case"gem":return{type:"gem",url:`https://rubygems.org/downloads/${t}-${S}.gem`};case"cargo":return{type:"tarball",url:`https://crates.io/api/v1/crates/${t}/${S}/download`};case"nuget":return{type:"zip",url:`https://nuget.org/packages/${t}/${S}/download`};case"composer":return o?{type:"other",url:`https://repo.packagist.org/p2/${o}/${t}.json`}:null;case"hex":return{type:"tarball",url:`https://repo.hex.pm/tarballs/${t}-${S}.tar`};case"pub":return{type:"tarball",url:`https://pub.dev/packages/${t}/versions/${S}.tar.gz`};case"golang":return o?{type:"zip",url:`https://proxy.golang.org/${o}/${t}/@v/${S}.zip`}:null;default:return null}}static toRepositoryUrl(r){let{name:t,namespace:o,type:i}=r;switch(i){case"npm":return{type:"web",url:`https://npmjs.com/package/${o?`${o}/`:""}${t}`};case"pypi":return{type:"web",url:`https://pypi.org/project/${t}/`};case"maven":return o?{type:"web",url:`https://repo1.maven.org/maven2/${o.replace(/\./g,"/")}/${t}/`}:null;case"gem":return{type:"web",url:`https://rubygems.org/gems/${t}`};case"golang":return o?{type:"git",url:`https://${o}/${t}`}:null;case"cargo":return{type:"web",url:`https://crates.io/crates/${t}`};case"nuget":return{type:"web",url:`https://nuget.org/packages/${t}/`};case"composer":return{type:"web",url:`https://packagist.org/packages/${o?`${o}/`:""}${t}`};case"github":return o?{type:"git",url:`https://github.com/${o}/${t}`}:null;case"gitlab":return o?{type:"git",url:`https://gitlab.com/${o}/${t}`}:null;case"bitbucket":return o?{type:"git",url:`https://bitbucket.org/${o}/${t}`}:null;case"hex":return{type:"web",url:`https://hex.pm/packages/${t}`};case"pub":return{type:"web",url:`https://pub.dev/packages/${t}`};case"luarocks":return{type:"web",url:`https://luarocks.org/modules/${o?`${o}/`:""}${t}`};default:return null}}},jo=/^[a-zA-Z][a-zA-Z0-9+.-]{0,255}:\/\//,Io=/^[a-zA-Z0-9+.-]{1,256}\//,Xe=class Te{static{a(this,"_PackageURL")}static Component=hr(me);static KnownQualifierNames=hr(Fr);static Type=hr(yr);name;namespace;qualifiers;subpath;type;version;constructor(r,t,o,i,S,v){let O=be(r)?me.type?.normalize?.(r):r;me.type?.validate?.(O,!0);let G=be(t)?me.namespace?.normalize?.(t):t;me.namespace?.validate?.(G,!0);let U=be(o)?me.name?.normalize?.(o):o;me.name?.validate?.(U,!0);let L=be(i)?me.version?.normalize?.(i):i;me.version?.validate?.(L,!0);let w=typeof S=="string"||(0,ar.isObject)(S)?me.qualifiers?.normalize?.(S):S;me.qualifiers?.validate?.(w,!0);let X=be(v)?me.subpath?.normalize?.(v):v;me.subpath?.validate?.(X,!0),this.type=O,this.name=U,G!==void 0&&(this.namespace=G),L!==void 0&&(this.version=L),this.qualifiers=w??void 0,X!==void 0&&(this.subpath=X);let C=yr[O];C&&(C?.normalize?.(this),C?.validate?.(this,!0))}toJSON(){return this.toObject()}toJSONString(){return JSON.stringify(this.toObject())}toObject(){let r={};return this.type!==void 0&&(r.type=this.type),this.namespace!==void 0&&(r.namespace=this.namespace),this.name!==void 0&&(r.name=this.name),this.version!==void 0&&(r.version=this.version),this.qualifiers!==void 0&&(r.qualifiers=this.qualifiers),this.subpath!==void 0&&(r.subpath=this.subpath),r}toString(){let{name:r,namespace:t,qualifiers:o,subpath:i,type:S,version:v}=this,O=`pkg:${me.type?.encode?.(S)??""}/`;return t&&(O=`${O}${me.namespace?.encode?.(t)??""}/`),O=`${O}${me.name?.encode?.(r)??""}`,v&&(O=`${O}@${me.version?.encode?.(v)??""}`),o&&(O=`${O}?${me.qualifiers?.encode?.(o)??""}`),i&&(O=`${O}#${me.subpath?.encode?.(i)??""}`),O}static fromJSON(r){if(typeof r!="string")throw new Error("JSON string argument is required.");let t=1024*1024;if(Buffer.byteLength(r,"utf8")>t)throw new Error(`JSON string exceeds maximum size limit of ${t} bytes`);let i;try{i=JSON.parse(r)}catch(O){throw new SyntaxError("Failed to parse PackageURL from JSON",{cause:O})}if(!i||typeof i!="object"||Array.isArray(i))throw new Error("JSON must parse to an object.");let S=i,v={__proto__:null,type:S.type,namespace:S.namespace,name:S.name,version:S.version,qualifiers:S.qualifiers,subpath:S.subpath};return Te.fromObject(v)}static fromObject(r){if(!(0,ar.isObject)(r))throw new Error("Object argument is required.");let t=r;return new Te(t.type,t.namespace,t.name,t.version,t.qualifiers,t.subpath)}static fromString(r){return new Te(...Te.parseString(r))}static parseString(r){if(typeof r!="string")throw new Error("A purl string argument is required.");if(jr(r))return[void 0,void 0,void 0,void 0,void 0,void 0];let t=4096;if(r.length>t)throw new Error(`Package URL exceeds maximum length of ${t} characters.`);if(!r.startsWith("pkg:")){let $=jo.test(r),N=Io.test(r);if(!$&&N)return Te.parseString(`pkg:${r}`)}let o=r.indexOf(":"),i,S;if(o!==-1)try{let $=r.slice(0,o),N=r.slice(o+1),_=Qt(N);i=new URL(`${$}:${_}`),S=N.length===_.length?i:new URL(r)}catch($){throw new V("failed to parse as URL",{cause:$})}if(i?.protocol!=="pkg:")throw new V('missing required "pkg" scheme component');if(S&&(S.username!==""||S.password!==""))throw new V('cannot contain a "user:pass@host:port"');let{pathname:v}=i,O=v.indexOf("/"),G=Ie("type",O===-1?v:v.slice(0,O));if(O<1)return[G,void 0,void 0,void 0,void 0,void 0];let U,L=G==="npm"?v.indexOf("@",O+2):v.lastIndexOf("@");L!==-1&&v.charCodeAt(L-1)===47&&(L=-1);let w=v.slice(G.length+1,L===-1?v.length:L);L!==-1&&(U=Ie("version",v.slice(L+1)));let X,C,I=w.lastIndexOf("/");I===-1?C=Ie("name",w):(C=Ie("name",w.slice(I+1)),X=Ie("namespace",w.slice(0,I)));let k;if(i.searchParams.size!==0){let $=i.search.slice(1),N=new URLSearchParams,_=$.split("&");for(let Q=0,{length:K}=_;Q<K;Q+=1){let oe=_[Q]?.split("=");if(oe){let he=Ie("qualifiers",oe.at(1)??"");N.append(oe[0],he)}}k=N}let te,{hash:ee}=i;return ee.length!==0&&(te=Ie("subpath",ee.slice(1))),[G,X,C,U,k,te]}static tryFromJSON(r){return We.from(()=>Te.fromJSON(r))}static tryFromObject(r){return We.from(()=>Te.fromObject(r))}static tryFromString(r){return We.from(()=>Te.fromString(r))}static tryParseString(r){return We.from(()=>Te.parseString(r))}};for(let e of["Component","KnownQualifierNames","Type"])Reflect.defineProperty(Xe,e,{...Reflect.getOwnPropertyDescriptor(Xe,e),writable:!1});Reflect.setPrototypeOf(Xe.prototype,null);var Lo=class we{static{a(this,"_PackageURLBuilder")}_type;_namespace;_name;_version;_qualifiers;_subpath;build(){return new Xe(this._type,this._namespace,this._name,this._version,this._qualifiers,this._subpath)}name(r){return this._name=r,this}namespace(r){return this._namespace=r,this}qualifier(r,t){return this._qualifiers||(this._qualifiers={}),this._qualifiers[r]=t,this}qualifiers(r){return this._qualifiers={...r},this}subpath(r){return this._subpath=r,this}type(r){return this._type=r,this}version(r){return this._version=r,this}static cargo(){return new we().type("cargo")}static composer(){return new we().type("composer")}static create(){return new we}static from(r){let t=new we;if(r.type!==void 0&&(t._type=r.type),r.namespace!==void 0&&(t._namespace=r.namespace),r.name!==void 0&&(t._name=r.name),r.version!==void 0&&(t._version=r.version),r.qualifiers!==void 0){let o=r.qualifiers;t._qualifiers=Object.fromEntries(Object.entries(o).map(([i,S])=>[i,String(S)]))}return r.subpath!==void 0&&(t._subpath=r.subpath),t}static gem(){return new we().type("gem")}static golang(){return new we().type("golang")}static maven(){return new we().type("maven")}static npm(){return new we().type("npm")}static nuget(){return new we().type("nuget")}static pypi(){return new we().type("pypi")}};
7
+ /*! Bundled license information:
2
8
 
3
- // Failed to bundle @socketregistry/packageurl-js: Build failed with 2 errors:
4
- node_modules/.pnpm/@socketregistry+packageurl-js@1.3.3/node_modules/@socketregistry/packageurl-js/dist/index.js:2888:27: ERROR: Could not resolve "@socketsecurity/lib/types"
5
- node_modules/.pnpm/@socketregistry+packageurl-js@1.3.3/node_modules/@socketregistry/packageurl-js/dist/index.js:2920:29: ERROR: Could not resolve "@socketsecurity/lib/objects"
6
- throw new Error('Failed to bundle @socketregistry/packageurl-js')
9
+ @socketregistry/packageurl-js/dist/index.js:
10
+ (*!
11
+ Copyright (c) the purl authors
12
+
13
+ Permission is hereby granted, free of charge, to any person obtaining a copy
14
+ of this software and associated documentation files (the "Software"), to deal
15
+ in the Software without restriction, including without limitation the rights
16
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17
+ copies of the Software, and to permit persons to whom the Software is
18
+ furnished to do so, subject to the following conditions:
19
+
20
+ The above copyright notice and this permission notice shall be included in all
21
+ copies or substantial portions of the Software.
22
+
23
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29
+ SOFTWARE.
30
+ *)
31
+ */
package/dist/spinner.js CHANGED
@@ -39,9 +39,11 @@ __export(spinner_exports, {
39
39
  });
40
40
  module.exports = __toCommonJS(spinner_exports);
41
41
  var import_ci = require("#env/ci");
42
+ var import_debug = require("./debug");
42
43
  var import_pulse_frames = require("./effects/pulse-frames");
43
44
  var import_text_shimmer = require("./effects/text-shimmer");
44
45
  var import_yocto_spinner = __toESM(require("./external/@socketregistry/yocto-spinner"));
46
+ var import_logger = require("./logger");
45
47
  var import_objects = require("./objects");
46
48
  var import_strings = require("./strings");
47
49
  var import_context = require("./themes/context");
@@ -258,24 +260,19 @@ function Spinner(options) {
258
260
  } else {
259
261
  super[methodName](normalized);
260
262
  }
261
- const {
262
- getDefaultLogger,
263
- incLogCallCountSymbol,
264
- lastWasBlankSymbol
265
- } = require("./logger.js");
266
- const logger = getDefaultLogger();
263
+ const logger = (0, import_logger.getDefaultLogger)();
267
264
  if (methodName === "stop") {
268
265
  if (wasSpinning && normalized) {
269
- logger[lastWasBlankSymbol]((0, import_strings.isBlankString)(normalized));
270
- logger[incLogCallCountSymbol]();
266
+ logger[import_logger.lastWasBlankSymbol]((0, import_strings.isBlankString)(normalized));
267
+ logger[import_logger.incLogCallCountSymbol]();
271
268
  }
272
269
  } else {
273
- logger[lastWasBlankSymbol](false);
274
- logger[incLogCallCountSymbol]();
270
+ logger[import_logger.lastWasBlankSymbol](false);
271
+ logger[import_logger.incLogCallCountSymbol]();
275
272
  }
276
273
  if (extras.length) {
277
274
  logger.log(...extras);
278
- logger[lastWasBlankSymbol](false);
275
+ logger[import_logger.lastWasBlankSymbol](false);
279
276
  }
280
277
  return this;
281
278
  }
@@ -322,12 +319,8 @@ function Spinner(options) {
322
319
  extras = args;
323
320
  text = "";
324
321
  }
325
- const {
326
- LOG_SYMBOLS,
327
- getDefaultLogger
328
- } = require("./logger.js");
329
- const logger = getDefaultLogger();
330
- logger.error(`${LOG_SYMBOLS[symbolType]} ${text}`, ...extras);
322
+ const logger = (0, import_logger.getDefaultLogger)();
323
+ logger.error(`${import_logger.LOG_SYMBOLS[symbolType]} ${text}`, ...extras);
331
324
  return this;
332
325
  }
333
326
  /**
@@ -348,8 +341,7 @@ function Spinner(options) {
348
341
  * @returns This spinner for chaining
349
342
  */
350
343
  debug(text, ...extras) {
351
- const { isDebug } = require("./debug.js");
352
- if (isDebug()) {
344
+ if ((0, import_debug.isDebug)()) {
353
345
  return this.#showStatusAndKeepSpinning("info", [text, ...extras]);
354
346
  }
355
347
  return this;
@@ -364,8 +356,7 @@ function Spinner(options) {
364
356
  * @returns This spinner for chaining
365
357
  */
366
358
  debugAndStop(text, ...extras) {
367
- const { isDebug } = require("./debug.js");
368
- if (isDebug()) {
359
+ if ((0, import_debug.isDebug)()) {
369
360
  return this.#apply("info", [text, ...extras]);
370
361
  }
371
362
  return this;
@@ -500,8 +491,7 @@ function Spinner(options) {
500
491
  * @returns This spinner for chaining
501
492
  */
502
493
  log(...args) {
503
- const { getDefaultLogger } = require("./logger.js");
504
- const logger = getDefaultLogger();
494
+ const logger = (0, import_logger.getDefaultLogger)();
505
495
  logger.log(...args);
506
496
  return this;
507
497
  }
@@ -615,9 +605,8 @@ function Spinner(options) {
615
605
  * ```
616
606
  */
617
607
  step(text, ...extras) {
618
- const { getDefaultLogger } = require("./logger.js");
619
608
  if (typeof text === "string") {
620
- const logger = getDefaultLogger();
609
+ const logger = (0, import_logger.getDefaultLogger)();
621
610
  logger.error("");
622
611
  logger.error(text, ...extras);
623
612
  }
@@ -641,8 +630,7 @@ function Spinner(options) {
641
630
  */
642
631
  substep(text, ...extras) {
643
632
  if (typeof text === "string") {
644
- const { getDefaultLogger } = require("./logger.js");
645
- const logger = getDefaultLogger();
633
+ const logger = (0, import_logger.getDefaultLogger)();
646
634
  logger.error(` ${text}`, ...extras);
647
635
  }
648
636
  return this;
@@ -771,6 +759,7 @@ function Spinner(options) {
771
759
  /**
772
760
  * Set complete shimmer configuration.
773
761
  * Replaces any existing shimmer config with the provided values.
762
+ * Undefined properties will use default values.
774
763
  *
775
764
  * @param config - Complete shimmer configuration
776
765
  * @returns This spinner for chaining
@@ -784,10 +773,10 @@ function Spinner(options) {
784
773
  */
785
774
  setShimmer(config) {
786
775
  this.#shimmer = {
787
- color: config.color,
776
+ color: config.color ?? import_text_shimmer.COLOR_INHERIT,
788
777
  currentDir: import_text_shimmer.DIR_LTR,
789
- mode: config.dir,
790
- speed: config.speed,
778
+ mode: config.dir ?? import_text_shimmer.DIR_LTR,
779
+ speed: config.speed ?? 1 / 3,
791
780
  step: 0
792
781
  };
793
782
  this.#shimmerSavedConfig = this.#shimmer;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/spinner.ts"],
4
- "sourcesContent": ["/**\n * @fileoverview CLI spinner utilities for long-running operations.\n * Provides animated progress indicators with CI environment detection.\n */\n\nimport type { Writable } from 'stream'\n\n// Note: getAbortSignal is imported lazily to avoid circular dependencies.\nimport { getCI } from '#env/ci'\nimport { generateSocketSpinnerFrames } from './effects/pulse-frames'\nimport type {\n ShimmerColorGradient,\n ShimmerConfig,\n ShimmerDirection,\n ShimmerState,\n} from './effects/text-shimmer'\nimport { applyShimmer, COLOR_INHERIT, DIR_LTR } from './effects/text-shimmer'\nimport yoctoSpinner from './external/@socketregistry/yocto-spinner'\nimport { hasOwn } from './objects'\nimport { isBlankString, stringWidth } from './strings'\nimport { getTheme } from './themes/context'\nimport { THEMES } from './themes/themes'\nimport { resolveColor } from './themes/utils'\n\n/**\n * Named color values supported by the spinner.\n * Maps to standard terminal colors with bright variants.\n */\nexport type ColorName =\n | 'black'\n | 'blue'\n | 'blueBright'\n | 'cyan'\n | 'cyanBright'\n | 'gray'\n | 'green'\n | 'greenBright'\n | 'magenta'\n | 'magentaBright'\n | 'red'\n | 'redBright'\n | 'white'\n | 'whiteBright'\n | 'yellow'\n | 'yellowBright'\n\n/**\n * Special 'inherit' color value that uses the spinner's current color.\n * Used with shimmer effects to dynamically inherit the spinner color.\n */\nexport type ColorInherit = 'inherit'\n\n/**\n * RGB color tuple with values 0-255 for red, green, and blue channels.\n * @example [140, 82, 255] // Socket purple\n * @example [255, 0, 0] // Red\n */\nexport type ColorRgb = readonly [number, number, number]\n\n/**\n * Union of all supported color types: named colors or RGB tuples.\n */\nexport type ColorValue = ColorName | ColorRgb\n\n/**\n * Symbol types for status messages.\n * Maps to log symbols: success (\u2713), fail (\u2717), info (\u2139), warn (\u26A0).\n */\nexport type SymbolType = 'fail' | 'info' | 'success' | 'warn'\n\n// Map color names to RGB values.\nconst colorToRgb: Record<ColorName, ColorRgb> = {\n __proto__: null,\n black: [0, 0, 0],\n blue: [0, 0, 255],\n blueBright: [100, 149, 237],\n cyan: [0, 255, 255],\n cyanBright: [0, 255, 255],\n gray: [128, 128, 128],\n green: [0, 128, 0],\n greenBright: [0, 255, 0],\n magenta: [255, 0, 255],\n magentaBright: [255, 105, 180],\n red: [255, 0, 0],\n redBright: [255, 69, 0],\n white: [255, 255, 255],\n whiteBright: [255, 255, 255],\n yellow: [255, 255, 0],\n yellowBright: [255, 255, 153],\n} as Record<ColorName, ColorRgb>\n\n/**\n * Type guard to check if a color value is an RGB tuple.\n * @param value - Color value to check\n * @returns `true` if value is an RGB tuple, `false` if it's a color name\n */\nfunction isRgbTuple(value: ColorValue): value is ColorRgb {\n return Array.isArray(value)\n}\n\n/**\n * Convert a color value to RGB tuple format.\n * Named colors are looked up in the `colorToRgb` map, RGB tuples are returned as-is.\n * @param color - Color name or RGB tuple\n * @returns RGB tuple with values 0-255\n */\nexport function toRgb(color: ColorValue): ColorRgb {\n if (isRgbTuple(color)) {\n return color\n }\n return colorToRgb[color]\n}\n\n/**\n * Progress tracking information for display in spinner.\n * Used by `progress()` and `progressStep()` methods to show animated progress bars.\n */\nexport type ProgressInfo = {\n /** Current progress value */\n current: number\n /** Total/maximum progress value */\n total: number\n /** Optional unit label displayed after the progress count (e.g., 'files', 'items') */\n unit?: string | undefined\n}\n\n/**\n * Internal shimmer state with color configuration.\n * Extends `ShimmerState` with additional color property that can be inherited from spinner.\n */\nexport type ShimmerInfo = ShimmerState & {\n /** Color for shimmer effect - can inherit from spinner, use explicit color, or gradient */\n color: ColorInherit | ColorValue | ShimmerColorGradient\n}\n\n/**\n * Spinner instance for displaying animated loading indicators.\n * Provides methods for status updates, progress tracking, and text shimmer effects.\n *\n * KEY BEHAVIORS:\n * - Methods WITHOUT \"AndStop\" keep the spinner running (e.g., `success()`, `fail()`)\n * - Methods WITH \"AndStop\" auto-clear the spinner line (e.g., `successAndStop()`, `failAndStop()`)\n * - Status messages (done, success, fail, info, warn, step, substep) go to stderr\n * - Data messages (`log()`) go to stdout\n *\n * @example\n * ```ts\n * import { Spinner } from '@socketsecurity/lib/spinner'\n *\n * const spinner = Spinner({ text: 'Loading\u2026' })\n * spinner.start()\n *\n * // Show success while continuing to spin\n * spinner.success('Step 1 complete')\n *\n * // Stop the spinner with success message\n * spinner.successAndStop('All done!')\n * ```\n */\nexport type Spinner = {\n /** Current spinner color as RGB tuple */\n color: ColorRgb\n /** Current spinner animation style */\n spinner: SpinnerStyle\n\n /** Whether spinner is currently animating */\n get isSpinning(): boolean\n\n /** Get current shimmer state (enabled/disabled and configuration) */\n get shimmerState(): ShimmerInfo | undefined\n\n /** Clear the current line without stopping the spinner */\n clear(): Spinner\n\n /** Show debug message without stopping (only if debug mode enabled) */\n debug(text?: string | undefined, ...extras: unknown[]): Spinner\n /** Show debug message and stop the spinner (only if debug mode enabled) */\n debugAndStop(text?: string | undefined, ...extras: unknown[]): Spinner\n\n /** Alias for `fail()` - show error without stopping */\n error(text?: string | undefined, ...extras: unknown[]): Spinner\n /** Alias for `failAndStop()` - show error and stop */\n errorAndStop(text?: string | undefined, ...extras: unknown[]): Spinner\n\n /** Show failure (\u2717) without stopping the spinner */\n fail(text?: string | undefined, ...extras: unknown[]): Spinner\n /** Show failure (\u2717) and stop the spinner, auto-clearing the line */\n failAndStop(text?: string | undefined, ...extras: unknown[]): Spinner\n\n /** Get current spinner text (getter) or set new text (setter) */\n text(value: string): Spinner\n text(): string\n\n /** Increase indentation by specified spaces (default: 2) */\n indent(spaces?: number | undefined): Spinner\n /** Decrease indentation by specified spaces (default: 2) */\n dedent(spaces?: number | undefined): Spinner\n\n /** Show info (\u2139) message without stopping the spinner */\n info(text?: string | undefined, ...extras: unknown[]): Spinner\n /** Show info (\u2139) message and stop the spinner, auto-clearing the line */\n infoAndStop(text?: string | undefined, ...extras: unknown[]): Spinner\n\n /** Log to stdout without stopping the spinner */\n log(text?: string | undefined, ...extras: unknown[]): Spinner\n /** Log and stop the spinner, auto-clearing the line */\n logAndStop(text?: string | undefined, ...extras: unknown[]): Spinner\n\n /** Start spinning with optional text */\n start(text?: string | undefined): Spinner\n /** Stop spinning and clear internal state, auto-clearing the line */\n stop(text?: string | undefined): Spinner\n /** Stop and show final text without clearing the line */\n stopAndPersist(text?: string | undefined): Spinner\n\n /** Show main step message to stderr without stopping */\n step(text?: string | undefined, ...extras: unknown[]): Spinner\n /** Show indented substep message to stderr without stopping */\n substep(text?: string | undefined, ...extras: unknown[]): Spinner\n\n /** Show success (\u2713) without stopping the spinner */\n success(text?: string | undefined, ...extras: unknown[]): Spinner\n /** Show success (\u2713) and stop the spinner, auto-clearing the line */\n successAndStop(text?: string | undefined, ...extras: unknown[]): Spinner\n\n /** Alias for `success()` - show success without stopping */\n done(text?: string | undefined, ...extras: unknown[]): Spinner\n /** Alias for `successAndStop()` - show success and stop */\n doneAndStop(text?: string | undefined, ...extras: unknown[]): Spinner\n\n /** Update progress bar with current/total values and optional unit */\n progress(current: number, total: number, unit?: string | undefined): Spinner\n /** Increment progress by specified amount (default: 1) */\n progressStep(amount?: number): Spinner\n\n /** Enable shimmer effect (restores saved config or uses defaults) */\n enableShimmer(): Spinner\n /** Disable shimmer effect (preserves config for later re-enable) */\n disableShimmer(): Spinner\n /** Set complete shimmer configuration */\n setShimmer(config: ShimmerConfig): Spinner\n /** Update partial shimmer configuration */\n updateShimmer(config: Partial<ShimmerConfig>): Spinner\n\n /** Show warning (\u26A0) without stopping the spinner */\n warn(text?: string | undefined, ...extras: unknown[]): Spinner\n /** Show warning (\u26A0) and stop the spinner, auto-clearing the line */\n warnAndStop(text?: string | undefined, ...extras: unknown[]): Spinner\n}\n\n/**\n * Configuration options for creating a spinner instance.\n */\nexport type SpinnerOptions = {\n /**\n * Spinner color as RGB tuple or color name.\n * @default [140, 82, 255] Socket purple\n */\n readonly color?: ColorValue | undefined\n /**\n * Shimmer effect configuration or direction string.\n * When enabled, text will have an animated shimmer effect.\n * @default undefined No shimmer effect\n */\n readonly shimmer?: ShimmerConfig | ShimmerDirection | undefined\n /**\n * Animation style with frames and timing.\n * @default 'socket' Custom Socket animation in CLI, minimal in CI\n */\n readonly spinner?: SpinnerStyle | undefined\n /**\n * Abort signal for cancelling the spinner.\n * @default getAbortSignal() from process constants\n */\n readonly signal?: AbortSignal | undefined\n /**\n * Output stream for spinner rendering.\n * @default process.stderr\n */\n readonly stream?: Writable | undefined\n /**\n * Initial text to display with the spinner.\n * @default undefined No initial text\n */\n readonly text?: string | undefined\n /**\n * Theme to use for spinner colors.\n * Accepts theme name ('socket', 'sunset', etc.) or Theme object.\n * @default Current theme from getTheme()\n */\n readonly theme?:\n | import('./themes/types').Theme\n | import('./themes/themes').ThemeName\n | undefined\n}\n\n/**\n * Animation style definition for spinner frames.\n * Defines the visual appearance and timing of the spinner animation.\n */\nexport type SpinnerStyle = {\n /** Array of animation frames (strings to display sequentially) */\n readonly frames: string[]\n /**\n * Milliseconds between frame changes.\n * @default 80 Standard frame rate\n */\n readonly interval?: number | undefined\n}\n\n/**\n * Minimal spinner style for CI environments.\n * Uses empty frame and max interval to effectively disable animation in CI.\n */\nexport const ciSpinner: SpinnerStyle = {\n frames: [''],\n interval: 2_147_483_647,\n}\n\n/**\n * Create a property descriptor for defining non-enumerable properties.\n * Used for adding aliased methods to the Spinner prototype.\n * @param value - Value for the property\n * @returns Property descriptor object\n * @private\n */\nfunction desc(value: unknown) {\n return {\n __proto__: null,\n configurable: true,\n value,\n writable: true,\n }\n}\n\n/**\n * Normalize text input by trimming leading whitespace.\n * Non-string values are converted to empty string.\n * @param value - Text to normalize\n * @returns Normalized string with leading whitespace removed\n * @private\n */\nfunction normalizeText(value: unknown) {\n return typeof value === 'string' ? value.trimStart() : ''\n}\n\n/**\n * Format progress information as a visual progress bar with percentage and count.\n * @param progress - Progress tracking information\n * @returns Formatted string with colored progress bar, percentage, and count\n * @private\n * @example \"\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 35% (7/20 files)\"\n */\nfunction formatProgress(progress: ProgressInfo): string {\n const { current, total, unit } = progress\n const percentage = Math.round((current / total) * 100)\n const bar = renderProgressBar(percentage)\n const count = unit ? `${current}/${total} ${unit}` : `${current}/${total}`\n return `${bar} ${percentage}% (${count})`\n}\n\n/**\n * Render a progress bar using block characters (\u2588 for filled, \u2591 for empty).\n * @param percentage - Progress percentage (0-100)\n * @param width - Total width of progress bar in characters\n * @returns Colored progress bar string\n * @default width=20\n * @private\n */\nfunction renderProgressBar(percentage: number, width: number = 20): string {\n const filled = Math.round((percentage / 100) * width)\n const empty = width - filled\n const bar = '\u2588'.repeat(filled) + '\u2591'.repeat(empty)\n // Use cyan color for the progress bar\n const colors =\n /*@__PURE__*/ require('./external/yoctocolors-cjs') as typeof import('yoctocolors-cjs')\n return colors.cyan(bar)\n}\n\nlet _cliSpinners: Record<string, SpinnerStyle> | undefined\n\n/**\n * Get available CLI spinner styles or a specific style by name.\n * Extends the standard cli-spinners collection with Socket custom spinners.\n *\n * Custom spinners:\n * - `socket` (default): Socket pulse animation with sparkles and lightning\n *\n * @param styleName - Optional name of specific spinner style to retrieve\n * @returns Specific spinner style if name provided, all styles if omitted, `undefined` if style not found\n * @see https://github.com/sindresorhus/cli-spinners/blob/main/spinners.json\n *\n * @example\n * ```ts\n * // Get all available spinner styles\n * const allSpinners = getCliSpinners()\n *\n * // Get specific style\n * const socketStyle = getCliSpinners('socket')\n * const dotsStyle = getCliSpinners('dots')\n * ```\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function getCliSpinners(\n styleName?: string | undefined,\n): SpinnerStyle | Record<string, SpinnerStyle> | undefined {\n if (_cliSpinners === undefined) {\n const YoctoCtor: any = yoctoSpinner as any\n // Get the YoctoSpinner class to access static properties.\n const tempInstance: any = YoctoCtor({})\n const YoctoSpinnerClass: any = tempInstance.constructor as any\n // Extend the standard cli-spinners collection with Socket custom spinners.\n _cliSpinners = {\n __proto__: null,\n ...YoctoSpinnerClass.spinners,\n socket: generateSocketSpinnerFrames(),\n }\n }\n if (typeof styleName === 'string' && _cliSpinners) {\n return hasOwn(_cliSpinners, styleName) ? _cliSpinners[styleName] : undefined\n }\n return _cliSpinners\n}\n\nlet _Spinner: {\n new (options?: SpinnerOptions | undefined): Spinner\n}\nlet _defaultSpinner: SpinnerStyle | undefined\n\n/**\n * Create a spinner instance for displaying loading indicators.\n * Provides an animated CLI spinner with status messages, progress tracking, and shimmer effects.\n *\n * AUTO-CLEAR BEHAVIOR:\n * - All *AndStop() methods AUTO-CLEAR the spinner line via yocto-spinner.stop()\n * Examples: `doneAndStop()`, `successAndStop()`, `failAndStop()`, etc.\n *\n * - Methods WITHOUT \"AndStop\" do NOT clear (spinner keeps spinning)\n * Examples: `done()`, `success()`, `fail()`, etc.\n *\n * STREAM USAGE:\n * - Spinner animation: stderr (yocto-spinner default)\n * - Status methods (done, success, fail, info, warn, step, substep): stderr\n * - Data methods (`log()`): stdout\n *\n * COMPARISON WITH LOGGER:\n * - `logger.done()` does NOT auto-clear (requires manual `logger.clearLine()`)\n * - `spinner.doneAndStop()` DOES auto-clear (built into yocto-spinner.stop())\n * - Pattern: `logger.clearLine().done()` vs `spinner.doneAndStop()`\n *\n * @param options - Configuration options for the spinner\n * @returns New spinner instance\n *\n * @example\n * ```ts\n * import { Spinner } from '@socketsecurity/lib/spinner'\n *\n * // Basic usage\n * const spinner = Spinner({ text: 'Loading data\u2026' })\n * spinner.start()\n * await fetchData()\n * spinner.successAndStop('Data loaded!')\n *\n * // With custom color\n * const spinner = Spinner({\n * text: 'Processing\u2026',\n * color: [255, 0, 0] // Red\n * })\n *\n * // With shimmer effect\n * const spinner = Spinner({\n * text: 'Building\u2026',\n * shimmer: { dir: 'ltr', speed: 0.5 }\n * })\n *\n * // Show progress\n * spinner.progress(5, 10, 'files')\n * spinner.progressStep() // Increment by 1\n * ```\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function Spinner(options?: SpinnerOptions | undefined): Spinner {\n if (_Spinner === undefined) {\n const YoctoCtor = yoctoSpinner as any\n // Get the actual YoctoSpinner class from an instance\n const tempInstance = YoctoCtor({})\n const YoctoSpinnerClass = tempInstance.constructor\n\n /*@__PURE__*/\n _Spinner = class SpinnerClass extends (YoctoSpinnerClass as any) {\n declare isSpinning: boolean\n #baseText: string = ''\n #indentation: string = ''\n #progress?: ProgressInfo | undefined\n #shimmer?: ShimmerInfo | undefined\n #shimmerSavedConfig?: ShimmerInfo | undefined\n\n constructor(options?: SpinnerOptions | undefined) {\n const opts = { __proto__: null, ...options } as SpinnerOptions\n\n // Get theme from options or current theme\n let theme = getTheme()\n if (opts.theme) {\n // Resolve theme name or use Theme object directly\n if (typeof opts.theme === 'string') {\n theme = THEMES[opts.theme]\n } else {\n theme = opts.theme\n }\n }\n\n // Get default color from theme if not specified\n let defaultColor: ColorValue = theme.colors.primary\n if (theme.effects?.spinner?.color) {\n const resolved = resolveColor(\n theme.effects.spinner.color,\n theme.colors,\n )\n // resolveColor can return 'inherit' or gradients which aren't valid for spinner\n // Fall back to primary for these cases\n if (resolved === 'inherit' || Array.isArray(resolved[0])) {\n defaultColor = theme.colors.primary\n } else {\n defaultColor = resolved as ColorValue\n }\n }\n\n // Convert color option to RGB (default from theme).\n const spinnerColor = opts.color ?? defaultColor\n\n // Validate RGB tuple if provided.\n if (\n isRgbTuple(spinnerColor) &&\n (spinnerColor.length !== 3 ||\n !spinnerColor.every(\n n => typeof n === 'number' && n >= 0 && n <= 255,\n ))\n ) {\n throw new TypeError(\n 'RGB color must be an array of 3 numbers between 0 and 255',\n )\n }\n\n const spinnerColorRgb = toRgb(spinnerColor)\n\n // Parse shimmer config - can be object or direction string.\n let shimmerInfo: ShimmerInfo | undefined\n if (opts.shimmer) {\n let shimmerDir: ShimmerDirection\n let shimmerColor:\n | ColorInherit\n | ColorValue\n | ShimmerColorGradient\n | undefined\n // Default: 0.33 steps per frame (~150ms per step).\n let shimmerSpeed: number = 1 / 3\n\n if (typeof opts.shimmer === 'string') {\n shimmerDir = opts.shimmer\n } else {\n const shimmerConfig = {\n __proto__: null,\n ...opts.shimmer,\n } as ShimmerConfig\n shimmerDir = shimmerConfig.dir ?? DIR_LTR\n shimmerColor = shimmerConfig.color ?? COLOR_INHERIT\n shimmerSpeed = shimmerConfig.speed ?? 1 / 3\n }\n\n // Create shimmer info with initial animation state:\n // - COLOR_INHERIT means use spinner color dynamically\n // - ColorValue (name or RGB tuple) is an explicit override color\n // - undefined color defaults to COLOR_INHERIT\n // - speed controls steps per frame (lower = slower, e.g., 0.33 = ~150ms per step)\n shimmerInfo = {\n __proto__: null,\n color: shimmerColor === undefined ? COLOR_INHERIT : shimmerColor,\n currentDir: DIR_LTR,\n mode: shimmerDir,\n speed: shimmerSpeed,\n step: 0,\n } as ShimmerInfo\n }\n\n // eslint-disable-next-line constructor-super\n super({\n signal: require('#constants/process').getAbortSignal(),\n ...opts,\n // Pass RGB color directly to yocto-spinner (it now supports RGB).\n color: spinnerColorRgb,\n // onRenderFrame callback provides full control over frame + text layout.\n // Calculates spacing based on frame width to prevent text jumping.\n onRenderFrame: (\n frame: string,\n text: string,\n applyColor: (text: string) => string,\n ) => {\n const width = stringWidth(frame)\n // Narrow frames (width 1) get 2 spaces, wide frames (width 2) get 1 space.\n // Total width is consistent: 3 characters (frame + spacing) before text.\n const spacing = width === 1 ? ' ' : ' '\n return frame ? `${applyColor(frame)}${spacing}${text}` : text\n },\n // onFrameUpdate callback is called by yocto-spinner whenever a frame advances.\n // This ensures shimmer updates are perfectly synchronized with animation beats.\n onFrameUpdate: shimmerInfo\n ? () => {\n // Update parent's text without triggering render.\n // Parent's #skipRender flag prevents nested render calls.\n // Only update if we have base text to avoid blank frames.\n if (this.#baseText) {\n super.text = this.#buildDisplayText()\n }\n }\n : undefined,\n })\n\n this.#shimmer = shimmerInfo\n this.#shimmerSavedConfig = shimmerInfo\n }\n\n // Override color getter to ensure it's always RGB.\n get color(): ColorRgb {\n const value = super.color\n return isRgbTuple(value) ? value : toRgb(value)\n }\n\n // Override color setter to always convert to RGB before passing to yocto-spinner.\n set color(value: ColorValue | ColorRgb) {\n super.color = isRgbTuple(value) ? value : toRgb(value)\n }\n\n // Getter to expose current shimmer state.\n get shimmerState(): ShimmerInfo | undefined {\n if (!this.#shimmer) {\n return undefined\n }\n return {\n color: this.#shimmer.color,\n currentDir: this.#shimmer.currentDir,\n mode: this.#shimmer.mode,\n speed: this.#shimmer.speed,\n step: this.#shimmer.step,\n } as ShimmerInfo\n }\n\n /**\n * Apply a yocto-spinner method and update logger state.\n * Handles text normalization, extra arguments, and logger tracking.\n * @private\n */\n #apply(methodName: string, args: unknown[]) {\n let extras: unknown[]\n let text = args.at(0)\n if (typeof text === 'string') {\n extras = args.slice(1)\n } else {\n extras = args\n text = ''\n }\n const wasSpinning = this.isSpinning\n const normalized = normalizeText(text)\n if (methodName === 'stop' && !normalized) {\n super[methodName]()\n } else {\n super[methodName](normalized)\n }\n const {\n getDefaultLogger,\n incLogCallCountSymbol,\n lastWasBlankSymbol,\n } = /*@__PURE__*/ require('./logger.js')\n const logger = getDefaultLogger()\n if (methodName === 'stop') {\n if (wasSpinning && normalized) {\n logger[lastWasBlankSymbol](isBlankString(normalized))\n logger[incLogCallCountSymbol]()\n }\n } else {\n logger[lastWasBlankSymbol](false)\n logger[incLogCallCountSymbol]()\n }\n if (extras.length) {\n logger.log(...extras)\n logger[lastWasBlankSymbol](false)\n }\n return this\n }\n\n /**\n * Build the complete display text with progress, shimmer, and indentation.\n * Combines base text, progress bar, shimmer effects, and indentation.\n * @private\n */\n #buildDisplayText() {\n let displayText = this.#baseText\n\n if (this.#progress) {\n const progressText = formatProgress(this.#progress)\n displayText = displayText\n ? `${displayText} ${progressText}`\n : progressText\n }\n\n // Apply shimmer effect if enabled.\n if (displayText && this.#shimmer) {\n // If shimmer color is 'inherit', use current spinner color (getter ensures RGB).\n // Otherwise, check if it's a gradient (array of arrays) or single color.\n let shimmerColor: ColorRgb | ShimmerColorGradient\n if (this.#shimmer.color === COLOR_INHERIT) {\n shimmerColor = this.color\n } else if (Array.isArray(this.#shimmer.color[0])) {\n // It's a gradient - use as is.\n shimmerColor = this.#shimmer.color as ShimmerColorGradient\n } else {\n // It's a single color - convert to RGB.\n shimmerColor = toRgb(this.#shimmer.color as ColorValue)\n }\n\n displayText = applyShimmer(displayText, this.#shimmer, {\n color: shimmerColor,\n direction: this.#shimmer.mode,\n })\n }\n\n // Apply indentation\n if (this.#indentation && displayText) {\n displayText = this.#indentation + displayText\n }\n\n return displayText\n }\n\n /**\n * Show a status message without stopping the spinner.\n * Outputs the symbol and message to stderr, then continues spinning.\n */\n #showStatusAndKeepSpinning(symbolType: SymbolType, args: unknown[]) {\n let text = args.at(0)\n let extras: unknown[]\n if (typeof text === 'string') {\n extras = args.slice(1)\n } else {\n extras = args\n text = ''\n }\n\n const {\n LOG_SYMBOLS,\n getDefaultLogger,\n } = /*@__PURE__*/ require('./logger.js')\n // Note: Status messages always go to stderr.\n const logger = getDefaultLogger()\n logger.error(`${LOG_SYMBOLS[symbolType]} ${text}`, ...extras)\n return this\n }\n\n /**\n * Update the spinner's displayed text.\n * Rebuilds display text and triggers render.\n * @private\n */\n #updateSpinnerText() {\n // Call the parent class's text setter, which triggers render.\n super.text = this.#buildDisplayText()\n }\n\n /**\n * Show a debug message (\u2139) without stopping the spinner.\n * Only displays if debug mode is enabled via environment variable.\n * Outputs to stderr and continues spinning.\n *\n * @param text - Debug message to display\n * @param extras - Additional values to log\n * @returns This spinner for chaining\n */\n debug(text?: string | undefined, ...extras: unknown[]) {\n const { isDebug } = /*@__PURE__*/ require('./debug.js')\n if (isDebug()) {\n return this.#showStatusAndKeepSpinning('info', [text, ...extras])\n }\n return this\n }\n\n /**\n * Show a debug message (\u2139) and stop the spinner.\n * Only displays if debug mode is enabled via environment variable.\n * Auto-clears the spinner line before displaying the message.\n *\n * @param text - Debug message to display\n * @param extras - Additional values to log\n * @returns This spinner for chaining\n */\n debugAndStop(text?: string | undefined, ...extras: unknown[]) {\n const { isDebug } = /*@__PURE__*/ require('./debug.js')\n if (isDebug()) {\n return this.#apply('info', [text, ...extras])\n }\n return this\n }\n\n /**\n * Decrease indentation level by removing spaces from the left.\n * Pass 0 to reset indentation to zero completely.\n *\n * @param spaces - Number of spaces to remove\n * @returns This spinner for chaining\n * @default spaces=2\n *\n * @example\n * ```ts\n * spinner.dedent() // Remove 2 spaces\n * spinner.dedent(4) // Remove 4 spaces\n * spinner.dedent(0) // Reset to zero indentation\n * ```\n */\n dedent(spaces?: number | undefined) {\n // Pass 0 to reset indentation\n if (spaces === 0) {\n this.#indentation = ''\n } else {\n const amount = spaces ?? 2\n const newLength = Math.max(0, this.#indentation.length - amount)\n this.#indentation = this.#indentation.slice(0, newLength)\n }\n this.#updateSpinnerText()\n return this\n }\n\n /**\n * Show a done/success message (\u2713) without stopping the spinner.\n * Alias for `success()` with a shorter name.\n *\n * DESIGN DECISION: Unlike yocto-spinner, our `done()` does NOT stop the spinner.\n * Use `doneAndStop()` if you want to stop the spinner.\n *\n * @param text - Message to display\n * @param extras - Additional values to log\n * @returns This spinner for chaining\n */\n done(text?: string | undefined, ...extras: unknown[]) {\n return this.#showStatusAndKeepSpinning('success', [text, ...extras])\n }\n\n /**\n * Show a done/success message (\u2713) and stop the spinner.\n * Auto-clears the spinner line before displaying the success message.\n *\n * @param text - Message to display\n * @param extras - Additional values to log\n * @returns This spinner for chaining\n */\n doneAndStop(text?: string | undefined, ...extras: unknown[]) {\n return this.#apply('success', [text, ...extras])\n }\n\n /**\n * Show a failure message (\u2717) without stopping the spinner.\n * DESIGN DECISION: Unlike yocto-spinner, our `fail()` does NOT stop the spinner.\n * This allows displaying errors while continuing to spin.\n * Use `failAndStop()` if you want to stop the spinner.\n *\n * @param text - Error message to display\n * @param extras - Additional values to log\n * @returns This spinner for chaining\n */\n fail(text?: string | undefined, ...extras: unknown[]) {\n return this.#showStatusAndKeepSpinning('fail', [text, ...extras])\n }\n\n /**\n * Show a failure message (\u2717) and stop the spinner.\n * Auto-clears the spinner line before displaying the error message.\n *\n * @param text - Error message to display\n * @param extras - Additional values to log\n * @returns This spinner for chaining\n */\n failAndStop(text?: string | undefined, ...extras: unknown[]) {\n return this.#apply('error', [text, ...extras])\n }\n\n /**\n * Increase indentation level by adding spaces to the left.\n * Pass 0 to reset indentation to zero completely.\n *\n * @param spaces - Number of spaces to add\n * @returns This spinner for chaining\n * @default spaces=2\n *\n * @example\n * ```ts\n * spinner.indent() // Add 2 spaces\n * spinner.indent(4) // Add 4 spaces\n * spinner.indent(0) // Reset to zero indentation\n * ```\n */\n indent(spaces?: number | undefined) {\n // Pass 0 to reset indentation\n if (spaces === 0) {\n this.#indentation = ''\n } else {\n const amount = spaces ?? 2\n this.#indentation += ' '.repeat(amount)\n }\n this.#updateSpinnerText()\n return this\n }\n\n /**\n * Show an info message (\u2139) without stopping the spinner.\n * Outputs to stderr and continues spinning.\n *\n * @param text - Info message to display\n * @param extras - Additional values to log\n * @returns This spinner for chaining\n */\n info(text?: string | undefined, ...extras: unknown[]) {\n return this.#showStatusAndKeepSpinning('info', [text, ...extras])\n }\n\n /**\n * Show an info message (\u2139) and stop the spinner.\n * Auto-clears the spinner line before displaying the message.\n *\n * @param text - Info message to display\n * @param extras - Additional values to log\n * @returns This spinner for chaining\n */\n infoAndStop(text?: string | undefined, ...extras: unknown[]) {\n return this.#apply('info', [text, ...extras])\n }\n\n /**\n * Log a message to stdout without stopping the spinner.\n * Unlike other status methods, this outputs to stdout for data logging.\n *\n * @param args - Values to log to stdout\n * @returns This spinner for chaining\n */\n log(...args: unknown[]) {\n const { getDefaultLogger } = /*@__PURE__*/ require('./logger.js')\n const logger = getDefaultLogger()\n logger.log(...args)\n return this\n }\n\n /**\n * Log a message to stdout and stop the spinner.\n * Auto-clears the spinner line before displaying the message.\n *\n * @param text - Message to display\n * @param extras - Additional values to log\n * @returns This spinner for chaining\n */\n logAndStop(text?: string | undefined, ...extras: unknown[]) {\n return this.#apply('stop', [text, ...extras])\n }\n\n /**\n * Update progress information displayed with the spinner.\n * Shows a progress bar with percentage and optional unit label.\n *\n * @param current - Current progress value\n * @param total - Total/maximum progress value\n * @param unit - Optional unit label (e.g., 'files', 'items')\n * @returns This spinner for chaining\n *\n * @example\n * ```ts\n * spinner.progress(5, 10) // \"\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 50% (5/10)\"\n * spinner.progress(7, 20, 'files') // \"\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 35% (7/20 files)\"\n * ```\n */\n progress = (\n current: number,\n total: number,\n unit?: string | undefined,\n ) => {\n this.#progress = {\n __proto__: null,\n current,\n total,\n ...(unit ? { unit } : {}),\n } as ProgressInfo\n this.#updateSpinnerText()\n return this\n }\n\n /**\n * Increment progress by a specified amount.\n * Updates the progress bar displayed with the spinner.\n * Clamps the result between 0 and the total value.\n *\n * @param amount - Amount to increment by\n * @returns This spinner for chaining\n * @default amount=1\n *\n * @example\n * ```ts\n * spinner.progress(0, 10, 'files')\n * spinner.progressStep() // Progress: 1/10\n * spinner.progressStep(3) // Progress: 4/10\n * ```\n */\n progressStep(amount: number = 1) {\n if (this.#progress) {\n const newCurrent = this.#progress.current + amount\n this.#progress = {\n __proto__: null,\n current: Math.max(0, Math.min(newCurrent, this.#progress.total)),\n total: this.#progress.total,\n ...(this.#progress.unit ? { unit: this.#progress.unit } : {}),\n } as ProgressInfo\n this.#updateSpinnerText()\n }\n return this\n }\n\n /**\n * Start the spinner animation with optional text.\n * Begins displaying the animated spinner on stderr.\n *\n * @param text - Optional text to display with the spinner\n * @returns This spinner for chaining\n *\n * @example\n * ```ts\n * spinner.start('Loading\u2026')\n * // Later:\n * spinner.successAndStop('Done!')\n * ```\n */\n start(...args: unknown[]) {\n if (args.length) {\n const text = args.at(0)\n const normalized = normalizeText(text)\n // We clear this.text on start when `text` is falsy because yocto-spinner\n // will not clear it otherwise.\n if (!normalized) {\n this.#baseText = ''\n super.text = ''\n } else {\n this.#baseText = normalized\n }\n }\n\n this.#updateSpinnerText()\n // Don't pass text to yocto-spinner.start() since we already set it via #updateSpinnerText().\n // Passing args would cause duplicate message output.\n return this.#apply('start', [])\n }\n\n /**\n * Log a main step message to stderr without stopping the spinner.\n * Adds a blank line before the message for visual separation.\n * Aligns with `logger.step()` to use stderr for status messages.\n *\n * @param text - Step message to display\n * @param extras - Additional values to log\n * @returns This spinner for chaining\n *\n * @example\n * ```ts\n * spinner.step('Building application')\n * spinner.substep('Compiling TypeScript')\n * spinner.substep('Bundling assets')\n * ```\n */\n step(text?: string | undefined, ...extras: unknown[]) {\n const { getDefaultLogger } = /*@__PURE__*/ require('./logger.js')\n if (typeof text === 'string') {\n const logger = getDefaultLogger()\n // Add blank line before step for visual separation.\n logger.error('')\n // Use error (stderr) to align with logger.step() default stream.\n logger.error(text, ...extras)\n }\n return this\n }\n\n /**\n * Log an indented substep message to stderr without stopping the spinner.\n * Adds 2-space indentation to the message.\n * Aligns with `logger.substep()` to use stderr for status messages.\n *\n * @param text - Substep message to display\n * @param extras - Additional values to log\n * @returns This spinner for chaining\n *\n * @example\n * ```ts\n * spinner.step('Building application')\n * spinner.substep('Compiling TypeScript')\n * spinner.substep('Bundling assets')\n * ```\n */\n substep(text?: string | undefined, ...extras: unknown[]) {\n if (typeof text === 'string') {\n // Add 2-space indent for substep.\n const { getDefaultLogger } = /*@__PURE__*/ require('./logger.js')\n const logger = getDefaultLogger()\n // Use error (stderr) to align with logger.substep() default stream.\n logger.error(` ${text}`, ...extras)\n }\n return this\n }\n\n /**\n * Stop the spinner animation and clear internal state.\n * Auto-clears the spinner line via yocto-spinner.stop().\n * Resets progress, shimmer, and text state.\n *\n * @param text - Optional final text to display after stopping\n * @returns This spinner for chaining\n *\n * @example\n * ```ts\n * spinner.start('Processing\u2026')\n * // Do work\n * spinner.stop() // Just stop, no message\n * // or\n * spinner.stop('Finished processing')\n * ```\n */\n stop(...args: unknown[]) {\n // Clear internal state.\n this.#baseText = ''\n this.#progress = undefined\n // Reset shimmer animation state if shimmer is enabled.\n if (this.#shimmer) {\n this.#shimmer.currentDir = DIR_LTR\n this.#shimmer.step = 0\n }\n // Call parent stop first (clears screen, sets isSpinning = false).\n const result = this.#apply('stop', args)\n // Then clear text to avoid blank frame render.\n // This is safe now because isSpinning is false.\n super.text = ''\n return result\n }\n\n /**\n * Show a success message (\u2713) without stopping the spinner.\n * DESIGN DECISION: Unlike yocto-spinner, our `success()` does NOT stop the spinner.\n * This allows displaying success messages while continuing to spin for multi-step operations.\n * Use `successAndStop()` if you want to stop the spinner.\n *\n * @param text - Success message to display\n * @param extras - Additional values to log\n * @returns This spinner for chaining\n */\n success(text?: string | undefined, ...extras: unknown[]) {\n return this.#showStatusAndKeepSpinning('success', [text, ...extras])\n }\n\n /**\n * Show a success message (\u2713) and stop the spinner.\n * Auto-clears the spinner line before displaying the success message.\n *\n * @param text - Success message to display\n * @param extras - Additional values to log\n * @returns This spinner for chaining\n */\n successAndStop(text?: string | undefined, ...extras: unknown[]) {\n return this.#apply('success', [text, ...extras])\n }\n\n /**\n * Get or set the spinner text.\n * When called with no arguments, returns the current base text.\n * When called with text, updates the display and returns the spinner for chaining.\n *\n * @param value - Text to display (omit to get current text)\n * @returns Current text (getter) or this spinner (setter)\n *\n * @example\n * ```ts\n * // Setter\n * spinner.text('Loading data\u2026')\n * spinner.text('Processing\u2026')\n *\n * // Getter\n * const current = spinner.text()\n * console.log(current) // \"Processing\u2026\"\n * ```\n */\n text(): string\n text(value: string): Spinner\n text(value?: string): string | Spinner {\n // biome-ignore lint/complexity/noArguments: Function overload for getter/setter pattern.\n if (arguments.length === 0) {\n // Getter: return current base text\n return this.#baseText\n }\n // Setter: update base text and refresh display\n this.#baseText = value ?? ''\n this.#updateSpinnerText()\n return this as unknown as Spinner\n }\n\n /**\n * Show a warning message (\u26A0) without stopping the spinner.\n * Outputs to stderr and continues spinning.\n *\n * @param text - Warning message to display\n * @param extras - Additional values to log\n * @returns This spinner for chaining\n */\n warn(text?: string | undefined, ...extras: unknown[]) {\n return this.#showStatusAndKeepSpinning('warn', [text, ...extras])\n }\n\n /**\n * Show a warning message (\u26A0) and stop the spinner.\n * Auto-clears the spinner line before displaying the warning message.\n *\n * @param text - Warning message to display\n * @param extras - Additional values to log\n * @returns This spinner for chaining\n */\n warnAndStop(text?: string | undefined, ...extras: unknown[]) {\n return this.#apply('warning', [text, ...extras])\n }\n\n /**\n * Enable shimmer effect.\n * Restores saved config or uses defaults if no saved config exists.\n *\n * @returns This spinner for chaining\n *\n * @example\n * spinner.enableShimmer()\n */\n enableShimmer(): Spinner {\n if (this.#shimmerSavedConfig) {\n // Restore saved config.\n this.#shimmer = { ...this.#shimmerSavedConfig }\n } else {\n // Create default config.\n this.#shimmer = {\n color: COLOR_INHERIT,\n currentDir: DIR_LTR,\n mode: DIR_LTR,\n speed: 1 / 3,\n step: 0,\n } as ShimmerInfo\n this.#shimmerSavedConfig = this.#shimmer\n }\n\n this.#updateSpinnerText()\n return this as unknown as Spinner\n }\n\n /**\n * Disable shimmer effect.\n * Preserves config for later re-enable via enableShimmer().\n *\n * @returns This spinner for chaining\n *\n * @example\n * spinner.disableShimmer()\n */\n disableShimmer(): Spinner {\n // Disable shimmer but preserve config.\n this.#shimmer = undefined\n this.#updateSpinnerText()\n return this as unknown as Spinner\n }\n\n /**\n * Set complete shimmer configuration.\n * Replaces any existing shimmer config with the provided values.\n *\n * @param config - Complete shimmer configuration\n * @returns This spinner for chaining\n *\n * @example\n * spinner.setShimmer({\n * color: [255, 0, 0],\n * dir: 'rtl',\n * speed: 0.5\n * })\n */\n setShimmer(config: ShimmerConfig): Spinner {\n this.#shimmer = {\n color: config.color,\n currentDir: DIR_LTR,\n mode: config.dir,\n speed: config.speed,\n step: 0,\n } as ShimmerInfo\n this.#shimmerSavedConfig = this.#shimmer\n this.#updateSpinnerText()\n return this as unknown as Spinner\n }\n\n /**\n * Update partial shimmer configuration.\n * Merges with existing config, enabling shimmer if currently disabled.\n *\n * @param config - Partial shimmer configuration to merge\n * @returns This spinner for chaining\n *\n * @example\n * // Update just the speed\n * spinner.updateShimmer({ speed: 0.5 })\n *\n * // Update direction\n * spinner.updateShimmer({ dir: 'rtl' })\n *\n * // Update multiple properties\n * spinner.updateShimmer({ color: [255, 0, 0], speed: 0.8 })\n */\n updateShimmer(config: Partial<ShimmerConfig>): Spinner {\n const partialConfig = {\n __proto__: null,\n ...config,\n } as Partial<ShimmerConfig>\n\n if (this.#shimmer) {\n // Update existing shimmer.\n this.#shimmer = {\n ...this.#shimmer,\n ...(partialConfig.color !== undefined\n ? { color: partialConfig.color }\n : {}),\n ...(partialConfig.dir !== undefined\n ? { mode: partialConfig.dir }\n : {}),\n ...(partialConfig.speed !== undefined\n ? { speed: partialConfig.speed }\n : {}),\n } as ShimmerInfo\n this.#shimmerSavedConfig = this.#shimmer\n } else if (this.#shimmerSavedConfig) {\n // Restore and update.\n this.#shimmer = {\n ...this.#shimmerSavedConfig,\n ...(partialConfig.color !== undefined\n ? { color: partialConfig.color }\n : {}),\n ...(partialConfig.dir !== undefined\n ? { mode: partialConfig.dir }\n : {}),\n ...(partialConfig.speed !== undefined\n ? { speed: partialConfig.speed }\n : {}),\n } as ShimmerInfo\n this.#shimmerSavedConfig = this.#shimmer\n } else {\n // Create new with partial config.\n this.#shimmer = {\n color: partialConfig.color ?? COLOR_INHERIT,\n currentDir: DIR_LTR,\n mode: partialConfig.dir ?? DIR_LTR,\n speed: partialConfig.speed ?? 1 / 3,\n step: 0,\n } as ShimmerInfo\n this.#shimmerSavedConfig = this.#shimmer\n }\n\n this.#updateSpinnerText()\n return this as unknown as Spinner\n }\n } as unknown as {\n new (options?: SpinnerOptions | undefined): Spinner\n }\n // Add aliases.\n Object.defineProperties(_Spinner.prototype, {\n error: desc(_Spinner.prototype.fail),\n errorAndStop: desc(_Spinner.prototype.failAndStop),\n warning: desc(_Spinner.prototype.warn),\n warningAndStop: desc(_Spinner.prototype.warnAndStop),\n })\n _defaultSpinner = getCI()\n ? ciSpinner\n : (getCliSpinners('socket') as SpinnerStyle)\n }\n return new _Spinner({\n spinner: _defaultSpinner,\n ...options,\n })\n}\n\nlet _spinner: ReturnType<typeof Spinner> | undefined\n\n/**\n * Get the default spinner instance.\n * Lazily creates the spinner to avoid circular dependencies during module initialization.\n * Reuses the same instance across calls.\n *\n * @returns Shared default spinner instance\n *\n * @example\n * ```ts\n * import { getDefaultSpinner } from '@socketsecurity/lib/spinner'\n *\n * const spinner = getDefaultSpinner()\n * spinner.start('Loading\u2026')\n * ```\n */\nexport function getDefaultSpinner(): ReturnType<typeof Spinner> {\n if (_spinner === undefined) {\n _spinner = Spinner()\n }\n return _spinner\n}\n\n// REMOVED: Deprecated `spinner` export\n// Migration: Use getDefaultSpinner() instead\n// See: getDefaultSpinner() function above\n\n/**\n * Configuration options for `withSpinner()` helper.\n * @template T - Return type of the async operation\n */\nexport type WithSpinnerOptions<T> = {\n /** Message to display while the spinner is running */\n message: string\n /** Async function to execute while spinner is active */\n operation: () => Promise<T>\n /**\n * Optional spinner instance to use.\n * If not provided, operation runs without spinner.\n */\n spinner?: Spinner | undefined\n /**\n * Optional spinner options to apply during the operation.\n * These options will be pushed when the operation starts and popped when it completes.\n * Supports color and shimmer configuration.\n */\n withOptions?: Partial<Pick<SpinnerOptions, 'color' | 'shimmer'>> | undefined\n}\n\n/**\n * Execute an async operation with spinner lifecycle management.\n * Ensures `spinner.stop()` is always called via try/finally, even if the operation throws.\n * Provides safe cleanup and consistent spinner behavior.\n *\n * @template T - Return type of the operation\n * @param options - Configuration object\n * @param options.message - Message to display while spinner is running\n * @param options.operation - Async function to execute\n * @param options.spinner - Optional spinner instance (if not provided, no spinner is used)\n * @returns Result of the operation\n * @throws Re-throws any error from operation after stopping spinner\n *\n * @example\n * ```ts\n * import { Spinner, withSpinner } from '@socketsecurity/lib/spinner'\n *\n * const spinner = Spinner()\n *\n * // With spinner instance\n * const result = await withSpinner({\n * message: 'Processing\u2026',\n * operation: async () => {\n * return await processData()\n * },\n * spinner\n * })\n *\n * // Without spinner instance (no-op, just runs operation)\n * const result = await withSpinner({\n * message: 'Processing\u2026',\n * operation: async () => {\n * return await processData()\n * }\n * })\n * ```\n */\nexport async function withSpinner<T>(\n options: WithSpinnerOptions<T>,\n): Promise<T> {\n const { message, operation, spinner, withOptions } = {\n __proto__: null,\n ...options,\n } as WithSpinnerOptions<T>\n\n if (!spinner) {\n return await operation()\n }\n\n // Save current options if we're going to change them\n const savedColor =\n withOptions?.color !== undefined ? spinner.color : undefined\n const savedShimmerState =\n withOptions?.shimmer !== undefined ? spinner.shimmerState : undefined\n\n // Apply temporary options\n if (withOptions?.color !== undefined) {\n spinner.color = toRgb(withOptions.color)\n }\n if (withOptions?.shimmer !== undefined) {\n if (typeof withOptions.shimmer === 'string') {\n spinner.updateShimmer({ dir: withOptions.shimmer })\n } else {\n spinner.setShimmer(withOptions.shimmer)\n }\n }\n\n spinner.start(message)\n try {\n return await operation()\n } finally {\n spinner.stop()\n // Restore previous options\n if (savedColor !== undefined) {\n spinner.color = savedColor\n }\n if (withOptions?.shimmer !== undefined) {\n if (savedShimmerState) {\n spinner.setShimmer({\n color: savedShimmerState.color as any,\n dir: savedShimmerState.mode,\n speed: savedShimmerState.speed,\n })\n } else {\n spinner.disableShimmer()\n }\n }\n }\n}\n\n/**\n * Configuration options for `withSpinnerRestore()` helper.\n * @template T - Return type of the async operation\n */\nexport type WithSpinnerRestoreOptions<T> = {\n /** Async function to execute while spinner is stopped */\n operation: () => Promise<T>\n /** Optional spinner instance to restore after operation */\n spinner?: Spinner | undefined\n /** Whether spinner was spinning before the operation (used to conditionally restart) */\n wasSpinning: boolean\n}\n\n/**\n * Execute an async operation with conditional spinner restart.\n * Useful when you need to temporarily stop a spinner for an operation,\n * then restore it to its previous state (if it was spinning).\n *\n * @template T - Return type of the operation\n * @param options - Configuration object\n * @param options.operation - Async function to execute\n * @param options.spinner - Optional spinner instance to manage\n * @param options.wasSpinning - Whether spinner was spinning before the operation\n * @returns Result of the operation\n * @throws Re-throws any error from operation after restoring spinner state\n *\n * @example\n * ```ts\n * import { getDefaultSpinner, withSpinnerRestore } from '@socketsecurity/lib/spinner'\n *\n * const spinner = getDefaultSpinner()\n * const wasSpinning = spinner.isSpinning\n * spinner.stop()\n *\n * const result = await withSpinnerRestore({\n * operation: async () => {\n * // Do work without spinner\n * return await someOperation()\n * },\n * spinner,\n * wasSpinning\n * })\n * // Spinner is automatically restarted if wasSpinning was true\n * ```\n */\nexport async function withSpinnerRestore<T>(\n options: WithSpinnerRestoreOptions<T>,\n): Promise<T> {\n const { operation, spinner, wasSpinning } = {\n __proto__: null,\n ...options,\n } as WithSpinnerRestoreOptions<T>\n\n try {\n return await operation()\n } finally {\n if (spinner && wasSpinning) {\n spinner.start()\n }\n }\n}\n\n/**\n * Configuration options for `withSpinnerSync()` helper.\n * @template T - Return type of the sync operation\n */\nexport type WithSpinnerSyncOptions<T> = {\n /** Message to display while the spinner is running */\n message: string\n /** Synchronous function to execute while spinner is active */\n operation: () => T\n /**\n * Optional spinner instance to use.\n * If not provided, operation runs without spinner.\n */\n spinner?: Spinner | undefined\n /**\n * Optional spinner options to apply during the operation.\n * These options will be pushed when the operation starts and popped when it completes.\n * Supports color and shimmer configuration.\n */\n withOptions?: Partial<Pick<SpinnerOptions, 'color' | 'shimmer'>> | undefined\n}\n\n/**\n * Execute a synchronous operation with spinner lifecycle management.\n * Ensures `spinner.stop()` is always called via try/finally, even if the operation throws.\n * Provides safe cleanup and consistent spinner behavior for sync operations.\n *\n * @template T - Return type of the operation\n * @param options - Configuration object\n * @param options.message - Message to display while spinner is running\n * @param options.operation - Synchronous function to execute\n * @param options.spinner - Optional spinner instance (if not provided, no spinner is used)\n * @returns Result of the operation\n * @throws Re-throws any error from operation after stopping spinner\n *\n * @example\n * ```ts\n * import { Spinner, withSpinnerSync } from '@socketsecurity/lib/spinner'\n *\n * const spinner = Spinner()\n *\n * const result = withSpinnerSync({\n * message: 'Processing\u2026',\n * operation: () => {\n * return processDataSync()\n * },\n * spinner\n * })\n * ```\n */\nexport function withSpinnerSync<T>(options: WithSpinnerSyncOptions<T>): T {\n const { message, operation, spinner, withOptions } = {\n __proto__: null,\n ...options,\n } as WithSpinnerSyncOptions<T>\n\n if (!spinner) {\n return operation()\n }\n\n // Save current options if we're going to change them\n const savedColor =\n withOptions?.color !== undefined ? spinner.color : undefined\n const savedShimmerState =\n withOptions?.shimmer !== undefined ? spinner.shimmerState : undefined\n\n // Apply temporary options\n if (withOptions?.color !== undefined) {\n spinner.color = toRgb(withOptions.color)\n }\n if (withOptions?.shimmer !== undefined) {\n if (typeof withOptions.shimmer === 'string') {\n spinner.updateShimmer({ dir: withOptions.shimmer })\n } else {\n spinner.setShimmer(withOptions.shimmer)\n }\n }\n\n spinner.start(message)\n try {\n return operation()\n } finally {\n spinner.stop()\n // Restore previous options\n if (savedColor !== undefined) {\n spinner.color = savedColor\n }\n if (withOptions?.shimmer !== undefined) {\n if (savedShimmerState) {\n spinner.setShimmer({\n color: savedShimmerState.color as any,\n dir: savedShimmerState.mode,\n speed: savedShimmerState.speed,\n })\n } else {\n spinner.disableShimmer()\n }\n }\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * @fileoverview CLI spinner utilities for long-running operations.\n * Provides animated progress indicators with CI environment detection.\n */\n\nimport type { Writable } from 'stream'\n\nimport { getCI } from '#env/ci'\nimport { isDebug } from './debug'\nimport { generateSocketSpinnerFrames } from './effects/pulse-frames'\nimport type {\n ShimmerColorGradient,\n ShimmerConfig,\n ShimmerDirection,\n ShimmerState,\n} from './effects/text-shimmer'\nimport { applyShimmer, COLOR_INHERIT, DIR_LTR } from './effects/text-shimmer'\nimport yoctoSpinner from './external/@socketregistry/yocto-spinner'\nimport {\n LOG_SYMBOLS,\n getDefaultLogger,\n incLogCallCountSymbol,\n lastWasBlankSymbol,\n} from './logger'\nimport { hasOwn } from './objects'\nimport { isBlankString, stringWidth } from './strings'\nimport { getTheme } from './themes/context'\nimport { THEMES } from './themes/themes'\nimport { resolveColor } from './themes/utils'\n\n/**\n * Named color values supported by the spinner.\n * Maps to standard terminal colors with bright variants.\n */\nexport type ColorName =\n | 'black'\n | 'blue'\n | 'blueBright'\n | 'cyan'\n | 'cyanBright'\n | 'gray'\n | 'green'\n | 'greenBright'\n | 'magenta'\n | 'magentaBright'\n | 'red'\n | 'redBright'\n | 'white'\n | 'whiteBright'\n | 'yellow'\n | 'yellowBright'\n\n/**\n * Special 'inherit' color value that uses the spinner's current color.\n * Used with shimmer effects to dynamically inherit the spinner color.\n */\nexport type ColorInherit = 'inherit'\n\n/**\n * RGB color tuple with values 0-255 for red, green, and blue channels.\n * @example [140, 82, 255] // Socket purple\n * @example [255, 0, 0] // Red\n */\nexport type ColorRgb = readonly [number, number, number]\n\n/**\n * Union of all supported color types: named colors or RGB tuples.\n */\nexport type ColorValue = ColorName | ColorRgb\n\n/**\n * Symbol types for status messages.\n * Maps to log symbols: success (\u2713), fail (\u2717), info (\u2139), warn (\u26A0).\n */\nexport type SymbolType = 'fail' | 'info' | 'success' | 'warn'\n\n// Map color names to RGB values.\nconst colorToRgb: Record<ColorName, ColorRgb> = {\n __proto__: null,\n black: [0, 0, 0],\n blue: [0, 0, 255],\n blueBright: [100, 149, 237],\n cyan: [0, 255, 255],\n cyanBright: [0, 255, 255],\n gray: [128, 128, 128],\n green: [0, 128, 0],\n greenBright: [0, 255, 0],\n magenta: [255, 0, 255],\n magentaBright: [255, 105, 180],\n red: [255, 0, 0],\n redBright: [255, 69, 0],\n white: [255, 255, 255],\n whiteBright: [255, 255, 255],\n yellow: [255, 255, 0],\n yellowBright: [255, 255, 153],\n} as Record<ColorName, ColorRgb>\n\n/**\n * Type guard to check if a color value is an RGB tuple.\n * @param value - Color value to check\n * @returns `true` if value is an RGB tuple, `false` if it's a color name\n */\nfunction isRgbTuple(value: ColorValue): value is ColorRgb {\n return Array.isArray(value)\n}\n\n/**\n * Convert a color value to RGB tuple format.\n * Named colors are looked up in the `colorToRgb` map, RGB tuples are returned as-is.\n * @param color - Color name or RGB tuple\n * @returns RGB tuple with values 0-255\n */\nexport function toRgb(color: ColorValue): ColorRgb {\n if (isRgbTuple(color)) {\n return color\n }\n return colorToRgb[color]\n}\n\n/**\n * Progress tracking information for display in spinner.\n * Used by `progress()` and `progressStep()` methods to show animated progress bars.\n */\nexport type ProgressInfo = {\n /** Current progress value */\n current: number\n /** Total/maximum progress value */\n total: number\n /** Optional unit label displayed after the progress count (e.g., 'files', 'items') */\n unit?: string | undefined\n}\n\n/**\n * Internal shimmer state with color configuration.\n * Extends `ShimmerState` with additional color property that can be inherited from spinner.\n */\nexport type ShimmerInfo = ShimmerState & {\n /** Color for shimmer effect - can inherit from spinner, use explicit color, or gradient */\n color: ColorInherit | ColorValue | ShimmerColorGradient\n}\n\n/**\n * Spinner instance for displaying animated loading indicators.\n * Provides methods for status updates, progress tracking, and text shimmer effects.\n *\n * KEY BEHAVIORS:\n * - Methods WITHOUT \"AndStop\" keep the spinner running (e.g., `success()`, `fail()`)\n * - Methods WITH \"AndStop\" auto-clear the spinner line (e.g., `successAndStop()`, `failAndStop()`)\n * - Status messages (done, success, fail, info, warn, step, substep) go to stderr\n * - Data messages (`log()`) go to stdout\n *\n * @example\n * ```ts\n * import { Spinner } from '@socketsecurity/lib/spinner'\n *\n * const spinner = Spinner({ text: 'Loading\u2026' })\n * spinner.start()\n *\n * // Show success while continuing to spin\n * spinner.success('Step 1 complete')\n *\n * // Stop the spinner with success message\n * spinner.successAndStop('All done!')\n * ```\n */\nexport type Spinner = {\n /** Current spinner color as RGB tuple */\n color: ColorRgb\n /** Current spinner animation style */\n spinner: SpinnerStyle\n\n /** Whether spinner is currently animating */\n get isSpinning(): boolean\n\n /** Get current shimmer state (enabled/disabled and configuration) */\n get shimmerState(): ShimmerInfo | undefined\n\n /** Clear the current line without stopping the spinner */\n clear(): Spinner\n\n /** Show debug message without stopping (only if debug mode enabled) */\n debug(text?: string | undefined, ...extras: unknown[]): Spinner\n /** Show debug message and stop the spinner (only if debug mode enabled) */\n debugAndStop(text?: string | undefined, ...extras: unknown[]): Spinner\n\n /** Alias for `fail()` - show error without stopping */\n error(text?: string | undefined, ...extras: unknown[]): Spinner\n /** Alias for `failAndStop()` - show error and stop */\n errorAndStop(text?: string | undefined, ...extras: unknown[]): Spinner\n\n /** Show failure (\u2717) without stopping the spinner */\n fail(text?: string | undefined, ...extras: unknown[]): Spinner\n /** Show failure (\u2717) and stop the spinner, auto-clearing the line */\n failAndStop(text?: string | undefined, ...extras: unknown[]): Spinner\n\n /** Get current spinner text (getter) or set new text (setter) */\n text(value: string): Spinner\n text(): string\n\n /** Increase indentation by specified spaces (default: 2) */\n indent(spaces?: number | undefined): Spinner\n /** Decrease indentation by specified spaces (default: 2) */\n dedent(spaces?: number | undefined): Spinner\n\n /** Show info (\u2139) message without stopping the spinner */\n info(text?: string | undefined, ...extras: unknown[]): Spinner\n /** Show info (\u2139) message and stop the spinner, auto-clearing the line */\n infoAndStop(text?: string | undefined, ...extras: unknown[]): Spinner\n\n /** Log to stdout without stopping the spinner */\n log(text?: string | undefined, ...extras: unknown[]): Spinner\n /** Log and stop the spinner, auto-clearing the line */\n logAndStop(text?: string | undefined, ...extras: unknown[]): Spinner\n\n /** Start spinning with optional text */\n start(text?: string | undefined): Spinner\n /** Stop spinning and clear internal state, auto-clearing the line */\n stop(text?: string | undefined): Spinner\n /** Stop and show final text without clearing the line */\n stopAndPersist(text?: string | undefined): Spinner\n\n /** Show main step message to stderr without stopping */\n step(text?: string | undefined, ...extras: unknown[]): Spinner\n /** Show indented substep message to stderr without stopping */\n substep(text?: string | undefined, ...extras: unknown[]): Spinner\n\n /** Show success (\u2713) without stopping the spinner */\n success(text?: string | undefined, ...extras: unknown[]): Spinner\n /** Show success (\u2713) and stop the spinner, auto-clearing the line */\n successAndStop(text?: string | undefined, ...extras: unknown[]): Spinner\n\n /** Alias for `success()` - show success without stopping */\n done(text?: string | undefined, ...extras: unknown[]): Spinner\n /** Alias for `successAndStop()` - show success and stop */\n doneAndStop(text?: string | undefined, ...extras: unknown[]): Spinner\n\n /** Update progress bar with current/total values and optional unit */\n progress(current: number, total: number, unit?: string | undefined): Spinner\n /** Increment progress by specified amount (default: 1) */\n progressStep(amount?: number): Spinner\n\n /** Enable shimmer effect (restores saved config or uses defaults) */\n enableShimmer(): Spinner\n /** Disable shimmer effect (preserves config for later re-enable) */\n disableShimmer(): Spinner\n /** Set complete shimmer configuration */\n setShimmer(config: ShimmerConfig): Spinner\n /** Update partial shimmer configuration */\n updateShimmer(config: Partial<ShimmerConfig>): Spinner\n\n /** Show warning (\u26A0) without stopping the spinner */\n warn(text?: string | undefined, ...extras: unknown[]): Spinner\n /** Show warning (\u26A0) and stop the spinner, auto-clearing the line */\n warnAndStop(text?: string | undefined, ...extras: unknown[]): Spinner\n}\n\n/**\n * Configuration options for creating a spinner instance.\n */\nexport type SpinnerOptions = {\n /**\n * Spinner color as RGB tuple or color name.\n * @default [140, 82, 255] Socket purple\n */\n readonly color?: ColorValue | undefined\n /**\n * Shimmer effect configuration or direction string.\n * When enabled, text will have an animated shimmer effect.\n * @default undefined No shimmer effect\n */\n readonly shimmer?: ShimmerConfig | ShimmerDirection | undefined\n /**\n * Animation style with frames and timing.\n * @default 'socket' Custom Socket animation in CLI, minimal in CI\n */\n readonly spinner?: SpinnerStyle | undefined\n /**\n * Abort signal for cancelling the spinner.\n * @default getAbortSignal() from process constants\n */\n readonly signal?: AbortSignal | undefined\n /**\n * Output stream for spinner rendering.\n * @default process.stderr\n */\n readonly stream?: Writable | undefined\n /**\n * Initial text to display with the spinner.\n * @default undefined No initial text\n */\n readonly text?: string | undefined\n /**\n * Theme to use for spinner colors.\n * Accepts theme name ('socket', 'sunset', etc.) or Theme object.\n * @default Current theme from getTheme()\n */\n readonly theme?:\n | import('./themes/types').Theme\n | import('./themes/themes').ThemeName\n | undefined\n}\n\n/**\n * Animation style definition for spinner frames.\n * Defines the visual appearance and timing of the spinner animation.\n */\nexport type SpinnerStyle = {\n /** Array of animation frames (strings to display sequentially) */\n readonly frames: string[]\n /**\n * Milliseconds between frame changes.\n * @default 80 Standard frame rate\n */\n readonly interval?: number | undefined\n}\n\n/**\n * Minimal spinner style for CI environments.\n * Uses empty frame and max interval to effectively disable animation in CI.\n */\nexport const ciSpinner: SpinnerStyle = {\n frames: [''],\n interval: 2_147_483_647,\n}\n\n/**\n * Create a property descriptor for defining non-enumerable properties.\n * Used for adding aliased methods to the Spinner prototype.\n * @param value - Value for the property\n * @returns Property descriptor object\n * @private\n */\nfunction desc(value: unknown) {\n return {\n __proto__: null,\n configurable: true,\n value,\n writable: true,\n }\n}\n\n/**\n * Normalize text input by trimming leading whitespace.\n * Non-string values are converted to empty string.\n * @param value - Text to normalize\n * @returns Normalized string with leading whitespace removed\n * @private\n */\nfunction normalizeText(value: unknown) {\n return typeof value === 'string' ? value.trimStart() : ''\n}\n\n/**\n * Format progress information as a visual progress bar with percentage and count.\n * @param progress - Progress tracking information\n * @returns Formatted string with colored progress bar, percentage, and count\n * @private\n * @example \"\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 35% (7/20 files)\"\n */\nfunction formatProgress(progress: ProgressInfo): string {\n const { current, total, unit } = progress\n const percentage = Math.round((current / total) * 100)\n const bar = renderProgressBar(percentage)\n const count = unit ? `${current}/${total} ${unit}` : `${current}/${total}`\n return `${bar} ${percentage}% (${count})`\n}\n\n/**\n * Render a progress bar using block characters (\u2588 for filled, \u2591 for empty).\n * @param percentage - Progress percentage (0-100)\n * @param width - Total width of progress bar in characters\n * @returns Colored progress bar string\n * @default width=20\n * @private\n */\nfunction renderProgressBar(percentage: number, width: number = 20): string {\n const filled = Math.round((percentage / 100) * width)\n const empty = width - filled\n const bar = '\u2588'.repeat(filled) + '\u2591'.repeat(empty)\n // Use cyan color for the progress bar\n const colors =\n /*@__PURE__*/ require('./external/yoctocolors-cjs') as typeof import('yoctocolors-cjs')\n return colors.cyan(bar)\n}\n\nlet _cliSpinners: Record<string, SpinnerStyle> | undefined\n\n/**\n * Get available CLI spinner styles or a specific style by name.\n * Extends the standard cli-spinners collection with Socket custom spinners.\n *\n * Custom spinners:\n * - `socket` (default): Socket pulse animation with sparkles and lightning\n *\n * @param styleName - Optional name of specific spinner style to retrieve\n * @returns Specific spinner style if name provided, all styles if omitted, `undefined` if style not found\n * @see https://github.com/sindresorhus/cli-spinners/blob/main/spinners.json\n *\n * @example\n * ```ts\n * // Get all available spinner styles\n * const allSpinners = getCliSpinners()\n *\n * // Get specific style\n * const socketStyle = getCliSpinners('socket')\n * const dotsStyle = getCliSpinners('dots')\n * ```\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function getCliSpinners(\n styleName?: string | undefined,\n): SpinnerStyle | Record<string, SpinnerStyle> | undefined {\n if (_cliSpinners === undefined) {\n const YoctoCtor: any = yoctoSpinner as any\n // Get the YoctoSpinner class to access static properties.\n const tempInstance: any = YoctoCtor({})\n const YoctoSpinnerClass: any = tempInstance.constructor as any\n // Extend the standard cli-spinners collection with Socket custom spinners.\n _cliSpinners = {\n __proto__: null,\n ...YoctoSpinnerClass.spinners,\n socket: generateSocketSpinnerFrames(),\n }\n }\n if (typeof styleName === 'string' && _cliSpinners) {\n return hasOwn(_cliSpinners, styleName) ? _cliSpinners[styleName] : undefined\n }\n return _cliSpinners\n}\n\nlet _Spinner: {\n new (options?: SpinnerOptions | undefined): Spinner\n}\nlet _defaultSpinner: SpinnerStyle | undefined\n\n/**\n * Create a spinner instance for displaying loading indicators.\n * Provides an animated CLI spinner with status messages, progress tracking, and shimmer effects.\n *\n * AUTO-CLEAR BEHAVIOR:\n * - All *AndStop() methods AUTO-CLEAR the spinner line via yocto-spinner.stop()\n * Examples: `doneAndStop()`, `successAndStop()`, `failAndStop()`, etc.\n *\n * - Methods WITHOUT \"AndStop\" do NOT clear (spinner keeps spinning)\n * Examples: `done()`, `success()`, `fail()`, etc.\n *\n * STREAM USAGE:\n * - Spinner animation: stderr (yocto-spinner default)\n * - Status methods (done, success, fail, info, warn, step, substep): stderr\n * - Data methods (`log()`): stdout\n *\n * COMPARISON WITH LOGGER:\n * - `logger.done()` does NOT auto-clear (requires manual `logger.clearLine()`)\n * - `spinner.doneAndStop()` DOES auto-clear (built into yocto-spinner.stop())\n * - Pattern: `logger.clearLine().done()` vs `spinner.doneAndStop()`\n *\n * @param options - Configuration options for the spinner\n * @returns New spinner instance\n *\n * @example\n * ```ts\n * import { Spinner } from '@socketsecurity/lib/spinner'\n *\n * // Basic usage\n * const spinner = Spinner({ text: 'Loading data\u2026' })\n * spinner.start()\n * await fetchData()\n * spinner.successAndStop('Data loaded!')\n *\n * // With custom color\n * const spinner = Spinner({\n * text: 'Processing\u2026',\n * color: [255, 0, 0] // Red\n * })\n *\n * // With shimmer effect\n * const spinner = Spinner({\n * text: 'Building\u2026',\n * shimmer: { dir: 'ltr', speed: 0.5 }\n * })\n *\n * // Show progress\n * spinner.progress(5, 10, 'files')\n * spinner.progressStep() // Increment by 1\n * ```\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function Spinner(options?: SpinnerOptions | undefined): Spinner {\n if (_Spinner === undefined) {\n const YoctoCtor = yoctoSpinner as any\n // Get the actual YoctoSpinner class from an instance\n const tempInstance = YoctoCtor({})\n const YoctoSpinnerClass = tempInstance.constructor\n\n /*@__PURE__*/\n _Spinner = class SpinnerClass extends (YoctoSpinnerClass as any) {\n declare isSpinning: boolean\n #baseText: string = ''\n #indentation: string = ''\n #progress?: ProgressInfo | undefined\n #shimmer?: ShimmerInfo | undefined\n #shimmerSavedConfig?: ShimmerInfo | undefined\n\n constructor(options?: SpinnerOptions | undefined) {\n const opts = { __proto__: null, ...options } as SpinnerOptions\n\n // Get theme from options or current theme\n let theme = getTheme()\n if (opts.theme) {\n // Resolve theme name or use Theme object directly\n if (typeof opts.theme === 'string') {\n theme = THEMES[opts.theme]\n } else {\n theme = opts.theme\n }\n }\n\n // Get default color from theme if not specified\n let defaultColor: ColorValue = theme.colors.primary\n if (theme.effects?.spinner?.color) {\n const resolved = resolveColor(\n theme.effects.spinner.color,\n theme.colors,\n )\n // resolveColor can return 'inherit' or gradients which aren't valid for spinner\n // Fall back to primary for these cases\n if (resolved === 'inherit' || Array.isArray(resolved[0])) {\n defaultColor = theme.colors.primary\n } else {\n defaultColor = resolved as ColorValue\n }\n }\n\n // Convert color option to RGB (default from theme).\n const spinnerColor = opts.color ?? defaultColor\n\n // Validate RGB tuple if provided.\n if (\n isRgbTuple(spinnerColor) &&\n (spinnerColor.length !== 3 ||\n !spinnerColor.every(\n n => typeof n === 'number' && n >= 0 && n <= 255,\n ))\n ) {\n throw new TypeError(\n 'RGB color must be an array of 3 numbers between 0 and 255',\n )\n }\n\n const spinnerColorRgb = toRgb(spinnerColor)\n\n // Parse shimmer config - can be object or direction string.\n let shimmerInfo: ShimmerInfo | undefined\n if (opts.shimmer) {\n let shimmerDir: ShimmerDirection\n let shimmerColor:\n | ColorInherit\n | ColorValue\n | ShimmerColorGradient\n | undefined\n // Default: 0.33 steps per frame (~150ms per step).\n let shimmerSpeed: number = 1 / 3\n\n if (typeof opts.shimmer === 'string') {\n shimmerDir = opts.shimmer\n } else {\n const shimmerConfig = {\n __proto__: null,\n ...opts.shimmer,\n } as ShimmerConfig\n shimmerDir = shimmerConfig.dir ?? DIR_LTR\n shimmerColor = shimmerConfig.color ?? COLOR_INHERIT\n shimmerSpeed = shimmerConfig.speed ?? 1 / 3\n }\n\n // Create shimmer info with initial animation state:\n // - COLOR_INHERIT means use spinner color dynamically\n // - ColorValue (name or RGB tuple) is an explicit override color\n // - undefined color defaults to COLOR_INHERIT\n // - speed controls steps per frame (lower = slower, e.g., 0.33 = ~150ms per step)\n shimmerInfo = {\n __proto__: null,\n color: shimmerColor === undefined ? COLOR_INHERIT : shimmerColor,\n currentDir: DIR_LTR,\n mode: shimmerDir,\n speed: shimmerSpeed,\n step: 0,\n } as ShimmerInfo\n }\n\n // eslint-disable-next-line constructor-super\n super({\n signal: require('#constants/process').getAbortSignal(),\n ...opts,\n // Pass RGB color directly to yocto-spinner (it now supports RGB).\n color: spinnerColorRgb,\n // onRenderFrame callback provides full control over frame + text layout.\n // Calculates spacing based on frame width to prevent text jumping.\n onRenderFrame: (\n frame: string,\n text: string,\n applyColor: (text: string) => string,\n ) => {\n const width = stringWidth(frame)\n // Narrow frames (width 1) get 2 spaces, wide frames (width 2) get 1 space.\n // Total width is consistent: 3 characters (frame + spacing) before text.\n const spacing = width === 1 ? ' ' : ' '\n return frame ? `${applyColor(frame)}${spacing}${text}` : text\n },\n // onFrameUpdate callback is called by yocto-spinner whenever a frame advances.\n // This ensures shimmer updates are perfectly synchronized with animation beats.\n onFrameUpdate: shimmerInfo\n ? () => {\n // Update parent's text without triggering render.\n // Parent's #skipRender flag prevents nested render calls.\n // Only update if we have base text to avoid blank frames.\n if (this.#baseText) {\n super.text = this.#buildDisplayText()\n }\n }\n : undefined,\n })\n\n this.#shimmer = shimmerInfo\n this.#shimmerSavedConfig = shimmerInfo\n }\n\n // Override color getter to ensure it's always RGB.\n get color(): ColorRgb {\n const value = super.color\n return isRgbTuple(value) ? value : toRgb(value)\n }\n\n // Override color setter to always convert to RGB before passing to yocto-spinner.\n set color(value: ColorValue | ColorRgb) {\n super.color = isRgbTuple(value) ? value : toRgb(value)\n }\n\n // Getter to expose current shimmer state.\n get shimmerState(): ShimmerInfo | undefined {\n if (!this.#shimmer) {\n return undefined\n }\n return {\n color: this.#shimmer.color,\n currentDir: this.#shimmer.currentDir,\n mode: this.#shimmer.mode,\n speed: this.#shimmer.speed,\n step: this.#shimmer.step,\n } as ShimmerInfo\n }\n\n /**\n * Apply a yocto-spinner method and update logger state.\n * Handles text normalization, extra arguments, and logger tracking.\n * @private\n */\n #apply(methodName: string, args: unknown[]) {\n let extras: unknown[]\n let text = args.at(0)\n if (typeof text === 'string') {\n extras = args.slice(1)\n } else {\n extras = args\n text = ''\n }\n const wasSpinning = this.isSpinning\n const normalized = normalizeText(text)\n if (methodName === 'stop' && !normalized) {\n super[methodName]()\n } else {\n super[methodName](normalized)\n }\n const logger = getDefaultLogger()\n if (methodName === 'stop') {\n if (wasSpinning && normalized) {\n logger[lastWasBlankSymbol](isBlankString(normalized))\n logger[incLogCallCountSymbol]()\n }\n } else {\n logger[lastWasBlankSymbol](false)\n logger[incLogCallCountSymbol]()\n }\n if (extras.length) {\n logger.log(...extras)\n logger[lastWasBlankSymbol](false)\n }\n return this\n }\n\n /**\n * Build the complete display text with progress, shimmer, and indentation.\n * Combines base text, progress bar, shimmer effects, and indentation.\n * @private\n */\n #buildDisplayText() {\n let displayText = this.#baseText\n\n if (this.#progress) {\n const progressText = formatProgress(this.#progress)\n displayText = displayText\n ? `${displayText} ${progressText}`\n : progressText\n }\n\n // Apply shimmer effect if enabled.\n if (displayText && this.#shimmer) {\n // If shimmer color is 'inherit', use current spinner color (getter ensures RGB).\n // Otherwise, check if it's a gradient (array of arrays) or single color.\n let shimmerColor: ColorRgb | ShimmerColorGradient\n if (this.#shimmer.color === COLOR_INHERIT) {\n shimmerColor = this.color\n } else if (Array.isArray(this.#shimmer.color[0])) {\n // It's a gradient - use as is.\n shimmerColor = this.#shimmer.color as ShimmerColorGradient\n } else {\n // It's a single color - convert to RGB.\n shimmerColor = toRgb(this.#shimmer.color as ColorValue)\n }\n\n displayText = applyShimmer(displayText, this.#shimmer, {\n color: shimmerColor,\n direction: this.#shimmer.mode,\n })\n }\n\n // Apply indentation\n if (this.#indentation && displayText) {\n displayText = this.#indentation + displayText\n }\n\n return displayText\n }\n\n /**\n * Show a status message without stopping the spinner.\n * Outputs the symbol and message to stderr, then continues spinning.\n */\n #showStatusAndKeepSpinning(symbolType: SymbolType, args: unknown[]) {\n let text = args.at(0)\n let extras: unknown[]\n if (typeof text === 'string') {\n extras = args.slice(1)\n } else {\n extras = args\n text = ''\n }\n\n // Note: Status messages always go to stderr.\n const logger = getDefaultLogger()\n logger.error(`${LOG_SYMBOLS[symbolType]} ${text}`, ...extras)\n return this\n }\n\n /**\n * Update the spinner's displayed text.\n * Rebuilds display text and triggers render.\n * @private\n */\n #updateSpinnerText() {\n // Call the parent class's text setter, which triggers render.\n super.text = this.#buildDisplayText()\n }\n\n /**\n * Show a debug message (\u2139) without stopping the spinner.\n * Only displays if debug mode is enabled via environment variable.\n * Outputs to stderr and continues spinning.\n *\n * @param text - Debug message to display\n * @param extras - Additional values to log\n * @returns This spinner for chaining\n */\n debug(text?: string | undefined, ...extras: unknown[]) {\n if (isDebug()) {\n return this.#showStatusAndKeepSpinning('info', [text, ...extras])\n }\n return this\n }\n\n /**\n * Show a debug message (\u2139) and stop the spinner.\n * Only displays if debug mode is enabled via environment variable.\n * Auto-clears the spinner line before displaying the message.\n *\n * @param text - Debug message to display\n * @param extras - Additional values to log\n * @returns This spinner for chaining\n */\n debugAndStop(text?: string | undefined, ...extras: unknown[]) {\n if (isDebug()) {\n return this.#apply('info', [text, ...extras])\n }\n return this\n }\n\n /**\n * Decrease indentation level by removing spaces from the left.\n * Pass 0 to reset indentation to zero completely.\n *\n * @param spaces - Number of spaces to remove\n * @returns This spinner for chaining\n * @default spaces=2\n *\n * @example\n * ```ts\n * spinner.dedent() // Remove 2 spaces\n * spinner.dedent(4) // Remove 4 spaces\n * spinner.dedent(0) // Reset to zero indentation\n * ```\n */\n dedent(spaces?: number | undefined) {\n // Pass 0 to reset indentation\n if (spaces === 0) {\n this.#indentation = ''\n } else {\n const amount = spaces ?? 2\n const newLength = Math.max(0, this.#indentation.length - amount)\n this.#indentation = this.#indentation.slice(0, newLength)\n }\n this.#updateSpinnerText()\n return this\n }\n\n /**\n * Show a done/success message (\u2713) without stopping the spinner.\n * Alias for `success()` with a shorter name.\n *\n * DESIGN DECISION: Unlike yocto-spinner, our `done()` does NOT stop the spinner.\n * Use `doneAndStop()` if you want to stop the spinner.\n *\n * @param text - Message to display\n * @param extras - Additional values to log\n * @returns This spinner for chaining\n */\n done(text?: string | undefined, ...extras: unknown[]) {\n return this.#showStatusAndKeepSpinning('success', [text, ...extras])\n }\n\n /**\n * Show a done/success message (\u2713) and stop the spinner.\n * Auto-clears the spinner line before displaying the success message.\n *\n * @param text - Message to display\n * @param extras - Additional values to log\n * @returns This spinner for chaining\n */\n doneAndStop(text?: string | undefined, ...extras: unknown[]) {\n return this.#apply('success', [text, ...extras])\n }\n\n /**\n * Show a failure message (\u2717) without stopping the spinner.\n * DESIGN DECISION: Unlike yocto-spinner, our `fail()` does NOT stop the spinner.\n * This allows displaying errors while continuing to spin.\n * Use `failAndStop()` if you want to stop the spinner.\n *\n * @param text - Error message to display\n * @param extras - Additional values to log\n * @returns This spinner for chaining\n */\n fail(text?: string | undefined, ...extras: unknown[]) {\n return this.#showStatusAndKeepSpinning('fail', [text, ...extras])\n }\n\n /**\n * Show a failure message (\u2717) and stop the spinner.\n * Auto-clears the spinner line before displaying the error message.\n *\n * @param text - Error message to display\n * @param extras - Additional values to log\n * @returns This spinner for chaining\n */\n failAndStop(text?: string | undefined, ...extras: unknown[]) {\n return this.#apply('error', [text, ...extras])\n }\n\n /**\n * Increase indentation level by adding spaces to the left.\n * Pass 0 to reset indentation to zero completely.\n *\n * @param spaces - Number of spaces to add\n * @returns This spinner for chaining\n * @default spaces=2\n *\n * @example\n * ```ts\n * spinner.indent() // Add 2 spaces\n * spinner.indent(4) // Add 4 spaces\n * spinner.indent(0) // Reset to zero indentation\n * ```\n */\n indent(spaces?: number | undefined) {\n // Pass 0 to reset indentation\n if (spaces === 0) {\n this.#indentation = ''\n } else {\n const amount = spaces ?? 2\n this.#indentation += ' '.repeat(amount)\n }\n this.#updateSpinnerText()\n return this\n }\n\n /**\n * Show an info message (\u2139) without stopping the spinner.\n * Outputs to stderr and continues spinning.\n *\n * @param text - Info message to display\n * @param extras - Additional values to log\n * @returns This spinner for chaining\n */\n info(text?: string | undefined, ...extras: unknown[]) {\n return this.#showStatusAndKeepSpinning('info', [text, ...extras])\n }\n\n /**\n * Show an info message (\u2139) and stop the spinner.\n * Auto-clears the spinner line before displaying the message.\n *\n * @param text - Info message to display\n * @param extras - Additional values to log\n * @returns This spinner for chaining\n */\n infoAndStop(text?: string | undefined, ...extras: unknown[]) {\n return this.#apply('info', [text, ...extras])\n }\n\n /**\n * Log a message to stdout without stopping the spinner.\n * Unlike other status methods, this outputs to stdout for data logging.\n *\n * @param args - Values to log to stdout\n * @returns This spinner for chaining\n */\n log(...args: unknown[]) {\n const logger = getDefaultLogger()\n logger.log(...args)\n return this\n }\n\n /**\n * Log a message to stdout and stop the spinner.\n * Auto-clears the spinner line before displaying the message.\n *\n * @param text - Message to display\n * @param extras - Additional values to log\n * @returns This spinner for chaining\n */\n logAndStop(text?: string | undefined, ...extras: unknown[]) {\n return this.#apply('stop', [text, ...extras])\n }\n\n /**\n * Update progress information displayed with the spinner.\n * Shows a progress bar with percentage and optional unit label.\n *\n * @param current - Current progress value\n * @param total - Total/maximum progress value\n * @param unit - Optional unit label (e.g., 'files', 'items')\n * @returns This spinner for chaining\n *\n * @example\n * ```ts\n * spinner.progress(5, 10) // \"\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 50% (5/10)\"\n * spinner.progress(7, 20, 'files') // \"\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 35% (7/20 files)\"\n * ```\n */\n progress = (\n current: number,\n total: number,\n unit?: string | undefined,\n ) => {\n this.#progress = {\n __proto__: null,\n current,\n total,\n ...(unit ? { unit } : {}),\n } as ProgressInfo\n this.#updateSpinnerText()\n return this\n }\n\n /**\n * Increment progress by a specified amount.\n * Updates the progress bar displayed with the spinner.\n * Clamps the result between 0 and the total value.\n *\n * @param amount - Amount to increment by\n * @returns This spinner for chaining\n * @default amount=1\n *\n * @example\n * ```ts\n * spinner.progress(0, 10, 'files')\n * spinner.progressStep() // Progress: 1/10\n * spinner.progressStep(3) // Progress: 4/10\n * ```\n */\n progressStep(amount: number = 1) {\n if (this.#progress) {\n const newCurrent = this.#progress.current + amount\n this.#progress = {\n __proto__: null,\n current: Math.max(0, Math.min(newCurrent, this.#progress.total)),\n total: this.#progress.total,\n ...(this.#progress.unit ? { unit: this.#progress.unit } : {}),\n } as ProgressInfo\n this.#updateSpinnerText()\n }\n return this\n }\n\n /**\n * Start the spinner animation with optional text.\n * Begins displaying the animated spinner on stderr.\n *\n * @param text - Optional text to display with the spinner\n * @returns This spinner for chaining\n *\n * @example\n * ```ts\n * spinner.start('Loading\u2026')\n * // Later:\n * spinner.successAndStop('Done!')\n * ```\n */\n start(...args: unknown[]) {\n if (args.length) {\n const text = args.at(0)\n const normalized = normalizeText(text)\n // We clear this.text on start when `text` is falsy because yocto-spinner\n // will not clear it otherwise.\n if (!normalized) {\n this.#baseText = ''\n super.text = ''\n } else {\n this.#baseText = normalized\n }\n }\n\n this.#updateSpinnerText()\n // Don't pass text to yocto-spinner.start() since we already set it via #updateSpinnerText().\n // Passing args would cause duplicate message output.\n return this.#apply('start', [])\n }\n\n /**\n * Log a main step message to stderr without stopping the spinner.\n * Adds a blank line before the message for visual separation.\n * Aligns with `logger.step()` to use stderr for status messages.\n *\n * @param text - Step message to display\n * @param extras - Additional values to log\n * @returns This spinner for chaining\n *\n * @example\n * ```ts\n * spinner.step('Building application')\n * spinner.substep('Compiling TypeScript')\n * spinner.substep('Bundling assets')\n * ```\n */\n step(text?: string | undefined, ...extras: unknown[]) {\n if (typeof text === 'string') {\n const logger = getDefaultLogger()\n // Add blank line before step for visual separation.\n logger.error('')\n // Use error (stderr) to align with logger.step() default stream.\n logger.error(text, ...extras)\n }\n return this\n }\n\n /**\n * Log an indented substep message to stderr without stopping the spinner.\n * Adds 2-space indentation to the message.\n * Aligns with `logger.substep()` to use stderr for status messages.\n *\n * @param text - Substep message to display\n * @param extras - Additional values to log\n * @returns This spinner for chaining\n *\n * @example\n * ```ts\n * spinner.step('Building application')\n * spinner.substep('Compiling TypeScript')\n * spinner.substep('Bundling assets')\n * ```\n */\n substep(text?: string | undefined, ...extras: unknown[]) {\n if (typeof text === 'string') {\n // Add 2-space indent for substep.\n const logger = getDefaultLogger()\n // Use error (stderr) to align with logger.substep() default stream.\n logger.error(` ${text}`, ...extras)\n }\n return this\n }\n\n /**\n * Stop the spinner animation and clear internal state.\n * Auto-clears the spinner line via yocto-spinner.stop().\n * Resets progress, shimmer, and text state.\n *\n * @param text - Optional final text to display after stopping\n * @returns This spinner for chaining\n *\n * @example\n * ```ts\n * spinner.start('Processing\u2026')\n * // Do work\n * spinner.stop() // Just stop, no message\n * // or\n * spinner.stop('Finished processing')\n * ```\n */\n stop(...args: unknown[]) {\n // Clear internal state.\n this.#baseText = ''\n this.#progress = undefined\n // Reset shimmer animation state if shimmer is enabled.\n if (this.#shimmer) {\n this.#shimmer.currentDir = DIR_LTR\n this.#shimmer.step = 0\n }\n // Call parent stop first (clears screen, sets isSpinning = false).\n const result = this.#apply('stop', args)\n // Then clear text to avoid blank frame render.\n // This is safe now because isSpinning is false.\n super.text = ''\n return result\n }\n\n /**\n * Show a success message (\u2713) without stopping the spinner.\n * DESIGN DECISION: Unlike yocto-spinner, our `success()` does NOT stop the spinner.\n * This allows displaying success messages while continuing to spin for multi-step operations.\n * Use `successAndStop()` if you want to stop the spinner.\n *\n * @param text - Success message to display\n * @param extras - Additional values to log\n * @returns This spinner for chaining\n */\n success(text?: string | undefined, ...extras: unknown[]) {\n return this.#showStatusAndKeepSpinning('success', [text, ...extras])\n }\n\n /**\n * Show a success message (\u2713) and stop the spinner.\n * Auto-clears the spinner line before displaying the success message.\n *\n * @param text - Success message to display\n * @param extras - Additional values to log\n * @returns This spinner for chaining\n */\n successAndStop(text?: string | undefined, ...extras: unknown[]) {\n return this.#apply('success', [text, ...extras])\n }\n\n /**\n * Get or set the spinner text.\n * When called with no arguments, returns the current base text.\n * When called with text, updates the display and returns the spinner for chaining.\n *\n * @param value - Text to display (omit to get current text)\n * @returns Current text (getter) or this spinner (setter)\n *\n * @example\n * ```ts\n * // Setter\n * spinner.text('Loading data\u2026')\n * spinner.text('Processing\u2026')\n *\n * // Getter\n * const current = spinner.text()\n * console.log(current) // \"Processing\u2026\"\n * ```\n */\n text(): string\n text(value: string): Spinner\n text(value?: string): string | Spinner {\n // biome-ignore lint/complexity/noArguments: Function overload for getter/setter pattern.\n if (arguments.length === 0) {\n // Getter: return current base text\n return this.#baseText\n }\n // Setter: update base text and refresh display\n this.#baseText = value ?? ''\n this.#updateSpinnerText()\n return this as unknown as Spinner\n }\n\n /**\n * Show a warning message (\u26A0) without stopping the spinner.\n * Outputs to stderr and continues spinning.\n *\n * @param text - Warning message to display\n * @param extras - Additional values to log\n * @returns This spinner for chaining\n */\n warn(text?: string | undefined, ...extras: unknown[]) {\n return this.#showStatusAndKeepSpinning('warn', [text, ...extras])\n }\n\n /**\n * Show a warning message (\u26A0) and stop the spinner.\n * Auto-clears the spinner line before displaying the warning message.\n *\n * @param text - Warning message to display\n * @param extras - Additional values to log\n * @returns This spinner for chaining\n */\n warnAndStop(text?: string | undefined, ...extras: unknown[]) {\n return this.#apply('warning', [text, ...extras])\n }\n\n /**\n * Enable shimmer effect.\n * Restores saved config or uses defaults if no saved config exists.\n *\n * @returns This spinner for chaining\n *\n * @example\n * spinner.enableShimmer()\n */\n enableShimmer(): Spinner {\n if (this.#shimmerSavedConfig) {\n // Restore saved config.\n this.#shimmer = { ...this.#shimmerSavedConfig }\n } else {\n // Create default config.\n this.#shimmer = {\n color: COLOR_INHERIT,\n currentDir: DIR_LTR,\n mode: DIR_LTR,\n speed: 1 / 3,\n step: 0,\n } as ShimmerInfo\n this.#shimmerSavedConfig = this.#shimmer\n }\n\n this.#updateSpinnerText()\n return this as unknown as Spinner\n }\n\n /**\n * Disable shimmer effect.\n * Preserves config for later re-enable via enableShimmer().\n *\n * @returns This spinner for chaining\n *\n * @example\n * spinner.disableShimmer()\n */\n disableShimmer(): Spinner {\n // Disable shimmer but preserve config.\n this.#shimmer = undefined\n this.#updateSpinnerText()\n return this as unknown as Spinner\n }\n\n /**\n * Set complete shimmer configuration.\n * Replaces any existing shimmer config with the provided values.\n * Undefined properties will use default values.\n *\n * @param config - Complete shimmer configuration\n * @returns This spinner for chaining\n *\n * @example\n * spinner.setShimmer({\n * color: [255, 0, 0],\n * dir: 'rtl',\n * speed: 0.5\n * })\n */\n setShimmer(config: ShimmerConfig): Spinner {\n this.#shimmer = {\n color: config.color ?? COLOR_INHERIT,\n currentDir: DIR_LTR,\n mode: config.dir ?? DIR_LTR,\n speed: config.speed ?? 1 / 3,\n step: 0,\n } as ShimmerInfo\n this.#shimmerSavedConfig = this.#shimmer\n this.#updateSpinnerText()\n return this as unknown as Spinner\n }\n\n /**\n * Update partial shimmer configuration.\n * Merges with existing config, enabling shimmer if currently disabled.\n *\n * @param config - Partial shimmer configuration to merge\n * @returns This spinner for chaining\n *\n * @example\n * // Update just the speed\n * spinner.updateShimmer({ speed: 0.5 })\n *\n * // Update direction\n * spinner.updateShimmer({ dir: 'rtl' })\n *\n * // Update multiple properties\n * spinner.updateShimmer({ color: [255, 0, 0], speed: 0.8 })\n */\n updateShimmer(config: Partial<ShimmerConfig>): Spinner {\n const partialConfig = {\n __proto__: null,\n ...config,\n } as Partial<ShimmerConfig>\n\n if (this.#shimmer) {\n // Update existing shimmer.\n this.#shimmer = {\n ...this.#shimmer,\n ...(partialConfig.color !== undefined\n ? { color: partialConfig.color }\n : {}),\n ...(partialConfig.dir !== undefined\n ? { mode: partialConfig.dir }\n : {}),\n ...(partialConfig.speed !== undefined\n ? { speed: partialConfig.speed }\n : {}),\n } as ShimmerInfo\n this.#shimmerSavedConfig = this.#shimmer\n } else if (this.#shimmerSavedConfig) {\n // Restore and update.\n this.#shimmer = {\n ...this.#shimmerSavedConfig,\n ...(partialConfig.color !== undefined\n ? { color: partialConfig.color }\n : {}),\n ...(partialConfig.dir !== undefined\n ? { mode: partialConfig.dir }\n : {}),\n ...(partialConfig.speed !== undefined\n ? { speed: partialConfig.speed }\n : {}),\n } as ShimmerInfo\n this.#shimmerSavedConfig = this.#shimmer\n } else {\n // Create new with partial config.\n this.#shimmer = {\n color: partialConfig.color ?? COLOR_INHERIT,\n currentDir: DIR_LTR,\n mode: partialConfig.dir ?? DIR_LTR,\n speed: partialConfig.speed ?? 1 / 3,\n step: 0,\n } as ShimmerInfo\n this.#shimmerSavedConfig = this.#shimmer\n }\n\n this.#updateSpinnerText()\n return this as unknown as Spinner\n }\n } as unknown as {\n new (options?: SpinnerOptions | undefined): Spinner\n }\n // Add aliases.\n Object.defineProperties(_Spinner.prototype, {\n error: desc(_Spinner.prototype.fail),\n errorAndStop: desc(_Spinner.prototype.failAndStop),\n warning: desc(_Spinner.prototype.warn),\n warningAndStop: desc(_Spinner.prototype.warnAndStop),\n })\n _defaultSpinner = getCI()\n ? ciSpinner\n : (getCliSpinners('socket') as SpinnerStyle)\n }\n return new _Spinner({\n spinner: _defaultSpinner,\n ...options,\n })\n}\n\nlet _spinner: ReturnType<typeof Spinner> | undefined\n\n/**\n * Get the default spinner instance.\n * Lazily creates the spinner to avoid circular dependencies during module initialization.\n * Reuses the same instance across calls.\n *\n * @returns Shared default spinner instance\n *\n * @example\n * ```ts\n * import { getDefaultSpinner } from '@socketsecurity/lib/spinner'\n *\n * const spinner = getDefaultSpinner()\n * spinner.start('Loading\u2026')\n * ```\n */\nexport function getDefaultSpinner(): ReturnType<typeof Spinner> {\n if (_spinner === undefined) {\n _spinner = Spinner()\n }\n return _spinner\n}\n\n// REMOVED: Deprecated `spinner` export\n// Migration: Use getDefaultSpinner() instead\n// See: getDefaultSpinner() function above\n\n/**\n * Configuration options for `withSpinner()` helper.\n * @template T - Return type of the async operation\n */\nexport type WithSpinnerOptions<T> = {\n /** Message to display while the spinner is running */\n message: string\n /** Async function to execute while spinner is active */\n operation: () => Promise<T>\n /**\n * Optional spinner instance to use.\n * If not provided, operation runs without spinner.\n */\n spinner?: Spinner | undefined\n /**\n * Optional spinner options to apply during the operation.\n * These options will be pushed when the operation starts and popped when it completes.\n * Supports color and shimmer configuration.\n */\n withOptions?: Partial<Pick<SpinnerOptions, 'color' | 'shimmer'>> | undefined\n}\n\n/**\n * Execute an async operation with spinner lifecycle management.\n * Ensures `spinner.stop()` is always called via try/finally, even if the operation throws.\n * Provides safe cleanup and consistent spinner behavior.\n *\n * @template T - Return type of the operation\n * @param options - Configuration object\n * @param options.message - Message to display while spinner is running\n * @param options.operation - Async function to execute\n * @param options.spinner - Optional spinner instance (if not provided, no spinner is used)\n * @returns Result of the operation\n * @throws Re-throws any error from operation after stopping spinner\n *\n * @example\n * ```ts\n * import { Spinner, withSpinner } from '@socketsecurity/lib/spinner'\n *\n * const spinner = Spinner()\n *\n * // With spinner instance\n * const result = await withSpinner({\n * message: 'Processing\u2026',\n * operation: async () => {\n * return await processData()\n * },\n * spinner\n * })\n *\n * // Without spinner instance (no-op, just runs operation)\n * const result = await withSpinner({\n * message: 'Processing\u2026',\n * operation: async () => {\n * return await processData()\n * }\n * })\n * ```\n */\nexport async function withSpinner<T>(\n options: WithSpinnerOptions<T>,\n): Promise<T> {\n const { message, operation, spinner, withOptions } = {\n __proto__: null,\n ...options,\n } as WithSpinnerOptions<T>\n\n if (!spinner) {\n return await operation()\n }\n\n // Save current options if we're going to change them\n const savedColor =\n withOptions?.color !== undefined ? spinner.color : undefined\n const savedShimmerState =\n withOptions?.shimmer !== undefined ? spinner.shimmerState : undefined\n\n // Apply temporary options\n if (withOptions?.color !== undefined) {\n spinner.color = toRgb(withOptions.color)\n }\n if (withOptions?.shimmer !== undefined) {\n if (typeof withOptions.shimmer === 'string') {\n spinner.updateShimmer({ dir: withOptions.shimmer })\n } else {\n spinner.setShimmer(withOptions.shimmer)\n }\n }\n\n spinner.start(message)\n try {\n return await operation()\n } finally {\n spinner.stop()\n // Restore previous options\n if (savedColor !== undefined) {\n spinner.color = savedColor\n }\n if (withOptions?.shimmer !== undefined) {\n if (savedShimmerState) {\n spinner.setShimmer({\n color: savedShimmerState.color as any,\n dir: savedShimmerState.mode,\n speed: savedShimmerState.speed,\n })\n } else {\n spinner.disableShimmer()\n }\n }\n }\n}\n\n/**\n * Configuration options for `withSpinnerRestore()` helper.\n * @template T - Return type of the async operation\n */\nexport type WithSpinnerRestoreOptions<T> = {\n /** Async function to execute while spinner is stopped */\n operation: () => Promise<T>\n /** Optional spinner instance to restore after operation */\n spinner?: Spinner | undefined\n /** Whether spinner was spinning before the operation (used to conditionally restart) */\n wasSpinning: boolean\n}\n\n/**\n * Execute an async operation with conditional spinner restart.\n * Useful when you need to temporarily stop a spinner for an operation,\n * then restore it to its previous state (if it was spinning).\n *\n * @template T - Return type of the operation\n * @param options - Configuration object\n * @param options.operation - Async function to execute\n * @param options.spinner - Optional spinner instance to manage\n * @param options.wasSpinning - Whether spinner was spinning before the operation\n * @returns Result of the operation\n * @throws Re-throws any error from operation after restoring spinner state\n *\n * @example\n * ```ts\n * import { getDefaultSpinner, withSpinnerRestore } from '@socketsecurity/lib/spinner'\n *\n * const spinner = getDefaultSpinner()\n * const wasSpinning = spinner.isSpinning\n * spinner.stop()\n *\n * const result = await withSpinnerRestore({\n * operation: async () => {\n * // Do work without spinner\n * return await someOperation()\n * },\n * spinner,\n * wasSpinning\n * })\n * // Spinner is automatically restarted if wasSpinning was true\n * ```\n */\nexport async function withSpinnerRestore<T>(\n options: WithSpinnerRestoreOptions<T>,\n): Promise<T> {\n const { operation, spinner, wasSpinning } = {\n __proto__: null,\n ...options,\n } as WithSpinnerRestoreOptions<T>\n\n try {\n return await operation()\n } finally {\n if (spinner && wasSpinning) {\n spinner.start()\n }\n }\n}\n\n/**\n * Configuration options for `withSpinnerSync()` helper.\n * @template T - Return type of the sync operation\n */\nexport type WithSpinnerSyncOptions<T> = {\n /** Message to display while the spinner is running */\n message: string\n /** Synchronous function to execute while spinner is active */\n operation: () => T\n /**\n * Optional spinner instance to use.\n * If not provided, operation runs without spinner.\n */\n spinner?: Spinner | undefined\n /**\n * Optional spinner options to apply during the operation.\n * These options will be pushed when the operation starts and popped when it completes.\n * Supports color and shimmer configuration.\n */\n withOptions?: Partial<Pick<SpinnerOptions, 'color' | 'shimmer'>> | undefined\n}\n\n/**\n * Execute a synchronous operation with spinner lifecycle management.\n * Ensures `spinner.stop()` is always called via try/finally, even if the operation throws.\n * Provides safe cleanup and consistent spinner behavior for sync operations.\n *\n * @template T - Return type of the operation\n * @param options - Configuration object\n * @param options.message - Message to display while spinner is running\n * @param options.operation - Synchronous function to execute\n * @param options.spinner - Optional spinner instance (if not provided, no spinner is used)\n * @returns Result of the operation\n * @throws Re-throws any error from operation after stopping spinner\n *\n * @example\n * ```ts\n * import { Spinner, withSpinnerSync } from '@socketsecurity/lib/spinner'\n *\n * const spinner = Spinner()\n *\n * const result = withSpinnerSync({\n * message: 'Processing\u2026',\n * operation: () => {\n * return processDataSync()\n * },\n * spinner\n * })\n * ```\n */\nexport function withSpinnerSync<T>(options: WithSpinnerSyncOptions<T>): T {\n const { message, operation, spinner, withOptions } = {\n __proto__: null,\n ...options,\n } as WithSpinnerSyncOptions<T>\n\n if (!spinner) {\n return operation()\n }\n\n // Save current options if we're going to change them\n const savedColor =\n withOptions?.color !== undefined ? spinner.color : undefined\n const savedShimmerState =\n withOptions?.shimmer !== undefined ? spinner.shimmerState : undefined\n\n // Apply temporary options\n if (withOptions?.color !== undefined) {\n spinner.color = toRgb(withOptions.color)\n }\n if (withOptions?.shimmer !== undefined) {\n if (typeof withOptions.shimmer === 'string') {\n spinner.updateShimmer({ dir: withOptions.shimmer })\n } else {\n spinner.setShimmer(withOptions.shimmer)\n }\n }\n\n spinner.start(message)\n try {\n return operation()\n } finally {\n spinner.stop()\n // Restore previous options\n if (savedColor !== undefined) {\n spinner.color = savedColor\n }\n if (withOptions?.shimmer !== undefined) {\n if (savedShimmerState) {\n spinner.setShimmer({\n color: savedShimmerState.color as any,\n dir: savedShimmerState.mode,\n speed: savedShimmerState.speed,\n })\n } else {\n spinner.disableShimmer()\n }\n }\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["yoctoSpinner", "options"]
7
7
  }
package/dist/zod.d.ts CHANGED
@@ -2,4 +2,4 @@
2
2
  * @fileoverview Zod schema validation library wrapper for type-safe runtime validation.
3
3
  * Provides access to zod's schema builder through the z object.
4
4
  */
5
- export { z } from 'zod';
5
+ export { z } from './external/zod';
package/dist/zod.js CHANGED
@@ -21,7 +21,7 @@ __export(zod_exports, {
21
21
  z: () => import_zod.z
22
22
  });
23
23
  module.exports = __toCommonJS(zod_exports);
24
- var import_zod = require('./external/zod');
24
+ var import_zod = require("./external/zod");
25
25
  // Annotate the CommonJS export names for ESM import in node:
26
26
  0 && (module.exports = {
27
27
  z
package/dist/zod.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/zod.ts"],
4
- "sourcesContent": ["/**\n * @fileoverview Zod schema validation library wrapper for type-safe runtime validation.\n * Provides access to zod's schema builder through the z object.\n */\n\nexport { z } from 'zod'\n"],
4
+ "sourcesContent": ["/**\n * @fileoverview Zod schema validation library wrapper for type-safe runtime validation.\n * Provides access to zod's schema builder through the z object.\n */\n\nexport { z } from './external/zod'\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,iBAAkB;",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@socketsecurity/lib",
3
- "version": "3.1.0",
3
+ "version": "3.1.2",
4
4
  "license": "MIT",
5
5
  "description": "Core utilities and infrastructure for Socket.dev security tools",
6
6
  "keywords": [
@@ -589,7 +589,7 @@
589
589
  "@npmcli/package-json": "7.0.0",
590
590
  "@npmcli/promise-spawn": "8.0.3",
591
591
  "@socketregistry/is-unicode-supported": "1.0.5",
592
- "@socketregistry/packageurl-js": "1.3.3",
592
+ "@socketregistry/packageurl-js": "1.3.4",
593
593
  "@socketregistry/yocto-spinner": "1.0.19",
594
594
  "@types/node": "24.9.2",
595
595
  "@typescript/native-preview": "7.0.0-dev.20250920.1",