relizy 1.4.8 → 1.5.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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,15 +5,18 @@ 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.BdF1zFG_.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.Bpfgbc-1.mjs';
9
9
  import 'node:child_process';
10
- import '@maz-ui/utils';
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';
16
+ import '@maz-ui/utils/helpers/getErrorMessage';
15
17
  import 'fast-glob';
16
18
  import 'semver';
19
+ import '@maz-ui/utils/helpers/upperFirst';
17
20
  import 'convert-gitmoji';
18
21
  import 'node-fetch-native';
19
22
 
package/dist/index.d.mts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { LogLevel } from '@maz-ui/node';
2
2
  import { GitCommit, ChangelogConfig as ChangelogConfig$1, SemverBumpType } from 'changelogen';
3
3
  import { ReleaseType } from 'semver';
4
- import { DeepPartial } from '@maz-ui/utils';
4
+ import { DeepPartial } from '@maz-ui/utils/ts-helpers/DeepPartial';
5
5
  import * as _slack_web_api from '@slack/web-api';
6
6
  import * as twitter_api_v2 from 'twitter-api-v2';
7
7
 
@@ -340,10 +340,39 @@ 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
+ declare function resolveAllConfiguredRegistryTargets(config: ResolvedRelizyConfig): RegistryTarget[];
352
+ /**
353
+ * Resolve the registry targets a given package should be published to: the
354
+ * legacy registry (if any) plus every `registries` entry that either has no
355
+ * `packageFilter` (mirrored to all packages) or whose `packageFilter` glob
356
+ * patterns match the package name.
357
+ *
358
+ * If any applicable entry is marked `exclusive`, the legacy/default registry
359
+ * is skipped for this package - it is published only to the matching
360
+ * registries instead of mirroring on top of the default one.
361
+ */
362
+ declare function resolveRegistryTargetsForPackage(pkg: PackageBase, config: ResolvedRelizyConfig): RegistryTarget[];
363
+ /**
364
+ * Resolve every distinct registry actually needed to publish the given set of
365
+ * packages - the union of `resolveRegistryTargetsForPackage` across all of
366
+ * them, deduped by registry URL. Used for the pre-publish authentication
367
+ * safety check once the package list to publish is known, so a registry
368
+ * scoped to packages that are not part of this release does not block it.
369
+ */
370
+ declare function resolveRegistryTargetsForPackages(packages: PackageBase[], config: ResolvedRelizyConfig): RegistryTarget[];
371
+ declare function getAuthCommand({ packageManager, config, otp, registryTarget, }: {
344
372
  packageManager: PackageManager;
345
373
  config: ResolvedRelizyConfig;
346
374
  otp?: string;
375
+ registryTarget?: RegistryTarget;
347
376
  }): string;
