- Add automation script for building, packaging, installing, executing and verifying Electron distrubtions across macOS, Ubuntu and Windows. - Add GitHub workflow to run the script to test distributions using the script. - Update README with new workflow status badge. - Add application initialization log to desktop applications to be able to test against crashes before application initialization.
88 lines
3.0 KiB
JavaScript
88 lines
3.0 KiB
JavaScript
import { join } from 'path';
|
|
import { rmdir, readFile } from 'fs/promises';
|
|
import { exists, isDirMissingOrEmpty } from './io.js';
|
|
import { runCommand } from './run-command.js';
|
|
import { LOG_LEVELS, die, log } from './log.js';
|
|
|
|
export async function ensureNpmProjectDir(projectDir) {
|
|
if (!projectDir) { throw new Error('missing project directory'); }
|
|
if (!await exists(join(projectDir, 'package.json'))) {
|
|
die(`'package.json' not found in project directory: ${projectDir}`);
|
|
}
|
|
}
|
|
|
|
export async function npmInstall(projectDir) {
|
|
if (!projectDir) { throw new Error('missing project directory'); }
|
|
const npmModulesPath = join(projectDir, 'node_modules');
|
|
if (!await isDirMissingOrEmpty(npmModulesPath)) {
|
|
log(`Directory "${npmModulesPath}" exists and has content. Skipping 'npm install'.`);
|
|
return;
|
|
}
|
|
log('Starting dependency installation...');
|
|
const { error } = await runCommand('npm install --loglevel=error', {
|
|
stdio: 'inherit',
|
|
cwd: projectDir,
|
|
});
|
|
if (error) {
|
|
die(error);
|
|
}
|
|
}
|
|
|
|
export async function npmBuild(projectDir, buildCommand, distDir, forceRebuild) {
|
|
if (!projectDir) { throw new Error('missing project directory'); }
|
|
if (!buildCommand) { throw new Error('missing build command'); }
|
|
if (!distDir) { throw new Error('missing distribution directory'); }
|
|
|
|
const isMissingBuild = await isDirMissingOrEmpty(distDir);
|
|
|
|
if (!isMissingBuild && !forceRebuild) {
|
|
log(`Directory "${distDir}" exists and has content. Skipping build: '${buildCommand}'.`);
|
|
return;
|
|
}
|
|
|
|
if (forceRebuild) {
|
|
log(`Removing directory "${distDir}" for a clean build (triggered by --build flag).`);
|
|
await rmdir(distDir, { recursive: true });
|
|
}
|
|
|
|
log('Starting project build...');
|
|
const { error } = await runCommand(buildCommand, {
|
|
stdio: 'inherit',
|
|
cwd: projectDir,
|
|
});
|
|
if (error) {
|
|
log(error, LOG_LEVELS.WARN); // Cannot disable Vue CLI errors, stderr contains false-positives.
|
|
}
|
|
}
|
|
|
|
export async function getAppName(projectDir) {
|
|
if (!projectDir) { throw new Error('missing project directory'); }
|
|
const packageData = await readPackageJsonContents(projectDir);
|
|
try {
|
|
const packageJson = JSON.parse(packageData);
|
|
if (!packageJson.name) {
|
|
die(`The 'package.json' file doesn't specify a name: ${packageData}`);
|
|
}
|
|
return packageJson.name;
|
|
} catch (error) {
|
|
die(`Unable to parse 'package.json'. Error: ${error}\nContent: ${packageData}`, LOG_LEVELS.ERROR);
|
|
return undefined;
|
|
}
|
|
}
|
|
|
|
async function readPackageJsonContents(projectDir) {
|
|
if (!projectDir) { throw new Error('missing project directory'); }
|
|
const packagePath = join(projectDir, 'package.json');
|
|
if (!await exists(packagePath)) {
|
|
die(`'package.json' file not found at ${packagePath}`);
|
|
}
|
|
try {
|
|
const packageData = await readFile(packagePath, 'utf8');
|
|
return packageData;
|
|
} catch (error) {
|
|
log(`Error reading 'package.json' from ${packagePath}.`, LOG_LEVELS.ERROR);
|
|
die(`Error detail: ${error}`, LOG_LEVELS.ERROR);
|
|
throw error;
|
|
}
|
|
}
|