- Removed obsolete test script `test_crawl4ai_fit_markdown.py`. - Deleted `verify-package-main-obfuscation.mjs` as it is no longer needed. - Updated paths in `app-update-publish-config.test.ts` to reflect new script locations. - Refactored `package-content-policy.test.ts` to use new paths for content policy scripts. - Adjusted `package-main-obfuscation.test.ts` to point to the new obfuscation script locations. - Modified `package-size-budget.test.ts` to use updated paths for size budget scripts. - Changed `r2-update-metadata-contract.test.ts` to reference the new metadata script. - Updated `release-fragment-contract.test.ts` to use the new fragment contract script. - Refactored `release-storage-layout.test.ts` to point to the new storage layout script. - Added `runtime-trace.test.ts` to test runtime tracing functionality. - Updated `node-pty-native-release.test.ts` to reflect new paths for native release scripts.
122 lines
4.2 KiB
JavaScript
122 lines
4.2 KiB
JavaScript
import { cpSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
|
|
import path from 'node:path'
|
|
import { createRequire } from 'node:module'
|
|
import { spawnSync } from 'node:child_process'
|
|
import { isNodePtyNativeReleaseReady, prepareNodePtyNativeRelease } from './node-pty-release.mjs'
|
|
|
|
const require = createRequire(import.meta.url)
|
|
const root = process.cwd()
|
|
const nodePtyRoot = path.dirname(require.resolve('node-pty/package.json', { paths: [root] }))
|
|
const releaseDir = path.join(nodePtyRoot, 'build', 'Release')
|
|
const prebuildDir = path.join(nodePtyRoot, 'prebuilds', `${process.platform}-${process.arch}`)
|
|
const cacheRoot = path.join(root, 'node_modules', '.native-cache', 'node-pty')
|
|
const currentTargetPath = path.join(cacheRoot, 'current-target.txt')
|
|
|
|
const readPackage = (name) =>
|
|
JSON.parse(readFileSync(require.resolve(`${name}/package.json`, { paths: [root] }), 'utf8'))
|
|
|
|
const targetKey = (target) => {
|
|
if (target === 'node') {
|
|
return `node-v${process.versions.modules}-${process.platform}-${process.arch}`
|
|
}
|
|
if (target === 'electron') {
|
|
return `electron-${readPackage('electron').version}-${process.platform}-${process.arch}`
|
|
}
|
|
throw new Error(`unknown node-pty target: ${target}`)
|
|
}
|
|
|
|
const cacheDir = (target) => path.join(cacheRoot, targetKey(target), 'Release')
|
|
|
|
const run = (command, args) => {
|
|
const result = spawnSync(command, args, {
|
|
cwd: root,
|
|
stdio: 'inherit',
|
|
env: process.env
|
|
})
|
|
if (result.status !== 0) process.exit(result.status || 1)
|
|
}
|
|
|
|
const rebuildNode = () => {
|
|
const pnpmCli = process.env.npm_execpath
|
|
if (pnpmCli && existsSync(pnpmCli)) {
|
|
run(process.execPath, [pnpmCli, 'rebuild', 'node-pty'])
|
|
return
|
|
}
|
|
run('pnpm', ['rebuild', 'node-pty'])
|
|
}
|
|
|
|
const rebuildElectron = () => {
|
|
const cliPath = require.resolve('@electron/rebuild/lib/cli.js', { paths: [root] })
|
|
run(process.execPath, [
|
|
cliPath,
|
|
'--force',
|
|
'--only',
|
|
'node-pty',
|
|
'--version',
|
|
readPackage('electron').version
|
|
])
|
|
}
|
|
|
|
const cacheCurrentRelease = (target) => {
|
|
if (!prepareNodePtyNativeRelease(releaseDir)) {
|
|
throw new Error(`node-pty native release missing after ${target} rebuild: ${releaseDir}`)
|
|
}
|
|
const targetCache = cacheDir(target)
|
|
rmSync(targetCache, { recursive: true, force: true })
|
|
mkdirSync(path.dirname(targetCache), { recursive: true })
|
|
cpSync(releaseDir, targetCache, { recursive: true })
|
|
}
|
|
|
|
const restoreCachedRelease = (target) => {
|
|
const source = cacheDir(target)
|
|
if (!prepareNodePtyNativeRelease(source)) return false
|
|
rmSync(releaseDir, { recursive: true, force: true })
|
|
mkdirSync(path.dirname(releaseDir), { recursive: true })
|
|
cpSync(source, releaseDir, { recursive: true })
|
|
return prepareNodePtyNativeRelease(releaseDir)
|
|
}
|
|
|
|
const ensure = (target) => {
|
|
if (prepareNodePtyNativeRelease(prebuildDir)) {
|
|
console.log(`[node-pty-native] ready prebuild ${process.platform}-${process.arch}`)
|
|
return
|
|
}
|
|
mkdirSync(cacheRoot, { recursive: true })
|
|
const currentTarget = existsSync(currentTargetPath)
|
|
? readFileSync(currentTargetPath, 'utf8').trim()
|
|
: ''
|
|
const expectedTarget = targetKey(target)
|
|
if (currentTarget === expectedTarget && prepareNodePtyNativeRelease(releaseDir)) {
|
|
console.log(`[node-pty-native] ready ${expectedTarget}`)
|
|
return
|
|
}
|
|
if (!restoreCachedRelease(target)) {
|
|
if (target === 'node') rebuildNode()
|
|
else rebuildElectron()
|
|
cacheCurrentRelease(target)
|
|
}
|
|
writeFileSync(currentTargetPath, `${expectedTarget}\n`)
|
|
console.log(`[node-pty-native] ready ${expectedTarget}`)
|
|
}
|
|
|
|
const command = process.argv[2] || 'status'
|
|
const target = process.argv[3] || 'node'
|
|
if (command === 'ensure') {
|
|
ensure(target)
|
|
} else if (command === 'prepare') {
|
|
ensure('node')
|
|
ensure('electron')
|
|
} else if (command === 'status') {
|
|
console.log(
|
|
isNodePtyNativeReleaseReady(prebuildDir)
|
|
? `[node-pty-native] ready prebuild ${process.platform}-${process.arch}`
|
|
: existsSync(currentTargetPath)
|
|
? readFileSync(currentTargetPath, 'utf8').trim()
|
|
: '[node-pty-native] no current target'
|
|
)
|
|
} else if (command === 'clean') {
|
|
rmSync(cacheRoot, { recursive: true, force: true })
|
|
} else {
|
|
throw new Error(`unknown command: ${command}`)
|
|
}
|