fix: pre-publish and post-publish hooks

This commit is contained in:
Simon
2026-04-12 03:16:13 +08:00
parent 4d27d49752
commit acfb336a9a
11 changed files with 86 additions and 103 deletions

30
scripts/post-publish.js Normal file
View File

@@ -0,0 +1,30 @@
#!/usr/bin/env node
/**
* Restore package.json from the backup created by pre-publish.js,
* then clean up temporary files (backup, LICENSE, README.md).
*
* Usage: node ../../scripts/post-publish.js (from a package dir)
*/
import { existsSync, readFileSync, renameSync, rmSync } from 'fs'
import { join } from 'path'
const pkgPath = join(process.cwd(), 'package.json')
const bakPath = pkgPath + '.bak'
if (!existsSync(bakPath)) {
console.log(' No backup found, nothing to restore.')
process.exit(0)
}
const name = JSON.parse(readFileSync(pkgPath, 'utf-8')).name
renameSync(bakPath, pkgPath)
console.log(' ✓ package.json restored from backup')
rmSync(join(process.cwd(), 'LICENSE'), { force: true })
console.log(' ✓ LICENSE removed')
if (name === 'page-agent') {
rmSync(join(process.cwd(), 'README.md'), { force: true })
console.log(' ✓ README.md removed')
}

42
scripts/pre-publish.js Normal file
View File

@@ -0,0 +1,42 @@
#!/usr/bin/env node
/**
* Backup package.json, then rewrite it for publish:
* - Promote `publishConfig` fields to top level
* - Remove `publishConfig` (npm doesn't need the wrapper)
* - Copy LICENSE (and README.md for the main package)
*
* Usage: node ../../scripts/pre-publish.js (from a package dir)
*/
import { copyFileSync, readFileSync, writeFileSync } from 'fs'
import { join } from 'path'
const pkgPath = join(process.cwd(), 'package.json')
const raw = readFileSync(pkgPath, 'utf-8')
const pkg = JSON.parse(raw)
const publishConfig = pkg.publishConfig
if (!publishConfig) {
console.log(' No publishConfig found, skipping manifest rewrite.')
process.exit(0)
}
// Backup the original file byte-for-byte
copyFileSync(pkgPath, pkgPath + '.bak')
console.log(' ✓ package.json backed up')
for (const [field, value] of Object.entries(publishConfig)) {
pkg[field] = value
}
delete pkg.publishConfig
writeFileSync(pkgPath, JSON.stringify(pkg, null, ' ') + '\n')
console.log(` ✓ Manifest rewritten for publish (${Object.keys(publishConfig).join(', ')})`)
const root = join(process.cwd(), '../..')
copyFileSync(join(root, 'LICENSE'), join(process.cwd(), 'LICENSE'))
console.log(' ✓ LICENSE copied')
if (pkg.name === 'page-agent') {
copyFileSync(join(root, 'README.md'), join(process.cwd(), 'README.md'))
console.log(' ✓ README.md copied')
}

View File

@@ -1,48 +0,0 @@
#!/usr/bin/env node
/**
* Swap source-first dev entrypoints for dist-first publish entrypoints.
*
* This script is called by `prepublishOnly` in each publishable package.
* It reads the `publishConfig` object and promotes its fields to top level,
* storing the original dev fields in `_devConfig` so `restore-dev.js` can undo it.
*
* Usage: node ../../scripts/prepare-publish.js
*/
import { copyFileSync, readFileSync, writeFileSync } from 'fs'
import { join } from 'path'
const pkgPath = join(process.cwd(), 'package.json')
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'))
const publishConfig = pkg.publishConfig
if (!publishConfig) {
console.log(' No publishConfig found, skipping manifest rewrite.')
process.exit(0)
}
const PUBLISH_FIELDS = ['main', 'module', 'types', 'exports']
const devConfig = {}
for (const field of PUBLISH_FIELDS) {
if (field in publishConfig) {
devConfig[field] = pkg[field]
pkg[field] = publishConfig[field]
}
}
pkg._devConfig = devConfig
delete pkg.publishConfig
writeFileSync(pkgPath, JSON.stringify(pkg, null, ' ') + '\n')
console.log(` ✓ Manifest rewritten for publish (${Object.keys(devConfig).join(', ')})`)
const root = join(process.cwd(), '../..')
copyFileSync(join(root, 'LICENSE'), join(process.cwd(), 'LICENSE'))
console.log(' ✓ LICENSE copied')
const readmeSrc = join(root, 'README.md')
const readmeDest = join(process.cwd(), 'README.md')
if (pkg.name === 'page-agent') {
copyFileSync(readmeSrc, readmeDest)
console.log(' ✓ README.md copied')
}

View File

@@ -1,45 +0,0 @@
#!/usr/bin/env node
/**
* Restore source-first dev entrypoints after publish.
*
* Undoes what `prepare-publish.js` did by reading `_devConfig`
* and reinstating the original dev fields + `publishConfig`.
*
* Usage: node ../../scripts/restore-dev.js
*/
import { readFileSync, rmSync, writeFileSync } from 'fs'
import { join } from 'path'
const pkgPath = join(process.cwd(), 'package.json')
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'))
const devConfig = pkg._devConfig
if (!devConfig) {
console.log(' No _devConfig found, skipping manifest restore.')
process.exit(0)
}
const PUBLISH_FIELDS = ['main', 'module', 'types', 'exports']
const publishConfig = {}
for (const field of PUBLISH_FIELDS) {
if (field in devConfig) {
publishConfig[field] = pkg[field]
pkg[field] = devConfig[field]
}
}
pkg.publishConfig = publishConfig
delete pkg._devConfig
writeFileSync(pkgPath, JSON.stringify(pkg, null, ' ') + '\n')
console.log(` ✓ Manifest restored for dev (${Object.keys(publishConfig).join(', ')})`)
const licensePath = join(process.cwd(), 'LICENSE')
rmSync(licensePath, { force: true })
console.log(' ✓ LICENSE removed')
if (pkg.name === 'page-agent') {
rmSync(join(process.cwd(), 'README.md'), { force: true })
console.log(' ✓ README.md removed')
}