@bonvoy/plugin-npm 0.4.1 â 0.12.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/dist/index.d.mts +1 -1
- package/dist/index.mjs +12 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -2,7 +2,7 @@ import { BonvoyPlugin } from "@bonvoy/core";
|
|
|
2
2
|
|
|
3
3
|
//#region src/operations.d.ts
|
|
4
4
|
interface NpmOperations {
|
|
5
|
-
publish(args: string[], cwd: string): Promise<
|
|
5
|
+
publish(args: string[], cwd: string): Promise<string>;
|
|
6
6
|
view(pkg: string, version: string): Promise<string | null>;
|
|
7
7
|
packageExists(pkg: string): Promise<boolean>;
|
|
8
8
|
hasToken(): Promise<boolean>;
|
package/dist/index.mjs
CHANGED
|
@@ -3,10 +3,11 @@ import { execa } from "execa";
|
|
|
3
3
|
//#region src/operations.ts
|
|
4
4
|
const defaultNpmOperations = {
|
|
5
5
|
async publish(args, cwd) {
|
|
6
|
-
await execa("npm", ["publish", ...args], {
|
|
6
|
+
const result = await execa("npm", ["publish", ...args], {
|
|
7
7
|
cwd,
|
|
8
|
-
stdio: "
|
|
8
|
+
stdio: "pipe"
|
|
9
9
|
});
|
|
10
|
+
return result.stdout + (result.stderr ? `\n${result.stderr}` : "");
|
|
10
11
|
},
|
|
11
12
|
async view(pkg, version) {
|
|
12
13
|
try {
|
|
@@ -97,7 +98,15 @@ var NpmPlugin = class {
|
|
|
97
98
|
if (preid) args.push("--tag", preid);
|
|
98
99
|
else if (pkg.version.includes("-")) args.push("--tag", "next");
|
|
99
100
|
logger.info(`Publishing ${pkg.name}@${pkg.version}...`);
|
|
100
|
-
|
|
101
|
+
try {
|
|
102
|
+
const output = await this.ops.publish(args, pkg.path);
|
|
103
|
+
if (output) logger.debug(output);
|
|
104
|
+
} catch (error) {
|
|
105
|
+
const stderr = error.stderr ?? "";
|
|
106
|
+
const output = [error.stdout ?? "", stderr].filter(Boolean).join("\n");
|
|
107
|
+
if (output) logger.error(output);
|
|
108
|
+
throw error;
|
|
109
|
+
}
|
|
101
110
|
}
|
|
102
111
|
async isAlreadyPublished(pkg) {
|
|
103
112
|
return await this.ops.view(pkg.name, pkg.version) === pkg.version;
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/operations.ts","../src/npm.ts"],"sourcesContent":["import { execa } from 'execa';\n\nexport interface NpmOperations {\n publish(args: string[], cwd: string): Promise<void>;\n view(pkg: string, version: string): Promise<string | null>;\n packageExists(pkg: string): Promise<boolean>;\n hasToken(): Promise<boolean>;\n unpublish(pkg: string, version: string): Promise<void>;\n}\n\nexport const defaultNpmOperations: NpmOperations = {\n async publish(args, cwd) {\n await execa('npm', ['publish', ...args], { cwd, stdio: 'inherit' });\n },\n\n async view(pkg, version) {\n try {\n const result = await execa('npm', ['view', `${pkg}@${version}`, 'version'], {\n stdio: 'pipe',\n });\n return result.stdout.trim() || null;\n } catch {\n return null;\n }\n },\n\n /* c8 ignore start - real npm operations */\n async packageExists(pkg) {\n try {\n await execa('npm', ['view', pkg, 'name'], { stdio: 'pipe' });\n return true;\n } catch {\n return false;\n }\n },\n\n async hasToken() {\n return !!process.env.NPM_TOKEN || !!process.env.NODE_AUTH_TOKEN;\n },\n\n async unpublish(pkg, version) {\n await execa('npm', ['unpublish', `${pkg}@${version}`], { stdio: 'pipe' });\n },\n /* c8 ignore stop */\n};\n","import type { BonvoyPlugin, Context, PublishContext, RollbackContext } from '@bonvoy/core';\n\nimport { defaultNpmOperations, type NpmOperations } from './operations.js';\n\nexport interface NpmPluginConfig {\n registry?: string;\n access?: 'public' | 'restricted';\n dryRun?: boolean;\n skipExisting?: boolean;\n provenance?: boolean;\n}\n\nexport default class NpmPlugin implements BonvoyPlugin {\n name = 'npm';\n\n private config: Required<NpmPluginConfig>;\n private ops: NpmOperations;\n\n constructor(config: NpmPluginConfig = {}, ops?: NpmOperations) {\n this.config = {\n registry: config.registry ?? 'https://registry.npmjs.org',\n access: config.access ?? 'public',\n dryRun: config.dryRun ?? false,\n skipExisting: config.skipExisting ?? true,\n provenance: config.provenance ?? true,\n };\n this.ops = ops ?? defaultNpmOperations;\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: Hook types are complex and vary by implementation\n apply(bonvoy: { hooks: { validateRepo: any; publish: any; rollback: any } }): void {\n bonvoy.hooks.validateRepo.tapPromise(this.name, async (context: Context) => {\n await this.validatePackages(context);\n });\n\n bonvoy.hooks.publish.tapPromise(this.name, async (context: PublishContext) => {\n if (context.isDryRun) {\n context.logger.info('đ [dry-run] Would publish packages to npm');\n return;\n }\n await this.publishPackages(context);\n });\n\n bonvoy.hooks.rollback.tapPromise(this.name, async (context: RollbackContext) => {\n await this.rollback(context);\n });\n }\n\n private async publishPackages(context: PublishContext): Promise<void> {\n const { packages, logger, preid, actionLog } = context;\n\n for (const pkg of packages) {\n if (this.config.skipExisting && (await this.isAlreadyPublished(pkg))) {\n logger.info(`Skipping ${pkg.name}@${pkg.version} - already published`);\n continue;\n }\n\n await this.publishPackage(pkg, logger, preid);\n actionLog.record({\n plugin: 'npm',\n action: 'publish',\n data: { name: pkg.name, version: pkg.version },\n });\n }\n }\n\n private async publishPackage(\n pkg: { name: string; version: string; path: string },\n logger: PublishContext['logger'],\n preid?: string,\n ): Promise<void> {\n const args: string[] = [];\n\n if (this.config.dryRun) {\n args.push('--dry-run');\n }\n\n args.push('--access', this.config.access);\n\n if (this.config.provenance) {\n args.push('--provenance');\n }\n\n if (this.config.registry !== 'https://registry.npmjs.org') {\n args.push('--registry', this.config.registry);\n }\n\n // Use preid as npm tag for prereleases, fallback to 'next' if version contains '-'\n if (preid) {\n args.push('--tag', preid);\n } else if (pkg.version.includes('-')) {\n args.push('--tag', 'next');\n }\n\n logger.info(`Publishing ${pkg.name}@${pkg.version}...`);\n\n await this.ops.publish(args, pkg.path);\n }\n\n private async isAlreadyPublished(pkg: { name: string; version: string }): Promise<boolean> {\n const version = await this.ops.view(pkg.name, pkg.version);\n return version === pkg.version;\n }\n\n private async rollback(context: RollbackContext): Promise<void> {\n const { logger } = context;\n const actions = context.actions.filter((a) => a.plugin === 'npm').reverse();\n\n for (const action of actions) {\n if (action.action !== 'publish') continue;\n const { name, version } = action.data as { name: string; version: string };\n try {\n logger.info(` âŠī¸ Unpublishing ${name}@${version} (best-effort)`);\n await this.ops.unpublish(name, version);\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n logger.warn(` â ī¸ Failed to unpublish ${name}@${version}: ${msg}`);\n }\n }\n }\n\n private async validatePackages(context: Context): Promise<void> {\n const { changedPackages, versions, logger } = context;\n if (!versions) return;\n\n const alreadyPublished: string[] = [];\n const needsToken: string[] = [];\n const hasToken = await this.ops.hasToken();\n\n for (const pkg of changedPackages) {\n const version = versions[pkg.name];\n if (!version) continue;\n\n // Check if version already exists\n const existingVersion = await this.ops.view(pkg.name, version);\n if (existingVersion === version) {\n alreadyPublished.push(`${pkg.name}@${version}`);\n continue;\n }\n\n // Check if package exists (for OIDC)\n if (!hasToken && this.config.provenance) {\n const exists = await this.ops.packageExists(pkg.name);\n if (!exists) {\n needsToken.push(pkg.name);\n }\n }\n }\n\n if (alreadyPublished.length > 0) {\n logger.error(`â npm versions already published: ${alreadyPublished.join(', ')}`);\n throw new Error(\n `Cannot release: npm versions already exist (${alreadyPublished.join(', ')}). Bump to a new version.`,\n );\n }\n\n if (needsToken.length > 0) {\n logger.error(`â First publish requires NPM_TOKEN: ${needsToken.join(', ')}`);\n throw new Error(\n `Cannot release with OIDC: packages don't exist on npm yet (${needsToken.join(', ')}). First publish requires NPM_TOKEN environment variable.`,\n );\n }\n }\n}\n\nexport { defaultNpmOperations, type NpmOperations } from './operations.js';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/operations.ts","../src/npm.ts"],"sourcesContent":["import { execa } from 'execa';\n\nexport interface NpmOperations {\n publish(args: string[], cwd: string): Promise<string>;\n view(pkg: string, version: string): Promise<string | null>;\n packageExists(pkg: string): Promise<boolean>;\n hasToken(): Promise<boolean>;\n unpublish(pkg: string, version: string): Promise<void>;\n}\n\nexport const defaultNpmOperations: NpmOperations = {\n async publish(args, cwd) {\n const result = await execa('npm', ['publish', ...args], { cwd, stdio: 'pipe' });\n return result.stdout + (result.stderr ? `\\n${result.stderr}` : '');\n },\n\n async view(pkg, version) {\n try {\n const result = await execa('npm', ['view', `${pkg}@${version}`, 'version'], {\n stdio: 'pipe',\n });\n return result.stdout.trim() || null;\n } catch {\n return null;\n }\n },\n\n /* c8 ignore start - real npm operations */\n async packageExists(pkg) {\n try {\n await execa('npm', ['view', pkg, 'name'], { stdio: 'pipe' });\n return true;\n } catch {\n return false;\n }\n },\n\n async hasToken() {\n return !!process.env.NPM_TOKEN || !!process.env.NODE_AUTH_TOKEN;\n },\n\n async unpublish(pkg, version) {\n await execa('npm', ['unpublish', `${pkg}@${version}`], { stdio: 'pipe' });\n },\n /* c8 ignore stop */\n};\n","import type { BonvoyPlugin, Context, PublishContext, RollbackContext } from '@bonvoy/core';\n\nimport { defaultNpmOperations, type NpmOperations } from './operations.js';\n\nexport interface NpmPluginConfig {\n registry?: string;\n access?: 'public' | 'restricted';\n dryRun?: boolean;\n skipExisting?: boolean;\n provenance?: boolean;\n}\n\nexport default class NpmPlugin implements BonvoyPlugin {\n name = 'npm';\n\n private config: Required<NpmPluginConfig>;\n private ops: NpmOperations;\n\n constructor(config: NpmPluginConfig = {}, ops?: NpmOperations) {\n this.config = {\n registry: config.registry ?? 'https://registry.npmjs.org',\n access: config.access ?? 'public',\n dryRun: config.dryRun ?? false,\n skipExisting: config.skipExisting ?? true,\n provenance: config.provenance ?? true,\n };\n this.ops = ops ?? defaultNpmOperations;\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: Hook types are complex and vary by implementation\n apply(bonvoy: { hooks: { validateRepo: any; publish: any; rollback: any } }): void {\n bonvoy.hooks.validateRepo.tapPromise(this.name, async (context: Context) => {\n await this.validatePackages(context);\n });\n\n bonvoy.hooks.publish.tapPromise(this.name, async (context: PublishContext) => {\n if (context.isDryRun) {\n context.logger.info('đ [dry-run] Would publish packages to npm');\n return;\n }\n await this.publishPackages(context);\n });\n\n bonvoy.hooks.rollback.tapPromise(this.name, async (context: RollbackContext) => {\n await this.rollback(context);\n });\n }\n\n private async publishPackages(context: PublishContext): Promise<void> {\n const { packages, logger, preid, actionLog } = context;\n\n for (const pkg of packages) {\n if (this.config.skipExisting && (await this.isAlreadyPublished(pkg))) {\n logger.info(`Skipping ${pkg.name}@${pkg.version} - already published`);\n continue;\n }\n\n await this.publishPackage(pkg, logger, preid);\n actionLog.record({\n plugin: 'npm',\n action: 'publish',\n data: { name: pkg.name, version: pkg.version },\n });\n }\n }\n\n private async publishPackage(\n pkg: { name: string; version: string; path: string },\n logger: PublishContext['logger'],\n preid?: string,\n ): Promise<void> {\n const args: string[] = [];\n\n if (this.config.dryRun) {\n args.push('--dry-run');\n }\n\n args.push('--access', this.config.access);\n\n if (this.config.provenance) {\n args.push('--provenance');\n }\n\n if (this.config.registry !== 'https://registry.npmjs.org') {\n args.push('--registry', this.config.registry);\n }\n\n // Use preid as npm tag for prereleases, fallback to 'next' if version contains '-'\n if (preid) {\n args.push('--tag', preid);\n } else if (pkg.version.includes('-')) {\n args.push('--tag', 'next');\n }\n\n logger.info(`Publishing ${pkg.name}@${pkg.version}...`);\n\n try {\n const output = await this.ops.publish(args, pkg.path);\n if (output) logger.debug(output);\n } catch (error: unknown) {\n // On failure, include captured output in the error\n const stderr = (error as { stderr?: string }).stderr ?? '';\n const stdout = (error as { stdout?: string }).stdout ?? '';\n const output = [stdout, stderr].filter(Boolean).join('\\n');\n if (output) logger.error(output);\n throw error;\n }\n }\n\n private async isAlreadyPublished(pkg: { name: string; version: string }): Promise<boolean> {\n const version = await this.ops.view(pkg.name, pkg.version);\n return version === pkg.version;\n }\n\n private async rollback(context: RollbackContext): Promise<void> {\n const { logger } = context;\n const actions = context.actions.filter((a) => a.plugin === 'npm').reverse();\n\n for (const action of actions) {\n if (action.action !== 'publish') continue;\n const { name, version } = action.data as { name: string; version: string };\n try {\n logger.info(` âŠī¸ Unpublishing ${name}@${version} (best-effort)`);\n await this.ops.unpublish(name, version);\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n logger.warn(` â ī¸ Failed to unpublish ${name}@${version}: ${msg}`);\n }\n }\n }\n\n private async validatePackages(context: Context): Promise<void> {\n const { changedPackages, versions, logger } = context;\n if (!versions) return;\n\n const alreadyPublished: string[] = [];\n const needsToken: string[] = [];\n const hasToken = await this.ops.hasToken();\n\n for (const pkg of changedPackages) {\n const version = versions[pkg.name];\n if (!version) continue;\n\n // Check if version already exists\n const existingVersion = await this.ops.view(pkg.name, version);\n if (existingVersion === version) {\n alreadyPublished.push(`${pkg.name}@${version}`);\n continue;\n }\n\n // Check if package exists (for OIDC)\n if (!hasToken && this.config.provenance) {\n const exists = await this.ops.packageExists(pkg.name);\n if (!exists) {\n needsToken.push(pkg.name);\n }\n }\n }\n\n if (alreadyPublished.length > 0) {\n logger.error(`â npm versions already published: ${alreadyPublished.join(', ')}`);\n throw new Error(\n `Cannot release: npm versions already exist (${alreadyPublished.join(', ')}). Bump to a new version.`,\n );\n }\n\n if (needsToken.length > 0) {\n logger.error(`â First publish requires NPM_TOKEN: ${needsToken.join(', ')}`);\n throw new Error(\n `Cannot release with OIDC: packages don't exist on npm yet (${needsToken.join(', ')}). First publish requires NPM_TOKEN environment variable.`,\n );\n }\n }\n}\n\nexport { defaultNpmOperations, type NpmOperations } from './operations.js';\n"],"mappings":"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"}
|