@powerhousedao/registry 6.2.3-dev.6 → 6.2.3-dev.60
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/README.md +151 -26
- package/dist/cli.d.mts +122 -19
- package/dist/cli.d.mts.map +1 -1
- package/dist/cli.mjs +5304 -819
- package/dist/cli.mjs.map +1 -1
- package/dist/plugins/@powerhousedao/verdaccio-s3-storage/es5-CoIkS7gl.js +1723 -0
- package/dist/plugins/@powerhousedao/verdaccio-s3-storage/index.js +53926 -0
- package/dist/plugins/@powerhousedao/verdaccio-s3-storage/rolldown-runtime-ch10HqoO.js +71 -0
- package/dist/plugins/verdaccio-registry-auth.js +423 -30
- package/package.json +12 -12
package/dist/cli.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.mjs","names":["#resolveFile","#extractWithLock","#extractionLocks","#channels","#clients","#broadcast","#storagePath","#predefined","#dynamic","#load","#save","#post","#filePath"],"sources":["../src/constants.ts","../src/auth/pg-store.ts","../src/auth/store-handoff.ts","../src/semver.ts","../src/cdn.ts","../src/packages.ts","../src/warmup.ts","../src/middleware.ts","../src/notifications/manager.ts","../src/notifications/sse.ts","../src/notifications/webhook.ts","../src/verdaccio-config.ts","../src/run.ts","../cli.ts"],"sourcesContent":["export const DEFAULT_PORT = 8080;\nexport const DEFAULT_STORAGE_DIR_NAME = \"./storage\" as const;\nexport const DEFAULT_REGISTRY_CDN_CACHE_DIR_NAME = \"./cdn-cache\" as const;\n","import { Pool } from \"pg\";\nimport type { AuthStore, UserRecord } from \"./auth-store.js\";\n\n/** Build a real Postgres pool from a connection string. */\nexport function createPgPool(databaseUrl: string): Pool {\n return new Pool({ connectionString: databaseUrl });\n}\n\n/**\n * Postgres-backed AuthStore. Two small tables:\n * - registry_users(username PK, password_hash, created_at)\n * - registry_package_owners(package_name PK, owners text[], claimed_at)\n *\n * Ownership claim is race-free: `INSERT ... ON CONFLICT DO NOTHING` means the\n * first publisher wins atomically; the follow-up read returns the actual\n * owners so a losing racer is denied.\n *\n * Takes an already-built `pg.Pool` (tests inject a pg-mem pool cast to Pool).\n */\nexport function createPgStore(pool: Pool): AuthStore {\n let initialized: Promise<void> | null = null;\n\n return {\n init(): Promise<void> {\n initialized ??= (async () => {\n await pool.query(`\n CREATE TABLE IF NOT EXISTS registry_users (\n username text PRIMARY KEY,\n password_hash text NOT NULL,\n created_at timestamptz NOT NULL DEFAULT now()\n )`);\n await pool.query(`\n CREATE TABLE IF NOT EXISTS registry_package_owners (\n package_name text PRIMARY KEY,\n owners text[] NOT NULL,\n claimed_at timestamptz NOT NULL DEFAULT now()\n )`);\n })();\n return initialized;\n },\n\n async getUser(username: string): Promise<UserRecord | null> {\n const res = await pool.query<{ password_hash: string }>(\n \"SELECT password_hash FROM registry_users WHERE username = $1\",\n [username],\n );\n const row = res.rows[0] as { password_hash: string } | undefined;\n return row ? { passwordHash: row.password_hash } : null;\n },\n\n async createUser(username: string, passwordHash: string): Promise<boolean> {\n // Atomic: the PRIMARY KEY enforces uniqueness. A duplicate raises a\n // unique-violation (SQLSTATE 23505) — catch it as \"already registered\".\n try {\n await pool.query(\n \"INSERT INTO registry_users (username, password_hash) VALUES ($1, $2)\",\n [username, passwordHash],\n );\n return true;\n } catch (err) {\n if ((err as { code?: string }).code === \"23505\") return false;\n throw err;\n }\n },\n\n async getOwners(pkg: string): Promise<string[] | null> {\n const res = await pool.query<{ owners: string[] }>(\n \"SELECT owners FROM registry_package_owners WHERE package_name = $1\",\n [pkg],\n );\n return res.rows[0]?.owners ?? null;\n },\n\n async getOwnersFor(pkgs: string[]): Promise<Record<string, string[]>> {\n if (pkgs.length === 0) return {};\n // IN (...) with per-value placeholders — portable across pg and pg-mem,\n // unlike `= ANY($1)` array binding.\n const placeholders = pkgs.map((_, i) => `$${i + 1}`).join(\",\");\n const res = await pool.query<{ package_name: string; owners: string[] }>(\n `SELECT package_name, owners FROM registry_package_owners WHERE package_name IN (${placeholders})`,\n pkgs,\n );\n const out: Record<string, string[]> = {};\n for (const row of res.rows) out[row.package_name] = row.owners;\n return out;\n },\n\n async claimOwner(pkg: string, username: string): Promise<string[]> {\n // First publisher wins atomically; then read the actual owners.\n await pool.query(\n `INSERT INTO registry_package_owners (package_name, owners)\n VALUES ($1, ARRAY[$2]::text[])\n ON CONFLICT (package_name) DO NOTHING`,\n [pkg, username],\n );\n const res = await pool.query<{ owners: string[] }>(\n \"SELECT owners FROM registry_package_owners WHERE package_name = $1\",\n [pkg],\n );\n return res.rows[0]?.owners ?? [];\n },\n\n close(): Promise<void> {\n return pool.end();\n },\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { AuthStore } from \"./auth-store.js\";\n\n// Carry a live AuthStore to the plugin as a token (verdaccio merges the app\n// config's `store` block into plugin configs), tracking whether it loaded.\nconst REGISTRY_KEY = Symbol.for(\"@powerhousedao/registry:auth-store-handoff\");\n\ninterface Entry {\n store: AuthStore;\n loaded: boolean;\n}\n\nfunction registry(): Map<string, Entry> {\n const g = globalThis as { [REGISTRY_KEY]?: Map<string, Entry> };\n return (g[REGISTRY_KEY] ??= new Map<string, Entry>());\n}\n\n/** Stash a store instance and return a token to carry through plugin config. */\nexport function stashAuthStore(store: AuthStore): string {\n const token = randomUUID();\n registry().set(token, { store, loaded: false });\n return token;\n}\n\n/** Resolve a stashed store by token (undefined if unknown). */\nexport function takeAuthStore(token: string): AuthStore | undefined {\n return registry().get(token)?.store;\n}\n\n/** Record that the plugin fully constructed with this token's store. */\nexport function markStoreLoaded(token: string): void {\n const entry = registry().get(token);\n if (entry) entry.loaded = true;\n}\n\n/** True once the plugin has loaded the store for this token. */\nexport function wasStoreLoaded(token: string): boolean {\n return registry().get(token)?.loaded ?? false;\n}\n","/**\n * Compare two semver version strings for sorting.\n * Returns negative if a < b, positive if a > b, 0 if equal.\n *\n * Handles numeric component comparison (so \"1.0.10\" > \"1.0.9\")\n * and prerelease ordering (release > prerelease).\n */\nexport function compareSemver(a: string, b: string): number {\n const [coreA, preA] = a.split(\"-\", 2);\n const [coreB, preB] = b.split(\"-\", 2);\n\n const partsA = coreA.split(\".\").map(Number);\n const partsB = coreB.split(\".\").map(Number);\n\n for (let i = 0; i < Math.max(partsA.length, partsB.length); i++) {\n const na = partsA[i] ?? 0;\n const nb = partsB[i] ?? 0;\n if (na !== nb) return na - nb;\n }\n\n // Equal core versions — release (no prerelease) sorts after prerelease\n if (!preA && preB) return 1;\n if (preA && !preB) return -1;\n if (preA && preB) return preA < preB ? -1 : preA > preB ? 1 : 0;\n\n return 0;\n}\n","import crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport { extract } from \"tar\";\nimport { compareSemver } from \"./semver.js\";\n\n/**\n * Parse a package specifier into name and version/tag.\n * Supports:\n * \"@scope/pkg\" -> { name: \"@scope/pkg\", tag: undefined }\n * \"@scope/pkg@dev\" -> { name: \"@scope/pkg\", tag: \"dev\" }\n * \"@scope/pkg@1.0.0\" -> { name: \"@scope/pkg\", tag: \"1.0.0\" }\n * \"pkg@latest\" -> { name: \"pkg\", tag: \"latest\" }\n */\nexport function parsePackageSpec(spec: string): {\n name: string;\n tag: string | undefined;\n} {\n // For scoped packages (@scope/name@tag), split on the last @\n // For unscoped packages (name@tag), split on the first @\n if (spec.startsWith(\"@\")) {\n // Scoped: find the @ after the scope/name portion\n const lastAt = spec.lastIndexOf(\"@\");\n if (lastAt > 0 && lastAt !== spec.indexOf(\"@\")) {\n return { name: spec.slice(0, lastAt), tag: spec.slice(lastAt + 1) };\n }\n return { name: spec, tag: undefined };\n }\n const atIndex = spec.indexOf(\"@\");\n if (atIndex > 0) {\n return { name: spec.slice(0, atIndex), tag: spec.slice(atIndex + 1) };\n }\n return { name: spec, tag: undefined };\n}\n\n/** True when tag is a concrete semver, false for dist-tag names or undefined. */\nexport function isExactVersion(tag?: string): boolean {\n // Strict semver charset: the version flows into the ETag header, so\n // arbitrary characters after the prerelease/build separator must not match.\n return (\n !!tag &&\n /^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$/.test(tag)\n );\n}\n\nexport class CdnCache {\n #extractionLocks = new Map<string, Promise<void>>();\n\n constructor(\n private registryUrl: string,\n private cdnCachePath: string,\n ) {}\n\n async getFileByVersion(\n packageName: string,\n version: string,\n filePath: string,\n ): Promise<string | null> {\n const versionDir = path.join(this.cdnCachePath, packageName, version);\n\n // Check all possible paths before attempting extraction\n const resolved = this.#resolveFile(versionDir, filePath);\n if (resolved) return resolved;\n\n // File not found in any location — extract tarball and try again\n await this.#extractWithLock(packageName, version);\n\n return this.#resolveFile(versionDir, filePath);\n }\n\n #resolveFile(versionDir: string, filePath: string): string | null {\n // Check direct path first, then fall back to cdn/ and dist/cdn/ subdirectories\n // (npm tarballs contain files under dist/, bun bundles go to cdn/)\n const candidates = [\n path.join(versionDir, filePath),\n path.join(versionDir, \"cdn\", filePath),\n path.join(versionDir, \"dist\", \"cdn\", filePath),\n path.join(versionDir, \"dist\", filePath),\n ];\n\n for (const candidate of candidates) {\n if (this.isSafePath(candidate) && fs.existsSync(candidate))\n return candidate;\n }\n\n return null;\n }\n\n async #extractWithLock(packageName: string, version: string): Promise<void> {\n const key = `${packageName}@${version}`;\n const existing = this.#extractionLocks.get(key);\n if (existing) return existing;\n\n const promise = this.extractTarball(packageName, version).finally(() => {\n this.#extractionLocks.delete(key);\n });\n this.#extractionLocks.set(key, promise);\n return promise;\n }\n\n getLatestCachedVersion(packageName: string): string | null {\n const pkgDir = path.join(this.cdnCachePath, packageName);\n try {\n const entries = fs.readdirSync(pkgDir, { withFileTypes: true });\n const versions = entries\n .filter((e) => e.isDirectory())\n .map((e) => e.name);\n if (versions.length === 0) return null;\n versions.sort(compareSemver);\n return versions[versions.length - 1];\n } catch {\n return null;\n }\n }\n\n /**\n * Resolve a version for a package. If tag is a semver version that exists\n * in the registry, return it directly. If tag is a dist-tag name (e.g.\n * \"dev\", \"latest\"), resolve it to the concrete version. If no tag is\n * provided, prefer \"latest\", then fall back to any available dist-tag.\n * Returns null only for genuine not-found (404, or absent tag/version).\n * Throws on network errors and non-OK responses other than 404.\n */\n async resolveVersion(\n packageName: string,\n tag?: string,\n ): Promise<string | null> {\n const url = `${this.registryUrl}/${encodeURIComponent(packageName)}`;\n const res = await fetch(url, {\n headers: { Accept: \"application/json\" },\n });\n if (res.status === 404) return null;\n if (!res.ok) {\n throw new Error(\n `Upstream metadata for ${packageName} returned ${res.status}`,\n );\n }\n const metadata = (await res.json()) as Record<string, unknown>;\n const distTags = metadata[\"dist-tags\"] as\n | Record<string, string>\n | undefined;\n const versions = metadata[\"versions\"] as\n | Record<string, unknown>\n | undefined;\n\n if (tag) {\n // If the tag matches an exact version in the registry, use it directly\n if (versions && tag in versions) return tag;\n // Otherwise treat it as a dist-tag name\n if (distTags && tag in distTags) return distTags[tag];\n // Tag not found\n return null;\n }\n\n if (!distTags) return null;\n // No tag specified: prefer \"latest\", fall back to any available tag\n return distTags.latest ?? Object.values(distTags)[0] ?? null;\n }\n\n async extractTarball(packageName: string, version: string): Promise<void> {\n const destDir = path.join(this.cdnCachePath, packageName, version);\n\n // Idempotence guard. extractTarball is hot-path-called from\n // warmCdnCacheFromVerdaccio on every /packages request (which the\n // deployment's readiness probe hits every 5s). Without this skip the\n // tarball is re-fetched (multi-MB over S3) and re-extracted on each\n // call, pinning CPU at multi-vCPU per pod and triggering HPA spirals.\n // We treat the presence of package.json as the marker for \"already\n // extracted\" — it's the first file npm tarballs put under the version\n // directory and removing it (e.g. by invalidate*) requires the rest to\n // go too.\n if (fs.existsSync(path.join(destDir, \"package.json\"))) return;\n\n const shortName = packageName.startsWith(\"@\")\n ? packageName.split(\"/\")[1]\n : packageName;\n const tarballUrl = `${this.registryUrl}/${encodeURIComponent(packageName)}/-/${shortName}-${version}.tgz`;\n\n let res: Response;\n try {\n res = await fetch(tarballUrl);\n if (!res.ok || !res.body) return;\n } catch {\n return;\n }\n\n fs.mkdirSync(destDir, { recursive: true });\n\n const tmpFile = path.join(\n destDir,\n `.tmp-tarball-${crypto.randomUUID()}.tgz`,\n );\n try {\n const fileStream = fs.createWriteStream(tmpFile);\n await pipeline(Readable.fromWeb(res.body as never), fileStream);\n await extract({ file: tmpFile, cwd: destDir, strip: 1 });\n } finally {\n fs.rmSync(tmpFile, { force: true });\n }\n }\n\n invalidate(packageName: string): void {\n const cacheDir = path.join(this.cdnCachePath, packageName);\n if (!this.isSafePath(cacheDir)) return;\n fs.rmSync(cacheDir, { recursive: true, force: true });\n }\n\n invalidateVersion(packageName: string, version: string): void {\n const versionDir = path.join(this.cdnCachePath, packageName, version);\n if (!this.isSafePath(versionDir)) return;\n fs.rmSync(versionDir, { recursive: true, force: true });\n // If the package dir is now empty, remove it too so the scanner doesn't\n // keep returning a ghost entry with no versions.\n const pkgDir = path.join(this.cdnCachePath, packageName);\n try {\n if (fs.readdirSync(pkgDir).length === 0) {\n fs.rmdirSync(pkgDir);\n }\n } catch {\n // ignore — dir may not exist\n }\n }\n\n // Reconcile the cache against the registry's current version set; returns\n // removed versions. Empty/failed listings are a no-op (never mass-purge).\n async reconcileWithRegistry(packageName: string): Promise<string[]> {\n const url = `${this.registryUrl}/${encodeURIComponent(packageName)}`;\n let versions: string[];\n try {\n const res = await fetch(url, { headers: { Accept: \"application/json\" } });\n if (!res.ok) return [];\n const meta = (await res.json()) as { versions?: Record<string, unknown> };\n versions = Object.keys(meta.versions ?? {});\n } catch {\n return [];\n }\n if (versions.length === 0) return [];\n return this.reconcileVersions(packageName, versions);\n }\n\n // Drop cached version dirs absent from `keepVersions`; returns the removed\n // ones. Mirrors single-version unpublish (a manifest rewrite, no DELETE).\n reconcileVersions(\n packageName: string,\n keepVersions: Iterable<string>,\n ): string[] {\n const pkgDir = path.join(this.cdnCachePath, packageName);\n const keep = new Set(keepVersions);\n const removed: string[] = [];\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(pkgDir, { withFileTypes: true });\n } catch {\n return removed;\n }\n for (const entry of entries) {\n if (!entry.isDirectory() || keep.has(entry.name)) continue;\n this.invalidateVersion(packageName, entry.name);\n removed.push(entry.name);\n }\n return removed;\n }\n\n /** Remove all cached version directories except the specified one. */\n pruneOldVersions(packageName: string, keepVersion: string): void {\n const pkgDir = path.join(this.cdnCachePath, packageName);\n try {\n const entries = fs.readdirSync(pkgDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory() && entry.name !== keepVersion) {\n const dir = path.join(pkgDir, entry.name);\n if (this.isSafePath(dir)) {\n fs.rmSync(dir, { recursive: true, force: true });\n }\n }\n }\n } catch {\n // ignore — directory may not exist yet\n }\n }\n\n private isSafePath(filePath: string): boolean {\n const resolved = path.resolve(filePath);\n const cacheRoot = path.resolve(this.cdnCachePath);\n return resolved.startsWith(cacheRoot + path.sep) || resolved === cacheRoot;\n }\n}\n","import type { Manifest } from \"@powerhousedao/shared\";\nimport { slimManifest } from \"@powerhousedao/shared/registry\";\nimport type { PackageListItem } from \"@powerhousedao/shared/registry\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { compareSemver } from \"./semver.js\";\nimport type { PackageInfo } from \"./types.js\";\n\n/**\n * Read dist-tags, the full version list, and the local-publish flag for a\n * package from verdaccio's on-disk storage (`{storagePath}/{name}/package.json`).\n *\n * `locallyPublished` is tri-state:\n * - `true` → storage metadata has `_attachments` (tarball uploaded here).\n * - `false` → storage metadata exists but `_attachments` is empty (proxy\n * from the npm uplink only; no local publish at this registry).\n * - `undefined` → metadata file wasn't readable. Happens with non-filesystem\n * backends (S3, etc.) or if verdaccio stores metadata elsewhere.\n * Callers should treat this as \"unknown\" and default to including\n * the package, to avoid filtering the whole /packages list to an\n * empty array on deployments where we can't observe _attachments.\n */\nfunction readPackageMetadata(\n storagePath: string | undefined,\n packageName: string,\n): {\n distTags?: Record<string, string>;\n versions?: string[];\n locallyPublished: boolean | undefined;\n} {\n if (!storagePath) return { locallyPublished: undefined };\n try {\n const metadataPath = path.join(storagePath, packageName, \"package.json\");\n const raw = fs.readFileSync(metadataPath, \"utf-8\");\n const parsed = JSON.parse(raw) as {\n \"dist-tags\"?: Record<string, string>;\n versions?: Record<string, unknown>;\n _attachments?: Record<string, unknown>;\n };\n const distTags = parsed[\"dist-tags\"];\n const rawVersions = parsed.versions ? Object.keys(parsed.versions) : [];\n const versions = rawVersions.slice().sort(compareSemver);\n const locallyPublished =\n !!parsed._attachments && Object.keys(parsed._attachments).length > 0;\n return {\n distTags:\n distTags && Object.keys(distTags).length > 0 ? distTags : undefined,\n versions: versions.length > 0 ? versions : undefined,\n locallyPublished,\n };\n } catch {\n return { locallyPublished: undefined };\n }\n}\n\n/**\n * Locally-published check for a package, from verdaccio storage metadata.\n * Returns the same tri-state as `readPackageMetadata.locallyPublished`:\n * `true` (has `_attachments`), `false` (proxy-only), `undefined` (unreadable).\n */\nexport function isLocallyPublished(\n storagePath: string | undefined,\n packageName: string,\n): boolean | undefined {\n return readPackageMetadata(storagePath, packageName).locallyPublished;\n}\n\nfunction readManifest(dir: string): Manifest | null {\n const candidates = [\n path.join(dir, \"powerhouse.manifest.json\"),\n path.join(dir, \"cdn\", \"powerhouse.manifest.json\"),\n path.join(dir, \"dist\", \"powerhouse.manifest.json\"),\n ];\n for (const manifestPath of candidates) {\n try {\n const raw = fs.readFileSync(manifestPath, \"utf-8\");\n // Manifests are publisher-supplied JSON; slim to the known summary\n // fields so one oversized publish can't bloat every /packages\n // listing (a single 7.8 MB `features` blob once pushed the response\n // past clients' localStorage quota). The raw file stays available\n // through the CDN path.\n return slimManifest(JSON.parse(raw) as Manifest);\n } catch {\n // try next candidate\n }\n }\n return null;\n}\n\nfunction readPackageJsonVersion(dir: string): string | undefined {\n try {\n const raw = fs.readFileSync(path.join(dir, \"package.json\"), \"utf-8\");\n const pkg = JSON.parse(raw) as { version?: unknown };\n return typeof pkg.version === \"string\" ? pkg.version : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction getLatestVersionDir(pkgDir: string): string | null {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(pkgDir, { withFileTypes: true });\n } catch {\n return null;\n }\n const versions = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n if (versions.length === 0) return null;\n versions.sort(compareSemver);\n return path.join(pkgDir, versions[versions.length - 1]);\n}\n\nexport function loadPackage(\n cdnCachePath: string,\n name: string,\n version?: string,\n storagePath?: string,\n): PackageInfo | null {\n const pkgDir = path.join(cdnCachePath, name);\n const versionDir = version\n ? path.join(pkgDir, version)\n : getLatestVersionDir(pkgDir);\n const manifestDir = versionDir ?? pkgDir;\n const manifest = readManifest(manifestDir);\n\n if (!manifest) {\n return null;\n }\n const resolvedName = manifest.name || name;\n // Include dist-tags/versions so the paginated UI can lazy-load version\n // metadata for a single package (the list DTO omits them). Falls back to\n // undefined when storage metadata isn't available.\n const { distTags, versions } = readPackageMetadata(storagePath, resolvedName);\n return {\n name: resolvedName,\n path: `/-/cdn/${name}`,\n manifest,\n documentTypes: getDocumentTypesFromManifest(manifest),\n version: readPackageJsonVersion(manifestDir),\n distTags,\n versions,\n };\n}\n\n/**\n * Project a full {@link PackageInfo} down to the trimmed shape the paginated\n * package-listing UI renders per row. Version metadata and documentTypes are\n * intentionally dropped — the client fetches them on demand.\n */\nexport function toPackageListItem(pkg: PackageInfo): PackageListItem {\n const publisher = pkg.manifest?.publisher;\n return {\n name: pkg.name,\n path: pkg.path,\n version: pkg.version,\n description: pkg.manifest?.description ?? undefined,\n category: pkg.manifest?.category ?? undefined,\n publisher: publisher\n ? { name: publisher.name, url: publisher.url }\n : undefined,\n };\n}\n\nfunction getDocumentTypesFromManifest(manifest: Manifest | undefined | null) {\n if (!manifest) return [];\n\n const documentTypes: string[] = [];\n const { apps, documentModels, editors, subgraphs } = manifest;\n\n if (apps?.length) {\n documentTypes.push(\"powerhouse/document-drive\");\n }\n documentTypes.push(\n ...(documentModels ?? []).map((dm) => dm.id),\n ...(editors ?? [])\n .flatMap((e) => e.documentTypes)\n .filter((dt) => dt !== undefined),\n ...(subgraphs ?? [])\n .flatMap((e) => e.documentTypes)\n .filter((dt) => dt !== undefined),\n );\n\n return documentTypes;\n}\n\nexport function scanPackages(\n cdnCachePath: string,\n storagePath?: string,\n): PackageInfo[] {\n const absDir = path.resolve(cdnCachePath);\n const packages: PackageInfo[] = [];\n\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(absDir, { withFileTypes: true });\n } catch {\n return packages;\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n if (entry.name.startsWith(\"@\")) {\n const scopeDir = path.join(absDir, entry.name);\n let scopedEntries: fs.Dirent[];\n try {\n scopedEntries = fs.readdirSync(scopeDir, { withFileTypes: true });\n } catch (error) {\n console.log(error);\n continue;\n }\n for (const scopedEntry of scopedEntries) {\n if (!scopedEntry.isDirectory()) continue;\n const dirName = `${entry.name}/${scopedEntry.name}`;\n const pkgDir = path.join(scopeDir, scopedEntry.name);\n const versionDir = getLatestVersionDir(pkgDir);\n const manifestDir = versionDir ?? pkgDir;\n const manifest = readManifest(manifestDir);\n // `||` (not `??`): slimManifest normalizes a missing manifest name to\n // \"\" — fall back to the directory name in that case too.\n const name = manifest?.name || dirName;\n const { distTags, versions, locallyPublished } = readPackageMetadata(\n storagePath,\n name,\n );\n // Drop npm-uplink passthroughs from the default listing. Only\n // skip when we can affirmatively tell the package is a proxy\n // (no `_attachments` in filesystem-backed storage). When the flag\n // is `undefined` (no storagePath, or non-filesystem backend where\n // we can't read verdaccio's metadata) we include the entry — the\n // alternative would be filtering everything to `[]` on S3 deploys.\n if (locallyPublished === false) continue;\n packages.push({\n name,\n path: `/-/cdn/${dirName}`,\n manifest,\n documentTypes: getDocumentTypesFromManifest(manifest),\n version: readPackageJsonVersion(manifestDir),\n distTags,\n versions,\n });\n }\n } else {\n const pkgDir = path.join(absDir, entry.name);\n const versionDir = getLatestVersionDir(pkgDir);\n const manifestDir = versionDir ?? pkgDir;\n const manifest = readManifest(manifestDir);\n const name = manifest?.name || entry.name;\n const { distTags, versions, locallyPublished } = readPackageMetadata(\n storagePath,\n name,\n );\n if (locallyPublished === false) continue;\n packages.push({\n name,\n path: `/-/cdn/${entry.name}`,\n manifest,\n documentTypes: getDocumentTypesFromManifest(manifest),\n version: readPackageJsonVersion(manifestDir),\n distTags,\n versions,\n });\n }\n }\n\n return packages;\n}\n\nexport function findPackagesByDocumentType(\n packagesDir: string,\n documentType: string,\n): PackageInfo[] {\n const allPackages = scanPackages(packagesDir);\n\n return allPackages.filter((pkg) => {\n if (!pkg.manifest?.documentModels) {\n return false;\n }\n return pkg.manifest.documentModels.some((dm) => dm.id === documentType);\n });\n}\n","import type { CdnCache } from \"./cdn.js\";\nimport { isLocallyPublished } from \"./packages.js\";\nimport type { RegistryConfig } from \"./types.js\";\n\n// The verdaccio listing already yields local-only, latest-per-name entries;\n// we re-filter by `_attachments` and dedupe as a guard against backend changes.\nconst WARM_INTERVAL_MS = 30_000;\nconst WARM_CONCURRENCY = 8;\n\ninterface VerdaccioPackage {\n name: string;\n version?: string;\n}\n\n/**\n * Build a throttled warmer that extracts locally-published package tarballs\n * into the CDN cache. 30s minimum interval plus an in-flight guard prevent\n * redundant fan-out from readiness-probe traffic across pods.\n */\nexport function createWarmer(\n config: RegistryConfig,\n cdn: CdnCache,\n): () => Promise<void> {\n let warmInFlight = false;\n let lastWarmAt = 0;\n\n return async function warm(): Promise<void> {\n if (warmInFlight) return;\n if (Date.now() - lastWarmAt < WARM_INTERVAL_MS) return;\n warmInFlight = true;\n try {\n const r = await fetch(\n `http://localhost:${config.port}/-/verdaccio/data/packages`,\n );\n if (!r.ok) {\n console.error(\n `[registry] verdaccio package listing returned ${r.status}`,\n );\n return;\n }\n const listed = (await r.json()) as VerdaccioPackage[];\n\n // Latest version per name (the listing yields one entry per package;\n // dedupe defensively), scoped to locally-published packages only.\n const latestByName = new Map<string, string>();\n for (const pkg of listed) {\n if (!pkg.version) continue;\n if (isLocallyPublished(config.storagePath, pkg.name) === false)\n continue;\n latestByName.set(pkg.name, pkg.version);\n }\n\n const targets = [...latestByName.entries()];\n let cursor = 0;\n const workers = Array.from({ length: WARM_CONCURRENCY }).map(async () => {\n while (cursor < targets.length) {\n const [name, version] = targets[cursor++];\n try {\n await cdn.extractTarball(name, version);\n } catch (err) {\n console.error(\n `[registry] failed to warm cache for ${name}@${version}:`,\n err,\n );\n }\n }\n });\n await Promise.all(workers);\n console.log(`[registry] /packages warm-up done (${targets.length} pkgs)`);\n // Throttle only after a successful cycle so failures (e.g. registry\n // not listening yet during startup) retry on the next call.\n lastWarmAt = Date.now();\n } catch (err) {\n console.error(\"[registry] /packages warm-up failed:\", err);\n } finally {\n warmInFlight = false;\n }\n };\n}\n","import express, {\n Router,\n type NextFunction,\n type Request,\n type Response,\n} from \"express\";\nimport crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { pipeline } from \"node:stream/promises\";\nimport type { AuthStore } from \"./auth/auth-store.js\";\nimport { CdnCache, isExactVersion, parsePackageSpec } from \"./cdn.js\";\nimport type { PackageInfo } from \"./types.js\";\nimport type { SSEChannel } from \"./notifications/sse.js\";\nimport type { NotificationChannel } from \"./notifications/types.js\";\nimport type { WebhookChannel } from \"./notifications/webhook.js\";\nimport {\n findPackagesByDocumentType,\n loadPackage,\n scanPackages,\n toPackageListItem,\n} from \"./packages.js\";\nimport type { RegistryConfig } from \"./types.js\";\nimport { createWarmer } from \"./warmup.js\";\n\n// Paginated /packages mode: default and max page sizes.\nconst DEFAULT_PAGE_SIZE = 30;\nconst MAX_PAGE_SIZE = 50;\n\n/** Parse+clamp a `limit` query param to 1..MAX_PAGE_SIZE (default 30). */\nfunction clampPageSize(raw: unknown): number {\n const n = Number.parseInt(String(raw), 10);\n if (!Number.isFinite(n) || n <= 0) return DEFAULT_PAGE_SIZE;\n return Math.min(n, MAX_PAGE_SIZE);\n}\n\n/** Parse a non-negative `offset` query param (default 0). */\nfunction parseOffset(raw: unknown): number {\n const n = Number.parseInt(String(raw), 10);\n if (!Number.isFinite(n) || n < 0) return 0;\n return n;\n}\n\nconst MIME_TYPES: Record<string, string> = {\n \".js\": \"application/javascript\",\n \".mjs\": \"application/javascript\",\n \".css\": \"text/css\",\n \".json\": \"application/json\",\n \".wasm\": \"application/wasm\",\n \".map\": \"application/json\",\n \".html\": \"text/html\",\n \".svg\": \"image/svg+xml\",\n};\n\nfunction getContentType(filePath: string): string {\n const ext = path.extname(filePath).toLowerCase();\n return MIME_TYPES[ext] ?? \"application/octet-stream\";\n}\n\n// Publisher identity from verdaccio's remote_user (the renown middleware sets\n// its name to the owner pkh DID). undefined when anonymous.\nfunction publisherFromRequest(\n req: Request,\n): { address: string; did?: string } | undefined {\n const name = (req as { remote_user?: { name?: string } }).remote_user?.name;\n if (!name) return undefined;\n if (name.startsWith(\"did:pkh:\")) {\n const address = (name.split(\":\").pop() ?? name).toLowerCase();\n return { address, did: name };\n }\n return { address: name };\n}\n\ntype VersionResolution =\n | { kind: \"ok\"; version: string }\n | { kind: \"not-found\" }\n | { kind: \"upstream-error\" };\n\n/**\n * Resolve a package version. Exact versions skip the network call. Upstream\n * errors fall back to the latest cached version; genuine not-found falls back\n * too, then reports not-found.\n */\nasync function resolvePackageVersion(\n cdn: CdnCache,\n packageName: string,\n tag: string | undefined,\n): Promise<VersionResolution> {\n if (tag && isExactVersion(tag)) return { kind: \"ok\", version: tag };\n\n try {\n const resolved =\n (await cdn.resolveVersion(packageName, tag)) ??\n cdn.getLatestCachedVersion(packageName);\n if (!resolved) return { kind: \"not-found\" };\n return { kind: \"ok\", version: resolved };\n } catch {\n const cached = cdn.getLatestCachedVersion(packageName);\n if (!cached) return { kind: \"upstream-error\" };\n return { kind: \"ok\", version: cached };\n }\n}\n\n/** Strip the weak-validator prefix: weak comparison is correct for GET/HEAD. */\nfunction opaqueTag(tag: string): string {\n return tag.startsWith(\"W/\") ? tag.slice(2) : tag;\n}\n\n/** RFC 9110 If-None-Match: a comma-separated list of entity-tags or \"*\". */\nfunction etagMatches(\n header: string | string[] | undefined,\n etag: string,\n): boolean {\n if (!header) return false;\n const target = opaqueTag(etag);\n const value = Array.isArray(header) ? header.join(\",\") : header;\n return value.split(\",\").some((candidate) => {\n const tag = candidate.trim();\n return tag === \"*\" || opaqueTag(tag) === target;\n });\n}\n\nexport function createPowerhouseRouter(\n config: RegistryConfig,\n sse: SSEChannel,\n webhooks: WebhookChannel,\n ownerStore?: AuthStore,\n): Router {\n const cdn = new CdnCache(\n `http://localhost:${config.port}`,\n config.cdnCachePath,\n );\n const router = Router();\n\n // Attach package owners from the auth store. Best-effort: a missing store or\n // DB error degrades to no `owners` (the /packages route feeds readiness).\n const withOwners = async (pkgs: PackageInfo[]): Promise<PackageInfo[]> => {\n if (!ownerStore || pkgs.length === 0) return pkgs;\n try {\n await ownerStore.init();\n const map = await ownerStore.getOwnersFor(pkgs.map((p) => p.name));\n return pkgs.map((p) =>\n p.name in map ? { ...p, owners: map[p.name] } : p,\n );\n } catch (err) {\n console.error(\"[registry] owner lookup failed:\", err);\n return pkgs;\n }\n };\n\n // CORS on every response\n router.use((_req: Request, res: Response, next: NextFunction) => {\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n next();\n });\n\n // SSE endpoint for publish notifications\n router.get(\"/-/events\", (_req: Request, res: Response) => {\n sse.addClient(res);\n });\n\n // Webhook management\n router.get(\"/-/webhooks\", (_req: Request, res: Response) => {\n res.json(webhooks.getWebhooks());\n });\n\n router.post(\"/-/webhooks\", express.json(), (req: Request, res: Response) => {\n const { endpoint, headers } = req.body as {\n endpoint?: string;\n headers?: Record<string, string>;\n };\n if (!endpoint) {\n res.status(400).json({ error: \"Missing required field: endpoint\" });\n return;\n }\n webhooks.addWebhook({ endpoint, headers });\n res.status(201).json({ endpoint, headers });\n });\n\n router.delete(\n \"/-/webhooks\",\n express.json(),\n (req: Request, res: Response) => {\n const { endpoint } = req.body as { endpoint?: string };\n if (!endpoint) {\n res.status(400).json({ error: \"Missing required field: endpoint\" });\n return;\n }\n const removed = webhooks.removeWebhook(endpoint);\n if (!removed) {\n res.status(404).json({ error: \"Webhook not found\" });\n return;\n }\n res.status(204).end();\n },\n );\n\n const warm = createWarmer(config, cdn);\n\n // Kick off an initial warm so /packages is useful soon after pod start\n // even if no clients hit it. Fire-and-forget — must not block the listener.\n void warm();\n\n // Package listing API.\n // Returns whatever's currently in the local cdn-cache (instant response —\n // important: this endpoint is wired to the deployment's readiness probe,\n // so it must not synchronously fetch or extract). Each call also nudges\n // a background warm-up so newly-published packages appear in the listing\n // without operator intervention.\n router.get(\"/packages\", async (req: Request, res: Response) => {\n void warm();\n const packages = scanPackages(config.cdnCachePath, config.storagePath);\n\n // Legacy mode 1 (unchanged): filter by document type, return the full\n // PackageInfo array. Used by MissingPackageModal / package discovery.\n const documentType = req.query.documentType as string | undefined;\n if (documentType) {\n const filtered = packages.filter((pkg) =>\n pkg.manifest?.documentModels?.some((m) => m.id === documentType),\n );\n res.json(await withOwners(filtered));\n return;\n }\n\n // Legacy mode 2 (unchanged): no `limit` → full PackageInfo array in\n // directory order. Keeps every existing consumer working.\n if (req.query.limit === undefined) {\n res.json(await withOwners(packages));\n return;\n }\n\n // Paginated mode: `?limit=&offset=&search=` → trimmed-item envelope.\n // Sort by name so offset paging is stable (scanPackages is dir order).\n const limit = clampPageSize(req.query.limit);\n const offset = parseOffset(req.query.offset);\n const search =\n typeof req.query.search === \"string\"\n ? req.query.search.trim().toLowerCase()\n : \"\";\n\n // Match on package name only (not description).\n const filtered = search\n ? packages.filter((pkg) => pkg.name.toLowerCase().includes(search))\n : packages;\n const sorted = filtered\n .slice()\n .sort((a, b) => a.name.localeCompare(b.name));\n\n const total = sorted.length;\n const items = sorted.slice(offset, offset + limit).map(toPackageListItem);\n res.json({\n items,\n total,\n limit,\n offset,\n hasMore: offset + limit < total,\n });\n });\n\n // Find packages by document type - returns array of package names\n router.get(\"/packages/by-document-type\", (req: Request, res: Response) => {\n const documentType = req.query.type;\n\n if (typeof documentType !== \"string\" || !documentType) {\n res.status(400).json({ error: \"Missing required query parameter: type\" });\n return;\n }\n\n const packages = findPackagesByDocumentType(\n config.cdnCachePath,\n documentType,\n );\n const packageNames = packages.map((pkg) => pkg.name);\n res.json(packageNames);\n });\n\n // Single package info\n router.get(\"/packages/*\", async (req: Request, res: Response) => {\n const raw = (req.params as Record<string, string>)[0];\n const { name, tag } = parsePackageSpec(raw);\n const resolution = await resolvePackageVersion(cdn, name, tag);\n if (resolution.kind === \"upstream-error\") {\n res.status(503).send(\"Upstream registry unavailable\");\n return;\n }\n const version = resolution.kind === \"ok\" ? resolution.version : undefined;\n const pkg = loadPackage(\n config.cdnCachePath,\n name,\n version,\n config.storagePath,\n );\n if (!pkg) {\n res.status(404).send(\"Package not found\");\n return;\n }\n res.json((await withOwners([pkg]))[0]);\n });\n\n // CDN file serving\n router.get(\"/-/cdn/*\", async (req: Request, res: Response) => {\n const fullPath = (req.params as Record<string, string>)[0];\n\n // Parse scoped or unscoped package specifier from the path\n let packageSpec: string;\n let filePath: string;\n\n if (fullPath.startsWith(\"@\")) {\n // Scoped: @scope/pkg@1.0.0/file.js -> packageSpec = @scope/pkg@1.0.0, filePath = file.js\n const segments = fullPath.split(\"/\");\n if (segments.length < 2) {\n res.status(400).send(\"Invalid package path\");\n return;\n }\n packageSpec = `${segments[0]}/${segments[1]}`;\n filePath = segments.slice(2).join(\"/\") || \"index.js\";\n } else {\n // Unscoped: pkg@1.0.0/file.js -> packageSpec = pkg@1.0.0, filePath = file.js\n const segments = fullPath.split(\"/\");\n packageSpec = segments[0];\n filePath = segments.slice(1).join(\"/\") || \"index.js\";\n }\n\n const { name: packageName, tag } = parsePackageSpec(packageSpec);\n const pinned = isExactVersion(tag);\n const resolution = await resolvePackageVersion(cdn, packageName, tag);\n if (resolution.kind === \"upstream-error\") {\n res.status(503).send(\"Upstream registry unavailable\");\n return;\n }\n if (resolution.kind === \"not-found\") {\n res.status(404).send(\"File not found\");\n return;\n }\n const version = resolution.version;\n\n const resolved = await cdn.getFileByVersion(packageName, version, filePath);\n if (!resolved) {\n // Pinned requests skip the metadata lookup above, so a miss here may be\n // an upstream failure rather than a genuine 404 — probe to distinguish,\n // otherwise the CDN would cache a 404 while upstream is merely down.\n if (pinned) {\n try {\n await cdn.resolveVersion(packageName, tag);\n } catch {\n res.status(503).send(\"Upstream registry unavailable\");\n return;\n }\n }\n res.status(404).send(\"File not found\");\n return;\n }\n\n // Cache based on the request shape: pinned requests are immutable, moving\n // ones (dist-tag / untagged) must revalidate frequently.\n res.setHeader(\n \"Cache-Control\",\n pinned\n ? \"public, max-age=31536000, immutable\"\n : \"public, max-age=60, must-revalidate\",\n );\n\n // Hash the file path: it comes from the URL and may contain characters\n // that are invalid in header values.\n const fileHash = crypto\n .createHash(\"sha1\")\n .update(filePath)\n .digest(\"hex\")\n .slice(0, 16);\n const etag = `W/\"${version}-${fileHash}\"`;\n res.setHeader(\"ETag\", etag);\n if (etagMatches(req.headers[\"if-none-match\"], etag)) {\n res.status(304).end();\n return;\n }\n\n res.setHeader(\"Content-Type\", getContentType(filePath));\n try {\n await pipeline(fs.createReadStream(resolved), res);\n } catch {\n // Stream failure (I/O error, client abort) after headers may already\n // be sent — destroy the socket so the request doesn't hang.\n res.destroy();\n }\n });\n\n return router;\n}\n\n/**\n * Parse verdaccio's unpublish URL shape:\n * DELETE /<pkg>/-rev/<rev> → full package\n * DELETE /<pkg>/-/<tarball-name>/-rev/<rev> → single version\n * where <pkg> may be scoped (@scope%2Fname, encoded) or unscoped, and the\n * tarball name is `<short-name>-<version>.tgz`.\n */\nexport function parseUnpublishRequest(\n reqPath: string,\n): { packageName: string; version: string | null } | null {\n const revIdx = reqPath.indexOf(\"/-rev/\");\n if (revIdx <= 0) return null;\n const beforeRev = reqPath.slice(1, revIdx); // strip leading slash\n\n const tarballMarker = \"/-/\";\n const tarballIdx = beforeRev.indexOf(tarballMarker);\n if (tarballIdx === -1) {\n // Full package: beforeRev is the package name (possibly URL-encoded scope)\n const packageName = decodeURIComponent(beforeRev);\n return { packageName, version: null };\n }\n\n const packageName = decodeURIComponent(beforeRev.slice(0, tarballIdx));\n const tarballName = beforeRev.slice(tarballIdx + tarballMarker.length);\n if (!tarballName.endsWith(\".tgz\")) return null;\n const shortName = packageName.startsWith(\"@\")\n ? packageName.split(\"/\")[1]\n : packageName;\n const prefix = `${shortName}-`;\n if (!tarballName.startsWith(prefix)) return null;\n const version = tarballName.slice(prefix.length, -\".tgz\".length);\n if (!version) return null;\n return { packageName, version };\n}\n\n// PUT /<pkg>/-rev/<rev> is npm's manifest rewrite (single-version unpublish,\n// deprecate). Exclude the tarball-DELETE shape, which also carries /-rev/.\nexport function parseManifestRewrite(\n reqPath: string,\n): { packageName: string } | null {\n const revIdx = reqPath.indexOf(\"/-rev/\");\n if (revIdx <= 0) return null;\n const beforeRev = reqPath.slice(1, revIdx);\n if (beforeRev.includes(\"/-/\")) return null;\n return { packageName: decodeURIComponent(beforeRev) };\n}\n\nexport function createUnpublishHook(\n config: RegistryConfig,\n notifications: NotificationChannel,\n) {\n const cdn = new CdnCache(\n `http://localhost:${config.port}`,\n config.cdnCachePath,\n );\n\n // Reconcile the CDN cache after verdaccio rewrites a manifest to drop a\n // version. Re-fetch survivors — req.body isn't reliable on this route.\n const handleManifestRewrite = (req: Request, res: Response) => {\n const rewrite = parseManifestRewrite(req.path);\n if (!rewrite) return;\n\n const originalEnd = res.end.bind(res);\n res.end = function (\n this: Response,\n chunk?: unknown,\n encoding?: unknown,\n cb?: () => void,\n ) {\n if (res.statusCode >= 200 && res.statusCode < 300) {\n const publishedBy = publisherFromRequest(req);\n cdn\n .reconcileWithRegistry(rewrite.packageName)\n .then((removed) => {\n for (const version of removed) {\n notifications.notifyUnpublish({\n packageName: rewrite.packageName,\n version,\n publishedBy,\n });\n }\n })\n .catch((err) => {\n console.error(\n `[registry] CDN reconcile failed for ${rewrite.packageName}:`,\n err,\n );\n });\n }\n return originalEnd(chunk, encoding as BufferEncoding, cb);\n };\n };\n\n return (req: Request, res: Response, next: NextFunction) => {\n if (req.method === \"PUT\") {\n handleManifestRewrite(req, res);\n next();\n return;\n }\n if (req.method !== \"DELETE\") {\n next();\n return;\n }\n\n const parsed = parseUnpublishRequest(req.path);\n if (!parsed) {\n next();\n return;\n }\n\n const originalEnd = res.end.bind(res);\n res.end = function (\n this: Response,\n chunk?: unknown,\n encoding?: unknown,\n cb?: () => void,\n ) {\n if (res.statusCode >= 200 && res.statusCode < 300) {\n try {\n if (parsed.version) {\n cdn.invalidateVersion(parsed.packageName, parsed.version);\n } else {\n cdn.invalidate(parsed.packageName);\n }\n notifications.notifyUnpublish({\n packageName: parsed.packageName,\n version: parsed.version,\n publishedBy: publisherFromRequest(req),\n });\n } catch (err) {\n console.error(\n `[registry] CDN purge failed for ${parsed.packageName}${parsed.version ? `@${parsed.version}` : \"\"}:`,\n err,\n );\n }\n }\n return originalEnd(chunk, encoding as BufferEncoding, cb);\n };\n\n next();\n };\n}\n\nexport function createPublishHook(\n config: RegistryConfig,\n notifications: NotificationChannel,\n) {\n const cdn = new CdnCache(\n `http://localhost:${config.port}`,\n config.cdnCachePath,\n );\n\n return (req: Request, res: Response, next: NextFunction) => {\n // Only intercept PUT requests to npm publish endpoints.\n // Skip PUTs to `/<pkg>/-rev/<rev>` — those are npm's manifest-rewrite\n // step during single-version unpublish, not a new publish.\n if (req.method !== \"PUT\" || req.path.includes(\"/-rev/\")) {\n next();\n return;\n }\n\n const originalEnd = res.end.bind(res);\n res.end = function (\n this: Response,\n chunk?: unknown,\n encoding?: unknown,\n cb?: () => void,\n ) {\n const urlPath = req.path.replace(/^\\//, \"\");\n if (\n res.statusCode < 200 ||\n res.statusCode >= 300 ||\n !urlPath ||\n urlPath.startsWith(\"-\")\n ) {\n return originalEnd(chunk, encoding as BufferEncoding, cb);\n }\n const packageName = decodeURIComponent(urlPath);\n const versionsObj = (req.body as { versions: Record<string, unknown> })\n .versions;\n const versions = Object.keys(versionsObj);\n const version = versions.at(0);\n if (!version) {\n console.error(`[registry] No version found for ${packageName}`);\n return originalEnd(chunk, encoding as BufferEncoding, cb);\n }\n if (versions.length > 1) {\n console.warn(\n `[registry] Multiple versions published for ${packageName}: ${JSON.stringify(versions)}`,\n );\n }\n\n const publishedBy = publisherFromRequest(req);\n cdn\n .extractTarball(packageName, version)\n .then(() => {\n notifications.notifyPublish({ packageName, version, publishedBy });\n })\n .catch((err) => {\n console.error(\n `[registry] Failed to extract ${packageName} to CDN cache:`,\n err,\n );\n });\n\n return originalEnd(chunk, encoding as BufferEncoding, cb);\n };\n\n next();\n };\n}\n","import type {\n NotificationChannel,\n PublishEvent,\n UnpublishEvent,\n} from \"./types.js\";\n\nexport class NotificationManager implements NotificationChannel {\n #channels: NotificationChannel[];\n\n constructor(channels: NotificationChannel[]) {\n this.#channels = channels;\n }\n\n notifyPublish(event: PublishEvent): void {\n for (const channel of this.#channels) {\n channel.notifyPublish(event);\n }\n }\n\n notifyUnpublish(event: UnpublishEvent): void {\n for (const channel of this.#channels) {\n channel.notifyUnpublish(event);\n }\n }\n}\n","import type { Response } from \"express\";\nimport type {\n NotificationChannel,\n PublishEvent,\n UnpublishEvent,\n} from \"./types.js\";\n\nexport class SSEChannel implements NotificationChannel {\n #clients = new Set<Response>();\n\n addClient(res: Response): void {\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"Access-Control-Allow-Origin\": \"*\",\n });\n res.write(\"event: connected\\ndata: {}\\n\\n\");\n\n this.#clients.add(res);\n res.on(\"close\", () => {\n this.#clients.delete(res);\n });\n }\n\n notifyPublish(event: PublishEvent): void {\n this.#broadcast(\"publish\", event);\n }\n\n notifyUnpublish(event: UnpublishEvent): void {\n this.#broadcast(\"unpublish\", event);\n }\n\n #broadcast(eventName: string, event: PublishEvent | UnpublishEvent): void {\n const payload = `event: ${eventName}\\ndata: ${JSON.stringify(event)}\\n\\n`;\n for (const client of this.#clients) {\n try {\n client.write(payload);\n } catch (err) {\n console.error(\"[registry] SSE client write failed:\", err);\n this.#clients.delete(client);\n }\n }\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { NotifyConfig, WebhookConfig } from \"../types.js\";\nimport type {\n NotificationChannel,\n PublishEvent,\n UnpublishEvent,\n} from \"./types.js\";\n\nconst WEBHOOKS_FILE = \"webhooks.json\";\n\nexport class WebhookChannel implements NotificationChannel {\n #predefined: WebhookConfig[];\n #dynamic: WebhookConfig[];\n #storagePath: string;\n\n constructor(storagePath: string, config?: NotifyConfig) {\n this.#storagePath = storagePath;\n this.#predefined = config?.webhooks ?? [];\n this.#dynamic = this.#load();\n }\n\n getWebhooks(): WebhookConfig[] {\n return [...this.#predefined, ...this.#dynamic];\n }\n\n addWebhook(webhook: WebhookConfig): void {\n const exists = this.getWebhooks().some(\n (w) => w.endpoint === webhook.endpoint,\n );\n if (exists) return;\n this.#dynamic.push(webhook);\n this.#save();\n }\n\n removeWebhook(endpoint: string): boolean {\n const before = this.#dynamic.length;\n this.#dynamic = this.#dynamic.filter((w) => w.endpoint !== endpoint);\n if (this.#dynamic.length === before) return false;\n this.#save();\n return true;\n }\n\n notifyPublish(event: PublishEvent): void {\n this.#post({ type: \"publish\", ...event });\n }\n\n notifyUnpublish(event: UnpublishEvent): void {\n this.#post({ type: \"unpublish\", ...event });\n }\n\n #post(body: Record<string, unknown>): void {\n for (const webhook of this.getWebhooks()) {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...webhook.headers,\n };\n\n fetch(webhook.endpoint, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n }).catch((err: unknown) => {\n console.error(`[registry] Webhook to ${webhook.endpoint} failed:`, err);\n });\n }\n }\n\n #filePath(): string {\n return path.join(this.#storagePath, WEBHOOKS_FILE);\n }\n\n #load(): WebhookConfig[] {\n try {\n const raw = fs.readFileSync(this.#filePath(), \"utf-8\");\n return JSON.parse(raw) as WebhookConfig[];\n } catch {\n return [];\n }\n }\n\n #save(): void {\n fs.mkdirSync(this.#storagePath, { recursive: true });\n fs.writeFileSync(this.#filePath(), JSON.stringify(this.#dynamic, null, 2));\n }\n}\n","import path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { AuthStore } from \"./auth/auth-store.js\";\nimport { stashAuthStore } from \"./auth/store-handoff.js\";\nimport type { RegistryConfig } from \"./types.js\";\n\nexport function buildVerdaccioConfig(config: RegistryConfig) {\n const htpasswdPath = path.join(config.storagePath, \"htpasswd\");\n\n const uplinkUrl = config.uplink ?? \"https://registry.npmjs.org/\";\n\n // With a database configured, use the Postgres-backed auth plugin\n // (persistent accounts + npm-style package ownership). Verdaccio loads it\n // via require() from the dist/plugins dir. Without a DB (local dev / tests),\n // keep the built-in htpasswd path.\n const usePgAuth = Boolean(config.databaseUrl || config.authStore);\n // Prefer a runtime-provided token (so the launcher owns it for load\n // detection); otherwise stash the injected store here (direct callers/tests).\n const storeToken =\n config.authStoreToken ??\n (config.authStore\n ? stashAuthStore(config.authStore as AuthStore)\n : undefined);\n const pluginsDir =\n config.pluginsDir ??\n path.join(path.dirname(fileURLToPath(import.meta.url)), \"plugins\");\n const auth = usePgAuth\n ? {\n \"registry-auth\": {\n ...(config.databaseUrl ? { databaseUrl: config.databaseUrl } : {}),\n ...(storeToken ? { storeToken } : {}),\n ...(config.renown\n ? {\n publicUrl: config.renown.publicUrl,\n ...(config.renown.renownUrl\n ? { renownUrl: config.renown.renownUrl }\n : {}),\n }\n : {}),\n },\n }\n : { htpasswd: { file: htpasswdPath } };\n\n const base: Record<string, unknown> = {\n storage: config.storagePath,\n self_path: \"./\",\n // Top-level secret used by verdaccio to sign / verify its API JWTs.\n // The renown middleware mints a verdaccio-format JWT with the same\n // secret so verdaccio's apiJWTmiddleware accepts the swapped token.\n ...(config.verdaccioSecret ? { secret: config.verdaccioSecret } : {}),\n // Force JWT mode for the npm API. Without this verdaccio falls back to\n // its legacy aes-encrypted token format, which signPayload won't produce.\n security: {\n api: {\n jwt: {\n sign: { expiresIn: \"90d\" },\n verify: {},\n },\n },\n },\n auth,\n ...(usePgAuth ? { plugins: pluginsDir } : {}),\n uplinks: {\n npmjs: {\n url: uplinkUrl,\n // Defaults to verdaccio's own default of 2m. The previous 15m\n // hardcoded value made publish-to-install dev loops painful —\n // when a newly-published version landed on npmjs, our registry\n // kept handing out the pre-publish packument for up to 15min.\n // Operators that want heavier upstream caching for production\n // can opt in via --uplink-maxage / PH_REGISTRY_UPLINK_MAXAGE.\n maxage: config.uplinkMaxage ?? \"2m\",\n timeout: \"30s\",\n cache: true,\n },\n },\n // Verdaccio matches packages config top-to-bottom (first match wins),\n // so local-only globs must come first. We also skip emitting the\n // default proxied entries when a glob with the same key is in the\n // local-only list — otherwise the value would be overwritten but the\n // iteration position would still be the default's earlier slot.\n packages: (() => {\n const local = config.localPackagePatterns ?? [];\n const localSet = new Set(local);\n const access = {\n access: \"$all\",\n publish: \"$authenticated\",\n unpublish: \"$authenticated\",\n };\n const entries: [string, Record<string, unknown>][] = [];\n // Locals first — no proxy means verdaccio resolves them from local\n // storage only, so re-publishing a version that exists on npmjs\n // doesn't 409.\n for (const pattern of local) {\n entries.push([pattern, { ...access }]);\n }\n // Defaults follow, skipping any glob the caller already overrode.\n if (!localSet.has(\"@powerhousedao/*\")) {\n entries.push([\"@powerhousedao/*\", { ...access, proxy: \"npmjs\" }]);\n }\n if (!localSet.has(\"**\")) {\n entries.push([\"**\", { ...access, proxy: \"npmjs\" }]);\n }\n return Object.fromEntries(entries);\n })(),\n web: {\n enable: config.webEnabled !== false,\n title: \"Powerhouse Registry\",\n logo: \"https://raw.githubusercontent.com/powerhouse-inc/powerhouse/main/packages/registry/static/logo.svg\",\n favicon: \"/-/static/favicon.ico\",\n primary_color: \"#38C780\",\n darkMode: true,\n },\n server: {\n keepAliveTimeout: 60,\n },\n log: {\n type: \"stdout\",\n format: \"pretty\",\n level: \"warn\",\n },\n max_body_size: config.maxBodySize ?? \"300mb\",\n };\n\n if (config.s3) {\n base.store = {\n \"aws-s3-storage\": {\n bucket: config.s3.bucket,\n endpoint: config.s3.endpoint,\n region: config.s3.region,\n s3ForcePathStyle: config.s3.s3ForcePathStyle ?? true,\n ...(config.s3.keyPrefix && { keyPrefix: config.s3.keyPrefix }),\n ...(config.s3.accessKeyId && { accessKeyId: config.s3.accessKeyId }),\n ...(config.s3.secretAccessKey && {\n secretAccessKey: config.s3.secretAccessKey,\n }),\n },\n };\n }\n\n return base;\n}\n","import express from \"express\";\nimport { findUp } from \"find-up\";\nimport { randomBytes } from \"node:crypto\";\nimport { mkdir } from \"node:fs/promises\";\nimport type { Server } from \"node:http\";\nimport path from \"node:path\";\nimport { runServer } from \"verdaccio\";\nimport type { AuthStore } from \"./auth/auth-store.js\";\nimport { createPgPool, createPgStore } from \"./auth/pg-store.js\";\nimport { stashAuthStore, wasStoreLoaded } from \"./auth/store-handoff.js\";\nimport {\n createPowerhouseRouter,\n createPublishHook,\n createUnpublishHook,\n} from \"./middleware.js\";\nimport { NotificationManager } from \"./notifications/manager.js\";\nimport { SSEChannel } from \"./notifications/sse.js\";\nimport { WebhookChannel } from \"./notifications/webhook.js\";\nimport type { RegistryCommandArgs, RegistryConfig } from \"./types.js\";\nimport { buildVerdaccioConfig } from \"./verdaccio-config.js\";\n\nasync function resolveDir(dir: string): Promise<string> {\n if (path.isAbsolute(dir)) {\n await mkdir(dir, { recursive: true });\n return dir;\n }\n const found = await findUp(dir, { type: \"directory\" });\n if (!found) {\n await mkdir(dir, { recursive: true });\n return dir;\n }\n return found;\n}\n\nexport async function runRegistry(args: RegistryCommandArgs) {\n const {\n port,\n storageDir,\n cdnCacheDir,\n uplink,\n uplinkMaxage,\n webEnabled,\n webhooks,\n s3AccessKeyId,\n s3Bucket,\n s3Endpoint,\n s3ForcePathStyle,\n s3KeyPrefix,\n s3Region,\n s3SecretAccessKey,\n publicUrl,\n authRenown,\n renownUrl,\n verdaccioSecret: verdaccioSecretArg,\n localPackages,\n databaseUrl,\n pluginsDir,\n authStore,\n } = args;\n const storagePath = await resolveDir(storageDir);\n const cdnCachePath = await resolveDir(cdnCacheDir);\n\n // Per-pod random verdaccio JWT secret. The verdaccio-format token we mint\n // in the renown middleware never leaves the pod (it's swapped into the\n // request before verdaccio sees it), so a per-pod secret is sufficient.\n // An override is exposed for tests / multi-pod behaviors that depend on\n // shared verdaccio JWTs.\n const verdaccioSecret = verdaccioSecretArg ?? randomBytes(32).toString(\"hex\");\n\n // Renown auth turns on when the operator both opts in (`--auth-renown`,\n // default true via the CLI flag) and has set --public-url for the audience\n // claim. Tests / programmatic users that don't pass either keep the legacy\n // unsigned/htpasswd path with no warning.\n const renownEnabled = authRenown === true && Boolean(publicUrl);\n if (authRenown === true && !publicUrl) {\n console.warn(\n \"[registry] auth-renown is enabled but --public-url / PH_REGISTRY_PUBLIC_URL is not set; Renown auth will be disabled.\",\n );\n }\n // Renown auth is served by the registry-auth plugin, which loads only with a\n // database (it also holds ownership). Without one, renown can't engage.\n if (renownEnabled && !databaseUrl && !authStore) {\n console.warn(\n \"[registry] Renown auth requires a database (--database-url) for the auth plugin; renown will be inactive.\",\n );\n }\n\n console.log({\n storagePath,\n cdnCachePath,\n });\n\n const webhookConfigs = webhooks\n ?.split(\",\")\n .map((url) => url.trim())\n .filter(Boolean)\n .map((endpoint) => ({ endpoint }));\n\n const localPackagePatterns = localPackages\n ?.split(\",\")\n .map((p) => p.trim())\n .filter(Boolean);\n\n // One AuthStore, shared by the verdaccio auth plugin and the /packages owner\n // enrichment — a single Postgres pool per process (injected store wins).\n const sharedAuthStore: AuthStore | undefined =\n (authStore as AuthStore | undefined) ??\n (databaseUrl ? createPgStore(createPgPool(databaseUrl)) : undefined);\n // Token carries the store through verdaccio's plugin config; we later assert\n // the plugin loaded it, so a configured-but-broken auth setup fails to boot.\n const authStoreToken = sharedAuthStore\n ? stashAuthStore(sharedAuthStore)\n : undefined;\n\n const config: RegistryConfig = {\n port,\n storagePath,\n cdnCachePath,\n uplink,\n uplinkMaxage,\n webEnabled,\n verdaccioSecret,\n ...(localPackagePatterns?.length ? { localPackagePatterns } : {}),\n ...(renownEnabled && publicUrl\n ? { renown: { publicUrl, ...(renownUrl ? { renownUrl } : {}) } }\n : {}),\n ...(webhookConfigs?.length && {\n notify: { webhooks: webhookConfigs },\n }),\n ...(s3Bucket &&\n s3Endpoint &&\n s3Region && {\n s3: {\n bucket: s3Bucket,\n endpoint: s3Endpoint,\n region: s3Region,\n accessKeyId: s3AccessKeyId,\n secretAccessKey: s3SecretAccessKey,\n keyPrefix: s3KeyPrefix,\n s3ForcePathStyle,\n },\n }),\n ...(databaseUrl ? { databaseUrl } : {}),\n ...(pluginsDir ? { pluginsDir } : {}),\n ...(sharedAuthStore ? { authStore: sharedAuthStore } : {}),\n ...(authStoreToken ? { authStoreToken } : {}),\n };\n\n if (config.databaseUrl || config.authStore) {\n console.log(\n \"[registry] Postgres-backed auth plugin active (persistent accounts + package ownership)\",\n );\n }\n // Ensure directories exist (for relative paths resolved via findUp)\n await mkdir(storagePath, { recursive: true });\n await mkdir(cdnCachePath, { recursive: true });\n\n const verdaccioConfig = buildVerdaccioConfig(config);\n\n // verdaccio's runServer returns Promise<any> (upstream type limitation)\n const verdaccioServer = (await runServer(verdaccioConfig)) as Server;\n\n // Fail fast: a configured auth store that the plugin never loaded means\n // verdaccio silently fell back to no auth — refuse to run without ownership.\n if (authStoreToken && !wasStoreLoaded(authStoreToken)) {\n verdaccioServer.close();\n throw new Error(\n \"registry-auth plugin failed to load despite a configured database/auth store; refusing to start without auth and package-ownership enforcement.\",\n );\n }\n const verdaccioHandler = verdaccioServer.listeners(\"request\")[0] as (\n ...args: unknown[]\n ) => void;\n\n const app = express();\n\n const sseChannel = new SSEChannel();\n const webhookChannel = new WebhookChannel(config.storagePath, config.notify);\n const notifications = new NotificationManager([sseChannel, webhookChannel]);\n\n // Serve static assets (logo, etc.)\n const staticDir = await findUp(\"static\", { type: \"directory\" });\n if (staticDir) {\n app.use(\"/-/static\", express.static(staticDir));\n }\n\n // Our routes take priority over Verdaccio\n app.use(\n createPowerhouseRouter(config, sseChannel, webhookChannel, sharedAuthStore),\n );\n\n app.use(createPublishHook(config, notifications));\n app.use(createUnpublishHook(config, notifications));\n\n // Verdaccio handles everything else (npm protocol, web UI, auth)\n app.use((req, res) => verdaccioHandler(req, res));\n\n const server = app.listen(port, () => {\n console.log(`Powerhouse Registry running on http://localhost:${port}`);\n console.log(` CDN: http://localhost:${port}/-/cdn/`);\n console.log(` Packages: http://localhost:${port}/packages`);\n console.log(` npm: http://localhost:${port}/`);\n console.log(` Storage: ${storagePath}`);\n console.log(` CDN cache: ${cdnCachePath}`);\n if (config.s3) {\n console.log(` S3: ${config.s3.endpoint}/${config.s3.bucket}`);\n }\n if (config.renown) {\n console.log(` Renown auth: ${config.renown.publicUrl}`);\n }\n });\n\n return server;\n}\n","import {\n binary,\n command,\n flag,\n number,\n option,\n optional,\n run,\n string,\n} from \"cmd-ts\";\nimport {\n DEFAULT_PORT,\n DEFAULT_REGISTRY_CDN_CACHE_DIR_NAME,\n DEFAULT_STORAGE_DIR_NAME,\n} from \"./src/constants.js\";\nimport { runRegistry } from \"./src/run.js\";\n\nexport const registryCommand = command({\n name: \"Package registry\",\n args: {\n port: option({\n long: \"port\",\n type: number,\n defaultValue: () => Number(process.env.PORT) || DEFAULT_PORT,\n defaultValueIsSerializable: true,\n }),\n storageDir: option({\n long: \"storage-dir\",\n type: string,\n defaultValue: () =>\n process.env.REGISTRY_STORAGE || DEFAULT_STORAGE_DIR_NAME,\n defaultValueIsSerializable: true,\n }),\n cdnCacheDir: option({\n long: \"cdn-cache-dir\",\n type: string,\n defaultValue: () =>\n process.env.REGISTRY_CDN_CACHE || DEFAULT_REGISTRY_CDN_CACHE_DIR_NAME,\n defaultValueIsSerializable: true,\n }),\n uplink: option({\n long: \"uplink\",\n type: optional(string),\n defaultValue: () => process.env.REGISTRY_UPLINK,\n defaultValueIsSerializable: true,\n }),\n uplinkMaxage: option({\n long: \"uplink-maxage\",\n type: optional(string),\n description:\n \"How long verdaccio caches npmjs uplink metadata before refetching. \" +\n \"Accepts verdaccio time strings (e.g. '30s', '2m', '1h'). \" +\n \"Default '2m' matches verdaccio upstream — shortens the publish-to-\" +\n \"install propagation window in dev. Bump for production deployments \" +\n \"that want to reduce npmjs load.\",\n defaultValue: () => process.env.PH_REGISTRY_UPLINK_MAXAGE,\n defaultValueIsSerializable: true,\n }),\n s3Bucket: option({\n long: \"s3-bucket\",\n type: optional(string),\n defaultValue: () => process.env.S3_BUCKET,\n defaultValueIsSerializable: true,\n }),\n s3Endpoint: option({\n long: \"s3-endpoint\",\n type: optional(string),\n defaultValue: () => process.env.S3_ENDPOINT,\n defaultValueIsSerializable: true,\n }),\n s3Region: option({\n long: \"s3-region\",\n type: optional(string),\n defaultValue: () => process.env.S3_REGION,\n defaultValueIsSerializable: true,\n }),\n s3AccessKeyId: option({\n long: \"s3-access-key-id\",\n type: optional(string),\n defaultValue: () => process.env.S3_ACCESS_KEY_ID,\n defaultValueIsSerializable: true,\n }),\n s3SecretAccessKey: option({\n long: \"s3-secret-access-key\",\n type: optional(string),\n defaultValue: () => process.env.S3_SECRET_ACCESS_KEY,\n defaultValueIsSerializable: true,\n }),\n s3KeyPrefix: option({\n long: \"s3-key-prefix\",\n type: optional(string),\n defaultValue: () => process.env.S3_KEY_PREFIX,\n defaultValueIsSerializable: true,\n }),\n s3ForcePathStyle: flag({\n long: \"s3-force-path-style\",\n defaultValue: () => process.env.S3_FORCE_PATH_STYLE !== \"false\",\n defaultValueIsSerializable: true,\n }),\n webEnabled: flag({\n long: \"web-enabled\",\n defaultValue: () => process.env.REGISTRY_WEB !== \"false\",\n defaultValueIsSerializable: true,\n }),\n webhooks: option({\n long: \"webhook\",\n type: optional(string),\n description: \"Comma-separated webhook URLs to notify on publish\",\n defaultValue: () => process.env.REGISTRY_WEBHOOKS,\n defaultValueIsSerializable: true,\n }),\n publicUrl: option({\n long: \"public-url\",\n type: optional(string),\n description:\n \"Public origin of this registry (used as the JWT `aud` claim for Renown bearer tokens). Required when --auth-renown is true.\",\n defaultValue: () => process.env.PH_REGISTRY_PUBLIC_URL,\n defaultValueIsSerializable: true,\n }),\n authRenown: flag({\n long: \"auth-renown\",\n description:\n \"Verify Renown-signed bearer tokens in front of verdaccio (stateless). Disabled when --public-url is unset.\",\n defaultValue: () => process.env.PH_REGISTRY_AUTH_RENOWN === \"true\",\n defaultValueIsSerializable: true,\n }),\n renownUrl: option({\n long: \"renown-url\",\n type: optional(string),\n description:\n \"Renown service base URL for credential verification. Defaults to https://www.renown.id.\",\n defaultValue: () => process.env.PH_REGISTRY_RENOWN_URL,\n defaultValueIsSerializable: true,\n }),\n verdaccioSecret: option({\n long: \"verdaccio-secret\",\n type: optional(string),\n description:\n \"Override verdaccio's internal JWT signing secret. Default: random per pod (fine — the swapped JWT never leaves this process).\",\n defaultValue: () => process.env.PH_REGISTRY_VERDACCIO_SECRET,\n defaultValueIsSerializable: true,\n }),\n localPackages: option({\n long: \"local-packages\",\n type: optional(string),\n description:\n \"Comma-separated globs (e.g. '@powerhousedao/*,document-model,ph-cmd') served locally only — no npmjs uplink proxy. Lets you re-publish a workspace package whose version already exists on npmjs without bumping.\",\n defaultValue: () => process.env.PH_REGISTRY_LOCAL_PACKAGES,\n defaultValueIsSerializable: true,\n }),\n databaseUrl: option({\n long: \"database-url\",\n type: optional(string),\n description:\n \"Postgres connection string. When set, the registry uses the DB-backed auth plugin (persistent accounts + npm-style package ownership) instead of the built-in htpasswd.\",\n defaultValue: () =>\n process.env.PH_REGISTRY_DATABASE_URL ?? process.env.DATABASE_URL,\n defaultValueIsSerializable: true,\n }),\n },\n handler: async (args) => {\n // Redact secrets — this object otherwise leaks the DB password / signing\n // secret into logs.\n const redact = (v?: string) => (v ? \"[redacted]\" : undefined);\n console.log({\n ...args,\n databaseUrl: redact(args.databaseUrl),\n verdaccioSecret: redact(args.verdaccioSecret),\n s3SecretAccessKey: redact(args.s3SecretAccessKey),\n });\n\n try {\n await runRegistry(args);\n } catch (error) {\n console.error(\"Failed to start registry:\");\n console.error(error);\n process.exit(1);\n }\n },\n});\n\nconst registryCli = binary(registryCommand);\n\nawait run(registryCli, process.argv);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.mjs","names":["os","tty","debug","buildDebug","debug","buildDebug","debug","buildDebug","debug","buildDebug","debug","buildDebug","debug","buildDebug","debugCore","MIGRATION_LOCK_ID","publisherOf","METRICS_CONTENT_TYPE"],"sources":["../src/constants.ts","../../../node_modules/.pnpm/ms@2.1.3/node_modules/ms/index.js","../../../node_modules/.pnpm/debug@4.4.3_supports-color@8.1.1/node_modules/debug/src/common.js","../../../node_modules/.pnpm/debug@4.4.3_supports-color@8.1.1/node_modules/debug/src/browser.js","../../../node_modules/.pnpm/has-flag@4.0.0/node_modules/has-flag/index.js","../../../node_modules/.pnpm/supports-color@8.1.1/node_modules/supports-color/index.js","../../../node_modules/.pnpm/debug@4.4.3_supports-color@8.1.1/node_modules/debug/src/node.js","../../../node_modules/.pnpm/debug@4.4.3_supports-color@8.1.1/node_modules/debug/src/index.js","../../../node_modules/.pnpm/@verdaccio+config@9.0.0-next-9.32_supports-color@8.1.1/node_modules/@verdaccio/config/build/package-access.mjs","../../../node_modules/.pnpm/@verdaccio+config@9.0.0-next-9.32_supports-color@8.1.1/node_modules/@verdaccio/config/build/token.mjs","../../../node_modules/.pnpm/@verdaccio+config@9.0.0-next-9.32_supports-color@8.1.1/node_modules/@verdaccio/config/build/config.mjs","../../../node_modules/.pnpm/@verdaccio+config@9.0.0-next-9.32_supports-color@8.1.1/node_modules/@verdaccio/config/build/config-utils.mjs","../../../node_modules/.pnpm/@verdaccio+config@9.0.0-next-9.32_supports-color@8.1.1/node_modules/@verdaccio/config/build/config-path.mjs","../../../node_modules/.pnpm/js-yaml@5.2.2/node_modules/js-yaml/dist/js-yaml.mjs","../../../node_modules/.pnpm/@verdaccio+config@9.0.0-next-9.32_supports-color@8.1.1/node_modules/@verdaccio/config/build/parse.mjs","../../../node_modules/.pnpm/@verdaccio+config@9.0.0-next-9.32_supports-color@8.1.1/node_modules/@verdaccio/config/build/user.mjs","../../../node_modules/.pnpm/@verdaccio+config@9.0.0-next-9.32_supports-color@8.1.1/node_modules/@verdaccio/config/build/conf/index.mjs","../../../node_modules/.pnpm/@verdaccio+config@9.0.0-next-9.32_supports-color@8.1.1/node_modules/@verdaccio/config/build/address.mjs","../../../node_modules/.pnpm/@powerhousedao+verdaccio-s3-storage@13.0.0_supports-color@8.1.1/node_modules/@powerhousedao/verdaccio-s3-storage/lib/s3DatabasePostgres.js","../src/pace.ts","../src/artifacts.ts","../src/db/database.ts","../src/db/migrations.ts","../src/auth/pg-store.ts","../src/auth/store-handoff.ts","../src/events.ts","../src/jobs.ts","../src/packages.ts","../src/semver.ts","../src/processor.ts","../src/catalog.ts","../src/metrics.ts","../src/cdn.ts","../src/pieces.ts","../src/middleware.ts","../src/notifications/sse.ts","../src/notifications/webhook.ts","../src/late-header-guard.ts","../src/uplink-miss-cache.ts","../src/verdaccio-config.ts","../src/worker.ts","../src/run.ts","../cli.ts"],"sourcesContent":["export const DEFAULT_PORT = 8080;\nexport const DEFAULT_STORAGE_DIR_NAME = \"./storage\" as const;\nexport const DEFAULT_REGISTRY_CDN_CACHE_DIR_NAME = \"./cdn-cache\" as const;\n","/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isFinite(val)) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'weeks':\n case 'week':\n case 'w':\n return n * w;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (msAbs >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (msAbs >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (msAbs >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return plural(ms, msAbs, d, 'day');\n }\n if (msAbs >= h) {\n return plural(ms, msAbs, h, 'hour');\n }\n if (msAbs >= m) {\n return plural(ms, msAbs, m, 'minute');\n }\n if (msAbs >= s) {\n return plural(ms, msAbs, s, 'second');\n }\n return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n var isPlural = msAbs >= n * 1.5;\n return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\t\tlet namespacesCache;\n\t\tlet enabledCache;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => {\n\t\t\t\tif (enableOverride !== null) {\n\t\t\t\t\treturn enableOverride;\n\t\t\t\t}\n\t\t\t\tif (namespacesCache !== createDebug.namespaces) {\n\t\t\t\t\tnamespacesCache = createDebug.namespaces;\n\t\t\t\t\tenabledCache = createDebug.enabled(namespace);\n\t\t\t\t}\n\n\t\t\t\treturn enabledCache;\n\t\t\t},\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\t\tcreateDebug.namespaces = namespaces;\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '')\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, ',')\n\t\t\t.split(',')\n\t\t\t.filter(Boolean);\n\n\t\tfor (const ns of split) {\n\t\t\tif (ns[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(ns.slice(1));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(ns);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the given string matches a namespace template, honoring\n\t * asterisks as wildcards.\n\t *\n\t * @param {String} search\n\t * @param {String} template\n\t * @return {Boolean}\n\t */\n\tfunction matchesTemplate(search, template) {\n\t\tlet searchIndex = 0;\n\t\tlet templateIndex = 0;\n\t\tlet starIndex = -1;\n\t\tlet matchIndex = 0;\n\n\t\twhile (searchIndex < search.length) {\n\t\t\tif (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) {\n\t\t\t\t// Match character or proceed with wildcard\n\t\t\t\tif (template[templateIndex] === '*') {\n\t\t\t\t\tstarIndex = templateIndex;\n\t\t\t\t\tmatchIndex = searchIndex;\n\t\t\t\t\ttemplateIndex++; // Skip the '*'\n\t\t\t\t} else {\n\t\t\t\t\tsearchIndex++;\n\t\t\t\t\ttemplateIndex++;\n\t\t\t\t}\n\t\t\t} else if (starIndex !== -1) { // eslint-disable-line no-negated-condition\n\t\t\t\t// Backtrack to the last '*' and try to match more characters\n\t\t\t\ttemplateIndex = starIndex + 1;\n\t\t\t\tmatchIndex++;\n\t\t\t\tsearchIndex = matchIndex;\n\t\t\t} else {\n\t\t\t\treturn false; // No match\n\t\t\t}\n\t\t}\n\n\t\t// Handle trailing '*' in template\n\t\twhile (templateIndex < template.length && template[templateIndex] === '*') {\n\t\t\ttemplateIndex++;\n\t\t}\n\n\t\treturn templateIndex === template.length;\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names,\n\t\t\t...createDebug.skips.map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tfor (const skip of createDebug.skips) {\n\t\t\tif (matchesTemplate(name, skip)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (const ns of createDebug.names) {\n\t\t\tif (matchesTemplate(name, ns)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n","/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\tlet m;\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\t// eslint-disable-next-line no-return-assign\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)) && parseInt(m[1], 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug') || exports.storage.getItem('DEBUG') ;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n","'use strict';\n\nmodule.exports = (flag, argv = process.argv) => {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n};\n","'use strict';\nconst os = require('os');\nconst tty = require('tty');\nconst hasFlag = require('has-flag');\n\nconst {env} = process;\n\nlet flagForceColor;\nif (hasFlag('no-color') ||\n\thasFlag('no-colors') ||\n\thasFlag('color=false') ||\n\thasFlag('color=never')) {\n\tflagForceColor = 0;\n} else if (hasFlag('color') ||\n\thasFlag('colors') ||\n\thasFlag('color=true') ||\n\thasFlag('color=always')) {\n\tflagForceColor = 1;\n}\n\nfunction envForceColor() {\n\tif ('FORCE_COLOR' in env) {\n\t\tif (env.FORCE_COLOR === 'true') {\n\t\t\treturn 1;\n\t\t}\n\n\t\tif (env.FORCE_COLOR === 'false') {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn env.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3\n\t};\n}\n\nfunction supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) {\n\tconst noFlagForceColor = envForceColor();\n\tif (noFlagForceColor !== undefined) {\n\t\tflagForceColor = noFlagForceColor;\n\t}\n\n\tconst forceColor = sniffFlags ? flagForceColor : noFlagForceColor;\n\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (sniffFlags) {\n\t\tif (hasFlag('color=16m') ||\n\t\t\thasFlag('color=full') ||\n\t\t\thasFlag('color=truecolor')) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (hasFlag('color=256')) {\n\t\t\treturn 2;\n\t\t}\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10 &&\n\t\t\tNumber(osRelease[2]) >= 10586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'GITHUB_ACTIONS', 'BUILDKITE', 'DRONE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = Number.parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app':\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\tcase 'Apple_Terminal':\n\t\t\t\treturn 2;\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nfunction getSupportLevel(stream, options = {}) {\n\tconst level = supportsColor(stream, {\n\t\tstreamIsTTY: stream && stream.isTTY,\n\t\t...options\n\t});\n\n\treturn translateLevel(level);\n}\n\nmodule.exports = {\n\tsupportsColor: getSupportLevel,\n\tstdout: getSupportLevel({isTTY: tty.isatty(1)}),\n\tstderr: getSupportLevel({isTTY: tty.isatty(2)})\n};\n","/**\n * Module dependencies.\n */\n\nconst tty = require('tty');\nconst util = require('util');\n\n/**\n * This is the Node.js implementation of `debug()`.\n */\n\nexports.init = init;\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.destroy = util.deprecate(\n\t() => {},\n\t'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'\n);\n\n/**\n * Colors.\n */\n\nexports.colors = [6, 2, 3, 4, 5, 1];\n\ntry {\n\t// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)\n\t// eslint-disable-next-line import/no-extraneous-dependencies\n\tconst supportsColor = require('supports-color');\n\n\tif (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {\n\t\texports.colors = [\n\t\t\t20,\n\t\t\t21,\n\t\t\t26,\n\t\t\t27,\n\t\t\t32,\n\t\t\t33,\n\t\t\t38,\n\t\t\t39,\n\t\t\t40,\n\t\t\t41,\n\t\t\t42,\n\t\t\t43,\n\t\t\t44,\n\t\t\t45,\n\t\t\t56,\n\t\t\t57,\n\t\t\t62,\n\t\t\t63,\n\t\t\t68,\n\t\t\t69,\n\t\t\t74,\n\t\t\t75,\n\t\t\t76,\n\t\t\t77,\n\t\t\t78,\n\t\t\t79,\n\t\t\t80,\n\t\t\t81,\n\t\t\t92,\n\t\t\t93,\n\t\t\t98,\n\t\t\t99,\n\t\t\t112,\n\t\t\t113,\n\t\t\t128,\n\t\t\t129,\n\t\t\t134,\n\t\t\t135,\n\t\t\t148,\n\t\t\t149,\n\t\t\t160,\n\t\t\t161,\n\t\t\t162,\n\t\t\t163,\n\t\t\t164,\n\t\t\t165,\n\t\t\t166,\n\t\t\t167,\n\t\t\t168,\n\t\t\t169,\n\t\t\t170,\n\t\t\t171,\n\t\t\t172,\n\t\t\t173,\n\t\t\t178,\n\t\t\t179,\n\t\t\t184,\n\t\t\t185,\n\t\t\t196,\n\t\t\t197,\n\t\t\t198,\n\t\t\t199,\n\t\t\t200,\n\t\t\t201,\n\t\t\t202,\n\t\t\t203,\n\t\t\t204,\n\t\t\t205,\n\t\t\t206,\n\t\t\t207,\n\t\t\t208,\n\t\t\t209,\n\t\t\t214,\n\t\t\t215,\n\t\t\t220,\n\t\t\t221\n\t\t];\n\t}\n} catch (error) {\n\t// Swallow - we only care if `supports-color` is available; it doesn't have to be.\n}\n\n/**\n * Build up the default `inspectOpts` object from the environment variables.\n *\n * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js\n */\n\nexports.inspectOpts = Object.keys(process.env).filter(key => {\n\treturn /^debug_/i.test(key);\n}).reduce((obj, key) => {\n\t// Camel-case\n\tconst prop = key\n\t\t.substring(6)\n\t\t.toLowerCase()\n\t\t.replace(/_([a-z])/g, (_, k) => {\n\t\t\treturn k.toUpperCase();\n\t\t});\n\n\t// Coerce string value into JS value\n\tlet val = process.env[key];\n\tif (/^(yes|on|true|enabled)$/i.test(val)) {\n\t\tval = true;\n\t} else if (/^(no|off|false|disabled)$/i.test(val)) {\n\t\tval = false;\n\t} else if (val === 'null') {\n\t\tval = null;\n\t} else {\n\t\tval = Number(val);\n\t}\n\n\tobj[prop] = val;\n\treturn obj;\n}, {});\n\n/**\n * Is stdout a TTY? Colored output is enabled when `true`.\n */\n\nfunction useColors() {\n\treturn 'colors' in exports.inspectOpts ?\n\t\tBoolean(exports.inspectOpts.colors) :\n\t\ttty.isatty(process.stderr.fd);\n}\n\n/**\n * Adds ANSI color escape codes if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\tconst {namespace: name, useColors} = this;\n\n\tif (useColors) {\n\t\tconst c = this.color;\n\t\tconst colorCode = '\\u001B[3' + (c < 8 ? c : '8;5;' + c);\n\t\tconst prefix = ` ${colorCode};1m${name} \\u001B[0m`;\n\n\t\targs[0] = prefix + args[0].split('\\n').join('\\n' + prefix);\n\t\targs.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\\u001B[0m');\n\t} else {\n\t\targs[0] = getDate() + name + ' ' + args[0];\n\t}\n}\n\nfunction getDate() {\n\tif (exports.inspectOpts.hideDate) {\n\t\treturn '';\n\t}\n\treturn new Date().toISOString() + ' ';\n}\n\n/**\n * Invokes `util.formatWithOptions()` with the specified arguments and writes to stderr.\n */\n\nfunction log(...args) {\n\treturn process.stderr.write(util.formatWithOptions(exports.inspectOpts, ...args) + '\\n');\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\tif (namespaces) {\n\t\tprocess.env.DEBUG = namespaces;\n\t} else {\n\t\t// If you set a process.env field to null or undefined, it gets cast to the\n\t\t// string 'null' or 'undefined'. Just delete instead.\n\t\tdelete process.env.DEBUG;\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n\treturn process.env.DEBUG;\n}\n\n/**\n * Init logic for `debug` instances.\n *\n * Create a new `inspectOpts` object in case `useColors` is set\n * differently for a particular `debug` instance.\n */\n\nfunction init(debug) {\n\tdebug.inspectOpts = {};\n\n\tconst keys = Object.keys(exports.inspectOpts);\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tdebug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %o to `util.inspect()`, all on a single line.\n */\n\nformatters.o = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts)\n\t\t.split('\\n')\n\t\t.map(str => str.trim())\n\t\t.join(' ');\n};\n\n/**\n * Map %O to `util.inspect()`, allowing multiple lines if needed.\n */\n\nformatters.O = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts);\n};\n","/**\n * Detect Electron renderer / nwjs process, which is node, but we should\n * treat as a browser.\n */\n\nif (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {\n\tmodule.exports = require('./browser.js');\n} else {\n\tmodule.exports = require('./node.js');\n}\n","import buildDebug from \"debug\";\nimport { flatten, isEmpty, isNil, isObject, isUndefined } from \"lodash-es\";\nimport assert from \"node:assert\";\nimport { errorUtils } from \"@verdaccio/core\";\n//#region src/package-access.ts\nvar debug = buildDebug(\"verdaccio:config:utils\");\nvar ROLES = {\n\t$ALL: \"$all\",\n\tALL: \"all\",\n\t$AUTH: \"$authenticated\",\n\t$ANONYMOUS: \"$anonymous\",\n\tDEPRECATED_ALL: \"@all\",\n\tDEPRECATED_AUTH: \"@authenticated\",\n\tDEPRECATED_ANONYMOUS: \"@anonymous\"\n};\nvar PACKAGE_ACCESS = {\n\tSCOPE: \"@*/*\",\n\tALL: \"**\"\n};\nfunction normalizeUserList(groupsList) {\n\tconst result = [];\n\tif (isNil(groupsList) || isEmpty(groupsList)) return result;\n\tif (typeof groupsList === \"string\") {\n\t\tconst groupsArray = groupsList.split(/\\s+/);\n\t\tresult.push(groupsArray);\n\t} else if (Array.isArray(groupsList)) result.push(groupsList);\n\telse throw errorUtils.getInternalError(\"CONFIG: bad package acl (array or string expected): \" + JSON.stringify(groupsList));\n\treturn flatten(result);\n}\nfunction normalisePackageAccess(packages) {\n\tconst normalizedPkgs = { ...packages };\n\tif (isNil(normalizedPkgs[\"**\"])) normalizedPkgs[\"**\"] = {\n\t\taccess: [],\n\t\tpublish: [],\n\t\tunpublish: [],\n\t\tstage: [],\n\t\tproxy: []\n\t};\n\tfor (const pkg in packages) if (Object.prototype.hasOwnProperty.call(packages, pkg)) {\n\t\tconst packageAccess = packages[pkg];\n\t\tdebug(\"package access %s for %s \", packageAccess, pkg);\n\t\tconst isInvalid = isObject(packageAccess) && !Array.isArray(packageAccess);\n\t\tassert(isInvalid, `CONFIG: bad \"'${pkg}'\" package description (object expected)`);\n\t\tnormalizedPkgs[pkg].access = normalizeUserList(packageAccess.access);\n\t\tnormalizedPkgs[pkg].publish = normalizeUserList(packageAccess.publish);\n\t\tnormalizedPkgs[pkg].proxy = normalizeUserList(packageAccess.proxy);\n\t\tnormalizedPkgs[pkg].unpublish = isUndefined(packageAccess.unpublish) ? false : normalizeUserList(packageAccess.unpublish);\n\t\tnormalizedPkgs[pkg].stage = isUndefined(packageAccess.stage) ? false : normalizeUserList(packageAccess.stage);\n\t}\n\treturn normalizedPkgs;\n}\n//#endregion\nexport { PACKAGE_ACCESS, ROLES, normalisePackageAccess, normalizeUserList };\n\n//# sourceMappingURL=package-access.mjs.map","import { randomBytes } from \"node:crypto\";\n//#region src/token.ts\nvar TOKEN_VALID_LENGTH = 32;\n/**\n* Secret key must have 32 characters.\n*/\nfunction generateRandomSecretKey() {\n\treturn randomBytes(32).toString(\"base64\").substring(0, 32);\n}\n//#endregion\nexport { TOKEN_VALID_LENGTH, generateRandomSecretKey };\n\n//# sourceMappingURL=token.mjs.map","import { getUserAgent } from \"./agent.mjs\";\nimport { normalisePackageAccess } from \"./package-access.mjs\";\nimport { defaultSecurity } from \"./security.mjs\";\nimport serverSettings_default from \"./serverSettings.mjs\";\nimport { generateRandomSecretKey } from \"./token.mjs\";\nimport { sanityCheckUplinksProps, uplinkSanityCheck } from \"./uplinks.mjs\";\nimport buildDebug from \"debug\";\nimport { isEmpty, merge } from \"lodash-es\";\nimport assert from \"node:assert\";\nimport { APP_ERROR, authUtils, cryptoUtils, validationUtils } from \"@verdaccio/core\";\n//#region src/config.ts\nvar strategicConfigProps = [\"uplinks\", \"packages\"];\nvar allowedEnvConfig = [\n\t\"http_proxy\",\n\t\"https_proxy\",\n\t\"no_proxy\"\n];\nvar debug = buildDebug(\"verdaccio:config\");\nvar WEB_TITLE = \"Verdaccio\";\nvar defaultUserRateLimiting = {\n\twindowMs: 9e5,\n\tmax: 1e3\n};\nvar TOKEN_VALID_LENGTH = 32;\n/**\n* Coordinates the application configuration\n*/\nvar Config = class {\n\tuser_agent;\n\tuplinks;\n\tpackages;\n\tusers;\n\tauth;\n\tstore;\n\tserver_id;\n\tconfigPath;\n\tstorage;\n\tplugins;\n\tsecurity;\n\tserver;\n\tsecret;\n\tflags;\n\tuserRateLimit;\n\tconstructor(config) {\n\t\tconst self = this;\n\t\tthis.storage = process.env.VERDACCIO_STORAGE_PATH || config.storage;\n\t\tif (!config.configPath) {\n\t\t\tconfig.configPath = config.config_path;\n\t\t\tif (!config.configPath) throw new Error(\"configPath property is required\");\n\t\t}\n\t\tthis.configPath = config.configPath;\n\t\tdebug(\"config path: %s\", this.configPath);\n\t\tthis.plugins = config.plugins;\n\t\tthis.security = merge(defaultSecurity, config.security);\n\t\tthis.server = merge({}, serverSettings_default, config.server);\n\t\tthis.flags = {\n\t\t\tchangePassword: config.flags?.changePassword ?? false,\n\t\t\twebLogin: config.flags?.webLogin ?? false,\n\t\t\tcreateUser: config.flags?.createUser ?? false,\n\t\t\tstage: config.flags?.stage ?? false,\n\t\t\ttfa: config.flags?.tfa ?? false\n\t\t};\n\t\tthis.user_agent = config.user_agent;\n\t\tfor (const configProp in config) if (self[configProp] == null) self[configProp] = config[configProp];\n\t\tif (typeof this.user_agent === \"undefined\") {\n\t\t\tdebug(\"set default user agent\");\n\t\t\tthis.user_agent = getUserAgent(false);\n\t\t}\n\t\tthis.userRateLimit = {\n\t\t\t...defaultUserRateLimiting,\n\t\t\t...config?.userRateLimit\n\t\t};\n\t\tassert(validationUtils.isObject(config), APP_ERROR.CONFIG_NOT_VALID);\n\t\tstrategicConfigProps.forEach(function(x) {\n\t\t\tif (self[x] == null) self[x] = {};\n\t\t\tassert(validationUtils.isObject(self[x]), `CONFIG: bad \"${x}\" value (object expected)`);\n\t\t});\n\t\tthis.uplinks = sanityCheckUplinksProps(uplinkSanityCheck(this.uplinks));\n\t\tthis.packages = normalisePackageAccess(self.packages);\n\t\tallowedEnvConfig.forEach((envConf) => {\n\t\t\tif (!(envConf in self)) self[envConf] = process.env[envConf] || process.env[envConf.toUpperCase()];\n\t\t});\n\t\tif (!this.server_id) this.server_id = cryptoUtils.generateRandomHexString(6);\n\t}\n\tgetConfigPath() {\n\t\treturn this.configPath;\n\t}\n\t/**\n\t* Check for package spec\n\t* @param pkgName - package name\n\t* @returns package access\n\t* @deprecated use core.authUtils instead\n\t*/\n\tgetMatchedPackagesSpec(pkgName) {\n\t\treturn authUtils.getMatchedPackagesSpec(pkgName, this.packages);\n\t}\n\t/**\n\t* Verify if the secret complies with the required structure.\n\t* The secret must be exactly 32 characters long for aes-256-ctr encryption.\n\t* If no secret is provided, a new one will be generated.\n\t* @secret external secret key\n\t*/\n\tcheckSecretKey(secret) {\n\t\tdebug(\"checking secret key init\");\n\t\tif (typeof secret === \"string\" && isEmpty(secret) === false) {\n\t\t\tdebug(\"checking secret key length %s\", secret.length);\n\t\t\tif (secret.length !== TOKEN_VALID_LENGTH) throw new Error(`Invalid storage secret key length, must be ${TOKEN_VALID_LENGTH} characters long but is ${secret.length}. Please generate a new one. Learn more at https://verdaccio.org/docs/configuration/#.verdaccio-db`);\n\t\t\tdebug(\"detected valid secret key length %s\", secret.length);\n\t\t\tthis.secret = secret;\n\t\t\treturn this.secret;\n\t\t} else {\n\t\t\tdebug(\"generating a new secret key\");\n\t\t\tthis.secret = generateRandomSecretKey();\n\t\t\tdebug(\"generated a new secret key length %s\", this.secret?.length);\n\t\t\treturn this.secret;\n\t\t}\n\t}\n};\n//#endregion\nexport { Config, WEB_TITLE, defaultUserRateLimiting };\n\n//# sourceMappingURL=config.mjs.map","import buildDebug from \"debug\";\nimport fs from \"node:fs\";\n//#region src/config-utils.ts\nvar debug = buildDebug(\"verdaccio:config:config-utils\");\n/**\n* Check whether the path already exist.\n* @param {String} path\n* @return {Boolean}\n*/\nfunction folderExists(path) {\n\ttry {\n\t\tdebug(\"check folder exist\", path);\n\t\tconst isDirectory = fs.statSync(path).isDirectory();\n\t\tdebug(\"folder exist\", isDirectory);\n\t\treturn isDirectory;\n\t} catch {\n\t\tdebug(\"folder %s does not exist\", path);\n\t\treturn false;\n\t}\n}\n/**\n* Check whether the file already exist.\n* @param {String} path\n* @return {Boolean}\n*/\nfunction fileExists(path) {\n\ttry {\n\t\tdebug(\"check file exist\", path);\n\t\tconst isFile = fs.statSync(path).isFile();\n\t\tdebug(\"file exist\", isFile);\n\t\treturn isFile;\n\t} catch {\n\t\tdebug(\"file %s does not exist\", path);\n\t\treturn false;\n\t}\n}\n//#endregion\nexport { fileExists, folderExists };\n\n//# sourceMappingURL=config-utils.mjs.map","import { fileExists, folderExists } from \"./config-utils.mjs\";\nimport buildDebug from \"debug\";\nimport { find } from \"lodash-es\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n//#region src/config-path.ts\nvar CONFIG_FILE = \"config.yaml\";\nvar XDG = \"xdg\";\nvar pkgJSON = { name: \"verdaccio\" };\nvar debug = buildDebug(\"verdaccio:config:config-path\");\n/**\n* Find and get the first config file that match.\n* @return {String} the config file path\n*/\nfunction findConfigFile(configPath) {\n\tdebug(\"searching for config file %o\", configPath);\n\tif (typeof configPath !== \"undefined\") {\n\t\tconst configLocation = path.resolve(configPath);\n\t\tdebug(\"custom location %s\", configLocation);\n\t\treturn configLocation;\n\t}\n\tconst configPaths = getConfigPaths();\n\tdebug(\"%o posible locations found\", configPaths.length);\n\tif (configPaths.length === 0) {\n\t\tdebug(\"no configuration files can be processed\");\n\t\tthrow new Error(\"no configuration files can be processed\");\n\t}\n\tconst primaryConf = find(configPaths, (configLocation) => fileExists(configLocation.path));\n\tif (typeof primaryConf !== \"undefined\") {\n\t\tdebug(\"at least one primary location detected at %s\", primaryConf?.path);\n\t\treturn primaryConf.path;\n\t}\n\tdebug(\"no previous location found, creating a new one\");\n\tdebug(\"generating the first match path location %s\", configPaths[0].path);\n\treturn createConfigFile(configPaths[0]).path;\n}\n/**\n* Like {@link findConfigFile}, but side-effect free: returns the first existing\n* config file location, or undefined when none exists (nothing is created).\n*/\nfunction findExistingConfigFile() {\n\treturn find(getConfigPaths(), (configLocation) => fileExists(configLocation.path))?.path;\n}\nfunction createConfigFile(configLocation) {\n\tcreateConfigFolder(configLocation);\n\tconst defaultConfig = updateStorageLinks(configLocation, readDefaultConfig());\n\tfs.writeFileSync(configLocation.path, defaultConfig);\n\treturn configLocation;\n}\nfunction readDefaultConfig() {\n\tconst currentDir = import.meta.dirname;\n\tconst pathDefaultConf = path.resolve(currentDir, \"conf/default.yaml\");\n\ttry {\n\t\tdebug(\"the path of default config used from %s\", pathDefaultConf);\n\t\tfs.accessSync(pathDefaultConf, fs.constants.R_OK);\n\t\tdebug(\"configuration file has enough permissions for reading\");\n\t} catch {\n\t\tdebug(\"configuration file does not have enough permissions for reading\");\n\t\tthrow new TypeError(\"configuration file does not have enough permissions for reading\");\n\t}\n\treturn fs.readFileSync(pathDefaultConf, \"utf8\");\n}\nfunction createConfigFolder(configLocation) {\n\tconst folder = path.dirname(configLocation.path);\n\tdebug(`creating default config file folder at %o`, folder);\n\tfs.mkdirSync(folder, { recursive: true });\n\tdebug(`folder %o created`, folder);\n}\n/**\n* Update the storage links to the new location if it is necessary.\n* @param configLocation\n* @param defaultConfig\n* @returns\n*/\nfunction updateStorageLinks(configLocation, defaultConfig) {\n\tdebug(\"checking storage links for %s and type %s\", configLocation.path, configLocation.type);\n\tif (configLocation.type !== XDG) {\n\t\tdebug(`skip storage override for %s`, configLocation.type);\n\t\treturn defaultConfig;\n\t}\n\tlet dataDir = process.env.XDG_DATA_HOME || process.env.HOME && path.join(process.env.HOME, \".local\", \"share\");\n\tif (dataDir && folderExists(dataDir)) {\n\t\tdebug(`previous storage located`);\n\t\tdebug(`update storage links to %s`, dataDir);\n\t\tdataDir = path.resolve(path.join(dataDir, pkgJSON.name, \"storage\"));\n\t\treturn defaultConfig.replace(/^storage: .\\/storage$/m, `storage: ${dataDir}`);\n\t}\n\tdebug(`could not find a previous storage location, skip override`);\n\treturn defaultConfig;\n}\n/**\n* Return a list of configuration locations by platform.\n* @returns\n*/\nfunction getConfigPaths() {\n\treturn [\n\t\tgetXDGDirectory(),\n\t\tgetWindowsDirectory(),\n\t\tgetRelativeDefaultDirectory(),\n\t\tgetOldDirectory()\n\t].reduce(function(acc, currentValue) {\n\t\tif (typeof currentValue !== \"undefined\") {\n\t\t\tdebug(\"posible directory path generated %s for type %s\", currentValue?.path, currentValue.type);\n\t\t\tacc.push(currentValue);\n\t\t}\n\t\treturn acc;\n\t}, []);\n}\n/**\n* Get XDG_CONFIG_HOME or HOME location (usually unix)\n*\n* The XDG_CONFIG_HOME environment variable is also part of the XDG Base Directory Specification,\n* which aims to standardize the locations where applications store configuration files and other\n* user-specific data on Unix-like operating systems.\n*\n* https://specifications.freedesktop.org/basedir-spec/latest/\n* @returns\n*/\nvar getXDGDirectory = () => {\n\tconst xDGConfigPath = process.env.XDG_CONFIG_HOME || process.env.HOME && path.join(process.env.HOME, \".config\");\n\tdebug(\"XDGConfig folder path %s\", xDGConfigPath);\n\tif (xDGConfigPath && folderExists(xDGConfigPath)) {\n\t\tdebug(\"XDGConfig folder path %s\", xDGConfigPath);\n\t\treturn {\n\t\t\tpath: path.join(xDGConfigPath, pkgJSON.name, CONFIG_FILE),\n\t\t\ttype: XDG\n\t\t};\n\t}\n};\n/**\n* Detect windows location, APPDATA\n* usually something like C:\\User\\<Build User>\\AppData\\Local\n* @returns\n*/\nvar getWindowsDirectory = () => {\n\tif (os.platform() === \"win32\" && process.env.APPDATA && folderExists(process.env.APPDATA)) {\n\t\tdebug(\"windows appdata folder path %s\", process.env.APPDATA);\n\t\treturn {\n\t\t\tpath: path.resolve(path.join(process.env.APPDATA, pkgJSON.name, CONFIG_FILE)),\n\t\t\ttype: \"win\"\n\t\t};\n\t}\n};\n/**\n* Return relative directory, this is the default.\n* It will cretate config in your {currentLocation/verdaccio/config.yaml}\n* @returns\n*/\nvar getRelativeDefaultDirectory = () => {\n\tconst relativePath = path.resolve(path.join(\".\", pkgJSON.name, CONFIG_FILE));\n\tdebug(\"relative folder path %s\", relativePath);\n\treturn {\n\t\tpath: relativePath,\n\t\ttype: \"def\"\n\t};\n};\n/**\n* This should never happens, consider it DEPRECATED\n* @returns\n*/\nvar getOldDirectory = () => {\n\tconst oldPath = path.resolve(path.join(\".\", CONFIG_FILE));\n\tdebug(\"old folder path %s\", oldPath);\n\treturn {\n\t\tpath: oldPath,\n\t\ttype: \"old\"\n\t};\n};\n//#endregion\nexport { findConfigFile, findExistingConfigFile, readDefaultConfig };\n\n//# sourceMappingURL=config-path.mjs.map","/*! js-yaml 5.2.2 https://github.com/nodeca/js-yaml @license MIT */\n//#region src/tag.ts\nvar NOT_RESOLVED = Symbol(\"NOT_RESOLVED\");\nvar MERGE_KEY = Symbol(\"MERGE_KEY\");\nfunction defineScalarTag(tagName, options) {\n\treturn {\n\t\ttagName,\n\t\tnodeKind: \"scalar\",\n\t\timplicit: options.implicit ?? false,\n\t\tmatchByTagPrefix: options.matchByTagPrefix ?? false,\n\t\timplicitFirstChars: options.implicitFirstChars ?? null,\n\t\tresolve: options.resolve,\n\t\tidentify: options.identify ?? null,\n\t\trepresent: options.represent ?? ((data) => String(data)),\n\t\trepresentTagName: options.representTagName ?? null\n\t};\n}\nfunction defineSequenceTag(tagName, options) {\n\tconst carrierIsResult = options.finalize === void 0;\n\treturn {\n\t\ttagName,\n\t\tnodeKind: \"sequence\",\n\t\timplicit: false,\n\t\tmatchByTagPrefix: options.matchByTagPrefix ?? false,\n\t\tcreate: options.create,\n\t\taddItem: options.addItem,\n\t\tfinalize: options.finalize ?? ((carrier) => carrier),\n\t\tcarrierIsResult,\n\t\tidentify: options.identify ?? null,\n\t\trepresent: options.represent ?? ((data) => data),\n\t\trepresentTagName: options.representTagName ?? null\n\t};\n}\nfunction defineMappingTag(tagName, options) {\n\tconst carrierIsResult = options.finalize === void 0;\n\treturn {\n\t\ttagName,\n\t\tnodeKind: \"mapping\",\n\t\timplicit: false,\n\t\tmatchByTagPrefix: options.matchByTagPrefix ?? false,\n\t\tcreate: options.create,\n\t\taddPair: options.addPair,\n\t\thas: options.has,\n\t\tkeys: options.keys,\n\t\tget: options.get,\n\t\tfinalize: options.finalize ?? ((carrier) => carrier),\n\t\tcarrierIsResult,\n\t\tidentify: options.identify ?? null,\n\t\trepresent: options.represent ?? ((data) => data),\n\t\trepresentTagName: options.representTagName ?? null\n\t};\n}\n//#endregion\n//#region src/tag/scalar/str.ts\nvar strTag = defineScalarTag(\"tag:yaml.org,2002:str\", {\n\tresolve: (source) => source,\n\tidentify: (data) => typeof data === \"string\"\n});\n//#endregion\n//#region src/tag/scalar/null_core.ts\nvar NULL_VALUES$1 = [\n\t\"\",\n\t\"~\",\n\t\"null\",\n\t\"Null\",\n\t\"NULL\"\n];\nvar nullCoreTag = defineScalarTag(\"tag:yaml.org,2002:null\", {\n\timplicit: true,\n\timplicitFirstChars: [\n\t\t\"\",\n\t\t\"~\",\n\t\t\"n\",\n\t\t\"N\"\n\t],\n\tresolve: (source) => {\n\t\tif (NULL_VALUES$1.indexOf(source) !== -1) return null;\n\t\treturn NOT_RESOLVED;\n\t},\n\tidentify: (object) => object === null,\n\trepresent: () => \"null\"\n});\n//#endregion\n//#region src/tag/scalar/null_json.ts\nvar nullJsonTag = defineScalarTag(\"tag:yaml.org,2002:null\", {\n\timplicit: true,\n\timplicitFirstChars: [\"n\"],\n\tresolve: (source, isExplicit) => {\n\t\tif (source === \"null\" || isExplicit && source === \"\") return null;\n\t\treturn NOT_RESOLVED;\n\t},\n\tidentify: (object) => object === null,\n\trepresent: () => \"null\"\n});\n//#endregion\n//#region src/tag/scalar/null_yaml11.ts\nvar NULL_VALUES = [\n\t\"\",\n\t\"~\",\n\t\"null\",\n\t\"Null\",\n\t\"NULL\"\n];\nvar nullYaml11Tag = defineScalarTag(\"tag:yaml.org,2002:null\", {\n\timplicit: true,\n\timplicitFirstChars: [\n\t\t\"\",\n\t\t\"~\",\n\t\t\"n\",\n\t\t\"N\"\n\t],\n\tresolve: (source) => {\n\t\tif (NULL_VALUES.indexOf(source) !== -1) return null;\n\t\treturn NOT_RESOLVED;\n\t},\n\tidentify: (object) => object === null,\n\trepresent: () => \"null\"\n});\n//#endregion\n//#region src/tag/scalar/bool_core.ts\nvar TRUE_VALUES$2 = [\n\t\"true\",\n\t\"True\",\n\t\"TRUE\"\n];\nvar FALSE_VALUES$2 = [\n\t\"false\",\n\t\"False\",\n\t\"FALSE\"\n];\nvar boolCoreTag = defineScalarTag(\"tag:yaml.org,2002:bool\", {\n\timplicit: true,\n\timplicitFirstChars: [\n\t\t\"t\",\n\t\t\"T\",\n\t\t\"f\",\n\t\t\"F\"\n\t],\n\tresolve: (source) => {\n\t\tif (TRUE_VALUES$2.indexOf(source) !== -1) return true;\n\t\tif (FALSE_VALUES$2.indexOf(source) !== -1) return false;\n\t\treturn NOT_RESOLVED;\n\t},\n\tidentify: (object) => Object.prototype.toString.call(object) === \"[object Boolean]\",\n\trepresent: (object) => object ? \"true\" : \"false\"\n});\n//#endregion\n//#region src/tag/scalar/bool_json.ts\nvar TRUE_VALUES$1 = [\"true\"];\nvar FALSE_VALUES$1 = [\"false\"];\nvar boolJsonTag = defineScalarTag(\"tag:yaml.org,2002:bool\", {\n\timplicit: true,\n\timplicitFirstChars: [\"t\", \"f\"],\n\tresolve: (source) => {\n\t\tif (TRUE_VALUES$1.indexOf(source) !== -1) return true;\n\t\tif (FALSE_VALUES$1.indexOf(source) !== -1) return false;\n\t\treturn NOT_RESOLVED;\n\t},\n\tidentify: (object) => Object.prototype.toString.call(object) === \"[object Boolean]\",\n\trepresent: (object) => object ? \"true\" : \"false\"\n});\n//#endregion\n//#region src/tag/scalar/bool_yaml11.ts\nvar TRUE_VALUES = [\n\t\"true\",\n\t\"True\",\n\t\"TRUE\",\n\t\"y\",\n\t\"Y\",\n\t\"yes\",\n\t\"Yes\",\n\t\"YES\",\n\t\"on\",\n\t\"On\",\n\t\"ON\"\n];\nvar FALSE_VALUES = [\n\t\"false\",\n\t\"False\",\n\t\"FALSE\",\n\t\"n\",\n\t\"N\",\n\t\"no\",\n\t\"No\",\n\t\"NO\",\n\t\"off\",\n\t\"Off\",\n\t\"OFF\"\n];\nvar boolYaml11Tag = defineScalarTag(\"tag:yaml.org,2002:bool\", {\n\timplicit: true,\n\timplicitFirstChars: [\n\t\t\"y\",\n\t\t\"Y\",\n\t\t\"n\",\n\t\t\"N\",\n\t\t\"t\",\n\t\t\"T\",\n\t\t\"f\",\n\t\t\"F\",\n\t\t\"o\",\n\t\t\"O\"\n\t],\n\tresolve: (source) => {\n\t\tif (TRUE_VALUES.indexOf(source) !== -1) return true;\n\t\tif (FALSE_VALUES.indexOf(source) !== -1) return false;\n\t\treturn NOT_RESOLVED;\n\t},\n\tidentify: (object) => Object.prototype.toString.call(object) === \"[object Boolean]\",\n\trepresent: (object) => object ? \"true\" : \"false\"\n});\n//#endregion\n//#region src/tag/scalar/int_core.ts\nvar YAML_INTEGER_IMPLICIT_PATTERN$1 = /* @__PURE__ */ new RegExp(\"^(?:0o[0-7]+|0x[0-9a-fA-F]+|[-+]?[0-9]+)$\");\nvar YAML_INTEGER_EXPLICIT_PATTERN$1 = /* @__PURE__ */ new RegExp(\"^(?:[-+]?0b[0-1]+|[-+]?0o[0-7]+|[-+]?0x[0-9a-fA-F]+|[-+]?[0-9]+)$\");\nfunction parseYamlInteger$2(source) {\n\tlet value = source;\n\tlet sign = 1;\n\tif (value[0] === \"-\" || value[0] === \"+\") {\n\t\tif (value[0] === \"-\") sign = -1;\n\t\tvalue = value.slice(1);\n\t}\n\tif (value.startsWith(\"0b\")) return sign * parseInt(value.slice(2), 2);\n\tif (value.startsWith(\"0o\")) return sign * parseInt(value.slice(2), 8);\n\tif (value.startsWith(\"0x\")) return sign * parseInt(value.slice(2), 16);\n\treturn sign * parseInt(value, 10);\n}\nfunction resolveYamlInteger$2(source, isExplicit) {\n\tif (isExplicit) {\n\t\tif (!YAML_INTEGER_EXPLICIT_PATTERN$1.test(source)) return NOT_RESOLVED;\n\t} else if (!YAML_INTEGER_IMPLICIT_PATTERN$1.test(source)) return NOT_RESOLVED;\n\tconst result = parseYamlInteger$2(source);\n\treturn Number.isFinite(result) ? result : NOT_RESOLVED;\n}\nvar intCoreTag = defineScalarTag(\"tag:yaml.org,2002:int\", {\n\timplicit: true,\n\timplicitFirstChars: [\n\t\t\"-\",\n\t\t\"+\",\n\t\t...\"0123456789\"\n\t],\n\tresolve: resolveYamlInteger$2,\n\tidentify: (object) => Number.isInteger(object) && !Object.is(object, -0) && object.toString(10).indexOf(\"e\") < 0,\n\trepresent: (object) => object.toString(10)\n});\n//#endregion\n//#region src/tag/scalar/int_json.ts\nvar YAML_INTEGER_IMPLICIT_PATTERN = /* @__PURE__ */ new RegExp(\"^-?(?:0|[1-9][0-9]*)$\");\nvar YAML_INTEGER_EXPLICIT_PATTERN = /* @__PURE__ */ new RegExp(\"^(?:[-+]?0b[0-1]+|[-+]?0o[0-7]+|[-+]?0x[0-9a-fA-F]+|[-+]?[0-9]+)$\");\nfunction parseYamlInteger$1(source) {\n\tlet value = source;\n\tlet sign = 1;\n\tif (value[0] === \"-\" || value[0] === \"+\") {\n\t\tif (value[0] === \"-\") sign = -1;\n\t\tvalue = value.slice(1);\n\t}\n\tif (value.startsWith(\"0b\")) return sign * parseInt(value.slice(2), 2);\n\tif (value.startsWith(\"0o\")) return sign * parseInt(value.slice(2), 8);\n\tif (value.startsWith(\"0x\")) return sign * parseInt(value.slice(2), 16);\n\treturn sign * parseInt(value, 10);\n}\nfunction resolveYamlInteger$1(source, isExplicit) {\n\tif (isExplicit) {\n\t\tif (!YAML_INTEGER_EXPLICIT_PATTERN.test(source)) return NOT_RESOLVED;\n\t} else if (!YAML_INTEGER_IMPLICIT_PATTERN.test(source)) return NOT_RESOLVED;\n\tconst result = parseYamlInteger$1(source);\n\treturn Number.isFinite(result) ? result : NOT_RESOLVED;\n}\nvar intJsonTag = defineScalarTag(\"tag:yaml.org,2002:int\", {\n\timplicit: true,\n\timplicitFirstChars: [\"-\", ...\"0123456789\"],\n\tresolve: resolveYamlInteger$1,\n\tidentify: (object) => Number.isInteger(object) && !Object.is(object, -0) && object.toString(10).indexOf(\"e\") < 0,\n\trepresent: (object) => object.toString(10)\n});\n//#endregion\n//#region src/tag/scalar/int_yaml11.ts\nvar YAML_INTEGER_PATTERN = /* @__PURE__ */ new RegExp(\"^(?:[-+]?0b[0-1_]+|[-+]?0[0-7_]+|[-+]?0x[0-9a-fA-F_]+|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+|[-+]?(?:0|[1-9][0-9_]*))$\");\nfunction parseYamlInteger(source) {\n\tlet value = source.replace(/_/g, \"\");\n\tlet sign = 1;\n\tif (value[0] === \"-\" || value[0] === \"+\") {\n\t\tif (value[0] === \"-\") sign = -1;\n\t\tvalue = value.slice(1);\n\t}\n\tif (value.startsWith(\"0b\")) return sign * parseInt(value.slice(2), 2);\n\tif (value.startsWith(\"0x\")) return sign * parseInt(value.slice(2), 16);\n\tif (value.includes(\":\")) {\n\t\tlet result = 0;\n\t\tfor (const part of value.split(\":\")) result = result * 60 + Number(part);\n\t\treturn sign * result;\n\t}\n\tif (value !== \"0\" && value[0] === \"0\") return sign * parseInt(value, 8);\n\treturn sign * parseInt(value, 10);\n}\nfunction resolveYamlInteger(source) {\n\tif (!YAML_INTEGER_PATTERN.test(source)) return NOT_RESOLVED;\n\tconst result = parseYamlInteger(source);\n\treturn Number.isFinite(result) ? result : NOT_RESOLVED;\n}\nvar intYaml11Tag = defineScalarTag(\"tag:yaml.org,2002:int\", {\n\timplicit: true,\n\timplicitFirstChars: [\n\t\t\"-\",\n\t\t\"+\",\n\t\t...\"0123456789\"\n\t],\n\tresolve: resolveYamlInteger,\n\tidentify: (object) => Number.isInteger(object) && !Object.is(object, -0) && object.toString(10).indexOf(\"e\") < 0,\n\trepresent: (object) => object.toString(10)\n});\n//#endregion\n//#region src/tag/scalar/float_core.ts\nvar YAML_FLOAT_PATTERN$1 = /* @__PURE__ */ new RegExp(\"^(?:[-+]?[0-9]+(?:\\\\.[0-9]*)?(?:[eE][-+]?[0-9]+)?|[-+]?\\\\.[0-9]+(?:[eE][-+]?[0-9]+)?|[-+]?\\\\.(?:inf|Inf|INF)|\\\\.(?:nan|NaN|NAN))$\");\nvar YAML_FLOAT_SPECIAL_PATTERN$1 = /* @__PURE__ */ new RegExp(\"^(?:[-+]?\\\\.(?:inf|Inf|INF)|\\\\.(?:nan|NaN|NAN))$\");\nfunction resolveYamlFloat$2(source) {\n\tif (!YAML_FLOAT_PATTERN$1.test(source)) return NOT_RESOLVED;\n\tlet value = source.toLowerCase();\n\tconst sign = value[0] === \"-\" ? -1 : 1;\n\tif (\"+-\".includes(value[0])) value = value.slice(1);\n\tif (value === \".inf\") return sign === 1 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;\n\tif (value === \".nan\") return NaN;\n\tconst result = sign * parseFloat(value);\n\tif (Number.isFinite(result) || YAML_FLOAT_SPECIAL_PATTERN$1.test(source)) return result;\n\treturn NOT_RESOLVED;\n}\nfunction representYamlFloat$2(object) {\n\tif (isNaN(object)) return \".nan\";\n\tif (object === Number.POSITIVE_INFINITY) return \".inf\";\n\tif (object === Number.NEGATIVE_INFINITY) return \"-.inf\";\n\tif (Object.is(object, -0)) return \"-0.0\";\n\tconst result = object.toString(10);\n\treturn /^[-+]?[0-9]+e/.test(result) ? result.replace(\"e\", \".e\") : result;\n}\nvar floatCoreTag = defineScalarTag(\"tag:yaml.org,2002:float\", {\n\timplicit: true,\n\timplicitFirstChars: [\n\t\t\"-\",\n\t\t\"+\",\n\t\t\".\",\n\t\t...\"0123456789\"\n\t],\n\tresolve: resolveYamlFloat$2,\n\tidentify: (object) => typeof object === \"number\" && (!Number.isInteger(object) || Object.is(object, -0) || object.toString(10).indexOf(\"e\") >= 0),\n\trepresent: representYamlFloat$2\n});\n//#endregion\n//#region src/tag/scalar/float_json.ts\nvar YAML_FLOAT_IMPLICIT_PATTERN = /* @__PURE__ */ new RegExp(\"^-?(?:0|[1-9][0-9]*)(?:\\\\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$\");\nvar YAML_FLOAT_EXPLICIT_PATTERN = /* @__PURE__ */ new RegExp(\"^(?:[-+]?[0-9]+(?:\\\\.[0-9]*)?(?:[eE][-+]?[0-9]+)?|[-+]?\\\\.[0-9]+(?:[eE][-+]?[0-9]+)?|[-+]?\\\\.(?:inf|Inf|INF)|\\\\.(?:nan|NaN|NAN))$\");\nfunction resolveYamlFloat$1(source, isExplicit) {\n\tif (isExplicit) {\n\t\tif (!YAML_FLOAT_EXPLICIT_PATTERN.test(source)) return NOT_RESOLVED;\n\t\tlet value = source.toLowerCase();\n\t\tconst sign = value[0] === \"-\" ? -1 : 1;\n\t\tif (\"+-\".includes(value[0])) value = value.slice(1);\n\t\tif (value === \".inf\") return sign === 1 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;\n\t\tif (value === \".nan\") return NaN;\n\t\tconst result = sign * parseFloat(value);\n\t\treturn Number.isFinite(result) ? result : NOT_RESOLVED;\n\t}\n\tif (!YAML_FLOAT_IMPLICIT_PATTERN.test(source)) return NOT_RESOLVED;\n\tconst result = Number(source);\n\tif (Number.isFinite(result)) return result;\n\treturn NOT_RESOLVED;\n}\nfunction representYamlFloat$1(object) {\n\tif (isNaN(object)) return \".nan\";\n\tif (object === Number.POSITIVE_INFINITY) return \".inf\";\n\tif (object === Number.NEGATIVE_INFINITY) return \"-.inf\";\n\tif (Object.is(object, -0)) return \"-0.0\";\n\tconst result = object.toString(10);\n\treturn /^[-+]?[0-9]+e/.test(result) ? result.replace(\"e\", \".e\") : result;\n}\nvar floatJsonTag = defineScalarTag(\"tag:yaml.org,2002:float\", {\n\timplicit: true,\n\timplicitFirstChars: [\"-\", ...\"0123456789\"],\n\tresolve: resolveYamlFloat$1,\n\tidentify: (object) => typeof object === \"number\" && (!Number.isInteger(object) || Object.is(object, -0) || object.toString(10).indexOf(\"e\") >= 0),\n\trepresent: representYamlFloat$1\n});\n//#endregion\n//#region src/tag/scalar/float_yaml11.ts\nvar YAML_FLOAT_PATTERN = /* @__PURE__ */ new RegExp(\"^(?:[-+]?(?:(?:[0-9][0-9_]*)?\\\\.[0-9_]*)(?:[eE][-+][0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\\\.[0-9_]*|[-+]?\\\\.(?:inf|Inf|INF)|\\\\.(?:nan|NaN|NAN))$\");\nvar YAML_FLOAT_SPECIAL_PATTERN = /* @__PURE__ */ new RegExp(\"^(?:[-+]?\\\\.(?:inf|Inf|INF)|\\\\.(?:nan|NaN|NAN))$\");\nfunction resolveYamlFloat(source) {\n\tif (!YAML_FLOAT_PATTERN.test(source)) return NOT_RESOLVED;\n\tlet value = source.toLowerCase().replace(/_/g, \"\");\n\tconst sign = value[0] === \"-\" ? -1 : 1;\n\tif (\"+-\".includes(value[0])) value = value.slice(1);\n\tif (value === \".inf\") return sign === 1 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;\n\tif (value === \".nan\") return NaN;\n\tlet result = 0;\n\tif (value.includes(\":\")) {\n\t\tfor (const part of value.split(\":\")) result = result * 60 + Number(part);\n\t\tresult *= sign;\n\t} else result = sign * parseFloat(value);\n\tif (Number.isFinite(result) || YAML_FLOAT_SPECIAL_PATTERN.test(source)) return result;\n\treturn NOT_RESOLVED;\n}\nfunction representYamlFloat(object) {\n\tif (isNaN(object)) return \".nan\";\n\tif (object === Number.POSITIVE_INFINITY) return \".inf\";\n\tif (object === Number.NEGATIVE_INFINITY) return \"-.inf\";\n\tif (Object.is(object, -0)) return \"-0.0\";\n\tconst result = object.toString(10);\n\treturn /^[-+]?[0-9]+e/.test(result) ? result.replace(\"e\", \".e\") : result;\n}\nvar floatYaml11Tag = defineScalarTag(\"tag:yaml.org,2002:float\", {\n\timplicit: true,\n\timplicitFirstChars: [\n\t\t\"-\",\n\t\t\"+\",\n\t\t\".\",\n\t\t...\"0123456789\"\n\t],\n\tresolve: resolveYamlFloat,\n\tidentify: (object) => typeof object === \"number\" && (!Number.isInteger(object) || Object.is(object, -0) || object.toString(10).indexOf(\"e\") >= 0),\n\trepresent: representYamlFloat\n});\n//#endregion\n//#region src/tag/scalar/merge.ts\nvar mergeTag = defineScalarTag(\"tag:yaml.org,2002:merge\", {\n\timplicit: true,\n\timplicitFirstChars: [\"<\"],\n\tresolve: (source, isExplicit) => {\n\t\tif (source === \"<<\" || isExplicit && source === \"\") return MERGE_KEY;\n\t\treturn NOT_RESOLVED;\n\t}\n});\n//#endregion\n//#region src/tag/scalar/binary.ts\nvar BASE64_PATTERN = /^[A-Za-z0-9+/]*={0,2}$/;\nfunction resolveYamlBinary(source) {\n\tconst input = source.replace(/\\s/g, \"\");\n\tif (input.length % 4 !== 0 || !BASE64_PATTERN.test(input)) return NOT_RESOLVED;\n\tconst binary = atob(input);\n\tconst result = new Uint8Array(binary.length);\n\tfor (let index = 0; index < binary.length; index++) result[index] = binary.charCodeAt(index);\n\treturn result;\n}\nfunction representYamlBinary(object) {\n\tlet binary = \"\";\n\tfor (let index = 0; index < object.length; index++) binary += String.fromCharCode(object[index]);\n\treturn btoa(binary);\n}\nvar binaryTag = defineScalarTag(\"tag:yaml.org,2002:binary\", {\n\tresolve: resolveYamlBinary,\n\tidentify: (object) => Object.prototype.toString.call(object) === \"[object Uint8Array]\",\n\trepresent: representYamlBinary\n});\n//#endregion\n//#region src/tag/scalar/timestamp.ts\nvar YAML_DATE_REGEXP = /* @__PURE__ */ new RegExp(\"^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$\");\nvar YAML_TIMESTAMP_REGEXP = /* @__PURE__ */ new RegExp(\"^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\\\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\\\.([0-9]*))?(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$\");\nfunction resolveYamlTimestamp(source) {\n\tlet match = YAML_DATE_REGEXP.exec(source);\n\tif (match === null) match = YAML_TIMESTAMP_REGEXP.exec(source);\n\tif (match === null) return NOT_RESOLVED;\n\tconst year = +match[1];\n\tconst month = +match[2] - 1;\n\tconst day = +match[3];\n\tif (!match[4]) {\n\t\tconst date = new Date(Date.UTC(year, month, day));\n\t\tif (date.getUTCFullYear() !== year || date.getUTCMonth() !== month || date.getUTCDate() !== day) return NOT_RESOLVED;\n\t\treturn date;\n\t}\n\tconst hour = +match[4];\n\tconst minute = +match[5];\n\tconst second = +match[6];\n\tlet fraction = 0;\n\tif (hour > 23 || minute > 59 || second > 59) return NOT_RESOLVED;\n\tif (match[7]) {\n\t\tlet value = match[7].slice(0, 3);\n\t\twhile (value.length < 3) value += \"0\";\n\t\tfraction = +value;\n\t}\n\tconst date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));\n\tif (date.getUTCFullYear() !== year || date.getUTCMonth() !== month || date.getUTCDate() !== day) return NOT_RESOLVED;\n\tif (match[9]) {\n\t\tconst offsetHour = +match[10];\n\t\tconst offsetMinute = +(match[11] || 0);\n\t\tif (offsetHour > 23 || offsetMinute > 59) return NOT_RESOLVED;\n\t\tconst offset = (offsetHour * 60 + offsetMinute) * 6e4;\n\t\tdate.setTime(date.getTime() - (match[9] === \"-\" ? -offset : offset));\n\t}\n\treturn date;\n}\nvar timestampTag = defineScalarTag(\"tag:yaml.org,2002:timestamp\", {\n\timplicit: true,\n\timplicitFirstChars: [...\"0123456789\"],\n\tresolve: resolveYamlTimestamp,\n\tidentify: (object) => object instanceof Date,\n\trepresent: (object) => object.toISOString()\n});\n//#endregion\n//#region src/tag/sequence/seq.ts\nvar seqTag = defineSequenceTag(\"tag:yaml.org,2002:seq\", {\n\tcreate: () => [],\n\taddItem: (container, item) => {\n\t\tcontainer.push(item);\n\t},\n\tidentify: Array.isArray\n});\n//#endregion\n//#region src/common/object.ts\nfunction isPlainObject(data) {\n\tif (data === null || typeof data !== \"object\" || Array.isArray(data)) return false;\n\tconst prototype = Object.getPrototypeOf(data);\n\treturn prototype === null || prototype === Object.prototype;\n}\nfunction pick(object, keys) {\n\tconst result = {};\n\tfor (const key of keys) if (object[key] !== void 0) result[key] = object[key];\n\treturn result;\n}\n//#endregion\n//#region src/tag/sequence/omap.ts\nvar omapTag = defineSequenceTag(\"tag:yaml.org,2002:omap\", {\n\tcreate: () => ({\n\t\tlist: [],\n\t\tseen: /* @__PURE__ */ new Set()\n\t}),\n\taddItem: (carrier, item) => {\n\t\tlet key;\n\t\tif (item instanceof Map) {\n\t\t\tif (item.size !== 1) return \"cannot resolve an ordered map item\";\n\t\t\tkey = item.keys().next().value;\n\t\t} else if (isPlainObject(item)) {\n\t\t\tconst itemKeys = Object.keys(item);\n\t\t\tif (itemKeys.length !== 1) return \"cannot resolve an ordered map item\";\n\t\t\tkey = itemKeys[0];\n\t\t} else return \"cannot resolve an ordered map item\";\n\t\tif (carrier.seen.has(key)) return \"duplicate key in ordered map\";\n\t\tcarrier.seen.add(key);\n\t\tcarrier.list.push(item);\n\t\treturn \"\";\n\t},\n\tfinalize: (carrier) => carrier.list\n});\n//#endregion\n//#region src/tag/sequence/pairs.ts\nvar pairsTag = defineSequenceTag(\"tag:yaml.org,2002:pairs\", {\n\tcreate: () => [],\n\taddItem: (container, item) => {\n\t\tif (item instanceof Map) {\n\t\t\tif (item.size !== 1) return \"cannot resolve a pairs item\";\n\t\t\tcontainer.push(item.entries().next().value);\n\t\t\treturn \"\";\n\t\t}\n\t\tif (Object.prototype.toString.call(item) !== \"[object Object]\") return \"cannot resolve a pairs item\";\n\t\tconst object = item;\n\t\tconst keys = Object.keys(object);\n\t\tif (keys.length !== 1) return \"cannot resolve a pairs item\";\n\t\tcontainer.push([keys[0], object[keys[0]]]);\n\t\treturn \"\";\n\t}\n});\n//#endregion\n//#region src/tag/mapping/map.ts\nvar mapTag = defineMappingTag(\"tag:yaml.org,2002:map\", {\n\tcreate: () => ({}),\n\tidentify: isPlainObject,\n\trepresent: (o) => {\n\t\tconst map = /* @__PURE__ */ new Map();\n\t\tfor (const key of Object.keys(o)) map.set(key, o[key]);\n\t\treturn map;\n\t},\n\taddPair: (container, key, value) => {\n\t\tif (key !== null && typeof key === \"object\") return \"object-based map does not support complex keys\";\n\t\tconst normalizedKey = String(key);\n\t\tif (normalizedKey === \"__proto__\") Object.defineProperty(container, normalizedKey, {\n\t\t\tvalue,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t\twritable: true\n\t\t});\n\t\telse container[normalizedKey] = value;\n\t\treturn \"\";\n\t},\n\thas: (container, key) => {\n\t\tif (key !== null && typeof key === \"object\") return false;\n\t\treturn Object.prototype.hasOwnProperty.call(container, String(key));\n\t},\n\tkeys: (container) => Object.keys(container),\n\tget: (container, key) => container[String(key)]\n});\n//#endregion\n//#region src/tag/mapping/set.ts\nvar setTag = defineMappingTag(\"tag:yaml.org,2002:set\", {\n\tcreate: () => /* @__PURE__ */ new Set(),\n\tidentify: (data) => data instanceof Set,\n\trepresent: (data) => {\n\t\tconst map = /* @__PURE__ */ new Map();\n\t\tfor (const key of data) map.set(key, null);\n\t\treturn map;\n\t},\n\taddPair: (container, key, value) => {\n\t\tif (value !== null) return \"cannot resolve a set item\";\n\t\tcontainer.add(key);\n\t\treturn \"\";\n\t},\n\thas: (container, key) => container.has(key),\n\tkeys: (container) => container.keys(),\n\tget: () => null\n});\n//#endregion\n//#region src/schema.ts\nfunction createTagDefinitionMap() {\n\treturn {\n\t\tscalar: {},\n\t\tsequence: {},\n\t\tmapping: {}\n\t};\n}\nfunction createTagDefinitionListMap() {\n\treturn {\n\t\tscalar: [],\n\t\tsequence: [],\n\t\tmapping: []\n\t};\n}\nfunction compileTags(tags) {\n\tconst result = [];\n\tfor (const tag of tags) {\n\t\tlet index = result.length;\n\t\tfor (let previousIndex = 0; previousIndex < result.length; previousIndex++) {\n\t\t\tconst previous = result[previousIndex];\n\t\t\tif (previous.nodeKind === tag.nodeKind && previous.tagName === tag.tagName && previous.matchByTagPrefix === tag.matchByTagPrefix) {\n\t\t\t\tindex = previousIndex;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tresult[index] = tag;\n\t}\n\treturn result;\n}\nvar Schema = class Schema {\n\ttags;\n\timplicitScalarTags;\n\timplicitScalarByFirstChar;\n\timplicitScalarAnyFirstChar;\n\tdefaultScalarTag;\n\tdefaultSequenceTag;\n\tdefaultMappingTag;\n\texact;\n\tprefix;\n\tconstructor(tags) {\n\t\tconst compiledTags = compileTags(tags);\n\t\tconst implicitScalarTags = [];\n\t\tconst exact = createTagDefinitionMap();\n\t\tconst prefix = createTagDefinitionListMap();\n\t\tfor (const tag of compiledTags) {\n\t\t\tif (tag.nodeKind === \"scalar\" && tag.implicit) {\n\t\t\t\tif (tag.matchByTagPrefix) throw new Error(\"Implicit scalar tags cannot match by tag prefix\");\n\t\t\t\timplicitScalarTags.push(tag);\n\t\t\t}\n\t\t\tswitch (tag.nodeKind) {\n\t\t\t\tcase \"scalar\":\n\t\t\t\t\tif (tag.matchByTagPrefix) prefix.scalar.push(tag);\n\t\t\t\t\telse exact.scalar[tag.tagName] = tag;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"sequence\":\n\t\t\t\t\tif (tag.matchByTagPrefix) prefix.sequence.push(tag);\n\t\t\t\t\telse exact.sequence[tag.tagName] = tag;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"mapping\":\n\t\t\t\t\tif (tag.matchByTagPrefix) prefix.mapping.push(tag);\n\t\t\t\t\telse exact.mapping[tag.tagName] = tag;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tconst implicitScalarAnyFirstChar = implicitScalarTags.filter((tag) => tag.implicitFirstChars === null);\n\t\tconst keys = /* @__PURE__ */ new Set();\n\t\tfor (const tag of implicitScalarTags) if (tag.implicitFirstChars !== null) for (const key of tag.implicitFirstChars) keys.add(key);\n\t\tconst implicitScalarByFirstChar = /* @__PURE__ */ new Map();\n\t\tfor (const key of keys) implicitScalarByFirstChar.set(key, implicitScalarTags.filter((tag) => tag.implicitFirstChars === null || tag.implicitFirstChars.indexOf(key) !== -1));\n\t\tconst defaultScalarTag = exact.scalar[\"tag:yaml.org,2002:str\"];\n\t\tif (!defaultScalarTag) throw new Error(\"schema does not define the default scalar tag (tag:yaml.org,2002:str)\");\n\t\tthis.tags = compiledTags;\n\t\tthis.implicitScalarTags = implicitScalarTags;\n\t\tthis.implicitScalarByFirstChar = implicitScalarByFirstChar;\n\t\tthis.implicitScalarAnyFirstChar = implicitScalarAnyFirstChar;\n\t\tthis.defaultScalarTag = defaultScalarTag;\n\t\tthis.defaultSequenceTag = exact.sequence[\"tag:yaml.org,2002:seq\"];\n\t\tthis.defaultMappingTag = exact.mapping[\"tag:yaml.org,2002:map\"];\n\t\tthis.exact = exact;\n\t\tthis.prefix = prefix;\n\t}\n\twithTags(...tags) {\n\t\tlet flatTags = [];\n\t\tfor (const tag of tags) flatTags = flatTags.concat(tag);\n\t\treturn new Schema([...this.tags, ...flatTags]);\n\t}\n};\nvar FAILSAFE_SCHEMA = new Schema([\n\tstrTag,\n\tseqTag,\n\tmapTag\n]);\nvar JSON_SCHEMA = new Schema([\n\t...FAILSAFE_SCHEMA.tags,\n\tnullJsonTag,\n\tboolJsonTag,\n\tintJsonTag,\n\tfloatJsonTag\n]);\nvar CORE_SCHEMA = new Schema([\n\t...FAILSAFE_SCHEMA.tags,\n\tnullCoreTag,\n\tboolCoreTag,\n\tintCoreTag,\n\tfloatCoreTag\n]);\nvar YAML11_SCHEMA = new Schema([\n\t...FAILSAFE_SCHEMA.tags,\n\tnullYaml11Tag,\n\tboolYaml11Tag,\n\tintYaml11Tag,\n\tfloatYaml11Tag,\n\ttimestampTag,\n\tmergeTag,\n\tbinaryTag,\n\tomapTag,\n\tpairsTag,\n\tsetTag\n]);\n//#endregion\n//#region src/tag/mapping/real_map.ts\nvar realMapTag = defineMappingTag(\"tag:yaml.org,2002:map\", {\n\tcreate: () => /* @__PURE__ */ new Map(),\n\taddPair: (container, key, value) => {\n\t\tcontainer.set(key, value);\n\t\treturn \"\";\n\t},\n\thas: (container, key) => container.has(key),\n\tkeys: (container) => container.keys(),\n\tget: (container, key) => container.get(key),\n\tidentify: (data) => data instanceof Map || isPlainObject(data),\n\trepresent: (data) => {\n\t\tif (data instanceof Map) return data;\n\t\tconst map = /* @__PURE__ */ new Map();\n\t\tconst obj = data;\n\t\tfor (const key of Object.keys(obj)) map.set(key, obj[key]);\n\t\treturn map;\n\t}\n});\n//#endregion\n//#region src/tag/mapping/legacy_map.ts\nfunction normalizeKey(key) {\n\tif (Array.isArray(key)) {\n\t\tconst array = Array.prototype.slice.call(key);\n\t\tfor (let index = 0; index < array.length; index++) {\n\t\t\tif (Array.isArray(array[index])) return null;\n\t\t\tif (typeof array[index] === \"object\" && Object.prototype.toString.call(array[index]) === \"[object Object]\") array[index] = \"[object Object]\";\n\t\t}\n\t\treturn String(array);\n\t}\n\tif (typeof key === \"object\" && Object.prototype.toString.call(key) === \"[object Object]\") return \"[object Object]\";\n\treturn String(key);\n}\nvar legacyMapTag = defineMappingTag(\"tag:yaml.org,2002:map\", {\n\tcreate: () => ({}),\n\tidentify: isPlainObject,\n\trepresent: (o) => {\n\t\tconst map = /* @__PURE__ */ new Map();\n\t\tfor (const key of Object.keys(o)) map.set(key, o[key]);\n\t\treturn map;\n\t},\n\taddPair: (container, key, value) => {\n\t\tconst normalizedKey = normalizeKey(key);\n\t\tif (normalizedKey === null) return \"nested arrays are not supported inside keys\";\n\t\tif (normalizedKey === \"__proto__\") Object.defineProperty(container, normalizedKey, {\n\t\t\tvalue,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t\twritable: true\n\t\t});\n\t\telse container[normalizedKey] = value;\n\t\treturn \"\";\n\t},\n\thas: (container, key) => {\n\t\tconst normalizedKey = normalizeKey(key);\n\t\treturn normalizedKey !== null && Object.prototype.hasOwnProperty.call(container, normalizedKey);\n\t},\n\tkeys: (container) => Object.keys(container),\n\tget: (container, key) => container[String(key)]\n});\n//#endregion\n//#region src/common/snippet.ts\nvar DEFAULT_SNIPPET_OPTIONS = {\n\tmaxLength: 79,\n\tindent: 1,\n\tlinesBefore: 3,\n\tlinesAfter: 2\n};\nfunction getLine(buffer, lineStart, lineEnd, position, maxLineLength) {\n\tlet head = \"\";\n\tlet tail = \"\";\n\tconst maxHalfLength = Math.floor(maxLineLength / 2) - 1;\n\tif (position - lineStart > maxHalfLength) {\n\t\thead = \" ... \";\n\t\tlineStart = position - maxHalfLength + head.length;\n\t}\n\tif (lineEnd - position > maxHalfLength) {\n\t\ttail = \" ...\";\n\t\tlineEnd = position + maxHalfLength - tail.length;\n\t}\n\treturn {\n\t\tstr: head + buffer.slice(lineStart, lineEnd).replace(/\\t/g, \"→\") + tail,\n\t\tpos: position - lineStart + head.length\n\t};\n}\nfunction padStart(string, max) {\n\treturn \" \".repeat(Math.max(max - string.length, 0)) + string;\n}\nfunction makeSnippet(mark, options) {\n\tif (!mark.buffer) return null;\n\tconst opts = {\n\t\t...DEFAULT_SNIPPET_OPTIONS,\n\t\t...options\n\t};\n\tconst re = /\\r?\\n|\\r|\\0/g;\n\tconst lineStarts = [0];\n\tconst lineEnds = [];\n\tlet match;\n\tlet foundLineNo = -1;\n\twhile (match = re.exec(mark.buffer)) {\n\t\tlineEnds.push(match.index);\n\t\tlineStarts.push(match.index + match[0].length);\n\t\tif (mark.position <= match.index && foundLineNo < 0) foundLineNo = lineStarts.length - 2;\n\t}\n\tif (foundLineNo < 0) foundLineNo = lineStarts.length - 1;\n\tlet result = \"\";\n\tconst lineNoLength = Math.min(mark.line + opts.linesAfter, lineEnds.length).toString().length;\n\tconst maxLineLength = opts.maxLength - (opts.indent + lineNoLength + 3);\n\tfor (let i = 1; i <= opts.linesBefore; i++) {\n\t\tif (foundLineNo - i < 0) break;\n\t\tconst line = getLine(mark.buffer, lineStarts[foundLineNo - i], lineEnds[foundLineNo - i], mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo - i]), maxLineLength);\n\t\tresult = `${\" \".repeat(opts.indent)}${padStart((mark.line - i + 1).toString(), lineNoLength)} | ${line.str}\\n${result}`;\n\t}\n\tconst line = getLine(mark.buffer, lineStarts[foundLineNo], lineEnds[foundLineNo], mark.position, maxLineLength);\n\tresult += `${\" \".repeat(opts.indent)}${padStart((mark.line + 1).toString(), lineNoLength)} | ${line.str}\\n`;\n\tresult += `${\"-\".repeat(opts.indent + lineNoLength + 3 + line.pos)}^\\n`;\n\tfor (let i = 1; i <= opts.linesAfter; i++) {\n\t\tif (foundLineNo + i >= lineEnds.length) break;\n\t\tconst line = getLine(mark.buffer, lineStarts[foundLineNo + i], lineEnds[foundLineNo + i], mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo + i]), maxLineLength);\n\t\tresult += `${\" \".repeat(opts.indent)}${padStart((mark.line + i + 1).toString(), lineNoLength)} | ${line.str}\\n`;\n\t}\n\treturn result.replace(/\\n$/, \"\");\n}\n//#endregion\n//#region src/common/exception.ts\nfunction formatError(exception, compact) {\n\tlet where = \"\";\n\tif (!exception.mark) return exception.reason;\n\tif (exception.mark.name) where += `in \"${exception.mark.name}\" `;\n\twhere += `(${exception.mark.line + 1}:${exception.mark.column + 1})`;\n\tif (!compact && exception.mark.snippet) where += `\\n\\n${exception.mark.snippet}`;\n\treturn `${exception.reason} ${where}`;\n}\nvar YAMLException = class extends Error {\n\treason;\n\tmark;\n\tconstructor(reason, mark) {\n\t\tsuper();\n\t\tthis.name = \"YAMLException\";\n\t\tthis.reason = reason;\n\t\tthis.mark = mark;\n\t\tthis.message = formatError(this, false);\n\t\tif (Error.captureStackTrace) Error.captureStackTrace(this, this.constructor);\n\t}\n\ttoString(compact) {\n\t\treturn `${this.name}: ${formatError(this, compact)}`;\n\t}\n};\nfunction throwErrorAt(source, position, message, filename = \"\") {\n\tlet line = 0;\n\tlet lineStart = 0;\n\tfor (let index = 0; index < position; index++) {\n\t\tconst ch = source.charCodeAt(index);\n\t\tif (ch === 10) {\n\t\t\tline++;\n\t\t\tlineStart = index + 1;\n\t\t} else if (ch === 13) {\n\t\t\tline++;\n\t\t\tif (source.charCodeAt(index + 1) === 10) index++;\n\t\t\tlineStart = index + 1;\n\t\t}\n\t}\n\tconst mark = {\n\t\tname: filename,\n\t\tbuffer: source,\n\t\tposition,\n\t\tline,\n\t\tcolumn: position - lineStart\n\t};\n\tmark.snippet = makeSnippet(mark);\n\tthrow new YAMLException(message, mark);\n}\n//#endregion\n//#region src/parser/events.ts\nvar EVENT_DOCUMENT = 1;\nvar EVENT_SEQUENCE = 2;\nvar EVENT_MAPPING = 3;\nvar EVENT_SCALAR = 4;\nvar EVENT_ALIAS = 5;\nvar EVENT_POP = 6;\nvar SCALAR_STYLE_PLAIN = 1;\nvar SCALAR_STYLE_SINGLE_QUOTED = 2;\nvar SCALAR_STYLE_DOUBLE_QUOTED = 3;\nvar SCALAR_STYLE_LITERAL_BLOCK = 4;\nvar SCALAR_STYLE_FOLDED_BLOCK = 5;\nvar COLLECTION_STYLE_BLOCK = 1;\nvar COLLECTION_STYLE_FLOW = 2;\nvar CHOMPING_CLIP = 1;\nvar CHOMPING_STRIP = 2;\nvar CHOMPING_KEEP = 3;\n//#endregion\n//#region src/parser/parser_scalar.ts\nvar NO_RANGE$3 = -1;\nfunction simpleEscapeSequence(c) {\n\tswitch (c) {\n\t\tcase 48: return \"\\0\";\n\t\tcase 97: return \"\\x07\";\n\t\tcase 98: return \"\\b\";\n\t\tcase 116: return \"\t\";\n\t\tcase 9: return \"\t\";\n\t\tcase 110: return \"\\n\";\n\t\tcase 118: return \"\\v\";\n\t\tcase 102: return \"\\f\";\n\t\tcase 114: return \"\\r\";\n\t\tcase 101: return \"\\x1B\";\n\t\tcase 32: return \" \";\n\t\tcase 34: return \"\\\"\";\n\t\tcase 47: return \"/\";\n\t\tcase 92: return \"\\\\\";\n\t\tcase 78: return \"
\";\n\t\tcase 95: return \"\\xA0\";\n\t\tcase 76: return \"\\u2028\";\n\t\tcase 80: return \"\\u2029\";\n\t\tdefault: return \"\";\n\t}\n}\nvar simpleEscapeCheck = new Array(256);\nvar simpleEscapeMap = new Array(256);\nfor (let i = 0; i < 256; i++) {\n\tsimpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0;\n\tsimpleEscapeMap[i] = simpleEscapeSequence(i);\n}\nfunction charFromCodepoint(c) {\n\tif (c <= 65535) return String.fromCharCode(c);\n\treturn String.fromCharCode((c - 65536 >> 10) + 55296, (c - 65536 & 1023) + 56320);\n}\nfunction fromHexCode$1(c) {\n\tif (c >= 48 && c <= 57) return c - 48;\n\treturn (c | 32) - 97 + 10;\n}\nfunction escapedHexLen$1(c) {\n\tif (c === 120) return 2;\n\tif (c === 117) return 4;\n\treturn 8;\n}\nfunction skipFoldedBreaks(input, position, end) {\n\tlet breaks = 0;\n\twhile (position < end) {\n\t\tconst ch = input.charCodeAt(position);\n\t\tif (ch === 10) {\n\t\t\tbreaks++;\n\t\t\tposition++;\n\t\t} else if (ch === 13) {\n\t\t\tbreaks++;\n\t\t\tposition++;\n\t\t\tif (input.charCodeAt(position) === 10) position++;\n\t\t} else if (ch === 32 || ch === 9) position++;\n\t\telse break;\n\t}\n\treturn {\n\t\tposition,\n\t\tbreaks\n\t};\n}\nfunction foldedBreaks(count) {\n\tif (count === 1) return \" \";\n\treturn \"\\n\".repeat(count - 1);\n}\nfunction getPlainValue(input, start, end) {\n\tlet result = \"\";\n\tlet position = start;\n\tlet captureStart = start;\n\tlet captureEnd = start;\n\twhile (position < end) {\n\t\tconst ch = input.charCodeAt(position);\n\t\tif (ch === 10 || ch === 13) {\n\t\t\tresult += input.slice(captureStart, captureEnd);\n\t\t\tconst fold = skipFoldedBreaks(input, position, end);\n\t\t\tresult += foldedBreaks(fold.breaks);\n\t\t\tposition = captureStart = captureEnd = fold.position;\n\t\t} else {\n\t\t\tposition++;\n\t\t\tif (ch !== 32 && ch !== 9) captureEnd = position;\n\t\t}\n\t}\n\treturn result + input.slice(captureStart, captureEnd);\n}\nfunction getSingleQuotedValue(input, start, end) {\n\tlet result = \"\";\n\tlet position = start;\n\tlet captureStart = start;\n\tlet captureEnd = start;\n\twhile (position < end) {\n\t\tconst ch = input.charCodeAt(position);\n\t\tif (ch === 39) {\n\t\t\tresult += input.slice(captureStart, position) + \"'\";\n\t\t\tposition += 2;\n\t\t\tcaptureStart = captureEnd = position;\n\t\t} else if (ch === 10 || ch === 13) {\n\t\t\tresult += input.slice(captureStart, captureEnd);\n\t\t\tconst fold = skipFoldedBreaks(input, position, end);\n\t\t\tresult += foldedBreaks(fold.breaks);\n\t\t\tposition = captureStart = captureEnd = fold.position;\n\t\t} else {\n\t\t\tposition++;\n\t\t\tif (ch !== 32 && ch !== 9) captureEnd = position;\n\t\t}\n\t}\n\treturn result + input.slice(captureStart, end);\n}\nfunction getDoubleQuotedValue(input, start, end) {\n\tlet result = \"\";\n\tlet position = start;\n\tlet captureStart = start;\n\tlet captureEnd = start;\n\twhile (position < end) {\n\t\tconst ch = input.charCodeAt(position);\n\t\tif (ch === 92) {\n\t\t\tresult += input.slice(captureStart, position);\n\t\t\tposition++;\n\t\t\tconst escaped = input.charCodeAt(position);\n\t\t\tif (escaped === 10 || escaped === 13) position = skipFoldedBreaks(input, position, end).position;\n\t\t\telse if (escaped < 256 && simpleEscapeCheck[escaped]) {\n\t\t\t\tresult += simpleEscapeMap[escaped];\n\t\t\t\tposition++;\n\t\t\t} else {\n\t\t\t\tlet hexLength = escapedHexLen$1(escaped);\n\t\t\t\tlet hexResult = 0;\n\t\t\t\tfor (; hexLength > 0; hexLength--) {\n\t\t\t\t\tposition++;\n\t\t\t\t\tconst digit = fromHexCode$1(input.charCodeAt(position));\n\t\t\t\t\thexResult = (hexResult << 4) + digit;\n\t\t\t\t}\n\t\t\t\tresult += charFromCodepoint(hexResult);\n\t\t\t\tposition++;\n\t\t\t}\n\t\t\tcaptureStart = captureEnd = position;\n\t\t} else if (ch === 10 || ch === 13) {\n\t\t\tresult += input.slice(captureStart, captureEnd);\n\t\t\tconst fold = skipFoldedBreaks(input, position, end);\n\t\t\tresult += foldedBreaks(fold.breaks);\n\t\t\tposition = captureStart = captureEnd = fold.position;\n\t\t} else {\n\t\t\tposition++;\n\t\t\tif (ch !== 32 && ch !== 9) captureEnd = position;\n\t\t}\n\t}\n\treturn result + input.slice(captureStart, end);\n}\nfunction getBlockValue(input, start, end, indent, chomping, folded) {\n\tconst textIndent = indent < 0 ? 0 : indent;\n\tconst region = input.slice(start, end).replace(/\\r\\n?/g, \"\\n\");\n\tconst lines = region === \"\" ? [] : (region.endsWith(\"\\n\") ? region.slice(0, -1) : region).split(\"\\n\");\n\tlet result = \"\";\n\tlet didReadContent = false;\n\tlet emptyLines = 0;\n\tlet atMoreIndented = false;\n\tfor (const line of lines) {\n\t\tlet column = 0;\n\t\twhile (column < textIndent && line.charCodeAt(column) === 32) column++;\n\t\tif (indent < 0 || column >= line.length) {\n\t\t\temptyLines++;\n\t\t\tcontinue;\n\t\t}\n\t\tconst content = line.slice(textIndent);\n\t\tconst first = content.charCodeAt(0);\n\t\tif (folded) if (first === 32 || first === 9) {\n\t\t\tatMoreIndented = true;\n\t\t\tresult += \"\\n\".repeat(didReadContent ? 1 + emptyLines : emptyLines);\n\t\t} else if (atMoreIndented) {\n\t\t\tatMoreIndented = false;\n\t\t\tresult += \"\\n\".repeat(emptyLines + 1);\n\t\t} else if (emptyLines === 0) {\n\t\t\tif (didReadContent) result += \" \";\n\t\t} else result += \"\\n\".repeat(emptyLines);\n\t\telse result += \"\\n\".repeat(didReadContent ? 1 + emptyLines : emptyLines);\n\t\tresult += content;\n\t\tdidReadContent = true;\n\t\temptyLines = 0;\n\t}\n\tif (chomping === 3) result += \"\\n\".repeat(didReadContent ? 1 + emptyLines : emptyLines);\n\telse if (chomping !== 2) {\n\t\tif (didReadContent) result += \"\\n\";\n\t}\n\treturn result;\n}\nfunction getScalarValue(input, scalar) {\n\tif (scalar.valueStart === NO_RANGE$3) return \"\";\n\tconst { valueStart, valueEnd } = scalar;\n\tif (scalar.fast) return input.slice(valueStart, valueEnd);\n\tswitch (scalar.style) {\n\t\tcase 2: return getSingleQuotedValue(input, valueStart, valueEnd);\n\t\tcase 3: return getDoubleQuotedValue(input, valueStart, valueEnd);\n\t\tcase 4: return getBlockValue(input, valueStart, valueEnd, scalar.indent, scalar.chomping, false);\n\t\tcase 5: return getBlockValue(input, valueStart, valueEnd, scalar.indent, scalar.chomping, true);\n\t\tdefault: return getPlainValue(input, valueStart, valueEnd);\n\t}\n}\n//#endregion\n//#region src/common/tagname.ts\nvar DEFAULT_TAG_HANDLERS = {\n\t\"!\": \"!\",\n\t\"!!\": \"tag:yaml.org,2002:\"\n};\nfunction tagPercentEncode(source) {\n\treturn encodeURI(source).replace(/!/g, \"%21\");\n}\nfunction tagNameFull(rawTag, tagHandlers) {\n\tif (rawTag.startsWith(\"!<\") && rawTag.endsWith(\">\")) return decodeURIComponent(rawTag.slice(2, -1));\n\tconst handleEnd = rawTag.indexOf(\"!\", 1);\n\tconst handle = handleEnd === -1 ? \"!\" : rawTag.slice(0, handleEnd + 1);\n\tconst prefix = tagHandlers?.[handle] ?? DEFAULT_TAG_HANDLERS[handle] ?? handle;\n\treturn decodeURIComponent(prefix) + decodeURIComponent(rawTag.slice(handle.length));\n}\nfunction tagNameShort(fullTag) {\n\tlet tag = fullTag;\n\tif (tag.charCodeAt(0) === 33) {\n\t\ttag = tag.slice(1);\n\t\treturn `!${tagPercentEncode(tag)}`;\n\t}\n\tif (tag.slice(0, 18) === \"tag:yaml.org,2002:\") return `!!${tagPercentEncode(tag.slice(18))}`;\n\treturn `!<${tagPercentEncode(tag)}>`;\n}\n//#endregion\n//#region src/parser/constructor.ts\nvar NO_RANGE$2 = -1;\nvar DEFAULT_CONSTRUCTOR_OPTIONS = {\n\tfilename: \"\",\n\tschema: CORE_SCHEMA,\n\tjson: false,\n\tmaxTotalMergeKeys: 1e4,\n\tmaxAliases: -1\n};\nfunction eventPosition$1(event) {\n\tif (\"tagStart\" in event && event.tagStart !== NO_RANGE$2) return event.tagStart;\n\tif (\"anchorStart\" in event && event.anchorStart !== NO_RANGE$2) return event.anchorStart;\n\tif (\"valueStart\" in event && event.valueStart !== NO_RANGE$2) return event.valueStart;\n\tif (\"start\" in event) return event.start;\n\treturn 0;\n}\nfunction throwError$1(state, message) {\n\tthrowErrorAt(state.source, state.position, message, state.filename);\n}\nfunction finalizeCollection(state, position, tag, carrier) {\n\ttry {\n\t\treturn tag.finalize(carrier);\n\t} catch (error) {\n\t\tif (error instanceof YAMLException) throw error;\n\t\tthrowErrorAt(state.source, position, error instanceof Error ? error.message : String(error), state.filename);\n\t}\n}\nfunction lookupTag(exact, prefix, tagName) {\n\tconst exactTag = exact[tagName];\n\tif (exactTag) return exactTag;\n\tfor (const tag of prefix) if (tagName.startsWith(tag.tagName)) return tag;\n}\nfunction findExplicitTag(state, exact, prefix, tagName, nodeKind) {\n\tconst tag = lookupTag(exact, prefix, tagName);\n\tif (tag) return tag;\n\tthrowError$1(state, `unknown ${nodeKind} tag !<${tagName}>`);\n}\nfunction constructScalar(state, event) {\n\tconst source = getScalarValue(state.source, event);\n\tconst rawTag = event.tagStart === NO_RANGE$2 ? \"\" : state.source.slice(event.tagStart, event.tagEnd);\n\tconst strTag = state.schema.defaultScalarTag;\n\tif (rawTag !== \"\") {\n\t\tif (rawTag === \"!\") return {\n\t\t\tvalue: source,\n\t\t\ttag: strTag\n\t\t};\n\t\tconst tagName = tagNameFull(rawTag, state.tagHandlers);\n\t\tconst scalarTag = lookupTag(state.schema.exact.scalar, state.schema.prefix.scalar, tagName);\n\t\tif (scalarTag) {\n\t\t\tconst result = scalarTag.resolve(source, true, tagName);\n\t\t\tif (result === NOT_RESOLVED) throwError$1(state, `cannot resolve a node with !<${tagName}> explicit tag`);\n\t\t\treturn {\n\t\t\t\tvalue: result,\n\t\t\t\ttag: scalarTag\n\t\t\t};\n\t\t}\n\t\tconst collectionTagDef = lookupTag(state.schema.exact.mapping, state.schema.prefix.mapping, tagName) ?? lookupTag(state.schema.exact.sequence, state.schema.prefix.sequence, tagName);\n\t\tif (collectionTagDef) {\n\t\t\tif (source !== \"\") throwError$1(state, `cannot resolve a node with !<${tagName}> explicit tag`);\n\t\t\tconst carrier = collectionTagDef.create(tagName);\n\t\t\treturn {\n\t\t\t\tvalue: collectionTagDef.carrierIsResult ? carrier : finalizeCollection(state, state.position, collectionTagDef, carrier),\n\t\t\t\ttag: collectionTagDef\n\t\t\t};\n\t\t}\n\t\tthrowError$1(state, `unknown scalar tag !<${tagName}>`);\n\t}\n\tif (event.style === 1) {\n\t\tconst candidates = state.schema.implicitScalarByFirstChar.get(source.charAt(0)) ?? state.schema.implicitScalarAnyFirstChar;\n\t\tfor (const tag of candidates) {\n\t\t\tconst result = tag.resolve(source, false, tag.tagName);\n\t\t\tif (result !== NOT_RESOLVED) return {\n\t\t\t\tvalue: result,\n\t\t\t\ttag\n\t\t\t};\n\t\t}\n\t}\n\treturn {\n\t\tvalue: strTag.resolve(source, false, strTag.tagName),\n\t\ttag: strTag\n\t};\n}\nfunction collectionTag(state, event, exact, prefix, defaultTagName, nodeKind) {\n\tconst rawTag = event.tagStart === NO_RANGE$2 ? \"\" : state.source.slice(event.tagStart, event.tagEnd);\n\tconst tagName = rawTag === \"\" || rawTag === \"!\" ? defaultTagName : tagNameFull(rawTag, state.tagHandlers);\n\treturn {\n\t\ttagName,\n\t\ttag: findExplicitTag(state, exact, prefix, tagName, nodeKind)\n\t};\n}\nfunction isMappingTag(tag) {\n\treturn tag.nodeKind === \"mapping\";\n}\nfunction mergeKeys(state, frame, source, sourceTag) {\n\tfor (const sourceKey of sourceTag.keys(source)) {\n\t\tif (state.maxTotalMergeKeys !== -1 && ++state.totalMergeKeys > state.maxTotalMergeKeys) throwError$1(state, `merge keys exceeded maxTotalMergeKeys (${state.maxTotalMergeKeys})`);\n\t\tif (frame.tag.has(frame.value, sourceKey)) continue;\n\t\tconst err = frame.tag.addPair(frame.value, sourceKey, sourceTag.get(source, sourceKey));\n\t\tif (err) throwError$1(state, err);\n\t\t(frame.overridable ??= /* @__PURE__ */ new Set()).add(sourceKey);\n\t}\n}\nfunction mergeSource(state, frame, source, sourceTag) {\n\tstate.position = frame.keyPosition;\n\tif (isMappingTag(sourceTag)) mergeKeys(state, frame, source, sourceTag);\n\telse if (sourceTag.nodeKind === \"sequence\" && Array.isArray(source)) for (const element of source) mergeKeys(state, frame, element, frame.tag);\n\telse throwError$1(state, \"cannot merge mappings; the provided source object is unacceptable\");\n}\nfunction addMappingValue(state, frame, key, value, tag) {\n\tstate.position = frame.keyPosition;\n\tif (key === MERGE_KEY) {\n\t\tmergeSource(state, frame, value, tag);\n\t\treturn;\n\t}\n\tif (!state.json && frame.tag.has(frame.value, key) && !frame.overridable?.has(key)) throwError$1(state, \"duplicated mapping key\");\n\tconst err = frame.tag.addPair(frame.value, key, value);\n\tif (err) throwError$1(state, err);\n\tframe.overridable?.delete(key);\n}\nfunction addValue(state, value, tag) {\n\tconst frame = state.frames[state.frames.length - 1];\n\tif (frame.kind === \"document\") {\n\t\tframe.value = value;\n\t\tframe.hasValue = true;\n\t} else if (frame.kind === \"sequence\") {\n\t\tif (frame.merge) {\n\t\t\tif (!isMappingTag(tag)) throwError$1(state, \"cannot merge mappings; the provided source object is unacceptable\");\n\t\t}\n\t\tconst err = frame.tag.addItem(frame.value, value, frame.index++);\n\t\tif (err) throwError$1(state, err);\n\t} else if (frame.hasKey) {\n\t\tconst key = frame.key;\n\t\tframe.key = void 0;\n\t\tframe.hasKey = false;\n\t\taddMappingValue(state, frame, key, value, tag);\n\t} else {\n\t\tframe.key = value;\n\t\tframe.keyPosition = state.position;\n\t\tframe.hasKey = true;\n\t}\n}\nfunction storeAnchor(state, event, value, tag, isValueFinal) {\n\tif (event.anchorStart !== NO_RANGE$2) {\n\t\tconst anchor = {\n\t\t\tvalue,\n\t\t\ttag,\n\t\t\tisValueFinal\n\t\t};\n\t\tstate.anchors.set(state.source.slice(event.anchorStart, event.anchorEnd), anchor);\n\t\treturn anchor;\n\t}\n\treturn null;\n}\nfunction constructFromEvents(events, options) {\n\tconst state = {\n\t\t...DEFAULT_CONSTRUCTOR_OPTIONS,\n\t\t...options,\n\t\tevents,\n\t\tdocuments: [],\n\t\teventIndex: 0,\n\t\tposition: 0,\n\t\tframes: [],\n\t\tanchors: /* @__PURE__ */ new Map(),\n\t\ttagHandlers: Object.create(null),\n\t\ttotalMergeKeys: 0,\n\t\taliasCount: 0\n\t};\n\twhile (state.eventIndex < state.events.length) {\n\t\tconst event = state.events[state.eventIndex++];\n\t\tstate.position = eventPosition$1(event);\n\t\tswitch (event.type) {\n\t\t\tcase 1:\n\t\t\t\tstate.anchors = /* @__PURE__ */ new Map();\n\t\t\t\tstate.aliasCount = 0;\n\t\t\t\tstate.tagHandlers = Object.create(null);\n\t\t\t\tfor (const directive of event.directives) if (directive.kind === \"tag\") state.tagHandlers[directive.handle] = directive.prefix;\n\t\t\t\tstate.frames.push({\n\t\t\t\t\tkind: \"document\",\n\t\t\t\t\tposition: state.position,\n\t\t\t\t\tvalue: void 0,\n\t\t\t\t\thasValue: false\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase 4: {\n\t\t\t\tconst { value, tag } = constructScalar(state, event);\n\t\t\t\tstoreAnchor(state, event, value, tag, true);\n\t\t\t\taddValue(state, value, tag);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 2: {\n\t\t\t\tconst definition = collectionTag(state, event, state.schema.exact.sequence, state.schema.prefix.sequence, \"tag:yaml.org,2002:seq\", \"sequence\");\n\t\t\t\tconst value = definition.tag.create(definition.tagName);\n\t\t\t\tconst anchor = storeAnchor(state, event, value, definition.tag, definition.tag.carrierIsResult);\n\t\t\t\tconst parent = state.frames[state.frames.length - 1];\n\t\t\t\tconst merge = parent !== void 0 && parent.kind === \"mapping\" && parent.hasKey && parent.key === MERGE_KEY;\n\t\t\t\tstate.frames.push({\n\t\t\t\t\tkind: \"sequence\",\n\t\t\t\t\tposition: state.position,\n\t\t\t\t\tvalue,\n\t\t\t\t\ttag: definition.tag,\n\t\t\t\t\tanchor,\n\t\t\t\t\tindex: 0,\n\t\t\t\t\tmerge\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 3: {\n\t\t\t\tconst definition = collectionTag(state, event, state.schema.exact.mapping, state.schema.prefix.mapping, \"tag:yaml.org,2002:map\", \"mapping\");\n\t\t\t\tconst value = definition.tag.create(definition.tagName);\n\t\t\t\tconst anchor = storeAnchor(state, event, value, definition.tag, definition.tag.carrierIsResult);\n\t\t\t\tstate.frames.push({\n\t\t\t\t\tkind: \"mapping\",\n\t\t\t\t\tposition: state.position,\n\t\t\t\t\tvalue,\n\t\t\t\t\ttag: definition.tag,\n\t\t\t\t\tanchor,\n\t\t\t\t\tkey: void 0,\n\t\t\t\t\tkeyPosition: state.position,\n\t\t\t\t\thasKey: false,\n\t\t\t\t\toverridable: null\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 5: {\n\t\t\t\tif (state.maxAliases !== -1 && ++state.aliasCount > state.maxAliases) throwError$1(state, `aliases exceeded maxAliases (${state.maxAliases})`);\n\t\t\t\tconst name = state.source.slice(event.anchorStart, event.anchorEnd);\n\t\t\t\tconst anchor = state.anchors.get(name);\n\t\t\t\tif (!anchor) throwError$1(state, `unidentified alias \"${name}\"`);\n\t\t\t\tif (!anchor.isValueFinal) throwError$1(state, `recursive alias \"${name}\" is not supported for tag ${anchor.tag.tagName} because it uses finalize()`);\n\t\t\t\taddValue(state, anchor.value, anchor.tag);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 6: {\n\t\t\t\tconst frame = state.frames.pop();\n\t\t\t\tif (frame.kind === \"document\") state.documents.push(frame.value);\n\t\t\t\telse {\n\t\t\t\t\tconst value = frame.tag.carrierIsResult ? frame.value : finalizeCollection(state, frame.position, frame.tag, frame.value);\n\t\t\t\t\tif (frame.anchor) {\n\t\t\t\t\t\tframe.anchor.value = value;\n\t\t\t\t\t\tframe.anchor.isValueFinal = true;\n\t\t\t\t\t}\n\t\t\t\t\taddValue(state, value, frame.tag);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn state.documents;\n}\n//#endregion\n//#region src/parser/parser.ts\nvar NO_RANGE$1 = -1;\nvar HAS_OWN = Object.prototype.hasOwnProperty;\nvar CONTEXT_FLOW_IN = 1;\nvar CONTEXT_FLOW_OUT = 2;\nvar CONTEXT_BLOCK_IN = 3;\nvar CONTEXT_BLOCK_OUT = 4;\nvar PATTERN_NON_PRINTABLE = /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/;\nvar PATTERN_FLOW_INDICATORS = /[,\\[\\]{}]/;\nvar PATTERN_TAG_HANDLE = /^(?:!|!!|![0-9A-Za-z-]+!)$/;\nvar NS_URI_CHAR = String.raw`(?:%[0-9A-Fa-f]{2}|[0-9A-Za-z\\-#;/?:@&=+$,_.!~*'()\\[\\]])`;\nvar NS_TAG_CHAR = String.raw`(?:%[0-9A-Fa-f]{2}|[0-9A-Za-z\\-#;/?:@&=+$.~*'()_])`;\nvar PATTERN_TAG_URI = new RegExp(`^(?:${NS_URI_CHAR})*$`);\nvar PATTERN_TAG_SUFFIX = new RegExp(`^(?:${NS_TAG_CHAR})+$`);\nvar PATTERN_TAG_PREFIX = new RegExp(`^(?:!(?:${NS_URI_CHAR})*|${NS_TAG_CHAR}(?:${NS_URI_CHAR})*)$`);\nvar DEFAULT_PARSER_OPTIONS = {\n\tfilename: \"\",\n\tmaxDepth: 100\n};\nfunction addDocumentEvent(state, explicitStart, explicitEnd) {\n\tstate.events.push({\n\t\ttype: 1,\n\t\texplicitStart,\n\t\texplicitEnd,\n\t\tdirectives: state.directives\n\t});\n}\nfunction addSequenceEvent(state, start, anchorStart, anchorEnd, tagStart, tagEnd, style) {\n\tstate.events.push({\n\t\ttype: 2,\n\t\tstart,\n\t\tanchorStart,\n\t\tanchorEnd,\n\t\ttagStart,\n\t\ttagEnd,\n\t\tstyle\n\t});\n}\nfunction addMappingEvent(state, start, anchorStart, anchorEnd, tagStart, tagEnd, style) {\n\tstate.events.push({\n\t\ttype: 3,\n\t\tstart,\n\t\tanchorStart,\n\t\tanchorEnd,\n\t\ttagStart,\n\t\ttagEnd,\n\t\tstyle\n\t});\n}\nfunction insertFlowPairMappingEvent(state, snapshot) {\n\tstate.events.splice(snapshot.eventsLength, 0, {\n\t\ttype: 3,\n\t\tstart: snapshot.position,\n\t\tanchorStart: NO_RANGE$1,\n\t\tanchorEnd: NO_RANGE$1,\n\t\ttagStart: NO_RANGE$1,\n\t\ttagEnd: NO_RANGE$1,\n\t\tstyle: 2\n\t});\n}\nfunction addScalarEvent(state, valueStart, valueEnd, anchorStart, anchorEnd, tagStart, tagEnd, style, chomping = 1, indent = -1, fast = false) {\n\tstate.events.push({\n\t\ttype: 4,\n\t\tvalueStart,\n\t\tvalueEnd,\n\t\tanchorStart,\n\t\tanchorEnd,\n\t\ttagStart,\n\t\ttagEnd,\n\t\tstyle,\n\t\tchomping,\n\t\tindent,\n\t\tfast\n\t});\n}\nfunction addAliasEvent(state, anchorStart, anchorEnd) {\n\tstate.events.push({\n\t\ttype: 5,\n\t\tanchorStart,\n\t\tanchorEnd\n\t});\n}\nfunction addPopEvent(state) {\n\tstate.events.push({ type: 6 });\n}\nfunction addEmptyScalarEvent(state) {\n\taddScalarEvent(state, NO_RANGE$1, NO_RANGE$1, NO_RANGE$1, NO_RANGE$1, NO_RANGE$1, NO_RANGE$1, 1);\n}\nfunction emptyProperties() {\n\treturn {\n\t\tanchorStart: NO_RANGE$1,\n\t\tanchorEnd: NO_RANGE$1,\n\t\ttagStart: NO_RANGE$1,\n\t\ttagEnd: NO_RANGE$1\n\t};\n}\nfunction snapshotState(state) {\n\treturn {\n\t\tposition: state.position,\n\t\tline: state.line,\n\t\tlineStart: state.lineStart,\n\t\tlineIndent: state.lineIndent,\n\t\tfirstTabInLine: state.firstTabInLine,\n\t\teventsLength: state.events.length\n\t};\n}\nfunction restoreState(state, snapshot) {\n\tstate.position = snapshot.position;\n\tstate.line = snapshot.line;\n\tstate.lineStart = snapshot.lineStart;\n\tstate.lineIndent = snapshot.lineIndent;\n\tstate.firstTabInLine = snapshot.firstTabInLine;\n\tstate.events.length = snapshot.eventsLength;\n}\nfunction throwError(state, message) {\n\tthrowErrorAt(state.input.slice(0, state.length), state.position, message, state.filename);\n}\nfunction isEol(c) {\n\treturn c === 10 || c === 13;\n}\nfunction isWhiteSpace(c) {\n\treturn c === 9 || c === 32;\n}\nfunction isWsOrEol(c) {\n\treturn isWhiteSpace(c) || isEol(c);\n}\nfunction isWsOrEolOrEnd(c) {\n\treturn c === 0 || isWsOrEol(c);\n}\nfunction isFlowIndicator(c) {\n\treturn c === 44 || c === 91 || c === 93 || c === 123 || c === 125;\n}\nfunction fromDecimalCode(c) {\n\treturn c >= 48 && c <= 57 ? c - 48 : -1;\n}\nfunction fromHexCode(c) {\n\tif (c >= 48 && c <= 57) return c - 48;\n\tconst lc = c | 32;\n\tif (lc >= 97 && lc <= 102) return lc - 97 + 10;\n\treturn -1;\n}\nfunction escapedHexLen(c) {\n\tif (c === 120) return 2;\n\tif (c === 117) return 4;\n\tif (c === 85) return 8;\n\treturn 0;\n}\nfunction isSimpleEscape(c) {\n\treturn c === 48 || c === 97 || c === 98 || c === 116 || c === 9 || c === 110 || c === 118 || c === 102 || c === 114 || c === 101 || c === 32 || c === 34 || c === 47 || c === 92 || c === 78 || c === 95 || c === 76 || c === 80;\n}\nfunction consumeLineBreak(state) {\n\tif (state.input.charCodeAt(state.position) === 10) state.position++;\n\telse {\n\t\tstate.position++;\n\t\tif (state.input.charCodeAt(state.position) === 10) state.position++;\n\t}\n\tstate.line++;\n\tstate.lineStart = state.position;\n\tstate.lineIndent = 0;\n\tstate.firstTabInLine = -1;\n}\nfunction skipSeparationSpace(state, allowComments) {\n\tlet lineBreaks = 0;\n\tlet ch = state.input.charCodeAt(state.position);\n\tlet hasSeparation = state.position === state.lineStart || isWsOrEol(state.input.charCodeAt(state.position - 1));\n\twhile (ch !== 0) {\n\t\twhile (isWhiteSpace(ch)) {\n\t\t\thasSeparation = true;\n\t\t\tif (ch === 9 && state.firstTabInLine === -1) state.firstTabInLine = state.position;\n\t\t\tch = state.input.charCodeAt(++state.position);\n\t\t}\n\t\tif (allowComments && hasSeparation && ch === 35) do\n\t\t\tch = state.input.charCodeAt(++state.position);\n\t\twhile (!isEol(ch) && ch !== 0);\n\t\tif (!isEol(ch)) break;\n\t\tconsumeLineBreak(state);\n\t\tlineBreaks++;\n\t\thasSeparation = true;\n\t\tch = state.input.charCodeAt(state.position);\n\t\twhile (ch === 32) {\n\t\t\tstate.lineIndent++;\n\t\t\tch = state.input.charCodeAt(++state.position);\n\t\t}\n\t}\n\treturn lineBreaks;\n}\nfunction testDocumentSeparator(state, position = state.position) {\n\tconst ch = state.input.charCodeAt(position);\n\tif ((ch === 45 || ch === 46) && ch === state.input.charCodeAt(position + 1) && ch === state.input.charCodeAt(position + 2)) {\n\t\tconst following = state.input.charCodeAt(position + 3);\n\t\treturn following === 0 || isWsOrEol(following);\n\t}\n\treturn false;\n}\nfunction skipUntilLineEnd(state) {\n\tlet ch = state.input.charCodeAt(state.position);\n\twhile (ch !== 0 && !isEol(ch)) ch = state.input.charCodeAt(++state.position);\n}\nfunction checkPrintable(state, start, end) {\n\tif (PATTERN_NON_PRINTABLE.test(state.input.slice(start, end))) throwError(state, \"the stream contains non-printable characters\");\n}\nfunction readTagProperty(state, props, inFlow) {\n\tif (state.input.charCodeAt(state.position) !== 33) return false;\n\tif (props.tagStart !== NO_RANGE$1) throwError(state, \"duplication of a tag property\");\n\tconst start = state.position;\n\tlet isVerbatim = false;\n\tlet isNamed = false;\n\tlet tagHandle = \"!\";\n\tlet ch = state.input.charCodeAt(++state.position);\n\tif (ch === 60) {\n\t\tisVerbatim = true;\n\t\tch = state.input.charCodeAt(++state.position);\n\t} else if (ch === 33) {\n\t\tisNamed = true;\n\t\ttagHandle = \"!!\";\n\t\tch = state.input.charCodeAt(++state.position);\n\t}\n\tlet suffixStart = state.position;\n\tlet tagName;\n\tif (isVerbatim) {\n\t\twhile (ch !== 0 && ch !== 62) ch = state.input.charCodeAt(++state.position);\n\t\tif (ch !== 62) throwError(state, \"unexpected end of the stream within a verbatim tag\");\n\t\ttagName = state.input.slice(suffixStart, state.position);\n\t\tstate.position++;\n\t} else {\n\t\twhile (ch !== 0 && !isWsOrEol(ch) && !(inFlow && isFlowIndicator(ch))) {\n\t\t\tif (ch === 33) if (!isNamed) {\n\t\t\t\ttagHandle = state.input.slice(suffixStart - 1, state.position + 1);\n\t\t\t\tif (!PATTERN_TAG_HANDLE.test(tagHandle)) throwError(state, \"named tag handle cannot contain such characters\");\n\t\t\t\tisNamed = true;\n\t\t\t\tsuffixStart = state.position + 1;\n\t\t\t} else throwError(state, \"tag suffix cannot contain exclamation marks\");\n\t\t\tch = state.input.charCodeAt(++state.position);\n\t\t}\n\t\ttagName = state.input.slice(suffixStart, state.position);\n\t\tif (PATTERN_FLOW_INDICATORS.test(tagName)) throwError(state, \"tag suffix cannot contain flow indicator characters\");\n\t}\n\tif (tagName && !(isVerbatim ? PATTERN_TAG_URI.test(tagName) : PATTERN_TAG_SUFFIX.test(tagName))) throwError(state, `tag name cannot contain such characters: ${tagName}`);\n\tif (!isVerbatim && tagHandle !== \"!\" && tagHandle !== \"!!\" && !HAS_OWN.call(state.tagHandlers, tagHandle)) throwError(state, `undeclared tag handle \"${tagHandle}\"`);\n\tprops.tagStart = start;\n\tprops.tagEnd = state.position;\n\treturn true;\n}\nfunction readAnchorProperty(state, props) {\n\tif (state.input.charCodeAt(state.position) !== 38) return false;\n\tif (props.anchorStart !== NO_RANGE$1) throwError(state, \"duplication of an anchor property\");\n\tstate.position++;\n\tconst start = state.position;\n\twhile (state.input.charCodeAt(state.position) !== 0 && !isWsOrEol(state.input.charCodeAt(state.position)) && !isFlowIndicator(state.input.charCodeAt(state.position))) state.position++;\n\tif (state.position === start) throwError(state, \"name of an anchor node must contain at least one character\");\n\tprops.anchorStart = start;\n\tprops.anchorEnd = state.position;\n\treturn true;\n}\nfunction readAlias(state, props) {\n\tif (state.input.charCodeAt(state.position) !== 42) return false;\n\tif (props.anchorStart !== NO_RANGE$1 || props.tagStart !== NO_RANGE$1) throwError(state, \"alias node should not have any properties\");\n\tstate.position++;\n\tconst start = state.position;\n\twhile (state.input.charCodeAt(state.position) !== 0 && !isWsOrEol(state.input.charCodeAt(state.position)) && !isFlowIndicator(state.input.charCodeAt(state.position))) state.position++;\n\tif (state.position === start) throwError(state, \"name of an alias node must contain at least one character\");\n\taddAliasEvent(state, start, state.position);\n\treturn true;\n}\nfunction readFlowScalarBreak(state, nodeIndent) {\n\tskipSeparationSpace(state, false);\n\tif (state.lineIndent < nodeIndent) throwError(state, \"deficient indentation\");\n}\nfunction readSingleQuotedScalar(state, nodeIndent, props) {\n\tif (state.input.charCodeAt(state.position) !== 39) return false;\n\tstate.position++;\n\tconst start = state.position;\n\tlet simple = true;\n\twhile (state.input.charCodeAt(state.position) !== 0) {\n\t\tconst ch = state.input.charCodeAt(state.position);\n\t\tif (ch === 39) {\n\t\t\tif (state.input.charCodeAt(state.position + 1) === 39) {\n\t\t\t\tsimple = false;\n\t\t\t\tstate.position += 2;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst end = state.position;\n\t\t\tstate.position++;\n\t\t\taddScalarEvent(state, start, end, props.anchorStart, props.anchorEnd, props.tagStart, props.tagEnd, 2, 1, -1, simple);\n\t\t\treturn true;\n\t\t}\n\t\tif (isEol(ch)) {\n\t\t\tsimple = false;\n\t\t\treadFlowScalarBreak(state, nodeIndent);\n\t\t} else if (state.position === state.lineStart && testDocumentSeparator(state)) throwError(state, \"unexpected end of the document within a single quoted scalar\");\n\t\telse if (ch !== 9 && ch < 32) throwError(state, \"expected valid JSON character\");\n\t\telse state.position++;\n\t}\n\tthrowError(state, \"unexpected end of the stream within a single quoted scalar\");\n}\nfunction readDoubleQuotedScalar(state, nodeIndent, props) {\n\tif (state.input.charCodeAt(state.position) !== 34) return false;\n\tstate.position++;\n\tconst start = state.position;\n\tlet simple = true;\n\twhile (state.input.charCodeAt(state.position) !== 0) {\n\t\tconst ch = state.input.charCodeAt(state.position);\n\t\tif (ch === 34) {\n\t\t\tconst end = state.position;\n\t\t\tstate.position++;\n\t\t\taddScalarEvent(state, start, end, props.anchorStart, props.anchorEnd, props.tagStart, props.tagEnd, 3, 1, -1, simple);\n\t\t\treturn true;\n\t\t}\n\t\tif (ch === 92) {\n\t\t\tsimple = false;\n\t\t\tconst escaped = state.input.charCodeAt(++state.position);\n\t\t\tif (isEol(escaped)) readFlowScalarBreak(state, nodeIndent);\n\t\t\telse if (isSimpleEscape(escaped)) state.position++;\n\t\t\telse {\n\t\t\t\tlet hexLength = escapedHexLen(escaped);\n\t\t\t\tif (hexLength === 0) throwError(state, \"unknown escape sequence\");\n\t\t\t\twhile (hexLength-- > 0) {\n\t\t\t\t\tstate.position++;\n\t\t\t\t\tif (fromHexCode(state.input.charCodeAt(state.position)) < 0) throwError(state, \"expected hexadecimal character\");\n\t\t\t\t}\n\t\t\t\tstate.position++;\n\t\t\t}\n\t\t} else if (isEol(ch)) {\n\t\t\tsimple = false;\n\t\t\treadFlowScalarBreak(state, nodeIndent);\n\t\t} else if (state.position === state.lineStart && testDocumentSeparator(state)) throwError(state, \"unexpected end of the document within a double quoted scalar\");\n\t\telse if (ch !== 9 && ch < 32) throwError(state, \"expected valid JSON character\");\n\t\telse state.position++;\n\t}\n\tthrowError(state, \"unexpected end of the stream within a double quoted scalar\");\n}\nfunction readBlockScalar(state, parentIndent, props) {\n\tconst ch = state.input.charCodeAt(state.position);\n\tlet chomping = 1;\n\tlet indent = -1;\n\tlet detectedIndent = false;\n\tif (ch !== 124 && ch !== 62) return false;\n\tconst style = ch === 124 ? 4 : 5;\n\tstate.position++;\n\twhile (state.input.charCodeAt(state.position) !== 0) {\n\t\tconst current = state.input.charCodeAt(state.position);\n\t\tconst digit = fromDecimalCode(current);\n\t\tif (current === 43 || current === 45) {\n\t\t\tif (chomping !== 1) throwError(state, \"repeat of a chomping mode identifier\");\n\t\t\tchomping = current === 43 ? 3 : 2;\n\t\t\tstate.position++;\n\t\t} else if (digit >= 0) {\n\t\t\tif (digit === 0) throwError(state, \"bad explicit indentation width of a block scalar; it cannot be less than one\");\n\t\t\tif (detectedIndent) throwError(state, \"repeat of an indentation width identifier\");\n\t\t\tindent = parentIndent + digit - 1;\n\t\t\tdetectedIndent = true;\n\t\t\tstate.position++;\n\t\t} else break;\n\t}\n\tlet hadWhitespace = false;\n\twhile (isWhiteSpace(state.input.charCodeAt(state.position))) {\n\t\thadWhitespace = true;\n\t\tstate.position++;\n\t}\n\tif (hadWhitespace && state.input.charCodeAt(state.position) === 35) skipUntilLineEnd(state);\n\tif (isEol(state.input.charCodeAt(state.position))) consumeLineBreak(state);\n\telse if (state.input.charCodeAt(state.position) !== 0) throwError(state, \"a line break is expected\");\n\tlet contentIndent = detectedIndent ? indent : -1;\n\tlet maxLeadingIndent = 0;\n\tconst valueStart = state.position;\n\tlet valueEnd = state.position;\n\twhile (state.input.charCodeAt(state.position) !== 0) {\n\t\tconst linePosition = state.position;\n\t\tlet column = 0;\n\t\twhile (state.input.charCodeAt(linePosition + column) === 32) column++;\n\t\tconst first = state.input.charCodeAt(linePosition + column);\n\t\tif (first === 0) {\n\t\t\tif (contentIndent >= 0) {\n\t\t\t\tif (column > contentIndent) valueEnd = linePosition + column;\n\t\t\t} else if (column > 0) valueEnd = linePosition + column;\n\t\t\tbreak;\n\t\t}\n\t\tif (linePosition === state.lineStart && testDocumentSeparator(state, linePosition)) break;\n\t\tif (!detectedIndent && contentIndent === -1 && isEol(first)) maxLeadingIndent = Math.max(maxLeadingIndent, column);\n\t\tif (!detectedIndent && contentIndent === -1 && !isEol(first)) {\n\t\t\tif (first === 9 && column < parentIndent) {\n\t\t\t\tstate.position = linePosition + column;\n\t\t\t\tthrowError(state, \"tab characters must not be used in indentation\");\n\t\t\t}\n\t\t\tif (column < maxLeadingIndent) {\n\t\t\t\tstate.position = linePosition + column;\n\t\t\t\tthrowError(state, \"bad indentation of a mapping entry\");\n\t\t\t}\n\t\t}\n\t\tif (contentIndent === -1 && first !== 0 && !isEol(first) && column < parentIndent) {\n\t\t\tstate.lineIndent = column;\n\t\t\tstate.position = linePosition + column;\n\t\t\tbreak;\n\t\t}\n\t\tif (!detectedIndent && first !== 0 && !isEol(first) && contentIndent === -1) contentIndent = column;\n\t\tconst requiredIndent = contentIndent === -1 ? parentIndent + 1 : contentIndent;\n\t\tif (first !== 0 && !isEol(first) && column < requiredIndent) {\n\t\t\tstate.lineIndent = column;\n\t\t\tstate.position = linePosition + column;\n\t\t\tbreak;\n\t\t}\n\t\tskipUntilLineEnd(state);\n\t\tvalueEnd = state.position;\n\t\tif (isEol(state.input.charCodeAt(state.position))) {\n\t\t\tconsumeLineBreak(state);\n\t\t\tvalueEnd = state.position;\n\t\t}\n\t}\n\tcheckPrintable(state, valueStart, valueEnd);\n\taddScalarEvent(state, valueStart, valueEnd, props.anchorStart, props.anchorEnd, props.tagStart, props.tagEnd, style, chomping, contentIndent);\n\treturn true;\n}\nfunction canStartPlainScalar(state, nodeContext) {\n\tconst ch = state.input.charCodeAt(state.position);\n\tconst inFlow = nodeContext === CONTEXT_FLOW_IN;\n\tif (ch === 0 || isWsOrEol(ch) || ch === 35 || ch === 38 || ch === 42 || ch === 33 || ch === 124 || ch === 62 || ch === 39 || ch === 34 || ch === 37 || ch === 64 || ch === 96 || inFlow && isFlowIndicator(ch)) return false;\n\tif (ch === 63 || ch === 45) {\n\t\tconst following = state.input.charCodeAt(state.position + 1);\n\t\tif (isWsOrEolOrEnd(following) || inFlow && isFlowIndicator(following)) return false;\n\t}\n\treturn true;\n}\nfunction readPlainScalar(state, nodeIndent, nodeContext, props) {\n\tif (!canStartPlainScalar(state, nodeContext)) return false;\n\tconst start = state.position;\n\tlet end = state.position;\n\tlet ch = state.input.charCodeAt(state.position);\n\tconst inFlow = nodeContext === CONTEXT_FLOW_IN;\n\tlet multiline = false;\n\twhile (ch !== 0) {\n\t\tif (state.position === state.lineStart && testDocumentSeparator(state)) break;\n\t\tif (ch === 58) {\n\t\t\tconst following = state.input.charCodeAt(state.position + 1);\n\t\t\tif (isWsOrEolOrEnd(following) || inFlow && isFlowIndicator(following)) break;\n\t\t} else if (ch === 35) {\n\t\t\tif (isWsOrEol(state.input.charCodeAt(state.position - 1))) break;\n\t\t} else if (inFlow && isFlowIndicator(ch)) break;\n\t\telse if (isEol(ch)) {\n\t\t\tconst savedPosition = state.position;\n\t\t\tconst savedLine = state.line;\n\t\t\tconst savedLineStart = state.lineStart;\n\t\t\tconst savedLineIndent = state.lineIndent;\n\t\t\tskipSeparationSpace(state, false);\n\t\t\tif (state.lineIndent >= nodeIndent) {\n\t\t\t\tmultiline = true;\n\t\t\t\tch = state.input.charCodeAt(state.position);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tstate.position = savedPosition;\n\t\t\tstate.line = savedLine;\n\t\t\tstate.lineStart = savedLineStart;\n\t\t\tstate.lineIndent = savedLineIndent;\n\t\t\tbreak;\n\t\t}\n\t\tif (!isWhiteSpace(ch)) end = state.position + 1;\n\t\tch = state.input.charCodeAt(++state.position);\n\t}\n\tif (end === start) return false;\n\tcheckPrintable(state, start, end);\n\taddScalarEvent(state, start, end, props.anchorStart, props.anchorEnd, props.tagStart, props.tagEnd, 1, 1, -1, !multiline);\n\treturn true;\n}\nfunction skipFlowSeparationSpace(state, nodeIndent) {\n\tconst startLine = state.line;\n\tskipSeparationSpace(state, true);\n\tif (state.line > startLine && state.lineIndent < nodeIndent || state.firstTabInLine !== -1 && state.lineIndent < nodeIndent) throwError(state, \"deficient indentation\");\n}\nfunction readFlowCollection(state, nodeIndent, props) {\n\tconst ch = state.input.charCodeAt(state.position);\n\tconst isMapping = ch === 123;\n\tconst start = state.position;\n\tlet readNext = true;\n\tif (ch !== 91 && ch !== 123) return false;\n\tconst terminator = isMapping ? 125 : 93;\n\tif (isMapping) addMappingEvent(state, start, props.anchorStart, props.anchorEnd, props.tagStart, props.tagEnd, 2);\n\telse addSequenceEvent(state, start, props.anchorStart, props.anchorEnd, props.tagStart, props.tagEnd, 2);\n\tstate.position++;\n\twhile (state.input.charCodeAt(state.position) !== 0) {\n\t\tskipFlowSeparationSpace(state, nodeIndent);\n\t\tlet ch = state.input.charCodeAt(state.position);\n\t\tif (ch === terminator) {\n\t\t\tstate.position++;\n\t\t\taddPopEvent(state);\n\t\t\treturn true;\n\t\t} else if (!readNext) throwError(state, \"missed comma between flow collection entries\");\n\t\telse if (ch === 44) throwError(state, \"expected the node content, but found ','\");\n\t\tlet isPair = false;\n\t\tlet isExplicitPair = false;\n\t\tif (ch === 63 && isWsOrEol(state.input.charCodeAt(state.position + 1))) {\n\t\t\tisPair = isExplicitPair = true;\n\t\t\tstate.position += 1;\n\t\t\tskipFlowSeparationSpace(state, nodeIndent);\n\t\t}\n\t\tconst entryLine = state.line;\n\t\tconst entryStart = snapshotState(state);\n\t\tconst keyWasRead = parseNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n\t\tskipFlowSeparationSpace(state, nodeIndent);\n\t\tch = state.input.charCodeAt(state.position);\n\t\tif ((isMapping || isExplicitPair || state.line === entryLine) && ch === 58) {\n\t\t\tisPair = true;\n\t\t\tstate.position++;\n\t\t\tskipFlowSeparationSpace(state, nodeIndent);\n\t\t\tif (!isMapping) {\n\t\t\t\tinsertFlowPairMappingEvent(state, entryStart);\n\t\t\t\tif (!keyWasRead) addEmptyScalarEvent(state);\n\t\t\t} else if (!keyWasRead) addEmptyScalarEvent(state);\n\t\t\tif (!parseNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true)) addEmptyScalarEvent(state);\n\t\t\tskipFlowSeparationSpace(state, nodeIndent);\n\t\t\tif (!isMapping) addPopEvent(state);\n\t\t} else if (isMapping && isPair) {\n\t\t\tif (!keyWasRead) addEmptyScalarEvent(state);\n\t\t\taddEmptyScalarEvent(state);\n\t\t} else if (isMapping) addEmptyScalarEvent(state);\n\t\telse if (isPair) {\n\t\t\tinsertFlowPairMappingEvent(state, entryStart);\n\t\t\tif (!keyWasRead) addEmptyScalarEvent(state);\n\t\t\taddEmptyScalarEvent(state);\n\t\t\taddPopEvent(state);\n\t\t}\n\t\tch = state.input.charCodeAt(state.position);\n\t\tif (ch === 44) {\n\t\t\treadNext = true;\n\t\t\tstate.position++;\n\t\t} else readNext = false;\n\t}\n\tthrowError(state, \"unexpected end of the stream within a flow collection\");\n}\nfunction readBlockSequence(state, nodeIndent, props) {\n\tif (state.firstTabInLine !== -1 || state.input.charCodeAt(state.position) !== 45 || !isWsOrEolOrEnd(state.input.charCodeAt(state.position + 1))) return false;\n\taddSequenceEvent(state, state.position, props.anchorStart, props.anchorEnd, props.tagStart, props.tagEnd, 1);\n\twhile (state.input.charCodeAt(state.position) === 45 && isWsOrEolOrEnd(state.input.charCodeAt(state.position + 1))) {\n\t\tif (state.firstTabInLine !== -1) {\n\t\t\tstate.position = state.firstTabInLine;\n\t\t\tthrowError(state, \"tab characters must not be used in indentation\");\n\t\t}\n\t\tconst entryLine = state.line;\n\t\tstate.position++;\n\t\tconst hadBreak = skipSeparationSpace(state, true) > 0;\n\t\tif (state.firstTabInLine !== -1 && state.input.charCodeAt(state.position) === 45 && isWsOrEolOrEnd(state.input.charCodeAt(state.position + 1))) throwError(state, \"bad indentation of a sequence entry\");\n\t\tif (hadBreak && state.lineIndent <= nodeIndent) addEmptyScalarEvent(state);\n\t\telse parseNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true);\n\t\tskipSeparationSpace(state, true);\n\t\tif (state.lineIndent < nodeIndent || state.position >= state.length) break;\n\t\tif (state.lineIndent > nodeIndent) throwError(state, \"bad indentation of a sequence entry\");\n\t\tif (state.line === entryLine && state.input.charCodeAt(state.position) === 45 && isWsOrEolOrEnd(state.input.charCodeAt(state.position + 1))) throwError(state, \"bad indentation of a sequence entry\");\n\t}\n\taddPopEvent(state);\n\treturn true;\n}\nfunction readBlockMapping(state, nodeIndent, flowIndent, props) {\n\tlet atExplicitKey = false;\n\tlet detected = false;\n\tlet mappingOpened = false;\n\tlet pendingExplicitKey = false;\n\tif (state.firstTabInLine !== -1) return false;\n\tlet ch = state.input.charCodeAt(state.position);\n\twhile (ch !== 0) {\n\t\tif (!atExplicitKey && state.firstTabInLine !== -1) {\n\t\t\tstate.position = state.firstTabInLine;\n\t\t\tthrowError(state, \"tab characters must not be used in indentation\");\n\t\t}\n\t\tconst following = state.input.charCodeAt(state.position + 1);\n\t\tconst entryLine = state.line;\n\t\tif ((ch === 63 || ch === 58) && isWsOrEolOrEnd(following)) {\n\t\t\tif (!mappingOpened) {\n\t\t\t\taddMappingEvent(state, state.position, props.anchorStart, props.anchorEnd, props.tagStart, props.tagEnd, 1);\n\t\t\t\tmappingOpened = true;\n\t\t\t}\n\t\t\tif (ch === 63) {\n\t\t\t\tif (atExplicitKey) addEmptyScalarEvent(state);\n\t\t\t\tdetected = true;\n\t\t\t\tatExplicitKey = true;\n\t\t\t} else if (atExplicitKey) atExplicitKey = false;\n\t\t\telse {\n\t\t\t\taddEmptyScalarEvent(state);\n\t\t\t\tdetected = true;\n\t\t\t\tatExplicitKey = false;\n\t\t\t}\n\t\t\tstate.position += 1;\n\t\t\tpendingExplicitKey = true;\n\t\t} else {\n\t\t\tif (atExplicitKey) {\n\t\t\t\taddEmptyScalarEvent(state);\n\t\t\t\tatExplicitKey = false;\n\t\t\t}\n\t\t\tconst beforeKey = snapshotState(state);\n\t\t\tif (!parseNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) break;\n\t\t\tif (state.line === entryLine) {\n\t\t\t\tch = state.input.charCodeAt(state.position);\n\t\t\t\twhile (isWhiteSpace(ch)) ch = state.input.charCodeAt(++state.position);\n\t\t\t\tif (ch === 58) {\n\t\t\t\t\tch = state.input.charCodeAt(++state.position);\n\t\t\t\t\tif (!isWsOrEolOrEnd(ch)) throwError(state, \"a whitespace character is expected after the key-value separator within a block mapping\");\n\t\t\t\t\tif (!mappingOpened) {\n\t\t\t\t\t\trestoreState(state, beforeKey);\n\t\t\t\t\t\taddMappingEvent(state, beforeKey.position, props.anchorStart, props.anchorEnd, props.tagStart, props.tagEnd, 1);\n\t\t\t\t\t\tmappingOpened = true;\n\t\t\t\t\t\tparseNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true);\n\t\t\t\t\t\tch = state.input.charCodeAt(state.position);\n\t\t\t\t\t\twhile (isWhiteSpace(ch)) ch = state.input.charCodeAt(++state.position);\n\t\t\t\t\t\tstate.position++;\n\t\t\t\t\t}\n\t\t\t\t\tdetected = true;\n\t\t\t\t\tatExplicitKey = false;\n\t\t\t\t\tpendingExplicitKey = false;\n\t\t\t\t} else if (detected) throwError(state, \"expected ':' after a mapping key\");\n\t\t\t\telse {\n\t\t\t\t\tif (props.anchorStart !== NO_RANGE$1 || props.tagStart !== NO_RANGE$1) {\n\t\t\t\t\t\trestoreState(state, beforeKey);\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} else if (detected) throwError(state, \"can not read a block mapping entry; a multiline key may not be an implicit key\");\n\t\t\telse {\n\t\t\t\tif (props.anchorStart !== NO_RANGE$1 || props.tagStart !== NO_RANGE$1) {\n\t\t\t\t\trestoreState(state, beforeKey);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\tif (parseNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, pendingExplicitKey)) pendingExplicitKey = false;\n\t\tif (!atExplicitKey) {\n\t\t\tif (pendingExplicitKey) {\n\t\t\t\taddEmptyScalarEvent(state);\n\t\t\t\tpendingExplicitKey = false;\n\t\t\t}\n\t\t}\n\t\tskipSeparationSpace(state, true);\n\t\tch = state.input.charCodeAt(state.position);\n\t\tif ((state.line === entryLine || state.lineIndent > nodeIndent) && ch !== 0) throwError(state, \"bad indentation of a mapping entry\");\n\t\telse if (state.lineIndent < nodeIndent) break;\n\t}\n\tif (!detected) return false;\n\tif (atExplicitKey) addEmptyScalarEvent(state);\n\tif (mappingOpened) addPopEvent(state);\n\treturn true;\n}\nfunction parseNode(state, parentIndent, nodeContext, allowToSeek, allowCompact, allowPropertyMapping = true) {\n\tif (state.depth >= state.maxDepth) throwError(state, `nesting exceeded maxDepth (${state.maxDepth})`);\n\tstate.depth++;\n\tlet indentStatus = 1;\n\tlet atNewLine = false;\n\tlet hasContent = false;\n\tlet propertyStart = null;\n\tconst props = emptyProperties();\n\tlet allowBlockScalars = nodeContext === CONTEXT_BLOCK_OUT || nodeContext === CONTEXT_BLOCK_IN;\n\tlet allowBlockCollections = allowBlockScalars;\n\tconst allowBlockStyles = allowBlockScalars;\n\tif (allowToSeek && skipSeparationSpace(state, true)) {\n\t\tatNewLine = true;\n\t\tif (state.lineIndent > parentIndent) indentStatus = 1;\n\t\telse if (state.lineIndent === parentIndent) indentStatus = 0;\n\t\telse indentStatus = -1;\n\t}\n\tif (state.position === state.lineStart && testDocumentSeparator(state)) {\n\t\tstate.depth--;\n\t\treturn false;\n\t}\n\tif (indentStatus === 1) while (true) {\n\t\tconst ch = state.input.charCodeAt(state.position);\n\t\tconst propertyState = snapshotState(state);\n\t\tif (atNewLine && indentStatus !== 1 && (ch === 33 || ch === 38)) break;\n\t\tif (atNewLine && allowBlockStyles && (props.tagStart !== NO_RANGE$1 || props.anchorStart !== NO_RANGE$1) && (ch === 33 || ch === 38)) {\n\t\t\tconst fallbackState = snapshotState(state);\n\t\t\tconst flowIndent = parentIndent + 1;\n\t\t\tif (readBlockMapping(state, state.position - state.lineStart, flowIndent, props) && state.events[fallbackState.eventsLength]?.type === 3) {\n\t\t\t\tstate.depth--;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\trestoreState(state, fallbackState);\n\t\t}\n\t\tif (atNewLine && (ch === 33 && props.tagStart !== NO_RANGE$1 || ch === 38 && props.anchorStart !== NO_RANGE$1)) break;\n\t\tif (!readTagProperty(state, props, nodeContext === CONTEXT_FLOW_IN) && !readAnchorProperty(state, props)) break;\n\t\tif (propertyStart === null) propertyStart = propertyState;\n\t\tif (skipSeparationSpace(state, true)) {\n\t\t\tatNewLine = true;\n\t\t\tallowBlockCollections = allowBlockStyles;\n\t\t\tif (state.lineIndent > parentIndent) indentStatus = 1;\n\t\t\telse if (state.lineIndent === parentIndent) indentStatus = 0;\n\t\t\telse indentStatus = -1;\n\t\t} else allowBlockCollections = false;\n\t}\n\tif (allowBlockCollections) allowBlockCollections = atNewLine || allowCompact;\n\tif (indentStatus === 1 || nodeContext === CONTEXT_BLOCK_OUT) {\n\t\tconst flowIndent = nodeContext === CONTEXT_FLOW_IN || nodeContext === CONTEXT_FLOW_OUT ? parentIndent : parentIndent + 1;\n\t\tconst blockIndent = state.position - state.lineStart;\n\t\tif (indentStatus === 1) if (allowBlockCollections && (readBlockSequence(state, blockIndent, props) || readBlockMapping(state, blockIndent, flowIndent, props)) || readFlowCollection(state, flowIndent, props)) hasContent = true;\n\t\telse {\n\t\t\tconst ch = state.input.charCodeAt(state.position);\n\t\t\tif (propertyStart !== null && allowPropertyMapping && allowBlockStyles && !allowBlockCollections && ch !== 124 && ch !== 62) {\n\t\t\t\tconst fallbackState = snapshotState(state);\n\t\t\t\tconst propertyIndent = propertyStart.position - propertyStart.lineStart;\n\t\t\t\trestoreState(state, propertyStart);\n\t\t\t\tif (readBlockMapping(state, propertyIndent, flowIndent, emptyProperties()) && state.events[fallbackState.eventsLength]?.type === 3) hasContent = true;\n\t\t\t\telse restoreState(state, fallbackState);\n\t\t\t}\n\t\t\tif (!hasContent && (allowBlockScalars && readBlockScalar(state, flowIndent, props) || readSingleQuotedScalar(state, flowIndent, props) || readDoubleQuotedScalar(state, flowIndent, props) || readAlias(state, props) || readPlainScalar(state, flowIndent, nodeContext, props))) hasContent = true;\n\t\t}\n\t\telse if (indentStatus === 0) hasContent = allowBlockCollections && readBlockSequence(state, blockIndent, props);\n\t}\n\tallowBlockScalars = allowBlockScalars && !hasContent;\n\tif (!hasContent && (props.anchorStart !== NO_RANGE$1 || props.tagStart !== NO_RANGE$1 || allowBlockScalars)) {\n\t\taddScalarEvent(state, NO_RANGE$1, NO_RANGE$1, props.anchorStart, props.anchorEnd, props.tagStart, props.tagEnd, 1);\n\t\thasContent = true;\n\t}\n\tstate.depth--;\n\treturn hasContent || props.anchorStart !== NO_RANGE$1 || props.tagStart !== NO_RANGE$1;\n}\nfunction readDirective(state) {\n\tif (state.lineIndent > 0 || state.input.charCodeAt(state.position) !== 37) return false;\n\tstate.position++;\n\tconst nameStart = state.position;\n\twhile (state.input.charCodeAt(state.position) !== 0 && !isWsOrEol(state.input.charCodeAt(state.position))) state.position++;\n\tconst name = state.input.slice(nameStart, state.position);\n\tconst args = [];\n\tif (name.length === 0) throwError(state, \"directive name must not be less than one character in length\");\n\twhile (state.input.charCodeAt(state.position) !== 0 && !isEol(state.input.charCodeAt(state.position))) {\n\t\twhile (isWhiteSpace(state.input.charCodeAt(state.position))) state.position++;\n\t\tif (state.input.charCodeAt(state.position) === 35 || isEol(state.input.charCodeAt(state.position)) || state.input.charCodeAt(state.position) === 0) break;\n\t\tconst start = state.position;\n\t\twhile (state.input.charCodeAt(state.position) !== 0 && !isWsOrEol(state.input.charCodeAt(state.position))) state.position++;\n\t\targs.push(state.input.slice(start, state.position));\n\t}\n\tif (isEol(state.input.charCodeAt(state.position))) consumeLineBreak(state);\n\tif (name === \"YAML\") {\n\t\tif (state.directives.some((directive) => directive.kind === \"yaml\")) throwError(state, \"duplication of %YAML directive\");\n\t\tif (args.length !== 1) throwError(state, \"YAML directive accepts exactly one argument\");\n\t\tconst match = /^([0-9]+)\\.([0-9]+)$/.exec(args[0]);\n\t\tif (match === null) throwError(state, \"ill-formed argument of the YAML directive\");\n\t\tif (parseInt(match[1], 10) !== 1) throwError(state, \"unacceptable YAML version of the document\");\n\t\tstate.directives.push({\n\t\t\tkind: \"yaml\",\n\t\t\tversion: args[0]\n\t\t});\n\t} else if (name === \"TAG\") {\n\t\tif (args.length !== 2) throwError(state, \"TAG directive accepts exactly two arguments\");\n\t\tconst [handle, prefix] = args;\n\t\tif (!PATTERN_TAG_HANDLE.test(handle)) throwError(state, \"ill-formed tag handle (first argument) of the TAG directive\");\n\t\tif (HAS_OWN.call(state.tagHandlers, handle)) throwError(state, `there is a previously declared suffix for \"${handle}\" tag handle`);\n\t\tif (!PATTERN_TAG_PREFIX.test(prefix)) throwError(state, \"ill-formed tag prefix (second argument) of the TAG directive\");\n\t\tstate.tagHandlers[handle] = prefix;\n\t\tstate.directives.push({\n\t\t\tkind: \"tag\",\n\t\t\thandle,\n\t\t\tprefix\n\t\t});\n\t}\n\treturn true;\n}\nfunction readDocument(state) {\n\tstate.directives = [];\n\tstate.tagHandlers = Object.create(null);\n\tlet hasDirectives = false;\n\tskipSeparationSpace(state, true);\n\twhile (readDirective(state)) {\n\t\thasDirectives = true;\n\t\tskipSeparationSpace(state, true);\n\t}\n\tlet explicitStart = false;\n\tlet explicitEnd = false;\n\tlet allowCompact = true;\n\tif (state.lineIndent === 0 && state.input.charCodeAt(state.position) === 45 && state.input.charCodeAt(state.position + 1) === 45 && state.input.charCodeAt(state.position + 2) === 45 && isWsOrEolOrEnd(state.input.charCodeAt(state.position + 3))) {\n\t\texplicitStart = true;\n\t\tconst markerLine = state.line;\n\t\tstate.position += 3;\n\t\tskipSeparationSpace(state, true);\n\t\tallowCompact = state.line > markerLine;\n\t} else if (hasDirectives) throwError(state, \"directives end mark is expected\");\n\tconst documentEventIndex = state.events.length;\n\tif (!explicitStart && state.position === state.lineStart && state.input.charCodeAt(state.position) === 46 && testDocumentSeparator(state)) {\n\t\tstate.position += 3;\n\t\tskipSeparationSpace(state, true);\n\t\treturn;\n\t}\n\taddDocumentEvent(state, explicitStart, false);\n\tif (!parseNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, allowCompact, allowCompact)) addEmptyScalarEvent(state);\n\tskipSeparationSpace(state, true);\n\tif (state.position === state.lineStart && testDocumentSeparator(state)) {\n\t\texplicitEnd = state.input.charCodeAt(state.position) === 46;\n\t\tif (explicitEnd) {\n\t\t\tconst markerLine = state.line;\n\t\t\tstate.position += 3;\n\t\t\tskipSeparationSpace(state, true);\n\t\t\tif (state.line === markerLine && state.position < state.length) throwError(state, \"end of the stream or a document separator is expected\");\n\t\t}\n\t}\n\tconst documentEvent = state.events[documentEventIndex];\n\tif (documentEvent?.type === 1) documentEvent.explicitEnd = explicitEnd;\n\taddPopEvent(state);\n\tif (!explicitEnd && state.position < state.length && !(state.position === state.lineStart && testDocumentSeparator(state))) throwError(state, \"end of the stream or a document separator is expected\");\n}\nfunction parseEvents(input, options) {\n\tconst length = input.length;\n\tconst state = {\n\t\t...DEFAULT_PARSER_OPTIONS,\n\t\t...options,\n\t\tinput: `${input}\\0`,\n\t\tlength,\n\t\tposition: 0,\n\t\tline: 0,\n\t\tlineStart: 0,\n\t\tlineIndent: 0,\n\t\tfirstTabInLine: -1,\n\t\tdepth: 0,\n\t\tdirectives: [],\n\t\ttagHandlers: Object.create(null),\n\t\tevents: []\n\t};\n\tconst nullpos = input.indexOf(\"\\0\");\n\tif (nullpos !== -1) throwErrorAt(input, nullpos, \"null byte is not allowed in input\", state.filename);\n\tif (state.input.charCodeAt(state.position) === 65279) state.position++;\n\twhile (state.position < state.length) {\n\t\tskipSeparationSpace(state, true);\n\t\tif (state.position >= state.length) break;\n\t\tconst documentStart = state.position;\n\t\treadDocument(state);\n\t\tif (state.position === documentStart)\n /* c8 ignore next */\n\t\tthrowError(state, \"can not read a document\");\n\t}\n\treturn state.events;\n}\n//#endregion\n//#region src/load.ts\nvar DEFAULT_LOAD_OPTIONS = {\n\t...DEFAULT_PARSER_OPTIONS,\n\t...DEFAULT_CONSTRUCTOR_OPTIONS\n};\nfunction loadDocuments(input, options = {}) {\n\tconst opts = {\n\t\t...DEFAULT_LOAD_OPTIONS,\n\t\t...options\n\t};\n\tconst source = String(input);\n\tconst PARSER_OPT_KEYS = Object.keys(DEFAULT_PARSER_OPTIONS);\n\tconst CONSTRUCTOR_OPT_KEYS = Object.keys(DEFAULT_CONSTRUCTOR_OPTIONS);\n\treturn constructFromEvents(parseEvents(source, pick(opts, PARSER_OPT_KEYS)), {\n\t\t...pick(opts, CONSTRUCTOR_OPT_KEYS),\n\t\tsource\n\t});\n}\nfunction loadAll(input, iteratorOrOptions, options) {\n\tlet iterator = null;\n\tif (typeof iteratorOrOptions === \"function\") iterator = iteratorOrOptions;\n\telse if (iteratorOrOptions !== null && typeof iteratorOrOptions === \"object\") options = iteratorOrOptions;\n\tconst documents = loadDocuments(input, options);\n\tif (iterator === null) return documents;\n\tfor (const document of documents) iterator(document);\n}\nfunction load(input, options) {\n\tconst documents = loadDocuments(input, options);\n\tif (documents.length === 0) throw new YAMLException(\"expected a document, but the input is empty\");\n\tif (documents.length === 1) return documents[0];\n\tthrow new YAMLException(\"expected a single document in the stream, but found more\");\n}\n//#endregion\n//#region src/ast/nodes.ts\nvar Style = class {\n\ttagged = false;\n\tflow = false;\n\tsingleQuoted = false;\n\tdoubleQuoted = false;\n\tliteral = false;\n\tfolded = false;\n};\n//#endregion\n//#region src/ast/from_js.ts\nvar INVALID = Symbol(\"INVALID\");\nfunction buildRepresentTypes(schema) {\n\tconst defaultTags = new Set([\n\t\tschema.defaultScalarTag,\n\t\tschema.defaultSequenceTag,\n\t\tschema.defaultMappingTag\n\t].filter((t) => t !== void 0));\n\tconst implicitScalars = schema.implicitScalarTags;\n\tconst explicitTags = schema.tags.filter((t) => !(t.nodeKind === \"scalar\" && t.implicit) && !defaultTags.has(t));\n\tconst defaultTagsLast = schema.tags.filter((t) => defaultTags.has(t));\n\treturn [\n\t\t...implicitScalars.map((tag) => ({\n\t\t\ttag,\n\t\t\timplicitTag: true\n\t\t})),\n\t\t...explicitTags.map((tag) => ({\n\t\t\ttag,\n\t\t\timplicitTag: false\n\t\t})),\n\t\t...defaultTagsLast.map((tag) => ({\n\t\t\ttag,\n\t\t\timplicitTag: true\n\t\t}))\n\t];\n}\nfunction matchTag(state, object) {\n\tfor (let index = 0, length = state.representTypes.length; index < length; index += 1) {\n\t\tconst { tag, implicitTag } = state.representTypes[index];\n\t\tif (tag.identify && tag.identify(object)) {\n\t\t\tlet tagName;\n\t\t\tif (tag.matchByTagPrefix && tag.representTagName) tagName = tag.representTagName(object);\n\t\t\telse tagName = tag.tagName;\n\t\t\treturn {\n\t\t\t\ttag,\n\t\t\t\ttagName,\n\t\t\t\timplicitTag\n\t\t\t};\n\t\t}\n\t}\n\treturn null;\n}\nfunction build(state, object) {\n\tif (!state.noRefs && object !== null && typeof object === \"object\") {\n\t\tconst existing = state.refs.get(object);\n\t\tif (existing) {\n\t\t\tif (existing.anchor === void 0) existing.anchor = `ref_${state.refCounter++}`;\n\t\t\treturn {\n\t\t\t\tkind: \"alias\",\n\t\t\t\ttag: \"\",\n\t\t\t\tstyle: new Style(),\n\t\t\t\tanchor: existing.anchor\n\t\t\t};\n\t\t}\n\t}\n\tconst matched = matchTag(state, object);\n\tif (!matched) {\n\t\tif (object === void 0) return INVALID;\n\t\tif (state.skipInvalid) return INVALID;\n\t\tthrow new YAMLException(`unacceptable kind of an object to dump ${Object.prototype.toString.call(object)}`);\n\t}\n\tconst { tag, tagName, implicitTag } = matched;\n\tconst nodeTagName = implicitTag ? tagName : tagNameShort(tagName);\n\tif (tag.nodeKind === \"scalar\") {\n\t\tconst style = new Style();\n\t\tstyle.tagged = !implicitTag;\n\t\treturn {\n\t\t\tkind: \"scalar\",\n\t\t\ttag: nodeTagName,\n\t\t\tstyle,\n\t\t\tvalue: tag.represent(object)\n\t\t};\n\t}\n\tif (tag.nodeKind === \"sequence\") {\n\t\tconst container = tag.represent(object);\n\t\tconst style = new Style();\n\t\tstyle.tagged = !implicitTag;\n\t\tconst node = {\n\t\t\tkind: \"sequence\",\n\t\t\ttag: nodeTagName,\n\t\t\tstyle,\n\t\t\titems: []\n\t\t};\n\t\tif (!state.noRefs) state.refs.set(object, node);\n\t\tfor (let index = 0, length = container.length; index < length; index += 1) {\n\t\t\tlet item = build(state, container[index]);\n\t\t\tif (item === INVALID && container[index] === void 0) item = build(state, null);\n\t\t\tif (item === INVALID) continue;\n\t\t\tnode.items.push(item);\n\t\t}\n\t\treturn node;\n\t}\n\tconst map = tag.represent(object);\n\tconst style = new Style();\n\tstyle.tagged = !implicitTag;\n\tconst node = {\n\t\tkind: \"mapping\",\n\t\ttag: nodeTagName,\n\t\tstyle,\n\t\titems: []\n\t};\n\tif (!state.noRefs) state.refs.set(object, node);\n\tfor (const [objectKey, objectValue] of map) {\n\t\tconst key = build(state, objectKey);\n\t\tif (key === INVALID) continue;\n\t\tconst value = build(state, objectValue);\n\t\tif (value === INVALID) continue;\n\t\tnode.items.push({\n\t\t\tkey,\n\t\t\tvalue\n\t\t});\n\t}\n\treturn node;\n}\nfunction jsToAst(input, schema, options = {}) {\n\tconst root = build({\n\t\trepresentTypes: buildRepresentTypes(schema),\n\t\tnoRefs: options.noRefs ?? false,\n\t\tskipInvalid: options.skipInvalid ?? false,\n\t\trefs: /* @__PURE__ */ new Map(),\n\t\trefCounter: 0\n\t}, input);\n\treturn [{\n\t\tcontents: root === INVALID ? null : root,\n\t\tdirectives: []\n\t}];\n}\n//#endregion\n//#region src/ast/visit.ts\nvar VISIT_BREAK = Symbol(\"visit:break\");\nvar VISIT_SKIP = Symbol(\"visit:skip\");\nfunction visitNode(node, visitor, ctx) {\n\tconst control = visitor(node, ctx);\n\tif (control === VISIT_BREAK) return true;\n\tif (control === VISIT_SKIP) return false;\n\tconst depth = ctx.depth + 1;\n\tswitch (node.kind) {\n\t\tcase \"sequence\":\n\t\t\tfor (const item of node.items) if (visitNode(item, visitor, {\n\t\t\t\tdepth,\n\t\t\t\tparent: node,\n\t\t\t\tisKey: false\n\t\t\t})) return true;\n\t\t\tbreak;\n\t\tcase \"mapping\":\n\t\t\tfor (const { key, value } of node.items) {\n\t\t\t\tif (visitNode(key, visitor, {\n\t\t\t\t\tdepth,\n\t\t\t\t\tparent: node,\n\t\t\t\t\tisKey: true\n\t\t\t\t})) return true;\n\t\t\t\tif (visitNode(value, visitor, {\n\t\t\t\t\tdepth,\n\t\t\t\t\tparent: node,\n\t\t\t\t\tisKey: false\n\t\t\t\t})) return true;\n\t\t\t}\n\t\t\tbreak;\n\t}\n\treturn false;\n}\nfunction visit(documents, visitor) {\n\tfor (const doc of documents) if (doc.contents && visitNode(doc.contents, visitor, {\n\t\tdepth: 0,\n\t\tparent: null,\n\t\tisKey: false\n\t})) return;\n}\n//#endregion\n//#region src/ast/presenter.ts\nvar CHAR_BOM = 65279;\nvar CHAR_TAB = 9;\nvar CHAR_LINE_FEED = 10;\nvar CHAR_CARRIAGE_RETURN = 13;\nvar CHAR_SPACE = 32;\nvar CHAR_EXCLAMATION = 33;\nvar CHAR_DOUBLE_QUOTE = 34;\nvar CHAR_SHARP = 35;\nvar CHAR_PERCENT = 37;\nvar CHAR_AMPERSAND = 38;\nvar CHAR_SINGLE_QUOTE = 39;\nvar CHAR_ASTERISK = 42;\nvar CHAR_COMMA = 44;\nvar CHAR_MINUS = 45;\nvar CHAR_COLON = 58;\nvar CHAR_EQUALS = 61;\nvar CHAR_GREATER_THAN = 62;\nvar CHAR_QUESTION = 63;\nvar CHAR_COMMERCIAL_AT = 64;\nvar CHAR_LEFT_SQUARE_BRACKET = 91;\nvar CHAR_RIGHT_SQUARE_BRACKET = 93;\nvar CHAR_GRAVE_ACCENT = 96;\nvar CHAR_LEFT_CURLY_BRACKET = 123;\nvar CHAR_VERTICAL_LINE = 124;\nvar CHAR_RIGHT_CURLY_BRACKET = 125;\nvar ESCAPE_SEQUENCES = {};\nESCAPE_SEQUENCES[0] = \"\\\\0\";\nESCAPE_SEQUENCES[7] = \"\\\\a\";\nESCAPE_SEQUENCES[8] = \"\\\\b\";\nESCAPE_SEQUENCES[9] = \"\\\\t\";\nESCAPE_SEQUENCES[10] = \"\\\\n\";\nESCAPE_SEQUENCES[11] = \"\\\\v\";\nESCAPE_SEQUENCES[12] = \"\\\\f\";\nESCAPE_SEQUENCES[13] = \"\\\\r\";\nESCAPE_SEQUENCES[27] = \"\\\\e\";\nESCAPE_SEQUENCES[34] = \"\\\\\\\"\";\nESCAPE_SEQUENCES[92] = \"\\\\\\\\\";\nESCAPE_SEQUENCES[133] = \"\\\\N\";\nESCAPE_SEQUENCES[160] = \"\\\\_\";\nESCAPE_SEQUENCES[8232] = \"\\\\L\";\nESCAPE_SEQUENCES[8233] = \"\\\\P\";\nvar DEFAULT_PRESENTER_OPTIONS = {\n\tindent: 2,\n\tseqNoIndent: false,\n\tseqInlineFirst: true,\n\tsortKeys: false,\n\tlineWidth: 80,\n\tflowBracketPadding: false,\n\tflowSkipCommaSpace: false,\n\tflowSkipColonSpace: false,\n\tquoteFlowKeys: false,\n\tquoteStyle: \"single\",\n\tforceQuotes: false,\n\ttagBeforeAnchor: false\n};\nfunction nodeTagShort(node) {\n\treturn node.style.tagged ? node.tag : tagNameShort(node.tag);\n}\nfunction createPresenterState(options) {\n\tconst opts = {\n\t\t...DEFAULT_PRESENTER_OPTIONS,\n\t\t...options\n\t};\n\treturn {\n\t\t...opts,\n\t\tdefaultScalarTagName: opts.schema.defaultScalarTag.tagName,\n\t\timplicitResolvers: opts.schema.implicitScalarTags\n\t};\n}\nfunction encodeNonPrintable(character) {\n\tconst string = character.toString(16).toUpperCase();\n\tconst handle = character <= 255 ? \"x\" : \"u\";\n\tconst length = character <= 255 ? 2 : 4;\n\treturn `\\\\${handle}${\"0\".repeat(length - string.length)}${string}`;\n}\nfunction indentString(string, spaces) {\n\tconst ind = \" \".repeat(spaces);\n\tlet position = 0;\n\tlet result = \"\";\n\tconst length = string.length;\n\twhile (position < length) {\n\t\tlet line;\n\t\tconst next = string.indexOf(\"\\n\", position);\n\t\tif (next === -1) {\n\t\t\tline = string.slice(position);\n\t\t\tposition = length;\n\t\t} else {\n\t\t\tline = string.slice(position, next + 1);\n\t\t\tposition = next + 1;\n\t\t}\n\t\tif (line.length && line !== \"\\n\") result += ind;\n\t\tresult += line;\n\t}\n\treturn result;\n}\nfunction generateNextLine(state, level) {\n\treturn `\\n${\" \".repeat(state.indent * level)}`;\n}\nfunction scalarLayout(state, level) {\n\tconst indent = state.indent * Math.max(1, level);\n\treturn {\n\t\tindent,\n\t\tblockIndent: level === 0 ? state.indent + 1 : state.indent,\n\t\tlineWidth: state.lineWidth === -1 ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent)\n\t};\n}\nfunction resolveImplicitTag(state, str) {\n\tfor (let index = 0, length = state.implicitResolvers.length; index < length; index += 1) {\n\t\tconst tagDefinition = state.implicitResolvers[index];\n\t\tif (tagDefinition.resolve(str, false, tagDefinition.tagName) !== NOT_RESOLVED) return tagDefinition.tagName;\n\t}\n\treturn state.defaultScalarTagName;\n}\nfunction isWhitespace(c) {\n\treturn c === CHAR_SPACE || c === CHAR_TAB;\n}\nfunction startsWithDocumentSeparator(string) {\n\tconst marker = string.charCodeAt(0);\n\tif (marker !== CHAR_MINUS && marker !== 46 || string.charCodeAt(1) !== marker || string.charCodeAt(2) !== marker) return false;\n\tif (string.length === 3) return true;\n\tconst following = string.charCodeAt(3);\n\treturn isWhitespace(following) || following === CHAR_CARRIAGE_RETURN || following === CHAR_LINE_FEED;\n}\nfunction isPrintable(c) {\n\treturn c >= 32 && c <= 126 || c >= 161 && c <= 55295 && c !== 8232 && c !== 8233 || c >= 57344 && c <= 65533 && c !== CHAR_BOM || c >= 65536 && c <= 1114111;\n}\nfunction isNsCharOrWhitespace(c) {\n\treturn isPrintable(c) && c !== CHAR_BOM && c !== CHAR_CARRIAGE_RETURN && c !== CHAR_LINE_FEED;\n}\nfunction isPlainSafe(c, prev, inblock) {\n\tconst cIsNsCharOrWhitespace = isNsCharOrWhitespace(c);\n\tconst cIsNsChar = cIsNsCharOrWhitespace && !isWhitespace(c);\n\treturn (inblock ? cIsNsCharOrWhitespace : cIsNsCharOrWhitespace && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET) && c !== CHAR_SHARP && !(prev === CHAR_COLON && !cIsNsChar) || isNsCharOrWhitespace(prev) && !isWhitespace(prev) && c === CHAR_SHARP || prev === CHAR_COLON && cIsNsChar && (inblock || c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET);\n}\nfunction isPlainSafeFirst(c) {\n\treturn isPrintable(c) && c !== CHAR_BOM && !isWhitespace(c) && c !== CHAR_MINUS && c !== CHAR_QUESTION && c !== CHAR_COLON && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET && c !== CHAR_SHARP && c !== CHAR_AMPERSAND && c !== CHAR_ASTERISK && c !== CHAR_EXCLAMATION && c !== CHAR_VERTICAL_LINE && c !== CHAR_EQUALS && c !== CHAR_GREATER_THAN && c !== CHAR_SINGLE_QUOTE && c !== CHAR_DOUBLE_QUOTE && c !== CHAR_PERCENT && c !== CHAR_COMMERCIAL_AT && c !== CHAR_GRAVE_ACCENT;\n}\nfunction isPlainSafeAtStart(string, inblock) {\n\tconst first = codePointAt(string, 0);\n\tif (isPlainSafeFirst(first)) return true;\n\tif (string.length > 1 && (first === CHAR_MINUS || first === CHAR_QUESTION || first === CHAR_COLON)) {\n\t\tconst second = codePointAt(string, 1);\n\t\treturn !isWhitespace(second) && isPlainSafe(second, first, inblock);\n\t}\n\treturn false;\n}\nfunction isPlainSafeLast(c) {\n\treturn !isWhitespace(c) && c !== CHAR_COLON;\n}\nfunction codePointAt(string, pos) {\n\tconst first = string.charCodeAt(pos);\n\tlet second;\n\tif (first >= 55296 && first <= 56319 && pos + 1 < string.length) {\n\t\tsecond = string.charCodeAt(pos + 1);\n\t\tif (second >= 56320 && second <= 57343) return (first - 55296) * 1024 + second - 56320 + 65536;\n\t}\n\treturn first;\n}\nfunction needIndentIndicator(string) {\n\treturn /^\\n* /.test(string);\n}\nvar STYLE_PLAIN = 1;\nvar STYLE_SINGLE = 2;\nvar STYLE_LITERAL = 3;\nvar STYLE_FOLDED = 4;\nvar STYLE_DOUBLE = 5;\nfunction chooseScalarStyle(state, string, layout, singleLineOnly, forceQuote, inblock) {\n\tconst { blockIndent, lineWidth } = layout;\n\tlet i;\n\tlet char = 0;\n\tlet prevChar = -1;\n\tlet hasLineBreak = false;\n\tlet hasFoldableLine = false;\n\tconst shouldTrackWidth = lineWidth !== -1;\n\tlet previousLineBreak = -1;\n\tlet plain = !startsWithDocumentSeparator(string) && isPlainSafeAtStart(string, inblock) && isPlainSafeLast(codePointAt(string, string.length - 1));\n\tif (singleLineOnly || forceQuote) for (i = 0; i < string.length; char >= 65536 ? i += 2 : i++) {\n\t\tchar = codePointAt(string, i);\n\t\tif (!isPrintable(char)) return STYLE_DOUBLE;\n\t\tplain = plain && isPlainSafe(char, prevChar, inblock);\n\t\tprevChar = char;\n\t}\n\telse {\n\t\tfor (i = 0; i < string.length; char >= 65536 ? i += 2 : i++) {\n\t\t\tchar = codePointAt(string, i);\n\t\t\tif (char === CHAR_LINE_FEED) {\n\t\t\t\thasLineBreak = true;\n\t\t\t\tif (shouldTrackWidth) {\n\t\t\t\t\thasFoldableLine = hasFoldableLine || i - previousLineBreak - 1 > lineWidth && string[previousLineBreak + 1] !== \" \";\n\t\t\t\t\tpreviousLineBreak = i;\n\t\t\t\t}\n\t\t\t} else if (!isPrintable(char)) return STYLE_DOUBLE;\n\t\t\tplain = plain && isPlainSafe(char, prevChar, inblock);\n\t\t\tprevChar = char;\n\t\t}\n\t\thasFoldableLine = hasFoldableLine || shouldTrackWidth && i - previousLineBreak - 1 > lineWidth && string[previousLineBreak + 1] !== \" \";\n\t}\n\tif (!hasLineBreak && !hasFoldableLine) {\n\t\tif (plain && !forceQuote) return STYLE_PLAIN;\n\t\treturn state.quoteStyle === \"double\" ? STYLE_DOUBLE : STYLE_SINGLE;\n\t}\n\tif (blockIndent > 9 && needIndentIndicator(string)) return STYLE_DOUBLE;\n\treturn hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL;\n}\nfunction renderScalarStyle(string, style, layout) {\n\tconst { indent, blockIndent, lineWidth } = layout;\n\tswitch (style) {\n\t\tcase STYLE_PLAIN: return encodeFlowBreaks(string, indent);\n\t\tcase STYLE_SINGLE: return `'${encodeFlowBreaks(string, indent).replace(/'/g, \"''\")}'`;\n\t\tcase STYLE_LITERAL: return \"|\" + blockHeader(string, blockIndent) + dropEndingNewline(indentString(string, indent));\n\t\tcase STYLE_FOLDED: return \">\" + blockHeader(string, blockIndent) + dropEndingNewline(indentString(foldBlockScalar(string, lineWidth), indent));\n\t\tcase STYLE_DOUBLE: return `\"${escapeString(string)}\"`;\n\t}\n}\nfunction resolveScalarStyle(state, node, layout, iskey, inblock) {\n\tconst singleLineOnly = iskey || !inblock;\n\tif (node.style.singleQuoted) return STYLE_SINGLE;\n\tif (node.style.doubleQuoted) return STYLE_DOUBLE;\n\tif (!singleLineOnly) {\n\t\tif (node.style.literal) return STYLE_LITERAL;\n\t\tif (node.style.folded) return STYLE_FOLDED;\n\t}\n\tconst string = node.value;\n\tif (string.length === 0) {\n\t\tif (node.style.tagged || resolveImplicitTag(state, string) === node.tag) return STYLE_PLAIN;\n\t\treturn state.quoteStyle === \"double\" ? STYLE_DOUBLE : STYLE_SINGLE;\n\t}\n\tconst style = chooseScalarStyle(state, string, layout, singleLineOnly, state.forceQuotes && !iskey, inblock);\n\tif (style === STYLE_PLAIN && !node.style.tagged && resolveImplicitTag(state, string) !== node.tag) return state.quoteStyle === \"double\" ? STYLE_DOUBLE : STYLE_SINGLE;\n\treturn style;\n}\nfunction blockHeader(string, indentPerLevel) {\n\tconst indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : \"\";\n\tconst clip = string[string.length - 1] === \"\\n\";\n\treturn `${indentIndicator}${clip && (string[string.length - 2] === \"\\n\" || string === \"\\n\") ? \"+\" : clip ? \"\" : \"-\"}\\n`;\n}\nfunction encodeFlowBreaks(string, indent) {\n\tlet nextLF = string.indexOf(\"\\n\");\n\tif (nextLF === -1) return string;\n\tconst pad = \" \".repeat(indent);\n\tlet result = string.slice(0, nextLF);\n\tconst lineRe = /(\\n+)([^\\n]*)/g;\n\tlineRe.lastIndex = nextLF;\n\tlet match;\n\twhile (match = lineRe.exec(string)) {\n\t\tconst breaks = match[1].length;\n\t\tconst line = match[2];\n\t\tresult += \"\\n\".repeat(breaks + 1) + pad + line;\n\t}\n\treturn result;\n}\nfunction dropEndingNewline(string) {\n\treturn string[string.length - 1] === \"\\n\" ? string.slice(0, -1) : string;\n}\nfunction foldBlockScalar(string, width) {\n\tconst lineRe = /(\\n+)([^\\n]*)/g;\n\tlet nextLF = string.indexOf(\"\\n\");\n\tif (nextLF === -1) nextLF = string.length;\n\tlineRe.lastIndex = nextLF;\n\tlet result = foldLine(string.slice(0, nextLF), width);\n\tlet prevMoreIndented = string[0] === \"\\n\" || string[0] === \" \";\n\tlet moreIndented;\n\tlet match;\n\twhile (match = lineRe.exec(string)) {\n\t\tconst prefix = match[1];\n\t\tconst line = match[2];\n\t\tmoreIndented = line[0] === \" \";\n\t\tresult += prefix + (!prevMoreIndented && !moreIndented && line !== \"\" ? \"\\n\" : \"\") + foldLine(line, width);\n\t\tprevMoreIndented = moreIndented;\n\t}\n\treturn result;\n}\nfunction foldLine(line, width) {\n\tif (line === \"\" || line[0] === \" \") return line;\n\tconst breakRe = / [^ ]/g;\n\tlet match;\n\tlet start = 0;\n\tlet end;\n\tlet curr = 0;\n\tlet next = 0;\n\tlet result = \"\";\n\twhile (match = breakRe.exec(line)) {\n\t\tnext = match.index;\n\t\tif (next - start > width) {\n\t\t\tend = curr > start ? curr : next;\n\t\t\tresult += `\\n${line.slice(start, end)}`;\n\t\t\tstart = end + 1;\n\t\t}\n\t\tcurr = next;\n\t}\n\tresult += \"\\n\";\n\tif (line.length - start > width && curr > start) result += `${line.slice(start, curr)}\\n${line.slice(curr + 1)}`;\n\telse result += line.slice(start);\n\treturn result.slice(1);\n}\nfunction escapeString(string) {\n\tlet result = \"\";\n\tlet char = 0;\n\tfor (let i = 0; i < string.length; char >= 65536 ? i += 2 : i++) {\n\t\tchar = codePointAt(string, i);\n\t\tconst escapeSeq = ESCAPE_SEQUENCES[char];\n\t\tif (escapeSeq) {\n\t\t\tresult += escapeSeq;\n\t\t\tcontinue;\n\t\t}\n\t\tif (isPrintable(char)) {\n\t\t\tresult += string[i];\n\t\t\tif (char >= 65536) result += string[i + 1];\n\t\t\tcontinue;\n\t\t}\n\t\tresult += encodeNonPrintable(char);\n\t}\n\treturn result;\n}\nfunction writeFlowSequence(state, level, node) {\n\tlet result = \"\";\n\tfor (let index = 0, length = node.items.length; index < length; index += 1) {\n\t\tconst item = writeNode(state, level, node.items[index], {});\n\t\tif (result !== \"\") result += `,${!state.flowSkipCommaSpace ? \" \" : \"\"}`;\n\t\tresult += item;\n\t}\n\tconst pad = state.flowBracketPadding && result !== \"\" ? \" \" : \"\";\n\treturn `[${pad}${result}${pad}]`;\n}\nfunction writeBlockSequence(state, level, node, compact) {\n\tlet result = \"\";\n\tfor (let index = 0, length = node.items.length; index < length; index += 1) {\n\t\tconst item = writeNode(state, level + 1, node.items[index], {\n\t\t\tblock: true,\n\t\t\tcompact: state.seqInlineFirst,\n\t\t\tisblockseq: true\n\t\t});\n\t\tif (!compact || result !== \"\") result += generateNextLine(state, level);\n\t\tif (item === \"\" || CHAR_LINE_FEED === item.charCodeAt(0)) result += \"-\";\n\t\telse result += \"- \";\n\t\tresult += item;\n\t}\n\treturn result;\n}\nfunction writeFlowMapping(state, level, node) {\n\tlet result = \"\";\n\tconst items = sortMappingItems(state, node.items);\n\tfor (const { key, value } of items) {\n\t\tlet pairBuffer = \"\";\n\t\tif (result !== \"\") pairBuffer += `,${!state.flowSkipCommaSpace ? \" \" : \"\"}`;\n\t\tconst keyText = writeNode(state, level, key, { iskey: true });\n\t\tconst explicitPair = keyText.length > 1024;\n\t\tif (explicitPair) pairBuffer += \"? \";\n\t\telse if (state.quoteFlowKeys) pairBuffer += \"\\\"\";\n\t\tconst valueText = writeNode(state, level, value, {});\n\t\tconst sep = state.flowSkipColonSpace || valueText === \"\" ? \"\" : \" \";\n\t\tpairBuffer += `${keyText}${state.quoteFlowKeys && !explicitPair ? \"\\\"\" : \"\"}:${sep}${valueText}`;\n\t\tresult += pairBuffer;\n\t}\n\tconst pad = state.flowBracketPadding && result !== \"\" ? \" \" : \"\";\n\treturn `{${pad}${result}${pad}}`;\n}\nfunction sortKeyValue(key) {\n\treturn key.kind === \"scalar\" ? key.value : key;\n}\nfunction sortMappingItems(state, items) {\n\tif (!state.sortKeys) return items;\n\tconst copy = items.slice();\n\tif (state.sortKeys === true) copy.sort((a, b) => {\n\t\tconst x = sortKeyValue(a.key);\n\t\tconst y = sortKeyValue(b.key);\n\t\tif (x < y) return -1;\n\t\tif (x > y) return 1;\n\t\treturn 0;\n\t});\n\telse {\n\t\tconst fn = state.sortKeys;\n\t\tcopy.sort((a, b) => fn(sortKeyValue(a.key), sortKeyValue(b.key)));\n\t}\n\treturn copy;\n}\nfunction writeBlockMapping(state, level, node, compact) {\n\tlet result = \"\";\n\tconst items = sortMappingItems(state, node.items);\n\tfor (let index = 0, length = items.length; index < length; index += 1) {\n\t\tlet pairBuffer = \"\";\n\t\tif (!compact || result !== \"\") pairBuffer += generateNextLine(state, level);\n\t\tconst { key, value } = items[index];\n\t\tconst keyIsBlock = (key.kind === \"mapping\" || key.kind === \"sequence\") && !key.style.flow && key.items.length !== 0 || key.kind === \"scalar\" && (key.style.literal || key.style.folded);\n\t\tconst keyText = keyIsBlock ? writeNode(state, level + 1, key, {\n\t\t\tblock: true,\n\t\t\tcompact: true,\n\t\t\tisblockseq: !cannotBeCompact(state, key, level + 1)\n\t\t}) : writeNode(state, level + 1, key, {\n\t\t\tblock: true,\n\t\t\tcompact: true,\n\t\t\tiskey: true\n\t\t});\n\t\tconst keyHasLineBreak = key.kind === \"scalar\" && key.value.indexOf(\"\\n\") !== -1;\n\t\tconst explicitPair = keyIsBlock || keyHasLineBreak || keyText.length > 1024;\n\t\tif (explicitPair) if (keyText && CHAR_LINE_FEED === keyText.charCodeAt(0)) pairBuffer += \"?\";\n\t\telse pairBuffer += \"? \";\n\t\tpairBuffer += keyText;\n\t\tif (explicitPair) pairBuffer += generateNextLine(state, level);\n\t\tconst valueText = writeNode(state, level + 1, value, {\n\t\t\tblock: true,\n\t\t\tcompact: explicitPair,\n\t\t\tisblockseq: explicitPair && !cannotBeCompact(state, value, level + 1)\n\t\t});\n\t\tconst keyIsBareProps = key.kind === \"scalar\" && key.value === \"\" && keyText !== \"\" && keyText.charCodeAt(keyText.length - 1) !== CHAR_SINGLE_QUOTE && keyText.charCodeAt(keyText.length - 1) !== CHAR_DOUBLE_QUOTE;\n\t\tconst keyColonSep = !explicitPair && (key.kind === \"alias\" || keyIsBareProps) ? \" \" : \"\";\n\t\tif (valueText === \"\" || CHAR_LINE_FEED === valueText.charCodeAt(0)) pairBuffer += `${keyColonSep}:`;\n\t\telse pairBuffer += `${keyColonSep}: `;\n\t\tpairBuffer += valueText;\n\t\tresult += pairBuffer;\n\t}\n\treturn result;\n}\nfunction cannotBeCompact(state, node, level) {\n\treturn node.style.tagged || node.anchor !== void 0 || state.indent < 2 && level > 0;\n}\nfunction writeNode(state, level, node, ctx) {\n\tif (node.kind === \"alias\") return `*${node.anchor}`;\n\tconst { block = false, iskey = false, isblockseq = false } = ctx;\n\tlet compact = ctx.compact ?? false;\n\tconst hasAnchor = node.anchor !== void 0;\n\tif (cannotBeCompact(state, node, level)) compact = false;\n\tlet body;\n\tlet shouldPrintTag = node.style.tagged;\n\tconst useBlockCollection = block && (node.kind === \"mapping\" || node.kind === \"sequence\") && !node.style.flow && node.items.length !== 0;\n\tif (node.kind === \"mapping\") if (useBlockCollection) body = writeBlockMapping(state, level, node, compact);\n\telse body = writeFlowMapping(state, level, node);\n\telse if (node.kind === \"sequence\") if (useBlockCollection) if (state.seqNoIndent && !isblockseq && level > 0) body = writeBlockSequence(state, level - 1, node, compact);\n\telse body = writeBlockSequence(state, level, node, compact);\n\telse body = writeFlowSequence(state, level, node);\n\telse {\n\t\tconst layout = scalarLayout(state, level);\n\t\tconst style = resolveScalarStyle(state, node, layout, iskey, block);\n\t\tbody = renderScalarStyle(node.value, style, layout);\n\t\tshouldPrintTag = node.style.tagged || style !== STYLE_PLAIN && node.tag !== state.defaultScalarTagName;\n\t}\n\tif (useBlockCollection && compact && level > 0 && state.indent > 2) body = `${\" \".repeat(state.indent - 2)}${body}`;\n\tif (shouldPrintTag || hasAnchor) {\n\t\tconst props = [];\n\t\tconst tag = shouldPrintTag ? nodeTagShort(node) : null;\n\t\tconst anchor = hasAnchor ? `&${node.anchor}` : null;\n\t\tif (state.tagBeforeAnchor) {\n\t\t\tif (tag !== null) props.push(tag);\n\t\t\tif (anchor !== null) props.push(anchor);\n\t\t} else {\n\t\t\tif (anchor !== null) props.push(anchor);\n\t\t\tif (tag !== null) props.push(tag);\n\t\t}\n\t\tconst sep = body === \"\" || body.charCodeAt(0) === CHAR_LINE_FEED ? \"\" : \" \";\n\t\tbody = `${props.join(\" \")}${sep}${body}`;\n\t}\n\treturn body;\n}\nfunction rootStartsOwnLine(node) {\n\treturn (node.kind === \"sequence\" || node.kind === \"mapping\") && !node.style.flow && node.items.length !== 0 && !node.style.tagged && node.anchor === void 0;\n}\nfunction isOpenEnded(node) {\n\tlet leaf = node;\n\twhile ((leaf.kind === \"sequence\" || leaf.kind === \"mapping\") && !leaf.style.flow && leaf.items.length !== 0) leaf = leaf.kind === \"sequence\" ? leaf.items[leaf.items.length - 1] : leaf.items[leaf.items.length - 1].value;\n\tif (leaf.kind !== \"scalar\" || !(leaf.style.literal || leaf.style.folded)) return false;\n\tconst { value } = leaf;\n\treturn value.endsWith(\"\\n\\n\") || value === \"\\n\";\n}\nfunction writeDocumentDirectives(doc) {\n\tlet result = \"\";\n\tfor (const directive of doc.directives) {\n\t\tif (directive.kind === \"yaml\") {\n\t\t\tresult += `%YAML ${directive.version}\\n`;\n\t\t\tcontinue;\n\t\t}\n\t\tconst { handle, prefix } = directive;\n\t\tresult += `%TAG ${handle} ${prefix}\\n`;\n\t}\n\treturn result;\n}\nfunction present(documents, options) {\n\tconst state = createPresenterState(options);\n\tlet result = \"\";\n\tlet previousEnded = false;\n\tfor (let index = 0; index < documents.length; index += 1) {\n\t\tconst doc = documents[index];\n\t\tconst directives = writeDocumentDirectives(doc);\n\t\tconst hasDirectives = directives !== \"\";\n\t\tconst marker = doc.explicitStart || hasDirectives || index > 0 && !previousEnded;\n\t\tresult += directives;\n\t\tif (doc.contents === null) {\n\t\t\tif (marker) result += \"---\\n\";\n\t\t} else if (marker) {\n\t\t\tconst body = writeNode(state, 0, doc.contents, {\n\t\t\t\tblock: true,\n\t\t\t\tcompact: true\n\t\t\t});\n\t\t\tconst sep = body === \"\" ? \"\" : hasDirectives || rootStartsOwnLine(doc.contents) ? \"\\n\" : \" \";\n\t\t\tresult += `---${sep}${body}\\n`;\n\t\t} else result += writeNode(state, 0, doc.contents, {\n\t\t\tblock: true,\n\t\t\tcompact: true\n\t\t}) + \"\\n\";\n\t\tpreviousEnded = doc.explicitEnd || doc.contents !== null && isOpenEnded(doc.contents);\n\t\tif (previousEnded) result += \"...\\n\";\n\t}\n\treturn result;\n}\n//#endregion\n//#region src/dump.ts\nvar DEFAULT_DUMP_SCHEMA = YAML11_SCHEMA.withTags({\n\t...intYaml11Tag,\n\tresolve: (source, isExplicit, tagName) => {\n\t\tconst result = intYaml11Tag.resolve(source, isExplicit, tagName);\n\t\treturn result === NOT_RESOLVED ? intCoreTag.resolve(source, isExplicit, tagName) : result;\n\t}\n}, {\n\t...floatYaml11Tag,\n\tresolve: (source, isExplicit, tagName) => {\n\t\tconst result = floatYaml11Tag.resolve(source, isExplicit, tagName);\n\t\treturn result === NOT_RESOLVED ? floatCoreTag.resolve(source, isExplicit, tagName) : result;\n\t}\n});\nvar DEFAULT_DUMP_OPTIONS = {\n\t...DEFAULT_PRESENTER_OPTIONS,\n\tschema: DEFAULT_DUMP_SCHEMA,\n\tskipInvalid: false,\n\tnoRefs: false,\n\tflowLevel: -1,\n\ttransform: () => {}\n};\nfunction dump(input, options = {}) {\n\tconst opts = {\n\t\t...DEFAULT_DUMP_OPTIONS,\n\t\t...options\n\t};\n\tconst documents = jsToAst(input, opts.schema, {\n\t\tnoRefs: opts.noRefs,\n\t\tskipInvalid: opts.skipInvalid\n\t});\n\tif (opts.flowLevel >= 0) visit(documents, (node, ctx) => {\n\t\tif (ctx.depth < opts.flowLevel) return;\n\t\tnode.style.flow = true;\n\t\treturn VISIT_SKIP;\n\t});\n\topts.transform(documents);\n\treturn present(documents, {\n\t\t...pick(opts, Object.keys(DEFAULT_PRESENTER_OPTIONS)),\n\t\tschema: opts.schema\n\t});\n}\n//#endregion\n//#region src/ast/from_events.ts\nvar NO_RANGE = -1;\nfunction eventPosition(event) {\n\tif (\"tagStart\" in event && event.tagStart !== NO_RANGE) return event.tagStart;\n\tif (\"anchorStart\" in event && event.anchorStart !== NO_RANGE) return event.anchorStart;\n\tif (\"valueStart\" in event && event.valueStart !== NO_RANGE) return event.valueStart;\n\tif (\"start\" in event) return event.start;\n\treturn 0;\n}\nfunction rawTag(state, event) {\n\treturn event.tagStart === NO_RANGE ? \"\" : state.source.slice(event.tagStart, event.tagEnd);\n}\nfunction anchorName(state, event) {\n\treturn event.anchorStart === NO_RANGE ? void 0 : state.source.slice(event.anchorStart, event.anchorEnd);\n}\nfunction implicitScalarTagName(state, source) {\n\tconst { schema } = state;\n\tconst candidates = schema.implicitScalarByFirstChar.get(source.charAt(0)) ?? schema.implicitScalarAnyFirstChar;\n\tfor (const tag of candidates) if (tag.resolve(source, false, tag.tagName) !== NOT_RESOLVED) return tag.tagName;\n\treturn schema.defaultScalarTag.tagName;\n}\nfunction buildScalar(state, event) {\n\tconst value = getScalarValue(state.source, event);\n\tconst raw = rawTag(state, event);\n\tconst style = new Style();\n\tswitch (event.style) {\n\t\tcase 2:\n\t\t\tstyle.singleQuoted = true;\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tstyle.doubleQuoted = true;\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tstyle.literal = true;\n\t\t\tbreak;\n\t\tcase 5:\n\t\t\tstyle.folded = true;\n\t\t\tbreak;\n\t}\n\tlet tag;\n\tif (raw !== \"\") {\n\t\tstyle.tagged = true;\n\t\ttag = raw;\n\t} else if (event.style === 1) tag = implicitScalarTagName(state, value);\n\telse tag = state.schema.defaultScalarTag.tagName;\n\treturn {\n\t\tkind: \"scalar\",\n\t\ttag,\n\t\tstyle,\n\t\tanchor: anchorName(state, event),\n\t\tvalue\n\t};\n}\nfunction buildCollection(state, event, defaultTagName) {\n\tconst raw = rawTag(state, event);\n\tconst style = new Style();\n\tif (event.style === 2) style.flow = true;\n\tlet tag;\n\tif (raw === \"\") tag = defaultTagName;\n\telse {\n\t\ttag = raw;\n\t\tstyle.tagged = true;\n\t}\n\treturn {\n\t\ttag,\n\t\tstyle,\n\t\tanchor: anchorName(state, event)\n\t};\n}\nfunction addNode(state, node) {\n\tconst frame = state.frames[state.frames.length - 1];\n\tif (frame.kind === \"document\") frame.doc.contents = node;\n\telse if (frame.kind === \"sequence\") frame.node.items.push(node);\n\telse if (frame.key) {\n\t\tframe.node.items.push({\n\t\t\tkey: frame.key,\n\t\t\tvalue: node\n\t\t});\n\t\tframe.key = null;\n\t} else frame.key = node;\n}\nfunction eventsToAst(events, options) {\n\tconst state = {\n\t\tsource: options.source,\n\t\tschema: options.schema,\n\t\teventIndex: 0,\n\t\tposition: 0,\n\t\tframes: [],\n\t\tdocuments: []\n\t};\n\twhile (state.eventIndex < events.length) {\n\t\tconst event = events[state.eventIndex++];\n\t\tstate.position = eventPosition(event);\n\t\tswitch (event.type) {\n\t\t\tcase 1: {\n\t\t\t\tconst doc = {\n\t\t\t\t\tcontents: null,\n\t\t\t\t\texplicitStart: event.explicitStart,\n\t\t\t\t\texplicitEnd: event.explicitEnd,\n\t\t\t\t\tdirectives: event.directives\n\t\t\t\t};\n\t\t\t\tstate.frames.push({\n\t\t\t\t\tkind: \"document\",\n\t\t\t\t\tdoc\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 4:\n\t\t\t\taddNode(state, buildScalar(state, event));\n\t\t\t\tbreak;\n\t\t\tcase 2: {\n\t\t\t\tconst { tag, style, anchor } = buildCollection(state, event, \"tag:yaml.org,2002:seq\");\n\t\t\t\tconst node = {\n\t\t\t\t\tkind: \"sequence\",\n\t\t\t\t\ttag,\n\t\t\t\t\tstyle,\n\t\t\t\t\tanchor,\n\t\t\t\t\titems: []\n\t\t\t\t};\n\t\t\t\tstate.frames.push({\n\t\t\t\t\tkind: \"sequence\",\n\t\t\t\t\tnode\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 3: {\n\t\t\t\tconst { tag, style, anchor } = buildCollection(state, event, \"tag:yaml.org,2002:map\");\n\t\t\t\tconst node = {\n\t\t\t\t\tkind: \"mapping\",\n\t\t\t\t\ttag,\n\t\t\t\t\tstyle,\n\t\t\t\t\tanchor,\n\t\t\t\t\titems: []\n\t\t\t\t};\n\t\t\t\tstate.frames.push({\n\t\t\t\t\tkind: \"mapping\",\n\t\t\t\t\tnode,\n\t\t\t\t\tkey: null\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 5: {\n\t\t\t\tconst name = state.source.slice(event.anchorStart, event.anchorEnd);\n\t\t\t\taddNode(state, {\n\t\t\t\t\tkind: \"alias\",\n\t\t\t\t\ttag: \"\",\n\t\t\t\t\tstyle: new Style(),\n\t\t\t\t\tanchor: name\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 6: {\n\t\t\t\tconst frame = state.frames.pop();\n\t\t\t\tif (frame.kind === \"document\") state.documents.push(frame.doc);\n\t\t\t\telse addNode(state, frame.node);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn state.documents;\n}\n//#endregion\nexport { CHOMPING_CLIP, CHOMPING_KEEP, CHOMPING_STRIP, COLLECTION_STYLE_BLOCK, COLLECTION_STYLE_FLOW, CORE_SCHEMA, EVENT_ALIAS, EVENT_DOCUMENT, EVENT_MAPPING, EVENT_POP, EVENT_SCALAR, EVENT_SEQUENCE, FAILSAFE_SCHEMA, JSON_SCHEMA, MERGE_KEY, NOT_RESOLVED, SCALAR_STYLE_DOUBLE_QUOTED, SCALAR_STYLE_FOLDED_BLOCK, SCALAR_STYLE_LITERAL_BLOCK, SCALAR_STYLE_PLAIN, SCALAR_STYLE_SINGLE_QUOTED, Schema, Style, VISIT_BREAK, VISIT_SKIP, YAML11_SCHEMA, YAMLException, binaryTag, boolCoreTag, boolJsonTag, boolYaml11Tag, constructFromEvents, defineMappingTag, defineScalarTag, defineSequenceTag, dump, eventsToAst, floatCoreTag, floatJsonTag, floatYaml11Tag, getScalarValue, intCoreTag, intJsonTag, intYaml11Tag, jsToAst, legacyMapTag, load, loadAll, mapTag, mergeTag, nullCoreTag, nullJsonTag, nullYaml11Tag, omapTag, pairsTag, parseEvents, present, realMapTag, seqTag, setTag, strTag, timestampTag, visit };\n\n//# sourceMappingURL=js-yaml.mjs.map","import { fileExists } from \"./config-utils.mjs\";\nimport { findConfigFile } from \"./config-path.mjs\";\nimport buildDebug from \"debug\";\nimport { isObject } from \"lodash-es\";\nimport { API_ERROR, APP_ERROR } from \"@verdaccio/core\";\nimport fs from \"node:fs\";\nimport { CORE_SCHEMA, Schema, YAMLException, dump, load, mergeTag } from \"js-yaml\";\n//#region src/parse.ts\nvar debug = buildDebug(\"verdaccio:config:parse\");\n/**\n* js-yaml v5 defaults to the YAML 1.2 CORE_SCHEMA, which no longer resolves\n* merge keys (`<<`). Extend it with the merge tag so anchors + `<<` used to\n* share settings across config sections keep working as they did on v4.\n*/\nvar CONFIG_SCHEMA = new Schema([...CORE_SCHEMA.tags, mergeTag]);\n/**\n* Load YAML config content, tolerating a documentless file.\n*\n* js-yaml v5 throws on an empty document (an empty, whitespace-only, or\n* comment-only file), whereas v4 returned `undefined`. Preserve the v4\n* behavior by treating such a file as an empty config object.\n*/\nfunction loadYamlConfig(content) {\n\ttry {\n\t\treturn load(content, { schema: CONFIG_SCHEMA }) ?? {};\n\t} catch (err) {\n\t\tif (err instanceof YAMLException && err.reason === \"expected a document, but the input is empty\") return {};\n\t\tthrow err;\n\t}\n}\n/**\n* Parse a YAML config file.\n* @param configPath the absolute path of the configuration file (must end in .yaml or .yml)\n*/\nfunction parseConfigFile(configPath) {\n\tdebug(\"parse config file %s\", configPath);\n\tif (!fileExists(configPath)) throw new Error(`config file does not exist or not reachable`);\n\tif (!/\\.ya?ml$/i.test(configPath)) throw new Error(`config file must be a YAML file (.yaml or .yml)`);\n\tdebug(\"parsing config file: %o\", configPath);\n\ttry {\n\t\tconst yamlConfig = loadYamlConfig(fs.readFileSync(configPath, \"utf8\"));\n\t\treturn Object.assign({}, yamlConfig, {\n\t\t\tconfigPath,\n\t\t\tconfig_path: configPath\n\t\t});\n\t} catch (e) {\n\t\tdebug(\"failed to parse config %o error: %o\", configPath, e.message);\n\t\tthrow new Error(APP_ERROR.CONFIG_NOT_VALID, { cause: e });\n\t}\n}\nfunction fromJStoYAML(config) {\n\tdebug(\"convert config from JSON to YAML\");\n\tif (isObject(config)) return dump(config);\n\telse throw new Error(`config is not a valid object`);\n}\n/**\n* Parses and returns a configuration object of type `ConfigYaml`.\n*\n* If a string or `undefined` is provided, it is interpreted as a path to a config file\n* (or uses a default location). The config file is then loaded and parsed.\n* If an object is provided, it is assumed to be a pre-parsed configuration.\n*\n* @param {string | ConfigYaml} [config] - Optional. A path to the configuration file (string),\n* a pre-parsed config object, or `undefined`.\n* @returns {ConfigYaml} The parsed configuration object.\n* @throws {Error} If the provided config is neither a string, undefined, nor an object.\n*/\nfunction getConfigParsed(config) {\n\tdebug(\"getConfigParsed called with config: %o\", typeof config);\n\tlet configurationParsed;\n\tif (config === void 0 || typeof config === \"string\") {\n\t\tdebug(\"using default configuration\");\n\t\tconfigurationParsed = parseConfigFile(findConfigFile(config));\n\t} else if (typeof config === \"object\" && config !== null) {\n\t\tconfigurationParsed = config;\n\t\tif (!configurationParsed.configPath) configurationParsed.configPath = process.cwd();\n\t} else throw new Error(API_ERROR.CONFIG_BAD_FORMAT);\n\treturn configurationParsed;\n}\n//#endregion\nexport { fromJStoYAML, getConfigParsed, parseConfigFile };\n\n//# sourceMappingURL=parse.mjs.map","import { ROLES } from \"./package-access.mjs\";\n//#region src/user.ts\n/**\n* All logged users will have by default the group $all and $authenticate\n*/\nvar defaultLoggedUserRoles = [\n\tROLES.$ALL,\n\tROLES.$AUTH,\n\tROLES.DEPRECATED_ALL,\n\tROLES.DEPRECATED_AUTH,\n\tROLES.ALL\n];\n/**\n*\n*/\nvar defaultNonLoggedUserRoles = [\n\tROLES.$ALL,\n\tROLES.$ANONYMOUS,\n\tROLES.DEPRECATED_ALL,\n\tROLES.DEPRECATED_ANONYMOUS\n];\n/**\n* Create a RemoteUser object\n* @return {Object} \\{ name: xx, pluginGroups: [], real_groups: [] \\}\n*/\nfunction createRemoteUser(name, pluginGroups) {\n\tconst isGroupValid = Array.isArray(pluginGroups);\n\treturn {\n\t\tname,\n\t\tgroups: Array.from(new Set((isGroupValid ? pluginGroups : []).concat([...defaultLoggedUserRoles]))),\n\t\treal_groups: pluginGroups\n\t};\n}\n/**\n* Builds an anonymous remote user in case none is logged in.\n* @return {Object} \\{ name: xx, groups: [], real_groups: [] \\}\n*/\nfunction createAnonymousRemoteUser() {\n\treturn {\n\t\tname: void 0,\n\t\tgroups: [...defaultNonLoggedUserRoles],\n\t\treal_groups: []\n\t};\n}\n//#endregion\nexport { createAnonymousRemoteUser, createRemoteUser, defaultLoggedUserRoles, defaultNonLoggedUserRoles };\n\n//# sourceMappingURL=user.mjs.map","import { parseConfigFile } from \"../parse.mjs\";\nimport { join } from \"node:path\";\n//#region src/conf/index.ts\nvar currentDir = import.meta.dirname;\nfunction getDefaultConfig(fileName = \"default.yaml\") {\n\tconst file = join(currentDir, `./${fileName}`);\n\treturn parseConfigFile(file);\n}\n//#endregion\nexport { getDefaultConfig };\n\n//# sourceMappingURL=index.mjs.map","import buildDebug from \"debug\";\nimport { DEFAULT_DOMAIN, DEFAULT_PORT, DEFAULT_PROTOCOL } from \"@verdaccio/core\";\n//#region src/address.ts\nvar debug = buildDebug(\"verdaccio:config:address\");\n/**\n* Parse an internet address\n* Allow:\n- https:localhost:1234 - protocol + host + port\n- localhost:1234 - host + port\n- 1234 - port\n- http::1234 - protocol + port\n- https://localhost:443/ - full url + https\n- http://[::1]:443/ - ipv6\n- unix:/tmp/http.sock - unix sockets\n- https://unix:/tmp/http.sock - unix sockets (https)\n* @param {*} urlAddress the internet address definition\n* @return {Object|Null} literal object that represent the address parsed\n*/\nfunction parseAddress(urlAddress) {\n\tconst urlPattern = /^((https?):(\\/\\/)?)?((([^\\/:]*)|\\[([^\\[\\]]+)\\]):)?(\\d+)\\/?$/.exec(urlAddress);\n\tif (urlPattern) return {\n\t\tproto: urlPattern[2] || DEFAULT_PROTOCOL,\n\t\thost: urlPattern[6] || urlPattern[7] || DEFAULT_DOMAIN,\n\t\tport: urlPattern[8] || DEFAULT_PORT\n\t};\n\tconst unixPattern = /^(?:(https?):\\/\\/)?unix:(\\/.*)$/.exec(urlAddress);\n\tif (!unixPattern) return null;\n\treturn {\n\t\thost: unixPattern[2],\n\t\tproto: unixPattern[1] || \"unix\",\n\t\tpath: unixPattern[2]\n\t};\n}\nfunction addrToString(a) {\n\treturn a.proto === \"unix\" ? `unix:${a.host}` : `${a.proto}://${a.host}:${a.port}`;\n}\n/**\n* Retrieve all addresses defined in the config file.\n* Verdaccio is able to listen multiple ports\n* @param {String} argListen\n* @param {String} configListen\n* eg:\n* listen:\n- localhost:5555\n- localhost:5557\n@return {Array}\n*/\nfunction getListenAddress(listen, logger) {\n\tdebug(\"getListenAddress called with %o\", listen);\n\tif (!listen) {\n\t\tdebug(\"No listen address provided, using default\");\n\t\treturn {\n\t\t\tproto: DEFAULT_PROTOCOL,\n\t\t\thost: DEFAULT_DOMAIN,\n\t\t\tport: DEFAULT_PORT\n\t\t};\n\t}\n\tif (Array.isArray(listen)) {\n\t\tconst filteredListen = listen.filter((item) => typeof item === \"string\");\n\t\tif (filteredListen.length === 0) throw new Error(\"Listen addresses array cannot be empty\");\n\t\tconst invalid = [];\n\t\tconst valid = [];\n\t\tfor (const raw of filteredListen) {\n\t\t\tconst candidate = parseAddress(raw);\n\t\t\tif (candidate) {\n\t\t\t\tdebug(\"valid listen address found: %o\", candidate);\n\t\t\t\tvalid.push(candidate);\n\t\t\t} else {\n\t\t\t\tdebug(\"invalid address found: %o\", raw);\n\t\t\t\tinvalid.push(raw);\n\t\t\t}\n\t\t}\n\t\tinvalid.forEach((bad) => logger.warn({ addr: bad }, \"invalid address - @{addr}, we expect a port (e.g. \\\"4873\\\"), host:port (e.g. \\\"localhost:4873\\\"), full url (e.g. \\\"http://localhost:4873/\\\") or unix:/path/socket\"));\n\t\tif (valid.length === 0) throw new Error(\"No valid listen addresses found in configuration array\");\n\t\tconst firstValid = valid[0];\n\t\tif (listen.length > 1) logger.warn(`Multiple listen addresses are not supported, using the first valid one ${addrToString(firstValid)}`);\n\t\treturn firstValid;\n\t}\n\tconst single = parseAddress(listen);\n\tif (!single) throw new Error(`Invalid address - ${listen}, we expect a port (e.g. \"4873\"), host:port (e.g. \"localhost:4873\"), full url (e.g. \"http://localhost:4873/\") or unix:/path/socket`);\n\treturn single;\n}\n//#endregion\nexport { getListenAddress, parseAddress };\n\n//# sourceMappingURL=address.mjs.map","import debugCore from \"debug\";\nimport { generateRandomSecretKey } from \"@verdaccio/config\";\n//#region src/s3DatabasePostgres.ts\nvar debug = debugCore(\"verdaccio:plugin:aws-s3-storage:database:postgres\");\nvar MIGRATION_LOCK_ID = 7446517003;\nvar PACKAGE_LOCK_CLASS = 744651700;\nvar PACKAGE_LOCK_TIMEOUT = \"60s\";\nvar SCHEMA = [\n\t`CREATE TABLE IF NOT EXISTS verdaccio_packages (\n name text PRIMARY KEY,\n created_at timestamptz NOT NULL DEFAULT now()\n )`,\n\t`CREATE TABLE IF NOT EXISTS verdaccio_tokens (\n \"user\" text NOT NULL,\n key text NOT NULL,\n token jsonb NOT NULL,\n PRIMARY KEY (\"user\", key)\n )`,\n\t`CREATE TABLE IF NOT EXISTS verdaccio_secret (\n id integer PRIMARY KEY CHECK (id = 1),\n secret text NOT NULL\n )`,\n\t`CREATE TABLE IF NOT EXISTS verdaccio_manifests (\n name text PRIMARY KEY,\n versions jsonb NOT NULL,\n dist_tags jsonb NOT NULL,\n rev text,\n updated_at timestamptz NOT NULL DEFAULT now()\n )`\n];\nvar S3DatabasePostgres = class {\n\tconstructor(pool, logger, lockPool = pool) {\n\t\tthis.queues = /* @__PURE__ */ new Map();\n\t\tthis.pool = pool;\n\t\tthis.lockPool = lockPool;\n\t\tthis.logger = logger;\n\t}\n\tinit() {\n\t\tthis.schema ??= this.migrate().catch((err) => {\n\t\t\tthis.schema = void 0;\n\t\t\tthrow err;\n\t\t});\n\t\treturn this.schema;\n\t}\n\tasync migrate() {\n\t\tdebug(\"migrate: applying schema\");\n\t\tconst client = await this.pool.connect();\n\t\ttry {\n\t\t\tawait client.query(\"BEGIN\");\n\t\t\tawait client.query(\"SELECT pg_advisory_xact_lock($1)\", [MIGRATION_LOCK_ID]);\n\t\t\tfor (const statement of SCHEMA) await client.query(statement);\n\t\t\tawait client.query(\"COMMIT\");\n\t\t} catch (err) {\n\t\t\tawait client.query(\"ROLLBACK\").catch(() => void 0);\n\t\t\tthrow err;\n\t\t} finally {\n\t\t\tclient.release();\n\t\t}\n\t\tthis.logger.trace(\"aws-s3-storage: [init] postgres schema ready\");\n\t}\n\tasync getSecret() {\n\t\tawait this.query(\"INSERT INTO verdaccio_secret (id, secret) VALUES (1, $1) ON CONFLICT (id) DO NOTHING\", [generateRandomSecretKey()]);\n\t\treturn (await this.query(\"SELECT secret FROM verdaccio_secret WHERE id = 1\")).rows[0]?.secret ?? \"\";\n\t}\n\tasync setSecret(secret) {\n\t\tawait this.query(`INSERT INTO verdaccio_secret (id, secret) VALUES (1, $1)\n ON CONFLICT (id) DO UPDATE SET secret = EXCLUDED.secret`, [secret]);\n\t}\n\tasync add(name) {\n\t\tdebug(\"add package=%o\", name);\n\t\tawait this.query(\"INSERT INTO verdaccio_packages (name) VALUES ($1) ON CONFLICT (name) DO NOTHING\", [name]);\n\t}\n\tasync remove(name) {\n\t\tdebug(\"remove package=%o\", name);\n\t\tawait this.query(\"DELETE FROM verdaccio_packages WHERE name = $1\", [name]);\n\t}\n\tasync get() {\n\t\treturn (await this.query(\"SELECT name FROM verdaccio_packages ORDER BY name COLLATE \\\"C\\\"\")).rows.map((row) => row.name);\n\t}\n\tasync search(text, limit) {\n\t\treturn (await this.query(`SELECT name FROM verdaccio_packages WHERE strpos(name, $1) > 0\n ORDER BY name COLLATE \"C\" LIMIT $2`, [text, limit])).rows.map((row) => row.name);\n\t}\n\trecord(name, manifest) {\n\t\treturn recordWith(this.query.bind(this), name, manifest);\n\t}\n\tforget(name) {\n\t\treturn forgetWith(this.query.bind(this), name);\n\t}\n\tasync revision(name) {\n\t\treturn (await this.query(\"SELECT rev FROM verdaccio_manifests WHERE name = $1\", [name])).rows[0]?.rev ?? null;\n\t}\n\tasync withPackageLock(name, fn) {\n\t\tconst previous = this.queues.get(name) ?? Promise.resolve();\n\t\tlet release;\n\t\tconst tail = previous.then(() => new Promise((resolve) => release = resolve));\n\t\tthis.queues.set(name, tail);\n\t\tawait previous;\n\t\ttry {\n\t\t\treturn await this.lockedTransaction(name, fn);\n\t\t} finally {\n\t\t\trelease();\n\t\t\tif (this.queues.get(name) === tail) this.queues.delete(name);\n\t\t}\n\t}\n\tasync lockedTransaction(name, fn) {\n\t\tawait this.init();\n\t\tconst client = await this.lockPool.connect();\n\t\ttry {\n\t\t\tawait client.query(\"BEGIN\");\n\t\t\tawait client.query(`SET LOCAL lock_timeout = '${PACKAGE_LOCK_TIMEOUT}'`);\n\t\t\tawait client.query(\"SELECT pg_advisory_xact_lock($1, hashtext($2))\", [PACKAGE_LOCK_CLASS, name]);\n\t\t\tdebug(\"lock package=%o\", name);\n\t\t\tconst query = clientQuery(client);\n\t\t\tconst result = await fn({\n\t\t\t\trecord: (n, manifest) => recordWith(query, n, manifest),\n\t\t\t\tforget: (n) => forgetWith(query, n)\n\t\t\t});\n\t\t\tawait client.query(\"COMMIT\");\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait client.query(\"ROLLBACK\").catch(() => void 0);\n\t\t\tthrow err;\n\t\t} finally {\n\t\t\tclient.release();\n\t\t}\n\t}\n\tasync saveToken(token) {\n\t\tawait this.query(`INSERT INTO verdaccio_tokens (\"user\", key, token) VALUES ($1, $2, $3)\n ON CONFLICT (\"user\", key) DO UPDATE SET token = EXCLUDED.token`, [\n\t\t\ttoken.user,\n\t\t\ttoken.key,\n\t\t\tJSON.stringify(token)\n\t\t]);\n\t}\n\tasync deleteToken(user, tokenKey) {\n\t\tawait this.query(\"DELETE FROM verdaccio_tokens WHERE \\\"user\\\" = $1 AND key = $2\", [user, tokenKey]);\n\t}\n\tasync readTokens(filter) {\n\t\treturn (await this.query(\"SELECT token FROM verdaccio_tokens WHERE \\\"user\\\" = $1 ORDER BY key COLLATE \\\"C\\\"\", [filter.user])).rows.map((row) => row.token);\n\t}\n\tasync query(text, values) {\n\t\tawait this.init();\n\t\treturn this.pool.query(text, values);\n\t}\n};\nvar clientQuery = (client) => (text, values) => client.query(text, values);\nasync function recordWith(query, name, manifest) {\n\tconst m = manifest;\n\tif (Object.keys(m._attachments ?? {}).length === 0) {\n\t\tawait forgetWith(query, name);\n\t\treturn;\n\t}\n\tawait query(`INSERT INTO verdaccio_manifests (name, versions, dist_tags, rev)\n VALUES ($1, $2, $3, $4)\n ON CONFLICT (name) DO UPDATE SET\n versions = EXCLUDED.versions, dist_tags = EXCLUDED.dist_tags,\n rev = EXCLUDED.rev, updated_at = now()`, [\n\t\tname,\n\t\tJSON.stringify(Object.keys(m.versions ?? {})),\n\t\tJSON.stringify(m[\"dist-tags\"] ?? {}),\n\t\tm._rev ?? null\n\t]);\n}\nasync function forgetWith(query, name) {\n\tawait query(\"DELETE FROM verdaccio_manifests WHERE name = $1\", [name]);\n}\n//#endregion\nexport { S3DatabasePostgres as default };\n\n//# sourceMappingURL=s3DatabasePostgres.js.map","/** Spaces calls to at most `perSecond`, in the order they ask. */\nexport function pacer(perSecond: number): () => Promise<void> {\n const gap = 1000 / perSecond;\n let next = 0;\n return () => {\n const now = Date.now();\n const at = Math.max(now, next);\n next = at + gap;\n return at > now\n ? new Promise((resolve) => setTimeout(resolve, at - now))\n : Promise.resolve();\n };\n}\n","// Where processed package versions live: unpacked files and piece bundles,\n// written once by a worker and read by every replica.\nimport {\n DeleteObjectsCommand,\n GetObjectCommand,\n ListObjectsV2Command,\n PutObjectCommand,\n S3Client,\n} from \"@aws-sdk/client-s3\";\nimport fs from \"node:fs\";\nimport http from \"node:http\";\nimport https from \"node:https\";\nimport path from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport { buffer } from \"node:stream/consumers\";\nimport { pacer } from \"./pace.js\";\nimport type { S3Config } from \"./types.js\";\n\nexport interface Artifact {\n stream: Readable;\n size?: number;\n /** The whole body, when it was held in memory. */\n body?: Buffer;\n}\n\nexport interface ArtifactStore {\n put(key: string, body: Buffer, contentType: string): Promise<void>;\n /** Uploads a file from disk; only large ones stream, since a stream can't be retried. */\n putFile(key: string, file: string, contentType: string): Promise<void>;\n get(key: string): Promise<Artifact | null>;\n deletePrefix(prefix: string): Promise<void>;\n}\n\n// The SDK can't replay a stream, so a throttled upload of one would fail at once\nconst BUFFERED_UPLOAD_BYTES = 4 * 1024 * 1024;\n// Per process: a bucket's 750 requests per second is shared by every writer and\n// reader on it, here dev and prod\nconst DEFAULT_WRITES_PER_SECOND = 150;\n\nexport function createS3ArtifactStore(config: S3Config): ArtifactStore {\n const paceWrite = pacer(\n config.maxWritesPerSecond ?? DEFAULT_WRITES_PER_SECOND,\n );\n const s3 = new S3Client({\n // Backs off when the provider answers SlowDown\n retryMode: \"adaptive\",\n maxAttempts: 5,\n endpoint: config.endpoint,\n region: config.region,\n forcePathStyle: config.s3ForcePathStyle ?? true,\n // Checksums on every object cost CPU; S3 still gets them where required\n requestChecksumCalculation: \"WHEN_REQUIRED\",\n responseChecksumValidation: \"WHEN_REQUIRED\",\n // A hung request would hold a worker slot past its job lock\n requestHandler: {\n connectionTimeout: 5_000,\n requestTimeout: 60_000,\n httpsAgent: new https.Agent({ keepAlive: true, maxSockets: 256 }),\n httpAgent: new http.Agent({ keepAlive: true, maxSockets: 256 }),\n },\n ...(config.accessKeyId && config.secretAccessKey\n ? {\n credentials: {\n accessKeyId: config.accessKeyId,\n secretAccessKey: config.secretAccessKey,\n },\n }\n : {}),\n });\n const root = `${config.keyPrefix ?? \"\"}artifacts/`;\n\n return {\n async put(key, body, contentType) {\n await paceWrite();\n await s3.send(\n new PutObjectCommand({\n Bucket: config.bucket,\n Key: root + key,\n Body: body,\n ContentType: contentType,\n }),\n );\n },\n async putFile(key, file, contentType) {\n const { size } = await fs.promises.stat(file);\n if (size <= BUFFERED_UPLOAD_BYTES) {\n const body = await fs.promises.readFile(file);\n await paceWrite();\n await s3.send(\n new PutObjectCommand({\n Bucket: config.bucket,\n Key: root + key,\n Body: body,\n ContentLength: size,\n ContentType: contentType,\n }),\n );\n return;\n }\n const body = fs.createReadStream(file);\n // A send that fails before reading leaves the stream's errors unheard\n body.on(\"error\", () => undefined);\n try {\n await paceWrite();\n await s3.send(\n new PutObjectCommand({\n Bucket: config.bucket,\n Key: root + key,\n Body: body,\n ContentLength: size,\n ContentType: contentType,\n }),\n );\n } finally {\n body.destroy();\n }\n },\n async get(key) {\n try {\n const res = await s3.send(\n new GetObjectCommand({ Bucket: config.bucket, Key: root + key }),\n );\n if (!res.Body) return null;\n return { stream: res.Body as Readable, size: res.ContentLength };\n } catch (err) {\n const name = (err as { name?: string }).name;\n if (name === \"NoSuchKey\" || name === \"NotFound\") return null;\n throw err;\n }\n },\n async deletePrefix(prefix) {\n let token: string | undefined;\n do {\n const listed = await s3.send(\n new ListObjectsV2Command({\n Bucket: config.bucket,\n Prefix: root + prefix,\n ContinuationToken: token,\n }),\n );\n const keys = (listed.Contents ?? []).flatMap((o) =>\n o.Key ? [{ Key: o.Key }] : [],\n );\n if (keys.length > 0) {\n await paceWrite();\n await s3.send(\n new DeleteObjectsCommand({\n Bucket: config.bucket,\n Delete: { Objects: keys },\n }),\n );\n }\n token = listed.IsTruncated ? listed.NextContinuationToken : undefined;\n } while (token);\n },\n };\n}\n\nexport function createFsArtifactStore(rootDir: string): ArtifactStore {\n const root = path.resolve(rootDir);\n // Keys come from package contents; refuse any that climb out of the root\n const resolve = (key: string): string => {\n const file = path.resolve(root, key);\n if (!file.startsWith(root + path.sep)) {\n throw new Error(`artifact key escapes the store: ${key}`);\n }\n return file;\n };\n\n return {\n async put(key, body) {\n const file = resolve(key);\n await fs.promises.mkdir(path.dirname(file), { recursive: true });\n const tmp = `${file}.tmp-${process.pid}-${Math.random().toString(36).slice(2)}`;\n await fs.promises.writeFile(tmp, body);\n await fs.promises.rename(tmp, file);\n },\n async putFile(key, source) {\n const file = resolve(key);\n await fs.promises.mkdir(path.dirname(file), { recursive: true });\n const tmp = `${file}.tmp-${process.pid}-${Math.random().toString(36).slice(2)}`;\n await fs.promises.copyFile(source, tmp);\n await fs.promises.rename(tmp, file);\n },\n async get(key) {\n const file = resolve(key);\n try {\n const stat = await fs.promises.stat(file);\n if (!stat.isFile()) return null;\n return { stream: fs.createReadStream(file), size: stat.size };\n } catch {\n return null;\n }\n },\n async deletePrefix(prefix) {\n await fs.promises.rm(resolve(prefix), { recursive: true, force: true });\n },\n };\n}\n\nexport interface CachedArtifactStore extends ArtifactStore {\n /** Drops cached entries under a key prefix, e.g. an unpublished version. */\n evictPrefix(prefix: string): void;\n}\n\n/**\n * Holds small artifacts in memory, least recently used out first. A key's\n * bytes never change once written, so an entry only goes when it's removed.\n */\nexport function withMemoryCache(\n store: ArtifactStore,\n { maxBytes, maxEntryBytes }: { maxBytes: number; maxEntryBytes: number },\n): CachedArtifactStore {\n const entries = new Map<string, Buffer>();\n let total = 0;\n const drop = (key: string) => {\n const body = entries.get(key);\n if (!body) return;\n entries.delete(key);\n total -= body.length;\n };\n const hit = (body: Buffer): Artifact => ({\n body,\n size: body.length,\n get stream() {\n return Readable.from([body]);\n },\n });\n\n return {\n async put(key, body, contentType) {\n drop(key);\n await store.put(key, body, contentType);\n },\n async putFile(key, file, contentType) {\n drop(key);\n await store.putFile(key, file, contentType);\n },\n async get(key) {\n const cached = entries.get(key);\n if (cached) {\n entries.delete(key);\n entries.set(key, cached);\n return hit(cached);\n }\n const artifact = await store.get(key);\n if (\n !artifact ||\n artifact.size === undefined ||\n artifact.size > maxEntryBytes ||\n maxBytes <= 0\n ) {\n return artifact;\n }\n const body = await buffer(artifact.stream);\n entries.set(key, body);\n total += body.length;\n for (const oldest of entries.keys()) {\n if (total <= maxBytes) break;\n drop(oldest);\n }\n return hit(body);\n },\n async deletePrefix(prefix) {\n this.evictPrefix(prefix);\n await store.deletePrefix(prefix);\n },\n evictPrefix(prefix) {\n for (const key of [...entries.keys()]) {\n if (key.startsWith(prefix)) drop(key);\n }\n },\n };\n}\n","import { PGlite } from \"@electric-sql/pglite\";\nimport { pg_trgm } from \"@electric-sql/pglite/contrib/pg_trgm\";\nimport pg from \"pg\";\n\nexport interface Queryable {\n query<R extends object = Record<string, unknown>>(\n text: string,\n params?: unknown[],\n ): Promise<{ rows: R[] }>;\n}\n\nexport interface Database extends Queryable {\n transaction<T>(fn: (tx: Queryable) => Promise<T>): Promise<T>;\n /** One connection outside a transaction, for session state such as locks. */\n session<T>(fn: (session: Queryable) => Promise<T>): Promise<T>;\n /** True for the in-process PGlite: one connection, no concurrent builds. */\n readonly embedded: boolean;\n /** Subscribes to NOTIFY on a channel; resolves to an unsubscribe function. */\n listen(\n channel: string,\n onMessage: (payload: string) => void,\n ): Promise<() => Promise<void>>;\n notify(channel: string, payload: string): Promise<void>;\n /** False while a LISTEN connection is down; notifications may be missed. */\n listening(): boolean;\n /** Called after LISTEN reconnects, when notifications may have been missed. */\n onReconnect(fn: () => void): void;\n close(): Promise<void>;\n}\n\n// A half-open TCP connection raises no error; a periodic query finds it\nconst LISTENER_CHECK_MS = 30_000;\n\nexport const DEFAULT_POOL_MAX = 10;\n\n// LISTEN needs a session; behind a transaction pooler, pass a direct URL for it\nexport function createPostgresDatabase(\n connectionString: string,\n listenConnectionString = connectionString,\n poolMax = DEFAULT_POOL_MAX,\n): Database {\n const pool = new pg.Pool({\n connectionString,\n connectionTimeoutMillis: 10_000,\n max: poolMax,\n });\n // An idle client losing its connection must not crash the process\n pool.on(\"error\", (err) => {\n console.error(\"[registry] postgres pool error:\", err.message);\n });\n const listeners = new Map<string, Set<(payload: string) => void>>();\n let listener: Promise<pg.Client> | undefined;\n let connected = false;\n let everConnected = false;\n let closed = false;\n const reconnectHandlers = new Set<() => void>();\n\n const dropListener = (client: pg.Client, reason: string) => {\n console.error(\"[registry] postgres listener lost:\", reason);\n connected = false;\n listener = undefined;\n void client.end().catch(() => undefined);\n if (!closed) setTimeout(() => void reconnect(), 1000);\n };\n\n const connectListener = async (): Promise<pg.Client> => {\n const client = new pg.Client({\n connectionString: listenConnectionString,\n keepAlive: true,\n });\n client.on(\"notification\", (msg) => {\n for (const fn of listeners.get(msg.channel) ?? []) fn(msg.payload ?? \"\");\n });\n const timers: { check?: ReturnType<typeof setInterval> } = {};\n client.on(\"error\", (err) => {\n clearInterval(timers.check);\n dropListener(client, err.message);\n });\n await client.connect();\n for (const channel of listeners.keys()) {\n await client.query(`LISTEN ${pg.escapeIdentifier(channel)}`);\n }\n const check = setInterval(() => {\n const timeout = setTimeout(() => {\n clearInterval(check);\n dropListener(client, \"health check timed out\");\n }, 10_000);\n client\n .query(\"SELECT 1\")\n .catch(() => undefined)\n .finally(() => clearTimeout(timeout));\n }, LISTENER_CHECK_MS);\n check.unref();\n timers.check = check;\n client.on(\"end\", () => clearInterval(check));\n connected = true;\n if (everConnected) for (const fn of reconnectHandlers) fn();\n everConnected = true;\n return client;\n };\n const reconnect = async () => {\n if (closed || listener || listeners.size === 0) return;\n listener = connectListener();\n await listener.catch(() => {\n listener = undefined;\n setTimeout(() => void reconnect(), 1000);\n });\n };\n\n return {\n async query<R extends object>(text: string, params?: unknown[]) {\n return pool.query<R>(text, params);\n },\n async transaction<T>(fn: (tx: Queryable) => Promise<T>): Promise<T> {\n const client = await pool.connect();\n try {\n await client.query(\"BEGIN\");\n const result = await fn({\n query: <R extends object>(text: string, params?: unknown[]) =>\n client.query<R>(text, params),\n });\n await client.query(\"COMMIT\");\n return result;\n } catch (err) {\n await client.query(\"ROLLBACK\").catch(() => undefined);\n throw err;\n } finally {\n client.release();\n }\n },\n // The direct URL: a transaction pooler drops session state between queries\n async session<T>(fn: (session: Queryable) => Promise<T>): Promise<T> {\n const client = new pg.Client({\n connectionString: listenConnectionString,\n connectionTimeoutMillis: 10_000,\n });\n client.on(\"error\", (err) => {\n console.error(\"[registry] postgres session error:\", err.message);\n });\n await client.connect();\n try {\n return await fn({\n query: <R extends object>(text: string, params?: unknown[]) =>\n client.query<R>(text, params),\n });\n } finally {\n await client.end().catch(() => undefined);\n }\n },\n embedded: false,\n async listen(channel, onMessage) {\n let set = listeners.get(channel);\n const isNew = !set;\n if (!set) {\n set = new Set();\n listeners.set(channel, set);\n }\n set.add(onMessage);\n listener ??= connectListener();\n const client = await listener;\n if (isNew) await client.query(`LISTEN ${pg.escapeIdentifier(channel)}`);\n return () => {\n set.delete(onMessage);\n return Promise.resolve();\n };\n },\n async notify(channel, payload) {\n await pool.query(\"SELECT pg_notify($1, $2)\", [channel, payload]);\n },\n listening: () => connected || listeners.size === 0,\n onReconnect: (fn) => {\n reconnectHandlers.add(fn);\n },\n async close() {\n closed = true;\n const client = await listener?.catch(() => undefined);\n await client?.end().catch(() => undefined);\n await pool.end();\n },\n };\n}\n\n// One in-process Postgres; queries queue on its single connection\nexport async function createPGliteDatabase(\n dataDir?: string,\n): Promise<Database> {\n const db = await PGlite.create({ dataDir, extensions: { pg_trgm } });\n const wrap = (\n q: PGlite | Parameters<Parameters<PGlite[\"transaction\"]>[0]>[0],\n ) =>\n ({\n query: async <R extends object>(text: string, params?: unknown[]) => {\n const result = await q.query<R>(text, params);\n return { rows: result.rows };\n },\n }) satisfies Queryable;\n const base = wrap(db);\n return {\n query: base.query,\n transaction: (fn) => db.transaction((tx) => fn(wrap(tx))),\n session: (fn) => fn(base),\n embedded: true,\n listen: async (channel, onMessage) => {\n const unlisten = await db.listen(channel, onMessage);\n return () => unlisten();\n },\n async notify(channel, payload) {\n await db.query(\"SELECT pg_notify($1, $2)\", [channel, payload]);\n },\n // In-process: nothing to lose\n listening: () => true,\n onReconnect: () => undefined,\n close: () => db.close(),\n };\n}\n","import type { Database, Queryable } from \"./database.js\";\n\n// Serializes migrations across replicas and workers starting together\nconst MIGRATION_LOCK_ID = 7_446_517_101;\n\n// A statement, or a step that decides which statements to run\ntype Step = string | ((q: Queryable) => Promise<void>);\n\ninterface Migration {\n id: number;\n name: string;\n /** False runs each step on its own, for CONCURRENTLY; steps must be rerunnable */\n transaction?: boolean;\n statements: Step[];\n}\n\n// A failed concurrent build leaves an INVALID index that IF NOT EXISTS would keep\nfunction indexConcurrently(name: string, definition: string): Step[] {\n return [\n async (q) => {\n const index = await q.query<{ valid: boolean }>(\n \"SELECT indisvalid AS valid FROM pg_index WHERE indexrelid = to_regclass($1)\",\n [name],\n );\n if (index.rows[0]?.valid === false) {\n await q.query(`DROP INDEX CONCURRENTLY IF EXISTS ${name}`);\n }\n },\n `CREATE INDEX CONCURRENTLY IF NOT EXISTS ${name} ${definition}`,\n ];\n}\n\nconst MIGRATIONS: Migration[] = [\n {\n id: 1,\n name: \"registry state\",\n statements: [\n // Accounts and ownership predate migrations, hence IF NOT EXISTS\n `CREATE TABLE IF NOT EXISTS registry_users (\n username text PRIMARY KEY,\n password_hash text NOT NULL,\n created_at timestamptz NOT NULL DEFAULT now()\n )`,\n `CREATE TABLE IF NOT EXISTS registry_package_owners (\n package_name text PRIMARY KEY,\n owners text[] NOT NULL,\n claimed_at timestamptz NOT NULL DEFAULT now()\n )`,\n // One row per package the registry has processed a version of\n `CREATE TABLE registry_packages (\n name text PRIMARY KEY,\n local boolean NOT NULL DEFAULT false,\n dist_tags jsonb NOT NULL DEFAULT '{}',\n versions jsonb NOT NULL DEFAULT '[]',\n times jsonb NOT NULL DEFAULT '{}',\n latest text,\n updated_at timestamptz NOT NULL DEFAULT now()\n )`,\n `CREATE TABLE registry_versions (\n package text NOT NULL,\n version text NOT NULL,\n status text NOT NULL CHECK (status IN ('pending', 'ready', 'failed')),\n manifest jsonb,\n package_json_version text,\n files jsonb NOT NULL DEFAULT '[]',\n error text,\n updated_at timestamptz NOT NULL DEFAULT now(),\n PRIMARY KEY (package, version)\n )`,\n // A piece name belongs to the first package that shipped it\n `CREATE TABLE registry_piece_owners (\n name text PRIMARY KEY,\n package text NOT NULL,\n claimed_at timestamptz NOT NULL DEFAULT now()\n )`,\n `CREATE TABLE registry_pieces (\n name text NOT NULL,\n version text NOT NULL,\n package text NOT NULL,\n display_name text NOT NULL,\n description text,\n descriptor jsonb,\n descriptor_path text NOT NULL,\n bundle_file text NOT NULL,\n bundle_key text,\n published_at timestamptz,\n is_latest boolean NOT NULL DEFAULT false,\n PRIMARY KEY (name, version)\n )`,\n \"CREATE INDEX registry_pieces_package ON registry_pieces (package, version)\",\n \"CREATE INDEX registry_pieces_bundle ON registry_pieces (bundle_file)\",\n // version is '' for jobs about a whole package\n `CREATE TABLE registry_jobs (\n id bigserial PRIMARY KEY,\n kind text NOT NULL,\n package text NOT NULL,\n version text NOT NULL DEFAULT '',\n payload jsonb NOT NULL DEFAULT '{}',\n attempts integer NOT NULL DEFAULT 0,\n run_after timestamptz NOT NULL DEFAULT now(),\n locked_by text,\n locked_at timestamptz,\n requeued boolean NOT NULL DEFAULT false,\n last_error text,\n created_at timestamptz NOT NULL DEFAULT now(),\n UNIQUE (kind, package, version)\n )`,\n `CREATE TABLE registry_webhooks (\n endpoint text PRIMARY KEY,\n headers jsonb NOT NULL DEFAULT '{}',\n created_at timestamptz NOT NULL DEFAULT now()\n )`,\n ],\n },\n {\n id: 2,\n name: \"job priority\",\n statements: [\n // Lower runs first: publishes and on-demand work ahead of sweeps\n \"ALTER TABLE registry_jobs ADD COLUMN priority integer NOT NULL DEFAULT 0\",\n \"CREATE INDEX registry_jobs_due ON registry_jobs (priority, id)\",\n ],\n },\n {\n id: 3,\n name: \"search\",\n statements: [\n // Trusted since Postgres 13: the database owner can create it\n \"CREATE EXTENSION IF NOT EXISTS pg_trgm\",\n // Declared IMMUTABLE so generated columns can call them; concat_ws is\n // only STABLE because of its variadic \"any\" signature\n `CREATE OR REPLACE FUNCTION registry_search_name(pkg text, m jsonb) RETURNS text\n LANGUAGE sql IMMUTABLE PARALLEL SAFE\n AS $$ SELECT lower(concat_ws(' ', pkg, m->>'name')) $$`,\n // Description plus every module's and the publisher's name and id\n `CREATE OR REPLACE FUNCTION registry_search_text(m jsonb) RETURNS text\n LANGUAGE sql IMMUTABLE PARALLEL SAFE\n AS $$ SELECT lower(concat_ws(' ', m->>'description',\n (SELECT string_agg(x #>> '{}', ' ')\n FROM jsonb_path_query(m, 'lax $.*[*].name') x),\n (SELECT string_agg(x #>> '{}', ' ')\n FROM jsonb_path_query(m, 'lax $.*[*].id') x))) $$`,\n `CREATE OR REPLACE FUNCTION registry_search_doc(pkg text, m jsonb) RETURNS text\n LANGUAGE sql IMMUTABLE PARALLEL SAFE\n AS $$ SELECT concat_ws(' ', registry_search_name(pkg, m),\n registry_search_text(m)) $$`,\n `CREATE OR REPLACE FUNCTION registry_piece_search_name(\n name text, display_name text, d jsonb) RETURNS text\n LANGUAGE sql IMMUTABLE PARALLEL SAFE\n AS $$ SELECT lower(concat_ws(' ', name, display_name,\n d->>'displayName')) $$`,\n `CREATE OR REPLACE FUNCTION registry_piece_search_doc(\n name text, display_name text, description text, d jsonb) RETURNS text\n LANGUAGE sql IMMUTABLE PARALLEL SAFE\n AS $$ SELECT concat_ws(' ',\n registry_piece_search_name(name, display_name, d),\n lower(coalesce(d->>'description', description))) $$`,\n // A package's listed version, kept by recomputeLatest, so listing and\n // search read one row per package instead of joining every version\n `ALTER TABLE registry_packages\n ADD COLUMN listed_manifest jsonb,\n ADD COLUMN listed_package_json_version text,\n ADD COLUMN search_doc text GENERATED ALWAYS AS\n (registry_search_doc(name, listed_manifest)) STORED,\n ADD COLUMN search_tsv tsvector GENERATED ALWAYS AS (\n setweight(to_tsvector('english',\n coalesce(registry_search_name(name, listed_manifest), '')), 'A') ||\n setweight(to_tsvector('english',\n coalesce(registry_search_text(listed_manifest), '')), 'B')) STORED`,\n // Absent manifests and descriptors were stored as the JSON value null\n `UPDATE registry_versions SET manifest = NULL\n WHERE jsonb_typeof(manifest) = 'null'`,\n `UPDATE registry_pieces SET descriptor = NULL\n WHERE jsonb_typeof(descriptor) = 'null'`,\n `UPDATE registry_packages p\n SET listed_manifest = v.manifest,\n listed_package_json_version = v.package_json_version\n FROM registry_versions v\n WHERE v.package = p.name AND v.version = p.latest\n AND v.status = 'ready' AND v.manifest IS NOT NULL`,\n `ALTER TABLE registry_pieces\n ADD COLUMN search_doc text GENERATED ALWAYS AS\n (registry_piece_search_doc(name, display_name, description, descriptor)) STORED,\n ADD COLUMN search_tsv tsvector GENERATED ALWAYS AS (\n setweight(to_tsvector('english',\n coalesce(registry_piece_search_name(name, display_name, descriptor), '')), 'A') ||\n setweight(to_tsvector('english',\n coalesce(descriptor->>'description', description, '')), 'B')) STORED`,\n ],\n },\n {\n id: 4,\n name: \"write ordering\",\n statements: [\n // The packument's time.modified; older snapshots don't overwrite newer\n \"ALTER TABLE registry_packages ADD COLUMN modified timestamptz\",\n // Unpublished versions stay retired: caches hold their files for a year\n `CREATE TABLE registry_unpublished (\n package text NOT NULL,\n version text NOT NULL,\n unpublished_at timestamptz NOT NULL DEFAULT now(),\n PRIMARY KEY (package, version)\n )`,\n // A small, high-churn queue: vacuum after a fixed number of dead rows\n `ALTER TABLE registry_jobs SET (autovacuum_vacuum_scale_factor = 0,\n autovacuum_vacuum_threshold = 500)`,\n ],\n },\n {\n id: 5,\n name: \"search indexes\",\n transaction: false,\n statements: [\n // Partial: only listed packages and latest pieces are ever searched\n ...indexConcurrently(\n \"registry_packages_search_trgm\",\n `ON registry_packages USING gin (search_doc gin_trgm_ops)\n WHERE local AND listed_manifest IS NOT NULL`,\n ),\n ...indexConcurrently(\n \"registry_packages_search_tsv\",\n `ON registry_packages USING gin (search_tsv)\n WHERE local AND listed_manifest IS NOT NULL`,\n ),\n ...indexConcurrently(\n \"registry_pieces_search_trgm\",\n \"ON registry_pieces USING gin (search_doc gin_trgm_ops) WHERE is_latest\",\n ),\n ...indexConcurrently(\n \"registry_pieces_search_tsv\",\n \"ON registry_pieces USING gin (search_tsv) WHERE is_latest\",\n ),\n ...indexConcurrently(\n \"registry_pieces_latest\",\n \"ON registry_pieces (package) WHERE is_latest\",\n ),\n // Bundles are looked up by piece name and version now\n \"DROP INDEX CONCURRENTLY IF EXISTS registry_pieces_bundle\",\n ],\n },\n {\n id: 6,\n name: \"reconcile by revision\",\n transaction: false,\n statements: [\n // The storage plugin's manifest revision the last sync applied\n \"ALTER TABLE registry_packages ADD COLUMN IF NOT EXISTS manifest_rev text\",\n // Pending versions are few; reconcile looks for stranded ones\n ...indexConcurrently(\n \"registry_versions_pending\",\n \"ON registry_versions (updated_at) WHERE status = 'pending'\",\n ),\n ],\n },\n {\n id: 7,\n name: \"permanent version failures\",\n transaction: false,\n statements: [\n // A failure retrying can't fix, such as a size limit or a piece conflict\n \"ALTER TABLE registry_versions ADD COLUMN IF NOT EXISTS permanent boolean NOT NULL DEFAULT false\",\n ],\n },\n];\n\nconst MIGRATIONS_TABLE = `CREATE TABLE IF NOT EXISTS registry_migrations (\n id integer PRIMARY KEY,\n name text NOT NULL,\n applied_at timestamptz NOT NULL DEFAULT now()\n)`;\n// Fail fast rather than queue every reader behind a blocked ALTER\nconst LOCK_TIMEOUT = \"5s\";\n\nasync function appliedIds(q: Queryable): Promise<Set<number>> {\n const table = await q.query<{ exists: boolean }>(\n \"SELECT to_regclass('registry_migrations') IS NOT NULL AS exists\",\n );\n if (!table.rows[0]?.exists) return new Set();\n const applied = await q.query<{ id: number }>(\n \"SELECT id FROM registry_migrations\",\n );\n return new Set(applied.rows.map((row) => row.id));\n}\n\nasync function runSteps(\n q: Queryable,\n migration: Migration,\n embedded: boolean,\n): Promise<void> {\n for (const step of migration.statements) {\n if (typeof step === \"function\") await step(q);\n // PGlite has no concurrent builds, and no other session to block\n else await q.query(embedded ? step.replace(/ CONCURRENTLY/g, \"\") : step);\n }\n await q.query(\"INSERT INTO registry_migrations (id, name) VALUES ($1, $2)\", [\n migration.id,\n migration.name,\n ]);\n}\n\n// Lock waiters poll instead of blocking: a concurrent index build waits for\n// every transaction with a snapshot, including one blocked on the lock\nconst LOCK_POLL_MS = 500;\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nasync function applyInTransaction(\n db: Database,\n migration: Migration,\n): Promise<void> {\n for (;;) {\n const locked = await db.transaction(async (tx) => {\n const lock = await tx.query<{ ok: boolean }>(\n \"SELECT pg_try_advisory_xact_lock($1) AS ok\",\n [MIGRATION_LOCK_ID],\n );\n if (!lock.rows[0]?.ok) return false;\n await tx.query(`SET LOCAL lock_timeout = '${LOCK_TIMEOUT}'`);\n await tx.query(MIGRATIONS_TABLE);\n if (!(await appliedIds(tx)).has(migration.id)) {\n await runSteps(tx, migration, db.embedded);\n }\n return true;\n });\n if (locked) return;\n await sleep(LOCK_POLL_MS);\n }\n}\n\n// A session lock excludes transactional migrators too: both share the key\nasync function applyOnline(db: Database, migration: Migration): Promise<void> {\n await db.session(async (s) => {\n for (;;) {\n const lock = await s.query<{ ok: boolean }>(\n \"SELECT pg_try_advisory_lock($1) AS ok\",\n [MIGRATION_LOCK_ID],\n );\n if (lock.rows[0]?.ok) break;\n await sleep(LOCK_POLL_MS);\n }\n try {\n await s.query(`SET lock_timeout = '${LOCK_TIMEOUT}'`);\n await s.query(MIGRATIONS_TABLE);\n if ((await appliedIds(s)).has(migration.id)) return;\n await runSteps(s, migration, false);\n } finally {\n await s.query(\"SELECT pg_advisory_unlock($1)\", [MIGRATION_LOCK_ID]);\n }\n });\n}\n\n/** Applies pending migrations; any number of processes may run it at once. */\nexport async function migrate(db: Database): Promise<void> {\n const applied = await appliedIds(db);\n for (const migration of MIGRATIONS) {\n if (applied.has(migration.id)) continue;\n if (migration.transaction === false && !db.embedded) {\n await applyOnline(db, migration);\n } else {\n await applyInTransaction(db, migration);\n }\n }\n}\n\n/** Migrations this build needs that the database hasn't applied. */\nexport async function pendingMigrations(\n db: Queryable,\n): Promise<{ id: number; name: string }[]> {\n const applied = await appliedIds(db);\n return MIGRATIONS.filter((m) => !applied.has(m.id)).map(({ id, name }) => ({\n id,\n name,\n }));\n}\n\n// Newer migrations than this build knows are fine: they must stay compatible\n// with the previous release, which still runs during a rollout\nexport async function checkSchema(db: Queryable): Promise<void> {\n const pending = await pendingMigrations(db);\n if (pending.length === 0) return;\n const list = pending.map((m) => `${m.id} (${m.name})`).join(\", \");\n throw new Error(\n `the registry database is missing migration(s) ${list}; run \\`ph-registry migrate\\` first, or set PH_REGISTRY_MIGRATE_ON_BOOT=true`,\n );\n}\n\n/** Whether to migrate at boot: the flag, else the env, else only for PGlite. */\nexport function migrateOnBoot(\n explicit: boolean | undefined,\n databaseUrl: string | undefined,\n): boolean {\n if (explicit !== undefined) return explicit;\n const env = process.env.PH_REGISTRY_MIGRATE_ON_BOOT;\n if (env === \"true\" || env === \"false\") return env === \"true\";\n return !databaseUrl;\n}\n\n/** Migrates, or checks the schema is current and refuses to start if not. */\nexport function prepareSchema(db: Database, migrateNow: boolean) {\n return migrateNow ? migrate(db) : checkSchema(db);\n}\n","import type { Database } from \"../db/database.js\";\nimport { createPostgresDatabase } from \"../db/database.js\";\nimport { prepareSchema } from \"../db/migrations.js\";\nimport type { AuthStore, UserRecord } from \"./auth-store.js\";\n\n/** A database over a Postgres connection string. */\nexport function createPgPool(databaseUrl: string): Database {\n return createPostgresDatabase(databaseUrl);\n}\n\n/**\n * Database-backed AuthStore over `registry_users` and `registry_package_owners`.\n *\n * Ownership claim is race-free: `INSERT ... ON CONFLICT DO NOTHING` means the\n * first publisher wins atomically; the follow-up read returns the actual\n * owners so a losing racer is denied.\n */\nexport function createPgStore(\n pool: Database,\n options: { migrate?: boolean } = {},\n): AuthStore {\n let initialized: Promise<void> | null = null;\n\n return {\n // Retried on failure: a replica that lost the first attempt must not keep the error\n init(): Promise<void> {\n initialized ??= prepareSchema(pool, options.migrate ?? true).catch(\n (err: unknown) => {\n initialized = null;\n throw err;\n },\n );\n return initialized;\n },\n\n async getUser(username: string): Promise<UserRecord | null> {\n const res = await pool.query<{ password_hash: string }>(\n \"SELECT password_hash FROM registry_users WHERE username = $1\",\n [username],\n );\n const row = res.rows[0] as { password_hash: string } | undefined;\n return row ? { passwordHash: row.password_hash } : null;\n },\n\n async createUser(username: string, passwordHash: string): Promise<boolean> {\n // Atomic: the PRIMARY KEY enforces uniqueness. A duplicate raises a\n // unique-violation (SQLSTATE 23505) — catch it as \"already registered\".\n try {\n await pool.query(\n \"INSERT INTO registry_users (username, password_hash) VALUES ($1, $2)\",\n [username, passwordHash],\n );\n return true;\n } catch (err) {\n if ((err as { code?: string }).code === \"23505\") return false;\n throw err;\n }\n },\n\n async getOwners(pkg: string): Promise<string[] | null> {\n const res = await pool.query<{ owners: string[] }>(\n \"SELECT owners FROM registry_package_owners WHERE package_name = $1\",\n [pkg],\n );\n return res.rows[0]?.owners ?? null;\n },\n\n async getOwnersFor(pkgs: string[]): Promise<Record<string, string[]>> {\n if (pkgs.length === 0) return {};\n const placeholders = pkgs.map((_, i) => `$${i + 1}`).join(\",\");\n const res = await pool.query<{ package_name: string; owners: string[] }>(\n `SELECT package_name, owners FROM registry_package_owners WHERE package_name IN (${placeholders})`,\n pkgs,\n );\n const out: Record<string, string[]> = {};\n for (const row of res.rows) out[row.package_name] = row.owners;\n return out;\n },\n\n async claimOwner(pkg: string, username: string): Promise<string[]> {\n // First publisher wins atomically; then read the actual owners.\n await pool.query(\n `INSERT INTO registry_package_owners (package_name, owners)\n VALUES ($1, ARRAY[$2]::text[])\n ON CONFLICT (package_name) DO NOTHING`,\n [pkg, username],\n );\n const res = await pool.query<{ owners: string[] }>(\n \"SELECT owners FROM registry_package_owners WHERE package_name = $1\",\n [pkg],\n );\n return res.rows[0]?.owners ?? [];\n },\n\n close(): Promise<void> {\n return pool.close();\n },\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { AuthStore } from \"./auth-store.js\";\n\n// Carry a live AuthStore to the plugin as a token (verdaccio merges the app\n// config's `store` block into plugin configs), tracking whether it loaded.\nconst REGISTRY_KEY = Symbol.for(\"@powerhousedao/registry:auth-store-handoff\");\n\ninterface Entry {\n store: AuthStore;\n loaded: boolean;\n}\n\nfunction registry(): Map<string, Entry> {\n const g = globalThis as { [REGISTRY_KEY]?: Map<string, Entry> };\n return (g[REGISTRY_KEY] ??= new Map<string, Entry>());\n}\n\n/** Stash a store instance and return a token to carry through plugin config. */\nexport function stashAuthStore(store: AuthStore): string {\n const token = randomUUID();\n registry().set(token, { store, loaded: false });\n return token;\n}\n\n/** Resolve a stashed store by token (undefined if unknown). */\nexport function takeAuthStore(token: string): AuthStore | undefined {\n return registry().get(token)?.store;\n}\n\n/** Record that the plugin fully constructed with this token's store. */\nexport function markStoreLoaded(token: string): void {\n const entry = registry().get(token);\n if (entry) entry.loaded = true;\n}\n\n/** True once the plugin has loaded the store for this token. */\nexport function wasStoreLoaded(token: string): boolean {\n return registry().get(token)?.loaded ?? false;\n}\n","// Cross-process registry events over Postgres NOTIFY: workers announce what\n// they processed, and every replica relays it to SSE clients and waiters.\nimport type { Database } from \"./db/database.js\";\nimport type { PublisherIdentity } from \"./notifications/types.js\";\n\nexport const EVENTS_CHANNEL = \"registry_events\";\nexport const JOBS_CHANNEL = \"registry_jobs\";\n\nexport type RegistryEvent =\n | {\n type: \"version-ready\";\n packageName: string;\n version: string;\n local: boolean;\n /** A publish subscribers hear about, not backfill or on-demand work */\n notify?: boolean;\n publishedBy?: PublisherIdentity;\n }\n | {\n type: \"version-failed\";\n packageName: string;\n version: string;\n error: string;\n }\n | {\n type: \"versions-removed\";\n packageName: string;\n /** null when the whole package is gone */\n versions: string[] | null;\n notify?: boolean;\n publishedBy?: PublisherIdentity;\n };\n\nexport class EventBus {\n #db: Database;\n #handlers = new Set<(event: RegistryEvent) => void>();\n #started: Promise<void> | undefined;\n\n constructor(db: Database) {\n this.#db = db;\n }\n\n start(): Promise<void> {\n this.#started ??= this.#db\n .listen(EVENTS_CHANNEL, (payload) => {\n let event: RegistryEvent;\n try {\n event = JSON.parse(payload) as RegistryEvent;\n } catch {\n return;\n }\n for (const handler of this.#handlers) handler(event);\n })\n .then(() => undefined);\n return this.#started;\n }\n\n on(handler: (event: RegistryEvent) => void): () => void {\n this.#handlers.add(handler);\n return () => this.#handlers.delete(handler);\n }\n\n publish(event: RegistryEvent): Promise<void> {\n return this.#db.notify(EVENTS_CHANNEL, JSON.stringify(event));\n }\n}\n","// The job queue: rows in registry_jobs, claimed with SKIP LOCKED so any number\n// of workers can share it, and retried with backoff until MAX_ATTEMPTS.\nimport type { Database, Queryable } from \"./db/database.js\";\nimport { JOBS_CHANNEL } from \"./events.js\";\n\nexport type JobKind = \"process\" | \"sync\";\n\nexport interface Job {\n id: string;\n kind: JobKind;\n package: string;\n version: string;\n payload: Record<string, unknown>;\n attempts: number;\n priority: number;\n}\n\nexport const MAX_ATTEMPTS = 5;\n/** Versions of packages published elsewhere, processed on request */\nexport const ON_DEMAND_PRIORITY = 5;\n/** Behind every publish and on-demand job */\nexport const BACKGROUND_PRIORITY = 10;\n// A worker that died mid-job leaves its lock; after this another may take it\nconst LOCK_TIMEOUT_SECONDS = 300;\n\n/** Queues a job; one already queued for the same target is run again instead. */\nexport async function enqueue(\n q: Queryable,\n kind: JobKind,\n packageName: string,\n version = \"\",\n payload: Record<string, unknown> = {},\n priority = 0,\n): Promise<void> {\n await q.query(\n `INSERT INTO registry_jobs (kind, package, version, payload, priority)\n VALUES ($1, $2, $3, $4, $5)\n ON CONFLICT (kind, package, version) DO UPDATE\n SET requeued = registry_jobs.locked_by IS NOT NULL,\n run_after = LEAST(registry_jobs.run_after, now()),\n payload = registry_jobs.payload || EXCLUDED.payload,\n priority = LEAST(registry_jobs.priority, EXCLUDED.priority)`,\n [kind, packageName, version, JSON.stringify(payload), priority],\n );\n}\n\n/** Queues a job unless one exists, leaving its backoff alone; true if queued. */\nexport async function ensureJob(\n q: Queryable,\n kind: JobKind,\n packageName: string,\n version = \"\",\n): Promise<boolean> {\n const result = await q.query<{ id: string }>(\n `INSERT INTO registry_jobs (kind, package, version)\n VALUES ($1, $2, $3)\n ON CONFLICT (kind, package, version) DO NOTHING\n RETURNING id::text`,\n [kind, packageName, version],\n );\n return result.rows.length > 0;\n}\n\n/** Wakes idle workers; call after the enqueuing transaction commits. */\nexport function wakeWorkers(db: Database): Promise<void> {\n return db.notify(JOBS_CHANNEL, \"\");\n}\n\nexport async function claim(\n db: Database,\n workerId: string,\n): Promise<Job | null> {\n const result = await db.query<Job>(\n `UPDATE registry_jobs\n SET locked_by = $1, locked_at = now(), attempts = attempts + 1, requeued = false\n WHERE id = (\n SELECT id FROM registry_jobs\n WHERE run_after <= now()\n AND (locked_by IS NULL OR locked_at < now() - make_interval(secs => $2))\n ORDER BY priority, id\n LIMIT 1\n FOR UPDATE SKIP LOCKED)\n RETURNING id::text, kind, package, version, payload, attempts, priority`,\n [workerId, LOCK_TIMEOUT_SECONDS],\n );\n return result.rows[0] ?? null;\n}\n\n/** Removes a finished job, or releases it when it was queued again meanwhile. */\nexport async function complete(q: Queryable, job: Job): Promise<void> {\n await q.query(`DELETE FROM registry_jobs WHERE id = $1 AND NOT requeued`, [\n job.id,\n ]);\n await q.query(\n `UPDATE registry_jobs SET locked_by = NULL, locked_at = NULL, attempts = 0\n WHERE id = $1`,\n [job.id],\n );\n}\n\n/** Schedules the next attempt, backing off exponentially. */\nexport async function retry(\n db: Database,\n job: Job,\n error: string,\n): Promise<void> {\n const delaySeconds = 2 ** job.attempts * 5;\n await db.query(\n `UPDATE registry_jobs\n SET locked_by = NULL, locked_at = NULL, last_error = $2,\n run_after = now() + make_interval(secs => $3)\n WHERE id = $1`,\n [job.id, error, delaySeconds],\n );\n}\n","import type { Manifest } from \"@powerhousedao/shared\";\nimport { slimManifest } from \"@powerhousedao/shared/registry\";\nimport type { PackageListItem } from \"@powerhousedao/shared/registry\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { PackageInfo } from \"./types.js\";\n\nexport function readManifest(dir: string): Manifest | null {\n const candidates = [\n path.join(dir, \"powerhouse.manifest.json\"),\n path.join(dir, \"cdn\", \"powerhouse.manifest.json\"),\n path.join(dir, \"dist\", \"powerhouse.manifest.json\"),\n ];\n for (const manifestPath of candidates) {\n try {\n const raw = fs.readFileSync(manifestPath, \"utf-8\");\n // Manifests are publisher-supplied JSON; slim to the known summary\n // fields so one oversized publish can't bloat every /packages\n // listing (a single 7.8 MB `features` blob once pushed the response\n // past clients' localStorage quota). The raw file stays available\n // through the CDN path.\n return slimManifest(JSON.parse(raw) as Manifest);\n } catch {\n // try next candidate\n }\n }\n return null;\n}\n\n/**\n * Project a full {@link PackageInfo} down to the trimmed shape the paginated\n * package-listing UI renders per row. Version metadata and documentTypes are\n * intentionally dropped — the client fetches them on demand.\n */\nexport function toPackageListItem(pkg: PackageInfo): PackageListItem {\n const publisher = pkg.manifest?.publisher;\n return {\n name: pkg.name,\n path: pkg.path,\n version: pkg.version,\n description: pkg.manifest?.description ?? undefined,\n category: pkg.manifest?.category ?? undefined,\n publisher: publisher\n ? { name: publisher.name, url: publisher.url }\n : undefined,\n };\n}\n\nexport function getDocumentTypesFromManifest(\n manifest: Manifest | undefined | null,\n) {\n if (!manifest) return [];\n\n const documentTypes: string[] = [];\n const { apps, documentModels, editors, subgraphs } = manifest;\n\n if (apps?.length) {\n documentTypes.push(\"powerhouse/document-drive\");\n }\n documentTypes.push(\n ...(documentModels ?? []).map((dm) => dm.id),\n ...(editors ?? [])\n .flatMap((e) => e.documentTypes)\n .filter((dt) => dt !== undefined),\n ...(subgraphs ?? [])\n .flatMap((e) => e.documentTypes)\n .filter((dt) => dt !== undefined),\n );\n\n return documentTypes;\n}\n","function splitVersion(version: string): { core: number[]; pre: string[] } {\n const withoutBuild = version.split(\"+\", 1)[0];\n const dash = withoutBuild.indexOf(\"-\");\n const core = dash === -1 ? withoutBuild : withoutBuild.slice(0, dash);\n const pre = dash === -1 ? \"\" : withoutBuild.slice(dash + 1);\n return { core: core.split(\".\").map(Number), pre: pre ? pre.split(\".\") : [] };\n}\n\nconst NUMERIC = /^\\d+$/;\n\n// Semver §11: numeric identifiers compare numerically and sort before\n// alphanumeric ones; a shorter identifier list sorts first.\nfunction comparePrerelease(a: string[], b: string[]): number {\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n if (i >= a.length) return -1;\n if (i >= b.length) return 1;\n const x = a[i];\n const y = b[i];\n const xNum = NUMERIC.test(x);\n const yNum = NUMERIC.test(y);\n if (xNum && yNum) {\n const diff = Number(x) - Number(y);\n if (diff !== 0) return diff;\n continue;\n }\n if (xNum) return -1;\n if (yNum) return 1;\n if (x !== y) return x < y ? -1 : 1;\n }\n return 0;\n}\n\n/** Semver sort order: negative if a < b, positive if a > b, 0 if equal. */\nexport function compareSemver(a: string, b: string): number {\n const va = splitVersion(a);\n const vb = splitVersion(b);\n for (let i = 0; i < Math.max(va.core.length, vb.core.length); i++) {\n const na = va.core[i] ?? 0;\n const nb = vb.core[i] ?? 0;\n if (na !== nb) return na - nb;\n }\n // A release sorts after its prereleases.\n if (va.pre.length === 0 && vb.pre.length > 0) return 1;\n if (va.pre.length > 0 && vb.pre.length === 0) return -1;\n return comparePrerelease(va.pre, vb.pre);\n}\n","// Turns a published package version into unpacked files and piece bundles in\n// the artifact store, plus rows in Postgres. Every step is safe to retry.\nimport type { Manifest, PieceModule } from \"@powerhousedao/shared\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { Readable, Transform } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport type { ReadableStream as WebReadableStream } from \"node:stream/web\";\nimport { create, extract, list } from \"tar\";\nimport type { ArtifactStore } from \"./artifacts.js\";\nimport type { Database, Queryable } from \"./db/database.js\";\nimport type { EventBus } from \"./events.js\";\nimport { enqueue, type Job } from \"./jobs.js\";\nimport type { PublisherIdentity } from \"./notifications/types.js\";\nimport { readManifest } from \"./packages.js\";\nimport { compareSemver } from \"./semver.js\";\n\n/** Piece names in this scope belong to Activepieces; no package may claim one. */\nexport const RESERVED_PIECE_SCOPE = \"@activepieces/\";\n\n// Bounds what one package version may download and unpack to\nconst MAX_TARBALL_BYTES = 256 * 1024 * 1024;\nconst MAX_UNPACKED_BYTES = 1024 * 1024 * 1024;\nconst UPLOAD_CONCURRENCY = 8;\nconst METADATA_TIMEOUT_MS = 60_000;\nconst TARBALL_TIMEOUT_MS = 300_000;\n// Keeps each versions-removed NOTIFY under Postgres' 8000-byte payload limit\nconst REMOVED_EVENT_CHUNK = 200;\n\nconst MIME_TYPES: Record<string, string> = {\n \".js\": \"application/javascript\",\n \".mjs\": \"application/javascript\",\n \".css\": \"text/css\",\n \".json\": \"application/json\",\n \".wasm\": \"application/wasm\",\n \".map\": \"application/json\",\n \".html\": \"text/html\",\n \".svg\": \"image/svg+xml\",\n};\n\nexport function contentTypeOf(filePath: string): string {\n return (\n MIME_TYPES[path.extname(filePath).toLowerCase()] ??\n \"application/octet-stream\"\n );\n}\n\nexport interface ProcessorContext {\n db: Database;\n artifacts: ArtifactStore;\n events: EventBus;\n /** Base URL of a registry replica's npm endpoint */\n registryUrl: string;\n}\n\n/** A failure retrying won't fix; the version is marked failed at once. */\nexport class PermanentError extends Error {}\n\ninterface Packument {\n \"dist-tags\"?: Record<string, string>;\n versions?: Record<string, unknown>;\n time?: Record<string, string>;\n}\n\nexport function filesKey(pkg: string, version: string, file = \"\"): string {\n return `${pkg}/${version}/files/${file}`;\n}\n\nexport function bundleKey(pkg: string, version: string, file: string): string {\n return `${pkg}/${version}/pieces/${file}`;\n}\n\n/** The tarball filename cdn.activepieces.com would use for the same piece. */\nexport function pieceTarballName(name: string, version: string): string {\n return `${name.replace(\"/\", \"-\")}-${version}.tgz`;\n}\n\nfunction shortName(pkg: string): string {\n return pkg.startsWith(\"@\") ? pkg.split(\"/\")[1] : pkg;\n}\n\nexport async function fetchPackument(\n registryUrl: string,\n pkg: string,\n): Promise<Packument | null> {\n const res = await fetch(`${registryUrl}/${encodeURIComponent(pkg)}`, {\n headers: { Accept: \"application/json\" },\n signal: AbortSignal.timeout(METADATA_TIMEOUT_MS),\n });\n if (res.status === 404) return null;\n if (!res.ok) throw new Error(`metadata for ${pkg} returned ${res.status}`);\n return (await res.json()) as Packument;\n}\n\n// Streams to `file`, failing past the size limit whether or not a length is sent\nasync function downloadTarball(\n registryUrl: string,\n pkg: string,\n version: string,\n file: string,\n): Promise<void> {\n const url = `${registryUrl}/${encodeURIComponent(pkg)}/-/${shortName(pkg)}-${version}.tgz`;\n const res = await fetch(url, {\n signal: AbortSignal.timeout(TARBALL_TIMEOUT_MS),\n });\n if (!res.ok || !res.body) {\n throw new Error(`tarball ${pkg}@${version} returned ${res.status}`);\n }\n const tooLarge = () =>\n new PermanentError(`tarball ${pkg}@${version} exceeds the size limit`);\n if (Number(res.headers.get(\"content-length\") ?? 0) > MAX_TARBALL_BYTES) {\n await res.body.cancel();\n throw tooLarge();\n }\n let bytes = 0;\n const limit = new Transform({\n transform(chunk: Buffer, _encoding, callback) {\n bytes += chunk.length;\n callback(bytes > MAX_TARBALL_BYTES ? tooLarge() : null, chunk);\n },\n });\n await pipeline(\n Readable.fromWeb(res.body as WebReadableStream),\n limit,\n fs.createWriteStream(file),\n );\n}\n\n// Sums entry sizes before extracting, so a small tarball can't fill the disk\nasync function assertUnpackedSize(\n file: string,\n pkg: string,\n version: string,\n): Promise<void> {\n let total = 0;\n await list({\n file,\n onReadEntry: (entry) => {\n total += entry.size ?? 0;\n },\n });\n if (total > MAX_UNPACKED_BYTES) {\n throw new PermanentError(`${pkg}@${version} unpacks past the size limit`);\n }\n}\n\nfunction listFiles(dir: string, prefix = \"\"): string[] {\n const files: string[] = [];\n for (const item of fs.readdirSync(dir, { withFileTypes: true })) {\n const rel = prefix ? `${prefix}/${item.name}` : item.name;\n if (item.isDirectory()) {\n files.push(...listFiles(path.join(dir, item.name), rel));\n } else if (item.isFile()) files.push(rel);\n }\n return files.sort();\n}\n\n// Manifest paths are publisher-supplied; refuse any that climb out\nfunction inside(root: string, relative: string): string | null {\n const resolved = path.resolve(root, relative);\n if (resolved !== root && !resolved.startsWith(root + path.sep)) return null;\n return resolved;\n}\n\nexport async function inBatches<T>(\n items: T[],\n size: number,\n fn: (item: T) => Promise<void>,\n): Promise<void> {\n let cursor = 0;\n let failed = false;\n // Every lane settles before the caller removes the files they read\n const lanes = await Promise.allSettled(\n Array.from({ length: Math.min(size, items.length) }, async () => {\n while (!failed && cursor < items.length) {\n try {\n await fn(items[cursor++]);\n } catch (err) {\n failed = true;\n throw err;\n }\n }\n }),\n );\n const rejected = lanes.find((lane) => lane.status === \"rejected\");\n if (rejected) throw rejected.reason;\n}\n\n// The npm-bundle layout the reactor's extractor strips a root segment from\nasync function packDir(dir: string): Promise<Buffer | null> {\n const files = listFiles(dir);\n if (files.length === 0) return null;\n const chunks: Buffer[] = [];\n const stream = create(\n { gzip: true, cwd: dir, prefix: \"package\", portable: true },\n files,\n );\n for await (const chunk of stream) chunks.push(Buffer.from(chunk as Buffer));\n return Buffer.concat(chunks);\n}\n\nfunction readPackageJsonVersion(dir: string): string | undefined {\n try {\n const pkg = JSON.parse(\n fs.readFileSync(path.join(dir, \"package.json\"), \"utf-8\"),\n ) as { version?: unknown };\n return typeof pkg.version === \"string\" ? pkg.version : undefined;\n } catch {\n return undefined;\n }\n}\n\ninterface PieceRow {\n name: string;\n displayName: string;\n description: string | null;\n descriptor: unknown;\n descriptorPath: string;\n bundleFile: string;\n bundleKey: string | null;\n}\n\nfunction piecesOf(manifest: Manifest | null): PieceModule[] {\n return manifest?.pieces ?? [];\n}\n\nasync function unpackVersion(\n ctx: ProcessorContext,\n pkg: string,\n version: string,\n): Promise<{\n manifest: Manifest | null;\n files: string[];\n packageJsonVersion?: string;\n pieces: PieceRow[];\n}> {\n const dir = await fs.promises.mkdtemp(path.join(os.tmpdir(), \"ph-registry-\"));\n try {\n const file = path.join(dir, \"package.tgz\");\n await downloadTarball(ctx.registryUrl, pkg, version, file);\n await assertUnpackedSize(file, pkg, version);\n const root = path.join(dir, \"package\");\n await fs.promises.mkdir(root);\n await extract({ file, cwd: root, strip: 1 });\n const files = listFiles(root);\n await inBatches(files, UPLOAD_CONCURRENCY, async (rel) => {\n await ctx.artifacts.putFile(\n filesKey(pkg, version, rel),\n path.join(root, rel),\n contentTypeOf(rel),\n );\n });\n\n const manifest = readManifest(root);\n const pieces: PieceRow[] = [];\n for (const piece of piecesOf(manifest)) {\n if (!piece.id || !piece.bundle) continue;\n const bundleDir = inside(root, piece.bundle);\n const descriptorPath =\n piece.descriptor ?? `${piece.bundle}/descriptor.json`;\n const descriptorFile = inside(root, descriptorPath);\n let descriptor: unknown = null;\n if (descriptorFile) {\n try {\n descriptor = JSON.parse(\n await fs.promises.readFile(descriptorFile, \"utf-8\"),\n );\n } catch {\n descriptor = null;\n }\n }\n const bundleFile = pieceTarballName(piece.id, version);\n let key: string | null = null;\n if (bundleDir && fs.existsSync(path.join(bundleDir, \"package.json\"))) {\n const packed = await packDir(bundleDir);\n if (packed) {\n key = bundleKey(pkg, version, bundleFile);\n await ctx.artifacts.put(key, packed, \"application/gzip\");\n }\n }\n pieces.push({\n name: piece.id,\n displayName: piece.name || piece.id,\n description: piece.description ?? null,\n descriptor,\n descriptorPath,\n bundleFile,\n bundleKey: key,\n });\n }\n return {\n manifest,\n files,\n packageJsonVersion: readPackageJsonVersion(root),\n pieces,\n };\n } finally {\n await fs.promises.rm(dir, { recursive: true, force: true });\n }\n}\n\nasync function claimPieces(\n tx: Queryable,\n pkg: string,\n pieces: PieceRow[],\n): Promise<void> {\n for (const piece of pieces) {\n if (piece.name.startsWith(RESERVED_PIECE_SCOPE)) {\n throw new PermanentError(\n `piece names in the ${RESERVED_PIECE_SCOPE} scope belong to Activepieces; ${pkg} cannot claim \"${piece.name}\"`,\n );\n }\n await tx.query(\n `INSERT INTO registry_piece_owners (name, package) VALUES ($1, $2)\n ON CONFLICT (name) DO NOTHING`,\n [piece.name, pkg],\n );\n const owner = await tx.query<{ package: string }>(\n \"SELECT package FROM registry_piece_owners WHERE name = $1\",\n [piece.name],\n );\n if (owner.rows[0]?.package !== pkg) {\n throw new PermanentError(\n `piece \"${piece.name}\" is already published by ${owner.rows[0]?.package}; ${pkg} cannot claim it`,\n );\n }\n }\n}\n\nconst indexed = new WeakSet<Queryable>();\n\n// The storage plugin's revision of a package's manifest, read before the\n// packument: what's fetched after it is at least as new\nasync function indexedRevision(\n db: Queryable,\n pkg: string,\n): Promise<string | null> {\n if (!indexed.has(db)) {\n const table = await db.query<{ exists: boolean }>(\n \"SELECT to_regclass('verdaccio_manifests') IS NOT NULL AS exists\",\n );\n if (!table.rows[0]?.exists) return null;\n indexed.add(db);\n }\n const row = await db.query<{ rev: string | null }>(\n \"SELECT rev FROM verdaccio_manifests WHERE name = $1\",\n [pkg],\n );\n return row.rows[0]?.rev ?? null;\n}\n\n// Whether Verdaccio lists the package or a publisher owns it; null without\n// Verdaccio's table, when no storage plugin keeps one\nexport async function publishedHere(\n db: Queryable,\n pkg: string,\n): Promise<boolean | null> {\n const table = await db.query<{ exists: boolean }>(\n \"SELECT to_regclass('verdaccio_packages') IS NOT NULL AS exists\",\n );\n if (!table.rows[0]?.exists) return null;\n const row = await db.query<{ published: boolean }>(\n `SELECT EXISTS (SELECT 1 FROM verdaccio_packages WHERE name = $1)\n OR EXISTS (SELECT 1 FROM registry_package_owners WHERE package_name = $1)\n AS published`,\n [pkg],\n );\n return row.rows[0]?.published === true;\n}\n\n// Locks first: a tagged publish's version and dist-tag share one `modified`\nasync function lockLatestPackument(\n tx: Queryable,\n registryUrl: string,\n pkg: string,\n fallback: Packument,\n): Promise<Packument> {\n await tx.query(\"SELECT pg_advisory_xact_lock(hashtext($1))\", [pkg]);\n return (await fetchPackument(registryUrl, pkg)) ?? fallback;\n}\n\nasync function upsertPackage(\n tx: Queryable,\n pkg: string,\n packument: Packument,\n local: boolean,\n manifestRev: string | null,\n): Promise<void> {\n const versions = Object.keys(packument.versions ?? {}).sort(compareSemver);\n const times: Record<string, string> = {};\n for (const version of versions) {\n const at = packument.time?.[version];\n if (typeof at === \"string\") times[version] = at;\n }\n // A worker holding an older packument than the last write must not undo it\n await tx.query(\n `INSERT INTO registry_packages\n (name, local, dist_tags, versions, times, modified, manifest_rev)\n VALUES ($1, $2, $3, $4, $5, $6, $7)\n ON CONFLICT (name) DO UPDATE SET\n local = registry_packages.local OR EXCLUDED.local,\n dist_tags = EXCLUDED.dist_tags,\n versions = EXCLUDED.versions,\n times = EXCLUDED.times,\n modified = EXCLUDED.modified,\n manifest_rev = EXCLUDED.manifest_rev,\n updated_at = now()\n WHERE registry_packages.modified IS NULL OR EXCLUDED.modified IS NULL\n OR registry_packages.modified <= EXCLUDED.modified`,\n [\n pkg,\n local,\n JSON.stringify(packument[\"dist-tags\"] ?? {}),\n JSON.stringify(versions),\n JSON.stringify(times),\n packument.time?.modified ?? null,\n manifestRev,\n ],\n );\n}\n\n// SQL NULL, not the JSON value null, so `IS NULL` checks hold\nfunction jsonOrNull(value: unknown): string | null {\n return value == null ? null : JSON.stringify(value);\n}\n\n// Listings show the dist-tag latest once ready, else the highest ready version\nasync function recomputeLatest(tx: Queryable, pkg: string): Promise<void> {\n const ready = await tx.query<{ version: string }>(\n \"SELECT version FROM registry_versions WHERE package = $1 AND status = 'ready'\",\n [pkg],\n );\n const versions = ready.rows.map((r) => r.version).sort(compareSemver);\n const row = await tx.query<{ dist_tags: Record<string, string> }>(\n \"SELECT dist_tags FROM registry_packages WHERE name = $1\",\n [pkg],\n );\n const tagged = row.rows[0]?.dist_tags.latest;\n const latest = tagged && versions.includes(tagged) ? tagged : versions.at(-1);\n await tx.query(\n `UPDATE registry_packages p\n SET latest = $2, listed_manifest = v.manifest,\n listed_package_json_version = v.package_json_version\n FROM (SELECT $1::text AS name) k\n LEFT JOIN registry_versions v\n ON v.package = k.name AND v.version = $2 AND v.status = 'ready'\n WHERE p.name = k.name`,\n [pkg, latest ?? null],\n );\n\n // A piece's latest is the package's listed version when it ships the piece,\n // else its newest release, and a prerelease only when nothing else exists\n const pieces = await tx.query<{ name: string; version: string }>(\n \"SELECT name, version FROM registry_pieces WHERE package = $1\",\n [pkg],\n );\n const byName = new Map<string, string[]>();\n for (const { name, version } of pieces.rows) {\n byName.set(name, [...(byName.get(name) ?? []), version]);\n }\n const newest = new Map<string, string>();\n for (const [name, versions] of byName) {\n const releases = versions.filter((v) => !v.includes(\"-\"));\n const pick =\n latest && versions.includes(latest)\n ? latest\n : (releases.length > 0 ? releases : versions)\n .sort(compareSemver)\n .at(-1);\n if (pick) newest.set(name, pick);\n }\n // Flips only the rows whose flag changes\n await tx.query(\n `WITH latest AS (\n SELECT * FROM unnest($2::text[], $3::text[]) AS l(name, version))\n UPDATE registry_pieces r SET is_latest = NOT r.is_latest\n WHERE r.package = $1 AND r.is_latest <> EXISTS (\n SELECT 1 FROM latest l WHERE l.name = r.name AND l.version = r.version)`,\n [pkg, [...newest.keys()], [...newest.values()]],\n );\n}\n\nasync function removeVersionRows(\n tx: Queryable,\n pkg: string,\n versions: string[],\n): Promise<void> {\n if (versions.length === 0) return;\n // Only this registry's packages: upstream npm retires its own versions\n await tx.query(\n `INSERT INTO registry_unpublished (package, version)\n SELECT $1, v FROM unnest($2::text[]) AS v\n WHERE EXISTS (SELECT 1 FROM registry_packages WHERE name = $1 AND local)\n ON CONFLICT DO NOTHING`,\n [pkg, versions],\n );\n await tx.query(\n \"DELETE FROM registry_pieces WHERE package = $1 AND version = ANY($2)\",\n [pkg, versions],\n );\n await tx.query(\n \"DELETE FROM registry_versions WHERE package = $1 AND version = ANY($2)\",\n [pkg, versions],\n );\n}\n\n// After the rows commit: a prefix left behind by a failure is only garbage\nasync function removeVersionFiles(\n ctx: ProcessorContext,\n pkg: string,\n versions: string[],\n): Promise<void> {\n for (const version of versions) {\n await ctx.artifacts\n .deletePrefix(`${pkg}/${version}/`)\n .catch((err: unknown) => {\n console.error(`[registry] deleting ${pkg}@${version} files:`, err);\n });\n }\n}\n\nfunction publisherOf(job: Job): PublisherIdentity | undefined {\n const by = job.payload.publishedBy as PublisherIdentity | undefined;\n return by?.address ? by : undefined;\n}\n\n/** Processes one package version; `finish` commits the job with the result. */\nexport async function processVersion(\n ctx: ProcessorContext,\n job: Job,\n finish: (tx: Queryable) => Promise<void>,\n): Promise<boolean> {\n const pkg = job.package;\n const version = job.version;\n const published = await publishedHere(ctx.db, pkg);\n const local = published ?? job.payload.local === true;\n const manifestRev = await indexedRevision(ctx.db, pkg);\n const packument = await fetchPackument(ctx.registryUrl, pkg);\n // Unpublishing a whole package drops it from Verdaccio's list first\n if (!packument && published) {\n throw new Error(`metadata for published ${pkg} returned 404`);\n }\n if (!packument?.versions?.[version]) {\n // Unpublished before it was processed\n await ctx.db.transaction(async (tx) => {\n await removeVersionRows(tx, pkg, [version]);\n if (packument) await recomputeLatest(tx, pkg);\n await finish(tx);\n });\n await removeVersionFiles(ctx, pkg, [version]);\n return false;\n }\n\n const unpacked = await unpackVersion(ctx, pkg, version);\n const times = packument.time ?? {};\n\n const isLocal = await ctx.db.transaction(async (tx) => {\n const latest = await lockLatestPackument(\n tx,\n ctx.registryUrl,\n pkg,\n packument,\n );\n await claimPieces(tx, pkg, unpacked.pieces);\n await upsertPackage(tx, pkg, latest, local, manifestRev);\n await tx.query(\n \"DELETE FROM registry_pieces WHERE package = $1 AND version = $2\",\n [pkg, version],\n );\n for (const piece of unpacked.pieces) {\n await tx.query(\n `INSERT INTO registry_pieces\n (name, version, package, display_name, description, descriptor,\n descriptor_path, bundle_file, bundle_key, published_at)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)`,\n [\n piece.name,\n version,\n pkg,\n piece.displayName,\n piece.description,\n jsonOrNull(piece.descriptor),\n piece.descriptorPath,\n piece.bundleFile,\n piece.bundleKey,\n times[version] ?? null,\n ],\n );\n }\n await tx.query(\n `INSERT INTO registry_versions\n (package, version, status, manifest, package_json_version, files, error)\n VALUES ($1, $2, 'ready', $3, $4, $5, NULL)\n ON CONFLICT (package, version) DO UPDATE SET\n status = 'ready', manifest = EXCLUDED.manifest,\n package_json_version = EXCLUDED.package_json_version,\n files = EXCLUDED.files, error = NULL, updated_at = now()`,\n [\n pkg,\n version,\n jsonOrNull(unpacked.manifest),\n unpacked.packageJsonVersion ?? null,\n JSON.stringify(unpacked.files),\n ],\n );\n await recomputeLatest(tx, pkg);\n await finish(tx);\n const row = await tx.query<{ local: boolean }>(\n \"SELECT local FROM registry_packages WHERE name = $1\",\n [pkg],\n );\n return row.rows[0]?.local ?? local;\n });\n\n const publishedBy = publisherOf(job);\n await ctx.events.publish({\n type: \"version-ready\",\n packageName: pkg,\n version,\n local: isLocal,\n notify: job.payload.notify === true,\n ...(publishedBy ? { publishedBy } : {}),\n });\n return true;\n}\n\n/** Records a version that can't be processed. */\nexport async function failVersion(\n ctx: ProcessorContext,\n job: Job,\n error: string,\n permanent = false,\n): Promise<void> {\n await ctx.db.query(\n `INSERT INTO registry_versions (package, version, status, error, permanent)\n VALUES ($1, $2, 'failed', $3, $4)\n ON CONFLICT (package, version) DO UPDATE SET\n status = 'failed', error = EXCLUDED.error,\n permanent = EXCLUDED.permanent, updated_at = now()`,\n [job.package, job.version, error, permanent],\n );\n await ctx.events.publish({\n type: \"version-failed\",\n packageName: job.package,\n version: job.version,\n error,\n });\n}\n\n// Aligns a package's rows with its npm metadata and queues local versions\n// that haven't been processed yet\nexport async function syncPackage(\n ctx: ProcessorContext,\n job: Job,\n finish: (tx: Queryable) => Promise<void>,\n): Promise<string[] | null> {\n const pkg = job.package;\n const manifestRev = await indexedRevision(ctx.db, pkg);\n const packument = await fetchPackument(ctx.registryUrl, pkg);\n const known = await ctx.db.query<{ version: string }>(\n \"SELECT version FROM registry_versions WHERE package = $1\",\n [pkg],\n );\n const listed = new Set(Object.keys(packument?.versions ?? {}));\n const removed = known.rows\n .map((r) => r.version)\n .filter((v) => !listed.has(v));\n\n const published = await publishedHere(ctx.db, pkg);\n const local = published ?? job.payload.local === true;\n // Unpublishing a whole package drops it from Verdaccio's list first\n if (!packument && published) {\n throw new Error(`metadata for published ${pkg} returned 404`);\n }\n await ctx.db.transaction(async (tx) => {\n const latest = packument\n ? await lockLatestPackument(tx, ctx.registryUrl, pkg, packument)\n : null;\n await removeVersionRows(tx, pkg, removed);\n if (!latest) {\n await tx.query(\"DELETE FROM registry_packages WHERE name = $1\", [pkg]);\n } else {\n await upsertPackage(tx, pkg, latest, local, manifestRev);\n await recomputeLatest(tx, pkg);\n if (local) {\n // Tagged versions only; the rest are processed when first requested\n const have = new Set(known.rows.map((r) => r.version));\n const tagged = new Set(Object.values(latest[\"dist-tags\"] ?? {}));\n for (const version of tagged) {\n if (!listed.has(version)) continue;\n if (!have.has(version)) {\n // A sweep's backfill keeps its place behind real publishes\n await enqueue(\n tx,\n \"process\",\n pkg,\n version,\n { local: true },\n job.priority,\n );\n }\n }\n }\n }\n await finish(tx);\n });\n\n await removeVersionFiles(ctx, pkg, removed);\n\n if (!packument || removed.length > 0) {\n const publishedBy = publisherOf(job);\n const chunks: (string[] | null)[] = [];\n if (!packument) chunks.push(null);\n for (let i = 0; packument && i < removed.length; i += REMOVED_EVENT_CHUNK) {\n chunks.push(removed.slice(i, i + REMOVED_EVENT_CHUNK));\n }\n for (const versions of chunks) {\n await ctx.events.publish({\n type: \"versions-removed\",\n packageName: pkg,\n versions,\n notify: job.payload.notify === true,\n ...(publishedBy ? { publishedBy } : {}),\n });\n }\n }\n return packument ? removed : null;\n}\n","// What the Powerhouse routes read: processed package versions and pieces from\n// Postgres, with short-lived caches that registry events clear.\nimport type { Manifest } from \"@powerhousedao/shared\";\nimport type { Database } from \"./db/database.js\";\nimport type { EventBus, RegistryEvent } from \"./events.js\";\nimport { enqueue, ensureJob, ON_DEMAND_PRIORITY, wakeWorkers } from \"./jobs.js\";\nimport { getDocumentTypesFromManifest } from \"./packages.js\";\nimport { fetchPackument } from \"./processor.js\";\nimport { compareSemver } from \"./semver.js\";\nimport type { PackageInfo } from \"./types.js\";\n\n// A safety net for a missed NOTIFY; events clear the caches first\nconst CACHE_TTL_MS = 30_000;\nconst POLL_MS = 1_000;\nexport const ON_DEMAND_TIMEOUT_MS = 60_000;\nconst VERSION_CACHE_MAX = 5_000;\n\nconst FAILED_RETRY_AFTER = \"15 minutes\";\n\nexport interface VersionRow {\n package: string;\n version: string;\n status: \"pending\" | \"ready\" | \"failed\";\n manifest: Manifest | null;\n packageJsonVersion: string | null;\n files: string[];\n error: string | null;\n /** Failed long enough ago that a request may try it again */\n retryable?: boolean;\n}\n\nexport interface PackageRow {\n name: string;\n local: boolean;\n distTags: Record<string, string>;\n versions: string[];\n latest: string | null;\n}\n\nexport interface PieceRow {\n name: string;\n version: string;\n package: string;\n displayName: string;\n description: string | null;\n descriptor: Record<string, unknown> | null;\n descriptorPath: string;\n bundleFile: string;\n bundleKey: string | null;\n publishedAt: string | null;\n}\n\nexport type EnsureResult =\n | { kind: \"ready\"; row: VersionRow }\n | { kind: \"missing\" }\n | { kind: \"failed\"; error: string }\n | { kind: \"timeout\" };\n\nfunction pieceColumns(table: string): string {\n return `${table}.name, ${table}.version, ${table}.package,\n ${table}.display_name AS \"displayName\", ${table}.description,\n ${table}.descriptor, ${table}.descriptor_path AS \"descriptorPath\",\n ${table}.bundle_file AS \"bundleFile\", ${table}.bundle_key AS \"bundleKey\",\n ${table}.published_at AS \"publishedAt\"`;\n}\n\ninterface Cached<T> {\n value: T;\n at: number;\n}\n\nexport interface PackageQuery {\n search: string;\n names: string[];\n categories: string[];\n publishers: string[];\n moduleTypes: string[];\n documentType: string;\n limit: number;\n offset: number;\n}\n\nexport interface PieceQuery {\n search: string;\n limit: number;\n offset: number;\n}\n\n// Local packages with a listed version; recomputeLatest keeps listed_*\nconst LISTED = `\n SELECT p.name, p.dist_tags, p.versions, p.listed_manifest AS manifest,\n p.listed_package_json_version AS package_json_version,\n p.search_doc, p.search_tsv\n FROM registry_packages p\n WHERE p.local AND p.listed_manifest IS NOT NULL\n AND (cardinality($1::text[]) = 0 OR lower(p.name) = ANY($1)\n OR lower(p.listed_manifest->>'name') = ANY($1))`;\n\n// What callers read; the search columns only filter and rank\nconst LISTED_COLUMNS =\n \"name, dist_tags, versions, manifest, package_json_version\";\n\n// Full-text match, fuzzy word match, or substring; `q` and `like` are placeholders\nfunction searchMatch(t: string, q: string, like: string): string {\n return `(${q} = '' OR ${t}search_tsv @@ websearch_to_tsquery('english', ${q})\n OR ${q} <% ${t}search_doc OR ${t}search_doc LIKE ${like})`;\n}\n\nfunction searchScore(t: string, q: string): string {\n return `CASE WHEN ${q} = '' THEN 0 ELSE greatest(\n ts_rank(${t}search_tsv, websearch_to_tsquery('english', ${q})),\n word_similarity(${q}, ${t}search_doc)) END`;\n}\n\ninterface ListedRow {\n name: string;\n dist_tags: Record<string, string>;\n versions: string[];\n manifest: Manifest;\n package_json_version: string | null;\n}\n\nfunction likePattern(search: string): string {\n return `%${search.replace(/[\\\\%_]/g, (c) => `\\\\${c}`)}%`;\n}\n\nfunction toListedInfo(row: ListedRow): PackageInfo {\n return toPackageInfo(row.name, row.manifest, row.package_json_version, {\n distTags: row.dist_tags,\n versions: row.versions,\n });\n}\n\nexport class Catalog {\n #db: Database;\n #events: EventBus;\n #registryUrl: () => string;\n #versions = new Map<string, Cached<VersionRow | null>>();\n // Claims are permanent, so a known owner never goes stale\n #pieceOwners = new Map<string, string>();\n #pieceRows = new Map<string, PieceRow>();\n #changeListeners = new Set<() => void>();\n #ownersFor:\n | ((names: string[]) => Promise<Record<string, string[]>>)\n | undefined;\n\n constructor(db: Database, events: EventBus, registryUrl: () => string) {\n this.#db = db;\n this.#events = events;\n this.#registryUrl = registryUrl;\n events.on((event) => this.#invalidate(event));\n }\n\n /** Forgets every cached version, e.g. after notifications may have been lost. */\n reset(): void {\n this.#versions.clear();\n this.#pieceRows.clear();\n for (const fn of this.#changeListeners) fn();\n }\n\n /** Called whenever what the listings show may have changed. */\n onChange(fn: () => void): void {\n this.#changeListeners.add(fn);\n }\n\n #invalidate(event: RegistryEvent): void {\n for (const fn of this.#changeListeners) fn();\n const removed =\n event.type === \"versions-removed\"\n ? event.versions && new Set(event.versions)\n : new Set([event.version]);\n for (const [key, row] of this.#pieceRows) {\n if (\n row.package === event.packageName &&\n (!removed || removed.has(row.version))\n ) {\n this.#pieceRows.delete(key);\n }\n }\n if (event.type === \"versions-removed\" && event.versions === null) {\n for (const key of this.#versions.keys()) {\n if (key.startsWith(`${event.packageName}@`)) this.#versions.delete(key);\n }\n return;\n }\n const versions =\n event.type === \"versions-removed\"\n ? (event.versions ?? [])\n : [event.version];\n for (const version of versions) {\n this.#versions.delete(`${event.packageName}@${version}`);\n }\n }\n\n #fresh<T>(cached: Cached<T> | undefined): cached is Cached<T> {\n return !!cached && Date.now() - cached.at < CACHE_TTL_MS;\n }\n\n /** Local packages at their listed version, in name order. */\n async packages(): Promise<PackageInfo[]> {\n const rows = await this.#db.query<ListedRow>(\n `SELECT ${LISTED_COLUMNS} FROM (${LISTED}) listed ORDER BY name`,\n [[]],\n );\n return rows.rows.map(toListedInfo);\n }\n\n /**\n * One page of listed packages. Values within a filter OR, filters AND. Name\n * substrings rank first, then other substrings, then full-text/fuzzy score.\n */\n async searchPackages(\n q: PackageQuery,\n opts: { owners?: boolean } = {},\n ): Promise<{ items: PackageInfo[]; total: number }> {\n const search = q.search.trim().toLowerCase();\n const rows = await this.#db.query<ListedRow & { total: string }>(\n `SELECT ${LISTED_COLUMNS}, count(*) OVER () AS total FROM (${LISTED}) listed\n WHERE (cardinality($4::text[]) = 0 OR manifest->>'category' = ANY($4))\n AND (cardinality($5::text[]) = 0\n OR manifest#>>'{publisher,name}' = ANY($5))\n AND (cardinality($6::text[]) = 0 OR EXISTS (\n SELECT 1 FROM unnest($6::text[]) t\n WHERE jsonb_typeof(manifest->t) = 'array'\n AND jsonb_array_length(manifest->t) > 0))\n AND ($7 = '' OR manifest->'documentModels'\n @> jsonb_build_array(jsonb_build_object('id', $7::text)))\n AND ${searchMatch(\"\", \"$2\", \"$3\")}\n ORDER BY ($2 <> '' AND (lower(name) LIKE $3\n OR lower(manifest->>'name') LIKE $3)) DESC,\n ($2 <> '' AND search_doc LIKE $3) DESC,\n ${searchScore(\"\", \"$2\")} DESC, name\n LIMIT $8 OFFSET $9`,\n [\n q.names.map((n) => n.toLowerCase()),\n search,\n likePattern(search),\n q.categories,\n q.publishers,\n q.moduleTypes,\n q.documentType,\n q.limit,\n q.offset,\n ],\n );\n let items = rows.rows.map(toListedInfo);\n if (opts.owners && this.#ownersFor && items.length) {\n const names = rows.rows.map((r) => r.name);\n const owners = await this.#ownersFor(names).catch((err: unknown) => {\n console.error(\"[registry] owner lookup failed:\", err);\n return {} as Record<string, string[]>;\n });\n items = items.map((info, i) =>\n names[i] in owners ? { ...info, owners: owners[names[i]] } : info,\n );\n }\n // Past the last page there is no row to carry the count\n const total = rows.rows.length\n ? Number(rows.rows[0].total)\n : q.offset > 0\n ? await this.#countPackages({ ...q, offset: 0, limit: 1 })\n : 0;\n return { items, total };\n }\n\n async #countPackages(q: PackageQuery): Promise<number> {\n return (await this.searchPackages(q)).total;\n }\n\n /** Categories and publishers across the listed packages `names` allows. */\n async packageFacets(\n names: string[],\n ): Promise<{ categories: string[]; publishers: string[] }> {\n const rows = await this.#db.query<{\n categories: string[] | null;\n publishers: string[] | null;\n }>(\n `SELECT array_agg(DISTINCT manifest->>'category' ORDER BY manifest->>'category')\n FILTER (WHERE manifest->>'category' <> '') AS categories,\n array_agg(DISTINCT manifest#>>'{publisher,name}'\n ORDER BY manifest#>>'{publisher,name}')\n FILTER (WHERE manifest#>>'{publisher,name}' <> '') AS publishers\n FROM (${LISTED}) listed`,\n [names.map((n) => n.toLowerCase())],\n );\n return {\n categories: rows.rows[0]?.categories ?? [],\n publishers: rows.rows[0]?.publishers ?? [],\n };\n }\n\n /** Names of listed packages that define a document model. */\n async packagesWithDocumentType(documentType: string): Promise<string[]> {\n const rows = await this.#db.query<ListedRow>(\n `SELECT ${LISTED_COLUMNS} FROM (${LISTED}) listed\n WHERE manifest->'documentModels'\n @> jsonb_build_array(jsonb_build_object('id', $2::text))\n ORDER BY name`,\n [[], documentType],\n );\n return rows.rows.map((row) => toListedInfo(row).name);\n }\n\n /** Attaches package owners to full package pages. */\n setOwnerLookup(\n lookup: (names: string[]) => Promise<Record<string, string[]>>,\n ): void {\n this.#ownersFor = lookup;\n }\n\n async packageRow(name: string): Promise<PackageRow | null> {\n const rows = await this.#db.query<PackageRow>(\n `SELECT name, local, dist_tags AS \"distTags\", versions, latest\n FROM registry_packages WHERE name = $1`,\n [name],\n );\n return rows.rows[0] ?? null;\n }\n\n async version(pkg: string, version: string): Promise<VersionRow | null> {\n const key = `${pkg}@${version}`;\n const cached = this.#versions.get(key);\n if (this.#fresh(cached) && cached.value?.status === \"ready\") {\n return cached.value;\n }\n const rows = await this.#db.query<VersionRow>(\n `SELECT package, version, status, manifest,\n package_json_version AS \"packageJsonVersion\", files, error,\n (status = 'failed' AND NOT permanent\n AND updated_at < now() - $3::interval) AS retryable\n FROM registry_versions WHERE package = $1 AND version = $2`,\n [pkg, version, FAILED_RETRY_AFTER],\n );\n const row = rows.rows[0] ?? null;\n // Only ready rows are served from the cache, so only they are kept\n if (row?.status === \"ready\") {\n this.#versions.delete(key);\n this.#versions.set(key, { value: row, at: Date.now() });\n if (this.#versions.size > VERSION_CACHE_MAX) {\n this.#versions.delete(this.#versions.keys().next().value!);\n }\n }\n return row;\n }\n\n // The concrete version a tag names (a version, a dist-tag, or `latest`);\n // null for a genuine not-found, and throws when upstream fails\n async resolveVersion(pkg: string, tag?: string): Promise<string | null> {\n const row = await this.packageRow(pkg);\n const fromRow = row?.local\n ? pickVersion(row.distTags, row.versions, tag)\n : null;\n if (fromRow) return fromRow;\n const packument = await fetchPackument(this.#registryUrl(), pkg);\n if (!packument) return null;\n return pickVersion(\n packument[\"dist-tags\"] ?? {},\n Object.keys(packument.versions ?? {}),\n tag,\n );\n }\n\n /** A processed version, queuing it and waiting when no worker has yet. */\n async ensureVersion(\n pkg: string,\n version: string,\n timeoutMs = ON_DEMAND_TIMEOUT_MS,\n ): Promise<EnsureResult> {\n let row = await this.version(pkg, version);\n if (row?.status === \"ready\") return { kind: \"ready\", row };\n if (row?.status === \"failed\" && !row.retryable) {\n return { kind: \"failed\", error: row.error ?? \"\" };\n }\n if (row?.status === \"failed\") {\n // A failure left this long may have been transient, such as throttling\n const local = (await this.packageRow(pkg))?.local === true;\n await this.#db.transaction(async (tx) => {\n // Another request may have reset it already; its job is enough\n const reset = await tx.query(\n `UPDATE registry_versions SET status = 'pending', error = NULL, updated_at = now()\n WHERE package = $1 AND version = $2 AND status = 'failed'\n RETURNING version`,\n [pkg, version],\n );\n if (reset.rows.length === 0) return;\n await enqueue(\n tx,\n \"process\",\n pkg,\n version,\n {},\n local ? 0 : ON_DEMAND_PRIORITY,\n );\n });\n await wakeWorkers(this.#db);\n } else if (!row) {\n const packument = await fetchPackument(this.#registryUrl(), pkg);\n if (!packument?.versions?.[version]) return { kind: \"missing\" };\n // Mirroring an npm package on request waits behind publishes\n const local = (await this.packageRow(pkg))?.local === true;\n await this.#db.transaction(async (tx) => {\n await tx.query(\n `INSERT INTO registry_versions (package, version, status)\n VALUES ($1, $2, 'pending') ON CONFLICT (package, version) DO NOTHING`,\n [pkg, version],\n );\n await enqueue(\n tx,\n \"process\",\n pkg,\n version,\n {},\n local ? 0 : ON_DEMAND_PRIORITY,\n );\n });\n await wakeWorkers(this.#db);\n } else if (await ensureJob(this.#db, \"process\", pkg, version)) {\n // Pending with no job: its job was lost, so queue it again\n await wakeWorkers(this.#db);\n }\n\n const deadline = Date.now() + timeoutMs;\n let wake: (() => void) | undefined;\n const off = this.#events.on((event) => {\n if (event.packageName === pkg) wake?.();\n });\n try {\n while (Date.now() < deadline) {\n await new Promise<void>((resolve) => {\n const timer = setTimeout(resolve, POLL_MS);\n wake = () => {\n clearTimeout(timer);\n resolve();\n };\n });\n this.#versions.delete(`${pkg}@${version}`);\n row = await this.version(pkg, version);\n if (!row) return { kind: \"missing\" };\n if (row.status === \"ready\") return { kind: \"ready\", row };\n if (row.status === \"failed\") {\n return { kind: \"failed\", error: row.error ?? \"\" };\n }\n }\n return { kind: \"timeout\" };\n } finally {\n off();\n }\n }\n\n /** The latest version of every piece local packages ship. */\n async pieceCatalog(): Promise<PieceRow[]> {\n return (await this.searchPieces({ search: \"\", limit: 10_000, offset: 0 }))\n .rows;\n }\n\n /** One page of latest pieces, ranked like {@link searchPackages}. */\n async searchPieces(\n q: PieceQuery,\n ): Promise<{ rows: PieceRow[]; total: number }> {\n const search = q.search.trim().toLowerCase();\n const rows = await this.#db.query<PieceRow & { total: string }>(\n `SELECT ${pieceColumns(\"r\")}, count(*) OVER () AS total\n FROM registry_pieces r\n JOIN registry_packages p ON p.name = r.package\n WHERE r.is_latest AND p.local AND r.descriptor IS NOT NULL\n AND ${searchMatch(\"r.\", \"$1\", \"$2\")}\n ORDER BY ($1 <> '' AND lower(coalesce(r.descriptor->>'displayName',\n r.display_name) || ' ' || r.name) LIKE $2) DESC,\n ($1 <> '' AND r.search_doc LIKE $2) DESC,\n ${searchScore(\"r.\", \"$1\")} DESC,\n coalesce(nullif(r.descriptor->>'displayName', ''),\n r.display_name)\n LIMIT $3 OFFSET $4`,\n [search, likePattern(search), q.limit, q.offset],\n );\n const total = rows.rows.length\n ? Number(rows.rows[0].total)\n : q.offset > 0\n ? (await this.searchPieces({ ...q, offset: 0, limit: 1 })).total\n : 0;\n return { rows: rows.rows.map(({ total: _, ...row }) => row), total };\n }\n\n async pieceLatest(name: string): Promise<PieceRow | null> {\n const rows = await this.#db.query<PieceRow>(\n `SELECT ${pieceColumns(\"r\")}\n FROM registry_pieces r\n JOIN registry_packages p ON p.name = r.package\n WHERE r.name = $1 AND r.is_latest AND p.local`,\n [name],\n );\n return rows.rows[0] ?? null;\n }\n\n /** Every processed version of a piece, newest first. */\n async pieceVersions(name: string): Promise<PieceRow[]> {\n const rows = await this.#db.query<PieceRow>(\n `SELECT ${pieceColumns(\"r\")} FROM registry_pieces r WHERE r.name = $1`,\n [name],\n );\n return rows.rows.sort((a, b) => compareSemver(b.version, a.version));\n }\n\n async pieceVersion(name: string, version: string): Promise<PieceRow | null> {\n const key = `${name}@${version}`;\n const cached = this.#pieceRows.get(key);\n if (cached) return cached;\n const rows = await this.#db.query<PieceRow>(\n `SELECT ${pieceColumns(\"r\")} FROM registry_pieces r\n WHERE r.name = $1 AND r.version = $2`,\n [name, version],\n );\n const row = rows.rows[0] ?? null;\n if (row) remember(this.#pieceRows, key, row);\n return row;\n }\n\n /** The package a piece name belongs to, if any. */\n async pieceOwner(name: string): Promise<string | null> {\n const cached = this.#pieceOwners.get(name);\n if (cached) return cached;\n const rows = await this.#db.query<{ package: string }>(\n \"SELECT package FROM registry_piece_owners WHERE name = $1\",\n [name],\n );\n const owner = rows.rows[0]?.package ?? null;\n if (owner) remember(this.#pieceOwners, name, owner);\n return owner;\n }\n}\n\nconst LOOKUP_CACHE_MAX = 10_000;\n\nfunction remember<V>(map: Map<string, V>, key: string, value: V): void {\n map.set(key, value);\n if (map.size > LOOKUP_CACHE_MAX) map.delete(map.keys().next().value!);\n}\n\nfunction pickVersion(\n distTags: Record<string, string>,\n versions: string[],\n tag?: string,\n): string | null {\n if (tag) {\n if (versions.includes(tag)) return tag;\n return distTags[tag] ?? null;\n }\n return distTags.latest ?? Object.values(distTags)[0] ?? null;\n}\n\nexport function toPackageInfo(\n name: string,\n manifest: Manifest | null,\n packageJsonVersion: string | null,\n meta: { distTags?: Record<string, string>; versions?: string[] } = {},\n): PackageInfo {\n const resolvedName = manifest?.name || name;\n const distTags =\n meta.distTags && Object.keys(meta.distTags).length > 0\n ? meta.distTags\n : undefined;\n const versions =\n meta.versions && meta.versions.length > 0 ? meta.versions : undefined;\n return {\n name: resolvedName,\n path: `/-/cdn/${name}`,\n manifest,\n documentTypes: getDocumentTypesFromManifest(manifest),\n version: packageJsonVersion ?? undefined,\n distTags,\n versions,\n };\n}\n","// Prometheus text exposition (format 0.0.4) for GET /-/metrics, without a\n// client library: counters and histograms kept in-process, gauges read on scrape\nimport type { NextFunction, Request, Response } from \"express\";\nimport http from \"node:http\";\nimport type { AddressInfo } from \"node:net\";\nimport { monitorEventLoopDelay } from \"node:perf_hooks\";\nimport type { Queryable } from \"./db/database.js\";\nimport { BACKGROUND_PRIORITY, ON_DEMAND_PRIORITY } from \"./jobs.js\";\n\ntype Labels = Record<string, string>;\n\nexport interface Sample {\n labels?: Labels;\n value: number;\n}\n\ninterface Family {\n name: string;\n help: string;\n type: \"counter\" | \"gauge\" | \"histogram\";\n lines(): Promise<string[]>;\n}\n\nconst escape = (value: string) =>\n value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\\n/g, \"\\\\n\").replace(/\"/g, '\\\\\"');\n\nfunction series(name: string, labels: Labels | undefined, value: number) {\n const pairs = Object.entries(labels ?? {}).map(\n ([k, v]) => `${k}=\"${escape(v)}\"`,\n );\n const text = Number.isFinite(value)\n ? String(value)\n : value > 0\n ? \"+Inf\"\n : value < 0\n ? \"-Inf\"\n : \"NaN\";\n return `${name}${pairs.length ? `{${pairs.join(\",\")}}` : \"\"} ${text}`;\n}\n\nconst keyOf = (labels: Labels) => JSON.stringify(Object.entries(labels));\n\nexport class Counter {\n private values = new Map<string, Sample>();\n inc(labels: Labels = {}, by = 1): void {\n const key = keyOf(labels);\n const sample = this.values.get(key);\n if (sample) sample.value += by;\n else this.values.set(key, { labels, value: by });\n }\n samples(): Sample[] {\n return [...this.values.values()];\n }\n}\n\nexport class Histogram {\n private values = new Map<\n string,\n { labels: Labels; counts: number[]; sum: number; count: number }\n >();\n constructor(readonly buckets: number[]) {}\n observe(labels: Labels, value: number): void {\n const key = keyOf(labels);\n let entry = this.values.get(key);\n if (!entry) {\n entry = { labels, counts: this.buckets.map(() => 0), sum: 0, count: 0 };\n this.values.set(key, entry);\n }\n for (let i = 0; i < this.buckets.length; i++) {\n if (value <= this.buckets[i]) entry.counts[i]++;\n }\n entry.sum += value;\n entry.count++;\n }\n lines(name: string): string[] {\n const out: string[] = [];\n for (const { labels, counts, sum, count } of this.values.values()) {\n this.buckets.forEach((le, i) => {\n out.push(\n series(`${name}_bucket`, { ...labels, le: String(le) }, counts[i]),\n );\n });\n out.push(series(`${name}_bucket`, { ...labels, le: \"+Inf\" }, count));\n out.push(series(`${name}_sum`, labels, sum));\n out.push(series(`${name}_count`, labels, count));\n }\n return out;\n }\n}\n\nexport class Metrics {\n private families: Family[] = [];\n private closers: (() => void)[] = [];\n\n counter(name: string, help: string): Counter {\n const counter = new Counter();\n this.families.push({\n name,\n help,\n type: \"counter\",\n lines: () =>\n Promise.resolve(\n counter.samples().map((s) => series(name, s.labels, s.value)),\n ),\n });\n return counter;\n }\n\n histogram(name: string, help: string, buckets: number[]): Histogram {\n const histogram = new Histogram(buckets);\n this.families.push({\n name,\n help,\n type: \"histogram\",\n lines: () => Promise.resolve(histogram.lines(name)),\n });\n return histogram;\n }\n\n // Read on scrape; `counter` for totals kept elsewhere, such as CPU time\n gauge(\n name: string,\n help: string,\n collect: () => Sample[] | Promise<Sample[]>,\n type: \"gauge\" | \"counter\" = \"gauge\",\n ): void {\n this.families.push({\n name,\n help,\n type,\n lines: async () =>\n (await collect()).map((s) => series(name, s.labels, s.value)),\n });\n }\n\n onClose(fn: () => void): void {\n this.closers.push(fn);\n }\n\n // A family that fails to collect is left out rather than failing the scrape\n async render(): Promise<string> {\n const blocks = await Promise.all(\n this.families.map(async (family) => {\n const lines = await family.lines().catch((err: unknown) => {\n console.error(`[registry] metric ${family.name}:`, err);\n return null;\n });\n if (!lines) return \"\";\n return [\n `# HELP ${family.name} ${family.help}`,\n `# TYPE ${family.name} ${family.type}`,\n ...lines,\n ].join(\"\\n\");\n }),\n );\n return `${blocks.filter(Boolean).join(\"\\n\")}\\n`;\n }\n\n close(): void {\n for (const fn of this.closers.splice(0)) fn();\n }\n}\n\nexport const CONTENT_TYPE = \"text/plain; version=0.0.4; charset=utf-8\";\n\nconst SECONDS_BUCKETS = [\n 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10, 30, 60,\n];\nconst JOB_BUCKETS = [\n 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10, 30, 60, 120, 300, 600, 1800,\n];\n// Queue gauges query Postgres; a burst of scrapes shares one result\nconst QUEUE_CACHE_MS = 5_000;\n// Catalog counts move slowly and scan more rows\nconst CATALOG_CACHE_MS = 30_000;\n\n/** Event-loop delay, memory and CPU of this process. */\nexport function processMetrics(metrics: Metrics): void {\n const loop = monitorEventLoopDelay({ resolution: 10 });\n loop.enable();\n metrics.onClose(() => loop.disable());\n // Since the last scrape, so a spike shows once rather than forever\n metrics.gauge(\n \"nodejs_eventloop_delay_seconds\",\n \"Event-loop delay since the previous scrape\",\n () => {\n const toSeconds = (ns: number) => (Number.isFinite(ns) ? ns / 1e9 : 0);\n const samples: Sample[] = [\n { labels: { quantile: \"0.5\" }, value: toSeconds(loop.percentile(50)) },\n { labels: { quantile: \"0.9\" }, value: toSeconds(loop.percentile(90)) },\n { labels: { quantile: \"0.99\" }, value: toSeconds(loop.percentile(99)) },\n { labels: { quantile: \"1\" }, value: toSeconds(loop.max) },\n ];\n loop.reset();\n return samples;\n },\n );\n metrics.gauge(\"process_resident_memory_bytes\", \"Resident set size\", () => [\n { value: process.memoryUsage.rss() },\n ]);\n metrics.gauge(\"nodejs_heap_bytes\", \"V8 heap\", () => {\n const m = process.memoryUsage();\n return [\n { labels: { space: \"used\" }, value: m.heapUsed },\n { labels: { space: \"total\" }, value: m.heapTotal },\n { labels: { space: \"external\" }, value: m.external },\n { labels: { space: \"array_buffers\" }, value: m.arrayBuffers },\n ];\n });\n metrics.gauge(\n \"process_cpu_seconds_total\",\n \"User and system CPU time\",\n () => {\n const { user, system } = process.cpuUsage();\n return [{ value: (user + system) / 1e6 }];\n },\n \"counter\",\n );\n const started = Date.now() / 1000 - process.uptime();\n metrics.gauge(\"process_start_time_seconds\", \"Process start time\", () => [\n { value: started },\n ]);\n}\n\n/** Queue depth, oldest due job and the LISTEN connection, read on scrape. */\nexport function databaseMetrics(\n metrics: Metrics,\n db: Queryable & { listening(): boolean },\n): void {\n let cached:\n | {\n at: number;\n rows: Promise<\n {\n priority: number;\n queued: number;\n due: number;\n running: number;\n oldest_due: number | null;\n }[]\n >;\n }\n | undefined;\n const queue = () => {\n if (!cached || Date.now() - cached.at > QUEUE_CACHE_MS) {\n const rows = db\n .query<{\n priority: number;\n queued: number;\n due: number;\n running: number;\n oldest_due: number | null;\n }>(\n `SELECT priority, count(*)::int AS queued,\n count(*) FILTER (WHERE run_after <= now() AND locked_by IS NULL)::int AS due,\n count(*) FILTER (WHERE locked_by IS NOT NULL)::int AS running,\n extract(epoch FROM now() - min(run_after)\n FILTER (WHERE run_after <= now() AND locked_by IS NULL))::float8 AS oldest_due\n FROM registry_jobs GROUP BY priority`,\n )\n .then((r) => r.rows);\n cached = { at: Date.now(), rows };\n rows.catch(() => (cached = undefined));\n }\n return cached.rows;\n };\n // Every known priority reports, at 0 while it has no jobs, so an empty queue\n // still has series\n const byPriority =\n (field: \"queued\" | \"due\" | \"running\" | \"oldest_due\") => async () => {\n const values = new Map<number, number>(\n [0, ON_DEMAND_PRIORITY, BACKGROUND_PRIORITY].map((p) => [p, 0]),\n );\n for (const row of await queue()) {\n values.set(row.priority, Number(row[field] ?? 0));\n }\n return [...values].map(([priority, value]) => ({\n labels: { priority: String(priority) },\n value,\n }));\n };\n metrics.gauge(\n \"registry_jobs\",\n \"Jobs in the queue, by priority\",\n byPriority(\"queued\"),\n );\n metrics.gauge(\n \"registry_jobs_due\",\n \"Jobs ready to run and not claimed, by priority\",\n byPriority(\"due\"),\n );\n metrics.gauge(\n \"registry_jobs_running\",\n \"Jobs a worker has claimed, by priority\",\n byPriority(\"running\"),\n );\n metrics.gauge(\n \"registry_jobs_oldest_due_seconds\",\n \"Age of the oldest unclaimed due job, by priority\",\n byPriority(\"oldest_due\"),\n );\n metrics.gauge(\n \"registry_listen_connected\",\n \"1 while the LISTEN connection is up\",\n () => [{ value: db.listening() ? 1 : 0 }],\n );\n}\n\n/**\n * Package and version counts. They're the same from every process, so only\n * one that runs jobs registers them.\n */\nexport function catalogMetrics(metrics: Metrics, db: Queryable): void {\n let catalogCached: { at: number; row: Promise<CatalogCounts> } | undefined;\n const catalog = () => {\n if (!catalogCached || Date.now() - catalogCached.at > CATALOG_CACHE_MS) {\n const row = db\n .query<CatalogCounts>(\n `SELECT\n (SELECT count(*) FROM registry_packages WHERE local)::int AS local,\n (SELECT count(*) FROM registry_packages\n WHERE local AND listed_manifest IS NOT NULL)::int AS listed,\n count(*) FILTER (WHERE status = 'ready')::int AS ready,\n count(*) FILTER (WHERE status = 'pending')::int AS pending,\n count(*) FILTER (WHERE status = 'failed' AND NOT permanent)::int AS failed,\n count(*) FILTER (WHERE status = 'failed' AND permanent)::int AS failed_permanent\n FROM registry_versions`,\n )\n .then((r) => r.rows[0]);\n catalogCached = { at: Date.now(), row };\n row.catch(() => (catalogCached = undefined));\n }\n return catalogCached.row;\n };\n metrics.gauge(\n \"registry_packages\",\n \"Packages published here (local), and those /packages lists (listed)\",\n async () => {\n const row = await catalog();\n return ([\"local\", \"listed\"] as const).map((state) => ({\n labels: { state },\n value: row[state],\n }));\n },\n );\n metrics.gauge(\n \"registry_versions\",\n \"Processed versions, by status; failed_permanent is never retried\",\n async () => {\n const row = await catalog();\n return ([\"ready\", \"pending\", \"failed\", \"failed_permanent\"] as const).map(\n (status) => ({ labels: { status }, value: row[status] }),\n );\n },\n );\n}\n\ninterface CatalogCounts {\n local: number;\n listed: number;\n ready: number;\n pending: number;\n failed: number;\n failed_permanent: number;\n}\n\n/** A bounded label for why a job failed. */\nexport function errorReason(err: unknown, permanent = false): string {\n const name = (err as { name?: string }).name ?? \"\";\n const message = err instanceof Error ? err.message : String(err);\n if (name === \"SlowDown\" || /reduce your request rate/i.test(message)) {\n return \"s3_throttled\";\n }\n if (permanent) return \"permanent\";\n if (/returned 404/.test(message)) return \"not_found\";\n if (name === \"TimeoutError\" || /timed? ?out/i.test(message)) return \"timeout\";\n return \"other\";\n}\n\n/** What a worker records about the jobs it runs. */\nexport interface WorkerMetrics {\n jobDuration: Histogram;\n jobErrors: Counter;\n reconcileQueued: Counter;\n reconcileRuns: Counter;\n}\n\nexport function workerMetrics(metrics: Metrics): WorkerMetrics {\n return {\n jobDuration: metrics.histogram(\n \"registry_job_duration_seconds\",\n \"Time to run a job, by kind and outcome (done, retry, failed)\",\n JOB_BUCKETS,\n ),\n jobErrors: metrics.counter(\n \"registry_job_errors_total\",\n \"Job failures, by kind and reason (s3_throttled, not_found, timeout, permanent, other)\",\n ),\n reconcileQueued: metrics.counter(\n \"registry_reconcile_queued_total\",\n \"Jobs reconcile queued, by pass (quick, full)\",\n ),\n reconcileRuns: metrics.counter(\n \"registry_reconcile_runs_total\",\n \"Reconcile passes, by pass (quick, full)\",\n ),\n };\n}\n\n// Bounded label values: a handful of route groups and status classes\nexport function routeGroup(method: string, path: string): string {\n if (path.startsWith(\"/-/cdn/\")) return \"cdn\";\n if (path.startsWith(\"/-/pieces/bundled/\")) return \"piece-bundle\";\n if (path === \"/pieces\" || path.startsWith(\"/pieces/\")) return \"pieces\";\n if (path === \"/packages\" || path.startsWith(\"/packages/\")) return \"packages\";\n if (path === \"/-/events\") return \"events\";\n if (path === \"/-/live\" || path === \"/-/ready\" || path === \"/-/ping\") {\n return \"health\";\n }\n if (path === \"/-/metrics\") return \"metrics\";\n if (path.startsWith(\"/-/user/\") || path === \"/-/whoami\") return \"auth\";\n if (path.startsWith(\"/-/static/\") || path === \"/\" || path === \"/favicon.ico\")\n return \"web\";\n if (/\\/-\\/[^/]+\\.tgz$/.test(path)) return \"tarball\";\n if (path.startsWith(\"/-/\")) return \"other\";\n if (method === \"PUT\" || method === \"DELETE\") return \"npm-write\";\n return \"npm-metadata\";\n}\n\n/** Counts and times requests by route group; SSE streams are only counted. */\nexport function httpMetrics(metrics: Metrics) {\n const requests = metrics.counter(\n \"registry_http_requests_total\",\n \"HTTP requests, by route group, method and status class\",\n );\n const duration = metrics.histogram(\n \"registry_http_request_duration_seconds\",\n \"HTTP response time, by route group\",\n SECONDS_BUCKETS,\n );\n return (req: Request, res: Response, next: NextFunction) => {\n const start = process.hrtime.bigint();\n const route = routeGroup(req.method, req.path);\n res.once(\"finish\", () => {\n const status = `${Math.floor(res.statusCode / 100)}xx`;\n requests.inc({ route, method: req.method, status });\n if (route === \"events\") return;\n const seconds = Number(process.hrtime.bigint() - start) / 1e9;\n duration.observe({ route }, seconds);\n });\n next();\n };\n}\n\n/** A server that only answers GET /-/metrics, for the worker. */\nexport async function serveMetrics(\n metrics: Metrics,\n port: number,\n): Promise<http.Server> {\n const server = http.createServer((req, res) => {\n if (req.method !== \"GET\" || req.url?.split(\"?\")[0] !== \"/-/metrics\") {\n res.writeHead(404).end();\n return;\n }\n metrics\n .render()\n .then((body) => {\n res.writeHead(200, { \"Content-Type\": CONTENT_TYPE }).end(body);\n })\n .catch(() => res.writeHead(500).end());\n });\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(port, () => resolve());\n });\n const address = server.address() as AddressInfo;\n console.log(`[registry] metrics on :${address.port}/-/metrics`);\n return server;\n}\n","/**\n * Parse a package specifier into name and version/tag.\n * Supports:\n * \"@scope/pkg\" -> { name: \"@scope/pkg\", tag: undefined }\n * \"@scope/pkg@dev\" -> { name: \"@scope/pkg\", tag: \"dev\" }\n * \"@scope/pkg@1.0.0\" -> { name: \"@scope/pkg\", tag: \"1.0.0\" }\n * \"pkg@latest\" -> { name: \"pkg\", tag: \"latest\" }\n */\nexport function parsePackageSpec(spec: string): {\n name: string;\n tag: string | undefined;\n} {\n // For scoped packages (@scope/name@tag), split on the last @\n // For unscoped packages (name@tag), split on the first @\n if (spec.startsWith(\"@\")) {\n // Scoped: find the @ after the scope/name portion\n const lastAt = spec.lastIndexOf(\"@\");\n if (lastAt > 0 && lastAt !== spec.indexOf(\"@\")) {\n return { name: spec.slice(0, lastAt), tag: spec.slice(lastAt + 1) };\n }\n return { name: spec, tag: undefined };\n }\n const atIndex = spec.indexOf(\"@\");\n if (atIndex > 0) {\n return { name: spec.slice(0, atIndex), tag: spec.slice(atIndex + 1) };\n }\n return { name: spec, tag: undefined };\n}\n\n/** True when tag is a concrete semver, false for dist-tag names or undefined. */\nexport function isExactVersion(tag?: string): boolean {\n // Strict semver charset: the version flows into the ETag header, so\n // arbitrary characters after the prerelease/build separator must not match.\n return (\n !!tag &&\n /^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$/.test(tag)\n );\n}\n","// Response shapes for pieces published inside reactor packages, in the forms\n// cloud.activepieces.com uses so the engine reads both the same way.\nimport type { Manifest } from \"@powerhousedao/shared\";\nimport { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport { list } from \"tar\";\nimport type { PieceRow } from \"./catalog.js\";\n\nexport { pieceTarballName, RESERVED_PIECE_SCOPE } from \"./processor.js\";\n\n/** A piece's own metadata, as `ph build` wrote it next to the bundle. */\ninterface PieceDescriptor {\n displayName?: string;\n description?: string;\n logoUrl?: string;\n authors?: string[];\n categories?: string[];\n auth?: unknown;\n minimumSupportedRelease?: string;\n maximumSupportedRelease?: string;\n actions?: Record<string, DescriptorBlock>;\n triggers?: Record<string, DescriptorBlock>;\n}\n\ninterface DescriptorBlock {\n displayName?: string;\n description?: string;\n /** Triggers only: POLLING | WEBHOOK | APP_WEBHOOK. */\n type?: string;\n}\n\ninterface SuggestedAction {\n name: string;\n displayName: string;\n description: string;\n}\n\ninterface SuggestedTrigger extends SuggestedAction {\n type: string;\n}\n\n// One catalog entry, in cloud.activepieces.com's list shape\n// (`PieceMetadataSummary`), plus the package that ships it.\nexport interface PieceCatalogEntry {\n name: string;\n displayName: string;\n description: string;\n logoUrl: string;\n version: string;\n authors: string[];\n categories: string[];\n auth: unknown;\n actions: number;\n triggers: number;\n minimumSupportedRelease?: string;\n maximumSupportedRelease?: string;\n package: string;\n packageVersion: string;\n suggestedActions?: SuggestedAction[];\n suggestedTriggers?: SuggestedTrigger[];\n}\n\n/** One row of `GET /pieces/<name>/versions`. */\nexport interface PieceVersionSummary {\n version: string;\n packageVersion: string;\n publishedAt: string | null;\n}\n\nfunction descriptorOf(row: PieceRow): PieceDescriptor | null {\n return row.descriptor as PieceDescriptor | null;\n}\n\nconst count = (record: Record<string, unknown> | undefined) =>\n record ? Object.keys(record).length : 0;\n\n// Only the fields the editor's block search reads. The cloud list types these\n// as whole actions but sends the summary, and props would dwarf the listing.\nfunction suggested(\n blocks: Record<string, DescriptorBlock> | undefined,\n): SuggestedAction[] {\n return Object.entries(blocks ?? {}).map(([name, block]) => ({\n name,\n displayName: block.displayName ?? name,\n description: block.description ?? \"\",\n }));\n}\n\nfunction catalogEntry(\n row: PieceRow,\n descriptor: PieceDescriptor,\n suggestions: boolean,\n): PieceCatalogEntry {\n return {\n name: row.name,\n displayName: descriptor.displayName || row.displayName,\n description: descriptor.description ?? row.description ?? \"\",\n logoUrl: descriptor.logoUrl ?? \"\",\n version: row.version,\n authors: descriptor.authors ?? [],\n categories: descriptor.categories ?? [],\n auth: descriptor.auth ?? null,\n actions: count(descriptor.actions),\n triggers: count(descriptor.triggers),\n ...(descriptor.minimumSupportedRelease\n ? { minimumSupportedRelease: descriptor.minimumSupportedRelease }\n : {}),\n ...(descriptor.maximumSupportedRelease\n ? { maximumSupportedRelease: descriptor.maximumSupportedRelease }\n : {}),\n package: row.package,\n packageVersion: row.version,\n ...(suggestions\n ? {\n suggestedActions: suggested(descriptor.actions),\n suggestedTriggers: Object.entries(descriptor.triggers ?? {}).map(\n ([name, block]) => ({\n name,\n displayName: block.displayName ?? name,\n description: block.description ?? \"\",\n type: block.type ?? \"\",\n }),\n ),\n }\n : {}),\n };\n}\n\n/** The catalog of latest versions, sorted by display name. */\nexport function pieceCatalog(\n rows: PieceRow[],\n suggestions: boolean,\n): PieceCatalogEntry[] {\n const entries: PieceCatalogEntry[] = [];\n for (const row of rows) {\n const descriptor = descriptorOf(row);\n if (descriptor) entries.push(catalogEntry(row, descriptor, suggestions));\n }\n return entries.sort((a, b) => a.displayName.localeCompare(b.displayName));\n}\n\nexport function versionSummary(row: PieceRow): PieceVersionSummary {\n return {\n version: row.version,\n packageVersion: row.version,\n publishedAt: row.publishedAt\n ? new Date(row.publishedAt).toISOString()\n : null,\n };\n}\n\nexport function pieceTarballPath(row: PieceRow): string {\n return `/-/pieces/bundled/${row.name}/${row.version}.tgz`;\n}\n\n/** One piece version: what provides it, and where its descriptor and bundle are. */\nexport function pieceDetail(\n row: PieceRow,\n origin: string,\n): Record<string, unknown> | null {\n const descriptor = descriptorOf(row);\n if (!descriptor) return null;\n // The descriptor verbatim, so `fetchPieceDetail` reads this endpoint exactly\n // as it reads the cloud one; the provider fields are additions.\n return {\n ...descriptor,\n name: row.name,\n version: row.version,\n package: row.package,\n packageVersion: row.version,\n descriptorUrl: `${origin}/-/cdn/${row.package}@${row.version}/${row.descriptorPath}`,\n bundleUrl: `${origin}${pieceTarballPath(row)}`,\n };\n}\n\n// Manifest locations inside a published tarball, in the order readManifest\n// resolves them, so the publish check sees the manifest the processor will.\nconst MANIFEST_PATHS = [\n \"powerhouse.manifest.json\",\n \"cdn/powerhouse.manifest.json\",\n \"dist/powerhouse.manifest.json\",\n];\n\n// Past this the publish check is skipped; the worker still enforces claims\nconst MAX_CHECKED_TARBALL_BYTES = 32 * 1024 * 1024;\nconst CHUNK_BYTES = 64 * 1024;\n\nfunction stripRoot(entryPath: string): string {\n return entryPath.replace(/^[^/]+\\//, \"\");\n}\n\n// Parses in chunks so a large publish doesn't hold the event loop\nasync function manifestsInTarball(tgz: Buffer): Promise<Map<string, string>> {\n const found = new Map<string, string>();\n const parser = list({\n filter: (entryPath: string) =>\n MANIFEST_PATHS.includes(stripRoot(entryPath)),\n onReadEntry: (entry) => {\n const chunks: Buffer[] = [];\n entry.on(\"data\", (chunk: Buffer) => chunks.push(Buffer.from(chunk)));\n entry.on(\"end\", () => {\n found.set(\n stripRoot(String(entry.path)),\n Buffer.concat(chunks).toString(\"utf-8\"),\n );\n });\n },\n });\n const chunks = function* () {\n for (let i = 0; i < tgz.length; i += CHUNK_BYTES) {\n yield tgz.subarray(i, i + CHUNK_BYTES);\n }\n };\n await pipeline(Readable.from(chunks()), parser);\n return found;\n}\n\n/** The piece names a published tarball claims; empty when it claims none. */\nexport async function pieceNamesInTarball(tgz: Buffer): Promise<string[]> {\n if (tgz.length > MAX_CHECKED_TARBALL_BYTES) return [];\n let manifests: Map<string, string>;\n try {\n manifests = await manifestsInTarball(tgz);\n } catch {\n return [];\n }\n for (const candidate of MANIFEST_PATHS) {\n const raw = manifests.get(candidate);\n if (raw === undefined) continue;\n try {\n const manifest = JSON.parse(raw) as Manifest;\n return (manifest.pieces ?? [])\n .map((piece) => piece.id)\n .filter((id): id is string => typeof id === \"string\" && id !== \"\");\n } catch {\n return [];\n }\n }\n return [];\n}\n","import express, {\n Router,\n type NextFunction,\n type Request,\n type Response,\n} from \"express\";\nimport crypto from \"node:crypto\";\nimport path from \"node:path\";\nimport type { Readable } from \"node:stream\";\nimport type { ArtifactStore } from \"./artifacts.js\";\nimport type { AuthStore } from \"./auth/auth-store.js\";\nimport type { Catalog, EnsureResult, VersionRow } from \"./catalog.js\";\nimport { toPackageInfo } from \"./catalog.js\";\nimport { isExactVersion, parsePackageSpec } from \"./cdn.js\";\nimport type { Database } from \"./db/database.js\";\nimport { enqueue, wakeWorkers } from \"./jobs.js\";\nimport type { SSEChannel } from \"./notifications/sse.js\";\nimport type { PublisherIdentity } from \"./notifications/types.js\";\nimport type { WebhookStore } from \"./notifications/webhook.js\";\nimport { toPackageListItem } from \"./packages.js\";\nimport { PACKAGE_MODULE_TYPES } from \"@powerhousedao/shared/registry\";\nimport {\n pieceCatalog,\n pieceDetail,\n pieceNamesInTarball,\n RESERVED_PIECE_SCOPE,\n versionSummary,\n} from \"./pieces.js\";\nimport { bundleKey, contentTypeOf, filesKey } from \"./processor.js\";\nimport type { PackageInfo, RegistryConfig } from \"./types.js\";\n\n// Paginated /packages and /pieces: default and max page sizes\nconst DEFAULT_PAGE_SIZE = 30;\nconst MAX_PAGE_SIZE = 50;\n// How long a client is told to wait while a worker processes a version\nconst RETRY_AFTER_SECONDS = \"5\";\n\n// Wildcard routes; the matched rest of the path is req.params[0]\nconst PACKAGE_ROUTE = /^\\/packages\\/(.+)$/;\nconst PIECE_ROUTE = /^\\/pieces\\/(.+)$/;\n// `<piece name>/<version>.tgz`; a scoped name keeps its slash\nconst BUNDLE_ROUTE = /^\\/-\\/pieces\\/bundled\\/(.+)\\/([^/]+)\\.tgz$/;\nconst CDN_ROUTE = /^\\/-\\/cdn\\/(.+)$/;\n\nexport interface RegistryServices {\n db: Database;\n catalog: Catalog;\n artifacts: ArtifactStore;\n webhooks: WebhookStore;\n sse: SSEChannel;\n ownerStore?: AuthStore;\n}\n\n/** Parse+clamp a `limit` query param to 1..MAX_PAGE_SIZE (default 30). */\nfunction clampPageSize(raw: unknown): number {\n const n = Number(raw);\n if (!Number.isFinite(n) || n < 1) return DEFAULT_PAGE_SIZE;\n return Math.min(Math.floor(n), MAX_PAGE_SIZE);\n}\n\n/** Parse an `offset` query param to a non-negative integer (default 0). */\nfunction parseOffset(raw: unknown): number {\n const n = Number(raw);\n if (!Number.isFinite(n) || n < 0) return 0;\n return Math.floor(n);\n}\n\n// Repeated keys (`?name=a&name=b`) as a list of strings\nfunction queryList(raw: unknown): string[] {\n const values = Array.isArray(raw) ? raw : [raw];\n return values.filter(\n (v): v is string => typeof v === \"string\" && v.length > 0,\n );\n}\n\nfunction queryString(raw: unknown): string {\n return typeof raw === \"string\" ? raw.trim() : \"\";\n}\n\nfunction pageParams(req: Request): { limit: number; offset: number } {\n return {\n limit: clampPageSize(req.query.limit),\n offset: parseOffset(req.query.offset),\n };\n}\n\nconst IMMUTABLE = \"public, max-age=31536000, immutable\";\nconst PAGE_CACHE_MAX = 500;\nconst PAGE_CACHE_TTL_MS = 30_000;\n\n// The file path is hashed: it comes from the URL and may hold characters\n// invalid in a header value\nfunction cdnEtag(version: string, filePath: string): string {\n const hash = crypto\n .createHash(\"sha1\")\n .update(filePath)\n .digest(\"hex\")\n .slice(0, 16);\n return `W/\"${version}-${hash}\"`;\n}\n\nfunction wildcard(req: Request): string {\n return (req.params as Record<string, string>)[0];\n}\n\n// `<name>/versions` when `<name>` is a whole piece name (`x` or `@scope/x`).\nfunction versionsRouteName(raw: string): string | null {\n if (!raw.endsWith(\"/versions\")) return null;\n const name = raw.slice(0, -\"/versions\".length);\n const slashes = name.split(\"/\").length - 1;\n const valid = name.startsWith(\"@\") ? slashes === 1 : slashes === 0;\n return valid && name !== \"\" ? name : null;\n}\n\n// Where a client reached us, for the absolute URLs the piece endpoints hand\n// out. `trust proxy` is off here, so the forwarded scheme is read directly.\nfunction originOf(req: Request): string {\n const forwarded = req.get(\"x-forwarded-proto\")?.split(\",\")[0].trim();\n return `${forwarded || req.protocol}://${req.get(\"host\") ?? \"\"}`;\n}\n\n// Publisher identity from verdaccio's remote_user (the renown middleware sets\n// its name to the owner pkh DID). undefined when anonymous.\nfunction publisherFromRequest(req: Request): PublisherIdentity | undefined {\n const name = (req as { remote_user?: { name?: string } }).remote_user?.name;\n if (!name) return undefined;\n if (name.startsWith(\"did:pkh:\")) {\n const address = (name.split(\":\").pop() ?? name).toLowerCase();\n return { address, did: name };\n }\n return { address: name };\n}\n\n/** Strip the weak-validator prefix: weak comparison is correct for GET/HEAD. */\nfunction opaqueTag(tag: string): string {\n return tag.startsWith(\"W/\") ? tag.slice(2) : tag;\n}\n\n/** RFC 9110 If-None-Match: a comma-separated list of entity-tags or \"*\". */\nfunction etagMatches(\n header: string | string[] | undefined,\n etag: string,\n): boolean {\n if (!header) return false;\n const target = opaqueTag(etag);\n const value = Array.isArray(header) ? header.join(\",\") : header;\n return value.split(\",\").some((candidate) => {\n const tag = candidate.trim();\n return tag === \"*\" || opaqueTag(tag) === target;\n });\n}\n\ntype VersionResolution =\n | { kind: \"ok\"; version: string }\n | { kind: \"not-found\" }\n | { kind: \"upstream-error\" };\n\n// Exact versions skip the lookup; when upstream fails, the listed version of\n// a known package stands in\nasync function resolvePackageVersion(\n catalog: Catalog,\n name: string,\n tag: string | undefined,\n): Promise<VersionResolution> {\n if (tag && isExactVersion(tag)) return { kind: \"ok\", version: tag };\n try {\n const version = await catalog.resolveVersion(name, tag);\n return version ? { kind: \"ok\", version } : { kind: \"not-found\" };\n } catch {\n const row = await catalog.packageRow(name).catch(() => null);\n return row?.latest && !tag\n ? { kind: \"ok\", version: row.latest }\n : { kind: \"upstream-error\" };\n }\n}\n\nasync function ensure(\n catalog: Catalog,\n name: string,\n version: string,\n): Promise<EnsureResult | { kind: \"upstream-error\" }> {\n try {\n return await catalog.ensureVersion(name, version);\n } catch {\n return { kind: \"upstream-error\" };\n }\n}\n\nfunction sendNotReady(res: Response, result: { kind: string }): boolean {\n if (result.kind === \"timeout\") {\n res.setHeader(\"Retry-After\", RETRY_AFTER_SECONDS);\n res.status(503).send(\"Package version is still being processed\");\n return true;\n }\n if (result.kind === \"upstream-error\") {\n res.status(503).send(\"Upstream registry unavailable\");\n return true;\n }\n return false;\n}\n\n// npm tarballs keep files under dist/, bun bundles under cdn/\n// Cached rows are reused across requests; so are their file sets\nconst fileSets = new WeakMap<VersionRow, Set<string>>();\n\nfunction resolveFile(row: VersionRow, filePath: string): string | null {\n const normalized = path.posix.normalize(filePath);\n if (normalized.startsWith(\"..\") || path.posix.isAbsolute(normalized)) {\n return null;\n }\n let files = fileSets.get(row);\n if (!files) {\n files = new Set(row.files);\n fileSets.set(row, files);\n }\n for (const candidate of [\n normalized,\n `cdn/${normalized}`,\n `dist/cdn/${normalized}`,\n `dist/${normalized}`,\n ]) {\n if (files.has(candidate)) return candidate;\n }\n return null;\n}\n\nasync function stream(\n res: Response,\n artifacts: ArtifactStore,\n key: string,\n): Promise<boolean> {\n const artifact = await artifacts.get(key);\n if (!artifact) return false;\n if (artifact.size !== undefined) {\n res.setHeader(\"Content-Length\", String(artifact.size));\n }\n if (artifact.body) {\n res.end(artifact.body);\n return true;\n }\n // pipe over stream/promises: its pipeline builds an AbortSignal per call\n const source = artifact.stream as Readable;\n await new Promise<void>((resolve) => {\n source.once(\"error\", () => {\n // Headers may be out already; drop the socket so the client doesn't hang\n res.destroy();\n resolve();\n });\n res.once(\"close\", () => {\n source.destroy();\n resolve();\n });\n source.pipe(res);\n });\n return true;\n}\n\nexport function createPowerhouseRouter(\n config: RegistryConfig,\n services: RegistryServices,\n): Router {\n const { catalog, artifacts, webhooks, sse, ownerStore } = services;\n const router = Router();\n\n // Owners are keyed by npm name; `pkg.name` may be the manifest's\n const withOwners = async (\n pkg: PackageInfo,\n npmName: string,\n ): Promise<PackageInfo> => {\n if (!ownerStore) return pkg;\n try {\n await ownerStore.init();\n const map = await ownerStore.getOwnersFor([npmName]);\n return npmName in map ? { ...pkg, owners: map[npmName] } : pkg;\n } catch (err) {\n console.error(\"[registry] owner lookup failed:\", err);\n return pkg;\n }\n };\n\n const route =\n (handler: (req: Request, res: Response) => Promise<void>) =>\n (req: Request, res: Response, next: NextFunction) => {\n handler(req, res).catch(next);\n };\n\n // CORS on every response\n router.use((_req: Request, res: Response, next: NextFunction) => {\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n next();\n });\n\n // SSE endpoint for publish notifications\n router.get(\"/-/events\", (_req: Request, res: Response) => {\n sse.addClient(res);\n });\n\n // Webhook management\n router.get(\n \"/-/webhooks\",\n route(async (_req, res) => {\n res.json(await webhooks.getWebhooks());\n }),\n );\n\n router.post(\n \"/-/webhooks\",\n express.json(),\n route(async (req, res) => {\n const { endpoint, headers } = req.body as {\n endpoint?: string;\n headers?: Record<string, string>;\n };\n if (!endpoint) {\n res.status(400).json({ error: \"Missing required field: endpoint\" });\n return;\n }\n await webhooks.addWebhook({ endpoint, headers });\n res.status(201).json({ endpoint, headers });\n }),\n );\n\n router.delete(\n \"/-/webhooks\",\n express.json(),\n route(async (req, res) => {\n const { endpoint } = req.body as { endpoint?: string };\n if (!endpoint) {\n res.status(400).json({ error: \"Missing required field: endpoint\" });\n return;\n }\n if (!(await webhooks.removeWebhook(endpoint))) {\n res.status(404).json({ error: \"Webhook not found\" });\n return;\n }\n res.status(204).end();\n }),\n );\n\n // Pages by URL until anything they list changes; the TTL covers a missed event\n const pages = new Map<string, { body: string; etag: string; at: number }>();\n catalog.onChange(() => pages.clear());\n\n const writePage = (\n req: Request,\n res: Response,\n page: { body: string; etag: string },\n ) => {\n res.setHeader(\"ETag\", page.etag);\n if (etagMatches(req.headers[\"if-none-match\"], page.etag)) {\n res.status(304).end();\n return;\n }\n res.type(\"application/json\").send(page.body);\n };\n\n // True when a cached page answered the request\n const sendCachedPage = (req: Request, res: Response): boolean => {\n const cached = pages.get(req.originalUrl);\n if (!cached || Date.now() - cached.at > PAGE_CACHE_TTL_MS) return false;\n writePage(req, res, cached);\n return true;\n };\n\n // Pages are small: hashing each lets NGINX and clients revalidate with 304\n const sendPage = (req: Request, res: Response, page: object) => {\n const body = JSON.stringify(page);\n const etag = `\"${crypto.createHash(\"sha1\").update(body).digest(\"base64url\")}\"`;\n pages.delete(req.originalUrl);\n pages.set(req.originalUrl, { body, etag, at: Date.now() });\n if (pages.size > PAGE_CACHE_MAX) pages.delete(pages.keys().next().value!);\n writePage(req, res, { body, etag });\n };\n\n // One page of packages; the README lists the parameters\n router.get(\n \"/packages\",\n route(async (req, res) => {\n if (sendCachedPage(req, res)) return;\n const { limit, offset } = pageParams(req);\n const names = queryList(req.query.name);\n const [result, facets] = await Promise.all([\n catalog.searchPackages(\n {\n search: queryString(req.query.search),\n names,\n categories: queryList(req.query.category),\n publishers: queryList(req.query.publisher),\n moduleTypes: queryList(req.query.moduleType).filter((t) =>\n (PACKAGE_MODULE_TYPES as readonly string[]).includes(t),\n ),\n documentType: queryString(req.query.documentType),\n limit,\n offset,\n },\n { owners: req.query.detail === \"full\" },\n ),\n req.query.facets === \"true\" ? catalog.packageFacets(names) : undefined,\n ]);\n sendPage(req, res, {\n items:\n req.query.detail === \"full\"\n ? result.items\n : result.items.map(toPackageListItem),\n total: result.total,\n limit,\n offset,\n hasMore: offset + limit < result.total,\n ...(facets ? { facets } : {}),\n });\n }),\n );\n\n // Names of the packages that define a document model\n router.get(\n \"/packages/by-document-type\",\n route(async (req, res) => {\n const documentType = req.query.type;\n if (typeof documentType !== \"string\" || !documentType) {\n res\n .status(400)\n .json({ error: \"Missing required query parameter: type\" });\n return;\n }\n res.json(await catalog.packagesWithDocumentType(documentType));\n }),\n );\n\n // Single package info\n router.get(\n PACKAGE_ROUTE,\n route(async (req, res) => {\n const { name, tag } = parsePackageSpec(wildcard(req));\n const resolution = await resolvePackageVersion(catalog, name, tag);\n if (resolution.kind === \"upstream-error\") {\n res.status(503).send(\"Upstream registry unavailable\");\n return;\n }\n if (resolution.kind === \"not-found\") {\n res.status(404).send(\"Package not found\");\n return;\n }\n const result = await ensure(catalog, name, resolution.version);\n if (sendNotReady(res, result)) return;\n if (result.kind !== \"ready\" || !result.row.manifest) {\n res.status(404).send(\"Package not found\");\n return;\n }\n const row = await catalog.packageRow(name);\n const pkg = toPackageInfo(\n name,\n result.row.manifest,\n result.row.packageJsonVersion,\n { distTags: row?.distTags, versions: row?.versions },\n );\n res.json(await withOwners(pkg, name));\n }),\n );\n\n // A page of the piece catalog, its items shaped like cloud.activepieces.com's\n router.get(\n \"/pieces\",\n route(async (req, res) => {\n if (sendCachedPage(req, res)) return;\n const { limit, offset } = pageParams(req);\n const { rows, total } = await catalog.searchPieces({\n search: queryString(req.query.search),\n limit,\n offset,\n });\n sendPage(req, res, {\n items: pieceCatalog(\n rows,\n req.query.suggestionType === \"ACTION_AND_TRIGGER\",\n ),\n total,\n limit,\n offset,\n hasMore: offset + limit < total,\n });\n }),\n );\n\n // A version of a piece, processing its package version when no worker has\n const pieceAt = async (name: string, version: string) => {\n const found = await catalog.pieceVersion(name, version);\n if (found) return found;\n const owner = await catalog.pieceOwner(name);\n if (!owner) return null;\n const result = await ensure(catalog, owner, version);\n return result.kind === \"ready\" ? catalog.pieceVersion(name, version) : null;\n };\n\n // A scoped piece name carries a slash. Serves `<name>`,\n // `<name>?version=<v>` and `<name>/versions`.\n router.get(\n PIECE_ROUTE,\n route(async (req, res) => {\n const raw = wildcard(req);\n const versionsOf = versionsRouteName(raw);\n if (versionsOf) {\n const versions = await catalog.pieceVersions(versionsOf);\n if (versions.length === 0) {\n res.status(404).json({ error: `Piece not found: ${versionsOf}` });\n return;\n }\n res.json(versions.map(versionSummary));\n return;\n }\n\n const name = raw;\n const version =\n typeof req.query.version === \"string\" ? req.query.version : undefined;\n if (version === undefined) {\n const latest = await catalog.pieceLatest(name);\n const detail = latest ? pieceDetail(latest, originOf(req)) : null;\n if (!detail) {\n res.status(404).json({ error: `Piece not found: ${name}` });\n return;\n }\n res.json(detail);\n return;\n }\n\n if (!(await catalog.pieceOwner(name))) {\n res.status(404).json({ error: `Piece not found: ${name}` });\n return;\n }\n const found = isExactVersion(version)\n ? await pieceAt(name, version)\n : null;\n if (!found) {\n const available = await catalog.pieceVersions(name);\n res.status(404).json({\n error: `Piece version not found: ${name}@${version}`,\n available: available.map((row) => row.version),\n });\n return;\n }\n const detail = pieceDetail(found, originOf(req));\n if (!detail) {\n res.status(404).json({ error: `Piece not found: ${name}@${version}` });\n return;\n }\n res.json(detail);\n }),\n );\n\n // The piece directory as an npm-shaped tarball, the one thing a reactor's\n // piece worker downloads. Named as cdn.activepieces.com names its own.\n router.get(\n BUNDLE_ROUTE,\n route(async (req, res) => {\n const params = req.params as Record<string, string>;\n const [name, version] = [params[0], params[1]];\n const row = isExactVersion(version) ? await pieceAt(name, version) : null;\n if (!row?.bundleKey) {\n res\n .status(404)\n .json({ error: `Piece bundle not found: ${name}@${version}` });\n return;\n }\n // The path carries the package version the bundle was cut from, so its\n // bytes never change.\n res.setHeader(\"Cache-Control\", \"public, max-age=31536000, immutable\");\n const etag = `\"${row.package}-${name}@${version}\"`;\n res.setHeader(\"ETag\", etag);\n if (etagMatches(req.headers[\"if-none-match\"], etag)) {\n res.status(304).end();\n return;\n }\n res.setHeader(\"Content-Type\", \"application/gzip\");\n const key = bundleKey(row.package, row.version, row.bundleFile);\n if (!(await stream(res, artifacts, key))) {\n res\n .status(404)\n .json({ error: `Piece bundle not found: ${name}@${version}` });\n }\n }),\n );\n\n // CDN file serving\n router.get(\n CDN_ROUTE,\n route(async (req, res) => {\n const fullPath = wildcard(req);\n\n // Scoped: @scope/pkg@1.0.0/file.js; unscoped: pkg@1.0.0/file.js\n const segments = fullPath.split(\"/\");\n const scoped = fullPath.startsWith(\"@\");\n if (scoped && segments.length < 2) {\n res.status(400).send(\"Invalid package path\");\n return;\n }\n const specLength = scoped ? 2 : 1;\n const packageSpec = segments.slice(0, specLength).join(\"/\");\n const filePath = segments.slice(specLength).join(\"/\") || \"index.js\";\n\n const { name: packageName, tag } = parsePackageSpec(packageSpec);\n const pinned = isExactVersion(tag);\n // A pinned file never changes: revalidate without the database or S3\n const pinnedEtag = pinned && tag ? cdnEtag(tag, filePath) : null;\n if (pinnedEtag && etagMatches(req.headers[\"if-none-match\"], pinnedEtag)) {\n res.setHeader(\"Cache-Control\", IMMUTABLE);\n res.setHeader(\"ETag\", pinnedEtag);\n res.status(304).end();\n return;\n }\n const resolution = await resolvePackageVersion(catalog, packageName, tag);\n if (resolution.kind === \"upstream-error\") {\n res.status(503).send(\"Upstream registry unavailable\");\n return;\n }\n if (resolution.kind === \"not-found\") {\n res.status(404).send(\"File not found\");\n return;\n }\n const version = resolution.version;\n const result = await ensure(catalog, packageName, version);\n if (sendNotReady(res, result)) return;\n const file =\n result.kind === \"ready\" ? resolveFile(result.row, filePath) : null;\n if (!file) {\n res.status(404).send(\"File not found\");\n return;\n }\n\n // Pinned requests are immutable; dist-tag and untagged ones revalidate\n res.setHeader(\n \"Cache-Control\",\n pinned ? IMMUTABLE : \"public, max-age=60, must-revalidate\",\n );\n const etag = cdnEtag(version, filePath);\n res.setHeader(\"ETag\", etag);\n if (etagMatches(req.headers[\"if-none-match\"], etag)) {\n res.status(304).end();\n return;\n }\n\n res.setHeader(\"Content-Type\", contentTypeOf(filePath));\n const key = filesKey(packageName, version, file);\n if (!(await stream(res, artifacts, key))) {\n res.status(404).send(\"File not found\");\n }\n }),\n );\n\n return router;\n}\n\n// DELETE /<pkg>/-rev/<rev> removes the package; DELETE\n// /<pkg>/-/<short-name>-<version>.tgz/-rev/<rev> removes one version\nexport function parseUnpublishRequest(\n reqPath: string,\n): { packageName: string; version: string | null } | null {\n const revIdx = reqPath.indexOf(\"/-rev/\");\n if (revIdx <= 0) return null;\n const beforeRev = reqPath.slice(1, revIdx); // strip leading slash\n\n const tarballMarker = \"/-/\";\n const tarballIdx = beforeRev.indexOf(tarballMarker);\n if (tarballIdx === -1) {\n // Full package: beforeRev is the package name (possibly URL-encoded scope)\n const packageName = decodeURIComponent(beforeRev);\n return { packageName, version: null };\n }\n\n const packageName = decodeURIComponent(beforeRev.slice(0, tarballIdx));\n const tarballName = beforeRev.slice(tarballIdx + tarballMarker.length);\n if (!tarballName.endsWith(\".tgz\")) return null;\n const shortName = packageName.startsWith(\"@\")\n ? packageName.split(\"/\")[1]\n : packageName;\n const prefix = `${shortName}-`;\n if (!tarballName.startsWith(prefix)) return null;\n const version = tarballName.slice(prefix.length, -\".tgz\".length);\n if (!version) return null;\n return { packageName, version };\n}\n\n// PUT /<pkg>/-rev/<rev> is npm's manifest rewrite (single-version unpublish,\n// deprecate). Exclude the tarball-DELETE shape, which also carries /-rev/.\nexport function parseManifestRewrite(\n reqPath: string,\n): { packageName: string } | null {\n const revIdx = reqPath.indexOf(\"/-rev/\");\n if (revIdx <= 0) return null;\n const beforeRev = reqPath.slice(1, revIdx);\n if (beforeRev.includes(\"/-/\")) return null;\n return { packageName: decodeURIComponent(beforeRev) };\n}\n\n// PUT or DELETE /-/package/<pkg>/dist-tags/<tag>\nfunction parseDistTagChange(reqPath: string): { packageName: string } | null {\n const match = /^\\/-\\/package\\/(.+)\\/dist-tags(?:\\/[^/]+)?$/.exec(reqPath);\n return match ? { packageName: decodeURIComponent(match[1]) } : null;\n}\n\n// Runs `record` once verdaccio answers 2xx, holding the response until the\n// record commits so a client never sees success before the job exists\nfunction afterSuccess(res: Response, record: () => Promise<void>): void {\n const originalEnd = res.end.bind(res) as (...args: unknown[]) => Response;\n res.end = function (this: Response, ...args: unknown[]) {\n if (res.statusCode < 200 || res.statusCode >= 300) {\n return originalEnd(...args);\n }\n record()\n .catch((err: unknown) => {\n console.error(\"[registry] recording a change failed:\", err);\n })\n .finally(() => originalEnd(...args));\n return this;\n } as Response[\"end\"];\n}\n\nasync function queueSync(\n db: Database,\n packageName: string,\n payload: Record<string, unknown>,\n): Promise<void> {\n await enqueue(db, \"sync\", packageName, \"\", payload);\n await wakeWorkers(db);\n}\n\n// Retires the versions the storage plugin's index no longer lists, before the\n// reply, so an immediate republish is refused; the worker covers setups without it\nasync function recordUnpublished(\n db: Database,\n packageName: string,\n): Promise<void> {\n const index = await db.query<{ exists: boolean }>(\n \"SELECT to_regclass('verdaccio_manifests') IS NOT NULL AS exists\",\n );\n if (!index.rows[0]?.exists) return;\n await db.query(\n `INSERT INTO registry_unpublished (package, version)\n SELECT r.package, r.version\n FROM registry_versions r\n LEFT JOIN verdaccio_manifests m ON m.name = r.package\n WHERE r.package = $1 AND (m.name IS NULL OR NOT m.versions ? r.version)\n ON CONFLICT DO NOTHING`,\n [packageName],\n );\n}\n\n// Versions of a publish that were unpublished before; npm never reuses one\nasync function retiredVersions(\n db: Database,\n packageName: string,\n body: unknown,\n): Promise<string[]> {\n const versions = Object.keys(\n (body as { versions?: Record<string, unknown> } | undefined)?.versions ??\n {},\n );\n if (versions.length === 0) return [];\n const rows = await db.query<{ version: string }>(\n `SELECT version FROM registry_unpublished\n WHERE package = $1 AND version = ANY($2)`,\n [packageName, versions],\n );\n return rows.rows.map((row) => row.version);\n}\n\n/** Queues a sync after unpublishes, manifest rewrites and dist-tag changes. */\nexport function createUnpublishHook(\n _config: RegistryConfig,\n services: RegistryServices,\n) {\n return (req: Request, res: Response, next: NextFunction) => {\n const distTag =\n req.method === \"PUT\" || req.method === \"DELETE\"\n ? parseDistTagChange(req.path)\n : null;\n if (distTag) {\n afterSuccess(res, () => queueSync(services.db, distTag.packageName, {}));\n next();\n return;\n }\n const target =\n req.method === \"PUT\"\n ? parseManifestRewrite(req.path)\n : req.method === \"DELETE\"\n ? parseUnpublishRequest(req.path)\n : null;\n if (target) {\n afterSuccess(res, async () => {\n await recordUnpublished(services.db, target.packageName);\n await queueSync(services.db, target.packageName, {\n notify: true,\n publishedBy: publisherFromRequest(req),\n });\n });\n }\n next();\n };\n}\n\n// The tarball a publish payload carries, if it carries one: npm sends a single\n// `_attachments` entry holding the base64 of the version being published.\nfunction publishedTarball(body: unknown): Buffer | null {\n if (body === null || typeof body !== \"object\") return null;\n const attachments = (body as { _attachments?: Record<string, unknown> })\n ._attachments;\n if (!attachments || typeof attachments !== \"object\") return null;\n for (const [name, attachment] of Object.entries(attachments)) {\n if (!name.endsWith(\".tgz\")) continue;\n const data = (attachment as { data?: unknown }).data;\n if (typeof data === \"string\") return Buffer.from(data, \"base64\");\n }\n return null;\n}\n\n// A piece name is one package's for good: two packages claiming it would make\n// a step's piece ambiguous. `@activepieces/` names are never a package's.\nasync function pieceClaimConflict(\n catalog: Catalog,\n packageName: string,\n body: unknown,\n): Promise<string | null> {\n const tarball = publishedTarball(body);\n if (!tarball) return null;\n const names = await pieceNamesInTarball(tarball);\n if (names.length === 0) return null;\n const reserved = names.filter((name) =>\n name.startsWith(RESERVED_PIECE_SCOPE),\n );\n if (reserved.length > 0) {\n return `Piece names in the ${RESERVED_PIECE_SCOPE} scope belong to Activepieces; ${packageName} cannot claim ${reserved.map((n) => `\"${n}\"`).join(\", \")}. Rename the piece into your own scope.`;\n }\n for (const name of names) {\n const owner = await catalog.pieceOwner(name);\n if (owner && owner !== packageName) {\n return `Piece \"${name}\" is already published by ${owner}; ${packageName} cannot claim it.`;\n }\n }\n return null;\n}\n\n// The version and its processing job, committed together\nasync function recordPublish(\n db: Database,\n packageName: string,\n version: string,\n publishedBy: PublisherIdentity | undefined,\n): Promise<void> {\n await db.transaction(async (tx) => {\n await tx.query(\n `INSERT INTO registry_packages (name, local) VALUES ($1, true)\n ON CONFLICT (name) DO UPDATE SET local = true`,\n [packageName],\n );\n await tx.query(\n `INSERT INTO registry_versions (package, version, status)\n VALUES ($1, $2, 'pending')\n ON CONFLICT (package, version) DO UPDATE SET status = 'pending', error = NULL\n WHERE registry_versions.status = 'failed'`,\n [packageName, version],\n );\n await enqueue(tx, \"process\", packageName, version, {\n local: true,\n notify: true,\n ...(publishedBy ? { publishedBy } : {}),\n });\n });\n await wakeWorkers(db);\n}\n\nexport function createPublishHook(\n config: RegistryConfig,\n services: RegistryServices,\n) {\n // Publish bodies are read here, ahead of verdaccio: body-parser marks the\n // request parsed, so verdaccio reuses this one instead of a spent stream.\n const parseBody = express.json({\n strict: false,\n limit: config.maxBodySize ?? \"300mb\",\n });\n\n const recordOnSuccess = (\n req: Request,\n res: Response,\n packageName: string,\n ) => {\n const versions = Object.keys(\n (req.body as { versions?: Record<string, unknown> } | undefined)\n ?.versions ?? {},\n );\n const version = versions.at(0);\n if (!version) return;\n if (versions.length > 1) {\n console.warn(\n `[registry] Multiple versions published for ${packageName}: ${JSON.stringify(versions)}`,\n );\n }\n const publishedBy = publisherFromRequest(req);\n afterSuccess(res, () =>\n recordPublish(services.db, packageName, version, publishedBy),\n );\n };\n\n return (req: Request, res: Response, next: NextFunction) => {\n // Only npm publish endpoints: a PUT to `/<pkg>/-rev/<rev>` is the\n // manifest rewrite of a single-version unpublish, not a new publish.\n if (req.method !== \"PUT\" || req.path.includes(\"/-rev/\")) {\n next();\n return;\n }\n const urlPath = req.path.replace(/^\\//, \"\");\n if (!urlPath || urlPath.startsWith(\"-\")) {\n next();\n return;\n }\n const packageName = decodeURIComponent(urlPath);\n\n parseBody(req, res, (parseError?: unknown) => {\n // A body verdaccio will reject anyway: let it own the error message.\n if (parseError) {\n next();\n return;\n }\n void retiredVersions(services.db, packageName, req.body)\n .then(async (retired) =>\n retired.length > 0\n ? `${packageName}@${retired.join(\", \")} was unpublished and cannot be published again. Publish a new version.`\n : pieceClaimConflict(services.catalog, packageName, req.body),\n )\n .then((conflict) => {\n if (conflict) {\n res.status(409).json({ error: conflict });\n return;\n }\n recordOnSuccess(req, res, packageName);\n next();\n })\n .catch((err: unknown) => {\n console.error(\"[registry] publish checks failed:\", err);\n recordOnSuccess(req, res, packageName);\n next();\n });\n });\n };\n}\n","import type { Response } from \"express\";\nimport type {\n NotificationChannel,\n PublishEvent,\n UnpublishEvent,\n} from \"./types.js\";\n\n// Proxies drop connections idle for a minute or so; a comment keeps them open\nconst HEARTBEAT_MS = 25_000;\n// A client this far behind is dropped rather than buffered without bound\nconst MAX_BUFFERED_BYTES = 1024 * 1024;\n\nexport class SSEChannel implements NotificationChannel {\n #clients = new Set<Response>();\n #heartbeat: ReturnType<typeof setInterval> | undefined;\n\n addClient(res: Response): void {\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"Access-Control-Allow-Origin\": \"*\",\n // NGINX would otherwise buffer the stream\n \"X-Accel-Buffering\": \"no\",\n });\n res.write(\"event: connected\\ndata: {}\\n\\n\");\n\n this.#clients.add(res);\n this.#heartbeat ??= setInterval(\n () => this.#send(\": ping\\n\\n\"),\n HEARTBEAT_MS,\n );\n this.#heartbeat.unref();\n res.on(\"close\", () => {\n this.#clients.delete(res);\n if (this.#clients.size === 0) {\n clearInterval(this.#heartbeat);\n this.#heartbeat = undefined;\n }\n });\n }\n\n notifyPublish(event: PublishEvent): void {\n this.#broadcast(\"publish\", event);\n }\n\n notifyUnpublish(event: UnpublishEvent): void {\n this.#broadcast(\"unpublish\", event);\n }\n\n #broadcast(eventName: string, event: PublishEvent | UnpublishEvent): void {\n this.#send(`event: ${eventName}\\ndata: ${JSON.stringify(event)}\\n\\n`);\n }\n\n #send(payload: string): void {\n for (const client of this.#clients) {\n if (client.writableLength > MAX_BUFFERED_BYTES) {\n client.destroy();\n this.#clients.delete(client);\n continue;\n }\n try {\n client.write(payload);\n } catch (err) {\n console.error(\"[registry] SSE client write failed:\", err);\n this.#clients.delete(client);\n }\n }\n }\n}\n","import type { Database } from \"../db/database.js\";\nimport type { WebhookConfig } from \"../types.js\";\nimport type { PublishEvent, UnpublishEvent } from \"./types.js\";\n\n// Webhooks registered through the API live in the database, shared by every\n// replica; the ones from configuration are added to them.\nexport class WebhookStore {\n #db: Database;\n #predefined: WebhookConfig[];\n\n constructor(db: Database, predefined: WebhookConfig[] = []) {\n this.#db = db;\n this.#predefined = predefined;\n }\n\n async getWebhooks(): Promise<WebhookConfig[]> {\n const rows = await this.#db.query<{\n endpoint: string;\n headers: Record<string, string>;\n }>(\"SELECT endpoint, headers FROM registry_webhooks ORDER BY created_at\");\n const stored = rows.rows.map((row) => ({\n endpoint: row.endpoint,\n ...(Object.keys(row.headers).length > 0 ? { headers: row.headers } : {}),\n }));\n return [\n ...this.#predefined,\n ...stored.filter(\n (w) => !this.#predefined.some((p) => p.endpoint === w.endpoint),\n ),\n ];\n }\n\n async addWebhook(webhook: WebhookConfig): Promise<void> {\n if (this.#predefined.some((w) => w.endpoint === webhook.endpoint)) return;\n await this.#db.query(\n `INSERT INTO registry_webhooks (endpoint, headers) VALUES ($1, $2)\n ON CONFLICT (endpoint) DO NOTHING`,\n [webhook.endpoint, JSON.stringify(webhook.headers ?? {})],\n );\n }\n\n async removeWebhook(endpoint: string): Promise<boolean> {\n const result = await this.#db.query<{ endpoint: string }>(\n \"DELETE FROM registry_webhooks WHERE endpoint = $1 RETURNING endpoint\",\n [endpoint],\n );\n return result.rows.length > 0;\n }\n\n async notifyPublish(event: PublishEvent): Promise<void> {\n await this.#post({ type: \"publish\", ...event });\n }\n\n async notifyUnpublish(event: UnpublishEvent): Promise<void> {\n await this.#post({ type: \"unpublish\", ...event });\n }\n\n async #post(body: Record<string, unknown>): Promise<void> {\n const webhooks = await this.getWebhooks();\n await Promise.all(\n webhooks.map((webhook) =>\n fetch(webhook.endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...webhook.headers },\n body: JSON.stringify(body),\n }).catch((err: unknown) => {\n console.error(\n `[registry] Webhook to ${webhook.endpoint} failed:`,\n err,\n );\n }),\n ),\n );\n }\n}\n","import type { NextFunction, Request, Response } from \"express\";\n\nconst TARBALL_PATH = /\\/-\\/[^/]+\\.tgz$/;\n\n// @verdaccio/local-storage before 14.0.0-next-9.33 emits a tarball's size after\n// piping starts; setting content-length then throws and kills the process\nexport function ignoreLateContentLength(\n req: Request,\n res: Response,\n next: NextFunction,\n): void {\n if (TARBALL_PATH.test(req.path)) {\n const setHeader = res.setHeader.bind(res);\n res.setHeader = (name, value) =>\n res.headersSent && name.toLowerCase() === \"content-length\"\n ? res\n : setHeader(name, value);\n }\n next();\n}\n","import { API_ERROR, errorUtils } from \"@verdaccio/core\";\nimport { readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\n// Most names each uplink remembers a 404 for\nexport const UPLINK_MISS_CACHE_LIMIT = 10_000;\n\nconst WRAPPED = Symbol.for(\"powerhouse.registry.uplinkMissCache\");\n\ntype GetRemoteMetadata = ((\n name: string,\n options: unknown,\n) => Promise<unknown>) & { [WRAPPED]?: true };\n\nexport interface ProxyStorageLike {\n maxage: number;\n getRemoteMetadata: GetRemoteMetadata;\n}\n\ninterface ProxyModule {\n ProxyStorage?: { prototype: ProxyStorageLike };\n}\n\ninterface PackageJson {\n name?: string;\n main?: string;\n exports?: Record<string, { import?: { default?: string } } | string>;\n}\n\n// Root of `pkg` as Node resolves it from `fromDir`\nfunction packageDir(fromDir: string, pkg: string): string {\n const entry = createRequire(path.join(fromDir, \"noop.js\")).resolve(pkg);\n let dir = path.dirname(entry);\n while (dir !== path.dirname(dir)) {\n try {\n const file = path.join(dir, \"package.json\");\n const json = JSON.parse(readFileSync(file, \"utf8\")) as PackageJson;\n if (json.name === pkg) return dir;\n } catch {\n // No package.json at this level\n }\n dir = path.dirname(dir);\n }\n throw new Error(`[registry] cannot locate ${pkg} from ${fromDir}`);\n}\n\nfunction entries(dir: string): { esm: string; cjs: string } {\n const json = JSON.parse(\n readFileSync(path.join(dir, \"package.json\"), \"utf8\"),\n ) as PackageJson;\n const root = json.exports?.[\".\"];\n const esm = typeof root === \"object\" ? root.import?.default : undefined;\n if (!esm || !json.main) {\n throw new Error(`[registry] unexpected package layout in ${dir}`);\n }\n return { esm: path.join(dir, esm), cjs: path.join(dir, json.main) };\n}\n\nconst isUplinkNotFound = (err: unknown) =>\n (err as { message?: string } | null)?.message ===\n API_ERROR.NOT_PACKAGE_UPLINK;\n\nexport function wrapGetRemoteMetadata(proto: ProxyStorageLike, limit: number) {\n const original = proto.getRemoteMetadata;\n if (typeof original !== \"function\") {\n throw new Error(\n \"[registry] @verdaccio/proxy ProxyStorage has no getRemoteMetadata; the uplink 404 cache needs updating\",\n );\n }\n if (original[WRAPPED]) return;\n const misses = new WeakMap<ProxyStorageLike, Map<string, number>>();\n\n const wrapped: GetRemoteMetadata = async function (\n this: ProxyStorageLike,\n name,\n options,\n ) {\n let seen = misses.get(this);\n if (!seen) misses.set(this, (seen = new Map<string, number>()));\n const at = seen.get(name);\n if (at !== undefined) {\n seen.delete(name);\n if (Date.now() - at < this.maxage) {\n // Re-insert so recently asked names sit at the LRU tail\n seen.set(name, at);\n throw errorUtils.getNotFound(API_ERROR.NOT_PACKAGE_UPLINK);\n }\n }\n try {\n return await original.call(this, name, options);\n } catch (err) {\n if (isUplinkNotFound(err)) {\n seen.set(name, Date.now());\n if (seen.size > limit) seen.delete(seen.keys().next().value!);\n }\n throw err;\n }\n };\n wrapped[WRAPPED] = true;\n proto.getRemoteMetadata = wrapped;\n}\n\n// Makes each Verdaccio uplink remember a 404 for `maxage`, as it does a hit;\n// Verdaccio records `_uplinks.fetched` only when the uplink answers.\nexport async function installUplinkMissCache(\n limit = UPLINK_MISS_CACHE_LIMIT,\n): Promise<void> {\n // Follow Verdaccio's own resolution so the patched class is the one it loads\n const verdaccio = packageDir(import.meta.dirname, \"verdaccio\");\n const store = packageDir(verdaccio, \"@verdaccio/store\");\n const proxy = entries(packageDir(store, \"@verdaccio/proxy\"));\n\n const esm = (await import(pathToFileURL(proxy.esm).href)) as ProxyModule;\n const cjs = createRequire(proxy.cjs)(proxy.cjs) as ProxyModule;\n for (const mod of [esm, cjs]) {\n if (!mod.ProxyStorage) {\n throw new Error(\n \"[registry] @verdaccio/proxy no longer exports ProxyStorage\",\n );\n }\n wrapGetRemoteMetadata(mod.ProxyStorage.prototype, limit);\n }\n}\n","import path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { AuthStore } from \"./auth/auth-store.js\";\nimport { stashAuthStore } from \"./auth/store-handoff.js\";\nimport type { RegistryConfig } from \"./types.js\";\n\n// Bundled into dist/plugins, where Verdaccio loads it by this name\nexport const S3_STORAGE_PLUGIN = \"@powerhousedao/verdaccio-s3-storage\";\n\nexport function buildVerdaccioConfig(config: RegistryConfig) {\n const htpasswdPath = path.join(config.storagePath, \"htpasswd\");\n\n const uplinkUrl = config.uplink ?? \"https://registry.npmjs.org/\";\n\n // With a database configured, use the Postgres-backed auth plugin\n // (persistent accounts + npm-style package ownership). Verdaccio loads it\n // via require() from the dist/plugins dir. Without a DB (local dev / tests),\n // keep the built-in htpasswd path.\n const usePgAuth = Boolean(config.databaseUrl || config.authStore);\n // Prefer a runtime-provided token (so the launcher owns it for load\n // detection); otherwise stash the injected store here (direct callers/tests).\n const storeToken =\n config.authStoreToken ??\n (config.authStore\n ? stashAuthStore(config.authStore as AuthStore)\n : undefined);\n const pluginsDir =\n config.pluginsDir ??\n path.join(path.dirname(fileURLToPath(import.meta.url)), \"plugins\");\n const auth = usePgAuth\n ? {\n \"registry-auth\": {\n ...(config.databaseUrl ? { databaseUrl: config.databaseUrl } : {}),\n ...(storeToken ? { storeToken } : {}),\n ...(config.renown\n ? {\n publicUrl: config.renown.publicUrl,\n ...(config.renown.renownUrl\n ? { renownUrl: config.renown.renownUrl }\n : {}),\n }\n : {}),\n },\n }\n : { htpasswd: { file: htpasswdPath } };\n\n // The S3 store keeps Verdaccio's package list, tokens and secret in Postgres\n if (config.s3 && !config.databaseUrl) {\n throw new Error(\"S3 storage requires a database URL (--database-url)\");\n }\n const loadsPlugins = usePgAuth || Boolean(config.s3);\n\n const base: Record<string, unknown> = {\n storage: config.storagePath,\n // Verdaccio 7 reads configPath from self_path; every path here is absolute\n self_path: path.join(config.storagePath, \"config.yaml\"),\n configPath: path.join(config.storagePath, \"config.yaml\"),\n // Force JWT mode for the npm API. Without this verdaccio falls back to\n // its legacy aes-encrypted token format, which signPayload won't produce.\n security: {\n api: {\n jwt: {\n sign: { expiresIn: \"90d\" },\n verify: {},\n },\n },\n },\n auth,\n ...(loadsPlugins ? { plugins: pluginsDir } : {}),\n uplinks: {\n npmjs: {\n url: uplinkUrl,\n // Defaults to verdaccio's own default of 2m. The previous 15m\n // hardcoded value made publish-to-install dev loops painful —\n // when a newly-published version landed on npmjs, our registry\n // kept handing out the pre-publish packument for up to 15min.\n // Operators that want heavier upstream caching for production\n // can opt in via --uplink-maxage / PH_REGISTRY_UPLINK_MAXAGE.\n maxage: config.uplinkMaxage ?? \"2m\",\n timeout: \"30s\",\n cache: true,\n },\n },\n // Verdaccio matches packages config top-to-bottom (first match wins),\n // so local-only globs must come first. We also skip emitting the\n // default proxied entries when a glob with the same key is in the\n // local-only list — otherwise the value would be overwritten but the\n // iteration position would still be the default's earlier slot.\n packages: (() => {\n const local = config.localPackagePatterns ?? [];\n const localSet = new Set(local);\n const access = {\n access: \"$all\",\n publish: \"$authenticated\",\n unpublish: \"$authenticated\",\n };\n const entries: [string, Record<string, unknown>][] = [];\n // Locals first — no proxy means verdaccio resolves them from local\n // storage only, so re-publishing a version that exists on npmjs\n // doesn't 409.\n for (const pattern of local) {\n entries.push([pattern, { ...access }]);\n }\n // Defaults follow, skipping any glob the caller already overrode.\n if (!localSet.has(\"@powerhousedao/*\")) {\n entries.push([\"@powerhousedao/*\", { ...access, proxy: \"npmjs\" }]);\n }\n if (!localSet.has(\"**\")) {\n entries.push([\"**\", { ...access, proxy: \"npmjs\" }]);\n }\n return Object.fromEntries(entries);\n })(),\n web: {\n enable: config.webEnabled !== false,\n title: \"Powerhouse Registry\",\n logo: \"https://raw.githubusercontent.com/powerhouse-inc/powerhouse/main/packages/registry/static/logo.svg\",\n favicon: \"/-/static/favicon.ico\",\n primary_color: \"#38C780\",\n darkMode: true,\n },\n server: {\n keepAliveTimeout: 60,\n ...(config.trustProxy !== undefined && { trustProxy: config.trustProxy }),\n },\n log: {\n type: \"stdout\",\n format: \"pretty\",\n level: \"warn\",\n },\n max_body_size: config.maxBodySize ?? \"300mb\",\n };\n\n if (config.s3) {\n base.store = {\n [S3_STORAGE_PLUGIN]: {\n postgresUrl: config.databaseUrl,\n ...(config.storagePoolMax && {\n postgresPoolMax: config.storagePoolMax,\n }),\n ...(config.storageLockPoolMax && {\n postgresLockPoolMax: config.storageLockPoolMax,\n }),\n bucket: config.s3.bucket,\n endpoint: config.s3.endpoint,\n region: config.s3.region,\n s3ForcePathStyle: config.s3.s3ForcePathStyle ?? true,\n ...(config.s3.keyPrefix && { keyPrefix: config.s3.keyPrefix }),\n ...(config.s3.accessKeyId && { accessKeyId: config.s3.accessKeyId }),\n ...(config.s3.secretAccessKey && {\n secretAccessKey: config.s3.secretAccessKey,\n }),\n },\n };\n }\n\n return base;\n}\n","// Runs jobs from registry_jobs until stopped. Any number of workers, in any\n// number of processes, can share the queue.\nimport os from \"node:os\";\nimport { JOBS_CHANNEL } from \"./events.js\";\nimport type { Database, Queryable } from \"./db/database.js\";\nimport {\n BACKGROUND_PRIORITY,\n claim,\n complete,\n enqueue,\n MAX_ATTEMPTS,\n retry,\n wakeWorkers,\n type Job,\n} from \"./jobs.js\";\nimport { errorReason, type WorkerMetrics } from \"./metrics.js\";\nimport type { PublisherIdentity } from \"./notifications/types.js\";\nimport type { WebhookStore } from \"./notifications/webhook.js\";\nimport {\n failVersion,\n publishedHere,\n PermanentError,\n processVersion,\n syncPackage,\n type ProcessorContext,\n} from \"./processor.js\";\n\nconst IDLE_POLL_MS = 2_000;\n// Reconciling by revision is a join per package; comparing every version,\n// or fetching every package's metadata without the index, runs hourly\nconst RECONCILE_INTERVAL_MS = 60_000;\nconst SWEEP_INTERVAL_MS = 60 * 60_000;\n\nexport interface WorkerOptions {\n concurrency: number;\n webhooks?: WebhookStore;\n /** Whether this worker reconciles with Verdaccio's storage periodically */\n sweep?: boolean;\n metrics?: WorkerMetrics;\n}\n\n/** Queues a sync of every package published to this registry. */\nexport async function enqueueSweep(db: Database): Promise<number> {\n const verdaccio = await db.query<{ exists: boolean }>(\n \"SELECT to_regclass('verdaccio_packages') IS NOT NULL AS exists\",\n );\n const names = await db.query<{ name: string }>(\n `SELECT package_name AS name FROM registry_package_owners\n UNION SELECT name FROM registry_packages WHERE local\n ${verdaccio.rows[0]?.exists ? \"UNION SELECT name FROM verdaccio_packages\" : \"\"}`,\n );\n for (const { name } of names.rows) {\n await enqueue(db, \"sync\", name, \"\", { local: true }, BACKGROUND_PRIORITY);\n }\n if (names.rows.length > 0) await wakeWorkers(db);\n return names.rows.length;\n}\n\nasync function hasManifestIndex(db: Database): Promise<boolean> {\n const res = await db.query<{ exists: boolean }>(\n `SELECT to_regclass('verdaccio_manifests') IS NOT NULL\n AND to_regclass('verdaccio_packages') IS NOT NULL AS exists`,\n );\n return res.rows[0]?.exists === true;\n}\n\n// The index also holds packages cached from the uplink; only published ones are processed\nconst PUBLISHED =\n \"EXISTS (SELECT 1 FROM verdaccio_packages l WHERE l.name = m.name)\";\n\n// Local packages whose manifest index row is gone: unpublished\nconst UNPUBLISHED = `\n SELECT p.name FROM registry_packages p\n WHERE p.local AND p.updated_at < now() - interval '30 seconds'\n AND NOT EXISTS (SELECT 1 FROM verdaccio_manifests m WHERE m.name = p.name)`;\n\n// Per package: a revision no sync has applied yet\nconst QUICK_CHANGED = `\n SELECT m.name\n FROM verdaccio_manifests m\n LEFT JOIN registry_packages p ON p.name = m.name\n WHERE m.updated_at < now() - interval '30 seconds' AND ${PUBLISHED}\n AND (p.name IS NULL OR p.manifest_rev IS DISTINCT FROM m.rev)\n UNION ${UNPUBLISHED}\n LIMIT 1000`;\n\n// Versions left pending with no job to process them\nconst QUICK_MISSING = `\n SELECT r.package AS name, r.version\n FROM registry_versions r\n WHERE r.status = 'pending' AND r.updated_at < now() - interval '5 minutes'\n AND NOT EXISTS (SELECT 1 FROM registry_jobs j\n WHERE j.kind = 'process' AND j.package = r.package\n AND j.version = r.version)\n LIMIT 1000`;\n\n// Every tagged version of every manifest: no row, failed an hour ago, or pending\n// with no job for a while; untagged versions are processed when first requested\nconst FULL_MISSING = `\n SELECT DISTINCT m.name, v.version\n FROM verdaccio_manifests m\n CROSS JOIN LATERAL jsonb_each_text(m.dist_tags) AS v(tag, version)\n LEFT JOIN registry_versions r ON r.package = m.name AND r.version = v.version\n WHERE m.updated_at < now() - interval '30 seconds' AND ${PUBLISHED}\n AND (r.package IS NULL\n OR (r.status = 'failed' AND NOT r.permanent\n AND r.updated_at < now() - interval '1 hour'\n AND NOT EXISTS (SELECT 1 FROM registry_jobs j\n WHERE j.kind = 'process' AND j.package = m.name\n AND j.version = v.version))\n OR (r.status = 'pending' AND r.updated_at < now() - interval '5 minutes'\n AND NOT EXISTS (SELECT 1 FROM registry_jobs j\n WHERE j.kind = 'process' AND j.package = m.name\n AND j.version = v.version)))\n LIMIT 1000`;\n\n// Packages whose tags or versions moved, whatever their revision says\nconst FULL_CHANGED = `\n SELECT m.name\n FROM verdaccio_manifests m\n LEFT JOIN registry_packages p ON p.name = m.name\n WHERE m.updated_at < now() - interval '30 seconds' AND ${PUBLISHED}\n AND (p.name IS NULL OR NOT p.local OR p.dist_tags <> m.dist_tags\n OR EXISTS (SELECT 1 FROM registry_versions r\n WHERE r.package = m.name AND NOT m.versions ? r.version))\n UNION ${UNPUBLISHED}\n LIMIT 1000`;\n\n// Queues what differs from the storage plugin's manifest index, by revision or,\n// with `full`, by every version; null when there is no index to compare with\nexport async function reconcile(\n db: Database,\n options: { full?: boolean } = {},\n): Promise<number | null> {\n if (!(await hasManifestIndex(db))) return null;\n const missing = await db.query<{ name: string; version: string }>(\n options.full ? FULL_MISSING : QUICK_MISSING,\n );\n const changed = await db.query<{ name: string }>(\n options.full ? FULL_CHANGED : QUICK_CHANGED,\n );\n for (const { name, version } of missing.rows) {\n await enqueue(\n db,\n \"process\",\n name,\n version,\n { local: true },\n BACKGROUND_PRIORITY,\n );\n }\n for (const { name } of changed.rows) {\n await enqueue(db, \"sync\", name, \"\", { local: true }, BACKGROUND_PRIORITY);\n }\n const queued = missing.rows.length + changed.rows.length;\n if (queued > 0) await wakeWorkers(db);\n return queued;\n}\n\n// Drops names an earlier import took from the uplink cache, with their queued and\n// processed rows; one with an owner or a listing was published here and stays\nexport async function pruneCachedPackages(\n q: Queryable,\n published: string[],\n): Promise<string[]> {\n const migrated = await q.query<{ exists: boolean }>(\n \"SELECT to_regclass('registry_jobs') IS NOT NULL AS exists\",\n );\n if (!migrated.rows[0]?.exists) return [];\n const res = await q.query<{ name: string }>(\n `DELETE FROM verdaccio_packages p\n WHERE p.name <> ALL($1::text[])\n AND NOT EXISTS (SELECT 1 FROM registry_package_owners o\n WHERE o.package_name = p.name)\n AND NOT EXISTS (SELECT 1 FROM registry_packages r\n WHERE r.name = p.name AND r.listed_manifest IS NOT NULL)\n RETURNING p.name`,\n [published],\n );\n const pruned = res.rows.map((row) => row.name);\n if (pruned.length) {\n await q.query(\n \"DELETE FROM registry_jobs WHERE package = ANY($1) AND locked_by IS NULL\",\n [pruned],\n );\n await q.query(\"DELETE FROM registry_versions WHERE package = ANY($1)\", [\n pruned,\n ]);\n await q.query(\"DELETE FROM registry_packages WHERE name = ANY($1)\", [\n pruned,\n ]);\n }\n return pruned;\n}\n\nexport interface RunningWorker {\n stop(): Promise<void>;\n}\n\nfunction publisherOf(job: Job): PublisherIdentity | undefined {\n const by = job.payload.publishedBy as PublisherIdentity | undefined;\n return by?.address ? by : undefined;\n}\n\nasync function runJob(\n ctx: ProcessorContext,\n job: Job,\n options: WorkerOptions,\n): Promise<void> {\n const finish = (tx: Parameters<typeof complete>[0]) => complete(tx, job);\n // Backfill is for packages published here; the uplink cache is processed on request\n if (\n job.priority === BACKGROUND_PRIORITY &&\n (await publishedHere(ctx.db, job.package)) === false\n ) {\n await ctx.db.transaction(async (tx) => {\n // Not listed either, or the unpublished check would queue it every pass\n await tx.query(\n \"UPDATE registry_packages SET local = false WHERE name = $1 AND local\",\n [job.package],\n );\n await finish(tx);\n });\n return;\n }\n if (job.kind === \"process\") {\n const processed = await processVersion(ctx, job, finish);\n if (processed && job.payload.notify === true) {\n await options.webhooks?.notifyPublish({\n packageName: job.package,\n version: job.version,\n publishedBy: publisherOf(job),\n });\n }\n return;\n }\n const removed = await syncPackage(ctx, job, finish);\n if (job.payload.notify !== true || !options.webhooks) return;\n if (removed === null) {\n await options.webhooks.notifyUnpublish({\n packageName: job.package,\n version: null,\n publishedBy: publisherOf(job),\n });\n return;\n }\n for (const version of removed) {\n await options.webhooks.notifyUnpublish({\n packageName: job.package,\n version,\n publishedBy: publisherOf(job),\n });\n }\n}\n\nexport async function startWorker(\n ctx: ProcessorContext,\n options: WorkerOptions,\n): Promise<RunningWorker> {\n const workerId = `${os.hostname()}:${process.pid}:${Math.random().toString(36).slice(2, 8)}`;\n let stopped = false;\n const sleepers = new Set<() => void>();\n const wakeAll = () => {\n for (const wake of sleepers) wake();\n };\n const unlisten = await ctx.db.listen(JOBS_CHANNEL, wakeAll);\n\n const idle = () =>\n new Promise<void>((resolve) => {\n const wake = () => {\n clearTimeout(timer);\n sleepers.delete(wake);\n resolve();\n };\n const timer = setTimeout(wake, IDLE_POLL_MS);\n sleepers.add(wake);\n });\n\n const loop = async () => {\n while (!stopped) {\n let job: Job | null;\n try {\n job = await claim(ctx.db, workerId);\n } catch (err) {\n console.error(\"[registry] claiming a job failed:\", err);\n await idle();\n continue;\n }\n if (!job) {\n await idle();\n continue;\n }\n const started = performance.now();\n const observe = (outcome: string) =>\n options.metrics?.jobDuration.observe(\n { kind: job.kind, outcome },\n (performance.now() - started) / 1000,\n );\n try {\n await runJob(ctx, job, options);\n observe(\"done\");\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.error(\n `[registry] ${job.kind} ${job.package}${job.version ? `@${job.version}` : \"\"} failed (attempt ${job.attempts}):`,\n message,\n );\n // Failed before the job goes, so a crash here can't strand a version\n const finalAttempt =\n err instanceof PermanentError || job.attempts >= MAX_ATTEMPTS;\n observe(finalAttempt ? \"failed\" : \"retry\");\n options.metrics?.jobErrors.inc({\n kind: job.kind,\n reason: errorReason(err, err instanceof PermanentError),\n });\n try {\n if (!finalAttempt) {\n await retry(ctx.db, job, message);\n } else {\n if (job.kind === \"process\") {\n await failVersion(\n ctx,\n job,\n message,\n err instanceof PermanentError,\n );\n }\n await complete(ctx.db, job);\n }\n } catch (recordErr) {\n console.error(\n \"[registry] recording a job failure failed:\",\n recordErr,\n );\n await idle();\n }\n }\n }\n };\n\n const loops = Array.from({ length: Math.max(1, options.concurrency) }, () =>\n loop(),\n );\n let sweeper: ReturnType<typeof setTimeout> | undefined;\n // The first full pass waits a tick: rows a deploy's import just wrote are still too new\n let lastFull = Date.now() - SWEEP_INTERVAL_MS + RECONCILE_INTERVAL_MS;\n const sweep = async () => {\n try {\n const full = Date.now() - lastFull >= SWEEP_INTERVAL_MS;\n const queued = await reconcile(ctx.db, { full });\n if (full) lastFull = Date.now();\n if (queued !== null) {\n const pass = { pass: full ? \"full\" : \"quick\" };\n options.metrics?.reconcileRuns.inc(pass);\n options.metrics?.reconcileQueued.inc(pass, queued);\n }\n // Repeated nonzero counts point at missed hooks or a stuck package\n if (queued) console.warn(`[registry] reconcile queued ${queued} jobs`);\n if (queued === null && full) await enqueueSweep(ctx.db);\n } catch (err) {\n console.error(\"[registry] reconciling failed:\", err);\n }\n if (!stopped)\n sweeper = setTimeout(() => void sweep(), RECONCILE_INTERVAL_MS);\n };\n if (options.sweep) void sweep();\n return {\n async stop() {\n stopped = true;\n clearTimeout(sweeper);\n wakeAll();\n await unlisten();\n await Promise.allSettled(loops);\n },\n };\n}\n","import { GetObjectCommand, S3Client } from \"@aws-sdk/client-s3\";\nimport S3DatabasePostgres from \"@powerhousedao/verdaccio-s3-storage/postgres\";\nimport express from \"express\";\nimport { findUp } from \"find-up\";\nimport { mkdir } from \"node:fs/promises\";\nimport type { Server } from \"node:http\";\nimport type { AddressInfo } from \"node:net\";\nimport path from \"node:path\";\nimport pg from \"pg\";\nimport { runServer } from \"verdaccio\";\nimport {\n createFsArtifactStore,\n createS3ArtifactStore,\n withMemoryCache,\n type ArtifactStore,\n} from \"./artifacts.js\";\nimport type { AuthStore } from \"./auth/auth-store.js\";\nimport { createPgStore } from \"./auth/pg-store.js\";\nimport { stashAuthStore, wasStoreLoaded } from \"./auth/store-handoff.js\";\nimport { Catalog } from \"./catalog.js\";\nimport {\n createPGliteDatabase,\n createPostgresDatabase,\n type Database,\n} from \"./db/database.js\";\nimport { migrate, migrateOnBoot, prepareSchema } from \"./db/migrations.js\";\nimport { EventBus } from \"./events.js\";\nimport {\n CONTENT_TYPE as METRICS_CONTENT_TYPE,\n catalogMetrics,\n databaseMetrics,\n httpMetrics,\n Metrics,\n processMetrics,\n serveMetrics,\n workerMetrics,\n} from \"./metrics.js\";\nimport {\n createPowerhouseRouter,\n createPublishHook,\n createUnpublishHook,\n} from \"./middleware.js\";\nimport { SSEChannel } from \"./notifications/sse.js\";\nimport { WebhookStore } from \"./notifications/webhook.js\";\nimport type { ProcessorContext } from \"./processor.js\";\nimport type {\n RegistryCommandArgs,\n RegistryConfig,\n S3Config,\n WebhookConfig,\n WorkerCommandArgs,\n} from \"./types.js\";\nimport { ignoreLateContentLength } from \"./late-header-guard.js\";\nimport { installUplinkMissCache } from \"./uplink-miss-cache.js\";\nimport { buildVerdaccioConfig } from \"./verdaccio-config.js\";\nimport {\n enqueueSweep,\n pruneCachedPackages,\n startWorker,\n type RunningWorker,\n} from \"./worker.js\";\n\n// Verdaccio's signing secrets are exactly this long\nconst VERDACCIO_SECRET_LENGTH = 32;\n\n// The S3 plugin's Postgres store traces every step; only warnings matter here\nconst pluginLogger = {\n trace: () => undefined,\n debug: () => undefined,\n info: () => undefined,\n warn: console.warn,\n error: console.error,\n} as unknown as ConstructorParameters<typeof S3DatabasePostgres>[1];\n\nasync function resolveDir(dir: string): Promise<string> {\n if (path.isAbsolute(dir)) {\n await mkdir(dir, { recursive: true });\n return dir;\n }\n const found = await findUp(dir, { type: \"directory\" });\n if (!found) {\n await mkdir(dir, { recursive: true });\n return dir;\n }\n return found;\n}\n\ninterface StorageArgs {\n s3Bucket?: string;\n s3Endpoint?: string;\n s3Region?: string;\n s3AccessKeyId?: string;\n s3SecretAccessKey?: string;\n s3KeyPrefix?: string;\n s3ForcePathStyle: boolean;\n s3MaxWritesPerSecond?: number;\n}\n\nfunction s3From(args: StorageArgs): S3Config | undefined {\n if (!args.s3Bucket || !args.s3Endpoint || !args.s3Region) return undefined;\n return {\n bucket: args.s3Bucket,\n endpoint: args.s3Endpoint,\n region: args.s3Region,\n accessKeyId: args.s3AccessKeyId,\n secretAccessKey: args.s3SecretAccessKey,\n keyPrefix: args.s3KeyPrefix,\n s3ForcePathStyle: args.s3ForcePathStyle,\n maxWritesPerSecond: args.s3MaxWritesPerSecond,\n };\n}\n\nfunction webhooksFrom(list?: string): WebhookConfig[] {\n return (list ?? \"\")\n .split(\",\")\n .map((url) => url.trim())\n .filter(Boolean)\n .map((endpoint) => ({ endpoint }));\n}\n\nexport interface RegistryRuntime {\n db: Database;\n artifacts: ArtifactStore;\n events: EventBus;\n webhooks: WebhookStore;\n close(): Promise<void>;\n}\n\n/** The database, artifact store and event bus every role shares. */\nexport async function createRuntime(options: {\n databaseUrl?: string;\n listenDatabaseUrl?: string;\n dataDir: string;\n s3?: S3Config;\n webhooks?: WebhookConfig[];\n migrateOnBoot?: boolean;\n poolMax?: number;\n}): Promise<RegistryRuntime> {\n // Without Postgres the registry keeps its state in an in-process PGlite\n const db = options.databaseUrl\n ? createPostgresDatabase(\n options.databaseUrl,\n options.listenDatabaseUrl,\n options.poolMax,\n )\n : await createPGliteDatabase(path.join(options.dataDir, \"db\"));\n try {\n await prepareSchema(\n db,\n migrateOnBoot(options.migrateOnBoot, options.databaseUrl),\n );\n } catch (err) {\n await db.close();\n throw err;\n }\n const artifacts = options.s3\n ? createS3ArtifactStore(options.s3)\n : createFsArtifactStore(path.join(options.dataDir, \"artifacts\"));\n const events = new EventBus(db);\n await events.start();\n return {\n db,\n artifacts,\n events,\n webhooks: new WebhookStore(db, options.webhooks),\n close: () => db.close(),\n };\n}\n\nfunction processorContext(\n runtime: RegistryRuntime,\n registryUrl: () => string,\n): ProcessorContext {\n return {\n db: runtime.db,\n artifacts: runtime.artifacts,\n events: runtime.events,\n get registryUrl() {\n return registryUrl();\n },\n };\n}\n\n// Keeps a secret Verdaccio already signs tokens with across the move to the\n// Postgres store; ignored once one is stored\nasync function seedVerdaccioSecret(\n databaseUrl: string,\n secret: string | undefined,\n): Promise<void> {\n if (!secret) return;\n if (secret.length !== VERDACCIO_SECRET_LENGTH) {\n console.warn(\n `[registry] --verdaccio-secret must be ${VERDACCIO_SECRET_LENGTH} characters to seed Verdaccio's store; ignoring it`,\n );\n return;\n }\n const pool = new pg.Pool({ connectionString: databaseUrl, max: 1 });\n try {\n const store = new S3DatabasePostgres(pool, pluginLogger);\n await store.init();\n await pool.query(\n `INSERT INTO verdaccio_secret (id, secret) VALUES (1, $1)\n ON CONFLICT (id) DO NOTHING`,\n [secret],\n );\n } finally {\n await pool.end();\n }\n}\n\nconst MIB = 1024 * 1024;\n\n// Longer than a readiness probe period, so the Service drops the pod first\nconst DRAIN_DELAY_MS = 5_000;\n// Within the pod's default 30 s termination grace period\nconst DRAIN_TIMEOUT_MS = 20_000;\n\n// A hop count, or a value Express parses itself (`loopback`, CIDRs)\nfunction parseTrustProxy(value: string): number | string {\n return /^\\d+$/.test(value) ? Number(value) : value;\n}\n\nexport async function runRegistry(args: RegistryCommandArgs) {\n const {\n port,\n storageDir,\n cdnCacheDir,\n uplink,\n uplinkMaxage,\n trustProxy,\n webEnabled,\n webhooks,\n publicUrl,\n authRenown,\n renownUrl,\n verdaccioSecret,\n localPackages,\n databaseUrl,\n pluginsDir,\n authStore,\n } = args;\n const storagePath = await resolveDir(storageDir);\n const cdnCachePath = await resolveDir(cdnCacheDir);\n const s3 = s3From(args);\n\n // Renown auth needs both the opt-in and --public-url for the audience claim;\n // without either the registry keeps the htpasswd path\n const renownEnabled = authRenown === true && Boolean(publicUrl);\n if (authRenown === true && !publicUrl) {\n console.warn(\n \"[registry] auth-renown is enabled but --public-url / PH_REGISTRY_PUBLIC_URL is not set; Renown auth will be disabled.\",\n );\n }\n // Renown auth is served by the registry-auth plugin, which loads only with a\n // database (it also holds ownership). Without one, renown can't engage.\n if (renownEnabled && !databaseUrl && !authStore) {\n console.warn(\n \"[registry] Renown auth requires a database (--database-url) for the auth plugin; renown will be inactive.\",\n );\n }\n\n const localPackagePatterns = localPackages\n ?.split(\",\")\n .map((p) => p.trim())\n .filter(Boolean);\n\n const runtime = await createRuntime({\n databaseUrl,\n listenDatabaseUrl: args.listenDatabaseUrl,\n dataDir: cdnCachePath,\n s3,\n webhooks: webhooksFrom(webhooks),\n migrateOnBoot: args.migrateOnBoot,\n poolMax: args.dbPoolMax,\n });\n\n // One AuthStore, shared by the verdaccio auth plugin and the /packages owner\n // enrichment, over the runtime's database (an injected store wins).\n const sharedAuthStore: AuthStore | undefined =\n (authStore as AuthStore | undefined) ??\n (databaseUrl\n ? createPgStore(runtime.db, {\n migrate: migrateOnBoot(args.migrateOnBoot, databaseUrl),\n })\n : undefined);\n // Token carries the store through verdaccio's plugin config; we later assert\n // the plugin loaded it, so a configured-but-broken auth setup fails to boot.\n const authStoreToken = sharedAuthStore\n ? stashAuthStore(sharedAuthStore)\n : undefined;\n\n const config: RegistryConfig = {\n port,\n storagePath,\n cdnCachePath,\n uplink,\n uplinkMaxage,\n webEnabled,\n ...(trustProxy ? { trustProxy: parseTrustProxy(trustProxy) } : {}),\n ...(localPackagePatterns?.length ? { localPackagePatterns } : {}),\n ...(renownEnabled && publicUrl\n ? { renown: { publicUrl, ...(renownUrl ? { renownUrl } : {}) } }\n : {}),\n ...(s3 ? { s3 } : {}),\n ...(databaseUrl ? { databaseUrl } : {}),\n ...(args.storagePoolMax ? { storagePoolMax: args.storagePoolMax } : {}),\n ...(args.storageLockPoolMax\n ? { storageLockPoolMax: args.storageLockPoolMax }\n : {}),\n ...(pluginsDir ? { pluginsDir } : {}),\n ...(sharedAuthStore ? { authStore: sharedAuthStore } : {}),\n ...(authStoreToken ? { authStoreToken } : {}),\n };\n\n if (s3 && databaseUrl) {\n await seedVerdaccioSecret(databaseUrl, verdaccioSecret);\n }\n\n await installUplinkMissCache();\n // verdaccio's runServer returns Promise<any> (upstream type limitation)\n const verdaccioServer = (await runServer(\n buildVerdaccioConfig(config) as never,\n )) as Server;\n\n // Fail fast: a configured auth store that the plugin never loaded means\n // verdaccio silently fell back to no auth — refuse to run without ownership.\n if (authStoreToken && !wasStoreLoaded(authStoreToken)) {\n verdaccioServer.close();\n await runtime.close();\n throw new Error(\n \"registry-auth plugin failed to load despite a configured database/auth store; refusing to start without auth and package-ownership enforcement.\",\n );\n }\n const verdaccioHandler = verdaccioServer.listeners(\"request\")[0] as (\n ...args: unknown[]\n ) => void;\n\n const localUrl = () => `http://localhost:${config.port}`;\n const catalog = new Catalog(runtime.db, runtime.events, localUrl);\n runtime.db.onReconnect(() => catalog.reset());\n if (sharedAuthStore) {\n catalog.setOwnerLookup(async (names) => {\n await sharedAuthStore.init();\n return sharedAuthStore.getOwnersFor(names);\n });\n }\n // Files up to 1 MiB; bundles and CDN files are mostly far smaller\n const artifacts = withMemoryCache(runtime.artifacts, {\n maxBytes: (args.artifactCacheMb ?? 128) * MIB,\n maxEntryBytes: MIB,\n });\n runtime.events.on((event) => {\n if (event.type !== \"versions-removed\") return;\n for (const version of event.versions ?? [null]) {\n artifacts.evictPrefix(\n version ? `${event.packageName}/${version}/` : `${event.packageName}/`,\n );\n }\n });\n const sse = new SSEChannel();\n runtime.events.on((event) => {\n if (event.type === \"version-ready\" && event.notify) {\n sse.notifyPublish({\n packageName: event.packageName,\n version: event.version,\n publishedBy: event.publishedBy,\n });\n }\n if (event.type === \"versions-removed\" && event.notify) {\n for (const version of event.versions ?? [null]) {\n sse.notifyUnpublish({\n packageName: event.packageName,\n version,\n publishedBy: event.publishedBy,\n });\n }\n }\n });\n\n const services = {\n db: runtime.db,\n catalog,\n artifacts,\n webhooks: runtime.webhooks,\n sse,\n ...(sharedAuthStore ? { ownerStore: sharedAuthStore } : {}),\n };\n\n const metrics = new Metrics();\n processMetrics(metrics);\n databaseMetrics(metrics, runtime.db);\n const jobMetrics = workerMetrics(metrics);\n\n const app = express();\n let draining = false;\n app.use(httpMetrics(metrics));\n\n // Liveness answers before anything else so a busy replica isn't restarted\n app.get(\"/-/live\", (_req, res) => {\n res.status(200).send(\"ok\");\n });\n // Ready when the database answers and notifications are flowing\n let readyAt = 0;\n let ready = false;\n app.get(\"/-/ready\", (_req, res, next) => {\n void (async () => {\n if (Date.now() - readyAt > 1_000) {\n readyAt = Date.now();\n ready = await runtime.db\n .query(\"SELECT 1\")\n .then(() => runtime.db.listening())\n .catch(() => false);\n }\n res\n .status(!draining && ready ? 200 : 503)\n .send(ready ? \"ok\" : \"not ready\");\n })().catch(next);\n });\n\n app.get(\"/-/metrics\", (_req, res, next) => {\n metrics\n .render()\n .then((body) => {\n res.setHeader(\"Content-Type\", METRICS_CONTENT_TYPE);\n res.end(body);\n })\n .catch(next);\n });\n\n // Serve static assets (logo, etc.)\n const staticDir = await findUp(\"static\", { type: \"directory\" });\n if (staticDir) {\n app.use(\"/-/static\", express.static(staticDir));\n }\n\n // Our routes take priority over Verdaccio\n app.use(createPowerhouseRouter(config, services));\n app.use(createPublishHook(config, services));\n app.use(createUnpublishHook(config, services));\n\n // Verdaccio handles everything else (npm protocol, web UI, auth)\n app.use(ignoreLateContentLength);\n app.use((req, res) => verdaccioHandler(req, res));\n\n // A PGlite database lives in this process, so its jobs must run here too\n const workers = databaseUrl\n ? (args.workers ?? 1)\n : Math.max(1, args.workers ?? 1);\n let worker: Promise<RunningWorker> | undefined;\n\n const server = app.listen(port, () => {\n // Port 0 binds an ephemeral port; the internal fetches need the real one.\n config.port = (server.address() as AddressInfo).port;\n const port = config.port;\n console.log(`Powerhouse Registry running on http://localhost:${port}`);\n console.log(` CDN: http://localhost:${port}/-/cdn/`);\n console.log(` Packages: http://localhost:${port}/packages`);\n console.log(` npm: http://localhost:${port}/`);\n console.log(` Storage: ${storagePath}`);\n console.log(` Data: ${cdnCachePath}`);\n if (config.s3) {\n console.log(` S3: ${config.s3.endpoint}/${config.s3.bucket}`);\n }\n if (config.renown) {\n console.log(` Renown auth: ${config.renown.publicUrl}`);\n }\n if (workers > 0) {\n catalogMetrics(metrics, runtime.db);\n worker = startWorker(processorContext(runtime, localUrl), {\n concurrency: workers,\n webhooks: runtime.webhooks,\n sweep: true,\n metrics: jobMetrics,\n });\n }\n });\n\n // Idle connections outlive the proxies' keep-alive, so a proxy never\n // reuses one Node has just closed\n server.keepAliveTimeout = 65_000;\n server.headersTimeout = 66_000;\n\n let closing: Promise<void> | undefined;\n const closeAll = () =>\n (closing ??= (async () => {\n verdaccioServer.close();\n await (await worker)?.stop();\n metrics.close();\n await runtime.close();\n })());\n server.on(\"close\", () => void closeAll());\n\n // Stops taking traffic, lets the proxy notice, then finishes in-flight requests\n const drain = async () => {\n draining = true;\n await new Promise((resolve) => setTimeout(resolve, DRAIN_DELAY_MS));\n const closed = new Promise<void>((resolve) =>\n server.close(() => resolve()),\n );\n server.closeIdleConnections();\n const force = setTimeout(\n () => server.closeAllConnections(),\n DRAIN_TIMEOUT_MS,\n );\n await closed;\n clearTimeout(force);\n await closeAll();\n };\n\n return Object.assign(server, { drain });\n}\n\nexport async function runWorker(args: WorkerCommandArgs) {\n const cdnCachePath = await resolveDir(args.cdnCacheDir);\n if (!args.databaseUrl) {\n throw new Error(\"the worker needs a shared database (--database-url)\");\n }\n const runtime = await createRuntime({\n databaseUrl: args.databaseUrl,\n listenDatabaseUrl: args.listenDatabaseUrl,\n dataDir: cdnCachePath,\n s3: s3From(args),\n webhooks: webhooksFrom(args.webhooks),\n migrateOnBoot: args.migrateOnBoot,\n poolMax: args.dbPoolMax,\n });\n const metrics = new Metrics();\n let metricsServer: Server | undefined;\n if (args.metricsPort !== undefined) {\n processMetrics(metrics);\n databaseMetrics(metrics, runtime.db);\n catalogMetrics(metrics, runtime.db);\n metricsServer = await serveMetrics(metrics, args.metricsPort);\n }\n const worker = await startWorker(\n processorContext(runtime, () => args.registryUrl.replace(/\\/$/, \"\")),\n {\n concurrency: args.concurrency,\n webhooks: runtime.webhooks,\n sweep: true,\n metrics: workerMetrics(metrics),\n },\n );\n console.log(\n `[registry] worker running ${args.concurrency} job(s) at a time against ${args.registryUrl}`,\n );\n const shutdown = () => {\n void (async () => {\n await worker.stop();\n metricsServer?.close();\n metrics.close();\n await runtime.close();\n process.exit(0);\n })();\n };\n process.once(\"SIGTERM\", shutdown);\n process.once(\"SIGINT\", shutdown);\n}\n\n/** Applies migrations, then optionally queues a sync of every local package. */\nexport async function runMigrate(\n databaseUrl: string | undefined,\n options: { backfill: boolean; listenDatabaseUrl?: string },\n) {\n if (!databaseUrl) throw new Error(\"--database-url is required\");\n // Online migrations hold a session lock, which needs the direct URL\n const db = createPostgresDatabase(databaseUrl, options.listenDatabaseUrl);\n try {\n await migrate(db);\n console.log(\"[registry] migrations applied\");\n if (options.backfill) {\n const count = await enqueueSweep(db);\n console.log(`[registry] queued a sync of ${count} package(s)`);\n }\n } finally {\n await db.close();\n }\n}\n\ninterface LegacyVerdaccioState {\n secret?: string;\n list?: string[];\n tokens?: {\n user: string;\n key: string;\n token: string;\n readonly: boolean;\n created: number | string;\n }[];\n}\n\nasync function readStoredManifest(\n s3: S3Client,\n config: S3Config,\n name: string,\n): Promise<object | null> {\n try {\n const res = await s3.send(\n new GetObjectCommand({\n Bucket: config.bucket,\n Key: `${config.keyPrefix ?? \"\"}${name}/package.json`,\n }),\n );\n return JSON.parse(\n (await res.Body?.transformToString()) ?? \"null\",\n ) as object;\n } catch (err) {\n // Only a missing manifest is an answer; a throttled read must not look like one\n const name = (err as { name?: string }).name;\n if (name === \"NoSuchKey\" || name === \"NotFound\") return null;\n throw err;\n }\n}\n\n/** Moves Verdaccio's S3-file state into the Postgres store the S3 plugin reads. */\nexport async function runImportVerdaccioState(\n args: StorageArgs & { databaseUrl?: string },\n) {\n const s3Config = s3From(args);\n if (!s3Config || !args.databaseUrl) {\n throw new Error(\n \"--s3-bucket, --s3-endpoint, --s3-region and --database-url are required\",\n );\n }\n const s3 = new S3Client({\n endpoint: s3Config.endpoint,\n region: s3Config.region,\n forcePathStyle: s3Config.s3ForcePathStyle ?? true,\n ...(s3Config.accessKeyId && s3Config.secretAccessKey\n ? {\n credentials: {\n accessKeyId: s3Config.accessKeyId,\n secretAccessKey: s3Config.secretAccessKey,\n },\n }\n : {}),\n });\n let legacy: LegacyVerdaccioState = {};\n try {\n const res = await s3.send(\n new GetObjectCommand({\n Bucket: s3Config.bucket,\n Key: `${s3Config.keyPrefix ?? \"\"}verdaccio-s3-db.json`,\n }),\n );\n legacy = JSON.parse(\n (await res.Body?.transformToString()) ?? \"{}\",\n ) as LegacyVerdaccioState;\n } catch (err) {\n const name = (err as { name?: string }).name;\n if (name !== \"NoSuchKey\" && name !== \"NotFound\") throw err;\n }\n // Verdaccio's list holds what was published here; the bucket also holds its uplink cache\n const names = new Set(legacy.list ?? []);\n\n const pool = new pg.Pool({ connectionString: args.databaseUrl });\n let pruned: string[] = [];\n let gone = 0;\n try {\n const store = new S3DatabasePostgres(pool, pluginLogger);\n await store.init();\n // The manifest index lets the worker reconcile without fetching metadata\n const missing: string[] = [];\n for (const name of names) {\n const manifest = await readStoredManifest(s3, s3Config, name);\n if (manifest) await store.record(name, manifest);\n else missing.push(name);\n }\n // Listed with no stored manifest: Verdaccio's package list fails on one\n for (const name of missing) names.delete(name);\n await pool.query(\"DELETE FROM verdaccio_packages WHERE name = ANY($1)\", [\n missing,\n ]);\n gone = missing.length;\n for (const name of names) {\n await pool.query(\n \"INSERT INTO verdaccio_packages (name) VALUES ($1) ON CONFLICT (name) DO NOTHING\",\n [name],\n );\n }\n // Without Verdaccio's state file there's no list to prune against\n if (legacy.list) pruned = await pruneCachedPackages(pool, [...names]);\n for (const token of legacy.tokens ?? []) {\n await pool.query(\n `INSERT INTO verdaccio_tokens (\"user\", key, token) VALUES ($1, $2, $3)\n ON CONFLICT (\"user\", key) DO NOTHING`,\n [token.user, token.key, JSON.stringify(token)],\n );\n }\n if (legacy.secret) {\n await pool.query(\n `INSERT INTO verdaccio_secret (id, secret) VALUES (1, $1)\n ON CONFLICT (id) DO NOTHING`,\n [legacy.secret],\n );\n }\n } finally {\n await pool.end();\n }\n console.log(\n `[registry] imported ${names.size} package name(s), ${legacy.tokens?.length ?? 0} token(s)${legacy.secret ? \" and the secret\" : \"\"}; pruned ${pruned.length} cached package(s), dropped ${gone} with no stored manifest`,\n );\n}\n","import {\n binary,\n command,\n flag,\n number,\n option,\n optional,\n run,\n string,\n type Type,\n} from \"cmd-ts\";\nimport {\n DEFAULT_PORT,\n DEFAULT_REGISTRY_CDN_CACHE_DIR_NAME,\n DEFAULT_STORAGE_DIR_NAME,\n} from \"./src/constants.js\";\nimport {\n runImportVerdaccioState,\n runMigrate,\n runRegistry,\n runWorker,\n} from \"./src/run.js\";\n\n// Where the registry keeps its files and state, shared by every role\nconst positiveFromEnv = (name: string) => () => {\n const n = Number(process.env[name]);\n return Number.isInteger(n) && n > 0 ? n : undefined;\n};\n\nconst storageArgs = {\n storageDir: option({\n long: \"storage-dir\",\n type: string,\n defaultValue: () =>\n process.env.REGISTRY_STORAGE || DEFAULT_STORAGE_DIR_NAME,\n defaultValueIsSerializable: true,\n }),\n cdnCacheDir: option({\n long: \"cdn-cache-dir\",\n type: string,\n description:\n \"Local data directory: processed packages and the database when no S3 bucket or Postgres URL is set\",\n defaultValue: () =>\n process.env.REGISTRY_CDN_CACHE || DEFAULT_REGISTRY_CDN_CACHE_DIR_NAME,\n defaultValueIsSerializable: true,\n }),\n s3Bucket: option({\n long: \"s3-bucket\",\n type: optional(string),\n defaultValue: () => process.env.S3_BUCKET,\n defaultValueIsSerializable: true,\n }),\n s3Endpoint: option({\n long: \"s3-endpoint\",\n type: optional(string),\n defaultValue: () => process.env.S3_ENDPOINT,\n defaultValueIsSerializable: true,\n }),\n s3Region: option({\n long: \"s3-region\",\n type: optional(string),\n defaultValue: () => process.env.S3_REGION,\n defaultValueIsSerializable: true,\n }),\n s3AccessKeyId: option({\n long: \"s3-access-key-id\",\n type: optional(string),\n defaultValue: () => process.env.S3_ACCESS_KEY_ID,\n defaultValueIsSerializable: true,\n }),\n s3SecretAccessKey: option({\n long: \"s3-secret-access-key\",\n type: optional(string),\n defaultValue: () => process.env.S3_SECRET_ACCESS_KEY,\n defaultValueIsSerializable: true,\n }),\n s3KeyPrefix: option({\n long: \"s3-key-prefix\",\n type: optional(string),\n defaultValue: () => process.env.S3_KEY_PREFIX,\n defaultValueIsSerializable: true,\n }),\n s3ForcePathStyle: flag({\n long: \"s3-force-path-style\",\n defaultValue: () => process.env.S3_FORCE_PATH_STYLE !== \"false\",\n defaultValueIsSerializable: true,\n }),\n s3MaxWritesPerSecond: option({\n long: \"s3-max-writes-per-second\",\n type: optional(number),\n description:\n \"Artifact uploads per second (default 150); Hetzner throttles a bucket past 750 requests per second. Env PH_REGISTRY_S3_MAX_WRITES_PER_SECOND\",\n defaultValue: positiveFromEnv(\"PH_REGISTRY_S3_MAX_WRITES_PER_SECOND\"),\n }),\n databaseUrl: option({\n long: \"database-url\",\n type: optional(string),\n description:\n \"Postgres connection string, shared by every replica and worker. Without it the registry keeps its state in an embedded PGlite and runs its jobs in-process.\",\n defaultValue: () =>\n process.env.PH_REGISTRY_DATABASE_URL ?? process.env.DATABASE_URL,\n defaultValueIsSerializable: true,\n }),\n listenDatabaseUrl: option({\n long: \"listen-database-url\",\n type: optional(string),\n description:\n \"Direct Postgres connection for LISTEN/NOTIFY, when --database-url goes through a transaction pooler\",\n defaultValue: () => process.env.PH_REGISTRY_LISTEN_DATABASE_URL,\n defaultValueIsSerializable: true,\n }),\n webhooks: option({\n long: \"webhook\",\n type: optional(string),\n description: \"Comma-separated webhook URLs to notify on publish\",\n defaultValue: () => process.env.REGISTRY_WEBHOOKS,\n defaultValueIsSerializable: true,\n }),\n};\n\nconst trueOrFalse: Type<string, boolean> = {\n displayName: \"true|false\",\n from: (value) =>\n value === \"true\" || value === \"false\"\n ? Promise.resolve(value === \"true\")\n : Promise.reject(new Error(\"expected true or false\")),\n};\n\n// Unset: only without --database-url, so a deployment runs `migrate` itself\nconst migrateOnBootArg = option({\n long: \"migrate-on-boot\",\n type: optional(trueOrFalse),\n description:\n \"Apply database migrations at startup (true/false). Defaults to true without --database-url, else false; env PH_REGISTRY_MIGRATE_ON_BOOT\",\n});\n\nconst dbPoolMaxArg = option({\n long: \"db-pool-max\",\n type: optional(number),\n description:\n \"Connections in this process's Postgres pool (default 10); env PH_REGISTRY_DB_POOL_MAX\",\n defaultValue: positiveFromEnv(\"PH_REGISTRY_DB_POOL_MAX\"),\n});\n\nconst redact = (v?: string) => (v ? \"[redacted]\" : undefined);\n\nexport const registryCommand = command({\n name: \"Package registry\",\n args: {\n ...storageArgs,\n migrateOnBoot: migrateOnBootArg,\n dbPoolMax: dbPoolMaxArg,\n storagePoolMax: option({\n long: \"storage-pool-max\",\n type: optional(number),\n description:\n \"Connections for the storage plugin's reads (default 2); env PH_REGISTRY_STORAGE_POOL_MAX\",\n defaultValue: positiveFromEnv(\"PH_REGISTRY_STORAGE_POOL_MAX\"),\n }),\n storageLockPoolMax: option({\n long: \"storage-lock-pool-max\",\n type: optional(number),\n description:\n \"Connections holding the storage plugin's package locks, one per concurrent manifest write (default 4); env PH_REGISTRY_STORAGE_LOCK_POOL_MAX\",\n defaultValue: positiveFromEnv(\"PH_REGISTRY_STORAGE_LOCK_POOL_MAX\"),\n }),\n port: option({\n long: \"port\",\n type: number,\n defaultValue: () => Number(process.env.PORT) || DEFAULT_PORT,\n defaultValueIsSerializable: true,\n }),\n artifactCacheMb: option({\n long: \"artifact-cache-mb\",\n type: number,\n description:\n \"Memory for serving small published files without S3, in MiB (0 turns it off)\",\n defaultValue: () =>\n Number(process.env.PH_REGISTRY_ARTIFACT_CACHE_MB ?? 128),\n defaultValueIsSerializable: true,\n }),\n workers: option({\n long: \"workers\",\n type: number,\n description:\n \"Jobs this process runs at a time; 0 leaves them to `ph-registry worker` (needs --database-url)\",\n defaultValue: () => Number(process.env.PH_REGISTRY_WORKERS ?? 1),\n defaultValueIsSerializable: true,\n }),\n uplink: option({\n long: \"uplink\",\n type: optional(string),\n defaultValue: () => process.env.REGISTRY_UPLINK,\n defaultValueIsSerializable: true,\n }),\n uplinkMaxage: option({\n long: \"uplink-maxage\",\n type: optional(string),\n description:\n \"How long verdaccio caches npmjs uplink metadata before refetching. \" +\n \"Accepts verdaccio time strings (e.g. '30s', '2m', '1h'). \" +\n \"Default '2m' matches verdaccio upstream — shortens the publish-to-\" +\n \"install propagation window in dev. Bump for production deployments \" +\n \"that want to reduce npmjs load.\",\n defaultValue: () => process.env.PH_REGISTRY_UPLINK_MAXAGE,\n defaultValueIsSerializable: true,\n }),\n trustProxy: option({\n long: \"trust-proxy\",\n type: optional(string),\n description:\n \"Express `trust proxy` (e.g. 2 proxy hops), so rate limits key on client IPs; env PH_REGISTRY_TRUST_PROXY\",\n defaultValue: () => process.env.PH_REGISTRY_TRUST_PROXY,\n defaultValueIsSerializable: true,\n }),\n webEnabled: flag({\n long: \"web-enabled\",\n defaultValue: () => process.env.REGISTRY_WEB !== \"false\",\n defaultValueIsSerializable: true,\n }),\n publicUrl: option({\n long: \"public-url\",\n type: optional(string),\n description:\n \"Public origin of this registry (used as the JWT `aud` claim for Renown bearer tokens). Required when --auth-renown is true.\",\n defaultValue: () => process.env.PH_REGISTRY_PUBLIC_URL,\n defaultValueIsSerializable: true,\n }),\n authRenown: flag({\n long: \"auth-renown\",\n description:\n \"Verify Renown-signed bearer tokens in front of verdaccio (stateless). Disabled when --public-url is unset.\",\n defaultValue: () => process.env.PH_REGISTRY_AUTH_RENOWN === \"true\",\n defaultValueIsSerializable: true,\n }),\n renownUrl: option({\n long: \"renown-url\",\n type: optional(string),\n description:\n \"Renown service base URL for credential verification. Defaults to https://www.renown.id.\",\n defaultValue: () => process.env.PH_REGISTRY_RENOWN_URL,\n defaultValueIsSerializable: true,\n }),\n verdaccioSecret: option({\n long: \"verdaccio-secret\",\n type: optional(string),\n description:\n \"Seeds Verdaccio's stored JWT signing secret (32 characters) when none is stored yet, keeping tokens it already signed valid.\",\n defaultValue: () => process.env.PH_REGISTRY_VERDACCIO_SECRET,\n defaultValueIsSerializable: true,\n }),\n localPackages: option({\n long: \"local-packages\",\n type: optional(string),\n description:\n \"Comma-separated globs (e.g. '@powerhousedao/*,document-model,ph-cmd') served locally only — no npmjs uplink proxy. Lets you re-publish a workspace package whose version already exists on npmjs without bumping.\",\n defaultValue: () => process.env.PH_REGISTRY_LOCAL_PACKAGES,\n defaultValueIsSerializable: true,\n }),\n },\n handler: async (args) => {\n // Secrets redacted: this object otherwise leaks them into logs\n console.log({\n ...args,\n databaseUrl: redact(args.databaseUrl),\n listenDatabaseUrl: redact(args.listenDatabaseUrl),\n verdaccioSecret: redact(args.verdaccioSecret),\n s3AccessKeyId: redact(args.s3AccessKeyId),\n s3SecretAccessKey: redact(args.s3SecretAccessKey),\n });\n\n try {\n const server = await runRegistry(args);\n const shutdown = () => {\n console.log(\"[registry] draining\");\n void server.drain().finally(() => process.exit(0));\n };\n process.once(\"SIGTERM\", shutdown);\n process.once(\"SIGINT\", shutdown);\n } catch (error) {\n console.error(\"Failed to start registry:\");\n console.error(error);\n process.exit(1);\n }\n },\n});\n\nexport const workerCommand = command({\n name: \"Package registry worker\",\n args: {\n ...storageArgs,\n migrateOnBoot: migrateOnBootArg,\n dbPoolMax: dbPoolMaxArg,\n registryUrl: option({\n long: \"registry-url\",\n type: string,\n description: \"npm endpoint of a registry replica to fetch packages from\",\n defaultValue: () =>\n process.env.PH_REGISTRY_INTERNAL_URL ??\n `http://localhost:${DEFAULT_PORT}`,\n defaultValueIsSerializable: true,\n }),\n concurrency: option({\n long: \"concurrency\",\n type: number,\n defaultValue: () =>\n Number(process.env.PH_REGISTRY_WORKER_CONCURRENCY ?? 8),\n defaultValueIsSerializable: true,\n }),\n metricsPort: option({\n long: \"metrics-port\",\n type: optional(number),\n description: \"Serve Prometheus metrics at GET /-/metrics on this port\",\n defaultValue: () =>\n process.env.PH_REGISTRY_METRICS_PORT\n ? Number(process.env.PH_REGISTRY_METRICS_PORT)\n : undefined,\n defaultValueIsSerializable: true,\n }),\n },\n handler: async (args) => {\n try {\n await runWorker(args);\n } catch (error) {\n console.error(\"Failed to start the registry worker:\", error);\n process.exit(1);\n }\n },\n});\n\nexport const migrateCommand = command({\n name: \"Package registry migrations\",\n args: {\n databaseUrl: storageArgs.databaseUrl,\n listenDatabaseUrl: storageArgs.listenDatabaseUrl,\n backfill: flag({\n long: \"backfill\",\n description: \"Also queue processing of every package published here\",\n }),\n },\n handler: async ({ databaseUrl, listenDatabaseUrl, backfill }) => {\n try {\n await runMigrate(databaseUrl, { backfill, listenDatabaseUrl });\n } catch (error) {\n console.error(\"Registry migration failed:\", error);\n process.exit(1);\n }\n },\n});\n\nexport const importVerdaccioStateCommand = command({\n name: \"Import Verdaccio state into Postgres\",\n description:\n \"Copies the package list, tokens and secret from verdaccio-s3-db.json, plus every package stored in S3, into the Postgres store\",\n args: storageArgs,\n handler: async (args) => {\n try {\n await runImportVerdaccioState(args);\n } catch (error) {\n console.error(\"Importing Verdaccio state failed:\", error);\n process.exit(1);\n }\n },\n});\n\n// `ph-registry` alone runs the server; a leading subcommand picks another role\nconst subcommands = {\n worker: workerCommand,\n migrate: migrateCommand,\n \"import-verdaccio-state\": importVerdaccioStateCommand,\n};\nconst [node, script, first, ...rest] = process.argv;\nif (first in subcommands) {\n await run(binary(subcommands[first as keyof typeof subcommands]), [\n node,\n script,\n ...rest,\n ]);\n} else {\n await run(binary(registryCommand), process.argv);\n}\n"],"x_google_ignoreList":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18],"mappings":"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"}
|