Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
"test:ci": "jest --runInBand --coverage"
},
"dependencies": {
"@electron/asar": "^3.3.1",
"@electron/get": "^2.0.0",
"debug": "^4.3.3",
"env-paths": "^2.2.1",
Expand Down
49 changes: 41 additions & 8 deletions src/fiddle.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import * as fs from 'fs-extra';
import * as path from 'path';
import * as asar from '@electron/asar';
import debug from 'debug';
import simpleGit from 'simple-git';
import { createHash } from 'crypto';
Expand Down Expand Up @@ -95,16 +96,48 @@ export class FiddleFactory {
return new Fiddle(path.join(folder, 'main.js'), 'entries');
}

public async create(src: FiddleSource): Promise<Fiddle | undefined> {
if (src instanceof Fiddle) return src;
public async create(
src: FiddleSource,
options?: { packAsAsar?: boolean },
): Promise<Fiddle | undefined> {
let fiddle: Fiddle;
if (src instanceof Fiddle) {
fiddle = src;
} else if (typeof src === 'string') {
if (fs.existsSync(src)) {
fiddle = await this.fromFolder(src);
} else if (/^[0-9A-Fa-f]{32}$/.test(src)) {
fiddle = await this.fromGist(src);
} else if (/^https:/.test(src) || /\.git$/.test(src)) {
fiddle = await this.fromRepo(src);
} else {
return;
}
} else {
fiddle = await this.fromEntries(src as Iterable<[string, string]>);
}

if (typeof src === 'string') {
if (fs.existsSync(src)) return this.fromFolder(src);
if (/^[0-9A-Fa-f]{32}$/.test(src)) return this.fromGist(src);
if (/^https:/.test(src) || /\.git$/.test(src)) return this.fromRepo(src);
return;
const { packAsAsar } = options || {};
if (packAsAsar) {
fiddle = await this.packageFiddleAsAsar(fiddle);
}
return fiddle;
}

private async packageFiddleAsAsar(fiddle: Fiddle): Promise<Fiddle> {
const mainJsPath = fiddle.mainPath;
const sourceDir = path.dirname(mainJsPath);
const asarOutputDir = path.join(this.fiddles, hashString(sourceDir));
const asarFilePath = path.join(asarOutputDir, 'app.asar');

return this.fromEntries(src);
await asar.createPackage(sourceDir, asarFilePath);
fiddle = new Fiddle(asarFilePath, fiddle.source);

try {
await fs.remove(sourceDir);
} catch (err) {
console.log('Error deleting unpacked folder:', err);
}
return fiddle;
}
}
5 changes: 4 additions & 1 deletion src/runner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,10 @@ export class Runner {
// process the input parameters
opts = { ...DefaultRunnerOpts, ...opts };
const version = versionIn instanceof SemVer ? versionIn.version : versionIn;
const fiddle = await this.fiddleFactory.create(fiddleIn);
const isRunFromAsar = opts.args?.includes('runFromAsar');
const fiddle = await this.fiddleFactory.create(fiddleIn, {
packAsAsar: isRunFromAsar,
});
if (!fiddle) throw new Error(`Invalid fiddle: "${inspect(fiddleIn)}"`);

// set up the electron binary and the fiddle
Expand Down
39 changes: 39 additions & 0 deletions tests/fiddle.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import * as fs from 'fs-extra';
import * as os from 'os';
import * as path from 'path';
import asar from '@electron/asar';

import { Fiddle, FiddleFactory } from '../src/index';

Expand Down Expand Up @@ -35,6 +36,9 @@ describe('FiddleFactory', () => {
const dirname = path.dirname(fiddle!.mainPath);
expect(dirname).not.toEqual(sourceDir);

// test that main.js file is created (not app.asar)
expect(path.basename(fiddle!.mainPath)).toBe('main.js');

// test that the fiddle is kept in the fiddle cache
expect(path.dirname(dirname)).toBe(fiddleDir);

Expand Down Expand Up @@ -93,6 +97,41 @@ describe('FiddleFactory', () => {
expect(fiddle).toBe(fiddleIn);
});

it('packages fiddle into ASAR archive', async () => {
const sourceDir = fiddleFixture('642fa8daaebea6044c9079e3f8a46390');
const fiddle = await fiddleFactory.create(sourceDir, {
packAsAsar: true,
});

function normalizeAsarFiles(files: string[]): string[] {
return files.map(
(f) => f.replace(/^\//, ''), // Remove leading slash
);
}

// test that app.asar file is created
expect(fiddle).toBeTruthy();
expect(path.basename(fiddle!.mainPath)).toBe('app.asar');

// test that the file list is identical
const dirname: string = fiddle!.mainPath;
const sourceFiles = fs.readdirSync(sourceDir);
const asarFiles = normalizeAsarFiles(
asar.listPackage(dirname, { isPack: false }),
);
expect(asarFiles).toStrictEqual(sourceFiles);

// test that the files' contents are identical
for (const file of sourceFiles) {
const sourceFileContent = fs.readFileSync(
path.join(sourceDir, file),
'utf-8',
);
const asarFileContent = asar.extractFile(dirname, file).toString();
expect(asarFileContent).toStrictEqual(sourceFileContent);
}
});

it.todo('reads fiddles from git repositories');
it.todo('refreshes the cache if given a previously-cached git repository');

Expand Down
16 changes: 15 additions & 1 deletion yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -575,6 +575,15 @@
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==

"@electron/asar@^3.3.1":
version "3.3.1"
resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.3.1.tgz#cd14e897770d9844673dd7c1dc8944e086e1e0ea"
integrity sha512-WtpC/+34p0skWZiarRjLAyqaAX78DofhDxnREy/V5XHfu1XEXbFCSSMcDQ6hNCPJFaPy8/NnUgYuf9uiCkvKPg==
dependencies:
commander "^5.0.0"
glob "^7.1.6"
minimatch "^3.0.4"

"@electron/get@^2.0.0":
version "2.0.0"
resolved "https://registry.yarnpkg.com/@electron/get/-/get-2.0.0.tgz#d991e68dc089fc66b521ec3ca4021515482bef91"
Expand Down Expand Up @@ -1733,6 +1742,11 @@ commander@^2.7.1:
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==

commander@^5.0.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae"
integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==

compress-brotli@^1.3.8:
version "1.3.8"
resolved "https://registry.yarnpkg.com/compress-brotli/-/compress-brotli-1.3.8.tgz#0c0a60c97a989145314ec381e84e26682e7b38db"
Expand Down Expand Up @@ -2362,7 +2376,7 @@ glob-parent@^6.0.2:
dependencies:
is-glob "^4.0.3"

glob@^7.1.3:
glob@^7.1.3, glob@^7.1.6:
version "7.2.3"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
Expand Down
Loading