eas-cli 16.0.1 → 16.2.0

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.
Files changed (32) hide show
  1. package/README.md +117 -81
  2. package/build/build/android/prepareJob.js +1 -0
  3. package/build/build/ios/prepareJob.js +1 -0
  4. package/build/build/utils/url.d.ts +1 -0
  5. package/build/build/utils/url.js +5 -1
  6. package/build/commandUtils/EasCommand.js +6 -1
  7. package/build/commandUtils/builds.d.ts +1 -0
  8. package/build/commandUtils/builds.js +3 -0
  9. package/build/commandUtils/context/ServerSideEnvironmentVariablesContextField.d.ts +1 -2
  10. package/build/commands/deploy/index.js +20 -2
  11. package/build/commands/fingerprint/compare.d.ts +3 -11
  12. package/build/commands/fingerprint/compare.js +50 -15
  13. package/build/commands/fingerprint/generate.d.ts +6 -3
  14. package/build/commands/fingerprint/generate.js +50 -9
  15. package/build/commands/update/delete.js +13 -6
  16. package/build/commands/update/index.d.ts +1 -0
  17. package/build/commands/update/index.js +90 -59
  18. package/build/fingerprint/cli.js +11 -2
  19. package/build/fingerprint/utils.d.ts +3 -1
  20. package/build/fingerprint/utils.js +2 -2
  21. package/build/graphql/generated.d.ts +213 -9
  22. package/build/graphql/generated.js +15 -1
  23. package/build/graphql/queries/BackgroundJobReceiptQuery.d.ts +5 -0
  24. package/build/graphql/queries/BackgroundJobReceiptQuery.js +27 -0
  25. package/build/graphql/types/BackgroundJobReceipt.d.ts +1 -0
  26. package/build/graphql/types/BackgroundJobReceipt.js +20 -0
  27. package/build/project/publish.d.ts +17 -1
  28. package/build/project/publish.js +22 -1
  29. package/build/utils/pollForBackgroundJobReceiptAsync.d.ts +29 -0
  30. package/build/utils/pollForBackgroundJobReceiptAsync.js +92 -0
  31. package/oclif.manifest.json +49 -6
  32. package/package.json +6 -5
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BackgroundJobReceiptNode = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const graphql_tag_1 = tslib_1.__importDefault(require("graphql-tag"));
6
+ exports.BackgroundJobReceiptNode = (0, graphql_tag_1.default) `
7
+ fragment BackgroundJobReceiptData on BackgroundJobReceipt {
8
+ id
9
+ state
10
+ tries
11
+ willRetry
12
+ resultId
13
+ resultType
14
+ resultData
15
+ errorCode
16
+ errorMessage
17
+ createdAt
18
+ updatedAt
19
+ }
20
+ `;
@@ -4,7 +4,7 @@ import { Env, FingerprintSource, Platform, Workflow } from '@expo/eas-build-job'
4
4
  import Joi from 'joi';
5
5
  import { ExpoGraphqlClient } from '../commandUtils/context/contextUtils/createGraphqlClient';
6
6
  import { PaginatedQueryOptions } from '../commandUtils/pagination';
7
- import { AppPlatform, PartialManifestAsset, UpdateRolloutInfoGroup } from '../graphql/generated';
7
+ import { AppPlatform, BuildFragment, PartialManifestAsset, UpdateRolloutInfoGroup } from '../graphql/generated';
8
8
  import { RequestedPlatform } from '../platform';
9
9
  import { UpdateJsonInfo } from '../update/utils';
10
10
  import { Client } from '../vcs/vcs';
@@ -188,6 +188,22 @@ export declare function maybeCalculateFingerprintForRuntimeVersionInfoObjectsWit
188
188
  expoUpdatesRuntimeFingerprintSource: FingerprintSource | null;
189
189
  fingerprintInfoGroup: FingerprintInfoGroup;
190
190
  })[]>;
