fix: fully respect singleArchFiles option (#152)
Some checks failed
Publish documentation / docs (push) Failing after 13s
Some checks failed
Publish documentation / docs (push) Failing after 13s
Files listed under `singleArchFiles` are allowed to be unique for different platforms so `dupedFiles` should not return them. Fix: #151
This commit is contained in:
@@ -3,15 +3,19 @@ import path from 'node:path';
|
||||
import { promises as stream } from 'node:stream';
|
||||
|
||||
import { spawn, ExitCodeError } from '@malept/cross-spawn-promise';
|
||||
import { minimatch } from 'minimatch';
|
||||
|
||||
const MACHO_PREFIX = 'Mach-O ';
|
||||
|
||||
const UNPACKED_ASAR_PATH = path.join('Contents', 'Resources', 'app.asar.unpacked');
|
||||
|
||||
export enum AppFileType {
|
||||
MACHO,
|
||||
PLAIN,
|
||||
INFO_PLIST,
|
||||
SNAPSHOT,
|
||||
APP_CODE,
|
||||
SINGLE_ARCH,
|
||||
}
|
||||
|
||||
export type AppFile = {
|
||||
@@ -19,11 +23,37 @@ export type AppFile = {
|
||||
type: AppFileType;
|
||||
};
|
||||
|
||||
export type GetAllAppFilesOpts = {
|
||||
singleArchFiles?: string;
|
||||
};
|
||||
|
||||
const isSingleArchFile = (relativePath: string, opts: GetAllAppFilesOpts): boolean => {
|
||||
if (opts.singleArchFiles === undefined) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const unpackedPath = path.relative(UNPACKED_ASAR_PATH, relativePath);
|
||||
|
||||
// Outside of app.asar.unpacked
|
||||
if (unpackedPath.startsWith('..')) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return minimatch(unpackedPath, opts.singleArchFiles, {
|
||||
matchBase: true,
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
*
|
||||
* @param appPath Path to the application
|
||||
*/
|
||||
export const getAllAppFiles = async (appPath: string): Promise<AppFile[]> => {
|
||||
export const getAllAppFiles = async (
|
||||
appPath: string,
|
||||
opts: GetAllAppFilesOpts,
|
||||
): Promise<AppFile[]> => {
|
||||
const unpackedPath = path.join('Contents', 'Resources', 'app.asar.unpacked');
|
||||
|
||||
const files: AppFile[] = [];
|
||||
|
||||
const visited = new Set<string>();
|
||||
@@ -35,6 +65,8 @@ export const getAllAppFiles = async (appPath: string): Promise<AppFile[]> => {
|
||||
const info = await fs.promises.stat(p);
|
||||
if (info.isSymbolicLink()) return;
|
||||
if (info.isFile()) {
|
||||
const relativePath = path.relative(appPath, p);
|
||||
|
||||
let fileType = AppFileType.PLAIN;
|
||||
|
||||
var fileOutput = '';
|
||||
@@ -49,6 +81,8 @@ export const getAllAppFiles = async (appPath: string): Promise<AppFile[]> => {
|
||||
}
|
||||
if (p.endsWith('.asar')) {
|
||||
fileType = AppFileType.APP_CODE;
|
||||
} else if (isSingleArchFile(relativePath, opts)) {
|
||||
fileType = AppFileType.SINGLE_ARCH;
|
||||
} else if (fileOutput.startsWith(MACHO_PREFIX)) {
|
||||
fileType = AppFileType.MACHO;
|
||||
} else if (p.endsWith('.bin')) {
|
||||
@@ -58,7 +92,7 @@ export const getAllAppFiles = async (appPath: string): Promise<AppFile[]> => {
|
||||
}
|
||||
|
||||
files.push({
|
||||
relativePath: path.relative(appPath, p),
|
||||
relativePath,
|
||||
type: fileType,
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user