build: package modules cross-platform

This commit is contained in:
reaper
2026-08-26 02:38:24 -05:00
parent 74008ff85d
commit bc92db6252
6 changed files with 774 additions and 47 deletions
+42
View File
@@ -0,0 +1,42 @@
'use strict'
const { ZipArchive } = require('archiver')
const { createWriteStream } = require('fs')
const { lstat, readlink, readdir } = require('fs/promises')
const { join, relative, sep } = require('path')
function archiveName(root, value) {
return relative(root, value).split(sep).join('/')
}
async function appendDirectory(archive, root, directory) {
for (const entry of await readdir(directory, { withFileTypes: true })) {
const absolute = join(directory, entry.name)
const name = archiveName(root, absolute)
const stats = await lstat(absolute)
if (stats.isSymbolicLink()) {
archive.symlink(name, await readlink(absolute), stats.mode)
} else if (stats.isDirectory()) {
archive.append('', { name: `${name}/` })
await appendDirectory(archive, root, absolute)
} else if (stats.isFile()) {
archive.file(absolute, { name, mode: stats.mode })
}
}
}
async function archiveDirectory(source, output) {
const destination = createWriteStream(output)
const archive = new ZipArchive({ zlib: { level: 9 } })
const completed = new Promise((resolve, reject) => {
destination.once('close', resolve)
destination.once('error', reject)
archive.once('error', reject)
})
archive.pipe(destination)
await appendDirectory(archive, source, source)
await archive.finalize()
await completed
}
module.exports = archiveDirectory
+7 -8
View File
@@ -2,7 +2,7 @@
const { mkdirSync, rmSync } = require('fs')
const { join, resolve } = require('path')
const { spawnSync } = require('child_process')
const archiveDirectory = require('./archive-directory.cjs')
const root = resolve(__dirname, '..')
const source = join(root, 'packages', 'aurora-dockside-connector')
@@ -10,10 +10,9 @@ const outputDir = join(root, 'dist', 'connectors')
const output = join(outputDir, 'aurora-dockside-connector-0.1.0.zip')
mkdirSync(outputDir, { recursive: true })
rmSync(output, { force: true })
const result = spawnSync('zip', ['-qr', output, 'aurora-dockside-connector'], {
cwd: join(root, 'packages'),
stdio: 'inherit'
})
if (result.error) throw result.error
if (result.status !== 0) throw new Error(`zip failed with exit code ${result.status}`)
process.stdout.write(`${output}\n`)
archiveDirectory(source, output)
.then(() => process.stdout.write(`${output}\n`))
.catch((error) => {
console.error(error)
process.exitCode = 1
})
+8 -6
View File
@@ -2,9 +2,9 @@
const { mkdirSync, readFileSync, readdirSync, rmSync } = require('fs')
const { join, resolve } = require('path')
const { spawnSync } = require('child_process')
const archiveDirectory = require('./archive-directory.cjs')
function packageModules() {
async function packageModules() {
const projectRoot = resolve(__dirname, '..')
const packagesRoot = join(projectRoot, 'packages')
const catalogRoot = join(projectRoot, 'dist', 'module-catalog')
@@ -22,13 +22,15 @@ function packageModules() {
if (!manifest.id || !manifest.version) throw new Error(`Invalid module manifest in ${source}`)
const output = join(catalogRoot, `${manifest.id}-${manifest.version}.pac`)
rmSync(output, { force: true })
const result = spawnSync('zip', ['-qr', output, '.'], { cwd: source, stdio: 'inherit' })
if (result.error) throw result.error
if (result.status !== 0) throw new Error(`zip failed for ${manifest.id} with exit code ${result.status}`)
await archiveDirectory(source, output)
process.stdout.write(` • packaged module ${manifest.id}@${manifest.version}${output}\n`)
}
}
module.exports = packageModules
if (require.main === module) packageModules()
if (require.main === module)
packageModules().catch((error) => {
console.error(error)
process.exitCode = 1
})