128 lines
5.6 KiB
JavaScript
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')`
|
|
]
|
|
])
|
|
}
|