relizy 1.4.9 → 1.5.0-beta.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.
package/README.md CHANGED
@@ -54,7 +54,7 @@ Imagine you have multiple packages in your project (like a box with several toys
54
54
  - 🔗 Automatic dependency bumping for workspace dependencies
55
55
  - 🐙 GitHub, GitLab & Bitbucket support
56
56
  - 🔐 2FA/OTP support for npm publishing
57
- - 🎛️ Custom registry support (private registries, GitHub Packages, etc.)
57
+ - 🎛️ Custom registry support (private registries, GitHub Packages, etc.), with optional mirroring/routing to multiple registries (Nexus, JFrog, etc.)
58
58
  - ⚙️ Multiple configuration files support for different release workflows
59
59
  - 🔧 Support for npm, yarn, pnpm, and bun (auto-detected)
60
60
  - 📱 Social media integration (Twitter & Slack) for release announcements
package/dist/cli.mjs CHANGED
@@ -5,13 +5,14 @@ import process from 'node:process';
5
5
  import { fileURLToPath } from 'node:url';
6
6
  import { printBanner, logger } from '@maz-ui/node';
7
7
  import { Command } from 'commander';
8
- import { aA as isInCI, aB as getCIName, b as bump, c as changelog, g as publish, e as providerRelease, h as social, p as prComment, r as release } from './shared/relizy.C95AEGVa.mjs';
8
+ import { aD as isInCI, aE as getCIName, b as bump, c as changelog, g as publish, e as providerRelease, h as social, p as prComment, r as release } from './shared/relizy.wrrRuBuo.mjs';
9
9
  import 'node:child_process';
10
10
  import '@maz-ui/utils/helpers/formatJson';
11
11
  import 'c12';
12
12
  import 'changelogen';
13
13
  import 'defu';
14
14
  import '@inquirer/prompts';
15
+ import 'micromatch';
15
16
  import '@maz-ui/utils/helpers/getErrorMessage';
16
17
  import 'fast-glob';
17
18
  import 'semver';
package/dist/index.d.mts CHANGED
@@ -340,10 +340,51 @@ declare function detectPackageManager(cwd?: string): PackageManager;
340
340
  declare function determinePublishTag(version: string, configTag?: string): string;
341
341
  declare function getPackagesToPublishInSelectiveMode(sortedPackages: PackageBase[], rootVersion: string | undefined): PackageBase[];
342
342
  declare function getPackagesToPublishInIndependentMode(sortedPackages: PackageBase[], config: ResolvedRelizyConfig): Promise<PackageBase[]>;
343
- declare function getAuthCommand({ packageManager, config, otp, }: {
343
+ /**
344
+ * Resolve every distinct registry referenced by the config (legacy `registry`
345
+ * plus every `registries` entry, regardless of package scoping). Conservative
346
+ * fallback for the pre-publish authentication safety check when the package
347
+ * list to publish isn't known yet - prefer `resolveRegistryTargetsForPackages`
348
+ * once it is, so a registry scoped to packages outside this release doesn't
349
+ * needlessly block it.
350
+ *
351
+ * When no default `registry` is configured but explicit `registries` are, the
352
+ * legacy target degrades to an empty URL that would target the ambient
353
+ * `.npmrc` registry with no managed auth. It is a phantom in that case and is
354
+ * excluded, so a config that lists every registry explicitly does not
355
+ * authenticate against a bogus empty registry.
356
+ */
357
+ declare function resolveAllConfiguredRegistryTargets(config: ResolvedRelizyConfig): RegistryTarget[];
358
+ /**
359
+ * Resolve the registry targets a given package should be published to: the
360
+ * legacy registry (if any) plus every `registries` entry that either has no
361
+ * `packageFilter` (mirrored to all packages) or whose `packageFilter` glob
362
+ * patterns match the package name.
363
+ *
364
+ * The legacy/default registry is skipped for this package when either:
365
+ * - an applicable entry is marked `exclusive` - the package is published only
366
+ * to the matching registries instead of mirroring on top of the default one;
367
+ * - no default `registry` is configured yet the package already has at least
368
+ * one applicable explicit registry. Without a default, the legacy target
369
+ * degrades to an empty URL that would publish to the ambient `.npmrc`
370
+ * registry with no managed auth, so it is a phantom once real targets exist.
371
+ * When nothing else covers the package, the empty legacy target is kept as
372
+ * the historical `.npmrc` fallback.
373
+ */
374
+ declare function resolveRegistryTargetsForPackage(pkg: PackageBase, config: ResolvedRelizyConfig): RegistryTarget[];
375
+ /**
376
+ * Resolve every distinct registry actually needed to publish the given set of
377
+ * packages - the union of `resolveRegistryTargetsForPackage` across all of
378
+ * them, deduped by registry URL. Used for the pre-publish authentication
379
+ * safety check once the package list to publish is known, so a registry
380
+ * scoped to packages that are not part of this release does not block it.
381
+ */
382
+ declare function resolveRegistryTargetsForPackages(packages: PackageBase[], config: ResolvedRelizyConfig): RegistryTarget[];
383
+ declare function getAuthCommand({ packageManager, config, otp, registryTarget, }: {
344
384
  packageManager: PackageManager;
345
385
  config: ResolvedRelizyConfig;
346
386
  otp?: string;
387
+ registryTarget?: RegistryTarget;
347
388
  }): string;
348
389
  declare function publishPackage({ pkg, config, packageManager, dryRun, }: {
349
390
  pkg: PackageBase;
@@ -1198,6 +1239,57 @@ interface SocialOptions {
1198
1239
  * true = force-enable AI, false = force-disable AI, undefined = use config
1199
1240
  */
1200
1241
  ai?: boolean;
1242
+ /**
1243
+ * Prerelease suffix, forwarded to package discovery in independent mode
1244
+ * when no bump result is available (standalone `social` runs).
1245
+ */
1246
+ suffix?: string;
1247
+ /**
1248
+ * Force package discovery to include all packages (independent standalone runs).
1249
+ * @default false
1250
+ */
1251
+ force?: boolean;
1252
+ }
1253
+ interface RegistryTarget {
1254
+ /**
1255
+ * Optional label used in logs to identify this registry (e.g. `nexus-internal`)
1256
+ */
1257
+ name?: string;
1258
+ /**
1259
+ * Registry URL (e.g. `https://registry.npmjs.org/`, a Nexus or JFrog URL)
1260
+ */
1261
+ registry: string;
1262
+ /**
1263
+ * Registry token - only supported for pnpm and npm
1264
+ */
1265
+ token?: string;
1266
+ /**
1267
+ * Publish tag (e.g. `latest`)
1268
+ */
1269
+ tag?: string;
1270
+ /**
1271
+ * Publish access level (e.g. `public` or `restricted`)
1272
+ */
1273
+ access?: 'public' | 'restricted';
1274
+ /**
1275
+ * OTP for this registry (e.g. `123456`)
1276
+ */
1277
+ otp?: string;
1278
+ /**
1279
+ * Glob pattern matching package names this registry applies to. Distinct
1280
+ * from `PublishConfig.packages` (which packages get published at all) -
1281
+ * this only routes already-publishable packages to this registry.
1282
+ * Omitted or empty = applies to every publishable package (mirroring).
1283
+ */
1284
+ packageFilter?: string[];
1285
+ /**
1286
+ * When true, packages matched by this target are published ONLY to this
1287
+ * (and any other matching) registry - the default `publish.registry` is
1288
+ * skipped for them. Without this flag, `registries` is purely additive:
1289
+ * matched packages are published to this registry ON TOP OF the default one.
1290
+ * @default false
1291
+ */
1292
+ exclusive?: boolean;
1201
1293
  }
1202
1294
  type PublishConfig = ChangelogConfig$1['publish'] & {
1203
1295
  /**
@@ -1244,6 +1336,14 @@ type PublishConfig = ChangelogConfig$1['publish'] & {
1244
1336
  * @default 15000
1245
1337
  */
1246
1338
  safetyCheckTimeout?: number;
1339
+ /**
1340
+ * Additional registries to publish to, on top of `registry` (if set).
1341
+ * Entries without `packageFilter` apply to every package (mirroring);
1342
+ * entries with `packageFilter` only apply to packages matching one of the
1343
+ * glob patterns. Fully additive: leaving this unset preserves the
1344
+ * single-registry behavior.
1345
+ */
1346
+ registries?: RegistryTarget[];
1247
1347
  };
1248
1348
  interface PublishOptions extends PublishConfig {
1249
1349
  /**
@@ -1988,8 +2088,9 @@ declare function providerReleaseSafetyCheck({ config, provider }: {
1988
2088
  }): Promise<void>;
1989
2089
  declare function providerRelease(options?: Partial<ProviderReleaseOptions>): Promise<ProviderReleaseResult>;
1990
2090
 
1991
- declare function publishSafetyCheck({ config }: {
2091
+ declare function publishSafetyCheck({ config, packages }: {
1992
2092
  config: ResolvedRelizyConfig;
2093
+ packages?: PackageBase[];
1993
2094
  }): Promise<void>;
1994
2095
  declare function publish(options?: Partial<PublishOptions>): Promise<{
1995
2096
  publishedPackages: PackageBase[];
@@ -2002,5 +2103,5 @@ declare function socialSafetyCheck({ config }: {
2002
2103
  }): Promise<void>;
2003
2104
  declare function social(options?: Partial<SocialOptions>): Promise<SocialResult>;
2004
2105
 
2005
- export { NEW_PACKAGE_MARKER, PR_COMMENT_MARKER, buildChangelogBody, buildCommentBody, buildCompareLink, buildContributors, bump, capReleaseTypeForZeroMajor, changelog, checkGitStatusIfDirty, collectContributorNames, collectPackageBumps, confirmBump, createCommitAndTags, createGitlabRelease, defineConfig, detectGitProvider, detectPackageManager, detectPullRequest, determinePublishTag, determineReleaseType, determineSemverChange, executeBuildCmd, executeFormatCmd, executeHook, expandPackagesToBumpWithDependents, extractChangelogSummary, extractVersionFromPackageTag, extractVersionFromTag, fetchGitTags, filterOutPrivatePackages, findGitHubPR, findGitLabMR, findReachableCommitBySubject, formatChangelogForSlack, formatPackagesForSlack, formatSlackMessage, formatTweetMessage, generateChangelog, generateMarkDown, getAuthCommand, getBumpedIndependentPackages, getBumpedPackageIndependently, getCIName, getCanaryVersion, getCommitSubject, getCurrentGitBranch, getCurrentGitRef, getDefaultConfig, getDependentsOf, getFirstCommit, getGitStatus, getIndependentTag, getLastPackageTag, getLastRepoTag, getLastStableTag, getLastTag, getModifiedReleaseFilePatterns, getNpmRegistry, getPackageCommits, getPackageDependencies, getPackageNewVersion, getPackages, getPackagesOrBumpedPackages, getPackagesToPublishInIndependentMode, getPackagesToPublishInSelectiveMode, getPreid, getReleaseUrl, getRootPackage, getShortCommitSha, getSlackToken, getSlackWebhookUrl, getTwitterCredentials, github, gitlab, hasLernaJson, isAncestor, isBumpedPackage, isChangedPreid, isGraduating, isGraduatingToStableBetweenVersion, isInCI, isPrerelease, isPrereleaseReleaseType, isStableReleaseType, isTagVersionCompatibleWithCurrent, loadRelizyConfig, mergeTypes, parseChangelogMarkdown, parseGitRemoteUrl, postPrComment, postReleaseToSlack, postReleaseToTwitter, prComment, providerRelease, providerReleaseSafetyCheck, publish, publishPackage, publishSafetyCheck, pushCommitAndTags, pushTagForce, readPackageJson, readPackages, reconcileFromTag, redactSecrets, release, resetRewrittenTagCache, resolveTags, retagAnnotatedLocal, rollbackModifiedFiles, shouldFilterPrereleaseTags, social, socialSafetyCheck, tagExists, topologicalSort, updateLernaVersion, writeChangelogToFile, writeVersion };
2006
- export type { AIConfig, AIPromptTarget, AIProviderName, AISocialConfig, AISystemPromptOverrides, AITargetConfig, BumpConfig, BumpOptions, BumpResult, BumpResultFalsy, BumpResultTruthy, ChangelogConfig, ChangelogInclude, ChangelogOptions, ClaudeCodeProviderOptions, ConfigType, GitProvider, GitlabRelease, GitlabReleaseResponse, HookConfig, HookStep, HookType, MonorepoConfig, OnRewrittenTag, PackageBase, PackageBumpEntry, PackageManager, PostedRelease, PrCommentConfig, PrCommentMode, PrCommentOptions, PrCommentStatus, ProviderReleaseOptions, ProviderReleaseResult, PublishConfig, PublishOptions, PublishResponse, PullRequestInfo, ReadPackage, Reference, ReleaseConfig, ReleaseContext, ReleaseOptions, RelizyConfig, RepoConfig, ResolvedConfig, ResolvedRelizyConfig, ResolvedTags, ResolvedTwitterCredentials, RootPackage, SlackCredentials, SlackOptions, SlackPackageEntry, SlackSocialConfig, SocialConfig, SocialNetworkResult, SocialOptions, SocialResult, Step, TemplatesConfig, TokensConfig, TwitterCredentials, TwitterOptions, TwitterSocialConfig, VersionMode };
2106
+ export { NEW_PACKAGE_MARKER, PR_COMMENT_MARKER, buildChangelogBody, buildCommentBody, buildCompareLink, buildContributors, bump, capReleaseTypeForZeroMajor, changelog, checkGitStatusIfDirty, collectContributorNames, collectPackageBumps, confirmBump, createCommitAndTags, createGitlabRelease, defineConfig, detectGitProvider, detectPackageManager, detectPullRequest, determinePublishTag, determineReleaseType, determineSemverChange, executeBuildCmd, executeFormatCmd, executeHook, expandPackagesToBumpWithDependents, extractChangelogSummary, extractVersionFromPackageTag, extractVersionFromTag, fetchGitTags, filterOutPrivatePackages, findGitHubPR, findGitLabMR, findReachableCommitBySubject, formatChangelogForSlack, formatPackagesForSlack, formatSlackMessage, formatTweetMessage, generateChangelog, generateMarkDown, getAuthCommand, getBumpedIndependentPackages, getBumpedPackageIndependently, getCIName, getCanaryVersion, getCommitSubject, getCurrentGitBranch, getCurrentGitRef, getDefaultConfig, getDependentsOf, getFirstCommit, getGitStatus, getIndependentTag, getLastPackageTag, getLastRepoTag, getLastStableTag, getLastTag, getModifiedReleaseFilePatterns, getNpmRegistry, getPackageCommits, getPackageDependencies, getPackageNewVersion, getPackages, getPackagesOrBumpedPackages, getPackagesToPublishInIndependentMode, getPackagesToPublishInSelectiveMode, getPreid, getReleaseUrl, getRootPackage, getShortCommitSha, getSlackToken, getSlackWebhookUrl, getTwitterCredentials, github, gitlab, hasLernaJson, isAncestor, isBumpedPackage, isChangedPreid, isGraduating, isGraduatingToStableBetweenVersion, isInCI, isPrerelease, isPrereleaseReleaseType, isStableReleaseType, isTagVersionCompatibleWithCurrent, loadRelizyConfig, mergeTypes, parseChangelogMarkdown, parseGitRemoteUrl, postPrComment, postReleaseToSlack, postReleaseToTwitter, prComment, providerRelease, providerReleaseSafetyCheck, publish, publishPackage, publishSafetyCheck, pushCommitAndTags, pushTagForce, readPackageJson, readPackages, reconcileFromTag, redactSecrets, release, resetRewrittenTagCache, resolveAllConfiguredRegistryTargets, resolveRegistryTargetsForPackage, resolveRegistryTargetsForPackages, resolveTags, retagAnnotatedLocal, rollbackModifiedFiles, shouldFilterPrereleaseTags, social, socialSafetyCheck, tagExists, topologicalSort, updateLernaVersion, writeChangelogToFile, writeVersion };
2107
+ export type { AIConfig, AIPromptTarget, AIProviderName, AISocialConfig, AISystemPromptOverrides, AITargetConfig, BumpConfig, BumpOptions, BumpResult, BumpResultFalsy, BumpResultTruthy, ChangelogConfig, ChangelogInclude, ChangelogOptions, ClaudeCodeProviderOptions, ConfigType, GitProvider, GitlabRelease, GitlabReleaseResponse, HookConfig, HookStep, HookType, MonorepoConfig, OnRewrittenTag, PackageBase, PackageBumpEntry, PackageManager, PostedRelease, PrCommentConfig, PrCommentMode, PrCommentOptions, PrCommentStatus, ProviderReleaseOptions, ProviderReleaseResult, PublishConfig, PublishOptions, PublishResponse, PullRequestInfo, ReadPackage, Reference, RegistryTarget, ReleaseConfig, ReleaseContext, ReleaseOptions, RelizyConfig, RepoConfig, ResolvedConfig, ResolvedRelizyConfig, ResolvedTags, ResolvedTwitterCredentials, RootPackage, SlackCredentials, SlackOptions, SlackPackageEntry, SlackSocialConfig, SocialConfig, SocialNetworkResult, SocialOptions, SocialResult, Step, TemplatesConfig, TokensConfig, TwitterCredentials, TwitterOptions, TwitterSocialConfig, VersionMode };
package/dist/index.d.ts CHANGED
@@ -340,10 +340,51 @@ declare function detectPackageManager(cwd?: string): PackageManager;
340
340
  declare function determinePublishTag(version: string, configTag?: string): string;
341
341
  declare function getPackagesToPublishInSelectiveMode(sortedPackages: PackageBase[], rootVersion: string | undefined): PackageBase[];
342
342
  declare function getPackagesToPublishInIndependentMode(sortedPackages: PackageBase[], config: ResolvedRelizyConfig): Promise<PackageBase[]>;
343
- declare function getAuthCommand({ packageManager, config, otp, }: {
343
+ /**
344
+ * Resolve every distinct registry referenced by the config (legacy `registry`
345
+ * plus every `registries` entry, regardless of package scoping). Conservative
346
+ * fallback for the pre-publish authentication safety check when the package
347
+ * list to publish isn't known yet - prefer `resolveRegistryTargetsForPackages`
348
+ * once it is, so a registry scoped to packages outside this release doesn't
349
+ * needlessly block it.
350
+ *
351
+ * When no default `registry` is configured but explicit `registries` are, the
352
+ * legacy target degrades to an empty URL that would target the ambient
353
+ * `.npmrc` registry with no managed auth. It is a phantom in that case and is
354
+ * excluded, so a config that lists every registry explicitly does not
355
+ * authenticate against a bogus empty registry.
356
+ */
357
+ declare function resolveAllConfiguredRegistryTargets(config: ResolvedRelizyConfig): RegistryTarget[];
358
+ /**
359
+ * Resolve the registry targets a given package should be published to: the
360
+ * legacy registry (if any) plus every `registries` entry that either has no
361
+ * `packageFilter` (mirrored to all packages) or whose `packageFilter` glob
362
+ * patterns match the package name.
363
+ *
364
+ * The legacy/default registry is skipped for this package when either:
365
+ * - an applicable entry is marked `exclusive` - the package is published only
366
+ * to the matching registries instead of mirroring on top of the default one;
367
+ * - no default `registry` is configured yet the package already has at least
368
+ * one applicable explicit registry. Without a default, the legacy target
369
+ * degrades to an empty URL that would publish to the ambient `.npmrc`
370
+ * registry with no managed auth, so it is a phantom once real targets exist.
371
+ * When nothing else covers the package, the empty legacy target is kept as
372
+ * the historical `.npmrc` fallback.
373
+ */
374
+ declare function resolveRegistryTargetsForPackage(pkg: PackageBase, config: ResolvedRelizyConfig): RegistryTarget[];
375
+ /**
376
+ * Resolve every distinct registry actually needed to publish the given set of
377
+ * packages - the union of `resolveRegistryTargetsForPackage` across all of
378
+ * them, deduped by registry URL. Used for the pre-publish authentication
379
+ * safety check once the package list to publish is known, so a registry
380
+ * scoped to packages that are not part of this release does not block it.
381
+ */
382
+ declare function resolveRegistryTargetsForPackages(packages: PackageBase[], config: ResolvedRelizyConfig): RegistryTarget[];
383
+ declare function getAuthCommand({ packageManager, config, otp, registryTarget, }: {
344
384
  packageManager: PackageManager;
345
385
  config: ResolvedRelizyConfig;
346
386
  otp?: string;
387
+ registryTarget?: RegistryTarget;
347
388
  }): string;
348
389
  declare function publishPackage({ pkg, config, packageManager, dryRun, }: {
349
390
  pkg: PackageBase;
@@ -1198,6 +1239,57 @@ interface SocialOptions {
1198
1239
  * true = force-enable AI, false = force-disable AI, undefined = use config
1199
1240
  */
1200
1241
  ai?: boolean;
1242
+ /**
1243
+ * Prerelease suffix, forwarded to package discovery in independent mode
1244
+ * when no bump result is available (standalone `social` runs).
1245
+ */
1246
+ suffix?: string;
1247
+ /**
1248
+ * Force package discovery to include all packages (independent standalone runs).
1249
+ * @default false
1250
+ */
1251
+ force?: boolean;
1252
+ }
1253
+ interface RegistryTarget {
1254
+ /**
1255
+ * Optional label used in logs to identify this registry (e.g. `nexus-internal`)
1256
+ */
1257
+ name?: string;
1258
+ /**
1259
+ * Registry URL (e.g. `https://registry.npmjs.org/`, a Nexus or JFrog URL)
1260
+ */
1261
+ registry: string;
1262
+ /**
1263
+ * Registry token - only supported for pnpm and npm
1264
+ */
1265
+ token?: string;
1266
+ /**
1267
+ * Publish tag (e.g. `latest`)
1268
+ */
1269
+ tag?: string;
1270
+ /**
1271
+ * Publish access level (e.g. `public` or `restricted`)
1272
+ */
1273
+ access?: 'public' | 'restricted';
1274
+ /**
1275
+ * OTP for this registry (e.g. `123456`)
1276
+ */
1277
+ otp?: string;
1278
+ /**
1279
+ * Glob pattern matching package names this registry applies to. Distinct
1280
+ * from `PublishConfig.packages` (which packages get published at all) -
1281
+ * this only routes already-publishable packages to this registry.
1282
+ * Omitted or empty = applies to every publishable package (mirroring).
1283
+ */
1284
+ packageFilter?: string[];
1285
+ /**
1286
+ * When true, packages matched by this target are published ONLY to this
1287
+ * (and any other matching) registry - the default `publish.registry` is
1288
+ * skipped for them. Without this flag, `registries` is purely additive:
1289
+ * matched packages are published to this registry ON TOP OF the default one.
1290
+ * @default false
1291
+ */
1292
+ exclusive?: boolean;
1201
1293
  }
1202
1294
  type PublishConfig = ChangelogConfig$1['publish'] & {
1203
1295
  /**
@@ -1244,6 +1336,14 @@ type PublishConfig = ChangelogConfig$1['publish'] & {
1244
1336
  * @default 15000
1245
1337
  */
1246
1338
  safetyCheckTimeout?: number;
1339
+ /**
1340
+ * Additional registries to publish to, on top of `registry` (if set).
1341
+ * Entries without `packageFilter` apply to every package (mirroring);
1342
+ * entries with `packageFilter` only apply to packages matching one of the
1343
+ * glob patterns. Fully additive: leaving this unset preserves the
1344
+ * single-registry behavior.
1345
+ */
1346
+ registries?: RegistryTarget[];
1247
1347
  };
1248
1348
  interface PublishOptions extends PublishConfig {
1249
1349
  /**
@@ -1988,8 +2088,9 @@ declare function providerReleaseSafetyCheck({ config, provider }: {
1988
2088
  }): Promise<void>;
1989
2089
  declare function providerRelease(options?: Partial<ProviderReleaseOptions>): Promise<ProviderReleaseResult>;
1990
2090
 
1991
- declare function publishSafetyCheck({ config }: {
2091
+ declare function publishSafetyCheck({ config, packages }: {
1992
2092
  config: ResolvedRelizyConfig;
2093
+ packages?: PackageBase[];
1993
2094
  }): Promise<void>;
1994
2095
  declare function publish(options?: Partial<PublishOptions>): Promise<{
1995
2096
  publishedPackages: PackageBase[];
@@ -2002,5 +2103,5 @@ declare function socialSafetyCheck({ config }: {
2002
2103
  }): Promise<void>;
2003
2104
  declare function social(options?: Partial<SocialOptions>): Promise<SocialResult>;
2004
2105
 
2005
- export { NEW_PACKAGE_MARKER, PR_COMMENT_MARKER, buildChangelogBody, buildCommentBody, buildCompareLink, buildContributors, bump, capReleaseTypeForZeroMajor, changelog, checkGitStatusIfDirty, collectContributorNames, collectPackageBumps, confirmBump, createCommitAndTags, createGitlabRelease, defineConfig, detectGitProvider, detectPackageManager, detectPullRequest, determinePublishTag, determineReleaseType, determineSemverChange, executeBuildCmd, executeFormatCmd, executeHook, expandPackagesToBumpWithDependents, extractChangelogSummary, extractVersionFromPackageTag, extractVersionFromTag, fetchGitTags, filterOutPrivatePackages, findGitHubPR, findGitLabMR, findReachableCommitBySubject, formatChangelogForSlack, formatPackagesForSlack, formatSlackMessage, formatTweetMessage, generateChangelog, generateMarkDown, getAuthCommand, getBumpedIndependentPackages, getBumpedPackageIndependently, getCIName, getCanaryVersion, getCommitSubject, getCurrentGitBranch, getCurrentGitRef, getDefaultConfig, getDependentsOf, getFirstCommit, getGitStatus, getIndependentTag, getLastPackageTag, getLastRepoTag, getLastStableTag, getLastTag, getModifiedReleaseFilePatterns, getNpmRegistry, getPackageCommits, getPackageDependencies, getPackageNewVersion, getPackages, getPackagesOrBumpedPackages, getPackagesToPublishInIndependentMode, getPackagesToPublishInSelectiveMode, getPreid, getReleaseUrl, getRootPackage, getShortCommitSha, getSlackToken, getSlackWebhookUrl, getTwitterCredentials, github, gitlab, hasLernaJson, isAncestor, isBumpedPackage, isChangedPreid, isGraduating, isGraduatingToStableBetweenVersion, isInCI, isPrerelease, isPrereleaseReleaseType, isStableReleaseType, isTagVersionCompatibleWithCurrent, loadRelizyConfig, mergeTypes, parseChangelogMarkdown, parseGitRemoteUrl, postPrComment, postReleaseToSlack, postReleaseToTwitter, prComment, providerRelease, providerReleaseSafetyCheck, publish, publishPackage, publishSafetyCheck, pushCommitAndTags, pushTagForce, readPackageJson, readPackages, reconcileFromTag, redactSecrets, release, resetRewrittenTagCache, resolveTags, retagAnnotatedLocal, rollbackModifiedFiles, shouldFilterPrereleaseTags, social, socialSafetyCheck, tagExists, topologicalSort, updateLernaVersion, writeChangelogToFile, writeVersion };
2006
- export type { AIConfig, AIPromptTarget, AIProviderName, AISocialConfig, AISystemPromptOverrides, AITargetConfig, BumpConfig, BumpOptions, BumpResult, BumpResultFalsy, BumpResultTruthy, ChangelogConfig, ChangelogInclude, ChangelogOptions, ClaudeCodeProviderOptions, ConfigType, GitProvider, GitlabRelease, GitlabReleaseResponse, HookConfig, HookStep, HookType, MonorepoConfig, OnRewrittenTag, PackageBase, PackageBumpEntry, PackageManager, PostedRelease, PrCommentConfig, PrCommentMode, PrCommentOptions, PrCommentStatus, ProviderReleaseOptions, ProviderReleaseResult, PublishConfig, PublishOptions, PublishResponse, PullRequestInfo, ReadPackage, Reference, ReleaseConfig, ReleaseContext, ReleaseOptions, RelizyConfig, RepoConfig, ResolvedConfig, ResolvedRelizyConfig, ResolvedTags, ResolvedTwitterCredentials, RootPackage, SlackCredentials, SlackOptions, SlackPackageEntry, SlackSocialConfig, SocialConfig, SocialNetworkResult, SocialOptions, SocialResult, Step, TemplatesConfig, TokensConfig, TwitterCredentials, TwitterOptions, TwitterSocialConfig, VersionMode };
2106
+ export { NEW_PACKAGE_MARKER, PR_COMMENT_MARKER, buildChangelogBody, buildCommentBody, buildCompareLink, buildContributors, bump, capReleaseTypeForZeroMajor, changelog, checkGitStatusIfDirty, collectContributorNames, collectPackageBumps, confirmBump, createCommitAndTags, createGitlabRelease, defineConfig, detectGitProvider, detectPackageManager, detectPullRequest, determinePublishTag, determineReleaseType, determineSemverChange, executeBuildCmd, executeFormatCmd, executeHook, expandPackagesToBumpWithDependents, extractChangelogSummary, extractVersionFromPackageTag, extractVersionFromTag, fetchGitTags, filterOutPrivatePackages, findGitHubPR, findGitLabMR, findReachableCommitBySubject, formatChangelogForSlack, formatPackagesForSlack, formatSlackMessage, formatTweetMessage, generateChangelog, generateMarkDown, getAuthCommand, getBumpedIndependentPackages, getBumpedPackageIndependently, getCIName, getCanaryVersion, getCommitSubject, getCurrentGitBranch, getCurrentGitRef, getDefaultConfig, getDependentsOf, getFirstCommit, getGitStatus, getIndependentTag, getLastPackageTag, getLastRepoTag, getLastStableTag, getLastTag, getModifiedReleaseFilePatterns, getNpmRegistry, getPackageCommits, getPackageDependencies, getPackageNewVersion, getPackages, getPackagesOrBumpedPackages, getPackagesToPublishInIndependentMode, getPackagesToPublishInSelectiveMode, getPreid, getReleaseUrl, getRootPackage, getShortCommitSha, getSlackToken, getSlackWebhookUrl, getTwitterCredentials, github, gitlab, hasLernaJson, isAncestor, isBumpedPackage, isChangedPreid, isGraduating, isGraduatingToStableBetweenVersion, isInCI, isPrerelease, isPrereleaseReleaseType, isStableReleaseType, isTagVersionCompatibleWithCurrent, loadRelizyConfig, mergeTypes, parseChangelogMarkdown, parseGitRemoteUrl, postPrComment, postReleaseToSlack, postReleaseToTwitter, prComment, providerRelease, providerReleaseSafetyCheck, publish, publishPackage, publishSafetyCheck, pushCommitAndTags, pushTagForce, readPackageJson, readPackages, reconcileFromTag, redactSecrets, release, resetRewrittenTagCache, resolveAllConfiguredRegistryTargets, resolveRegistryTargetsForPackage, resolveRegistryTargetsForPackages, resolveTags, retagAnnotatedLocal, rollbackModifiedFiles, shouldFilterPrereleaseTags, social, socialSafetyCheck, tagExists, topologicalSort, updateLernaVersion, writeChangelogToFile, writeVersion };
2107
+ export type { AIConfig, AIPromptTarget, AIProviderName, AISocialConfig, AISystemPromptOverrides, AITargetConfig, BumpConfig, BumpOptions, BumpResult, BumpResultFalsy, BumpResultTruthy, ChangelogConfig, ChangelogInclude, ChangelogOptions, ClaudeCodeProviderOptions, ConfigType, GitProvider, GitlabRelease, GitlabReleaseResponse, HookConfig, HookStep, HookType, MonorepoConfig, OnRewrittenTag, PackageBase, PackageBumpEntry, PackageManager, PostedRelease, PrCommentConfig, PrCommentMode, PrCommentOptions, PrCommentStatus, ProviderReleaseOptions, ProviderReleaseResult, PublishConfig, PublishOptions, PublishResponse, PullRequestInfo, ReadPackage, Reference, RegistryTarget, ReleaseConfig, ReleaseContext, ReleaseOptions, RelizyConfig, RepoConfig, ResolvedConfig, ResolvedRelizyConfig, ResolvedTags, ResolvedTwitterCredentials, RootPackage, SlackCredentials, SlackOptions, SlackPackageEntry, SlackSocialConfig, SocialConfig, SocialNetworkResult, SocialOptions, SocialResult, Step, TemplatesConfig, TokensConfig, TwitterCredentials, TwitterOptions, TwitterSocialConfig, VersionMode };
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- export { au as NEW_PACKAGE_MARKER, a6 as PR_COMMENT_MARKER, S as buildChangelogBody, a as buildCommentBody, R as buildCompareLink, U as buildContributors, b as bump, aI as capReleaseTypeForZeroMajor, c as changelog, v as checkGitStatusIfDirty, T as collectContributorNames, a2 as collectPackageBumps, aW as confirmBump, B as createCommitAndTags, P as createGitlabRelease, k as defineConfig, y as detectGitProvider, Y as detectPackageManager, a5 as detectPullRequest, Z as determinePublishTag, aK as determineReleaseType, aJ as determineSemverChange, aD as executeBuildCmd, aC as executeFormatCmd, az as executeHook, q as expandPackagesToBumpWithDependents, an as extractChangelogSummary, aO as extractVersionFromPackageTag, aZ as extractVersionFromTag, x as fetchGitTags, aF as filterOutPrivatePackages, a3 as findGitHubPR, a4 as findGitLabMR, K as findReachableCommitBySubject, aj as formatChangelogForSlack, ak as formatPackagesForSlack, al as formatSlackMessage, ax as formatTweetMessage, i as generateChangelog, V as generateMarkDown, a0 as getAuthCommand, aX as getBumpedIndependentPackages, aV as getBumpedPackageIndependently, aB as getCIName, a_ as getCanaryVersion, J as getCommitSubject, F as getCurrentGitBranch, G as getCurrentGitRef, j as getDefaultConfig, o as getDependentsOf, E as getFirstCommit, u as getGitStatus, ap as getIndependentTag, at as getLastPackageTag, as as getLastRepoTag, aq as getLastStableTag, ar as getLastTag, A as getModifiedReleaseFilePatterns, X as getNpmRegistry, ad as getPackageCommits, n as getPackageDependencies, aM as getPackageNewVersion, ac as getPackages, aG as getPackagesOrBumpedPackages, $ as getPackagesToPublishInIndependentMode, _ as getPackagesToPublishInSelectiveMode, aT as getPreid, ao as getReleaseUrl, aa as getRootPackage, H as getShortCommitSha, ah as getSlackToken, ai as getSlackWebhookUrl, aw as getTwitterCredentials, O as github, Q as gitlab, ae as hasLernaJson, I as isAncestor, aE as isBumpedPackage, aU as isChangedPreid, aS as isGraduating, aH as isGraduatingToStableBetweenVersion, aA as isInCI, aP as isPrerelease, aR as isPrereleaseReleaseType, aQ as isStableReleaseType, a$ as isTagVersionCompatibleWithCurrent, l as loadRelizyConfig, m as mergeTypes, W as parseChangelogMarkdown, z as parseGitRemoteUrl, a7 as postPrComment, am as postReleaseToSlack, ay as postReleaseToTwitter, p as prComment, e as providerRelease, d as providerReleaseSafetyCheck, g as publish, a1 as publishPackage, f as publishSafetyCheck, C as pushCommitAndTags, N as pushTagForce, a9 as readPackageJson, ab as readPackages, ag as reconcileFromTag, a8 as redactSecrets, r as release, af as resetRewrittenTagCache, av as resolveTags, M as retagAnnotatedLocal, D as rollbackModifiedFiles, aY as shouldFilterPrereleaseTags, h as social, s as socialSafetyCheck, L as tagExists, t as topologicalSort, aN as updateLernaVersion, w as writeChangelogToFile, aL as writeVersion } from './shared/relizy.C95AEGVa.mjs';
1
+ export { ax as NEW_PACKAGE_MARKER, a9 as PR_COMMENT_MARKER, S as buildChangelogBody, a as buildCommentBody, R as buildCompareLink, U as buildContributors, b as bump, aL as capReleaseTypeForZeroMajor, c as changelog, v as checkGitStatusIfDirty, T as collectContributorNames, a5 as collectPackageBumps, aZ as confirmBump, B as createCommitAndTags, P as createGitlabRelease, k as defineConfig, y as detectGitProvider, Y as detectPackageManager, a8 as detectPullRequest, Z as determinePublishTag, aN as determineReleaseType, aM as determineSemverChange, aG as executeBuildCmd, aF as executeFormatCmd, aC as executeHook, q as expandPackagesToBumpWithDependents, aq as extractChangelogSummary, aR as extractVersionFromPackageTag, b0 as extractVersionFromTag, x as fetchGitTags, aI as filterOutPrivatePackages, a6 as findGitHubPR, a7 as findGitLabMR, K as findReachableCommitBySubject, am as formatChangelogForSlack, an as formatPackagesForSlack, ao as formatSlackMessage, aA as formatTweetMessage, i as generateChangelog, V as generateMarkDown, a3 as getAuthCommand, a_ as getBumpedIndependentPackages, aY as getBumpedPackageIndependently, aE as getCIName, b1 as getCanaryVersion, J as getCommitSubject, F as getCurrentGitBranch, G as getCurrentGitRef, j as getDefaultConfig, o as getDependentsOf, E as getFirstCommit, u as getGitStatus, as as getIndependentTag, aw as getLastPackageTag, av as getLastRepoTag, at as getLastStableTag, au as getLastTag, A as getModifiedReleaseFilePatterns, X as getNpmRegistry, ag as getPackageCommits, n as getPackageDependencies, aP as getPackageNewVersion, af as getPackages, aJ as getPackagesOrBumpedPackages, $ as getPackagesToPublishInIndependentMode, _ as getPackagesToPublishInSelectiveMode, aW as getPreid, ar as getReleaseUrl, ad as getRootPackage, H as getShortCommitSha, ak as getSlackToken, al as getSlackWebhookUrl, az as getTwitterCredentials, O as github, Q as gitlab, ah as hasLernaJson, I as isAncestor, aH as isBumpedPackage, aX as isChangedPreid, aV as isGraduating, aK as isGraduatingToStableBetweenVersion, aD as isInCI, aS as isPrerelease, aU as isPrereleaseReleaseType, aT as isStableReleaseType, b2 as isTagVersionCompatibleWithCurrent, l as loadRelizyConfig, m as mergeTypes, W as parseChangelogMarkdown, z as parseGitRemoteUrl, aa as postPrComment, ap as postReleaseToSlack, aB as postReleaseToTwitter, p as prComment, e as providerRelease, d as providerReleaseSafetyCheck, g as publish, a4 as publishPackage, f as publishSafetyCheck, C as pushCommitAndTags, N as pushTagForce, ac as readPackageJson, ae as readPackages, aj as reconcileFromTag, ab as redactSecrets, r as release, ai as resetRewrittenTagCache, a0 as resolveAllConfiguredRegistryTargets, a1 as resolveRegistryTargetsForPackage, a2 as resolveRegistryTargetsForPackages, ay as resolveTags, M as retagAnnotatedLocal, D as rollbackModifiedFiles, a$ as shouldFilterPrereleaseTags, h as social, s as socialSafetyCheck, L as tagExists, t as topologicalSort, aQ as updateLernaVersion, w as writeChangelogToFile, aO as writeVersion } from './shared/relizy.wrrRuBuo.mjs';
2
2
  import '@maz-ui/node';
3
3
  import 'node:child_process';
4
4
  import 'node:process';
@@ -9,6 +9,7 @@ import 'defu';
9
9
  import 'node:fs';
10
10
  import 'node:path';
11
11
  import '@inquirer/prompts';
12
+ import 'micromatch';
12
13
  import '@maz-ui/utils/helpers/getErrorMessage';
13
14
  import 'fast-glob';
14
15
  import 'semver';
@@ -8,6 +8,7 @@ import { defu } from 'defu';
8
8
  import { existsSync, readFileSync, statSync, writeFileSync } from 'node:fs';
9
9
  import path, { join, relative, sep } from 'node:path';
10
10
  import { select, confirm, input } from '@inquirer/prompts';
11
+ import micromatch from 'micromatch';
11
12
  import { getErrorMessage } from '@maz-ui/utils/helpers/getErrorMessage';
12
13
  import fastGlob from 'fast-glob';
13
14
  import * as semver from 'semver';
@@ -1803,7 +1804,7 @@ async function getPackagesOrBumpedPackages({
1803
1804
  }
1804
1805
 
1805
1806
  const DEFAULT_REGISTRY = "https://registry.npmjs.org/";
1806
- let sessionOtp;
1807
+ const sessionOtpByRegistry = /* @__PURE__ */ new Map();
1807
1808
  function getNpmRegistry(cwd = process.cwd()) {
1808
1809
  try {
1809
1810
  const output = execSync("npm config get registry", {
@@ -1906,21 +1907,74 @@ async function getPackagesToPublishInIndependentMode(sortedPackages, config) {
1906
1907
  function isYarnBerry() {
1907
1908
  return existsSync(path.join(process.cwd(), ".yarnrc.yml"));
1908
1909
  }
1910
+ function buildLegacyRegistryTarget(config) {
1911
+ return {
1912
+ name: "default",
1913
+ registry: config.publish.registry ?? "",
1914
+ token: config.publish.token || config.tokens.registry,
1915
+ tag: config.publish.tag,
1916
+ access: config.publish.access,
1917
+ otp: config.publish.otp
1918
+ };
1919
+ }
1920
+ function normalizeRegistryKey(registry) {
1921
+ return registry.endsWith("/") ? registry.slice(0, -1) : registry;
1922
+ }
1923
+ function dedupRegistryTargets(targets) {
1924
+ const seen = /* @__PURE__ */ new Set();
1925
+ const result = [];
1926
+ for (const target of targets) {
1927
+ const key = normalizeRegistryKey(target.registry || "");
1928
+ if (seen.has(key)) {
1929
+ logger.debug(`Skipping duplicate registry target "${target.name ?? target.registry}"`);
1930
+ continue;
1931
+ }
1932
+ seen.add(key);
1933
+ result.push(target);
1934
+ }
1935
+ return result;
1936
+ }
1937
+ function resolveAllConfiguredRegistryTargets(config) {
1938
+ const legacyTarget = buildLegacyRegistryTarget(config);
1939
+ const explicitTargets = config.publish.registries ?? [];
1940
+ const skipEmptyDefault = !config.publish.registry && explicitTargets.length > 0;
1941
+ return dedupRegistryTargets([
1942
+ ...skipEmptyDefault ? [] : [legacyTarget],
1943
+ ...explicitTargets
1944
+ ]);
1945
+ }
1946
+ function resolveRegistryTargetsForPackage(pkg, config) {
1947
+ const legacyTarget = buildLegacyRegistryTarget(config);
1948
+ const explicitTargets = config.publish.registries ?? [];
1949
+ const applicableTargets = explicitTargets.filter(
1950
+ (target) => !target.packageFilter?.length || micromatch.isMatch(pkg.name, target.packageFilter)
1951
+ );
1952
+ const skipForExclusive = applicableTargets.some((target) => target.exclusive);
1953
+ const skipEmptyDefault = !config.publish.registry && applicableTargets.length > 0;
1954
+ return dedupRegistryTargets([
1955
+ ...skipForExclusive || skipEmptyDefault ? [] : [legacyTarget],
1956
+ ...applicableTargets
1957
+ ]);
1958
+ }
1959
+ function resolveRegistryTargetsForPackages(packages, config) {
1960
+ const allTargets = packages.flatMap((pkg) => resolveRegistryTargetsForPackage(pkg, config));
1961
+ return dedupRegistryTargets(allTargets);
1962
+ }
1909
1963
  function getCommandArgs({
1910
1964
  packageManager,
1911
1965
  tag,
1912
- config,
1966
+ registryTarget,
1913
1967
  otp,
1914
1968
  type,
1915
1969
  dryRun
1916
1970
  }) {
1917
1971
  const args = type === "publish" ? ["publish", "--tag", tag] : ["whoami"];
1918
- const registry = config.publish.registry;
1972
+ const registry = registryTarget.registry;
1919
1973
  if (registry) {
1920
1974
  args.push("--registry", registry);
1921
1975
  }
1922
1976
  const isPnpmOrNpm = packageManager === "pnpm" || packageManager === "npm";
1923
- const publishToken = config.publish.token || config.tokens.registry;
1977
+ const publishToken = registryTarget.token;
1924
1978
  if (publishToken) {
1925
1979
  if (!registry) {
1926
1980
  logger.warn("Publish token provided but no registry specified");
@@ -1932,14 +1986,14 @@ function getCommandArgs({
1932
1986
  args.push(authTokenKey);
1933
1987
  }
1934
1988
  }
1935
- const finalOtp = otp ?? sessionOtp ?? config.publish.otp;
1989
+ const finalOtp = otp ?? sessionOtpByRegistry.get(normalizeRegistryKey(registry)) ?? registryTarget.otp;
1936
1990
  if (finalOtp) {
1937
1991
  args.push("--otp", finalOtp);
1938
1992
  }
1939
1993
  if (type === "auth") {
1940
1994
  return args;
1941
1995
  }
1942
- const access = config.publish.access;
1996
+ const access = registryTarget.access;
1943
1997
  if (access) {
1944
1998
  args.push("--access", access);
1945
1999
  }
@@ -2011,9 +2065,10 @@ async function executePublishCommand({
2011
2065
  config,
2012
2066
  tag,
2013
2067
  dryRun,
2014
- packageManager
2068
+ packageManager,
2069
+ registryLabel
2015
2070
  }) {
2016
- logger.info(`${dryRun ? "[dry-run] " : ""}Publishing ${packageNameAndVersion} with tag "${tag}"`);
2071
+ logger.info(`${dryRun ? "[dry-run] " : ""}Publishing ${packageNameAndVersion} with tag "${tag}"${registryLabel}`);
2017
2072
  const dryRunPublish = dryRun && packageManager !== "npm" && packageManager !== "pnpm";
2018
2073
  if (dryRunPublish) {
2019
2074
  logger.info(`${dryRun ? "[dry-run] " : ""}Skipping actual publish for ${packageNameAndVersion}`);
@@ -2031,12 +2086,13 @@ async function executePublishCommand({
2031
2086
  function getAuthCommand({
2032
2087
  packageManager,
2033
2088
  config,
2034
- otp
2089
+ otp,
2090
+ registryTarget
2035
2091
  }) {
2036
2092
  const args = getCommandArgs({
2037
2093
  packageManager,
2038
2094
  tag: void 0,
2039
- config,
2095
+ registryTarget: registryTarget ?? buildLegacyRegistryTarget(config),
2040
2096
  otp,
2041
2097
  type: "auth"
2042
2098
  });
@@ -2045,14 +2101,14 @@ function getAuthCommand({
2045
2101
  function getPublishCommand({
2046
2102
  packageManager,
2047
2103
  tag,
2048
- config,
2104
+ registryTarget,
2049
2105
  otp,
2050
2106
  dryRun
2051
2107
  }) {
2052
2108
  const args = getCommandArgs({
2053
2109
  packageManager,
2054
2110
  tag,
2055
- config,
2111
+ registryTarget,
2056
2112
  otp,
2057
2113
  dryRun,
2058
2114
  type: "publish"
@@ -2060,14 +2116,64 @@ function getPublishCommand({
2060
2116
  const baseCommand = packageManager === "yarn" && isYarnBerry() ? "yarn npm" : packageManager;
2061
2117
  return `${baseCommand} ${args.join(" ")}`;
2062
2118
  }
2119
+ async function publishToRegistryTarget({
2120
+ pkg,
2121
+ config,
2122
+ packageManager,
2123
+ dryRun,
2124
+ registryTarget,
2125
+ packageNameAndVersion,
2126
+ registryLabel
2127
+ }) {
2128
+ const tag = determinePublishTag(pkg.newVersion || pkg.version, registryTarget.tag);
2129
+ let dynamicOtp;
2130
+ const maxAttempts = 2;
2131
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
2132
+ try {
2133
+ const command = getPublishCommand({
2134
+ packageManager,
2135
+ tag,
2136
+ registryTarget,
2137
+ otp: dynamicOtp,
2138
+ dryRun
2139
+ });
2140
+ process.chdir(pkg.path);
2141
+ await executePublishCommand({
2142
+ command,
2143
+ packageNameAndVersion,
2144
+ packageManager,
2145
+ pkg,
2146
+ config,
2147
+ dryRun,
2148
+ tag,
2149
+ registryLabel
2150
+ });
2151
+ const registryKey = normalizeRegistryKey(registryTarget.registry);
2152
+ if (dynamicOtp && !sessionOtpByRegistry.has(registryKey)) {
2153
+ sessionOtpByRegistry.set(registryKey, dynamicOtp);
2154
+ logger.debug("OTP stored for session");
2155
+ }
2156
+ return;
2157
+ } catch (error) {
2158
+ if (isOtpError(error) && attempt < maxAttempts - 1) {
2159
+ dynamicOtp = await handleOtpError();
2160
+ } else {
2161
+ logger.error(`Failed to publish ${packageNameAndVersion}:`, error);
2162
+ throw error;
2163
+ }
2164
+ } finally {
2165
+ process.chdir(config.cwd);
2166
+ }
2167
+ }
2168
+ }
2063
2169
  async function publishPackage({
2064
2170
  pkg,
2065
2171
  config,
2066
2172
  packageManager,
2067
2173
  dryRun
2068
2174
  }) {
2069
- const tag = determinePublishTag(pkg.newVersion || pkg.version, config.publish.tag);
2070
2175
  const packageNameAndVersion = getIndependentTag({ name: pkg.name, version: pkg.newVersion || pkg.version });
2176
+ const registryTargets = resolveRegistryTargetsForPackage(pkg, config);
2071
2177
  logger.debug(`Building publish command for ${pkg.name}`);
2072
2178
  const needsTempVersionWrite = dryRun && (packageManager === "npm" || packageManager === "pnpm") && !!pkg.newVersion && pkg.newVersion !== pkg.version;
2073
2179
  let originalVersion;
@@ -2079,42 +2185,18 @@ async function publishPackage({
2079
2185
  writeVersion(pkg.path, pkg.newVersion, false);
2080
2186
  }
2081
2187
  try {
2082
- let dynamicOtp;
2083
- const maxAttempts = 2;
2084
- for (let attempt = 0; attempt < maxAttempts; attempt++) {
2085
- try {
2086
- const command = getPublishCommand({
2087
- packageManager,
2088
- tag,
2089
- config,
2090
- otp: dynamicOtp,
2091
- dryRun
2092
- });
2093
- process.chdir(pkg.path);
2094
- await executePublishCommand({
2095
- command,
2096
- packageNameAndVersion,
2097
- packageManager,
2098
- pkg,
2099
- config,
2100
- dryRun,
2101
- tag
2102
- });
2103
- if (dynamicOtp && !sessionOtp) {
2104
- sessionOtp = dynamicOtp;
2105
- logger.debug("OTP stored for session");
2106
- }
2107
- return;
2108
- } catch (error) {
2109
- if (isOtpError(error) && attempt < maxAttempts - 1) {
2110
- dynamicOtp = await handleOtpError();
2111
- } else {
2112
- logger.error(`Failed to publish ${packageNameAndVersion}:`, error);
2113
- throw error;
2114
- }
2115
- } finally {
2116
- process.chdir(config.cwd);
2117
- }
2188
+ const showRegistryLabel = registryTargets.length > 1;
2189
+ for (const registryTarget of registryTargets) {
2190
+ const registryLabel = showRegistryLabel ? ` [${registryTarget.name ?? registryTarget.registry ?? "default"}]` : "";
2191
+ await publishToRegistryTarget({
2192
+ pkg,
2193
+ config,
2194
+ packageManager,
2195
+ dryRun,
2196
+ registryTarget,
2197
+ packageNameAndVersion,
2198
+ registryLabel
2199
+ });
2118
2200
  }
2119
2201
  } finally {
2120
2202
  if (needsTempVersionWrite && originalVersion) {
@@ -5586,21 +5668,16 @@ async function providerRelease(options = {}) {
5586
5668
  }
5587
5669
  }
5588
5670
 
5589
- async function publishSafetyCheck({ config }) {
5590
- if (!config.safetyCheck || !config.release.publish || !config.publish.safetyCheck) {
5591
- logger.debug("Safety check disabled or publish disabled");
5592
- return;
5593
- }
5594
- logger.debug("Start checking auth config to package registry");
5595
- const isPnpmOrNpm = config.publish.packageManager === "pnpm" || config.publish.packageManager === "npm";
5596
- if (!isPnpmOrNpm) {
5597
- logger.debug(`Skipping authentication to package registry because "${config.publish.packageManager}" is not supported`);
5598
- return;
5599
- }
5671
+ async function checkRegistryAuth({
5672
+ config,
5673
+ registryTarget,
5674
+ registryLabel
5675
+ }) {
5600
5676
  const authCommand = getAuthCommand({
5601
5677
  packageManager: config.publish.packageManager,
5602
5678
  config,
5603
- otp: config.publish.otp
5679
+ registryTarget,
5680
+ otp: registryTarget.otp
5604
5681
  });
5605
5682
  const timeoutMs = config.publish.safetyCheckTimeout ?? 15e3;
5606
5683
  const patienceDelay = Math.min(5e3, Math.floor(timeoutMs / 2));
@@ -5608,7 +5685,7 @@ async function publishSafetyCheck({ config }) {
5608
5685
  logger.info(`The package registry is taking longer than expected to respond (will time out at ${Math.round(timeoutMs / 1e3)}s)...`);
5609
5686
  }, patienceDelay);
5610
5687
  try {
5611
- logger.info("Authenticating to package registry...");
5688
+ logger.info(`Authenticating to package registry${registryLabel}...`);
5612
5689
  await execPromise(authCommand, {
5613
5690
  cwd: config.cwd,
5614
5691
  timeout: timeoutMs,
@@ -5618,19 +5695,37 @@ async function publishSafetyCheck({ config }) {
5618
5695
  noError: true,
5619
5696
  logLevel: config.logLevel
5620
5697
  });
5621
- logger.info("Successfully authenticated to package registry");
5698
+ logger.info(`Successfully authenticated to package registry${registryLabel}`);
5622
5699
  } catch (error) {
5623
5700
  if (error?.killed) {
5624
5701
  throw new Error(
5625
- `Authentication to package registry timed out after ${timeoutMs}ms. The registry did not respond - check your network or registry access, increase publish.safetyCheckTimeout, or skip this check with --no-safety-check.`,
5702
+ `Authentication to package registry${registryLabel} timed out after ${timeoutMs}ms. The registry did not respond - check your network or registry access, increase publish.safetyCheckTimeout, or skip this check with --no-safety-check.`,
5626
5703
  { cause: error }
5627
5704
  );
5628
5705
  }
5629
- throw new Error("Failed to authenticate to package registry", { cause: error });
5706
+ throw new Error(`Failed to authenticate to package registry${registryLabel}`, { cause: error });
5630
5707
  } finally {
5631
5708
  clearTimeout(patienceTimer);
5632
5709
  }
5633
5710
  }
5711
+ async function publishSafetyCheck({ config, packages }) {
5712
+ if (!config.safetyCheck || !config.release.publish || !config.publish.safetyCheck) {
5713
+ logger.debug("Safety check disabled or publish disabled");
5714
+ return;
5715
+ }
5716
+ logger.debug("Start checking auth config to package registry");
5717
+ const isPnpmOrNpm = config.publish.packageManager === "pnpm" || config.publish.packageManager === "npm";
5718
+ if (!isPnpmOrNpm) {
5719
+ logger.debug(`Skipping authentication to package registry because "${config.publish.packageManager}" is not supported`);
5720
+ return;
5721
+ }
5722
+ const registryTargets = packages ? resolveRegistryTargetsForPackages(packages, config) : resolveAllConfiguredRegistryTargets(config);
5723
+ const showRegistryLabel = registryTargets.length > 1;
5724
+ for (const registryTarget of registryTargets) {
5725
+ const registryLabel = showRegistryLabel ? ` [${registryTarget.name ?? registryTarget.registry ?? "default"}]` : "";
5726
+ await checkRegistryAuth({ config, registryTarget, registryLabel });
5727
+ }
5728
+ }
5634
5729
  async function publish(options = {}) {
5635
5730
  const config = await loadRelizyConfig({
5636
5731
  configFile: options.configName,
@@ -5640,6 +5735,7 @@ async function publish(options = {}) {
5640
5735
  access: options.access,
5641
5736
  otp: options.otp,
5642
5737
  registry: options.registry,
5738
+ registries: options.registries,
5643
5739
  tag: options.tag,
5644
5740
  buildCmd: options.buildCmd,
5645
5741
  token: options.token
@@ -5660,7 +5756,6 @@ async function publish(options = {}) {
5660
5756
  }
5661
5757
  try {
5662
5758
  await executeHook("before:publish", config, dryRun);
5663
- await publishSafetyCheck({ config });
5664
5759
  const rootPackage = readPackageJson(config.cwd);
5665
5760
  if (!rootPackage) {
5666
5761
  throw new Error("Failed to read root package.json");
@@ -5699,6 +5794,7 @@ async function publish(options = {}) {
5699
5794
  logger.fail("No packages need to be published");
5700
5795
  return;
5701
5796
  }
5797
+ await publishSafetyCheck({ config, packages: publishedPackages });
5702
5798
  await executeBuildCmd({
5703
5799
  config,
5704
5800
  dryRun
@@ -5815,7 +5911,8 @@ async function handleTwitterPost({
5815
5911
  changelog,
5816
5912
  dryRun,
5817
5913
  newVersion,
5818
- tag
5914
+ tag,
5915
+ prerelease
5819
5916
  }) {
5820
5917
  const twitterConfig = config.social?.twitter;
5821
5918
  if (!twitterConfig?.enabled) {
@@ -5834,7 +5931,8 @@ async function handleTwitterPost({
5834
5931
  logger.debug("Credentials found \u2713");
5835
5932
  logger.debug("Preparing tweet for release");
5836
5933
  const onlyStable = twitterConfig.onlyStable;
5837
- if (onlyStable && isPrerelease(newVersion)) {
5934
+ const isPre = prerelease ?? isPrerelease(newVersion);
5935
+ if (onlyStable && isPre) {
5838
5936
  logger.info(`Skipping Twitter post for prerelease version ${newVersion} (social.twitter.onlyStable is enabled)`);
5839
5937
  return { success: true, response: void 0 };
5840
5938
  }
@@ -5882,7 +5980,8 @@ async function handleSlackPost({
5882
5980
  newVersion,
5883
5981
  tag,
5884
5982
  commits,
5885
- bumpedPackages
5983
+ bumpedPackages,
5984
+ prerelease
5886
5985
  }) {
5887
5986
  const slackConfig = config.social?.slack;
5888
5987
  if (!slackConfig?.enabled) {
@@ -5910,7 +6009,8 @@ async function handleSlackPost({
5910
6009
  logger.debug(`Slack: ${slackMode}`);
5911
6010
  logger.debug(`Preparing Slack message for release: ${tag} (${newVersion})`);
5912
6011
  const onlyStable = slackConfig.onlyStable ?? true;
5913
- if (onlyStable && isPrerelease(newVersion)) {
6012
+ const isPre = prerelease ?? isPrerelease(newVersion);
6013
+ if (onlyStable && isPre) {
5914
6014
  logger.info(`Skipping Slack post for prerelease version ${newVersion} (social.slack.onlyStable is enabled)`);
5915
6015
  return { success: true, response: void 0 };
5916
6016
  }
@@ -5987,43 +6087,126 @@ async function social(options = {}) {
5987
6087
  if (!rootPackageRead) {
5988
6088
  throw new Error("Failed to read root package.json");
5989
6089
  }
5990
- const newVersion = options.bumpResult?.newVersion || rootPackageRead.version;
5991
- const { from, to } = await resolveTags({
5992
- config,
5993
- step: "social",
5994
- newVersion,
5995
- pkg: rootPackageRead
5996
- });
5997
- const fromTag = options.bumpResult?.fromTag || from;
5998
- const rootPackage = options.bumpResult?.rootPackage || await getRootPackage({
5999
- config,
6000
- force: false,
6001
- suffix: void 0,
6002
- changelog: true,
6003
- from: fromTag,
6004
- to,
6005
- dryRun
6006
- });
6007
- const minifiedBody = await generateChangelog({
6008
- pkg: { ...rootPackage, fromTag },
6009
- config,
6010
- dryRun,
6011
- newVersion,
6012
- include: { title: false, compareLink: false, body: true, contributors: false },
6013
- minify: true
6014
- });
6015
- const richBody = await generateChangelog({
6016
- pkg: { ...rootPackage, fromTag },
6017
- config,
6018
- dryRun,
6019
- newVersion,
6020
- include: { title: false, compareLink: false, body: true, contributors: false },
6021
- minify: false
6022
- });
6090
+ const isIndependent = config.monorepo?.versionMode === "independent";
6091
+ let minifiedBody;
6092
+ let richBody;
6093
+ let newVersion;
6094
+ let tag;
6095
+ let changelogCommits;
6096
+ let prerelease;
6097
+ if (isIndependent) {
6098
+ const packages = filterOutPrivatePackages(await getPackagesOrBumpedPackages({
6099
+ config,
6100
+ bumpResult: options.bumpResult,
6101
+ suffix: options.suffix,
6102
+ force: options.force ?? false,
6103
+ dryRun
6104
+ }));
6105
+ const minifiedSections = [];
6106
+ const richSections = [];
6107
+ const commitsByHash = /* @__PURE__ */ new Map();
6108
+ for (const pkg of packages) {
6109
+ const pkgVersion = isBumpedPackage(pkg) && pkg.newVersion || pkg.version;
6110
+ const from = config.from || pkg.fromTag;
6111
+ if (!from) {
6112
+ logger.warn(`No from tag found for ${pkg.name}, skipping its changelog section`);
6113
+ continue;
6114
+ }
6115
+ const minSection = await generateChangelog({
6116
+ pkg: { ...pkg, fromTag: from },
6117
+ config,
6118
+ dryRun,
6119
+ newVersion: pkgVersion,
6120
+ include: { title: true, compareLink: false, body: true, contributors: false },
6121
+ minify: true
6122
+ });
6123
+ const richSection = await generateChangelog({
6124
+ pkg: { ...pkg, fromTag: from },
6125
+ config,
6126
+ dryRun,
6127
+ newVersion: pkgVersion,
6128
+ include: { title: true, compareLink: false, body: true, contributors: false },
6129
+ minify: false
6130
+ });
6131
+ if (minSection.trim()) {
6132
+ minifiedSections.push(minSection);
6133
+ }
6134
+ if (richSection.trim()) {
6135
+ richSections.push(richSection);
6136
+ }
6137
+ const pkgCommits = await getPackageCommits({
6138
+ pkg,
6139
+ from,
6140
+ to: "HEAD",
6141
+ config,
6142
+ changelog: true,
6143
+ dryRun
6144
+ });
6145
+ for (const commit of pkgCommits) {
6146
+ commitsByHash.set(commit.shortHash || commit.message, commit);
6147
+ }
6148
+ }
6149
+ minifiedBody = minifiedSections.join("\n\n");
6150
+ richBody = richSections.join("\n\n");
6151
+ changelogCommits = [...commitsByHash.values()];
6152
+ prerelease = packages.length > 0 && packages.every((pkg) => isPrerelease(isBumpedPackage(pkg) && pkg.newVersion || pkg.version));
6153
+ if (packages.length === 1) {
6154
+ const only = packages[0];
6155
+ newVersion = isBumpedPackage(only) && only.newVersion || only.version;
6156
+ tag = getIndependentTag({ version: newVersion, name: only.name });
6157
+ } else {
6158
+ newVersion = `${packages.length} packages`;
6159
+ tag = "";
6160
+ }
6161
+ } else {
6162
+ const resolvedNewVersion = options.bumpResult?.newVersion || rootPackageRead.version;
6163
+ const { from, to } = await resolveTags({
6164
+ config,
6165
+ step: "social",
6166
+ newVersion: resolvedNewVersion,
6167
+ pkg: rootPackageRead
6168
+ });
6169
+ const fromTag = options.bumpResult?.fromTag || from;
6170
+ const rootPackage = options.bumpResult?.rootPackage || await getRootPackage({
6171
+ config,
6172
+ force: false,
6173
+ suffix: void 0,
6174
+ changelog: true,
6175
+ from: fromTag,
6176
+ to,
6177
+ dryRun
6178
+ });
6179
+ minifiedBody = await generateChangelog({
6180
+ pkg: { ...rootPackage, fromTag },
6181
+ config,
6182
+ dryRun,
6183
+ newVersion: resolvedNewVersion,
6184
+ include: { title: false, compareLink: false, body: true, contributors: false },
6185
+ minify: true
6186
+ });
6187
+ richBody = await generateChangelog({
6188
+ pkg: { ...rootPackage, fromTag },
6189
+ config,
6190
+ dryRun,
6191
+ newVersion: resolvedNewVersion,
6192
+ include: { title: false, compareLink: false, body: true, contributors: false },
6193
+ minify: false
6194
+ });
6195
+ newVersion = resolvedNewVersion;
6196
+ tag = to;
6197
+ changelogCommits = await getPackageCommits({
6198
+ pkg: rootPackage,
6199
+ from: fromTag,
6200
+ to: "HEAD",
6201
+ config,
6202
+ changelog: true,
6203
+ dryRun
6204
+ });
6205
+ prerelease = isPrerelease(newVersion);
6206
+ }
6023
6207
  const hasContent = !!minifiedBody.trim();
6024
- const twitterReleaseUrl = getReleaseUrl(config, to);
6208
+ const twitterReleaseUrl = getReleaseUrl(config, tag);
6025
6209
  const twitterChangelogUrl = config.social?.changelogUrl;
6026
- const prerelease = isPrerelease(newVersion);
6027
6210
  const twitterWillPost = !!config.social?.twitter?.enabled && !(config.social.twitter.onlyStable && prerelease);
6028
6211
  const slackWillPost = !!config.social?.slack?.enabled && !((config.social.slack.onlyStable ?? true) && prerelease);
6029
6212
  let twitterChangelog = minifiedBody;
@@ -6067,24 +6250,18 @@ ${twitterChangelog}`);
6067
6250
  changelog: twitterChangelog,
6068
6251
  dryRun,
6069
6252
  newVersion,
6070
- tag: to
6071
- });
6072
- const changelogCommits = await getPackageCommits({
6073
- pkg: rootPackage,
6074
- from: fromTag,
6075
- to: "HEAD",
6076
- config,
6077
- changelog: true,
6078
- dryRun
6253
+ tag,
6254
+ prerelease
6079
6255
  });
6080
6256
  const slackResponse = await handleSlackPost({
6081
6257
  config,
6082
6258
  changelog: slackChangelog,
6083
6259
  dryRun,
6084
6260
  newVersion,
6085
- tag: to,
6261
+ tag,
6086
6262
  commits: changelogCommits,
6087
- bumpedPackages: options.bumpResult?.bumpedPackages
6263
+ bumpedPackages: options.bumpResult?.bumpedPackages,
6264
+ prerelease
6088
6265
  });
6089
6266
  const results = [];
6090
6267
  if (config.social?.twitter?.enabled) {
@@ -6145,6 +6322,7 @@ function getReleaseConfig(options = {}) {
6145
6322
  access: options.access,
6146
6323
  otp: options.otp,
6147
6324
  registry: options.registry,
6325
+ registries: options.registries,
6148
6326
  tag: options.tag,
6149
6327
  buildCmd: options.buildCmd,
6150
6328
  token: options.publishToken
@@ -6454,4 +6632,4 @@ Git provider: ${provider}`);
6454
6632
  }
6455
6633
  }
6456
6634
 
6457
- export { getPackagesToPublishInIndependentMode as $, getModifiedReleaseFilePatterns as A, createCommitAndTags as B, pushCommitAndTags as C, rollbackModifiedFiles as D, getFirstCommit as E, getCurrentGitBranch as F, getCurrentGitRef as G, getShortCommitSha as H, isAncestor as I, getCommitSubject as J, findReachableCommitBySubject as K, tagExists as L, retagAnnotatedLocal as M, pushTagForce as N, github as O, createGitlabRelease as P, gitlab as Q, buildCompareLink as R, buildChangelogBody as S, collectContributorNames as T, buildContributors as U, generateMarkDown as V, parseChangelogMarkdown as W, getNpmRegistry as X, detectPackageManager as Y, determinePublishTag as Z, getPackagesToPublishInSelectiveMode as _, buildCommentBody as a, isTagVersionCompatibleWithCurrent as a$, getAuthCommand as a0, publishPackage as a1, collectPackageBumps as a2, findGitHubPR as a3, findGitLabMR as a4, detectPullRequest as a5, PR_COMMENT_MARKER as a6, postPrComment as a7, redactSecrets as a8, readPackageJson as a9, isInCI as aA, getCIName as aB, executeFormatCmd as aC, executeBuildCmd as aD, isBumpedPackage as aE, filterOutPrivatePackages as aF, getPackagesOrBumpedPackages as aG, isGraduatingToStableBetweenVersion as aH, capReleaseTypeForZeroMajor as aI, determineSemverChange as aJ, determineReleaseType as aK, writeVersion as aL, getPackageNewVersion as aM, updateLernaVersion as aN, extractVersionFromPackageTag as aO, isPrerelease as aP, isStableReleaseType as aQ, isPrereleaseReleaseType as aR, isGraduating as aS, getPreid as aT, isChangedPreid as aU, getBumpedPackageIndependently as aV, confirmBump as aW, getBumpedIndependentPackages as aX, shouldFilterPrereleaseTags as aY, extractVersionFromTag as aZ, getCanaryVersion as a_, getRootPackage as aa, readPackages as ab, getPackages as ac, getPackageCommits as ad, hasLernaJson as ae, resetRewrittenTagCache as af, reconcileFromTag as ag, getSlackToken as ah, getSlackWebhookUrl as ai, formatChangelogForSlack as aj, formatPackagesForSlack as ak, formatSlackMessage as al, postReleaseToSlack as am, extractChangelogSummary as an, getReleaseUrl as ao, getIndependentTag as ap, getLastStableTag as aq, getLastTag as ar, getLastRepoTag as as, getLastPackageTag as at, NEW_PACKAGE_MARKER as au, resolveTags as av, getTwitterCredentials as aw, formatTweetMessage as ax, postReleaseToTwitter as ay, executeHook as az, bump as b, changelog as c, providerReleaseSafetyCheck as d, providerRelease as e, publishSafetyCheck as f, publish as g, social as h, generateChangelog as i, getDefaultConfig as j, defineConfig as k, loadRelizyConfig as l, mergeTypes as m, getPackageDependencies as n, getDependentsOf as o, prComment as p, expandPackagesToBumpWithDependents as q, release as r, socialSafetyCheck as s, topologicalSort as t, getGitStatus as u, checkGitStatusIfDirty as v, writeChangelogToFile as w, fetchGitTags as x, detectGitProvider as y, parseGitRemoteUrl as z };
6635
+ export { getPackagesToPublishInIndependentMode as $, getModifiedReleaseFilePatterns as A, createCommitAndTags as B, pushCommitAndTags as C, rollbackModifiedFiles as D, getFirstCommit as E, getCurrentGitBranch as F, getCurrentGitRef as G, getShortCommitSha as H, isAncestor as I, getCommitSubject as J, findReachableCommitBySubject as K, tagExists as L, retagAnnotatedLocal as M, pushTagForce as N, github as O, createGitlabRelease as P, gitlab as Q, buildCompareLink as R, buildChangelogBody as S, collectContributorNames as T, buildContributors as U, generateMarkDown as V, parseChangelogMarkdown as W, getNpmRegistry as X, detectPackageManager as Y, determinePublishTag as Z, getPackagesToPublishInSelectiveMode as _, buildCommentBody as a, shouldFilterPrereleaseTags as a$, resolveAllConfiguredRegistryTargets as a0, resolveRegistryTargetsForPackage as a1, resolveRegistryTargetsForPackages as a2, getAuthCommand as a3, publishPackage as a4, collectPackageBumps as a5, findGitHubPR as a6, findGitLabMR as a7, detectPullRequest as a8, PR_COMMENT_MARKER as a9, formatTweetMessage as aA, postReleaseToTwitter as aB, executeHook as aC, isInCI as aD, getCIName as aE, executeFormatCmd as aF, executeBuildCmd as aG, isBumpedPackage as aH, filterOutPrivatePackages as aI, getPackagesOrBumpedPackages as aJ, isGraduatingToStableBetweenVersion as aK, capReleaseTypeForZeroMajor as aL, determineSemverChange as aM, determineReleaseType as aN, writeVersion as aO, getPackageNewVersion as aP, updateLernaVersion as aQ, extractVersionFromPackageTag as aR, isPrerelease as aS, isStableReleaseType as aT, isPrereleaseReleaseType as aU, isGraduating as aV, getPreid as aW, isChangedPreid as aX, getBumpedPackageIndependently as aY, confirmBump as aZ, getBumpedIndependentPackages as a_, postPrComment as aa, redactSecrets as ab, readPackageJson as ac, getRootPackage as ad, readPackages as ae, getPackages as af, getPackageCommits as ag, hasLernaJson as ah, resetRewrittenTagCache as ai, reconcileFromTag as aj, getSlackToken as ak, getSlackWebhookUrl as al, formatChangelogForSlack as am, formatPackagesForSlack as an, formatSlackMessage as ao, postReleaseToSlack as ap, extractChangelogSummary as aq, getReleaseUrl as ar, getIndependentTag as as, getLastStableTag as at, getLastTag as au, getLastRepoTag as av, getLastPackageTag as aw, NEW_PACKAGE_MARKER as ax, resolveTags as ay, getTwitterCredentials as az, bump as b, extractVersionFromTag as b0, getCanaryVersion as b1, isTagVersionCompatibleWithCurrent as b2, changelog as c, providerReleaseSafetyCheck as d, providerRelease as e, publishSafetyCheck as f, publish as g, social as h, generateChangelog as i, getDefaultConfig as j, defineConfig as k, loadRelizyConfig as l, mergeTypes as m, getPackageDependencies as n, getDependentsOf as o, prComment as p, expandPackagesToBumpWithDependents as q, release as r, socialSafetyCheck as s, topologicalSort as t, getGitStatus as u, checkGitStatusIfDirty as v, writeChangelogToFile as w, fetchGitTags as x, detectGitProvider as y, parseGitRemoteUrl as z };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "relizy",
3
3
  "type": "module",
4
- "version": "1.4.9",
4
+ "version": "1.5.0-beta.1",
5
5
  "description": "Changelogen adapter for monorepo management with unified and independent versioning",
6
6
  "author": "Louis Mazel <me@loicmazuel.com>",
7
7
  "license": "MIT",
@@ -71,7 +71,7 @@
71
71
  }
72
72
  },
73
73
  "dependencies": {
74
- "@inquirer/prompts": "^8.5.2",
74
+ "@inquirer/prompts": "^8.7.2",
75
75
  "@maz-ui/node": "5.0.0-beta.26",
76
76
  "@maz-ui/utils": "5.0.0-beta.25",
77
77
  "c12": "^3.3.3",
@@ -80,31 +80,33 @@
80
80
  "convert-gitmoji": "^0.1.5",
81
81
  "defu": "6.1.7",
82
82
  "fast-glob": "^3.3.2",
83
+ "micromatch": "^4.0.8",
83
84
  "node-fetch-native": "^1.6.7",
84
- "semver": "^7.8.3"
85
+ "semver": "^7.8.5"
85
86
  },
86
87
  "devDependencies": {
87
- "@commitlint/cli": "^21.0.2",
88
- "@commitlint/config-conventional": "21.0.2",
89
- "@commitlint/cz-commitlint": "^21.0.2",
90
- "@commitlint/types": "^21.0.1",
88
+ "@commitlint/cli": "^21.2.2",
89
+ "@commitlint/config-conventional": "21.2.2",
90
+ "@commitlint/cz-commitlint": "^21.2.2",
91
+ "@commitlint/types": "^21.2.0",
91
92
  "@maz-ui/eslint-config": "5.0.0-beta.25",
92
93
  "@slack/web-api": "7.16.0",
94
+ "@types/micromatch": "^4.0.10",
93
95
  "@types/node": "^25.9.2",
94
- "@types/semver": "^7.7.1",
95
- "@vitest/coverage-v8": "^4.1.8",
96
+ "@types/semver": "^7.8.0",
97
+ "@vitest/coverage-v8": "^5.0.0",
96
98
  "@yoloship/claude-sdk": "0.2.0-beta.6",
97
99
  "cross-env": "10.1.0",
98
- "eslint": "^10.4.1",
100
+ "eslint": "^10.10.0",
99
101
  "husky": "9.1.7",
100
102
  "jiti": "2.7.0",
101
- "lint-staged": "^17.0.7",
102
- "memfs": "^4.57.6",
103
- "tsx": "^4.22.4",
104
- "twitter-api-v2": "^1.29.0",
103
+ "lint-staged": "^17.5.1",
104
+ "memfs": "^4.78.0",
105
+ "tsx": "^4.23.13",
106
+ "twitter-api-v2": "^1.29.1",
105
107
  "typescript": "^6.0.3",
106
108
  "unbuild": "^3.6.1",
107
- "vitest": "^4.1.8"
109
+ "vitest": "^5.0.0"
108
110
  },
109
111
  "lint-staged": {
110
112
  "*.{js,jsx,ts,tsx,mjs,mts,cjs,md,yml,json}": [