@bonvoy/plugin-npm 0.1.0 → 0.2.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 ADDED
@@ -0,0 +1,83 @@
1
+ # @bonvoy/plugin-npm 🚢
2
+
3
+ > npm publishing plugin for bonvoy
4
+
5
+ Publishes packages to the npm registry with OIDC provenance support.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install @bonvoy/plugin-npm
11
+ ```
12
+
13
+ ## Features
14
+
15
+ - ✅ Publishes packages to npm registry
16
+ - ✅ OIDC provenance support for supply chain security
17
+ - ✅ Skips already published versions
18
+ - ✅ Skips private packages
19
+ - ✅ Configurable access level (public/restricted)
20
+ - ✅ Custom registry support
21
+ - ✅ Dry-run support
22
+
23
+ ## Configuration
24
+
25
+ ```javascript
26
+ // bonvoy.config.js
27
+ export default {
28
+ npm: {
29
+ registry: 'https://registry.npmjs.org', // default
30
+ access: 'public', // default for scoped packages
31
+ provenance: true, // default in CI
32
+ skipExisting: true, // default
33
+ },
34
+ };
35
+ ```
36
+
37
+ ## Hooks
38
+
39
+ This plugin taps into the following hooks:
40
+
41
+ | Hook | Action |
42
+ |------|--------|
43
+ | `publish` | Publishes packages to npm registry |
44
+
45
+ ## Requirements
46
+
47
+ For OIDC provenance in GitHub Actions:
48
+
49
+ ```yaml
50
+ permissions:
51
+ id-token: write
52
+ contents: read
53
+ ```
54
+
55
+ ## Behavior
56
+
57
+ During the `publish` hook:
58
+
59
+ 1. Checks if package is private (skips if true)
60
+ 2. Checks if version already exists on npm (skips if true)
61
+ 3. Publishes with `npm publish --access public --provenance`
62
+
63
+ ## Private Packages
64
+
65
+ Packages with `"private": true` in package.json are automatically skipped.
66
+
67
+ ## Scoped Packages
68
+
69
+ Scoped packages (e.g., `@bonvoy/core`) default to `restricted` access on npm. Set `access: 'public'` to publish publicly.
70
+
71
+ ## Custom Registry
72
+
73
+ ```javascript
74
+ export default {
75
+ npm: {
76
+ registry: 'https://npm.pkg.github.com',
77
+ },
78
+ };
79
+ ```
80
+
81
+ ## License
82
+
83
+ MIT
package/dist/index.d.mts CHANGED
@@ -1,5 +1,14 @@
1
1
  import { BonvoyPlugin } from "@bonvoy/core";
2
2
 
3
+ //#region src/operations.d.ts
4
+ interface NpmOperations {
5
+ publish(args: string[], cwd: string): Promise<void>;
6
+ view(pkg: string, version: string): Promise<string | null>;
7
+ packageExists(pkg: string): Promise<boolean>;
8
+ hasToken(): Promise<boolean>;
9
+ }
10
+ declare const defaultNpmOperations: NpmOperations;
11
+ //#endregion
3
12
  //#region src/npm.d.ts
4
13
  interface NpmPluginConfig {
5
14
  registry?: string;
@@ -11,16 +20,19 @@ interface NpmPluginConfig {
11
20
  declare class NpmPlugin implements BonvoyPlugin {
12
21
  name: string;
13
22
  private config;
14
- constructor(config?: NpmPluginConfig);
23
+ private ops;
24
+ constructor(config?: NpmPluginConfig, ops?: NpmOperations);
15
25
  apply(bonvoy: {
16
26
  hooks: {
27
+ validateRepo: any;
17
28
  publish: any;
18
29
  };
19
30
  }): void;
20
31
  private publishPackages;
21
32
  private publishPackage;
22
33
  private isAlreadyPublished;
34
+ private validatePackages;
23
35
  }
24
36
  //#endregion
25
- export { type NpmPluginConfig, NpmPlugin as default };
37
+ export { type NpmOperations, type NpmPluginConfig, NpmPlugin as default, defaultNpmOperations };
26
38
  //# sourceMappingURL=index.d.mts.map
package/dist/index.mjs CHANGED
@@ -1,10 +1,48 @@
1
1
  import { execa } from "execa";
2
2
 
3
+ //#region src/operations.ts
4
+ const defaultNpmOperations = {
5
+ async publish(args, cwd) {
6
+ await execa("npm", ["publish", ...args], {
7
+ cwd,
8
+ stdio: "inherit"
9
+ });
10
+ },
11
+ async view(pkg, version) {
12
+ try {
13
+ return (await execa("npm", [
14
+ "view",
15
+ `${pkg}@${version}`,
16
+ "version"
17
+ ], { stdio: "pipe" })).stdout.trim() || null;
18
+ } catch {
19
+ return null;
20
+ }
21
+ },
22
+ async packageExists(pkg) {
23
+ try {
24
+ await execa("npm", [
25
+ "view",
26
+ pkg,
27
+ "name"
28
+ ], { stdio: "pipe" });
29
+ return true;
30
+ } catch {
31
+ return false;
32
+ }
33
+ },
34
+ async hasToken() {
35
+ return !!process.env.NPM_TOKEN || !!process.env.NODE_AUTH_TOKEN;
36
+ }
37
+ };
38
+
39
+ //#endregion
3
40
  //#region src/npm.ts
4
41
  var NpmPlugin = class {
5
42
  name = "npm";
6
43
  config;
7
- constructor(config = {}) {
44
+ ops;
45
+ constructor(config = {}, ops) {
8
46
  this.config = {
9
47
  registry: config.registry ?? "https://registry.npmjs.org",
10
48
  access: config.access ?? "public",
@@ -12,47 +50,70 @@ var NpmPlugin = class {
12
50
  skipExisting: config.skipExisting ?? true,
13
51
  provenance: config.provenance ?? true
14
52
  };
53
+ this.ops = ops ?? defaultNpmOperations;
15
54
  }
16
55
  apply(bonvoy) {
56
+ bonvoy.hooks.validateRepo.tapPromise(this.name, async (context) => {
57
+ await this.validatePackages(context);
58
+ });
17
59
  bonvoy.hooks.publish.tapPromise(this.name, async (context) => {
60
+ if (context.isDryRun) {
61
+ context.logger.info("🔍 [dry-run] Would publish packages to npm");
62
+ return;
63
+ }
18
64
  await this.publishPackages(context);
19
65
  });
20
66
  }
21
67
  async publishPackages(context) {
22
- const { packages } = context;
68
+ const { packages, logger } = context;
23
69
  for (const pkg of packages) {
24
70
  if (this.config.skipExisting && await this.isAlreadyPublished(pkg)) {
25
- console.log(`Skipping ${pkg.name}@${pkg.version} - already published`);
71
+ logger.info(`Skipping ${pkg.name}@${pkg.version} - already published`);
26
72
  continue;
27
73
  }
28
- await this.publishPackage(pkg);
74
+ await this.publishPackage(pkg, logger);
29
75
  }
30
76
  }
31
- async publishPackage(pkg) {
32
- const args = ["publish"];
77
+ async publishPackage(pkg, logger) {
78
+ const args = [];
33
79
  if (this.config.dryRun) args.push("--dry-run");
34
80
  args.push("--access", this.config.access);
35
81
  if (this.config.provenance) args.push("--provenance");
36
82
  if (this.config.registry !== "https://registry.npmjs.org") args.push("--registry", this.config.registry);
37
- console.log(`Publishing ${pkg.name}@${pkg.version}...`);
38
- await execa("npm", args, {
39
- cwd: pkg.path,
40
- stdio: "inherit"
41
- });
83
+ logger.info(`Publishing ${pkg.name}@${pkg.version}...`);
84
+ await this.ops.publish(args, pkg.path);
42
85
  }
43
86
  async isAlreadyPublished(pkg) {
44
- try {
45
- return (await execa("npm", [
46
- "view",
47
- `${pkg.name}@${pkg.version}`,
48
- "version"
49
- ], { stdio: "pipe" })).stdout.trim() === pkg.version;
50
- } catch {
51
- return false;
87
+ return await this.ops.view(pkg.name, pkg.version) === pkg.version;
88
+ }
89
+ async validatePackages(context) {
90
+ const { changedPackages, versions, logger } = context;
91
+ if (!versions) return;
92
+ const alreadyPublished = [];
93
+ const needsToken = [];
94
+ const hasToken = await this.ops.hasToken();
95
+ for (const pkg of changedPackages) {
96
+ const version = versions[pkg.name];
97
+ if (!version) continue;
98
+ if (await this.ops.view(pkg.name, version) === version) {
99
+ alreadyPublished.push(`${pkg.name}@${version}`);
100
+ continue;
101
+ }
102
+ if (!hasToken && this.config.provenance) {
103
+ if (!await this.ops.packageExists(pkg.name)) needsToken.push(pkg.name);
104
+ }
105
+ }
106
+ if (alreadyPublished.length > 0) {
107
+ logger.error(`❌ npm versions already published: ${alreadyPublished.join(", ")}`);
108
+ throw new Error(`Cannot release: npm versions already exist (${alreadyPublished.join(", ")}). Bump to a new version.`);
109
+ }
110
+ if (needsToken.length > 0) {
111
+ logger.error(`❌ First publish requires NPM_TOKEN: ${needsToken.join(", ")}`);
112
+ throw new Error(`Cannot release with OIDC: packages don't exist on npm yet (${needsToken.join(", ")}). First publish requires NPM_TOKEN. Run: node scripts/publish-dummy-packages.mjs`);
52
113
  }
