Fix npm release wrapper package

This commit is contained in:
weishu
2026-01-03 22:22:45 +08:00
parent aa0c3f2f0d
commit 83bf40fa53
3 changed files with 87 additions and 14 deletions
+2
View File
@@ -18,6 +18,8 @@ oclif.manifest.json
/npm/*/package.json
/npm/*/bin/hapi
/npm/*/bin/hapi.exe
/npm/*/bin/hapi.cjs
/npm/*/NOTICE
+78 -8
View File
@@ -1,16 +1,17 @@
/**
* Prepare npm platform packages for publishing.
* Prepare npm packages for publishing.
*
* This script:
* 1. Reads the version from cli/package.json
* 2. Generates package.json for each platform package
* 3. Copies binaries from dist-exe to npm package directories
* 4. Updates optionalDependencies versions in main package.json
* 2. Generates the main npm package (wrapper)
* 3. Generates package.json for each platform package
* 4. Copies binaries from dist-exe to npm package directories
* 5. Updates optionalDependencies versions in main package.json
*
* Run after `bun run build:exe:all`
*/
import { copyFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
import { chmodSync, copyFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
import { dirname, join } from 'node:path';
import { fileURLToPath } from 'node:url';
@@ -58,12 +59,20 @@ const PLATFORMS = [
] as const;
interface MainPackageJson {
name: string;
version: string;
description?: string;
author?: string | { name: string; email?: string; url?: string };
license?: string;
type?: string;
homepage?: string;
bugs?: string | { url?: string; email?: string };
repository?: {
type: string;
url: string;
directory?: string;
};
bin?: Record<string, string>;
}
async function readMainPackageJson(): Promise<MainPackageJson> {
@@ -91,6 +100,62 @@ function generatePlatformPackageJson(
};
}
function buildOptionalDependencies(version: string): Record<string, string> {
const optionalDependencies: Record<string, string> = {};
for (const platform of PLATFORMS) {
optionalDependencies[`@twsxtd/hapi-${platform.name}`] = version;
}
return optionalDependencies;
}
function generateMainPackageJson(
mainPkg: MainPackageJson,
optionalDependencies: Record<string, string>
): object {
return {
name: mainPkg.name,
version: mainPkg.version,
description: mainPkg.description,
author: mainPkg.author,
license: mainPkg.license ?? 'MIT',
type: mainPkg.type,
homepage: mainPkg.homepage,
bugs: mainPkg.bugs,
repository: mainPkg.repository,
bin: mainPkg.bin ?? { hapi: 'bin/hapi.cjs' },
files: ['bin/hapi.cjs', 'NOTICE'],
optionalDependencies
};
}
function prepareMainPackage(
mainPkg: MainPackageJson,
projectRoot: string,
npmDir: string
): void {
const mainDir = join(npmDir, 'main');
const binDir = join(mainDir, 'bin');
const optionalDependencies = buildOptionalDependencies(mainPkg.version);
mkdirSync(binDir, { recursive: true });
const srcBin = join(projectRoot, 'bin', 'hapi.cjs');
const destBin = join(binDir, 'hapi.cjs');
copyFileSync(srcBin, destBin);
chmodSync(destBin, 0o755);
const srcNotice = join(projectRoot, 'NOTICE');
const destNotice = join(mainDir, 'NOTICE');
copyFileSync(srcNotice, destNotice);
const pkgJson = generateMainPackageJson(mainPkg, optionalDependencies);
const pkgJsonPath = join(mainDir, 'package.json');
writeFileSync(pkgJsonPath, JSON.stringify(pkgJson, null, 4) + '\n');
console.log(`Generated: ${pkgJsonPath}`);
}
async function preparePlatform(
platform: typeof PLATFORMS[number],
mainPkg: MainPackageJson,
@@ -133,9 +198,7 @@ function updateMainPackageOptionalDeps(version: string): void {
pkg.optionalDependencies = {};
}
for (const platform of PLATFORMS) {
pkg.optionalDependencies[`@twsxtd/hapi-${platform.name}`] = version;
}
pkg.optionalDependencies = buildOptionalDependencies(version);
writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n');
console.log(`Updated optionalDependencies in package.json to version ${version}`);
@@ -155,6 +218,13 @@ async function main(): Promise<void> {
let hasErrors = false;
try {
prepareMainPackage(mainPkg, projectRoot, npmDir);
} catch (error) {
console.error('Error preparing main package:', error);
hasErrors = true;
}
for (const platform of PLATFORMS) {
try {
await preparePlatform(platform, mainPkg, distExeDir, npmDir);
+6 -5
View File
@@ -4,8 +4,8 @@
* 1. Bump version
* 2. Build binaries (with embedded web assets)
* 3. Publish platform packages first (so lockfile can resolve them)
* 4. bun install (to get complete lockfile with published packages)
* 5. Publish main package
* 4. Publish main package
* 5. bun install (to get complete lockfile with published packages)
* 6. Git commit + tag + push
*/
@@ -113,8 +113,9 @@ async function main(): Promise<void> {
}
// Step 4: Publish main package
console.log('\n📤 Step 5: Publishing main package...');
run(`npm publish --access public${dryRun ? ' --dry-run' : ''}`);
console.log('\n📤 Step 4: Publishing main package...');
const mainNpmDir = join(projectRoot, 'npm', 'main');
run(`npm publish --access public${dryRun ? ' --dry-run' : ''}`, mainNpmDir);
// --publish-npm 模式到此结束
if (publishNpm) {
@@ -123,7 +124,7 @@ async function main(): Promise<void> {
}
// Step 5: bun install to get complete lockfile
console.log('\n📥 Step 4: Updating lockfile...');
console.log('\n📥 Step 5: Updating lockfile...');
await runWithTimeoutRetry('bun install', repoRoot);
// Step 6: Git commit + tag + push