@todesktop/shared 7.188.17 → 7.188.19-beta.1
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/README.md +75 -0
- package/eslint.config.mjs +57 -0
- package/lib/base.d.ts +51 -22
- package/lib/base.js +3 -3
- package/lib/desktopify.d.ts +102 -25
- package/lib/desktopify.js +17 -12
- package/lib/desktopify2.d.ts +25 -14
- package/lib/hsm.d.ts +30 -0
- package/lib/hsm.js +42 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +7 -2
- package/lib/plans.d.ts +127 -220
- package/lib/plans.js +619 -78
- package/lib/plugin.d.ts +7 -7
- package/lib/toDesktop.d.ts +4 -8
- package/lib/translation.d.ts +2 -2
- package/lib/validations.d.ts +3 -3
- package/lib/validations.js +2 -1
- package/package.json +8 -5
- package/src/base.ts +56 -23
- package/src/desktopify.ts +83 -5
- package/src/desktopify2.ts +13 -1
- package/src/hsm.ts +63 -0
- package/src/index.ts +1 -0
- package/src/plans.ts +698 -91
- package/src/toDesktop.ts +4 -7
- package/.eslintrc.js +0 -33
package/README.md
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
## Stripe Subscriptions
|
|
2
|
+
|
|
3
|
+
Most of the code for coordinating Stripe subscriptions can be found in `plans.ts`. Conceptually, we organize subscriptions as follows:
|
|
4
|
+
|
|
5
|
+
- A `Price` captures the ID information of a Stripe Price and it's current status:
|
|
6
|
+
- `inactive` means that the price should no longer be used (but may have been used previously).
|
|
7
|
+
- `active` means that the price should be used going forward.
|
|
8
|
+
- A `Product` maps to what is shown in Stripe's [Product Catalogue](https://dashboard.stripe.com/products?active=true) UI. These help use organize the dev and prod versions of a `Product`, as well as their underlying `productId` and `priceIds`.
|
|
9
|
+
- A `Plan` is a collection of `Product`s, organized by their tier (basic, legacy_pro, pro, scale).
|
|
10
|
+
|
|
11
|
+
Each Plan also specifies the `eligiblePlanTiers` that it accepts for validation purposes. E.g. the basic plan specifies `['basic', 'legacy_pro', 'pro', 'scale']` in its `eligiblePlanTiers` field, meaning that Products belonging within any of those tiers would satisfy validation requirements. Similarly, the basic plan specifies `['scale']` in its tiers field, meaning that only **Products** belonging to the scale **Plans** would satisfy validation.
|
|
12
|
+
|
|
13
|
+
### Adding a new subscription price
|
|
14
|
+
|
|
15
|
+
Before adding a new price, you'll first need to identify the Stripe [Stripe Product](https://dashboard.stripe.com/products?active=true) that the price should be added to.
|
|
16
|
+
|
|
17
|
+
Once you've added a new price to the product in Stripe's `live` and `test` mode, then you can come back and add it to the relevant product in `plans.ts`.
|
|
18
|
+
|
|
19
|
+
For example, these are the dev and prod records for the legacy enterprise product:
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
const legacyEnterpriseDev = createProduct('prod_Hc9PMnHUmHvOlw', {
|
|
23
|
+
monthly_700: createPrice('price_1H2v6JIewCKA2h0IgUwsuctb', 'active'),
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
const legacyEnterpriseProd = createProduct('prod_GuGGWeMQ3SCuE9', {
|
|
27
|
+
monthly_700: createPrice('plan_GuGICX6nRtDthN', 'active'),
|
|
28
|
+
});
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
If you added a new Stripe price to this product that is billed yearly for $10,000, then you would add update the products as follows:
|
|
32
|
+
|
|
33
|
+
```ts
|
|
34
|
+
const legacyEnterpriseDev = createProduct('prod_Hc9PMnHUmHvOlw', {
|
|
35
|
+
monthly_700: createPrice('price_1H2v6JIewCKA2h0IgUwsuctb', 'active'),
|
|
36
|
+
yearly_10000: createPrice('...', 'active'),
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
const legacyEnterpriseProd = createProduct('prod_GuGGWeMQ3SCuE9', {
|
|
40
|
+
monthly_700: createPrice('plan_GuGICX6nRtDthN', 'active'),
|
|
41
|
+
yearly_10000: createPrice('...', 'active'),
|
|
42
|
+
});
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Rebuilding the Stripe Customer Portals
|
|
46
|
+
|
|
47
|
+
ToDesktop's subscription flow needs to support both **CLI** and **ToDesktop Builder** customers. To achieve this, we dynamically create/load billing portals based on whether the customer is a **CLI** or **ToDesktop Builder** user, whether the customer needs to **Upgrade** or **Update** their plan, and whether the environment is in prod or dev.
|
|
48
|
+
|
|
49
|
+
This leaves us with 8 unique customer portal configurations:
|
|
50
|
+
|
|
51
|
+
- _cliUpdateConfigurationDev_
|
|
52
|
+
- _cliUpdateConfigurationProd_
|
|
53
|
+
- _cliUpgradeConfigurationDev_
|
|
54
|
+
- _cliUpgradeConfigurationProd_
|
|
55
|
+
- _builderUpdateConfigurationDev_
|
|
56
|
+
- _builderUpdateConfigurationProd_
|
|
57
|
+
- _builderUpgradeConfigurationDev_
|
|
58
|
+
- _builderUpgradeConfigurationProd_
|
|
59
|
+
|
|
60
|
+
Each configuration specifies the products and prices (with an `active` status) that should be displayed when a user navigates to the customer billing portal.
|
|
61
|
+
|
|
62
|
+
The web app and desktop app then only need to specify the `PortalConfigKey` when creating a checkout session from the client:
|
|
63
|
+
|
|
64
|
+
```ts
|
|
65
|
+
// begin a CLI upgrade customer portal session
|
|
66
|
+
await createCustomerPortalSession({
|
|
67
|
+
configuration: PortalConfigKey.CLIUpgradeProd,
|
|
68
|
+
flowData: {
|
|
69
|
+
type: 'subscription_update',
|
|
70
|
+
subscription_update: { subscription: subscription.id },
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
If you have updated the products that are used by any of the portal configurations, then you'll also need to increase the `PORTAL_VERSION` constant by 1. This will ensure that the portals are rebuilt to use the latest products and prices. This happens in `createCustomerPortalSession` in the web app.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import typescriptEslint from '@typescript-eslint/eslint-plugin';
|
|
2
|
+
import prettier from 'eslint-plugin-prettier';
|
|
3
|
+
import globals from 'globals';
|
|
4
|
+
import tsParser from '@typescript-eslint/parser';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { fileURLToPath } from 'node:url';
|
|
7
|
+
import js from '@eslint/js';
|
|
8
|
+
import { FlatCompat } from '@eslint/eslintrc';
|
|
9
|
+
|
|
10
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
11
|
+
const __dirname = path.dirname(__filename);
|
|
12
|
+
const compat = new FlatCompat({
|
|
13
|
+
baseDirectory: __dirname,
|
|
14
|
+
recommendedConfig: js.configs.recommended,
|
|
15
|
+
allConfig: js.configs.all,
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
export default [
|
|
19
|
+
...compat.extends(
|
|
20
|
+
'eslint:recommended',
|
|
21
|
+
'plugin:@typescript-eslint/recommended',
|
|
22
|
+
'prettier'
|
|
23
|
+
),
|
|
24
|
+
{
|
|
25
|
+
plugins: {
|
|
26
|
+
'@typescript-eslint': typescriptEslint,
|
|
27
|
+
prettier,
|
|
28
|
+
},
|
|
29
|
+
|
|
30
|
+
languageOptions: {
|
|
31
|
+
globals: {
|
|
32
|
+
...globals.node,
|
|
33
|
+
},
|
|
34
|
+
|
|
35
|
+
parser: tsParser,
|
|
36
|
+
ecmaVersion: 2020,
|
|
37
|
+
sourceType: 'module',
|
|
38
|
+
|
|
39
|
+
parserOptions: {
|
|
40
|
+
project: './tsconfig.json',
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
rules: {
|
|
45
|
+
'prettier/prettier': 'error',
|
|
46
|
+
|
|
47
|
+
'@typescript-eslint/no-misused-promises': [
|
|
48
|
+
'error',
|
|
49
|
+
{
|
|
50
|
+
checksVoidReturn: false,
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
|
|
54
|
+
'@typescript-eslint/no-explicit-any': 'warn',
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
];
|
package/lib/base.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { ExtraFileReference, FilePath, IAppBuilderLib, Release } from './desktopify';
|
|
1
|
+
import { ExtraFileReference, FilePath, IAppBuilderLib, PlatformName, Release } from './desktopify';
|
|
2
2
|
export interface Schemable {
|
|
3
3
|
schemaVersion?: number;
|
|
4
4
|
}
|
|
5
|
-
|
|
6
|
-
export
|
|
5
|
+
type CompositeIdFileLocationKey = string;
|
|
6
|
+
export type StaticAnalysisItem = {
|
|
7
7
|
hidden: boolean;
|
|
8
8
|
};
|
|
9
|
-
export
|
|
9
|
+
export type ProgressTypes = 'queued' | 'progress' | 'done' | 'error';
|
|
10
10
|
export interface IChecklistItem {
|
|
11
11
|
[id: string]: boolean;
|
|
12
12
|
}
|
|
@@ -103,6 +103,7 @@ export interface ToDesktopJson {
|
|
|
103
103
|
asar?: boolean;
|
|
104
104
|
asarUnpack?: boolean | string[];
|
|
105
105
|
bucket?: string;
|
|
106
|
+
buildVersion?: string;
|
|
106
107
|
copyright?: string;
|
|
107
108
|
dmg?: {
|
|
108
109
|
background?: FilePath;
|
|
@@ -138,6 +139,13 @@ export interface ToDesktopJson {
|
|
|
138
139
|
icon?: FilePath;
|
|
139
140
|
requirements?: FilePath;
|
|
140
141
|
};
|
|
142
|
+
mas?: {
|
|
143
|
+
type?: 'development' | 'distribution';
|
|
144
|
+
entitlements?: FilePath;
|
|
145
|
+
entitlementsInherit?: FilePath;
|
|
146
|
+
provisioningProfile?: FilePath;
|
|
147
|
+
x64ArchFiles?: string;
|
|
148
|
+
};
|
|
141
149
|
nodeVersion?: string;
|
|
142
150
|
npmVersion?: string;
|
|
143
151
|
packageManager?: 'npm' | 'yarn' | 'pnpm';
|
|
@@ -167,15 +175,13 @@ export interface CustomWindowsCodeSignFile {
|
|
|
167
175
|
certType: string;
|
|
168
176
|
hsmCertType: WindowsHSMCertType.file;
|
|
169
177
|
hsmCertName: string;
|
|
170
|
-
certPassword?: string;
|
|
171
|
-
certUrl?: URL;
|
|
172
178
|
}
|
|
173
179
|
export interface CustomWindowsCodeSignEV {
|
|
174
180
|
certType: 'hsm';
|
|
175
181
|
hsmCertType: WindowsHSMCertType.ev;
|
|
176
182
|
hsmCertName: string;
|
|
177
183
|
}
|
|
178
|
-
export
|
|
184
|
+
export type CustomMacCodeSign = {
|
|
179
185
|
type: 'url';
|
|
180
186
|
certName: string;
|
|
181
187
|
certPassword: string;
|
|
@@ -183,18 +189,23 @@ export declare type CustomMacCodeSign = {
|
|
|
183
189
|
} | {
|
|
184
190
|
type: 'hsm';
|
|
185
191
|
};
|
|
186
|
-
export
|
|
192
|
+
export type CustomMacNotarization = CustomNotarizationApiKeyAuth | CustomNotarizationPasswordAuth | CustomNotarizationPasswordHsmAuth;
|
|
193
|
+
export interface CustomNotarizationApiKeyAuth {
|
|
194
|
+
appleApiKeyId: string;
|
|
195
|
+
appleApiIssuer: string;
|
|
196
|
+
type: 'hsm-api';
|
|
197
|
+
}
|
|
198
|
+
export interface CustomNotarizationPasswordAuth {
|
|
187
199
|
appleId: string;
|
|
188
200
|
appleIdPassword: string;
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
type: 'hsm';
|
|
201
|
+
teamId: string;
|
|
202
|
+
}
|
|
203
|
+
export interface CustomNotarizationPasswordHsmAuth {
|
|
193
204
|
appleId: string;
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
}
|
|
197
|
-
export
|
|
205
|
+
teamId: string;
|
|
206
|
+
type: 'hsm';
|
|
207
|
+
}
|
|
208
|
+
export type ReleaseRedirectionRule = {
|
|
198
209
|
appId: string;
|
|
199
210
|
rule: 'app';
|
|
200
211
|
} | {
|
|
@@ -205,6 +216,10 @@ export declare type ReleaseRedirectionRule = {
|
|
|
205
216
|
buildId: string;
|
|
206
217
|
ipList: string[];
|
|
207
218
|
rule: 'buildByIp';
|
|
219
|
+
} | {
|
|
220
|
+
buildId: string;
|
|
221
|
+
platforms: PlatformName[];
|
|
222
|
+
rule: 'buildByPlatform';
|
|
208
223
|
};
|
|
209
224
|
export interface BaseApp extends Schemable {
|
|
210
225
|
id: string;
|
|
@@ -214,12 +229,12 @@ export interface BaseApp extends Schemable {
|
|
|
214
229
|
customNotarization?: CustomMacNotarization;
|
|
215
230
|
customWindowsCodeSign?: CustomWindowsCodeSignFile | CustomWindowsCodeSignEV;
|
|
216
231
|
meta?: IAppMeta;
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
232
|
+
parentApp?: BaseApp;
|
|
233
|
+
parent?: {
|
|
234
|
+
id: string;
|
|
235
|
+
relationshipToParent: string;
|
|
236
|
+
} | null;
|
|
237
|
+
subscription?: Subscription;
|
|
223
238
|
shouldCreate32BitWindowsArtifacts?: boolean;
|
|
224
239
|
shouldCreateAppImages?: boolean;
|
|
225
240
|
shouldCreateAppleSiliconAssets?: boolean;
|
|
@@ -228,6 +243,8 @@ export interface BaseApp extends Schemable {
|
|
|
228
243
|
shouldCreateArm64WindowsArtifacts?: boolean;
|
|
229
244
|
shouldCreateDebianPackages?: boolean;
|
|
230
245
|
shouldCreateDMGs?: boolean;
|
|
246
|
+
shouldCreateMacAppStoreFiles?: boolean;
|
|
247
|
+
shouldCreateMacPKG?: boolean;
|
|
231
248
|
shouldCreateMacUniversalInstaller?: boolean;
|
|
232
249
|
shouldCreateMacZipInstallers?: boolean;
|
|
233
250
|
shouldCreateMSIInstallers?: boolean;
|
|
@@ -236,10 +253,22 @@ export interface BaseApp extends Schemable {
|
|
|
236
253
|
shouldCreateRPMPackages?: boolean;
|
|
237
254
|
shouldCreateSnapFiles?: boolean;
|
|
238
255
|
appxConfig?: Partial<IAppBuilderLib['config']['appx']>;
|
|
256
|
+
masConfig?: Partial<IAppBuilderLib['config']['mas']>;
|
|
239
257
|
nsisConfig?: Partial<IAppBuilderLib['config']['nsis']>;
|
|
240
258
|
snapStore?: {
|
|
241
259
|
login?: string;
|
|
242
260
|
description?: string;
|
|
243
261
|
};
|
|
262
|
+
macUniversalInstallerConfig?: {
|
|
263
|
+
shouldPinToVersion?: boolean;
|
|
264
|
+
};
|
|
244
265
|
}
|
|
266
|
+
export type Subscription = {
|
|
267
|
+
status: string;
|
|
268
|
+
subscriptionId: string;
|
|
269
|
+
itemId: string;
|
|
270
|
+
planId: string;
|
|
271
|
+
productId?: string;
|
|
272
|
+
priceId?: string;
|
|
273
|
+
};
|
|
245
274
|
export {};
|
package/lib/base.js
CHANGED
|
@@ -8,14 +8,14 @@ var WindowsEVOnboardingSteps;
|
|
|
8
8
|
WindowsEVOnboardingSteps["hasBeenVerified"] = "hasBeenVerified";
|
|
9
9
|
WindowsEVOnboardingSteps["hasGeneratedCert"] = "hasGeneratedCert";
|
|
10
10
|
WindowsEVOnboardingSteps["hasUploadedCert"] = "hasUploadedCert";
|
|
11
|
-
})(WindowsEVOnboardingSteps
|
|
11
|
+
})(WindowsEVOnboardingSteps || (exports.WindowsEVOnboardingSteps = WindowsEVOnboardingSteps = {}));
|
|
12
12
|
var WindowsEVOnboardingProvider;
|
|
13
13
|
(function (WindowsEVOnboardingProvider) {
|
|
14
14
|
WindowsEVOnboardingProvider["globalsign"] = "globalsign";
|
|
15
15
|
WindowsEVOnboardingProvider["other"] = "other";
|
|
16
|
-
})(WindowsEVOnboardingProvider
|
|
16
|
+
})(WindowsEVOnboardingProvider || (exports.WindowsEVOnboardingProvider = WindowsEVOnboardingProvider = {}));
|
|
17
17
|
var WindowsHSMCertType;
|
|
18
18
|
(function (WindowsHSMCertType) {
|
|
19
19
|
WindowsHSMCertType["ev"] = "ev";
|
|
20
20
|
WindowsHSMCertType["file"] = "file";
|
|
21
|
-
})(WindowsHSMCertType
|
|
21
|
+
})(WindowsHSMCertType || (exports.WindowsHSMCertType = WindowsHSMCertType = {}));
|
package/lib/desktopify.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { IApp2 } from './desktopify2';
|
|
2
2
|
import { IApp } from './toDesktop';
|
|
3
3
|
import { Configuration, PackagerOptions, PublishOptions } from 'app-builder-lib';
|
|
4
|
-
|
|
4
|
+
type appBuilderLib = PackagerOptions & PublishOptions;
|
|
5
5
|
export interface IAppBuilderLib extends appBuilderLib {
|
|
6
6
|
config: Configuration;
|
|
7
7
|
}
|
|
@@ -9,15 +9,15 @@ export interface ExtraFileReference {
|
|
|
9
9
|
from: FilePath;
|
|
10
10
|
to?: FilePath;
|
|
11
11
|
}
|
|
12
|
-
export
|
|
12
|
+
export type ISODate = string;
|
|
13
13
|
export declare enum PlatformName {
|
|
14
14
|
linux = "linux",
|
|
15
15
|
mac = "mac",
|
|
16
16
|
windows = "windows"
|
|
17
17
|
}
|
|
18
|
-
export
|
|
19
|
-
export
|
|
20
|
-
export
|
|
18
|
+
export type FilePath = string;
|
|
19
|
+
export type SemanticVersion = string;
|
|
20
|
+
export type URL = string;
|
|
21
21
|
export declare enum PackageManager {
|
|
22
22
|
npm = "npm",
|
|
23
23
|
yarn = "yarn",
|
|
@@ -40,22 +40,22 @@ export declare enum AnalysisStatus {
|
|
|
40
40
|
done = "done",
|
|
41
41
|
error = "error"
|
|
42
42
|
}
|
|
43
|
-
export
|
|
44
|
-
export
|
|
45
|
-
export
|
|
46
|
-
export
|
|
47
|
-
export
|
|
48
|
-
export
|
|
49
|
-
export
|
|
50
|
-
|
|
43
|
+
export type Arch = 'ia32' | 'x64' | 'arm64' | 'universal';
|
|
44
|
+
export type MacArch = 'x64' | 'arm64' | 'universal';
|
|
45
|
+
export type LinuxArch = 'x64' | 'arm64';
|
|
46
|
+
export type WindowsArch = 'ia32' | 'x64' | 'arm64' | 'universal';
|
|
47
|
+
export type LinuxArtifactName = 'appImage' | 'deb' | 'rpm' | 'snap';
|
|
48
|
+
export type MacArtifactName = 'dmg' | 'zip' | 'installer' | 'mas' | 'pkg';
|
|
49
|
+
export type WindowsArtifactName = 'msi' | 'nsis' | 'nsis-web' | 'nsis-web-7z' | 'appx';
|
|
50
|
+
type ArtifactDownload = Record<Arch, {
|
|
51
51
|
size: number;
|
|
52
52
|
standardUrl: URL;
|
|
53
53
|
url: URL;
|
|
54
54
|
} | null> | null;
|
|
55
|
-
export
|
|
56
|
-
export
|
|
57
|
-
export
|
|
58
|
-
export
|
|
55
|
+
export type LinuxArtifactDownloads = Record<LinuxArtifactName, ArtifactDownload>;
|
|
56
|
+
export type MacArtifactDownloads = Record<MacArtifactName, ArtifactDownload>;
|
|
57
|
+
export type WindowsArtifactDownloads = Record<WindowsArtifactName, ArtifactDownload>;
|
|
58
|
+
export type CodeSignSkipReason = 'no-cert' | 'user-disabled';
|
|
59
59
|
export interface PlatformBuild {
|
|
60
60
|
appBuilderLibConfig?: IAppBuilderLib;
|
|
61
61
|
artifactDownloads?: LinuxArtifactDownloads | MacArtifactDownloads | WindowsArtifactDownloads;
|
|
@@ -82,7 +82,7 @@ export interface PlatformBuild {
|
|
|
82
82
|
startedAt: ISODate;
|
|
83
83
|
status: BuildStatus;
|
|
84
84
|
}
|
|
85
|
-
export
|
|
85
|
+
export type CIRunner = 'circle' | 'azure';
|
|
86
86
|
export interface Build {
|
|
87
87
|
appCustomDomain?: string;
|
|
88
88
|
appName: string;
|
|
@@ -105,14 +105,17 @@ export interface Build {
|
|
|
105
105
|
hash?: string;
|
|
106
106
|
icon?: string;
|
|
107
107
|
id: string;
|
|
108
|
+
isArtifactsPruned?: boolean;
|
|
108
109
|
isBeingCancelled?: boolean;
|
|
109
110
|
linux?: PlatformBuild;
|
|
110
111
|
mac?: PlatformBuild;
|
|
111
112
|
onBuildFinishedWebhook?: string;
|
|
113
|
+
partiallyReleasedAt?: ISODate;
|
|
112
114
|
projectConfig?: string;
|
|
113
115
|
releasedAt?: ISODate;
|
|
114
116
|
shouldCodeSign: boolean;
|
|
115
117
|
shouldRelease: boolean;
|
|
118
|
+
shouldRetainForever?: boolean;
|
|
116
119
|
smokeTest?: {
|
|
117
120
|
buildServerExecutionId?: string;
|
|
118
121
|
isCanceled?: boolean;
|
|
@@ -123,6 +126,7 @@ export interface Build {
|
|
|
123
126
|
staticAnalysis?: {
|
|
124
127
|
status: AnalysisStatus;
|
|
125
128
|
result?: string;
|
|
129
|
+
error?: string;
|
|
126
130
|
};
|
|
127
131
|
dependencyAnalysis?: {
|
|
128
132
|
status: AnalysisStatus;
|
|
@@ -147,13 +151,16 @@ export interface Build {
|
|
|
147
151
|
};
|
|
148
152
|
windows?: PlatformBuild;
|
|
149
153
|
}
|
|
150
|
-
export
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
154
|
+
export type BundlePhobiaItem = {
|
|
155
|
+
result: {
|
|
156
|
+
description: string;
|
|
157
|
+
gzip: string;
|
|
158
|
+
name: string;
|
|
159
|
+
size: number;
|
|
160
|
+
} | null;
|
|
161
|
+
error: string | null;
|
|
155
162
|
};
|
|
156
|
-
export
|
|
163
|
+
export type ComputedBuildProperties = Pick<Build, 'desktopifyVersion' | 'electronVersionUsed' | 'endedAt' | 'errorMessage' | 'releasedAt' | 'standardUniversalDownloadUrl' | 'startedAt' | 'status' | 'universalDownloadUrl'>;
|
|
157
164
|
export declare enum ManifestCategory {
|
|
158
165
|
primary = "primary",
|
|
159
166
|
buildStamped = "build-stamped",
|
|
@@ -181,17 +188,87 @@ export interface WindowsCustomManifest extends CustomManifest {
|
|
|
181
188
|
}
|
|
182
189
|
export interface SmokeTestProgress {
|
|
183
190
|
abState?: SmokeTestState;
|
|
191
|
+
abSkipReason?: string;
|
|
184
192
|
appLaunched?: boolean;
|
|
185
193
|
appUpdated?: boolean;
|
|
186
194
|
bcState?: SmokeTestState;
|
|
195
|
+
buildAId?: string;
|
|
187
196
|
code?: string;
|
|
188
197
|
message?: string;
|
|
198
|
+
performance?: {
|
|
199
|
+
ab?: SmokeTestPerformance;
|
|
200
|
+
bc: SmokeTestPerformance;
|
|
201
|
+
};
|
|
189
202
|
progress: number;
|
|
190
203
|
screenshot?: string;
|
|
191
204
|
state: SmokeTestState;
|
|
192
205
|
updatedAppHasNoMainErrors?: boolean;
|
|
206
|
+
vm: {
|
|
207
|
+
agentVersion: string;
|
|
208
|
+
cpu?: string;
|
|
209
|
+
image: string;
|
|
210
|
+
imageVersion: string;
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
export interface SmokeTestPerformance {
|
|
214
|
+
/**
|
|
215
|
+
* Time between `process.getCreationTime()` and `App#redy event`
|
|
216
|
+
*/
|
|
217
|
+
appReadyMs: number;
|
|
218
|
+
/**
|
|
219
|
+
* Time between `process.getCreationTime()` and app is closed for update
|
|
220
|
+
*/
|
|
221
|
+
appReadyToRestartForUpdateMs: number;
|
|
222
|
+
/**
|
|
223
|
+
* Time between `process.getCreationTime()` and connect event received from
|
|
224
|
+
* the restarted app. It can be up to 4 minutes on Windows.
|
|
225
|
+
*/
|
|
226
|
+
appRestartedAfterUpdateMs: number;
|
|
227
|
+
/**
|
|
228
|
+
* From `process.cpuUsage()` user + system.
|
|
229
|
+
* This value measures time spent in user and system code, and may end up
|
|
230
|
+
* being greater than actual elapsed time if multiple CPU cores are
|
|
231
|
+
* performing work for this process.
|
|
232
|
+
* Under the hood, low-level calls like `getrusage` are used, so this value
|
|
233
|
+
* is calculated from the process start.
|
|
234
|
+
* It measures for the first 10-12 seconds of the app execution.
|
|
235
|
+
*/
|
|
236
|
+
cpuUsageMainProcessMs: number;
|
|
237
|
+
/**
|
|
238
|
+
* Maximum memory consumption by the main + renders + any other helper
|
|
239
|
+
* processes
|
|
240
|
+
*/
|
|
241
|
+
memoryUsageAllProcessesMb: number;
|
|
242
|
+
/**
|
|
243
|
+
* Maximum memory consumption by the main process
|
|
244
|
+
*/
|
|
245
|
+
memoryUsageMainProcessMb: number;
|
|
246
|
+
/**
|
|
247
|
+
* Maximum memory consumption by a renderer process (if started)
|
|
248
|
+
*/
|
|
249
|
+
memoryUsageRendererProcessMb?: number;
|
|
250
|
+
/**
|
|
251
|
+
* Time between `process.getCreationTime()` and `initSmokeTest()` of
|
|
252
|
+
* runtime execution
|
|
253
|
+
*/
|
|
254
|
+
runtimeLoadedMs: number;
|
|
255
|
+
/**
|
|
256
|
+
* Time between `process.getCreationTime()` and the update file downloaded
|
|
257
|
+
* from the server.
|
|
258
|
+
*/
|
|
259
|
+
updateDownloadedMs: number;
|
|
260
|
+
/**
|
|
261
|
+
* Time between `process.getCreationTime()` and the first firing of
|
|
262
|
+
* WebContents#dom-ready if any window is created
|
|
263
|
+
*/
|
|
264
|
+
webContentsDomReadyMs?: number;
|
|
265
|
+
/**
|
|
266
|
+
* Time between `process.getCreationTime()` and the first firing of
|
|
267
|
+
* WebContents#did-finish-load if any window is created
|
|
268
|
+
*/
|
|
269
|
+
webContentsFinishLoadMs?: number;
|
|
193
270
|
}
|
|
194
|
-
export
|
|
271
|
+
export type SmokeTestState = 'progress' | 'done' | 'error' | 'skipped';
|
|
195
272
|
export declare const hasBuildKickedOff: (build: Build) => boolean;
|
|
196
273
|
export declare const isPlatformBuildRunning: (platformBuild: PlatformBuild) => boolean;
|
|
197
274
|
export declare const isCiBuildRunning: (build: Build) => boolean;
|
package/lib/desktopify.js
CHANGED
|
@@ -6,13 +6,13 @@ var PlatformName;
|
|
|
6
6
|
PlatformName["linux"] = "linux";
|
|
7
7
|
PlatformName["mac"] = "mac";
|
|
8
8
|
PlatformName["windows"] = "windows";
|
|
9
|
-
})(PlatformName
|
|
9
|
+
})(PlatformName || (exports.PlatformName = PlatformName = {}));
|
|
10
10
|
var PackageManager;
|
|
11
11
|
(function (PackageManager) {
|
|
12
12
|
PackageManager["npm"] = "npm";
|
|
13
13
|
PackageManager["yarn"] = "yarn";
|
|
14
14
|
PackageManager["pnpm"] = "pnpm";
|
|
15
|
-
})(PackageManager
|
|
15
|
+
})(PackageManager || (exports.PackageManager = PackageManager = {}));
|
|
16
16
|
var BuildStatus;
|
|
17
17
|
(function (BuildStatus) {
|
|
18
18
|
BuildStatus["queued"] = "queued";
|
|
@@ -21,7 +21,7 @@ var BuildStatus;
|
|
|
21
21
|
BuildStatus["preparation"] = "preparation";
|
|
22
22
|
BuildStatus["succeeded"] = "succeeded";
|
|
23
23
|
BuildStatus["cancelled"] = "cancelled";
|
|
24
|
-
})(BuildStatus
|
|
24
|
+
})(BuildStatus || (exports.BuildStatus = BuildStatus = {}));
|
|
25
25
|
var AnalysisStatus;
|
|
26
26
|
(function (AnalysisStatus) {
|
|
27
27
|
AnalysisStatus["notStarted"] = "notStarted";
|
|
@@ -31,20 +31,21 @@ var AnalysisStatus;
|
|
|
31
31
|
AnalysisStatus["analyzing"] = "analyzing";
|
|
32
32
|
AnalysisStatus["done"] = "done";
|
|
33
33
|
AnalysisStatus["error"] = "error";
|
|
34
|
-
})(AnalysisStatus
|
|
34
|
+
})(AnalysisStatus || (exports.AnalysisStatus = AnalysisStatus = {}));
|
|
35
35
|
var ManifestCategory;
|
|
36
36
|
(function (ManifestCategory) {
|
|
37
37
|
ManifestCategory["primary"] = "primary";
|
|
38
38
|
ManifestCategory["buildStamped"] = "build-stamped";
|
|
39
39
|
ManifestCategory["versioned"] = "versioned";
|
|
40
|
-
})(ManifestCategory
|
|
41
|
-
|
|
40
|
+
})(ManifestCategory || (exports.ManifestCategory = ManifestCategory = {}));
|
|
41
|
+
const hasBuildKickedOff = (build) => {
|
|
42
42
|
if (!build) {
|
|
43
43
|
return false;
|
|
44
44
|
}
|
|
45
45
|
return build.status && build.status !== BuildStatus.preparation;
|
|
46
46
|
};
|
|
47
|
-
exports.
|
|
47
|
+
exports.hasBuildKickedOff = hasBuildKickedOff;
|
|
48
|
+
const isPlatformBuildRunning = (platformBuild) => {
|
|
48
49
|
if (!platformBuild) {
|
|
49
50
|
return false;
|
|
50
51
|
}
|
|
@@ -53,21 +54,25 @@ exports.isPlatformBuildRunning = (platformBuild) => {
|
|
|
53
54
|
('failed' !== platformBuild.status ||
|
|
54
55
|
platformBuild.numberOfAttemptedBuilds < 2));
|
|
55
56
|
};
|
|
57
|
+
exports.isPlatformBuildRunning = isPlatformBuildRunning;
|
|
56
58
|
// NOTE: this relies on Firestore solely
|
|
57
|
-
|
|
59
|
+
const isCiBuildRunning = (build) => {
|
|
58
60
|
if (!build) {
|
|
59
61
|
return false;
|
|
60
62
|
}
|
|
61
63
|
return (build.status === 'building' ||
|
|
62
64
|
(build.status === 'failed' &&
|
|
63
65
|
['linux', 'mac', 'windows'].some((platform) => build.status === 'building' ||
|
|
64
|
-
(build.status === 'failed' && exports.isPlatformBuildRunning(build[platform])))));
|
|
66
|
+
(build.status === 'failed' && (0, exports.isPlatformBuildRunning)(build[platform])))));
|
|
65
67
|
};
|
|
66
|
-
exports.
|
|
68
|
+
exports.isCiBuildRunning = isCiBuildRunning;
|
|
69
|
+
const isBuildRunning = (build) => {
|
|
67
70
|
if (!build) {
|
|
68
71
|
return false;
|
|
69
72
|
}
|
|
70
73
|
return (!['cancelled', 'succeeded'].includes(build.status) &&
|
|
71
|
-
['linux', 'mac', 'windows'].some((platform) => exports.isPlatformBuildRunning(build[platform])));
|
|
74
|
+
['linux', 'mac', 'windows'].some((platform) => (0, exports.isPlatformBuildRunning)(build[platform])));
|
|
72
75
|
};
|
|
73
|
-
exports.
|
|
76
|
+
exports.isBuildRunning = isBuildRunning;
|
|
77
|
+
const isBuildCancellable = (build) => (0, exports.hasBuildKickedOff)(build) && (0, exports.isBuildRunning)(build);
|
|
78
|
+
exports.isBuildCancellable = isBuildCancellable;
|