monoship 1.8.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":["publish","execFileAsync"],"sources":["../src/core/error.ts","../src/core/filesystem/memory.ts","../src/core/filesystem/node.ts","../src/core/logger/consola.ts","../src/core/logger/noop.ts","../src/core/publisher/error.ts","../src/core/publisher/memory.ts","../src/utils/object.ts","../src/core/publisher/npm.ts","../src/core/publisher/npm-cli.ts","../src/core/publisher/resolve.ts","../src/core/registry-client/error.ts","../src/constants.ts","../src/core/registry-client/hapic.ts","../src/core/registry-client/memory.ts","../src/core/token-provider/chain.ts","../src/core/token-provider/env.ts","../src/core/token-provider/memory.ts","../src/core/token-provider/oidc.ts","../src/package.ts","../src/package-dependency.ts","../src/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport class BaseError extends Error {\n readonly code: string;\n\n readonly statusCode: number;\n\n // ----------------------------------------------------\n\n constructor(message: string, options: { code: string; statusCode: number }) {\n super(message);\n this.code = options.code;\n this.statusCode = options.statusCode;\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport path from 'node:path';\nimport type { IFileSystem } from './types.ts';\n\nexport class MemoryFileSystem implements IFileSystem {\n private readonly files: Map<string, string>;\n\n // ----------------------------------------------------\n\n constructor(files: Record<string, string> = {}) {\n this.files = new Map(\n Object.entries(files || {}).map(([k, v]) => [this.normalize(k), v]),\n );\n }\n\n // ----------------------------------------------------\n\n async readFile(filePath: string): Promise<string> {\n const normalized = this.normalize(filePath);\n const content = this.files.get(normalized);\n if (content === undefined) {\n throw new Error(`ENOENT: no such file or directory, open '${filePath}'`);\n }\n return content;\n }\n\n async writeFile(filePath: string, content: string): Promise<void> {\n this.files.set(this.normalize(filePath), content);\n }\n\n async glob(\n patterns: string[],\n options: { cwd?: string; ignore?: string[] } = {},\n ): Promise<string[]> {\n const cwd = options.cwd ? this.normalize(options.cwd) : '';\n const dirs = new Set<string>();\n const keys = Array.from(this.files.keys());\n\n for (const key of keys) {\n\n if (cwd && !key.startsWith(`${cwd}/`) && key !== cwd) {\n continue;\n }\n\n const relative = cwd ? key.slice(cwd.length + 1) : key;\n const parts = relative.split('/');\n\n for (const pattern of patterns) {\n if (this.matchGlobPattern(parts, pattern)) {\n const dir = parts.slice(0, pattern.split('/').length)\n .join('/');\n const absolute = cwd ? `${cwd}/${dir}` : dir;\n dirs.add(absolute);\n }\n }\n }\n\n return Array.from(dirs);\n }\n\n getFile(filePath: string): string | undefined {\n return this.files.get(this.normalize(filePath));\n }\n\n // ----------------------------------------------------\n\n private normalize(filePath: string): string {\n return path.posix.normalize(filePath.replace(/\\\\/g, '/'));\n }\n\n private matchGlobPattern(parts: string[], pattern: string): boolean {\n const patternParts = pattern.split('/');\n\n for (const [i, pp] of patternParts.entries()) {\n if (i >= parts.length) return false;\n\n if (pp === '*' || pp === '**') continue;\n if (pp !== parts[i]) return false;\n }\n\n return true;\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport fs from 'node:fs';\nimport fg from 'fast-glob';\nimport type { IFileSystem } from './types.ts';\n\nexport class NodeFileSystem implements IFileSystem {\n async readFile(filePath: string): Promise<string> {\n return fs.promises.readFile(filePath, { encoding: 'utf-8' });\n }\n\n async writeFile(filePath: string, content: string): Promise<void> {\n await fs.promises.writeFile(filePath, content, { encoding: 'utf-8' });\n }\n\n async glob(\n patterns: string[],\n options: { cwd?: string; ignore?: string[] } = {},\n ): Promise<string[]> {\n return fg(patterns, {\n ignore: options.ignore || ['node_modules/**'],\n cwd: options.cwd,\n absolute: true,\n onlyDirectories: true,\n });\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport consola from 'consola';\nimport type { ILogger } from './types.ts';\n\nexport class ConsolaLogger implements ILogger {\n info(message: string): void {\n consola.info(message);\n }\n\n success(message: string): void {\n consola.success(message);\n }\n\n warn(message: string): void {\n consola.warn(message);\n }\n\n error(message: string): void {\n consola.error(message);\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ILogger } from './types.ts';\n\nexport class NoopLogger implements ILogger {\n info(_message: string): void {}\n\n success(_message: string): void {}\n\n warn(_message: string): void {}\n\n error(_message: string): void {}\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BaseError } from '../error.ts';\n\nexport class PublishError extends BaseError {\n constructor(message: string, options?: { cause?: Error }) {\n super(message, { code: 'EPUBLISH', statusCode: 500 });\n\n if (options?.cause) {\n this.cause = options.cause;\n }\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { PackageJson } from '../package/index.ts';\nimport type { IPackagePublisher } from './types.ts';\n\nexport class MemoryPublisher implements IPackagePublisher {\n public published: Array<{ packagePath: string; manifest: PackageJson; options: Record<string, any> }>;\n\n // ----------------------------------------------------\n\n constructor() {\n this.published = [];\n }\n\n // ----------------------------------------------------\n\n async publish(\n packagePath: string,\n manifest: PackageJson,\n options: Record<string, any>,\n ): Promise<boolean> {\n this.published.push({ packagePath, manifest, options });\n return true;\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport function isObject(input: unknown) : input is Record<string, any> {\n return typeof input === 'object' &&\n input !== null &&\n !Array.isArray(input);\n}\n\nexport function isError(input: unknown): input is Error {\n return isObject(input) &&\n typeof input.message === 'string';\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport libnpmpack from 'libnpmpack';\nimport { publish } from 'libnpmpublish';\nimport { isError, isObject } from '../../utils/index.ts';\nimport type { PackageJson } from '../package/index.ts';\nimport { PublishError } from './error.ts';\nimport type { IPackagePublisher } from './types.ts';\n\nexport class NpmPublisher implements IPackagePublisher {\n /**\n * Publish a package using libnpmpack + libnpmpublish.\n *\n * @returns `true` if published, `false` if the version already exists.\n * @throws {PublishError} On non-conflict failures (network errors, auth failures, etc.).\n */\n async publish(\n packagePath: string,\n manifest: PackageJson,\n options: Record<string, any>,\n ): Promise<boolean> {\n try {\n const tarball = await libnpmpack(packagePath);\n await publish(manifest, tarball, options);\n return true;\n } catch (e) {\n if (this.isNpmJsVersionConflict(e) || this.isNpmPkgGitHubVersionConflict(e)) {\n return false;\n }\n\n const cause = isError(e) ? e : undefined;\n const message = cause?.message || 'libnpmpublish failed with an unknown error';\n throw new PublishError(message, { cause });\n }\n }\n\n // ----------------------------------------------------\n\n /**\n * Determines whether an exception represents a version conflict\n * when publishing to the npmjs.org registry.\n */\n private isNpmJsVersionConflict(ex: unknown): boolean {\n if (!isObject(ex)) {\n return false;\n }\n\n if ('code' in ex && ex.code === 'EPUBLISHCONFLICT') {\n return true;\n }\n\n return 'code' in ex &&\n ex.code === 'E403' &&\n typeof ex.message === 'string' &&\n ex.message.includes('You cannot publish over the previously published versions');\n }\n\n /**\n * Determines whether an exception represents a version conflict\n * when publishing to GitHub Packages (npm.pkg.github.com).\n */\n private isNpmPkgGitHubVersionConflict(ex: unknown): boolean {\n if (!isObject(ex)) {\n return false;\n }\n\n if ('code' in ex && ex.code === 'E409') {\n return true;\n }\n\n if (\n 'body' in ex &&\n isObject(ex.body) &&\n ex.body.error === 'Cannot publish over existing version'\n ) {\n return true;\n }\n\n return typeof ex.message === 'string' &&\n ex.message.startsWith('409 Conflict - PUT https://npm.pkg.github.com');\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { execFile } from 'node:child_process';\nimport { readFile, unlink, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\nimport { isError, isObject } from '../../utils/index.ts';\nimport type { PackageJson } from '../package/index.ts';\nimport { PublishError } from './error.ts';\nimport type { ExecFn, IPackagePublisher } from './types.ts';\n\nconst execFileAsync = promisify(execFile);\n\nconst AUTH_TOKEN_PATTERN = /^(\\/\\/.+)\\/:_authToken$/;\n\n/**\n * Extract the auth token entry from publish options.\n *\n * When `registry` is provided, prefers the entry whose scope matches\n * the target registry (host + path). Falls back to the first match\n * if no registry-specific entry is found.\n */\nfunction parseAuthTokenEntry(\n options: Record<string, any>,\n registry?: string,\n): { key: string; token: string; registryPath: string } | undefined {\n let registryScope: string | undefined;\n if (registry) {\n try {\n const url = new URL(registry);\n registryScope = `//${url.host}${url.pathname.replace(/\\/$/, '')}`;\n } catch {\n // invalid registry URL — skip scope matching\n }\n }\n\n let fallback: { key: string; token: string; registryPath: string } | undefined;\n const keys = Object.keys(options);\n for (const key of keys) {\n const match = AUTH_TOKEN_PATTERN.exec(key);\n const registryPath = match?.[1];\n if (match && registryPath && options[key]) {\n const entry = {\n key,\n token: options[key],\n registryPath,\n };\n\n if (registryScope && registryPath === registryScope) {\n return entry;\n }\n\n if (!fallback) {\n fallback = entry;\n }\n }\n }\n\n return fallback;\n}\n\ntype ReadFileFn = (filePath: string, encoding: string) => Promise<string>;\ntype WriteFileFn = (filePath: string, content: string, encoding: string) => Promise<void>;\ntype UnlinkFn = (filePath: string) => Promise<void>;\n\ntype NpmCliPublisherOptions = {\n execFn?: ExecFn;\n readFileFn?: ReadFileFn;\n writeFileFn?: WriteFileFn;\n unlinkFn?: UnlinkFn;\n};\n\nexport class NpmCliPublisher implements IPackagePublisher {\n private readonly execFn: ExecFn;\n\n private readonly readFileFn: ReadFileFn;\n\n private readonly writeFileFn: WriteFileFn;\n\n private readonly unlinkFn: UnlinkFn;\n\n // ----------------------------------------------------\n\n constructor(options: NpmCliPublisherOptions = {}) {\n this.execFn = options.execFn || execFileAsync;\n this.readFileFn = options.readFileFn || ((fp, enc) => readFile(fp, enc as BufferEncoding) as Promise<string>);\n this.writeFileFn = options.writeFileFn || ((fp, content, enc) => writeFile(fp, content, enc as BufferEncoding));\n this.unlinkFn = options.unlinkFn || ((fp) => unlink(fp));\n }\n\n // ----------------------------------------------------\n\n /**\n * Publish a package by shelling out to `npm publish`.\n *\n * Writes a temporary `.npmrc` for auth when a token is present and\n * restores/removes it after the command completes (even on failure).\n *\n * @returns `true` if published, `false` if the version already exists.\n * @throws {PublishError} On non-conflict failures (network errors, auth failures, etc.).\n */\n async publish(\n packagePath: string,\n _manifest: PackageJson,\n options: Record<string, any>,\n ): Promise<boolean> {\n const args = ['publish'];\n\n const authEntry = parseAuthTokenEntry(options, options.registry);\n\n if (options.registry) {\n args.push('--registry', options.registry);\n } else if (authEntry) {\n args.push('--registry', `https:${authEntry.registryPath}`);\n }\n\n if (options.access) {\n args.push('--access', options.access);\n }\n\n if (options.tag) {\n args.push('--tag', options.tag);\n }\n\n const env: Record<string, string | undefined> = { ...process.env };\n\n let npmrcPath: string | undefined;\n let existingNpmrc: string | undefined;\n\n if (authEntry) {\n env.NODE_AUTH_TOKEN = authEntry.token;\n\n const registryUrl = options.registry || `https:${authEntry.registryPath}`;\n let npmrcContent: string;\n try {\n const url = new URL(registryUrl);\n const registryPath = url.pathname.replace(/\\/$/, '');\n npmrcContent = `//${url.host}${registryPath}/:_authToken=\\${NODE_AUTH_TOKEN}\\n`;\n } catch {\n throw new PublishError(`Invalid registry URL: ${registryUrl}`);\n }\n\n npmrcPath = path.join(packagePath, '.npmrc');\n\n try {\n existingNpmrc = await this.readFileFn(npmrcPath, 'utf-8');\n } catch {\n // no existing .npmrc\n }\n\n const finalContent = existingNpmrc ?\n `${existingNpmrc.trimEnd()}\\n${npmrcContent}` :\n npmrcContent;\n\n await this.writeFileFn(npmrcPath, finalContent, 'utf-8');\n }\n\n try {\n await this.execFn('npm', args, {\n cwd: packagePath,\n env,\n });\n return true;\n } catch (e: unknown) {\n if (this.isVersionConflict(e)) {\n return false;\n }\n\n const cause = isError(e) ? e : undefined;\n const message = cause?.message || 'npm publish failed with an unknown error';\n throw new PublishError(message, { cause });\n } finally {\n if (npmrcPath) {\n if (typeof existingNpmrc === 'string') {\n await this.writeFileFn(npmrcPath, existingNpmrc, 'utf-8');\n } else {\n try {\n await this.unlinkFn(npmrcPath);\n } catch {\n // ignore cleanup errors\n }\n }\n }\n }\n }\n\n // ----------------------------------------------------\n\n private isVersionConflict(e: unknown): boolean {\n if (!isObject(e)) {\n return false;\n }\n\n let stderr = '';\n if (typeof e.stderr === 'string') {\n stderr = e.stderr;\n }\n const message = isError(e) ? e.message : '';\n const combined = `${stderr} ${message}`;\n\n return combined.includes('EPUBLISHCONFLICT') ||\n combined.includes('You cannot publish over the previously published versions') ||\n combined.includes('Cannot publish over existing version') ||\n combined.includes('409 Conflict');\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport semver from 'semver';\nimport { NpmCliPublisher } from './npm-cli.ts';\nimport { NpmPublisher } from './npm.ts';\nimport type { ExecFn, IPackagePublisher } from './types.ts';\n\nconst execFileAsync = promisify(execFile);\n\nconst NPM_MIN_VERSION = '10.0.0';\n\nexport async function resolvePublisher(options: { execFn?: ExecFn } = {}): Promise<IPackagePublisher> {\n const execFn = options.execFn || execFileAsync;\n\n try {\n const { stdout } = await execFn('npm', ['--version'], {\n cwd: process.cwd(),\n env: process.env as Record<string, string | undefined>,\n });\n const version = stdout.trim();\n if (semver.gte(version, NPM_MIN_VERSION)) {\n return new NpmCliPublisher({ execFn });\n }\n } catch {\n // npm not found\n }\n\n return new NpmPublisher();\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { isObject } from '../../utils/index.ts';\nimport { BaseError } from '../error.ts';\n\nexport class RegistryError extends BaseError {\n constructor(message: string, statusCode: number) {\n super(message, { code: `E${statusCode}`, statusCode });\n }\n}\n\n/**\n * Duck-type check for RegistryError shape.\n *\n * Validates the error has `message` (string), `statusCode` (number),\n * and `code` (string) — matching the BaseError contract.\n *\n * @param input The value to check.\n * @returns `true` if the value has the RegistryError shape.\n */\nexport function isRegistryError(input: unknown): input is RegistryError {\n return isObject(input) &&\n typeof input.message === 'string' &&\n typeof input.statusCode === 'number' &&\n typeof input.code === 'string';\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport const REGISTRY_URL = 'https://registry.npmjs.org/';\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport hapic, { isClientError } from 'hapic';\nimport { REGISTRY_URL } from '../../constants.ts';\nimport { RegistryError } from './error.ts';\nimport type { IRegistryClient, Packument } from './types.ts';\n\nexport class HapicRegistryClient implements IRegistryClient {\n async getPackument(\n name: string,\n options: { registry: string; token?: string },\n ): Promise<Packument> {\n const path = encodeURIComponent(name)\n .replace(/^%40/, '@');\n\n const headers: Record<string, any> = {\n ACCEPT: 'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*',\n };\n\n if (options.token) {\n headers.AUTHORIZATION = `Bearer ${options.token}`;\n }\n\n try {\n const response = await hapic.get(\n new URL(path, options.registry || REGISTRY_URL).toString(),\n { headers },\n );\n\n return response.data;\n } catch (e) {\n if (isClientError(e)) {\n throw new RegistryError(e.message, e.statusCode || 500);\n }\n\n throw new RegistryError(`Registry request failed for ${name}`, 500);\n }\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { RegistryError } from './error.ts';\nimport type { IRegistryClient, Packument } from './types.ts';\n\nexport class MemoryRegistryClient implements IRegistryClient {\n private readonly items: Map<string, Packument>;\n\n // ----------------------------------------------------\n\n constructor(items: Record<string, Packument> = {}) {\n this.items = new Map(Object.entries(items));\n }\n\n // ----------------------------------------------------\n\n async getPackument(name: string): Promise<Packument> {\n const packument = this.items.get(name);\n if (!packument) {\n throw new RegistryError(`Package not found: ${name}`, 404);\n }\n return packument;\n }\n\n addPackument(name: string, packument: Packument): void {\n this.items.set(name, packument);\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ITokenProvider } from './types.ts';\n\nexport class ChainTokenProvider implements ITokenProvider {\n private readonly providers: ITokenProvider[];\n\n // ----------------------------------------------------\n\n constructor(providers: ITokenProvider[]) {\n this.providers = providers;\n }\n\n // ----------------------------------------------------\n\n async getToken(packageName: string, registry: string): Promise<string | undefined> {\n for (const provider of this.providers) {\n const token = await provider.getToken(packageName, registry);\n if (token) {\n return token;\n }\n }\n\n return undefined;\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ITokenProvider } from './types.ts';\n\nexport class EnvTokenProvider implements ITokenProvider {\n async getToken(_packageName: string, _registry: string): Promise<string | undefined> {\n return process.env.NODE_AUTH_TOKEN || undefined;\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ITokenProvider } from './types.ts';\n\nexport class MemoryTokenProvider implements ITokenProvider {\n private readonly token?: string;\n\n // ----------------------------------------------------\n\n constructor(token?: string) {\n this.token = token;\n }\n\n // ----------------------------------------------------\n\n async getToken(_packageName: string, _registry: string): Promise<string | undefined> {\n return this.token;\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ITokenProvider } from './types.ts';\n\ntype FetchFn = (url: string, init?: RequestInit) => Promise<Response>;\n\ntype OidcTokenProviderOptions = {\n requestUrl: string;\n requestToken: string;\n fetchFn?: FetchFn;\n maxRetries?: number;\n retryDelayMs?: number;\n};\n\nexport class OidcTokenProvider implements ITokenProvider {\n private readonly requestUrl: string;\n\n private readonly requestToken: string;\n\n private readonly fetchFn: FetchFn;\n\n private readonly maxRetries: number;\n\n private readonly retryDelayMs: number;\n\n private readonly tokenCache: Map<string, string>;\n\n // ----------------------------------------------------\n\n constructor(options: OidcTokenProviderOptions) {\n this.requestUrl = options.requestUrl;\n this.requestToken = options.requestToken;\n this.fetchFn = options.fetchFn ?? globalThis.fetch;\n this.maxRetries = options.maxRetries ?? 2;\n this.retryDelayMs = options.retryDelayMs ?? 1000;\n this.tokenCache = new Map();\n }\n\n // ----------------------------------------------------\n\n async getToken(packageName: string, registry: string): Promise<string | undefined> {\n const cacheKey = `${packageName}@${registry}`;\n const cached = this.tokenCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const audience = `npm:${new URL(registry).host}`;\n\n const separator = this.requestUrl.includes('?') ? '&' : '?';\n const oidcUrl = `${this.requestUrl}${separator}audience=${encodeURIComponent(audience)}`;\n\n const oidcResponse = await this.fetchWithRetry(oidcUrl, {\n headers: { Authorization: `Bearer ${this.requestToken}` },\n });\n\n if (!oidcResponse.ok) {\n throw new Error(\n `Failed to fetch OIDC token from GitHub: ${oidcResponse.status} ${oidcResponse.statusText}`,\n );\n }\n\n const oidcBody = await oidcResponse.json() as { value?: string };\n const idToken = oidcBody.value;\n if (!idToken) {\n throw new Error('OIDC response did not contain a valid token');\n }\n\n const encodedName = encodeURIComponent(packageName).replace(/^%40/, '@');\n const exchangeUrl = new URL(\n `/-/npm/v1/oidc/token/exchange/package/${encodedName}`,\n registry,\n ).toString();\n\n const exchangeResponse = await this.fetchWithRetry(exchangeUrl, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${idToken}`,\n },\n });\n\n if (!exchangeResponse.ok) {\n throw new Error(\n `Failed to exchange OIDC token with npm registry: ${exchangeResponse.status} ${exchangeResponse.statusText}`,\n );\n }\n\n const { token } = await exchangeResponse.json() as { token?: string };\n if (!token) {\n throw new Error('Token exchange response did not contain a valid token');\n }\n\n this.tokenCache.set(cacheKey, token);\n\n return token;\n }\n\n // ----------------------------------------------------\n\n private async fetchWithRetry(url: string, init?: RequestInit): Promise<Response> {\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n try {\n const response = await this.fetchFn(url, init);\n if (response.ok || response.status < 500) {\n return response;\n }\n\n if (attempt < this.maxRetries) {\n await this.delay(this.retryDelayMs * (attempt + 1));\n continue;\n }\n\n return response;\n } catch (e) {\n if (attempt >= this.maxRetries) {\n throw e;\n }\n\n await this.delay(this.retryDelayMs * (attempt + 1));\n }\n }\n\n throw new Error('Unreachable');\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport path from 'node:path';\nimport type { IPackagePublisher, IRegistryClient, Package } from './core/index.ts';\nimport { isRegistryError } from './core/index.ts';\n\nexport async function isPackagePublished(\n pkg: Package,\n registryClient: IRegistryClient,\n options: { registry: string; token?: string },\n): Promise<boolean> {\n const { name, version } = pkg.content;\n\n if (!name || !version) {\n throw new Error(`Name or version attribute is missing in ${pkg.path}`);\n }\n\n try {\n const { versions } = await registryClient.getPackument(name, options);\n if (typeof versions === 'undefined' || typeof versions[version] === 'undefined') {\n return false;\n }\n } catch (e) {\n if (isRegistryError(e) && e.statusCode === 404) {\n return false;\n }\n\n throw e;\n }\n\n return true;\n}\n\nexport async function publishPackage(\n pkg: Package,\n publisher: IPackagePublisher,\n options: { token?: string; registry: string },\n): Promise<boolean> {\n let pkgPath: string;\n if (path.isAbsolute(pkg.path)) {\n pkgPath = pkg.path;\n } else {\n pkgPath = path.resolve(pkg.path);\n }\n\n const publishOptions: Record<string, any> = {\n ...(pkg.content.publishConfig || {}),\n };\n\n if (\n options.token &&\n options.token.length > 0\n ) {\n const registry = options.registry || 'https://registry.npmjs.org/';\n const url = new URL(registry);\n const registryPath = url.pathname.replace(/\\/$/, '');\n\n publishOptions[`//${url.host}${registryPath}/:_authToken`] = options.token;\n }\n\n return publisher.publish(pkgPath, pkg.content, publishOptions);\n}\n\nexport function isPackagePublishable(pkg: Package): boolean {\n return !!pkg.content.name &&\n !pkg.content.private &&\n !!pkg.content.version;\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { hasOwnProperty } from 'hapic';\nimport semver from 'semver';\nimport type { Package } from './core/index.ts';\n\nexport function updatePackagesDependencies(packages: Package[]) {\n const pkgDir : Record<string, Package> = {};\n\n for (const package_ of packages) {\n pkgDir[package_.content.name] = package_;\n }\n\n for (const pkg of packages) {\n\n if (pkg.content.dependencies) {\n updatePackageDependenciesByType(pkg, 'dependencies', pkgDir);\n }\n\n if (pkg.content.devDependencies) {\n updatePackageDependenciesByType(pkg, 'devDependencies', pkgDir);\n }\n\n if (pkg.content.peerDependencies) {\n updatePackageDependenciesByType(pkg, 'peerDependencies', pkgDir);\n }\n }\n}\n\nfunction isDependencyWorkspaceProtocolValue(value: string) {\n return value.substring(0, 10) === 'workspace:';\n}\n\nfunction normalizeDependencyVersionValue(input: string, pkgVersion: string) : string {\n if (input.length === 1) {\n if (input === '~' || input === '^') {\n return input + pkgVersion;\n }\n\n return pkgVersion;\n }\n\n const firstCharacter = input.substring(0, 1);\n if (\n firstCharacter === '*' ||\n firstCharacter === '~' ||\n firstCharacter === '^'\n ) {\n if (semver.valid(input.substring(1))) {\n if (firstCharacter === '~' || firstCharacter === '^') {\n return firstCharacter + pkgVersion;\n }\n\n return pkgVersion;\n }\n\n return pkgVersion;\n }\n\n return pkgVersion;\n}\n\nfunction updatePackageDependenciesByType(\n pkg: Package,\n depType: 'dependencies' | 'devDependencies' | 'peerDependencies',\n pkgDir: Record<string, Package>,\n) {\n const dependencies = pkg.content[depType];\n if (!dependencies) {\n return;\n }\n\n const keys = Object.keys(dependencies);\n for (const key of keys) {\n const value = dependencies[key];\n if (!value || !isDependencyWorkspaceProtocolValue(value)) {\n continue;\n }\n\n if (!hasOwnProperty(pkgDir, key)) {\n pkg.valid = false;\n continue;\n }\n\n const depPkg = pkgDir[key];\n if (!depPkg) {\n pkg.valid = false;\n continue;\n }\n\n dependencies[key] = normalizeDependencyVersionValue(value.substring(10), depPkg.content.version);\n pkg.modified = true;\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport path from 'node:path';\nimport {\n EnvTokenProvider, HapicRegistryClient,\n MemoryTokenProvider, NodeFileSystem, NoopLogger, resolvePublisher,\n} from './core/index.ts';\nimport type {\n IFileSystem, ITokenProvider, Package, PackageJson,\n} from './core/index.ts';\nimport { REGISTRY_URL } from './constants.ts';\nimport {\n isPackagePublishable, isPackagePublished, publishPackage,\n} from './package.ts';\nimport { isError } from './utils/index.ts';\nimport { updatePackagesDependencies } from './package-dependency.ts';\nimport type { PublishOptions } from './types.ts';\n\nfunction resolveTokenProvider(options: PublishOptions): ITokenProvider {\n if (options.tokenProvider) {\n return options.tokenProvider;\n }\n\n if (options.token) {\n return new MemoryTokenProvider(options.token);\n }\n\n return new EnvTokenProvider();\n}\n\nasync function readWorkspacePackages(\n workspace: string[],\n cwd: string,\n fileSystem: IFileSystem,\n): Promise<Package[]> {\n const directories = await fileSystem.glob(workspace, {\n cwd,\n ignore: ['node_modules/**'],\n });\n\n const pkgs: Package[] = [];\n\n for (const directory of directories) {\n try {\n const raw = await fileSystem.readFile(\n path.posix.join(directory, 'package.json'),\n );\n const content: PackageJson = JSON.parse(raw);\n\n pkgs.push({\n path: directory,\n content,\n });\n } catch {\n // leave this unhandled.\n }\n }\n\n return pkgs;\n}\n\nexport async function publish(options: PublishOptions = {}): Promise<Package[]> {\n const cwd = options.cwd || process.cwd();\n const registry = options.registry || REGISTRY_URL;\n const rootPackage = options.rootPackage ?? true;\n\n const fileSystem = options.fileSystem ?? new NodeFileSystem();\n const registryClient = options.registryClient ?? new HapicRegistryClient();\n const publisher = options.publisher ?? await resolvePublisher();\n const tokenProvider = resolveTokenProvider(options);\n const logger = options.logger ?? new NoopLogger();\n\n const raw = await fileSystem.readFile(path.posix.join(cwd, 'package.json'));\n let pkg: PackageJson;\n try {\n pkg = JSON.parse(raw);\n } catch {\n throw new Error(`Invalid JSON in package.json at ${path.posix.join(cwd, 'package.json')}`);\n }\n\n const packages: Package[] = [];\n\n if (\n !Array.isArray(pkg.workspaces) &&\n !rootPackage\n ) {\n return [];\n }\n\n if (rootPackage) {\n packages.push({\n path: cwd,\n content: pkg,\n });\n }\n\n if (Array.isArray(pkg.workspaces)) {\n packages.push(...await readWorkspacePackages(pkg.workspaces, cwd, fileSystem));\n }\n\n updatePackagesDependencies(packages);\n\n const unpublishedPackages: Array<{ pkg: Package; token?: string }> = [];\n for (const p of packages) {\n\n if (!isPackagePublishable(p)) {\n continue;\n }\n\n if (p.valid === false) {\n logger.warn(`Skipping ${p.content.name}: unresolved workspace dependencies`);\n continue;\n }\n\n const token = await tokenProvider.getToken(p.content.name, registry);\n const published = await isPackagePublished(p, registryClient, { registry, token });\n if (published) {\n continue;\n }\n\n if (p.modified && !options.dryRun) {\n try {\n await fileSystem.writeFile(\n path.posix.join(p.path, 'package.json'),\n JSON.stringify(p.content),\n );\n } catch (e) {\n const message = isError(e) ? e.message : String(e);\n logger.warn(`Failed to write package.json for ${p.content.name}: ${message}`);\n continue;\n }\n }\n\n unpublishedPackages.push({ pkg: p, token });\n }\n\n if (unpublishedPackages.length === 0) {\n return [];\n }\n\n if (options.dryRun) {\n return unpublishedPackages.map((item) => item.pkg);\n }\n\n for (const { pkg: p, token } of unpublishedPackages) {\n p.published = await publishPackage(p, publisher, { token, registry });\n }\n\n return unpublishedPackages\n .map((item) => item.pkg)\n .filter((p) => !!p.published);\n}\n"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,86 @@
1
+ {
2
+ "name": "monoship",
3
+ "type": "module",
4
+ "version": "1.8.1",
5
+ "description": "A CLI tool and library for publishing packages from npm workspaces to registries.",
6
+ "author": {
7
+ "name": "Peter Placzek",
8
+ "email": "contact@tada5hi.net",
9
+ "url": "https://github.com/tada5hi"
10
+ },
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "https://github.com/tada5hi/monoship.git"
14
+ },
15
+ "module": "./dist/index.mjs",
16
+ "exports": {
17
+ "./package.json": "./package.json",
18
+ ".": {
19
+ "types": "./dist/index.d.mts",
20
+ "import": "./dist/index.mjs"
21
+ }
22
+ },
23
+ "files": [
24
+ "bin",
25
+ "dist"
26
+ ],
27
+ "engines": {
28
+ "node": ">=22.0.0"
29
+ },
30
+ "scripts": {
31
+ "build": "tsdown",
32
+ "commit": "npx git-cz",
33
+ "test": "cross-env NODE_ENV=test vitest run --config test/vitest.config.ts",
34
+ "test:coverage": "cross-env NODE_ENV=test vitest run --config test/vitest.config.ts --coverage",
35
+ "lint": "eslint .",
36
+ "lint:fix": "npm run lint -- --fix",
37
+ "prepare": "husky install",
38
+ "dev": "ts-node src/cli.ts",
39
+ "start": "node dist/cli.mjs"
40
+ },
41
+ "keywords": [
42
+ "monorepo",
43
+ "workspaces",
44
+ "publish",
45
+ "npm",
46
+ "registry",
47
+ "oidc",
48
+ "github-actions",
49
+ "ci",
50
+ "release"
51
+ ],
52
+ "bin": {
53
+ "monoship": "dist/cli.mjs"
54
+ },
55
+ "license": "MIT",
56
+ "dependencies": {
57
+ "cac": "^7.0.0",
58
+ "consola": "^3.4.2",
59
+ "fast-glob": "^3.3.3",
60
+ "hapic": "^2.8.2",
61
+ "libnpmpack": "^9.1.5",
62
+ "libnpmpublish": "^11.1.3",
63
+ "semver": "^7.7.4"
64
+ },
65
+ "devDependencies": {
66
+ "@tada5hi/commitlint-config": "^1.3.1",
67
+ "@tada5hi/eslint-config": "^2.0.2",
68
+ "@tada5hi/tsconfig": "^0.7.2",
69
+ "@types/libnpmpublish": "^9.0.1",
70
+ "@types/node": "^25.5.0",
71
+ "@types/pacote": "^11.1.8",
72
+ "@types/semver": "^7.7.1",
73
+ "@vitest/coverage-v8": "^4.1.0",
74
+ "cross-env": "^10.1.0",
75
+ "eslint": "^10.0.3",
76
+ "husky": "^9.1.7",
77
+ "tsdown": "^0.21.4",
78
+ "ts-node": "^10.9.2",
79
+ "typescript": "^5.9.3",
80
+ "typescript-eslint": "^8.57.1",
81
+ "vitest": "^4.0.18"
82
+ },
83
+ "publishConfig": {
84
+ "access": "public"
85
+ }
86
+ }