prepare-installed-update-bootstrap.ts 1.5 KB

1234567891011121314151617181920212223242526272829
  1. /** Prepare immutable per-run bootstrap files without launching the application or loading credentials. */
  2. import { copyFile, constants, mkdir, writeFile } from 'node:fs/promises'
  3. import { join } from 'node:path'
  4. import { readInstalledUpdateRun } from './installed-update-qualification.ts'
  5. /**
  6. * Write the shared qualification entry for both versions; refuse to overwrite an existing preparation.
  7. * @param manifest Original run.json in its allocated directory.
  8. * @returns The private directory whose two modules must be included in each package's files.
  9. */
  10. export async function prepareInstalledUpdateBootstrap(manifest: string): Promise<string> {
  11. const run = await readInstalledUpdateRun(manifest)
  12. const directory = join(run.root, 'bootstrap')
  13. await mkdir(directory)
  14. await copyFile(join(import.meta.dirname, 'installed-update-identity.mjs'),
  15. join(directory, 'installed-update-identity.mjs'), constants.COPYFILE_EXCL)
  16. const entry = `import { app } from 'electron'
  17. import { readFileSync } from 'node:fs'
  18. import { join } from 'node:path'
  19. import { configureInstalledUpdateIdentity } from './installed-update-identity.mjs'
  20. const run = ${JSON.stringify({ id: run.id, versions: run.versions })}
  21. const metadata = JSON.parse(readFileSync(join(app.getAppPath(), 'package.json'), 'utf8'))
  22. configureInstalledUpdateIdentity(app, run, metadata, process.env)
  23. await import('./lib/main.js')
  24. `
  25. await writeFile(join(directory, 'qualification-bootstrap.mjs'), entry, { flag: 'wx', mode: 0o600, flush: true })
  26. return directory
  27. }