Files
bare-operating-system/scripts/lib/apply-bare-ssh2-pear-cjs-fixes.mjs
T
2026-04-08 22:37:38 -04:00

128 lines
5.6 KiB
JavaScript

/**
* Pear's bare-module does not apply a dependency's package.json `imports` to CJS
* `require('net')` etc. Replace Node core specifiers with explicit requires:
* - `bare-node-net`, `bare-node-stream`, … — npm “node compat” shims (Holepunch `bare-node` monorepo).
* - Those shims sit on top of Bare stacks such as **`bare-net`** (npm TCP/IP for Bare), not a
* non-existent `bare-net-node` name.
* Also replace `require('crypto')` with paths into vendored `shims/crypto`. Idempotent.
*/
import fs from 'node:fs'
import path from 'node:path'
/**
* @param {string} destRoot - packages/.../vendor/bare-ssh2
*/
export function applyBareSsh2PearCjsFixes(destRoot) {
const patch = (rel, pairs) => {
const p = path.join(destRoot, ...rel.split('/'))
if (!fs.existsSync(p)) return
let s = fs.readFileSync(p, 'utf8')
const orig = s
for (const [from, to] of pairs) {
if (s.includes(from)) s = s.split(from).join(to)
}
if (s !== orig) {
fs.writeFileSync(p, s)
console.log('vendor-bare-ssh2: Pear CJS fixes →', rel)
}
}
patch('lib/agent.js', [
[
`const { Socket } = require('net')\nconst { Duplex } = require('stream')\nconst { resolve } = require('path')\nconst { readFile } = require('fs')\nconst { execFile, spawn } = require('child_process')`,
`// Pear bare-module: subpackage imports do not apply to CJS require().\nconst { Socket } = require('bare-node-net')\nconst { Duplex } = require('bare-node-stream')\nconst { resolve } = require('bare-node-path')\nconst { readFile } = require('bare-node-fs')\nconst { execFile, spawn } = require('bare-node-child-process')`
]
])
patch('lib/client.js', [
[
`const { createHash, getHashes, randomFillSync } = require('crypto')`,
`const { createHash, getHashes, randomFillSync } = require('../shims/crypto/index.js')`
],
[
`const { Socket } = require('net')\nconst { lookup: dnsLookup } = require('dns')\nconst EventEmitter = require('events')`,
`const { Socket } = require('bare-node-net')\nconst { lookup: dnsLookup } = require('bare-node-dns')\nconst EventEmitter = require('bare-node-events')`
]
])
patch('lib/server.js', [
[
`const { Server: netServer } = require('net')\nconst EventEmitter = require('events')`,
`const { Server: netServer } = require('bare-node-net')\nconst EventEmitter = require('bare-node-events')`
]
])
patch('lib/Channel.js', [
[`} = require('stream')`, `} = require('bare-node-stream')`]
])
patch('lib/protocol/SFTP.js', [
[
`const EventEmitter = require('events')\nconst fs = require('fs')`,
`const EventEmitter = require('bare-node-events')\nconst fs = require('bare-node-fs')`
],
[
`const { Readable: ReadableStream, Writable: WritableStream } = require('stream')`,
`const { Readable: ReadableStream, Writable: WritableStream } = require('bare-node-stream')`
],
[`} = require('util')`, `} = require('bare-node-util')`]
])
patch('lib/protocol/Protocol.js', [
[`const { inspect } = require('util')`, `const { inspect } = require('bare-node-util')`]
])
patch('lib/protocol/node-fs-compat.js', [
[`const { inspect } = require('util')`, `const { inspect } = require('bare-node-util')`]
])
patch('lib/http-agents.js', [
[
`const { Agent: HttpAgent } = require('http')\nconst { Agent: HttpsAgent } = require('https')\nconst { connect: tlsConnect } = require('tls')`,
`const { Agent: HttpAgent } = require('bare-node-http')\nconst { Agent: HttpsAgent } = require('bare-node-https')\nconst { connect: tlsConnect } = require('bare-node-tls')`
]
])
patch('lib/protocol/zlib.js', [
[`} = require('zlib')`, `} = require('bare-node-zlib')`]
])
patch('lib/protocol/crypto/poly1305.js', [
[
`((B = y ? require('path').dirname(B) + '/' : __dirname + '/'),`,
`((B = y ? require('bare-node-path').dirname(B) + '/' : __dirname + '/'),`
],
[`F || (F = require('fs'))`, `F || (F = require('bare-node-fs'))`],
[`G || (G = require('path'))`, `G || (G = require('bare-node-path'))`]
])
patch('lib/keygen.js', [
[
`const {\n createCipheriv,\n generateKeyPair: generateKeyPair_,\n generateKeyPairSync: generateKeyPairSync_,\n getCurves,\n randomBytes\n} = require('crypto')`,
`const {\n createCipheriv,\n generateKeyPair: generateKeyPair_,\n generateKeyPairSync: generateKeyPairSync_,\n getCurves,\n randomBytes\n} = require('../shims/crypto/index.js')`
]
])
patch('lib/protocol/crypto.js', [
[`const crypto = require('crypto')`, `const crypto = require('../../shims/crypto/index.js')`]
])
patch('lib/protocol/kex.js', [
[
`const {\n createDiffieHellman,\n createDiffieHellmanGroup,\n createECDH,\n createHash,\n createPublicKey,\n diffieHellman,\n generateKeyPairSync,\n randomFillSync\n} = require('crypto')`,
`const {\n createDiffieHellman,\n createDiffieHellmanGroup,\n createECDH,\n createHash,\n createPublicKey,\n diffieHellman,\n generateKeyPairSync,\n randomFillSync\n} = require('../../shims/crypto/index.js')`
]
])
patch('lib/protocol/constants.js', [
[`const crypto = require('crypto')`, `const crypto = require('../../shims/crypto/index.js')`]
])
patch('lib/protocol/keyParser.js', [
[
`const {\n createDecipheriv,\n createECDH,\n createHash,\n createHmac,\n createSign,\n createVerify,\n getCiphers,\n sign: sign_,\n verify: verify_\n} = require('crypto')`,
`const {\n createDecipheriv,\n createECDH,\n createHash,\n createHmac,\n createSign,\n createVerify,\n getCiphers,\n sign: sign_,\n verify: verify_\n} = require('../../shims/crypto/index.js')`
]
])
}