348
377
  declare function publishPackage({ pkg, config, packageManager, dryRun, }: {
349
378
  pkg: PackageBase;
@@ -1198,6 +1227,57 @@ interface SocialOptions {
1198
1227
  * true = force-enable AI, false = force-disable AI, undefined = use config
1199
1228
  */
1200
1229
  ai?: boolean;
1230
+ /**
1231
+ * Prerelease suffix, forwarded to package discovery in independent mode
1232
+ * when no bump result is available (standalone `social` runs).
1233
+ */
1234
+ suffix?: string;
1235
+ /**
1236
+ * Force package discovery to include all packages (independent standalone runs).
1237
+ * @default false
1238
+ */
1239
+ force?: boolean;
1240
+ }
1241
+ interface RegistryTarget {
1242
+ /**
1243
+ * Optional label used in logs to identify this registry (e.g. `nexus-internal`)
1244
+ */
1245
+ name?: string;
1246
+ /**
1247
+ * Registry URL (e.g. `https://registry.npmjs.org/`, a Nexus or JFrog URL)
1248
+ */
1249
+ registry: string;
1250
+ /**
1251
+ * Registry token - only supported for pnpm and npm
1252
+ */
1253
+ token?: string;
1254
+ /**
1255
+ * Publish tag (e.g. `latest`)
1256
+ */
1257
+ tag?: string;
1258
+ /**
1259
+ * Publish access level (e.g. `public` or `restricted`)
1260
+ */
1261
+ access?: 'public' | 'restricted';
1262
+ /**
1263
+ * OTP for this registry (e.g. `123456`)
1264
+ */
1265
+ otp?: string;
1266
+ /**
1267
+ * Glob pattern matching package names this registry applies to. Distinct
1268
+ * from `PublishConfig.packages` (which packages get published at all) -
1269
+ * this only routes already-publishable packages to this registry.
1270
+ * Omitted or empty = applies to every publishable package (mirroring).
1271
+ */
1272
+ packageFilter?: string[];
1273
+ /**
1274
+ * When true, packages matched by this target are published ONLY to this
1275
+ * (and any other matching) registry - the default `publish.registry` is
1276
+ * skipped for them. Without this flag, `registries` is purely additive:
1277
+ * matched packages are published to this registry ON TOP OF the default one.
1278
+ * @default false
1279
+ */
1280
+ exclusive?: boolean;
1201
1281
  }
1202
1282
  type PublishConfig = ChangelogConfig$1['publish'] & {
1203
1283
  /**
@@ -1244,6 +1324,14 @@ type PublishConfig = ChangelogConfig$1['publish'] & {
1244
1324
  * @default 15000
1245
1325
  */
1246
1326
  safetyCheckTimeout?: number;
1327
+ /**
1328
+ * Additional registries to publish to, on top of `registry` (if set).
1329
+ * Entries without `packageFilter` apply to every package (mirroring);
1330
+ * entries with `packageFilter` only apply to packages matching one of the
1331
+ * glob patterns. Fully additive: leaving this unset preserves the
1332
+ * single-registry behavior.
1333
+ */
1334
+ registries?: RegistryTarget[];
1247
1335
  };
1248
1336
  interface PublishOptions extends PublishConfig {
1249
1337
  /**
@@ -1988,8 +2076,9 @@ declare function providerReleaseSafetyCheck({ config, provider }: {
1988
2076
  }): Promise<void>;
1989
2077
  declare function providerRelease(options?: Partial<ProviderReleaseOptions>): Promise<ProviderReleaseResult>;
1990
2078
 
1991
- declare function publishSafetyCheck({ config }: {
2079
+ declare function publishSafetyCheck({ config, packages }: {
1992
2080
  config: ResolvedRelizyConfig;
2081
+ packages?: PackageBase[];
1993
2082
  }): Promise<void>;
1994
2083
  declare function publish(options?: Partial<PublishOptions>): Promise<{
1995
2084
  publishedPackages: PackageBase[];
@@ -2002,5 +2091,5 @@ declare function socialSafetyCheck({ config }: {
2002
2091
  }): Promise<void>;
2003
2092
  declare function social(options?: Partial<SocialOptions>): Promise<SocialResult>;
2004
2093
 
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 };
2094
+ 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 };
2095
+ 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
@@ -1,7 +1,7 @@
1
1
  import { LogLevel } from '@maz-ui/node';
2
2
  import { GitCommit, ChangelogConfig as ChangelogConfig$1, SemverBumpType } from 'changelogen';
3
3
  import { ReleaseType } from 'semver';
4
- import { DeepPartial } from '@maz-ui/utils';
4
+ import { DeepPartial } from '@maz-ui/utils/ts-helpers/DeepPartial';
5
5
  import * as _slack_web_api from '@slack/web-api';
6
6
  import * as twitter_api_v2 from 'twitter-api-v2';
7
7
 
@@ -340,10 +340,39 @@ 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
+ declare function resolveAllConfiguredRegistryTargets(config: ResolvedRelizyConfig): RegistryTarget[];
352
+ /**
353
+ * Resolve the registry targets a given package should be published to: the
354
+ * legacy registry (if any) plus every `registries` entry that either has no
355
+ * `packageFilter` (mirrored to all packages) or whose `packageFilter` glob
356
+ * patterns match the package name.
357
+ *
358
+ * If any applicable entry is marked `exclusive`, the legacy/default registry
359
+ * is skipped for this package - it is published only to the matching
360
+ * registries instead of mirroring on top of the default one.
361
+ */
362
+ declare function resolveRegistryTargetsForPackage(pkg: PackageBase, config: ResolvedRelizyConfig): RegistryTarget[];
363
+ /**
364
+ * Resolve every distinct registry actually needed to publish the given set of
365
+ * packages - the union of `resolveRegistryTargetsForPackage` across all of
366
+ * them, deduped by registry URL. Used for the pre-publish authentication
367
+ * safety check once the package list to publish is known, so a registry
368
+ * scoped to packages that are not part of this release does not block it.
369
+ */
370
+ declare function resolveRegistryTargetsForPackages(packages: PackageBase[], config: ResolvedRelizyConfig): RegistryTarget[];
371
+ declare function getAuthCommand({ packageManager, config, otp, registryTarget, }: {
344
372
  packageManager: PackageManager;
345
373
  config: ResolvedRelizyConfig;
346
374
  otp?: string;
375
+ registryTarget?: RegistryTarget;
347
376
  }): string;
348
377
  declare function publishPackage({ pkg, config, packageManager, dryRun, }: {
349
378
  pkg: PackageBase;
@@ -1198,6 +1227,57 @@ interface SocialOptions {
1198
1227
  * true = force-enable AI, false = force-disable AI, undefined = use config
1199
1228
  */
1200
1229
  ai?: boolean;
1230
+ /**
1231
+ * Prerelease suffix, forwarded to package discovery in independent mode
1232
+ * when no bump result is available (standalone `social` runs).
1233
+ */
1234
+ suffix?: string;
1235
+ /**
1236
+ * Force package discovery to include all packages (independent standalone runs).
1237
+ * @default false
1238
+ */
1239
+ force?: boolean;
1240
+ }
1241
+ interface RegistryTarget {
1242
+ /**
1243
+ * Optional label used in logs to identify this registry (e.g. `nexus-internal`)
1244
+ */
1245
+ name?: string;
1246
+ /**
1247
+ * Registry URL (e.g. `https://registry.npmjs.org/`, a Nexus or JFrog URL)
1248
+ */
1249
+ registry: string;
1250
+ /**
1251
+ * Registry token - only supported for pnpm and npm
1252
+ */
1253
+ token?: string;
1254
+ /**
1255
+ * Publish tag (e.g. `latest`)
1256
+ */
1257
+ tag?: string;
1258
+ /**
1259
+ * Publish access level (e.g. `public` or `restricted`)
1260
+ */
1261
+ access?: 'public' | 'restricted';
1262
+ /**
1263
+ * OTP for this registry (e.g. `123456`)
1264
+ */
1265
+ otp?: string;
1266
+ /**
1267
+ * Glob pattern matching package names this registry applies to. Distinct
1268
+ * from `PublishConfig.packages` (which packages get published at all) -
1269
+ * this only routes already-publishable packages to this registry.
1270
+ * Omitted or empty = applies to every publishable package (mirroring).
1271
+ */
1272
+ packageFilter?: string[];
1273
+ /**
1274
+ * When true, packages matched by this target are published ONLY to this
1275
+ * (and any other matching) registry - the default `publish.registry` is
1276
+ * skipped for them. Without this flag, `registries` is purely additive:
1277
+ * matched packages are published to this registry ON TOP OF the default one.
1278
+ * @default false
1279
+ */
1280
+ exclusive?: boolean;
1201
1281
  }
1202
1282
  type PublishConfig = ChangelogConfig$1['publish'] & {
1203
1283
  /**
@@ -1244,6 +1324,14 @@ type PublishConfig = ChangelogConfig$1['publish'] & {
1244
1324
  * @default 15000
1245
1325
  */
1246
1326
  safetyCheckTimeout?: number;
1327
+ /**
1328
+ * Additional registries to publish to, on top of `registry` (if set).
1329
+ * Entries without `packageFilter` apply to every package (mirroring);
1330
+ * entries with `packageFilter` only apply to packages matching one of the
1331
+ * glob patterns. Fully additive: leaving this unset preserves the
1332
+ * single-registry behavior.
1333
+ */
1334
+ registries?: RegistryTarget[];
1247
1335
  };
1248
1336
  interface PublishOptions extends PublishConfig {
1249
1337
  /**
@@ -1988,8 +2076,9 @@ declare function providerReleaseSafetyCheck({ config, provider }: {
1988
2076
  }): Promise<void>;
1989
2077
  declare function providerRelease(options?: Partial<ProviderReleaseOptions>): Promise<ProviderReleaseResult>;
1990
2078
 
1991
- declare function publishSafetyCheck({ config }: {
2079
+ declare function publishSafetyCheck({ config, packages }: {
1992
2080
  config: ResolvedRelizyConfig;
2081
+ packages?: PackageBase[];
1993
2082
  }): Promise<void>;
1994
2083
  declare function publish(options?: Partial<PublishOptions>): Promise<{
1995
2084
  publishedPackages: PackageBase[];
@@ -2002,5 +2091,5 @@ declare function socialSafetyCheck({ config }: {
2002
2091
  }): Promise<void>;
2003
2092
  declare function social(options?: Partial<SocialOptions>): Promise<SocialResult>;
2004
2093
 
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 };
2094
+ 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 };
2095
+ 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,15 +1,18 @@
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.BdF1zFG_.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.Bpfgbc-1.mjs';
2
2
  import '@maz-ui/node';
3
3
  import 'node:child_process';
4
4
  import 'node:process';
5
- import '@maz-ui/utils';
5
+ import '@maz-ui/utils/helpers/formatJson';
6
6
  import 'c12';
7
7
  import 'changelogen';
8
8
  import 'defu';
9
9
  import 'node:fs';
10
10
  import 'node:path';
11
11
  import '@inquirer/prompts';
12
+ import 'micromatch';
13
+ import '@maz-ui/utils/helpers/getErrorMessage';
12
14
  import 'fast-glob';
13
15
  import 'semver';
16
+ import '@maz-ui/utils/helpers/upperFirst';
14
17
  import 'convert-gitmoji';
15
18
  import 'node-fetch-native';
@@ -1,15 +1,18 @@
1
1
  import { logger, execPromise } from '@maz-ui/node';
2
2
  import { execSync, spawnSync } from 'node:child_process';
3
3
  import process$1 from 'node:process';
4
- import { getErrorMessage, formatJson, upperFirst } from '@maz-ui/utils';
4
+ import { formatJson } from '@maz-ui/utils/helpers/formatJson';
5
5
  import { setupDotenv, loadConfig } from 'c12';
6
6
  import { getGitDiff, parseCommits, resolveRepoConfig, getRepoConfig, formatCompareChanges, formatReference, createGithubRelease } from 'changelogen';
7
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';
12
+ import { getErrorMessage } from '@maz-ui/utils/helpers/getErrorMessage';
11
13
  import fastGlob from 'fast-glob';
12
14
  import * as semver from 'semver';
15
+ import { upperFirst } from '@maz-ui/utils/helpers/upperFirst';
13
16
  import { convert } from 'convert-gitmoji';
14
17
  import { fetch as fetch$1 } from 'node-fetch-native';
15
18
 
@@ -1801,7 +1804,7 @@ async function getPackagesOrBumpedPackages({
1801
1804
  }
1802
1805
 
1803
1806
  const DEFAULT_REGISTRY = "https://registry.npmjs.org/";
1804
- let sessionOtp;
1807
+ const sessionOtpByRegistry = /* @__PURE__ */ new Map();
1805
1808
  function getNpmRegistry(cwd = process.cwd()) {
1806
1809
  try {
1807
1810
  const output = execSync("npm config get registry", {
@@ -1904,21 +1907,69 @@ async function getPackagesToPublishInIndependentMode(sortedPackages, config) {
1904
1907
  function isYarnBerry() {
1905
1908
  return existsSync(path.join(process.cwd(), ".yarnrc.yml"));
1906
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
+ return dedupRegistryTargets([legacyTarget, ...explicitTargets]);
1941
+ }
1942
+ function resolveRegistryTargetsForPackage(pkg, config) {
1943
+ const legacyTarget = buildLegacyRegistryTarget(config);
1944
+ const explicitTargets = config.publish.registries ?? [];
1945
+ const applicableTargets = explicitTargets.filter(
1946
+ (target) => !target.packageFilter?.length || micromatch.isMatch(pkg.name, target.packageFilter)
1947
+ );
1948
+ const skipDefaultRegistry = applicableTargets.some((target) => target.exclusive);
1949
+ return dedupRegistryTargets([
1950
+ ...skipDefaultRegistry ? [] : [legacyTarget],
1951
+ ...applicableTargets
1952
+ ]);
1953
+ }
1954
+ function resolveRegistryTargetsForPackages(packages, config) {
1955
+ const allTargets = packages.flatMap((pkg) => resolveRegistryTargetsForPackage(pkg, config));
1956
+ return dedupRegistryTargets(allTargets);
1957
+ }
1907
1958
  function getCommandArgs({
1908
1959
  packageManager,
1909
1960
  tag,
1910
- config,
1961
+ registryTarget,
1911
1962
  otp,
1912
1963
  type,
1913
1964
  dryRun
1914
1965
  }) {
1915
1966
  const args = type === "publish" ? ["publish", "--tag", tag] : ["whoami"];
1916
- const registry = config.publish.registry;
1967
+ const registry = registryTarget.registry;
1917
1968
  if (registry) {
1918
1969
  args.push("--registry", registry);
1919
1970
  }
1920
1971
  const isPnpmOrNpm = packageManager === "pnpm" || packageManager === "npm";
1921
- const publishToken = config.publish.token || config.tokens.registry;
1972
+ const publishToken = registryTarget.token;
1922
1973
  if (publishToken) {
1923
1974
  if (!registry) {
1924
1975
  logger.warn("Publish token provided but no registry specified");
@@ -1930,14 +1981,14 @@ function getCommandArgs({
1930
1981
  args.push(authTokenKey);
1931
1982
  }
1932
1983
  }
1933
- const finalOtp = otp ?? sessionOtp ?? config.publish.otp;
1984
+ const finalOtp = otp ?? sessionOtpByRegistry.get(normalizeRegistryKey(registry)) ?? registryTarget.otp;
1934
1985
  if (finalOtp) {
1935
1986
  args.push("--otp", finalOtp);
1936
1987
  }
1937
1988
  if (type === "auth") {
1938
1989
  return args;
1939
1990
  }
1940
- const access = config.publish.access;
1991
+ const access = registryTarget.access;
1941
1992
  if (access) {
1942
1993
  args.push("--access", access);
1943
1994
  }
@@ -2009,9 +2060,10 @@ async function executePublishCommand({
2009
2060
  config,
2010
2061
  tag,
2011
2062
  dryRun,
2012
- packageManager
2063
+ packageManager,
2064
+ registryLabel
2013
2065
  }) {
2014
- logger.info(`${dryRun ? "[dry-run] " : ""}Publishing ${packageNameAndVersion} with tag "${tag}"`);
2066
+ logger.info(`${dryRun ? "[dry-run] " : ""}Publishing ${packageNameAndVersion} with tag "${tag}"${registryLabel}`);
2015
2067
  const dryRunPublish = dryRun && packageManager !== "npm" && packageManager !== "pnpm";
2016
2068
  if (dryRunPublish) {
2017
2069
  logger.info(`${dryRun ? "[dry-run] " : ""}Skipping actual publish for ${packageNameAndVersion}`);
@@ -2029,12 +2081,13 @@ async function executePublishCommand({
2029
2081
  function getAuthCommand({
2030
2082
  packageManager,
2031
2083
  config,
2032
- otp
2084
+ otp,
2085
+ registryTarget
2033
2086
  }) {
2034
2087
  const args = getCommandArgs({
2035
2088
  packageManager,
2036
2089
  tag: void 0,
2037
- config,
2090
+ registryTarget: registryTarget ?? buildLegacyRegistryTarget(config),
2038
2091
  otp,
2039
2092
  type: "auth"
2040
2093
  });
@@ -2043,14 +2096,14 @@ function getAuthCommand({
2043
2096
  function getPublishCommand({
2044
2097
  packageManager,
2045
2098
  tag,
2046
- config,
2099
+ registryTarget,
2047
2100
  otp,
2048
2101
  dryRun
2049
2102
  }) {
2050
2103
  const args = getCommandArgs({
2051
2104
  packageManager,
2052
2105
  tag,
2053
- config,
2106
+ registryTarget,
2054
2107
  otp,
2055
2108
  dryRun,
2056
2109
  type: "publish"
@@ -2058,14 +2111,64 @@ function getPublishCommand({
2058
2111
  const baseCommand = packageManager === "yarn" && isYarnBerry() ? "yarn npm" : packageManager;
2059
2112
  return `${baseCommand} ${args.join(" ")}`;
2060
2113
  }
2114
+ async function publishToRegistryTarget({
2115
+ pkg,
2116
+ config,
2117
+ packageManager,
2118
+ dryRun,
2119
+ registryTarget,
2120
+ packageNameAndVersion,
2121
+ registryLabel
2122
+ }) {
2123
+ const tag = determinePublishTag(pkg.newVersion || pkg.version, registryTarget.tag);
2124
+ let dynamicOtp;
2125
+ const maxAttempts = 2;
2126
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
2127
+ try {
2128
+ const command = getPublishCommand({
2129
+ packageManager,
2130
+ tag,
2131
+ registryTarget,
2132
+ otp: dynamicOtp,
2133
+ dryRun
2134
+ });
2135
+ process.chdir(pkg.path);
2136
+ await executePublishCommand({
2137
+ command,
2138
+ packageNameAndVersion,
2139
+ packageManager,
2140
+ pkg,
2141
+ config,
2142
+ dryRun,
2143
+ tag,
2144
+ registryLabel
2145
+ });
2146
+ const registryKey = normalizeRegistryKey(registryTarget.registry);
2147
+ if (dynamicOtp && !sessionOtpByRegistry.has(registryKey)) {
2148
+ sessionOtpByRegistry.set(registryKey, dynamicOtp);
2149
+ logger.debug("OTP stored for session");
2150
+ }
2151
+ return;
2152
+ } catch (error) {
2153
+ if (isOtpError(error) && attempt < maxAttempts - 1) {
2154
+ dynamicOtp = await handleOtpError();
2155
+ } else {
2156
+ logger.error(`Failed to publish ${packageNameAndVersion}:`, error);
2157
+ throw error;
2158
+ }
2159
+ } finally {
2160
+ process.chdir(config.cwd);
2161
+ }
2162
+ }
2163
+ }
2061
2164
  async function publishPackage({
2062
2165
  pkg,
2063
2166
  config,
2064
2167
  packageManager,
2065
2168
  dryRun
2066
2169
  }) {
2067
- const tag = determinePublishTag(pkg.newVersion || pkg.version, config.publish.tag);
2068
2170
  const packageNameAndVersion = getIndependentTag({ name: pkg.name, version: pkg.newVersion || pkg.version });
2171
+ const registryTargets = resolveRegistryTargetsForPackage(pkg, config);
2069
2172
  logger.debug(`Building publish command for ${pkg.name}`);
2070
2173
  const needsTempVersionWrite = dryRun && (packageManager === "npm" || packageManager === "pnpm") && !!pkg.newVersion && pkg.newVersion !== pkg.version;
2071
2174
  let originalVersion;
@@ -2077,42 +2180,18 @@ async function publishPackage({
2077
2180
  writeVersion(pkg.path, pkg.newVersion, false);
2078
2181
  }
2079
2182
  try {
2080
- let dynamicOtp;
2081
- const maxAttempts = 2;
2082
- for (let attempt = 0; attempt < maxAttempts; attempt++) {
2083
- try {
2084
- const command = getPublishCommand({
2085
- packageManager,
2086
- tag,
2087
- config,
2088
- otp: dynamicOtp,
2089
- dryRun
2090
- });
2091
- process.chdir(pkg.path);
2092
- await executePublishCommand({
2093
- command,
2094
- packageNameAndVersion,
2095
- packageManager,
2096
- pkg,
2097
- config,
2098
- dryRun,
2099
- tag
2100
- });
2101
- if (dynamicOtp && !sessionOtp) {
2102
- sessionOtp = dynamicOtp;
2103
- logger.debug("OTP stored for session");
2104
- }
2105
- return;
2106
- } catch (error) {
2107
- if (isOtpError(error) && attempt < maxAttempts - 1) {
2108
- dynamicOtp = await handleOtpError();
2109
- } else {
2110
- logger.error(`Failed to publish ${packageNameAndVersion}:`, error);
2111
- throw error;
2112
- }
2113
- } finally {
2114
- process.chdir(config.cwd);
2115
- }
2183
+ const showRegistryLabel = registryTargets.length > 1;
2184
+ for (const registryTarget of registryTargets) {
2185
+ const registryLabel = showRegistryLabel ? ` [${registryTarget.name ?? registryTarget.registry ?? "default"}]` : "";
2186
+ await publishToRegistryTarget({
2187
+ pkg,
2188
+ config,
2189
+ packageManager,
2190
+ dryRun,
2191
+ registryTarget,
2192
+ packageNameAndVersion,
2193
+ registryLabel
2194
+ });
2116
2195
  }
2117
2196
  } finally {
2118
2197
  if (needsTempVersionWrite && originalVersion) {
@@ -5584,21 +5663,16 @@ async function providerRelease(options = {}) {
5584
5663
  }
5585
5664
  }
5586
5665
 
5587
- async function publishSafetyCheck({ config }) {
5588
- if (!config.safetyCheck || !config.release.publish || !config.publish.safetyCheck) {
5589
- logger.debug("Safety check disabled or publish disabled");
5590
- return;
5591
- }
5592
- logger.debug("Start checking auth config to package registry");
5593
- const isPnpmOrNpm = config.publish.packageManager === "pnpm" || config.publish.packageManager === "npm";
5594
- if (!isPnpmOrNpm) {
5595
- logger.debug(`Skipping authentication to package registry because "${config.publish.packageManager}" is not supported`);
5596
- return;
5597
- }
5666
+ async function checkRegistryAuth({
5667
+ config,
5668
+ registryTarget,
5669
+ registryLabel
5670
+ }) {
5598
5671
  const authCommand = getAuthCommand({
5599
5672
  packageManager: config.publish.packageManager,
5600
5673
  config,
5601
- otp: config.publish.otp
5674
+ registryTarget,
5675
+ otp: registryTarget.otp
5602
5676
  });
5603
5677
  const timeoutMs = config.publish.safetyCheckTimeout ?? 15e3;
5604
5678
  const patienceDelay = Math.min(5e3, Math.floor(timeoutMs / 2));
@@ -5606,7 +5680,7 @@ async function publishSafetyCheck({ config }) {
5606
5680
  logger.info(`The package registry is taking longer than expected to respond (will time out at ${Math.round(timeoutMs / 1e3)}s)...`);
5607
5681
  }, patienceDelay);
5608
5682
  try {
5609
- logger.info("Authenticating to package registry...");
5683
+ logger.info(`Authenticating to package registry${registryLabel}...`);
5610
5684
  await execPromise(authCommand, {
5611
5685
  cwd: config.cwd,
5612
5686
  timeout: timeoutMs,
@@ -5616,19 +5690,37 @@ async function publishSafetyCheck({ config }) {
5616
5690
  noError: true,
5617
5691
  logLevel: config.logLevel
5618
5692
  });
5619
- logger.info("Successfully authenticated to package registry");
5693
+ logger.info(`Successfully authenticated to package registry${registryLabel}`);
5620
5694
  } catch (error) {
5621
5695
  if (error?.killed) {
5622
5696
  throw new Error(
5623
- `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.`,
5697
+ `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.`,
5624
5698
  { cause: error }
5625
5699
  );
5626
5700
  }
5627
- throw new Error("Failed to authenticate to package registry", { cause: error });
5701
+ throw new Error(`Failed to authenticate to package registry${registryLabel}`, { cause: error });
5628
5702
  } finally {
5629
5703
  clearTimeout(patienceTimer);
5630
5704
  }
5631
5705
  }
5706
+ async function publishSafetyCheck({ config, packages }) {
5707
+ if (!config.safetyCheck || !config.release.publish || !config.publish.safetyCheck) {
5708
+ logger.debug("Safety check disabled or publish disabled");
5709
+ return;
5710
+ }
5711
+ logger.debug("Start checking auth config to package registry");
5712
+ const isPnpmOrNpm = config.publish.packageManager === "pnpm" || config.publish.packageManager === "npm";
5713
+ if (!isPnpmOrNpm) {
5714
+ logger.debug(`Skipping authentication to package registry because "${config.publish.packageManager}" is not supported`);
5715
+ return;
5716
+ }
5717
+ const registryTargets = packages ? resolveRegistryTargetsForPackages(packages, config) : resolveAllConfiguredRegistryTargets(config);
5718
+ const showRegistryLabel = registryTargets.length > 1;
5719
+ for (const registryTarget of registryTargets) {
5720
+ const registryLabel = showRegistryLabel ? ` [${registryTarget.name ?? registryTarget.registry ?? "default"}]` : "";
5721
+ await checkRegistryAuth({ config, registryTarget, registryLabel });
5722
+ }
5723
+ }
5632
5724
  async function publish(options = {}) {
5633
5725
  const config = await loadRelizyConfig({
5634
5726
  configFile: options.configName,
@@ -5638,6 +5730,7 @@ async function publish(options = {}) {
5638
5730
  access: options.access,
5639
5731
  otp: options.otp,
5640
5732
  registry: options.registry,
5733
+ registries: options.registries,
5641
5734
  tag: options.tag,
5642
5735
  buildCmd: options.buildCmd,
5643
5736
  token: options.token
@@ -5658,7 +5751,6 @@ async function publish(options = {}) {
5658
5751
  }
5659
5752
  try {
5660
5753
  await executeHook("before:publish", config, dryRun);
5661
- await publishSafetyCheck({ config });
5662
5754
  const rootPackage = readPackageJson(config.cwd);
5663
5755
  if (!rootPackage) {
5664
5756
  throw new Error("Failed to read root package.json");
@@ -5697,6 +5789,7 @@ async function publish(options = {}) {
5697
5789
  logger.fail("No packages need to be published");
5698
5790
  return;
5699
5791
  }
5792
+ await publishSafetyCheck({ config, packages: publishedPackages });
5700
5793
  await executeBuildCmd({
5701
5794
  config,
5702
5795
  dryRun
@@ -5813,7 +5906,8 @@ async function handleTwitterPost({
5813
5906
  changelog,
5814
5907
  dryRun,
5815
5908
  newVersion,
5816
- tag
5909
+ tag,
5910
+ prerelease
5817
5911
  }) {
5818
5912
  const twitterConfig = config.social?.twitter;
5819
5913
  if (!twitterConfig?.enabled) {
@@ -5832,7 +5926,8 @@ async function handleTwitterPost({
5832
5926
  logger.debug("Credentials found \u2713");
5833
5927
  logger.debug("Preparing tweet for release");
5834
5928
  const onlyStable = twitterConfig.onlyStable;
5835
- if (onlyStable && isPrerelease(newVersion)) {
5929
+ const isPre = prerelease ?? isPrerelease(newVersion);
5930
+ if (onlyStable && isPre) {
5836
5931
  logger.info(`Skipping Twitter post for prerelease version ${newVersion} (social.twitter.onlyStable is enabled)`);
5837
5932
  return { success: true, response: void 0 };
5838
5933
  }
@@ -5880,7 +5975,8 @@ async function handleSlackPost({
5880
5975
  newVersion,
5881
5976
  tag,
5882
5977
  commits,
5883
- bumpedPackages
5978
+ bumpedPackages,
5979
+ prerelease
5884
5980
  }) {
5885
5981
  const slackConfig = config.social?.slack;
5886
5982
  if (!slackConfig?.enabled) {
@@ -5908,7 +6004,8 @@ async function handleSlackPost({
5908
6004
  logger.debug(`Slack: ${slackMode}`);
5909
6005
  logger.debug(`Preparing Slack message for release: ${tag} (${newVersion})`);
5910
6006
  const onlyStable = slackConfig.onlyStable ?? true;
5911
- if (onlyStable && isPrerelease(newVersion)) {
6007
+ const isPre = prerelease ?? isPrerelease(newVersion);
6008
+ if (onlyStable && isPre) {
5912
6009
  logger.info(`Skipping Slack post for prerelease version ${newVersion} (social.slack.onlyStable is enabled)`);
5913
6010
  return { success: true, response: void 0 };
5914
6011
  }
@@ -5985,43 +6082,126 @@ async function social(options = {}) {
5985
6082
  if (!rootPackageRead) {
5986
6083
  throw new Error("Failed to read root package.json");
5987
6084
  }
5988
- const newVersion = options.bumpResult?.newVersion || rootPackageRead.version;
5989
- const { from, to } = await resolveTags({
5990
- config,
5991
- step: "social",
5992
- newVersion,
5993
- pkg: rootPackageRead
5994
- });
5995
- const fromTag = options.bumpResult?.fromTag || from;
5996
- const rootPackage = options.bumpResult?.rootPackage || await getRootPackage({
5997
- config,
5998
- force: false,
5999
- suffix: void 0,
6000
- changelog: true,
6001
- from: fromTag,
6002
- to,
6003
- dryRun
6004
- });
6005
- const minifiedBody = await generateChangelog({
6006
- pkg: { ...rootPackage, fromTag },
6007
- config,
6008
- dryRun,
6009
- newVersion,
6010
- include: { title: false, compareLink: false, body: true, contributors: false },
6011
- minify: true
6012
- });
6013
- const richBody = await generateChangelog({
6014
- pkg: { ...rootPackage, fromTag },
6015
- config,
6016
- dryRun,
6017
- newVersion,
6018
- include: { title: false, compareLink: false, body: true, contributors: false },
6019
- minify: false
6020
- });
6085
+ const isIndependent = config.monorepo?.versionMode === "independent";
6086
+ let minifiedBody;
6087
+ let richBody;
6088
+ let newVersion;
6089
+ let tag;
6090
+ let changelogCommits;
6091
+ let prerelease;
6092
+ if (isIndependent) {
6093
+ const packages = filterOutPrivatePackages(await getPackagesOrBumpedPackages({
6094
+ config,
6095
+ bumpResult: options.bumpResult,
6096
+ suffix: options.suffix,
6097
+ force: options.force ?? false,
6098
+ dryRun
6099
+ }));
6100
+ const minifiedSections = [];
6101
+ const richSections = [];
6102
+ const commitsByHash = /* @__PURE__ */ new Map();
6103
+ for (const pkg of packages) {
6104
+ const pkgVersion = isBumpedPackage(pkg) && pkg.newVersion || pkg.version;
6105
+ const from = config.from || pkg.fromTag;
6106
+ if (!from) {
6107
+ logger.warn(`No from tag found for ${pkg.name}, skipping its changelog section`);
6108
+ continue;
6109
+ }
6110
+ const minSection = await generateChangelog({
6111
+ pkg: { ...pkg, fromTag: from },
6112
+ config,
6113
+ dryRun,
6114
+ newVersion: pkgVersion,
6115
+ include: { title: true, compareLink: false, body: true, contributors: false },
6116
+ minify: true
6117
+ });
6118
+ const richSection = await generateChangelog({
6119
+ pkg: { ...pkg, fromTag: from },
6120
+ config,
6121
+ dryRun,
6122
+ newVersion: pkgVersion,
6123
+ include: { title: true, compareLink: false, body: true, contributors: false },
6124
+ minify: false
6125
+ });
6126
+ if (minSection.trim()) {
6127
+ minifiedSections.push(minSection);
6128
+ }
6129
+ if (richSection.trim()) {
6130
+ richSections.push(richSection);
6131
+ }
6132
+ const pkgCommits = await getPackageCommits({
6133
+ pkg,
6134
+ from,
6135
+ to: "HEAD",
6136
+ config,
6137
+ changelog: true,
6138
+ dryRun
6139
+ });
6140
+ for (const commit of pkgCommits) {
6141
+ commitsByHash.set(commit.shortHash || commit.message, commit);
6142
+ }
6143
+ }
6144
+ minifiedBody = minifiedSections.join("\n\n");
6145
+ richBody = richSections.join("\n\n");
6146
+ changelogCommits = [...commitsByHash.values()];
6147
+ prerelease = packages.length > 0 && packages.every((pkg) => isPrerelease(isBumpedPackage(pkg) && pkg.newVersion || pkg.version));
6148
+ if (packages.length === 1) {
6149
+ const only = packages[0];
6150
+ newVersion = isBumpedPackage(only) && only.newVersion || only.version;
6151
+ tag = getIndependentTag({ version: newVersion, name: only.name });
6152
+ } else {
6153
+ newVersion = `${packages.length} packages`;
6154
+ tag = "";
6155
+ }
6156
+ } else {
6157
+ const resolvedNewVersion = options.bumpResult?.newVersion || rootPackageRead.version;
6158
+ const { from, to } = await resolveTags({
6159
+ config,
6160
+ step: "social",
6161
+ newVersion: resolvedNewVersion,
6162
+ pkg: rootPackageRead
6163
+ });
6164
+ const fromTag = options.bumpResult?.fromTag || from;
6165
+ const rootPackage = options.bumpResult?.rootPackage || await getRootPackage({
6166
+ config,
6167
+ force: false,
6168
+ suffix: void 0,
6169
+ changelog: true,
6170
+ from: fromTag,
6171
+ to,
6172
+ dryRun
6173
+ });
6174
+ minifiedBody = await generateChangelog({
6175
+ pkg: { ...rootPackage, fromTag },
6176
+ config,
6177
+ dryRun,
6178
+ newVersion: resolvedNewVersion,
6179
+ include: { title: false, compareLink: false, body: true, contributors: false },
6180
+ minify: true
6181
+ });
6182
+ richBody = await generateChangelog({
6183
+ pkg: { ...rootPackage, fromTag },
6184
+ config,
6185
+ dryRun,
6186
+ newVersion: resolvedNewVersion,
6187
+ include: { title: false, compareLink: false, body: true, contributors: false },
6188
+ minify: false
6189
+ });
6190
+ newVersion = resolvedNewVersion;
6191
+ tag = to;
6192
+ changelogCommits = await getPackageCommits({
6193
+ pkg: rootPackage,
6194
+ from: fromTag,
6195
+ to: "HEAD",
6196
+ config,
6197
+ changelog: true,
6198
+ dryRun
6199
+ });
6200
+ prerelease = isPrerelease(newVersion);
6201
+ }
6021
6202
  const hasContent = !!minifiedBody.trim();
6022
- const twitterReleaseUrl = getReleaseUrl(config, to);
6203
+ const twitterReleaseUrl = getReleaseUrl(config, tag);
6023
6204
  const twitterChangelogUrl = config.social?.changelogUrl;
6024
- const prerelease = isPrerelease(newVersion);
6025
6205
  const twitterWillPost = !!config.social?.twitter?.enabled && !(config.social.twitter.onlyStable && prerelease);
6026
6206
  const slackWillPost = !!config.social?.slack?.enabled && !((config.social.slack.onlyStable ?? true) && prerelease);
6027
6207
  let twitterChangelog = minifiedBody;
@@ -6065,24 +6245,18 @@ ${twitterChangelog}`);
6065
6245
  changelog: twitterChangelog,
6066
6246
  dryRun,
6067
6247
  newVersion,
6068
- tag: to
6069
- });
6070
- const changelogCommits = await getPackageCommits({
6071
- pkg: rootPackage,
6072
- from: fromTag,
6073
- to: "HEAD",
6074
- config,
6075
- changelog: true,
6076
- dryRun
6248
+ tag,
6249
+ prerelease
6077
6250
  });
6078
6251
  const slackResponse = await handleSlackPost({
6079
6252
  config,
6080
6253
  changelog: slackChangelog,
6081
6254
  dryRun,
6082
6255
  newVersion,
6083
- tag: to,
6256
+ tag,
6084
6257
  commits: changelogCommits,
6085
- bumpedPackages: options.bumpResult?.bumpedPackages
6258
+ bumpedPackages: options.bumpResult?.bumpedPackages,
6259
+ prerelease
6086
6260
  });
6087
6261
  const results = [];
6088
6262
  if (config.social?.twitter?.enabled) {
@@ -6143,6 +6317,7 @@ function getReleaseConfig(options = {}) {
6143
6317
  access: options.access,
6144
6318
  otp: options.otp,
6145
6319
  registry: options.registry,
6320
+ registries: options.registries,
6146
6321
  tag: options.tag,
6147
6322
  buildCmd: options.buildCmd,
6148
6323
  token: options.publishToken
@@ -6452,4 +6627,4 @@ Git provider: ${provider}`);
6452
6627
  }
6453
6628
  }
6454
6629
 
6455
- 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 };
6630
+ 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.8",
4
+ "version": "1.5.0-beta.0",
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}": [