@kb-labs/marketplace-npm 2.45.0 → 2.46.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.ts CHANGED
@@ -6,6 +6,11 @@ import { PackageSource, ResolvedPackage, InstalledPackage } from '@kb-labs/marke
6
6
  * This is the ONLY place in the marketplace codebase that calls pnpm.
7
7
  */
8
8
 
9
+ declare class PackageInstallError extends Error {
10
+ readonly code: 'NOT_FOUND' | 'INSTALL_FAILED';
11
+ readonly spec: string;
12
+ constructor(code: PackageInstallError['code'], spec: string, message: string);
13
+ }
9
14
  declare class NpmPackageSource implements PackageSource {
10
15
  resolve(spec: string): Promise<ResolvedPackage>;
11
16
  install(pkg: ResolvedPackage, root: string, opts?: {
@@ -14,4 +19,4 @@ declare class NpmPackageSource implements PackageSource {
14
19
  remove(packageId: string, root: string): Promise<void>;
15
20
  }
16
21
 
17
- export { NpmPackageSource };
22
+ export { NpmPackageSource, PackageInstallError };
package/dist/index.js CHANGED
@@ -4,6 +4,16 @@ import * as fs from 'fs/promises';
4
4
  import * as crypto from 'crypto';
5
5
 
6
6
  // src/npm-source.ts
7
+ var PackageInstallError = class extends Error {
8
+ code;
9
+ spec;
10
+ constructor(code, spec, message) {
11
+ super(message);
12
+ this.name = "PackageInstallError";
13
+ this.code = code;
14
+ this.spec = spec;
15
+ }
16
+ };
7
17
  var NpmPackageSource = class {
8
18
  async resolve(spec) {
9
19
  const id = extractPackageName(spec);
@@ -24,7 +34,13 @@ var NpmPackageSource = class {
24
34
  if (opts?.dev) {
25
35
  args.push("--save-dev");
26
36
  }
27
- await execa("pnpm", args, { cwd: root, timeout: 5 * 60 * 1e3 });
37
+ try {
38
+ await execa("pnpm", args, { cwd: root, timeout: 5 * 60 * 1e3 });
39
+ } catch (err) {
40
+ const msg = err instanceof Error ? err.message : String(err);
41
+ const code = msg.includes("ERR_PNPM_FETCH_404") || msg.includes("Not Found - 404") ? "NOT_FOUND" : "INSTALL_FAILED";
42
+ throw new PackageInstallError(code, spec, `pnpm add ${spec} failed: ${msg}`);
43
+ }
28
44
  const packageRoot = path.join(root, "node_modules", pkg.id);
29
45
  let version = pkg.version;
30
46
  try {
@@ -78,6 +94,6 @@ async function computeIntegrity(packageRoot) {
78
94
  }
79
95
  }
80
96
 
81
- export { NpmPackageSource };
97
+ export { NpmPackageSource, PackageInstallError };
82
98
  //# sourceMappingURL=index.js.map
83
99
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/npm-source.ts"],"names":["versionSep"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @module @kb-labs/marketplace-npm/npm-source\n * pnpm-based PackageSource implementation.\n * This is the ONLY place in the marketplace codebase that calls pnpm.\n */\n\nimport { execa } from 'execa';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport * as crypto from 'node:crypto';\nimport type {\n PackageSource,\n ResolvedPackage,\n InstalledPackage,\n} from '@kb-labs/marketplace-contracts';\n\nexport class NpmPackageSource implements PackageSource {\n async resolve(spec: string): Promise<ResolvedPackage> {\n const id = extractPackageName(spec);\n if (!id) {\n throw new Error(`Invalid package spec: ${spec}`);\n }\n\n return {\n id,\n version: extractVersion(spec) ?? 'latest',\n integrity: '', // computed after install\n source: 'marketplace',\n };\n }\n\n async install(\n pkg: ResolvedPackage,\n root: string,\n opts?: { dev?: boolean },\n ): Promise<InstalledPackage> {\n const spec = pkg.version === 'latest' ? pkg.id : `${pkg.id}@${pkg.version}`;\n const args = ['add', spec];\n if (opts?.dev) {args.push('--save-dev');}\n\n await execa('pnpm', args, { cwd: root, timeout: 5 * 60 * 1000 });\n\n const packageRoot = path.join(root, 'node_modules', pkg.id);\n\n // Read actual installed version\n let version = pkg.version;\n try {\n const pkgJson = JSON.parse(await fs.readFile(path.join(packageRoot, 'package.json'), 'utf-8'));\n version = pkgJson.version ?? version;\n } catch { /* use spec version */ }\n\n // Compute integrity\n const integrity = await computeIntegrity(packageRoot);\n\n return {\n id: pkg.id,\n version,\n packageRoot,\n integrity,\n };\n }\n\n async remove(packageId: string, root: string): Promise<void> {\n await execa('pnpm', ['remove', packageId], { cwd: root, timeout: 2 * 60 * 1000 });\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction extractPackageName(spec: string): string | null {\n if (!spec || spec.startsWith('.') || spec.startsWith('/')) {return null;}\n\n if (spec.startsWith('@')) {\n const slashIndex = spec.indexOf('/');\n if (slashIndex === -1) {return null;}\n const versionSep = spec.lastIndexOf('@');\n return versionSep > slashIndex ? spec.slice(0, versionSep) : spec;\n }\n\n const versionSep = spec.indexOf('@');\n return versionSep > 0 ? spec.slice(0, versionSep) : spec;\n}\n\nfunction extractVersion(spec: string): string | null {\n if (spec.startsWith('@')) {\n const slashIndex = spec.indexOf('/');\n const lastAt = spec.lastIndexOf('@');\n return lastAt > slashIndex ? spec.slice(lastAt + 1) : null;\n }\n const atIndex = spec.indexOf('@');\n return atIndex > 0 ? spec.slice(atIndex + 1) : null;\n}\n\nasync function computeIntegrity(packageRoot: string): Promise<string> {\n try {\n const content = await fs.readFile(path.join(packageRoot, 'package.json'));\n const hash = crypto.createHash('sha256').update(content).digest('base64');\n return `sha256-${hash}`;\n } catch {\n return '';\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/npm-source.ts"],"names":["versionSep"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @module @kb-labs/marketplace-npm/npm-source\n * pnpm-based PackageSource implementation.\n * This is the ONLY place in the marketplace codebase that calls pnpm.\n */\n\nimport { execa } from 'execa';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport * as crypto from 'node:crypto';\nimport type {\n PackageSource,\n ResolvedPackage,\n InstalledPackage,\n} from '@kb-labs/marketplace-contracts';\n\nexport class PackageInstallError extends Error {\n readonly code: 'NOT_FOUND' | 'INSTALL_FAILED';\n readonly spec: string;\n constructor(code: PackageInstallError['code'], spec: string, message: string) {\n super(message);\n this.name = 'PackageInstallError';\n this.code = code;\n this.spec = spec;\n }\n}\n\nexport class NpmPackageSource implements PackageSource {\n async resolve(spec: string): Promise<ResolvedPackage> {\n const id = extractPackageName(spec);\n if (!id) {\n throw new Error(`Invalid package spec: ${spec}`);\n }\n\n return {\n id,\n version: extractVersion(spec) ?? 'latest',\n integrity: '', // computed after install\n source: 'marketplace',\n };\n }\n\n async install(\n pkg: ResolvedPackage,\n root: string,\n opts?: { dev?: boolean },\n ): Promise<InstalledPackage> {\n const spec = pkg.version === 'latest' ? pkg.id : `${pkg.id}@${pkg.version}`;\n const args = ['add', spec];\n if (opts?.dev) {args.push('--save-dev');}\n\n try {\n await execa('pnpm', args, { cwd: root, timeout: 5 * 60 * 1000 });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n const code = msg.includes('ERR_PNPM_FETCH_404') || msg.includes('Not Found - 404')\n ? 'NOT_FOUND'\n : 'INSTALL_FAILED';\n throw new PackageInstallError(code, spec, `pnpm add ${spec} failed: ${msg}`);\n }\n\n const packageRoot = path.join(root, 'node_modules', pkg.id);\n\n // Read actual installed version\n let version = pkg.version;\n try {\n const pkgJson = JSON.parse(await fs.readFile(path.join(packageRoot, 'package.json'), 'utf-8'));\n version = pkgJson.version ?? version;\n } catch { /* use spec version */ }\n\n // Compute integrity\n const integrity = await computeIntegrity(packageRoot);\n\n return {\n id: pkg.id,\n version,\n packageRoot,\n integrity,\n };\n }\n\n async remove(packageId: string, root: string): Promise<void> {\n await execa('pnpm', ['remove', packageId], { cwd: root, timeout: 2 * 60 * 1000 });\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction extractPackageName(spec: string): string | null {\n if (!spec || spec.startsWith('.') || spec.startsWith('/')) {return null;}\n\n if (spec.startsWith('@')) {\n const slashIndex = spec.indexOf('/');\n if (slashIndex === -1) {return null;}\n const versionSep = spec.lastIndexOf('@');\n return versionSep > slashIndex ? spec.slice(0, versionSep) : spec;\n }\n\n const versionSep = spec.indexOf('@');\n return versionSep > 0 ? spec.slice(0, versionSep) : spec;\n}\n\nfunction extractVersion(spec: string): string | null {\n if (spec.startsWith('@')) {\n const slashIndex = spec.indexOf('/');\n const lastAt = spec.lastIndexOf('@');\n return lastAt > slashIndex ? spec.slice(lastAt + 1) : null;\n }\n const atIndex = spec.indexOf('@');\n return atIndex > 0 ? spec.slice(atIndex + 1) : null;\n}\n\nasync function computeIntegrity(packageRoot: string): Promise<string> {\n try {\n const content = await fs.readFile(path.join(packageRoot, 'package.json'));\n const hash = crypto.createHash('sha256').update(content).digest('base64');\n return `sha256-${hash}`;\n } catch {\n return '';\n }\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kb-labs/marketplace-npm",
3
3
  "description": "npm/pnpm package source for KB Labs marketplace",
4
- "version": "2.45.0",
4
+ "version": "2.46.0",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
@@ -18,13 +18,13 @@
18
18
  ],
19
19
  "dependencies": {
20
20
  "execa": "^9.5.3",
21
- "@kb-labs/marketplace-contracts": "2.45.0"
21
+ "@kb-labs/marketplace-contracts": "2.46.0"
22
22
  },
23
23
  "devDependencies": {
24
24
  "tsup": "^8.5.0",
25
25
  "typescript": "^5",
26
26
  "vitest": "^3.2.4",
27
- "@kb-labs/devkit": "2.45.0"
27
+ "@kb-labs/devkit": "2.46.0"
28
28
  },
29
29
  "engines": {
30
30
  "node": ">=20.0.0",