53
114
  }
54
115
  };
55
116
 
56
117
  //#endregion
57
- export { NpmPlugin as default };
118
+ export { NpmPlugin as default, defaultNpmOperations };
58
119
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/npm.ts"],"sourcesContent":["import type { BonvoyPlugin, PublishContext } from '@bonvoy/core';\nimport { execa } from 'execa';\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\n constructor(config: NpmPluginConfig = {}) {\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 }\n\n // biome-ignore lint/suspicious/noExplicitAny: Hook types are complex and vary by implementation\n apply(bonvoy: { hooks: { publish: any } }): void {\n bonvoy.hooks.publish.tapPromise(this.name, async (context: PublishContext) => {\n await this.publishPackages(context);\n });\n }\n\n private async publishPackages(context: PublishContext): Promise<void> {\n const { packages } = context;\n\n for (const pkg of packages) {\n if (this.config.skipExisting && (await this.isAlreadyPublished(pkg))) {\n console.log(`Skipping ${pkg.name}@${pkg.version} - already published`);\n continue;\n }\n\n await this.publishPackage(pkg);\n }\n }\n\n private async publishPackage(pkg: {\n name: string;\n version: string;\n path: string;\n }): Promise<void> {\n const args = ['publish'];\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 console.log(`Publishing ${pkg.name}@${pkg.version}...`);\n\n await execa('npm', args, {\n cwd: pkg.path,\n stdio: 'inherit',\n });\n }\n\n private async isAlreadyPublished(pkg: { name: string; version: string }): Promise<boolean> {\n try {\n const result = await execa('npm', ['view', `${pkg.name}@${pkg.version}`, 'version'], {\n stdio: 'pipe',\n });\n return result.stdout.trim() === pkg.version;\n } catch {\n return false;\n }\n }\n}\n"],"mappings":";;;AAWA,IAAqB,YAArB,MAAuD;CACrD,OAAO;CAEP,AAAQ;CAER,YAAY,SAA0B,EAAE,EAAE;AACxC,OAAK,SAAS;GACZ,UAAU,OAAO,YAAY;GAC7B,QAAQ,OAAO,UAAU;GACzB,QAAQ,OAAO,UAAU;GACzB,cAAc,OAAO,gBAAgB;GACrC,YAAY,OAAO,cAAc;GAClC;;CAIH,MAAM,QAA2C;AAC/C,SAAO,MAAM,QAAQ,WAAW,KAAK,MAAM,OAAO,YAA4B;AAC5E,SAAM,KAAK,gBAAgB,QAAQ;IACnC;;CAGJ,MAAc,gBAAgB,SAAwC;EACpE,MAAM,EAAE,aAAa;AAErB,OAAK,MAAM,OAAO,UAAU;AAC1B,OAAI,KAAK,OAAO,gBAAiB,MAAM,KAAK,mBAAmB,IAAI,EAAG;AACpE,YAAQ,IAAI,YAAY,IAAI,KAAK,GAAG,IAAI,QAAQ,sBAAsB;AACtE;;AAGF,SAAM,KAAK,eAAe,IAAI;;;CAIlC,MAAc,eAAe,KAIX;EAChB,MAAM,OAAO,CAAC,UAAU;AAExB,MAAI,KAAK,OAAO,OACd,MAAK,KAAK,YAAY;AAGxB,OAAK,KAAK,YAAY,KAAK,OAAO,OAAO;AAEzC,MAAI,KAAK,OAAO,WACd,MAAK,KAAK,eAAe;AAG3B,MAAI,KAAK,OAAO,aAAa,6BAC3B,MAAK,KAAK,cAAc,KAAK,OAAO,SAAS;AAG/C,UAAQ,IAAI,cAAc,IAAI,KAAK,GAAG,IAAI,QAAQ,KAAK;AAEvD,QAAM,MAAM,OAAO,MAAM;GACvB,KAAK,IAAI;GACT,OAAO;GACR,CAAC;;CAGJ,MAAc,mBAAmB,KAA0D;AACzF,MAAI;AAIF,WAHe,MAAM,MAAM,OAAO;IAAC;IAAQ,GAAG,IAAI,KAAK,GAAG,IAAI;IAAW;IAAU,EAAE,EACnF,OAAO,QACR,CAAC,EACY,OAAO,MAAM,KAAK,IAAI;UAC9B;AACN,UAAO"}
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}\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 /* c8 ignore stop */\n};\n","import type { BonvoyPlugin, Context, PublishContext } 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 } }): 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\n private async publishPackages(context: PublishContext): Promise<void> {\n const { packages, logger } = 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);\n }\n }\n\n private async publishPackage(\n pkg: { name: string; version: string; path: string },\n logger: PublishContext['logger'],\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 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 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. Run: node scripts/publish-dummy-packages.mjs`,\n );\n }\n }\n}\n\nexport { defaultNpmOperations, type NpmOperations } from './operations.js';\n"],"mappings":";;;AASA,MAAa,uBAAsC;CACjD,MAAM,QAAQ,MAAM,KAAK;AACvB,QAAM,MAAM,OAAO,CAAC,WAAW,GAAG,KAAK,EAAE;GAAE;GAAK,OAAO;GAAW,CAAC;;CAGrE,MAAM,KAAK,KAAK,SAAS;AACvB,MAAI;AAIF,WAHe,MAAM,MAAM,OAAO;IAAC;IAAQ,GAAG,IAAI,GAAG;IAAW;IAAU,EAAE,EAC1E,OAAO,QACR,CAAC,EACY,OAAO,MAAM,IAAI;UACzB;AACN,UAAO;;;CAKX,MAAM,cAAc,KAAK;AACvB,MAAI;AACF,SAAM,MAAM,OAAO;IAAC;IAAQ;IAAK;IAAO,EAAE,EAAE,OAAO,QAAQ,CAAC;AAC5D,UAAO;UACD;AACN,UAAO;;;CAIX,MAAM,WAAW;AACf,SAAO,CAAC,CAAC,QAAQ,IAAI,aAAa,CAAC,CAAC,QAAQ,IAAI;;CAGnD;;;;AC3BD,IAAqB,YAArB,MAAuD;CACrD,OAAO;CAEP,AAAQ;CACR,AAAQ;CAER,YAAY,SAA0B,EAAE,EAAE,KAAqB;AAC7D,OAAK,SAAS;GACZ,UAAU,OAAO,YAAY;GAC7B,QAAQ,OAAO,UAAU;GACzB,QAAQ,OAAO,UAAU;GACzB,cAAc,OAAO,gBAAgB;GACrC,YAAY,OAAO,cAAc;GAClC;AACD,OAAK,MAAM,OAAO;;CAIpB,MAAM,QAA8D;AAClE,SAAO,MAAM,aAAa,WAAW,KAAK,MAAM,OAAO,YAAqB;AAC1E,SAAM,KAAK,iBAAiB,QAAQ;IACpC;AAEF,SAAO,MAAM,QAAQ,WAAW,KAAK,MAAM,OAAO,YAA4B;AAC5E,OAAI,QAAQ,UAAU;AACpB,YAAQ,OAAO,KAAK,6CAA6C;AACjE;;AAEF,SAAM,KAAK,gBAAgB,QAAQ;IACnC;;CAGJ,MAAc,gBAAgB,SAAwC;EACpE,MAAM,EAAE,UAAU,WAAW;AAE7B,OAAK,MAAM,OAAO,UAAU;AAC1B,OAAI,KAAK,OAAO,gBAAiB,MAAM,KAAK,mBAAmB,IAAI,EAAG;AACpE,WAAO,KAAK,YAAY,IAAI,KAAK,GAAG,IAAI,QAAQ,sBAAsB;AACtE;;AAGF,SAAM,KAAK,eAAe,KAAK,OAAO;;;CAI1C,MAAc,eACZ,KACA,QACe;EACf,MAAM,OAAiB,EAAE;AAEzB,MAAI,KAAK,OAAO,OACd,MAAK,KAAK,YAAY;AAGxB,OAAK,KAAK,YAAY,KAAK,OAAO,OAAO;AAEzC,MAAI,KAAK,OAAO,WACd,MAAK,KAAK,eAAe;AAG3B,MAAI,KAAK,OAAO,aAAa,6BAC3B,MAAK,KAAK,cAAc,KAAK,OAAO,SAAS;AAG/C,SAAO,KAAK,cAAc,IAAI,KAAK,GAAG,IAAI,QAAQ,KAAK;AAEvD,QAAM,KAAK,IAAI,QAAQ,MAAM,IAAI,KAAK;;CAGxC,MAAc,mBAAmB,KAA0D;AAEzF,SADgB,MAAM,KAAK,IAAI,KAAK,IAAI,MAAM,IAAI,QAAQ,KACvC,IAAI;;CAGzB,MAAc,iBAAiB,SAAiC;EAC9D,MAAM,EAAE,iBAAiB,UAAU,WAAW;AAC9C,MAAI,CAAC,SAAU;EAEf,MAAM,mBAA6B,EAAE;EACrC,MAAM,aAAuB,EAAE;EAC/B,MAAM,WAAW,MAAM,KAAK,IAAI,UAAU;AAE1C,OAAK,MAAM,OAAO,iBAAiB;GACjC,MAAM,UAAU,SAAS,IAAI;AAC7B,OAAI,CAAC,QAAS;AAId,OADwB,MAAM,KAAK,IAAI,KAAK,IAAI,MAAM,QAAQ,KACtC,SAAS;AAC/B,qBAAiB,KAAK,GAAG,IAAI,KAAK,GAAG,UAAU;AAC/C;;AAIF,OAAI,CAAC,YAAY,KAAK,OAAO,YAE3B;QAAI,CADW,MAAM,KAAK,IAAI,cAAc,IAAI,KAAK,CAEnD,YAAW,KAAK,IAAI,KAAK;;;AAK/B,MAAI,iBAAiB,SAAS,GAAG;AAC/B,UAAO,MAAM,qCAAqC,iBAAiB,KAAK,KAAK,GAAG;AAChF,SAAM,IAAI,MACR,+CAA+C,iBAAiB,KAAK,KAAK,CAAC,2BAC5E;;AAGH,MAAI,WAAW,SAAS,GAAG;AACzB,UAAO,MAAM,uCAAuC,WAAW,KAAK,KAAK,GAAG;AAC5E,SAAM,IAAI,MACR,8DAA8D,WAAW,KAAK,KAAK,CAAC,mFACrF"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bonvoy/plugin-npm",
3
- "version": "0.1.0",
4
- "description": "npm publishing plugin for bonvoy",
3
+ "version": "0.2.0",
4
+ "description": "🚢 npm publishing plugin for bonvoy",
5
5
  "keywords": [
6
6
  "bonvoy",
7
7
  "plugin",
@@ -28,7 +28,6 @@
28
28
  ".": "./dist/index.mjs",
29
29
  "./package.json": "./package.json"
30
30
  },
31
- "types": "./dist/index.d.mts",
32
31
  "files": [
33
32
  "dist"
34
33
  ],
@@ -39,9 +38,6 @@
39
38
  "dependencies": {
40
39
  "execa": "^9.6.1"
41
40
  },
42
- "devDependencies": {
43
- "vitest": "^4.0.16"
44
- },
45
41
  "engines": {
46
42
  "node": ">= 20.5"
47
43
  }