OverviewFilesCommitsIssuesDocsReleasesPeers

mirall-cli / node_modules / electron-forge-plugin-universal-prebuilds / index.js

56 lines · javascript ref:
const fs = require('fs/promises')
const path = require('path')
const { default: PluginBase } = require('@electron-forge/plugin-base')

module.exports = class UniversalPrebuilds extends PluginBase {
  getHooks() {
    return {
      packageAfterCopy: [this.packageAfterCopy]
    }
  }

  async packageAfterCopy(config, buildPath, electronVersion, platform, arch) {
    await universalPrebuilds(buildPath, platform, arch)
  }
}

async function universalPrebuilds(base, platform, arch) {
  if (platform !== 'darwin') return

  const prebuilds = path.join(base, 'prebuilds')

  try {
    await fs.rename(
      path.join(prebuilds, platform + '-' + arch),
      path.join(prebuilds, platform + '-universal')
    )
  } catch (err) {
    if (err.code === 'ENOTEMPTY') {
      await fs.rm(path.join(prebuilds, platform + '-' + arch), { recursive: true })
    } else if (err.code !== 'ENOENT') {
      throw err
    }
  }

  const promises = []

  for await (const entry of opendir(path.join(base, 'node_modules'))) {
    if (entry.isDirectory()) {
      promises.push(universalPrebuilds(path.join(entry.parentPath, entry.name), platform, arch))
    }
  }

  await Promise.all(promises)
}

async function* opendir(base) {
  let dir
  try {
    dir = await fs.opendir(base, { withFileTypes: true })
  } catch {
    return
  }

  yield* dir
}