191
+ export declare function findCompatibleBuildsAsync(graphqlClient: ExpoGraphqlClient, appId: string, runtimeToPlatformsAndFingerprintInfoMapping: {
192
+ runtimeVersion: string;
193
+ platforms: UpdatePublishPlatform[];
194
+ fingerprintInfoGroup: FingerprintInfoGroup;
195
+ }): Promise<{
196
+ runtimeVersion: string;
197
+ platforms: UpdatePublishPlatform[];
198
+ fingerprintInfoGroupWithCompatibleBuilds: {
199
+ android?: (FingerprintInfo & {
200
+ build?: BuildFragment;
201
+ }) | undefined;
202
+ ios?: (FingerprintInfo & {
203
+ build?: BuildFragment;
204
+ }) | undefined;
205
+ };
206
+ }>;
191
207
  export declare const platformDisplayNames: Record<UpdatePublishPlatform, string>;
192
208
  export declare const updatePublishPlatformToAppPlatform: Record<UpdatePublishPlatform, AppPlatform>;
193
209
  export declare function getRuntimeToUpdateRolloutInfoGroupMappingAsync(graphqlClient: ExpoGraphqlClient, { appId, branchName, rolloutPercentage, runtimeToPlatformsAndFingerprintInfoMapping, }: {
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getRuntimeToUpdateRolloutInfoGroupMappingAsync = exports.updatePublishPlatformToAppPlatform = exports.platformDisplayNames = exports.maybeCalculateFingerprintForRuntimeVersionInfoObjectsWithoutExpoUpdatesAsync = exports.getRuntimeToPlatformsAndFingerprintInfoMappingFromRuntimeVersionInfoObjects = exports.getRuntimeVersionInfoObjectsAsync = exports.defaultPublishPlatforms = exports.getUpdateMessageForCommandAsync = exports.getBranchNameForCommandAsync = exports.isUploadedAssetCountAboveWarningThreshold = exports.uploadAssetsAsync = exports.filterOutAssetsThatAlreadyExistAsync = exports.collectAssetsAsync = exports.getOriginalPathFromAssetMap = exports.getAssetHashFromPath = exports.loadAssetMapAsync = exports.filterCollectedAssetsByRequestedPlatforms = exports.generateEasMetadataAsync = exports.loadMetadata = exports.resolveInputDirectoryAsync = exports.buildBundlesAsync = exports.buildUnsortedUpdateInfoGroupAsync = exports.convertAssetToUpdateInfoGroupFormatAsync = exports.getStorageKeyForAssetAsync = exports.getStorageKey = exports.getBase64URLEncoding = exports.guessContentTypeFromExtension = exports.MetadataJoi = void 0;
3
+ exports.getRuntimeToUpdateRolloutInfoGroupMappingAsync = exports.updatePublishPlatformToAppPlatform = exports.platformDisplayNames = exports.findCompatibleBuildsAsync = exports.maybeCalculateFingerprintForRuntimeVersionInfoObjectsWithoutExpoUpdatesAsync = exports.getRuntimeToPlatformsAndFingerprintInfoMappingFromRuntimeVersionInfoObjects = exports.getRuntimeVersionInfoObjectsAsync = exports.defaultPublishPlatforms = exports.getUpdateMessageForCommandAsync = exports.getBranchNameForCommandAsync = exports.isUploadedAssetCountAboveWarningThreshold = exports.uploadAssetsAsync = exports.filterOutAssetsThatAlreadyExistAsync = exports.collectAssetsAsync = exports.getOriginalPathFromAssetMap = exports.getAssetHashFromPath = exports.loadAssetMapAsync = exports.filterCollectedAssetsByRequestedPlatforms = exports.generateEasMetadataAsync = exports.loadMetadata = exports.resolveInputDirectoryAsync = exports.buildBundlesAsync = exports.buildUnsortedUpdateInfoGroupAsync = exports.convertAssetToUpdateInfoGroupFormatAsync = exports.getStorageKeyForAssetAsync = exports.getStorageKey = exports.getBase64URLEncoding = exports.guessContentTypeFromExtension = exports.MetadataJoi = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const config_plugins_1 = require("@expo/config-plugins");
6
6
  const eas_build_job_1 = require("@expo/eas-build-job");
@@ -19,6 +19,7 @@ const projectUtils_1 = require("./projectUtils");
19
19
  const resolveRuntimeVersionAsync_1 = require("./resolveRuntimeVersionAsync");
20
20
  const queries_1 = require("../branch/queries");
21
21
  const utils_1 = require("../branch/utils");
22
+ const builds_1 = require("../commandUtils/builds");
22
23
  const cli_1 = require("../fingerprint/cli");
23
24
  const generated_1 = require("../graphql/generated");
24
25
  const PublishMutation_1 = require("../graphql/mutations/PublishMutation");
@@ -601,6 +602,26 @@ async function maybeCalculateFingerprintForRuntimeVersionInfoObjectsWithoutExpoU
601
602
  return [...runtimesWithComputedFingerprint, ...runtimesWithPreviouslyComputedFingerprints];
602
603
  }
603
604
  exports.maybeCalculateFingerprintForRuntimeVersionInfoObjectsWithoutExpoUpdatesAsync = maybeCalculateFingerprintForRuntimeVersionInfoObjectsWithoutExpoUpdatesAsync;
605
+ async function findCompatibleBuildsAsync(graphqlClient, appId, runtimeToPlatformsAndFingerprintInfoMapping) {
606
+ const { fingerprintInfoGroup } = runtimeToPlatformsAndFingerprintInfoMapping;
607
+ const entriesPromises = Object.entries(fingerprintInfoGroup).map(async ([platform, fingerprintInfo]) => {
608
+ const build = (await (0, builds_1.fetchBuildsAsync)({
609
+ graphqlClient,
610
+ projectId: appId,
611
+ filters: {
612
+ fingerprintHash: fingerprintInfo.fingerprintHash,
613
+ },
614
+ }))[0];
615
+ return [platform, { ...fingerprintInfo, build }];
616
+ });
617
+ const entries = await Promise.all(entriesPromises);
618
+ const fingerprintInfoGroupWithCompatibleBuilds = Object.fromEntries(entries);
619
+ return {
620
+ ...runtimeToPlatformsAndFingerprintInfoMapping,
621
+ fingerprintInfoGroupWithCompatibleBuilds,
622
+ };
623
+ }
624
+ exports.findCompatibleBuildsAsync = findCompatibleBuildsAsync;
604
625
  exports.platformDisplayNames = {
605
626
  android: 'Android',
606
627
  ios: 'iOS',
@@ -0,0 +1,29 @@
1
+ import { CombinedError } from '@urql/core';
2
+ import { ExpoGraphqlClient } from '../commandUtils/context/contextUtils/createGraphqlClient';
3
+ import { BackgroundJobReceiptDataFragment } from '../graphql/generated';
4
+ export declare enum BackgroundJobReceiptPollErrorType {
5
+ NULL_RECEIPT = 0,
6
+ JOB_FAILED_NO_WILL_RETRY = 1,
7
+ TIMEOUT = 2
8
+ }
9
+ export type BackgroundJobReceiptPollErrorData = {
10
+ errorType: BackgroundJobReceiptPollErrorType.NULL_RECEIPT;
11
+ } | {
12
+ errorType: BackgroundJobReceiptPollErrorType.JOB_FAILED_NO_WILL_RETRY;
13
+ receiptErrorMessage: string | undefined | null;
14
+ } | {
15
+ errorType: BackgroundJobReceiptPollErrorType.TIMEOUT;
16
+ };
17
+ export declare class BackgroundJobReceiptPollError extends Error {
18
+ readonly errorData: BackgroundJobReceiptPollErrorData;
19
+ constructor(errorData: BackgroundJobReceiptPollErrorData);
20
+ static createErrorMessage(errorData: BackgroundJobReceiptPollErrorData): string;
21
+ }
22
+ export type BackgroundJobPollErrorCondition = (error: CombinedError) => {
23
+ errorIndicatesSuccess: boolean;
24
+ };
25
+ export declare function pollForBackgroundJobReceiptAsync(graphqlClient: ExpoGraphqlClient, backgroundJobReceipt: BackgroundJobReceiptDataFragment): Promise<BackgroundJobReceiptDataFragment>;
26
+ export declare function pollForBackgroundJobReceiptAsync(graphqlClient: ExpoGraphqlClient, backgroundJobReceipt: BackgroundJobReceiptDataFragment, options?: {
27
+ onBackgroundJobReceiptPollError?: BackgroundJobPollErrorCondition;
28
+ pollInterval?: number;
29
+ }): Promise<BackgroundJobReceiptDataFragment | null>;
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pollForBackgroundJobReceiptAsync = exports.BackgroundJobReceiptPollError = exports.BackgroundJobReceiptPollErrorType = void 0;
4
+ const core_1 = require("@urql/core");
5
+ const set_interval_async_1 = require("set-interval-async");
6
+ const generated_1 = require("../graphql/generated");
7
+ const BackgroundJobReceiptQuery_1 = require("../graphql/queries/BackgroundJobReceiptQuery");
8
+ var BackgroundJobReceiptPollErrorType;
9
+ (function (BackgroundJobReceiptPollErrorType) {
10
+ BackgroundJobReceiptPollErrorType[BackgroundJobReceiptPollErrorType["NULL_RECEIPT"] = 0] = "NULL_RECEIPT";
11
+ BackgroundJobReceiptPollErrorType[BackgroundJobReceiptPollErrorType["JOB_FAILED_NO_WILL_RETRY"] = 1] = "JOB_FAILED_NO_WILL_RETRY";
12
+ BackgroundJobReceiptPollErrorType[BackgroundJobReceiptPollErrorType["TIMEOUT"] = 2] = "TIMEOUT";
13
+ })(BackgroundJobReceiptPollErrorType || (exports.BackgroundJobReceiptPollErrorType = BackgroundJobReceiptPollErrorType = {}));
14
+ class BackgroundJobReceiptPollError extends Error {
15
+ errorData;
16
+ constructor(errorData) {
17
+ super(BackgroundJobReceiptPollError.createErrorMessage(errorData));
18
+ this.errorData = errorData;
19
+ }
20
+ static createErrorMessage(errorData) {
21
+ switch (errorData.errorType) {
22
+ case BackgroundJobReceiptPollErrorType.NULL_RECEIPT:
23
+ return 'Background job receipt was null.';
24
+ case BackgroundJobReceiptPollErrorType.JOB_FAILED_NO_WILL_RETRY:
25
+ return `Background job failed with error: ${errorData.receiptErrorMessage}`;
26
+ case BackgroundJobReceiptPollErrorType.TIMEOUT:
27
+ return 'Background job timed out.';
28
+ }
29
+ }
30
+ }
31
+ exports.BackgroundJobReceiptPollError = BackgroundJobReceiptPollError;
32
+ async function fetchBackgroundJobReceiptAsync(graphqlClient, receiptId) {
33
+ try {
34
+ return [await BackgroundJobReceiptQuery_1.BackgroundJobReceiptQuery.byIdAsync(graphqlClient, receiptId), null];
35
+ }
36
+ catch (error) {
37
+ if (error instanceof core_1.CombinedError) {
38
+ return [null, error];
39
+ }
40
+ throw error;
41
+ }
42
+ }
43
+ async function pollForBackgroundJobReceiptAsync(graphqlClient, backgroundJobReceipt, options) {
44
+ return await new Promise((resolve, reject) => {
45
+ let numChecks = 0;
46
+ const intervalHandle = (0, set_interval_async_1.setIntervalAsync)(async function pollForDeletionFinishedAsync() {
47
+ function failBackgroundDeletion(error) {
48
+ void (0, set_interval_async_1.clearIntervalAsync)(intervalHandle);
49
+ reject(error);
50
+ }
51
+ const [receipt, error] = await fetchBackgroundJobReceiptAsync(graphqlClient, backgroundJobReceipt.id);
52
+ if (!receipt) {
53
+ if (error instanceof core_1.CombinedError) {
54
+ const errorResult = options?.onBackgroundJobReceiptPollError?.(error);
55
+ if (errorResult?.errorIndicatesSuccess) {
56
+ void (0, set_interval_async_1.clearIntervalAsync)(intervalHandle);
57
+ resolve(null);
58
+ return;
59
+ }
60
+ }
61
+ failBackgroundDeletion(new BackgroundJobReceiptPollError({
62
+ errorType: BackgroundJobReceiptPollErrorType.NULL_RECEIPT,
63
+ }));
64
+ return;
65
+ }
66
+ // job failed and will not retry
67
+ if (receipt.state === generated_1.BackgroundJobState.Failure && !receipt.willRetry) {
68
+ failBackgroundDeletion(new BackgroundJobReceiptPollError({
69
+ errorType: BackgroundJobReceiptPollErrorType.JOB_FAILED_NO_WILL_RETRY,
70
+ receiptErrorMessage: receipt.errorMessage,
71
+ }));
72
+ return;
73
+ }
74
+ // all else fails, stop polling after 90 checks. This should only happen if there's an
75
+ // issue with receipts not setting `willRetry` to false when they fail within a reasonable
76
+ // amount of time.
77
+ if (numChecks > 90) {
78
+ failBackgroundDeletion(new BackgroundJobReceiptPollError({
79
+ errorType: BackgroundJobReceiptPollErrorType.TIMEOUT,
80
+ }));
81
+ return;
82
+ }
83
+ if (receipt.state === generated_1.BackgroundJobState.Success) {
84
+ void (0, set_interval_async_1.clearIntervalAsync)(intervalHandle);
85
+ resolve(receipt);
86
+ return;
87
+ }
88
+ numChecks++;
89
+ }, options?.pollInterval ?? 1000);
90
+ });
91
+ }
92
+ exports.pollForBackgroundJobReceiptAsync = pollForBackgroundJobReceiptAsync;
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "16.0.1",
2
+ "version": "16.2.0",
3
3
  "commands": {
4
4
  "analytics": {
5
5
  "id": "analytics",
@@ -2781,6 +2781,7 @@
2781
2781
  "$ eas fingerprint:compare <FINGERPRINT-HASH> \t # Compare fingerprint against local directory",
2782
2782
  "$ eas fingerprint:compare <FINGERPRINT-HASH-1> <FINGERPRINT-HASH-2> \t # Compare provided fingerprints",
2783
2783
  "$ eas fingerprint:compare --build-id <BUILD-ID> \t # Compare fingerprint from build against local directory",
2784
+ "$ eas fingerprint:compare --build-id <BUILD-ID> --environment production \t # Compare fingerprint from build against local directory with the \"production\" environment",
2784
2785
  "$ eas fingerprint:compare --build-id <BUILD-ID-1> --build-id <BUILD-ID-2>\t # Compare fingerprint from a build against another build",
2785
2786
  "$ eas fingerprint:compare --build-id <BUILD-ID> --update-id <UPDATE-ID>\t # Compare fingerprint from build against fingerprint from update",
2786
2787
  "$ eas fingerprint:compare <FINGERPRINT-HASH> --update-id <UPDATE-ID> \t # Compare fingerprint from update against provided fingerprint"
@@ -2810,6 +2811,18 @@
2810
2811
  "description": "Open the fingerprint comparison in the browser",
2811
2812
  "allowNo": false
2812
2813
  },
2814
+ "environment": {
2815
+ "name": "environment",
2816
+ "type": "option",
2817
+ "description": "If generating a fingerprint from the local directory, use the specified environment.",
2818
+ "helpValue": "(development|preview|production)",
2819
+ "multiple": false,
2820
+ "options": [
2821
+ "development",
2822
+ "preview",
2823
+ "production"
2824
+ ]
2825
+ },
2813
2826
  "json": {
2814
2827
  "name": "json",
2815
2828
  "type": "boolean",
@@ -2842,7 +2855,8 @@
2842
2855
  "projectId": {},
2843
2856
  "loggedIn": {},
2844
2857
  "privateProjectConfig": {},
2845
- "vcsClient": {}
2858
+ "vcsClient": {},
2859
+ "getServerSideEnvironmentVariablesAsync": {}
2846
2860
  }
2847
2861
  },
2848
2862
  "fingerprint:generate": {
@@ -2852,11 +2866,12 @@
2852
2866
  "pluginName": "eas-cli",
2853
2867
  "pluginAlias": "eas-cli",
2854
2868
  "pluginType": "core",
2855
- "hidden": true,
2856
2869
  "aliases": [],
2857
2870
  "examples": [
2858
- "$ eas fingerprint:generate",
2859
- "$ eas fingerprint:generate --json --non-interactive -p android"
2871
+ "$ eas fingerprint:generate \t # Generate fingerprint in interactive mode",
2872
+ "$ eas fingerprint:generate --build-profile preview \t # Generate a fingerprint using the \"preview\" build profile",
2873
+ "$ eas fingerprint:generate --environment preview \t # Generate a fingerprint using the \"preview\" environment",
2874
+ "$ eas fingerprint:generate --json --non-interactive --platform android \t # Output fingerprint json to stdout"
2860
2875
  ],
2861
2876
  "flags": {
2862
2877
  "platform": {
@@ -2870,6 +2885,31 @@
2870
2885
  "ios"
2871
2886
  ]
2872
2887
  },
2888
+ "environment": {
2889
+ "name": "environment",
2890
+ "type": "option",
2891
+ "description": "Environment variable's environment",
2892
+ "helpValue": "(development|preview|production)",
2893
+ "multiple": false,
2894
+ "options": [
2895
+ "development",
2896
+ "preview",
2897
+ "production"
2898
+ ],
2899
+ "exclusive": [
2900
+ "build-profile"
2901
+ ]
2902
+ },
2903
+ "build-profile": {
2904
+ "name": "build-profile",
2905
+ "type": "option",
2906
+ "char": "e",
2907
+ "description": "Name of the build profile from eas.json.",
2908
+ "multiple": false,
2909
+ "exclusive": [
2910
+ "environment"
2911
+ ]
2912
+ },
2873
2913
  "json": {
2874
2914
  "name": "json",
2875
2915
  "type": "boolean",
@@ -2891,7 +2931,10 @@
2891
2931
  "projectId": {},
2892
2932
  "loggedIn": {},
2893
2933
  "privateProjectConfig": {},
2894
- "vcsClient": {}
2934
+ "vcsClient": {},
2935
+ "getServerSideEnvironmentVariablesAsync": {},
2936
+ "getDynamicPublicProjectConfigAsync": {},
2937
+ "getDynamicPrivateProjectConfigAsync": {}
2895
2938
  }
2896
2939
  },
2897
2940
  "metadata:lint": {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "eas-cli",
3
3
  "description": "EAS command line tool",
4
- "version": "16.0.1",
4
+ "version": "16.2.0",
5
5
  "author": "Expo <support@expo.dev>",
6
6
  "bin": {
7
7
  "eas": "./bin/run"
@@ -12,8 +12,8 @@
12
12
  "@expo/code-signing-certificates": "0.0.5",
13
13
  "@expo/config": "10.0.6",
14
14
  "@expo/config-plugins": "9.0.12",
15
- "@expo/eas-build-job": "1.0.170",
16
- "@expo/eas-json": "16.0.0",
15
+ "@expo/eas-build-job": "1.0.173",
16
+ "@expo/eas-json": "16.1.0",
17
17
  "@expo/env": "^1.0.0",
18
18
  "@expo/json-file": "8.3.3",
19
19
  "@expo/logger": "1.0.117",
@@ -28,7 +28,7 @@
28
28
  "@expo/results": "1.0.0",
29
29
  "@expo/rudder-sdk-node": "1.1.1",
30
30
  "@expo/spawn-async": "1.7.2",
31
- "@expo/steps": "1.0.170",
31
+ "@expo/steps": "1.0.173",
32
32
  "@expo/timeago.js": "1.0.0",
33
33
  "@oclif/core": "^1.26.2",
34
34
  "@oclif/plugin-autocomplete": "^2.3.10",
@@ -78,6 +78,7 @@
78
78
  "qrcode-terminal": "0.12.0",
79
79
  "resolve-from": "5.0.0",
80
80
  "semver": "7.5.4",
81
+ "set-interval-async": "3.0.3",
81
82
  "slash": "3.0.0",
82
83
  "tar": "6.2.1",
83
84
  "tar-stream": "3.1.7",
@@ -237,5 +238,5 @@
237
238
  "node": "20.11.0",
238
239
  "yarn": "1.22.21"
239
240
  },
240
- "gitHead": "6bb3dd94f754dd08f66eab81af76c76a4f007da7"
241
+ "gitHead": "439d45d6e1f60be1e215627fdad91dba5c5d74a4"
241
242
  }