|
1 | 1 | import * as fs from 'fs-extra'; |
2 | 2 | import * as path from 'path'; |
| 3 | +import * as asar from '@electron/asar'; |
3 | 4 | import debug from 'debug'; |
4 | 5 | import simpleGit from 'simple-git'; |
5 | 6 | import { createHash } from 'crypto'; |
@@ -31,6 +32,10 @@ export class Fiddle { |
31 | 32 | */ |
32 | 33 | export type FiddleSource = Fiddle | string | Iterable<[string, string]>; |
33 | 34 |
|
| 35 | +export interface FiddleFactoryCreateOptions { |
| 36 | + packAsAsar?: boolean; |
| 37 | +} |
| 38 | + |
34 | 39 | export class FiddleFactory { |
35 | 40 | constructor(private readonly fiddles: string = DefaultPaths.fiddles) {} |
36 | 41 |
|
@@ -95,16 +100,43 @@ export class FiddleFactory { |
95 | 100 | return new Fiddle(path.join(folder, 'main.js'), 'entries'); |
96 | 101 | } |
97 | 102 |
|
98 | | - public async create(src: FiddleSource): Promise<Fiddle | undefined> { |
99 | | - if (src instanceof Fiddle) return src; |
| 103 | + public async create( |
| 104 | + src: FiddleSource, |
| 105 | + options?: FiddleFactoryCreateOptions, |
| 106 | + ): Promise<Fiddle | undefined> { |
| 107 | + let fiddle: Fiddle; |
| 108 | + if (src instanceof Fiddle) { |
| 109 | + fiddle = src; |
| 110 | + } else if (typeof src === 'string') { |
| 111 | + if (fs.existsSync(src)) { |
| 112 | + fiddle = await this.fromFolder(src); |
| 113 | + } else if (/^[0-9A-Fa-f]{32}$/.test(src)) { |
| 114 | + fiddle = await this.fromGist(src); |
| 115 | + } else if (/^https:/.test(src) || /\.git$/.test(src)) { |
| 116 | + fiddle = await this.fromRepo(src); |
| 117 | + } else { |
| 118 | + return; |
| 119 | + } |
| 120 | + } else { |
| 121 | + fiddle = await this.fromEntries(src as Iterable<[string, string]>); |
| 122 | + } |
100 | 123 |
|
101 | | - if (typeof src === 'string') { |
102 | | - if (fs.existsSync(src)) return this.fromFolder(src); |
103 | | - if (/^[0-9A-Fa-f]{32}$/.test(src)) return this.fromGist(src); |
104 | | - if (/^https:/.test(src) || /\.git$/.test(src)) return this.fromRepo(src); |
105 | | - return; |
| 124 | + const { packAsAsar } = options || {}; |
| 125 | + if (packAsAsar) { |
| 126 | + fiddle = await this.packageFiddleAsAsar(fiddle); |
106 | 127 | } |
| 128 | + return fiddle; |
| 129 | + } |
| 130 | + |
| 131 | + private async packageFiddleAsAsar(fiddle: Fiddle): Promise<Fiddle> { |
| 132 | + const sourceDir = path.dirname(fiddle.mainPath); |
| 133 | + const asarOutputDir = path.join(this.fiddles, hashString(sourceDir)); |
| 134 | + const asarFilePath = path.join(asarOutputDir, 'app.asar'); |
| 135 | + |
| 136 | + await asar.createPackage(sourceDir, asarFilePath); |
| 137 | + const packagedFiddle = new Fiddle(asarFilePath, fiddle.source); |
107 | 138 |
|
108 | | - return this.fromEntries(src); |
| 139 | + await fs.remove(sourceDir); |
| 140 | + return packagedFiddle; |
109 | 141 | } |
110 | 142 | } |
0 commit comments