@electron-forge/maker-base 6.0.0 → 6.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ The MIT License (MIT)
2
+ Copyright (c) 2016 Samuel Attard
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
5
+ this software and associated documentation files (the "Software"), to deal in
6
+ the Software without restriction, including without limitation the rights to
7
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
8
+ the Software, and to permit persons to whom the Software is furnished to do so,
9
+ subject to the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be included in all
12
+ copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
16
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
17
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
18
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@electron-forge/maker-base",
3
- "version": "6.0.0",
3
+ "version": "6.0.2",
4
4
  "description": "Base maker for Electron Forge",
5
5
  "repository": "https://github.com/electron/forge",
6
6
  "author": "Samuel Attard",
@@ -16,8 +16,12 @@
16
16
  "node": ">= 14.17.5"
17
17
  },
18
18
  "dependencies": {
19
- "@electron-forge/shared-types": "6.0.0",
19
+ "@electron-forge/shared-types": "^6.0.2",
20
20
  "fs-extra": "^10.0.0",
21
21
  "which": "^2.0.2"
22
- }
22
+ },
23
+ "publishConfig": {
24
+ "access": "public"
25
+ },
26
+ "gitHead": "11cf4b58359c9881c05c06e0d62be575a0ed70d1"
23
27
  }
package/src/Maker.ts ADDED
@@ -0,0 +1,177 @@
1
+ import path from 'path';
2
+
3
+ import { ForgeArch, ForgePlatform, IForgeMaker, ResolvedForgeConfig } from '@electron-forge/shared-types';
4
+ import fs from 'fs-extra';
5
+ import which from 'which';
6
+
7
+ export type EmptyConfig = Record<string, never>;
8
+
9
+ export interface MakerOptions {
10
+ /**
11
+ * The directory containing the packaged Electron application
12
+ */
13
+ dir: string;
14
+ /**
15
+ * The directory you should put all your artifacts in (potentially in sub folders)
16
+ * NOTE: this directory is not guarunteed to already exist
17
+ */
18
+ makeDir: string;
19
+ /**
20
+ * The resolved human friendly name of the project
21
+ */
22
+ appName: string;
23
+ /**
24
+ * The target platform you should make for
25
+ */
26
+ targetPlatform: ForgePlatform;
27
+ /**
28
+ * The target architecture you should make for
29
+ */
30
+ targetArch: ForgeArch;
31
+ /**
32
+ * Fully resolved forge configuration, you shouldn't really need this
33
+ */
34
+ forgeConfig: ResolvedForgeConfig;
35
+ /**
36
+ * The application's package.json file
37
+ */
38
+ packageJSON: any; // eslint-disable-line @typescript-eslint/no-explicit-any
39
+ }
40
+
41
+ export default abstract class Maker<C> implements IForgeMaker {
42
+ public config!: C;
43
+
44
+ public abstract name: string;
45
+
46
+ public abstract defaultPlatforms: ForgePlatform[];
47
+
48
+ public requiredExternalBinaries: string[] = [];
49
+
50
+ /** @internal */
51
+ __isElectronForgeMaker!: true;
52
+
53
+ /**
54
+ * @param configOrConfigFetcher - Either a configuration object for this maker or a simple method that returns such a configuration for a given target architecture
55
+ * @param platformsToMakeOn - If you want this maker to run on platforms different from `defaultPlatforms` you can provide those platforms here
56
+ */
57
+ constructor(private configOrConfigFetcher: C | ((arch: ForgeArch) => C) = {} as C, protected platformsToMakeOn?: ForgePlatform[]) {
58
+ Object.defineProperty(this, '__isElectronForgeMaker', {
59
+ value: true,
60
+ enumerable: false,
61
+ configurable: false,
62
+ });
63
+ }
64
+
65
+ get platforms(): ForgePlatform[] {
66
+ if (this.platformsToMakeOn) return this.platformsToMakeOn;
67
+ return this.defaultPlatforms;
68
+ }
69
+
70
+ // TODO: Remove this, it is an eye-sore and is a nasty hack to provide forge
71
+ // v5 style functionality in the new API
72
+ prepareConfig(targetArch: ForgeArch): void {
73
+ if (typeof this.configOrConfigFetcher === 'function') {
74
+ this.config = (this.configOrConfigFetcher as unknown as (arch: ForgeArch) => C)(targetArch);
75
+ } else {
76
+ this.config = this.configOrConfigFetcher as C;
77
+ }
78
+ }
79
+
80
+ /**
81
+ * Makers must implement this method and return true or false indicating whether
82
+ * this maker can be run on the current platform. Normally this is just a process.platform
83
+ * check but it can be a deeper check for dependencies like fake-root or other
84
+ * required external build tools.
85
+ *
86
+ * If the issue is a missing dependency you should log out a HELPFUL error message
87
+ * telling the developer exactly what is missing and if possible how to get it.
88
+ */
89
+ isSupportedOnCurrentPlatform(): boolean {
90
+ if (this.isSupportedOnCurrentPlatform === Maker.prototype.isSupportedOnCurrentPlatform) {
91
+ throw new Error(`Maker ${this.name} did not implement the isSupportedOnCurrentPlatform method`);
92
+ }
93
+ return true;
94
+ }
95
+
96
+ /**
97
+ * Makers must implement this method and return an array of absolute paths
98
+ * to the artifacts generated by your maker
99
+ */
100
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
101
+ async make(opts: MakerOptions): Promise<string[]> {
102
+ if (this.make === Maker.prototype.make) {
103
+ throw new Error(`Maker ${this.name} did not implement the make method`);
104
+ }
105
+ return [];
106
+ }
107
+
108
+ /**
109
+ * Helpers
110
+ */
111
+
112
+ /**
113
+ * Ensures the directory exists and is forced to be empty.
114
+ *
115
+ * I.e. If the directory already exists it is deleted and recreated, this
116
+ * is a destructive operation
117
+ */
118
+ async ensureDirectory(dir: string): Promise<void> {
119
+ if (await fs.pathExists(dir)) {
120
+ await fs.remove(dir);
121
+ }
122
+ return fs.mkdirs(dir);
123
+ }
124
+
125
+ /**
126
+ * Ensures the path to the file exists and the file does not exist
127
+ *
128
+ * I.e. If the file already exists it is deleted and the path created
129
+ */
130
+ async ensureFile(file: string): Promise<void> {
131
+ if (await fs.pathExists(file)) {
132
+ await fs.remove(file);
133
+ }
134
+ await fs.mkdirs(path.dirname(file));
135
+ }
136
+
137
+ /**
138
+ * Checks if the specified binaries exist, which are required for the maker to be used.
139
+ */
140
+ externalBinariesExist(): boolean {
141
+ return this.requiredExternalBinaries.every((binary) => which.sync(binary, { nothrow: true }) !== null);
142
+ }
143
+
144
+ /**
145
+ * Throws an error if any of the binaries don't exist.
146
+ */
147
+ ensureExternalBinariesExist(): void {
148
+ if (!this.externalBinariesExist()) {
149
+ throw new Error(`Cannot make for ${this.name}, the following external binaries need to be installed: ${this.requiredExternalBinaries.join(', ')}`);
150
+ }
151
+ }
152
+
153
+ /**
154
+ * Checks if the given module is installed, used for testing if optional dependencies
155
+ * are installed or not
156
+ */
157
+ isInstalled(module: string): boolean {
158
+ try {
159
+ require(module);
160
+ return true;
161
+ } catch (e) {
162
+ // Package doesn't exist -- must not be installable on this platform
163
+ return false;
164
+ }
165
+ }
166
+
167
+ /**
168
+ * Normalize the given semver-formatted version to a 4-part dot delimited version number without
169
+ * prerelease information for use in Windows apps.
170
+ */
171
+ normalizeWindowsVersion(version: string): string {
172
+ const noPrerelease = version.replace(/-.*/, '');
173
+ return `${noPrerelease}.0`;
174
+ }
175
+ }
176
+
177
+ export { Maker as MakerBase };
@@ -0,0 +1,42 @@
1
+ import { expect } from 'chai';
2
+ import { stub } from 'sinon';
3
+
4
+ import { MakerBase } from '../src/Maker';
5
+
6
+ class MakerImpl extends MakerBase<{ a: number }> {
7
+ name = 'test';
8
+
9
+ defaultPlatforms = [];
10
+ }
11
+
12
+ describe('prepareConfig', () => {
13
+ it('should call the provided configure function', () => {
14
+ const fetcher = stub();
15
+ fetcher.returns({
16
+ a: 123,
17
+ });
18
+ const maker = new MakerImpl(fetcher, []);
19
+ expect(maker.config).to.be.undefined;
20
+ expect(fetcher.callCount).to.equal(0);
21
+ maker.prepareConfig('x64');
22
+ expect(maker.config).to.deep.equal({
23
+ a: 123,
24
+ });
25
+ expect(fetcher.callCount).to.equal(1);
26
+ expect(fetcher.firstCall.args).to.deep.equal(['x64']);
27
+ });
28
+
29
+ it('should hand through the provided object', () => {
30
+ const maker = new MakerImpl(
31
+ {
32
+ a: 234,
33
+ },
34
+ []
35
+ );
36
+ expect(maker.config).to.be.undefined;
37
+ maker.prepareConfig('x64');
38
+ expect(maker.config).to.deep.equal({
39
+ a: 234,
40
+ });
41
+ });
42
+ });
@@ -0,0 +1,58 @@
1
+ import os from 'os';
2
+ import path from 'path';
3
+
4
+ import { expect } from 'chai';
5
+ import fs from 'fs-extra';
6
+
7
+ import { EmptyConfig, MakerBase } from '../src/Maker';
8
+
9
+ class MakerImpl extends MakerBase<EmptyConfig> {
10
+ name = 'test';
11
+
12
+ defaultPlatforms = [];
13
+ }
14
+
15
+ describe('ensure-output', () => {
16
+ const maker = new MakerImpl({}, []);
17
+ const tmpPath = path.resolve(os.tmpdir(), 'forge-ensure');
18
+
19
+ before(async () => {
20
+ await fs.mkdirs(tmpPath);
21
+ });
22
+
23
+ describe('ensureDirectory', () => {
24
+ it('should delete the directory contents if it exists', async () => {
25
+ await fs.mkdirs(path.resolve(tmpPath, 'foo'));
26
+ fs.writeFileSync(path.resolve(tmpPath, 'foo', 'touchedFile'), '');
27
+ expect(await fs.pathExists(path.resolve(tmpPath, 'foo', 'touchedFile'))).to.equal(true);
28
+ await maker.ensureDirectory(path.resolve(tmpPath, 'foo'));
29
+ expect(await fs.pathExists(path.resolve(tmpPath, 'foo', 'touchedFile'))).to.equal(false);
30
+ });
31
+
32
+ it('should create the directory if it does not exist', async () => {
33
+ expect(await fs.pathExists(path.resolve(tmpPath, 'bar'))).to.equal(false);
34
+ await maker.ensureDirectory(path.resolve(tmpPath, 'bar'));
35
+ expect(await fs.pathExists(path.resolve(tmpPath, 'bar'))).to.equal(true);
36
+ });
37
+ });
38
+
39
+ describe('ensureFile', () => {
40
+ it('should delete the file if it exists', async () => {
41
+ await fs.mkdirs(path.resolve(tmpPath, 'foo'));
42
+ fs.writeFileSync(path.resolve(tmpPath, 'foo', 'touchedFile'), '');
43
+ expect(await fs.pathExists(path.resolve(tmpPath, 'foo', 'touchedFile'))).to.equal(true);
44
+ await maker.ensureFile(path.resolve(tmpPath, 'foo'));
45
+ expect(await fs.pathExists(path.resolve(tmpPath, 'foo', 'touchedFile'))).to.equal(false);
46
+ });
47
+
48
+ it('should create the containing directory if it does not exist', async () => {
49
+ expect(await fs.pathExists(path.resolve(tmpPath, 'bar'))).to.equal(false);
50
+ await maker.ensureFile(path.resolve(tmpPath, 'bar', 'file'));
51
+ expect(await fs.pathExists(path.resolve(tmpPath, 'bar'))).to.equal(true);
52
+ });
53
+ });
54
+
55
+ afterEach(async () => {
56
+ await fs.remove(tmpPath);
57
+ });
58
+ });
@@ -0,0 +1,19 @@
1
+ import { expect } from 'chai';
2
+
3
+ import { EmptyConfig, MakerBase } from '../src/Maker';
4
+
5
+ class MakerImpl extends MakerBase<EmptyConfig> {
6
+ name = 'test';
7
+
8
+ defaultPlatforms = [];
9
+
10
+ requiredExternalBinaries = ['bash', 'nonexistent'];
11
+ }
12
+
13
+ describe('ensureExternalBinariesExist', () => {
14
+ const maker = new MakerImpl({}, []);
15
+
16
+ it('throws an error when one of the binaries does not exist', () => {
17
+ expect(() => maker.ensureExternalBinariesExist()).to.throw(/the following external binaries need to be installed: bash, nonexistent/);
18
+ });
19
+ });
@@ -0,0 +1,22 @@
1
+ import { expect } from 'chai';
2
+
3
+ import { EmptyConfig, MakerBase } from '../src/Maker';
4
+
5
+ class MakerImpl extends MakerBase<EmptyConfig> {
6
+ name = 'test';
7
+
8
+ defaultPlatforms = [];
9
+ }
10
+
11
+ describe('normalizeWindowsVersion', () => {
12
+ const maker = new MakerImpl({}, []);
13
+
14
+ it('removes everything after the dash', () => {
15
+ for (const version of ['1.0.0-alpha', '1.0.0-alpha.1', '1.0.0-0.3.7', '1.0.0-x.7.z.92']) {
16
+ expect(maker.normalizeWindowsVersion(version)).to.equal('1.0.0.0');
17
+ }
18
+ });
19
+ it('does not truncate the version when there is no dash', () => {
20
+ expect(maker.normalizeWindowsVersion('2.0.0')).to.equal('2.0.0.0');
21
+ });
22
+ });
package/dist/Maker.d.ts DELETED
@@ -1,101 +0,0 @@
1
- import { ForgeArch, ForgePlatform, IForgeMaker, ResolvedForgeConfig } from '@electron-forge/shared-types';
2
- export declare type EmptyConfig = Record<string, never>;
3
- export interface MakerOptions {
4
- /**
5
- * The directory containing the packaged Electron application
6
- */
7
- dir: string;
8
- /**
9
- * The directory you should put all your artifacts in (potentially in sub folders)
10
- * NOTE: this directory is not guarunteed to already exist
11
- */
12
- makeDir: string;
13
- /**
14
- * The resolved human friendly name of the project
15
- */
16
- appName: string;
17
- /**
18
- * The target platform you should make for
19
- */
20
- targetPlatform: ForgePlatform;
21
- /**
22
- * The target architecture you should make for
23
- */
24
- targetArch: ForgeArch;
25
- /**
26
- * Fully resolved forge configuration, you shouldn't really need this
27
- */
28
- forgeConfig: ResolvedForgeConfig;
29
- /**
30
- * The application's package.json file
31
- */
32
- packageJSON: any;
33
- }
34
- export default abstract class Maker<C> implements IForgeMaker {
35
- private configOrConfigFetcher;
36
- protected platformsToMakeOn?: string[] | undefined;
37
- config: C;
38
- abstract name: string;
39
- abstract defaultPlatforms: ForgePlatform[];
40
- requiredExternalBinaries: string[];
41
- /** @internal */
42
- __isElectronForgeMaker: true;
43
- /**
44
- * @param configOrConfigFetcher - Either a configuration object for this maker or a simple method that returns such a configuration for a given target architecture
45
- * @param platformsToMakeOn - If you want this maker to run on platforms different from `defaultPlatforms` you can provide those platforms here
46
- */
47
- constructor(configOrConfigFetcher?: C | ((arch: ForgeArch) => C), platformsToMakeOn?: string[] | undefined);
48
- get platforms(): ForgePlatform[];
49
- prepareConfig(targetArch: ForgeArch): void;
50
- /**
51
- * Makers must implement this method and return true or false indicating whether
52
- * this maker can be run on the current platform. Normally this is just a process.platform
53
- * check but it can be a deeper check for dependencies like fake-root or other
54
- * required external build tools.
55
- *
56
- * If the issue is a missing dependency you should log out a HELPFUL error message
57
- * telling the developer exactly what is missing and if possible how to get it.
58
- */
59
- isSupportedOnCurrentPlatform(): boolean;
60
- /**
61
- * Makers must implement this method and return an array of absolute paths
62
- * to the artifacts generated by your maker
63
- */
64
- make(opts: MakerOptions): Promise<string[]>;
65
- /**
66
- * Helpers
67
- */
68
- /**
69
- * Ensures the directory exists and is forced to be empty.
70
- *
71
- * I.e. If the directory already exists it is deleted and recreated, this
72
- * is a destructive operation
73
- */
74
- ensureDirectory(dir: string): Promise<void>;
75
- /**
76
- * Ensures the path to the file exists and the file does not exist
77
- *
78
- * I.e. If the file already exists it is deleted and the path created
79
- */
80
- ensureFile(file: string): Promise<void>;
81
- /**
82
- * Checks if the specified binaries exist, which are required for the maker to be used.
83
- */
84
- externalBinariesExist(): boolean;
85
- /**
86
- * Throws an error if any of the binaries don't exist.
87
- */
88
- ensureExternalBinariesExist(): void;
89
- /**
90
- * Checks if the given module is installed, used for testing if optional dependencies
91
- * are installed or not
92
- */
93
- isInstalled(module: string): boolean;
94
- /**
95
- * Normalize the given semver-formatted version to a 4-part dot delimited version number without
96
- * prerelease information for use in Windows apps.
97
- */
98
- normalizeWindowsVersion(version: string): string;
99
- }
100
- export { Maker as MakerBase };
101
- //# sourceMappingURL=Maker.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Maker.d.ts","sourceRoot":"","sources":["../src/Maker.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAI1G,oBAAY,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAEhD,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,cAAc,EAAE,aAAa,CAAC;IAC9B;;OAEG;IACH,UAAU,EAAE,SAAS,CAAC;IACtB;;OAEG;IACH,WAAW,EAAE,mBAAmB,CAAC;IACjC;;OAEG;IACH,WAAW,EAAE,GAAG,CAAC;CAClB;AAED,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,KAAK,CAAC,CAAC,CAAE,YAAW,WAAW;IAgB/C,OAAO,CAAC,qBAAqB;IAA0C,SAAS,CAAC,iBAAiB,CAAC;IAfxG,MAAM,EAAG,CAAC,CAAC;IAElB,SAAgB,IAAI,EAAE,MAAM,CAAC;IAE7B,SAAgB,gBAAgB,EAAE,aAAa,EAAE,CAAC;IAE3C,wBAAwB,EAAE,MAAM,EAAE,CAAM;IAE/C,gBAAgB;IAChB,sBAAsB,EAAG,IAAI,CAAC;IAE9B;;;OAGG;gBACiB,qBAAqB,GAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,SAAS,KAAK,CAAC,CAAW,EAAY,iBAAiB,CAAC,sBAAiB;IAQhI,IAAI,SAAS,IAAI,aAAa,EAAE,CAG/B;IAID,aAAa,CAAC,UAAU,EAAE,SAAS,GAAG,IAAI;IAQ1C;;;;;;;;OAQG;IACH,4BAA4B,IAAI,OAAO;IAOvC;;;OAGG;IAEG,IAAI,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAOjD;;OAEG;IAEH;;;;;OAKG;IACG,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjD;;;;OAIG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO7C;;OAEG;IACH,qBAAqB,IAAI,OAAO;IAIhC;;OAEG;IACH,2BAA2B,IAAI,IAAI;IAMnC;;;OAGG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAUpC;;;OAGG;IACH,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;CAIjD;AAED,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,CAAC"}
package/dist/Maker.js DELETED
@@ -1,126 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- exports.MakerBase = exports.default = void 0;
6
- var _path = _interopRequireDefault(require("path"));
7
- var _fsExtra = _interopRequireDefault(require("fs-extra"));
8
- var _which = _interopRequireDefault(require("which"));
9
- function _interopRequireDefault(obj) {
10
- return obj && obj.__esModule ? obj : {
11
- default: obj
12
- };
13
- }
14
- class Maker {
15
- /**
16
- * @param configOrConfigFetcher - Either a configuration object for this maker or a simple method that returns such a configuration for a given target architecture
17
- * @param platformsToMakeOn - If you want this maker to run on platforms different from `defaultPlatforms` you can provide those platforms here
18
- */ constructor(configOrConfigFetcher = {}, platformsToMakeOn){
19
- this.configOrConfigFetcher = configOrConfigFetcher;
20
- this.platformsToMakeOn = platformsToMakeOn;
21
- this.requiredExternalBinaries = [];
22
- Object.defineProperty(this, '__isElectronForgeMaker', {
23
- value: true,
24
- enumerable: false,
25
- configurable: false
26
- });
27
- }
28
- get platforms() {
29
- if (this.platformsToMakeOn) return this.platformsToMakeOn;
30
- return this.defaultPlatforms;
31
- }
32
- // TODO: Remove this, it is an eye-sore and is a nasty hack to provide forge
33
- // v5 style functionality in the new API
34
- prepareConfig(targetArch) {
35
- if (typeof this.configOrConfigFetcher === 'function') {
36
- this.config = this.configOrConfigFetcher(targetArch);
37
- } else {
38
- this.config = this.configOrConfigFetcher;
39
- }
40
- }
41
- /**
42
- * Makers must implement this method and return true or false indicating whether
43
- * this maker can be run on the current platform. Normally this is just a process.platform
44
- * check but it can be a deeper check for dependencies like fake-root or other
45
- * required external build tools.
46
- *
47
- * If the issue is a missing dependency you should log out a HELPFUL error message
48
- * telling the developer exactly what is missing and if possible how to get it.
49
- */ isSupportedOnCurrentPlatform() {
50
- if (this.isSupportedOnCurrentPlatform === Maker.prototype.isSupportedOnCurrentPlatform) {
51
- throw new Error(`Maker ${this.name} did not implement the isSupportedOnCurrentPlatform method`);
52
- }
53
- return true;
54
- }
55
- /**
56
- * Makers must implement this method and return an array of absolute paths
57
- * to the artifacts generated by your maker
58
- */ // eslint-disable-next-line @typescript-eslint/no-unused-vars
59
- async make(opts) {
60
- if (this.make === Maker.prototype.make) {
61
- throw new Error(`Maker ${this.name} did not implement the make method`);
62
- }
63
- return [];
64
- }
65
- /**
66
- * Helpers
67
- */ /**
68
- * Ensures the directory exists and is forced to be empty.
69
- *
70
- * I.e. If the directory already exists it is deleted and recreated, this
71
- * is a destructive operation
72
- */ async ensureDirectory(dir) {
73
- if (await _fsExtra.default.pathExists(dir)) {
74
- await _fsExtra.default.remove(dir);
75
- }
76
- return _fsExtra.default.mkdirs(dir);
77
- }
78
- /**
79
- * Ensures the path to the file exists and the file does not exist
80
- *
81
- * I.e. If the file already exists it is deleted and the path created
82
- */ async ensureFile(file) {
83
- if (await _fsExtra.default.pathExists(file)) {
84
- await _fsExtra.default.remove(file);
85
- }
86
- await _fsExtra.default.mkdirs(_path.default.dirname(file));
87
- }
88
- /**
89
- * Checks if the specified binaries exist, which are required for the maker to be used.
90
- */ externalBinariesExist() {
91
- return this.requiredExternalBinaries.every((binary)=>_which.default.sync(binary, {
92
- nothrow: true
93
- }) !== null
94
- );
95
- }
96
- /**
97
- * Throws an error if any of the binaries don't exist.
98
- */ ensureExternalBinariesExist() {
99
- if (!this.externalBinariesExist()) {
100
- throw new Error(`Cannot make for ${this.name}, the following external binaries need to be installed: ${this.requiredExternalBinaries.join(', ')}`);
101
- }
102
- }
103
- /**
104
- * Checks if the given module is installed, used for testing if optional dependencies
105
- * are installed or not
106
- */ isInstalled(module) {
107
- try {
108
- require(module);
109
- return true;
110
- } catch (e) {
111
- // Package doesn't exist -- must not be installable on this platform
112
- return false;
113
- }
114
- }
115
- /**
116
- * Normalize the given semver-formatted version to a 4-part dot delimited version number without
117
- * prerelease information for use in Windows apps.
118
- */ normalizeWindowsVersion(version) {
119
- const noPrerelease = version.replace(/-.*/, '');
120
- return `${noPrerelease}.0`;
121
- }
122
- }
123
- exports.default = Maker;
124
- exports.MakerBase = Maker;
125
-
126
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9NYWtlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IHsgRm9yZ2VBcmNoLCBGb3JnZVBsYXRmb3JtLCBJRm9yZ2VNYWtlciwgUmVzb2x2ZWRGb3JnZUNvbmZpZyB9IGZyb20gJ0BlbGVjdHJvbi1mb3JnZS9zaGFyZWQtdHlwZXMnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB3aGljaCBmcm9tICd3aGljaCc7XG5cbmV4cG9ydCB0eXBlIEVtcHR5Q29uZmlnID0gUmVjb3JkPHN0cmluZywgbmV2ZXI+O1xuXG5leHBvcnQgaW50ZXJmYWNlIE1ha2VyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHBhY2thZ2VkIEVsZWN0cm9uIGFwcGxpY2F0aW9uXG4gICAqL1xuICBkaXI6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBkaXJlY3RvcnkgeW91IHNob3VsZCBwdXQgYWxsIHlvdXIgYXJ0aWZhY3RzIGluIChwb3RlbnRpYWxseSBpbiBzdWIgZm9sZGVycylcbiAgICogTk9URTogdGhpcyBkaXJlY3RvcnkgaXMgbm90IGd1YXJ1bnRlZWQgdG8gYWxyZWFkeSBleGlzdFxuICAgKi9cbiAgbWFrZURpcjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJlc29sdmVkIGh1bWFuIGZyaWVuZGx5IG5hbWUgb2YgdGhlIHByb2plY3RcbiAgICovXG4gIGFwcE5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0YXJnZXQgcGxhdGZvcm0geW91IHNob3VsZCBtYWtlIGZvclxuICAgKi9cbiAgdGFyZ2V0UGxhdGZvcm06IEZvcmdlUGxhdGZvcm07XG4gIC8qKlxuICAgKiBUaGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSB5b3Ugc2hvdWxkIG1ha2UgZm9yXG4gICAqL1xuICB0YXJnZXRBcmNoOiBGb3JnZUFyY2g7XG4gIC8qKlxuICAgKiBGdWxseSByZXNvbHZlZCBmb3JnZSBjb25maWd1cmF0aW9uLCB5b3Ugc2hvdWxkbid0IHJlYWxseSBuZWVkIHRoaXNcbiAgICovXG4gIGZvcmdlQ29uZmlnOiBSZXNvbHZlZEZvcmdlQ29uZmlnO1xuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uJ3MgcGFja2FnZS5qc29uIGZpbGVcbiAgICovXG4gIHBhY2thZ2VKU09OOiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxufVxuXG5leHBvcnQgZGVmYXVsdCBhYnN0cmFjdCBjbGFzcyBNYWtlcjxDPiBpbXBsZW1lbnRzIElGb3JnZU1ha2VyIHtcbiAgcHVibGljIGNvbmZpZyE6IEM7XG5cbiAgcHVibGljIGFic3RyYWN0IG5hbWU6IHN0cmluZztcblxuICBwdWJsaWMgYWJzdHJhY3QgZGVmYXVsdFBsYXRmb3JtczogRm9yZ2VQbGF0Zm9ybVtdO1xuXG4gIHB1YmxpYyByZXF1aXJlZEV4dGVybmFsQmluYXJpZXM6IHN0cmluZ1tdID0gW107XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfX2lzRWxlY3Ryb25Gb3JnZU1ha2VyITogdHJ1ZTtcblxuICAvKipcbiAgICogQHBhcmFtIGNvbmZpZ09yQ29uZmlnRmV0Y2hlciAtIEVpdGhlciBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciB0aGlzIG1ha2VyIG9yIGEgc2ltcGxlIG1ldGhvZCB0aGF0IHJldHVybnMgc3VjaCBhIGNvbmZpZ3VyYXRpb24gZm9yIGEgZ2l2ZW4gdGFyZ2V0IGFyY2hpdGVjdHVyZVxuICAgKiBAcGFyYW0gcGxhdGZvcm1zVG9NYWtlT24gLSBJZiB5b3Ugd2FudCB0aGlzIG1ha2VyIHRvIHJ1biBvbiBwbGF0Zm9ybXMgZGlmZmVyZW50IGZyb20gYGRlZmF1bHRQbGF0Zm9ybXNgIHlvdSBjYW4gcHJvdmlkZSB0aG9zZSBwbGF0Zm9ybXMgaGVyZVxuICAgKi9cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjb25maWdPckNvbmZpZ0ZldGNoZXI6IEMgfCAoKGFyY2g6IEZvcmdlQXJjaCkgPT4gQykgPSB7fSBhcyBDLCBwcm90ZWN0ZWQgcGxhdGZvcm1zVG9NYWtlT24/OiBGb3JnZVBsYXRmb3JtW10pIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ19faXNFbGVjdHJvbkZvcmdlTWFrZXInLCB7XG4gICAgICB2YWx1ZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBwbGF0Zm9ybXMoKTogRm9yZ2VQbGF0Zm9ybVtdIHtcbiAgICBpZiAodGhpcy5wbGF0Zm9ybXNUb01ha2VPbikgcmV0dXJuIHRoaXMucGxhdGZvcm1zVG9NYWtlT247XG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdFBsYXRmb3JtcztcbiAgfVxuXG4gIC8vIFRPRE86IFJlbW92ZSB0aGlzLCBpdCBpcyBhbiBleWUtc29yZSBhbmQgaXMgYSBuYXN0eSBoYWNrIHRvIHByb3ZpZGUgZm9yZ2VcbiAgLy8gICAgICAgdjUgc3R5bGUgZnVuY3Rpb25hbGl0eSBpbiB0aGUgbmV3IEFQSVxuICBwcmVwYXJlQ29uZmlnKHRhcmdldEFyY2g6IEZvcmdlQXJjaCk6IHZvaWQge1xuICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWdPckNvbmZpZ0ZldGNoZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuY29uZmlnID0gKHRoaXMuY29uZmlnT3JDb25maWdGZXRjaGVyIGFzIHVua25vd24gYXMgKGFyY2g6IEZvcmdlQXJjaCkgPT4gQykodGFyZ2V0QXJjaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29uZmlnID0gdGhpcy5jb25maWdPckNvbmZpZ0ZldGNoZXIgYXMgQztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFrZXJzIG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kIGFuZCByZXR1cm4gdHJ1ZSBvciBmYWxzZSBpbmRpY2F0aW5nIHdoZXRoZXJcbiAgICogdGhpcyBtYWtlciBjYW4gYmUgcnVuIG9uIHRoZSBjdXJyZW50IHBsYXRmb3JtLiAgTm9ybWFsbHkgdGhpcyBpcyBqdXN0IGEgcHJvY2Vzcy5wbGF0Zm9ybVxuICAgKiBjaGVjayBidXQgaXQgY2FuIGJlIGEgZGVlcGVyIGNoZWNrIGZvciBkZXBlbmRlbmNpZXMgbGlrZSBmYWtlLXJvb3Qgb3Igb3RoZXJcbiAgICogcmVxdWlyZWQgZXh0ZXJuYWwgYnVpbGQgdG9vbHMuXG4gICAqXG4gICAqIElmIHRoZSBpc3N1ZSBpcyBhIG1pc3NpbmcgZGVwZW5kZW5jeSB5b3Ugc2hvdWxkIGxvZyBvdXQgYSBIRUxQRlVMIGVycm9yIG1lc3NhZ2VcbiAgICogdGVsbGluZyB0aGUgZGV2ZWxvcGVyIGV4YWN0bHkgd2hhdCBpcyBtaXNzaW5nIGFuZCBpZiBwb3NzaWJsZSBob3cgdG8gZ2V0IGl0LlxuICAgKi9cbiAgaXNTdXBwb3J0ZWRPbkN1cnJlbnRQbGF0Zm9ybSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc1N1cHBvcnRlZE9uQ3VycmVudFBsYXRmb3JtID09PSBNYWtlci5wcm90b3R5cGUuaXNTdXBwb3J0ZWRPbkN1cnJlbnRQbGF0Zm9ybSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNYWtlciAke3RoaXMubmFtZX0gZGlkIG5vdCBpbXBsZW1lbnQgdGhlIGlzU3VwcG9ydGVkT25DdXJyZW50UGxhdGZvcm0gbWV0aG9kYCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VycyBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZCBhbmQgcmV0dXJuIGFuIGFycmF5IG9mIGFic29sdXRlIHBhdGhzXG4gICAqIHRvIHRoZSBhcnRpZmFjdHMgZ2VuZXJhdGVkIGJ5IHlvdXIgbWFrZXJcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgYXN5bmMgbWFrZShvcHRzOiBNYWtlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgaWYgKHRoaXMubWFrZSA9PT0gTWFrZXIucHJvdG90eXBlLm1ha2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWFrZXIgJHt0aGlzLm5hbWV9IGRpZCBub3QgaW1wbGVtZW50IHRoZSBtYWtlIG1ldGhvZGApO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyc1xuICAgKi9cblxuICAvKipcbiAgICogRW5zdXJlcyB0aGUgZGlyZWN0b3J5IGV4aXN0cyBhbmQgaXMgZm9yY2VkIHRvIGJlIGVtcHR5LlxuICAgKlxuICAgKiBJLmUuIElmIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMgaXQgaXMgZGVsZXRlZCBhbmQgcmVjcmVhdGVkLCB0aGlzXG4gICAqIGlzIGEgZGVzdHJ1Y3RpdmUgb3BlcmF0aW9uXG4gICAqL1xuICBhc3luYyBlbnN1cmVEaXJlY3RvcnkoZGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoYXdhaXQgZnMucGF0aEV4aXN0cyhkaXIpKSB7XG4gICAgICBhd2FpdCBmcy5yZW1vdmUoZGlyKTtcbiAgICB9XG4gICAgcmV0dXJuIGZzLm1rZGlycyhkaXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdGhlIHBhdGggdG8gdGhlIGZpbGUgZXhpc3RzIGFuZCB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdFxuICAgKlxuICAgKiBJLmUuIElmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzIGl0IGlzIGRlbGV0ZWQgYW5kIHRoZSBwYXRoIGNyZWF0ZWRcbiAgICovXG4gIGFzeW5jIGVuc3VyZUZpbGUoZmlsZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGF3YWl0IGZzLnBhdGhFeGlzdHMoZmlsZSkpIHtcbiAgICAgIGF3YWl0IGZzLnJlbW92ZShmaWxlKTtcbiAgICB9XG4gICAgYXdhaXQgZnMubWtkaXJzKHBhdGguZGlybmFtZShmaWxlKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgYmluYXJpZXMgZXhpc3QsIHdoaWNoIGFyZSByZXF1aXJlZCBmb3IgdGhlIG1ha2VyIHRvIGJlIHVzZWQuXG4gICAqL1xuICBleHRlcm5hbEJpbmFyaWVzRXhpc3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWlyZWRFeHRlcm5hbEJpbmFyaWVzLmV2ZXJ5KChiaW5hcnkpID0+IHdoaWNoLnN5bmMoYmluYXJ5LCB7IG5vdGhyb3c6IHRydWUgfSkgIT09IG51bGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiBhbnkgb2YgdGhlIGJpbmFyaWVzIGRvbid0IGV4aXN0LlxuICAgKi9cbiAgZW5zdXJlRXh0ZXJuYWxCaW5hcmllc0V4aXN0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5leHRlcm5hbEJpbmFyaWVzRXhpc3QoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgbWFrZSBmb3IgJHt0aGlzLm5hbWV9LCB0aGUgZm9sbG93aW5nIGV4dGVybmFsIGJpbmFyaWVzIG5lZWQgdG8gYmUgaW5zdGFsbGVkOiAke3RoaXMucmVxdWlyZWRFeHRlcm5hbEJpbmFyaWVzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gbW9kdWxlIGlzIGluc3RhbGxlZCwgdXNlZCBmb3IgdGVzdGluZyBpZiBvcHRpb25hbCBkZXBlbmRlbmNpZXNcbiAgICogYXJlIGluc3RhbGxlZCBvciBub3RcbiAgICovXG4gIGlzSW5zdGFsbGVkKG1vZHVsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJlcXVpcmUobW9kdWxlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIFBhY2thZ2UgZG9lc24ndCBleGlzdCAtLSBtdXN0IG5vdCBiZSBpbnN0YWxsYWJsZSBvbiB0aGlzIHBsYXRmb3JtXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZSB0aGUgZ2l2ZW4gc2VtdmVyLWZvcm1hdHRlZCB2ZXJzaW9uIHRvIGEgNC1wYXJ0IGRvdCBkZWxpbWl0ZWQgdmVyc2lvbiBudW1iZXIgd2l0aG91dFxuICAgKiBwcmVyZWxlYXNlIGluZm9ybWF0aW9uIGZvciB1c2UgaW4gV2luZG93cyBhcHBzLlxuICAgKi9cbiAgbm9ybWFsaXplV2luZG93c1ZlcnNpb24odmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBub1ByZXJlbGVhc2UgPSB2ZXJzaW9uLnJlcGxhY2UoLy0uKi8sICcnKTtcbiAgICByZXR1cm4gYCR7bm9QcmVyZWxlYXNlfS4wYDtcbiAgfVxufVxuXG5leHBvcnQgeyBNYWtlciBhcyBNYWtlckJhc2UgfTtcbiJdLCJuYW1lcyI6WyJNYWtlciIsImNvbmZpZ09yQ29uZmlnRmV0Y2hlciIsInBsYXRmb3Jtc1RvTWFrZU9uIiwicmVxdWlyZWRFeHRlcm5hbEJpbmFyaWVzIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJ2YWx1ZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJwbGF0Zm9ybXMiLCJkZWZhdWx0UGxhdGZvcm1zIiwicHJlcGFyZUNvbmZpZyIsInRhcmdldEFyY2giLCJjb25maWciLCJpc1N1cHBvcnRlZE9uQ3VycmVudFBsYXRmb3JtIiwicHJvdG90eXBlIiwiRXJyb3IiLCJuYW1lIiwibWFrZSIsIm9wdHMiLCJlbnN1cmVEaXJlY3RvcnkiLCJkaXIiLCJmcyIsInBhdGhFeGlzdHMiLCJyZW1vdmUiLCJta2RpcnMiLCJlbnN1cmVGaWxlIiwiZmlsZSIsInBhdGgiLCJkaXJuYW1lIiwiZXh0ZXJuYWxCaW5hcmllc0V4aXN0IiwiZXZlcnkiLCJiaW5hcnkiLCJ3aGljaCIsInN5bmMiLCJub3Rocm93IiwiZW5zdXJlRXh0ZXJuYWxCaW5hcmllc0V4aXN0Iiwiam9pbiIsImlzSW5zdGFsbGVkIiwibW9kdWxlIiwicmVxdWlyZSIsImUiLCJub3JtYWxpemVXaW5kb3dzVmVyc2lvbiIsInZlcnNpb24iLCJub1ByZXJlbGVhc2UiLCJyZXBsYWNlIiwiTWFrZXJCYXNlIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFpQixHQUFNLENBQU4sS0FBTTtBQUdSLEdBQVUsQ0FBVixRQUFVO0FBQ1AsR0FBTyxDQUFQLE1BQU87Ozs7OztNQW9DS0EsS0FBSztJQVlqQyxFQUdHLEFBSEg7OztHQUdHLEFBSEgsRUFHRyxhQUNpQkMscUJBQW1ELEdBQUcsQ0FBQyxDQUFDLEVBQWlCQyxpQkFBbUMsQ0FBRSxDQUFDO2FBQS9HRCxxQkFBbUQsR0FBbkRBLHFCQUFtRDthQUFzQkMsaUJBQW1DLEdBQW5DQSxpQkFBbUM7UUFoQm5ILElBc0lkLENBL0hRQyx3QkFBd0IsR0FBYSxDQUFDLENBQUM7UUFVNUNDLE1BQU0sQ0FBQ0MsY0FBYyxDQUFDLElBQUksRUFBRSxDQUF3Qix5QkFBRSxDQUFDO1lBQ3JEQyxLQUFLLEVBQUUsSUFBSTtZQUNYQyxVQUFVLEVBQUUsS0FBSztZQUNqQkMsWUFBWSxFQUFFLEtBQUs7UUFDckIsQ0FBQztJQUNILENBQUM7UUFFR0MsU0FBUyxHQUFvQixDQUFDO1FBQ2hDLEVBQUUsRUFBRSxJQUFJLENBQUNQLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUNBLGlCQUFpQjtRQUN6RCxNQUFNLENBQUMsSUFBSSxDQUFDUSxnQkFBZ0I7SUFDOUIsQ0FBQztJQUVELEVBQTRFLEFBQTVFLDBFQUE0RTtJQUM1RSxFQUE4QyxBQUE5Qyw0Q0FBOEM7SUFDOUNDLGFBQWEsQ0FBQ0MsVUFBcUIsRUFBUSxDQUFDO1FBQzFDLEVBQUUsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDWCxxQkFBcUIsS0FBSyxDQUFVLFdBQUUsQ0FBQztZQUNyRCxJQUFJLENBQUNZLE1BQU0sR0FBSSxJQUFJLENBQUNaLHFCQUFxQixDQUF1Q1csVUFBVTtRQUM1RixDQUFDLE1BQU0sQ0FBQztZ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