@lwrjs/diagnostics 0.9.0-alpha.1 → 0.9.0-alpha.10
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/build/cjs/descriptions/server.cjs +4 -0
- package/build/cjs/descriptions/unresolvable.cjs +21 -1
- package/build/cjs/errors.cjs +3 -31
- package/build/es/categories.d.ts +2 -2
- package/build/es/descriptions/index.d.ts +42 -0
- package/build/es/descriptions/server.d.ts +7 -0
- package/build/es/descriptions/server.js +4 -0
- package/build/es/descriptions/unresolvable.d.ts +35 -0
- package/build/es/descriptions/unresolvable.js +21 -1
- package/build/es/errors.d.ts +2 -10
- package/build/es/errors.js +2 -24
- package/package.json +3 -3
|
@@ -31,5 +31,9 @@ var server = (0, import_core_diagnostics.createDiagnosticsCategory)({
|
|
|
31
31
|
WARMUP_ERROR: (error) => ({
|
|
32
32
|
category: "lwrServer/warmupError",
|
|
33
33
|
message: `An error occurred during warmup: ${error}`
|
|
34
|
+
}),
|
|
35
|
+
INVALID_MODE: (mode) => ({
|
|
36
|
+
category: "lwrServer/invalidMode",
|
|
37
|
+
message: `No configuration found for server mode - ${mode}`
|
|
34
38
|
})
|
|
35
39
|
});
|
|
@@ -56,14 +56,34 @@ var unresolvable = (0, import_core_diagnostics.createDiagnosticsCategory)({
|
|
|
56
56
|
category: "lwrUnresolvable/resource",
|
|
57
57
|
message: `404: Could not find resource with specifier "${resourceSpecifier}"`
|
|
58
58
|
}),
|
|
59
|
+
VIEW: (viewPath) => ({
|
|
60
|
+
category: "lwrUnresolvable/view",
|
|
61
|
+
message: `404: Could not find view at "${viewPath}"`
|
|
62
|
+
}),
|
|
63
|
+
VIEW_CONFIG: (configPath) => ({
|
|
64
|
+
category: "lwrUnresolvable/view",
|
|
65
|
+
message: `404: LWR configuration for viewPath "${configPath}" is not available`
|
|
66
|
+
}),
|
|
67
|
+
APP_CONFIG: (appId) => ({
|
|
68
|
+
category: "lwrUnresolvable/view",
|
|
69
|
+
message: `404: LWR configuration for appId "${appId}" is not available`
|
|
70
|
+
}),
|
|
59
71
|
SERVER_ERROR: (name) => ({
|
|
60
72
|
category: "lwrUnresolvable/fatal",
|
|
61
|
-
message: `500: Unexpected error fetching ${name}`
|
|
73
|
+
message: `500: Unexpected error fetching "${name}"`
|
|
62
74
|
}),
|
|
63
75
|
INVALID_JSON: () => ({
|
|
64
76
|
category: "lwrUnresolvable/invalid",
|
|
65
77
|
message: "400: Accept header and json query parameter are incompatible"
|
|
66
78
|
}),
|
|
79
|
+
INVALID_ENVIRONMENT: (environment) => ({
|
|
80
|
+
category: "lwrUnresolvable/invalid",
|
|
81
|
+
message: `400: Environment "${environment}" is not supported`
|
|
82
|
+
}),
|
|
83
|
+
INVALID_SPECIFIER: (specifier) => ({
|
|
84
|
+
category: "lwrUnresolvable/invalid",
|
|
85
|
+
message: `400: Unable to resolve specifier "${specifier}" because it contains path traversal`
|
|
86
|
+
}),
|
|
67
87
|
LABEL_MODULE: (file, error) => ({
|
|
68
88
|
category: "lwrUnresolvable/label",
|
|
69
89
|
message: `Invalid JSON: Labels file ${file} must be a JSON object with string values or nested string values
|
package/build/cjs/errors.cjs
CHANGED
|
@@ -1,38 +1,21 @@
|
|
|
1
|
-
var __create = Object.create;
|
|
2
1
|
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
4
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
7
2
|
var __markAsModule = (target) => __defProp(target, "__esModule", {value: true});
|
|
8
3
|
var __export = (target, all) => {
|
|
9
4
|
for (var name in all)
|
|
10
5
|
__defProp(target, name, {get: all[name], enumerable: true});
|
|
11
6
|
};
|
|
12
|
-
var __exportStar = (target, module2, desc) => {
|
|
13
|
-
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
|
|
14
|
-
for (let key of __getOwnPropNames(module2))
|
|
15
|
-
if (!__hasOwnProp.call(target, key) && key !== "default")
|
|
16
|
-
__defProp(target, key, {get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable});
|
|
17
|
-
}
|
|
18
|
-
return target;
|
|
19
|
-
};
|
|
20
|
-
var __toModule = (module2) => {
|
|
21
|
-
return __exportStar(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? {get: () => module2.default, enumerable: true} : {value: module2, enumerable: true})), module2);
|
|
22
|
-
};
|
|
23
7
|
|
|
24
8
|
// packages/@lwrjs/diagnostics/src/errors.ts
|
|
25
9
|
__markAsModule(exports);
|
|
26
10
|
__export(exports, {
|
|
27
11
|
DiagnosticsError: () => DiagnosticsError,
|
|
28
12
|
LwrConfigValidationError: () => LwrConfigValidationError,
|
|
13
|
+
LwrInvalidServerModeError: () => LwrInvalidServerModeError,
|
|
29
14
|
LwrServerError: () => LwrServerError,
|
|
30
15
|
LwrUnresolvableError: () => LwrUnresolvableError,
|
|
31
|
-
createReturnStatus: () => createReturnStatus,
|
|
32
16
|
createSingleDiagnosticError: () => createSingleDiagnosticError,
|
|
33
17
|
isNodeError: () => isNodeError
|
|
34
18
|
});
|
|
35
|
-
var import_descriptions = __toModule(require("./descriptions/index.cjs"));
|
|
36
19
|
function isNodeError(error) {
|
|
37
20
|
return error instanceof Error;
|
|
38
21
|
}
|
|
@@ -58,22 +41,11 @@ var DiagnosticsError = class extends Error {
|
|
|
58
41
|
return message;
|
|
59
42
|
}
|
|
60
43
|
};
|
|
44
|
+
var LwrInvalidServerModeError = class extends DiagnosticsError {
|
|
45
|
+
};
|
|
61
46
|
var LwrConfigValidationError = class extends DiagnosticsError {
|
|
62
47
|
};
|
|
63
48
|
var LwrUnresolvableError = class extends DiagnosticsError {
|
|
64
49
|
};
|
|
65
50
|
var LwrServerError = class extends DiagnosticsError {
|
|
66
51
|
};
|
|
67
|
-
function createReturnStatus(name, error) {
|
|
68
|
-
let returnStatus = {status: 501, message: ""};
|
|
69
|
-
if (isNodeError(error) && error.code === "NO_LWC_MODULE_FOUND") {
|
|
70
|
-
returnStatus = {status: 404, message: import_descriptions.descriptions.UNRESOLVABLE.LWC_MODULE(name).message};
|
|
71
|
-
} else if (error instanceof LwrUnresolvableError && error.diagnostics[0].description.category === "lwrUnresolvable/invalid") {
|
|
72
|
-
returnStatus = {status: 400, message: error.message};
|
|
73
|
-
} else if (error instanceof LwrUnresolvableError) {
|
|
74
|
-
returnStatus = {status: 404, message: error.message};
|
|
75
|
-
} else {
|
|
76
|
-
returnStatus = {status: 500, message: import_descriptions.descriptions.UNRESOLVABLE.SERVER_ERROR(name).message};
|
|
77
|
-
}
|
|
78
|
-
return returnStatus;
|
|
79
|
-
}
|
package/build/es/categories.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export declare type DiagnosticCategory = DiagnosticLwrConfigCategory | DiagnosticCompiler | DiagnosticLwrUnresolvableCategory | DiagnosticLwrServer | '...more here';
|
|
2
2
|
export declare type DiagnosticLwrConfigCategory = 'lwrConfig/invalidJson' | 'lwrConfig/invalidSchema';
|
|
3
|
-
export declare type DiagnosticLwrUnresolvableCategory = 'lwrUnresolvable/asset' | 'lwrUnresolvable/module' | 'lwrUnresolvable/label' | 'lwrUnresolvable/routes' | 'lwrUnresolvable/resource' | 'lwrUnresolvable/invalid' | 'lwrUnresolvable/fatal';
|
|
3
|
+
export declare type DiagnosticLwrUnresolvableCategory = 'lwrUnresolvable/asset' | 'lwrUnresolvable/module' | 'lwrUnresolvable/label' | 'lwrUnresolvable/routes' | 'lwrUnresolvable/resource' | 'lwrUnresolvable/view' | 'lwrUnresolvable/invalid' | 'lwrUnresolvable/fatal';
|
|
4
4
|
export declare type DiagnosticCompiler = 'compile/umd_transform';
|
|
5
|
-
export declare type DiagnosticLwrServer = 'lwrServer/warmupError'
|
|
5
|
+
export declare type DiagnosticLwrServer = 'lwrServer/warmupError' | `lwrServer/invalidMode`;
|
|
6
6
|
//# sourceMappingURL=categories.d.ts.map
|
|
@@ -214,6 +214,27 @@ export declare const descriptions: {
|
|
|
214
214
|
advice: import("../types.js").DiagnosticAdvice;
|
|
215
215
|
message: string;
|
|
216
216
|
};
|
|
217
|
+
VIEW: (viewPath: string) => Omit<{
|
|
218
|
+
category: "lwrUnresolvable/view";
|
|
219
|
+
message: string;
|
|
220
|
+
}, "message" | "advice"> & {
|
|
221
|
+
advice: import("../types.js").DiagnosticAdvice;
|
|
222
|
+
message: string;
|
|
223
|
+
};
|
|
224
|
+
VIEW_CONFIG: (configPath: string) => Omit<{
|
|
225
|
+
category: "lwrUnresolvable/view";
|
|
226
|
+
message: string;
|
|
227
|
+
}, "message" | "advice"> & {
|
|
228
|
+
advice: import("../types.js").DiagnosticAdvice;
|
|
229
|
+
message: string;
|
|
230
|
+
};
|
|
231
|
+
APP_CONFIG: (appId: string) => Omit<{
|
|
232
|
+
category: "lwrUnresolvable/view";
|
|
233
|
+
message: string;
|
|
234
|
+
}, "message" | "advice"> & {
|
|
235
|
+
advice: import("../types.js").DiagnosticAdvice;
|
|
236
|
+
message: string;
|
|
237
|
+
};
|
|
217
238
|
SERVER_ERROR: (name: string) => Omit<{
|
|
218
239
|
category: "lwrUnresolvable/fatal";
|
|
219
240
|
message: string;
|
|
@@ -228,6 +249,20 @@ export declare const descriptions: {
|
|
|
228
249
|
advice: import("../types.js").DiagnosticAdvice;
|
|
229
250
|
message: string;
|
|
230
251
|
};
|
|
252
|
+
INVALID_ENVIRONMENT: (environment: string) => Omit<{
|
|
253
|
+
category: "lwrUnresolvable/invalid";
|
|
254
|
+
message: string;
|
|
255
|
+
}, "message" | "advice"> & {
|
|
256
|
+
advice: import("../types.js").DiagnosticAdvice;
|
|
257
|
+
message: string;
|
|
258
|
+
};
|
|
259
|
+
INVALID_SPECIFIER: (specifier: string) => Omit<{
|
|
260
|
+
category: "lwrUnresolvable/invalid";
|
|
261
|
+
message: string;
|
|
262
|
+
}, "message" | "advice"> & {
|
|
263
|
+
advice: import("../types.js").DiagnosticAdvice;
|
|
264
|
+
message: string;
|
|
265
|
+
};
|
|
231
266
|
LABEL_MODULE: (file: string, error: string) => Omit<{
|
|
232
267
|
category: "lwrUnresolvable/label";
|
|
233
268
|
message: string;
|
|
@@ -251,6 +286,13 @@ export declare const descriptions: {
|
|
|
251
286
|
advice: import("../types.js").DiagnosticAdvice;
|
|
252
287
|
message: string;
|
|
253
288
|
};
|
|
289
|
+
INVALID_MODE: (mode: string) => Omit<{
|
|
290
|
+
category: "lwrServer/invalidMode";
|
|
291
|
+
message: string;
|
|
292
|
+
}, "message" | "advice"> & {
|
|
293
|
+
advice: import("../types.js").DiagnosticAdvice;
|
|
294
|
+
message: string;
|
|
295
|
+
};
|
|
254
296
|
};
|
|
255
297
|
};
|
|
256
298
|
export * from './core-diagnostics.js';
|
|
@@ -6,5 +6,12 @@ export declare const server: {
|
|
|
6
6
|
advice: import("../types.js").DiagnosticAdvice;
|
|
7
7
|
message: string;
|
|
8
8
|
};
|
|
9
|
+
INVALID_MODE: (mode: string) => Omit<{
|
|
10
|
+
category: "lwrServer/invalidMode";
|
|
11
|
+
message: string;
|
|
12
|
+
}, "message" | "advice"> & {
|
|
13
|
+
advice: import("../types.js").DiagnosticAdvice;
|
|
14
|
+
message: string;
|
|
15
|
+
};
|
|
9
16
|
};
|
|
10
17
|
//# sourceMappingURL=server.d.ts.map
|
|
@@ -4,5 +4,9 @@ export const server = createDiagnosticsCategory({
|
|
|
4
4
|
category: 'lwrServer/warmupError',
|
|
5
5
|
message: `An error occurred during warmup: ${error}`,
|
|
6
6
|
}),
|
|
7
|
+
INVALID_MODE: (mode) => ({
|
|
8
|
+
category: 'lwrServer/invalidMode',
|
|
9
|
+
message: `No configuration found for server mode - ${mode}`,
|
|
10
|
+
}),
|
|
7
11
|
});
|
|
8
12
|
//# sourceMappingURL=server.js.map
|
|
@@ -48,6 +48,27 @@ export declare const unresolvable: {
|
|
|
48
48
|
advice: import("../types.js").DiagnosticAdvice;
|
|
49
49
|
message: string;
|
|
50
50
|
};
|
|
51
|
+
VIEW: (viewPath: string) => Omit<{
|
|
52
|
+
category: "lwrUnresolvable/view";
|
|
53
|
+
message: string;
|
|
54
|
+
}, "message" | "advice"> & {
|
|
55
|
+
advice: import("../types.js").DiagnosticAdvice;
|
|
56
|
+
message: string;
|
|
57
|
+
};
|
|
58
|
+
VIEW_CONFIG: (configPath: string) => Omit<{
|
|
59
|
+
category: "lwrUnresolvable/view";
|
|
60
|
+
message: string;
|
|
61
|
+
}, "message" | "advice"> & {
|
|
62
|
+
advice: import("../types.js").DiagnosticAdvice;
|
|
63
|
+
message: string;
|
|
64
|
+
};
|
|
65
|
+
APP_CONFIG: (appId: string) => Omit<{
|
|
66
|
+
category: "lwrUnresolvable/view";
|
|
67
|
+
message: string;
|
|
68
|
+
}, "message" | "advice"> & {
|
|
69
|
+
advice: import("../types.js").DiagnosticAdvice;
|
|
70
|
+
message: string;
|
|
71
|
+
};
|
|
51
72
|
SERVER_ERROR: (name: string) => Omit<{
|
|
52
73
|
category: "lwrUnresolvable/fatal";
|
|
53
74
|
message: string;
|
|
@@ -62,6 +83,20 @@ export declare const unresolvable: {
|
|
|
62
83
|
advice: import("../types.js").DiagnosticAdvice;
|
|
63
84
|
message: string;
|
|
64
85
|
};
|
|
86
|
+
INVALID_ENVIRONMENT: (environment: string) => Omit<{
|
|
87
|
+
category: "lwrUnresolvable/invalid";
|
|
88
|
+
message: string;
|
|
89
|
+
}, "message" | "advice"> & {
|
|
90
|
+
advice: import("../types.js").DiagnosticAdvice;
|
|
91
|
+
message: string;
|
|
92
|
+
};
|
|
93
|
+
INVALID_SPECIFIER: (specifier: string) => Omit<{
|
|
94
|
+
category: "lwrUnresolvable/invalid";
|
|
95
|
+
message: string;
|
|
96
|
+
}, "message" | "advice"> & {
|
|
97
|
+
advice: import("../types.js").DiagnosticAdvice;
|
|
98
|
+
message: string;
|
|
99
|
+
};
|
|
65
100
|
LABEL_MODULE: (file: string, error: string) => Omit<{
|
|
66
101
|
category: "lwrUnresolvable/label";
|
|
67
102
|
message: string;
|
|
@@ -28,14 +28,34 @@ export const unresolvable = createDiagnosticsCategory({
|
|
|
28
28
|
category: 'lwrUnresolvable/resource',
|
|
29
29
|
message: `404: Could not find resource with specifier "${resourceSpecifier}"`,
|
|
30
30
|
}),
|
|
31
|
+
VIEW: (viewPath) => ({
|
|
32
|
+
category: 'lwrUnresolvable/view',
|
|
33
|
+
message: `404: Could not find view at "${viewPath}"`,
|
|
34
|
+
}),
|
|
35
|
+
VIEW_CONFIG: (configPath) => ({
|
|
36
|
+
category: 'lwrUnresolvable/view',
|
|
37
|
+
message: `404: LWR configuration for viewPath "${configPath}" is not available`,
|
|
38
|
+
}),
|
|
39
|
+
APP_CONFIG: (appId) => ({
|
|
40
|
+
category: 'lwrUnresolvable/view',
|
|
41
|
+
message: `404: LWR configuration for appId "${appId}" is not available`,
|
|
42
|
+
}),
|
|
31
43
|
SERVER_ERROR: (name) => ({
|
|
32
44
|
category: 'lwrUnresolvable/fatal',
|
|
33
|
-
message: `500: Unexpected error fetching ${name}`,
|
|
45
|
+
message: `500: Unexpected error fetching "${name}"`,
|
|
34
46
|
}),
|
|
35
47
|
INVALID_JSON: () => ({
|
|
36
48
|
category: 'lwrUnresolvable/invalid',
|
|
37
49
|
message: '400: Accept header and json query parameter are incompatible',
|
|
38
50
|
}),
|
|
51
|
+
INVALID_ENVIRONMENT: (environment) => ({
|
|
52
|
+
category: 'lwrUnresolvable/invalid',
|
|
53
|
+
message: `400: Environment "${environment}" is not supported`,
|
|
54
|
+
}),
|
|
55
|
+
INVALID_SPECIFIER: (specifier) => ({
|
|
56
|
+
category: 'lwrUnresolvable/invalid',
|
|
57
|
+
message: `400: Unable to resolve specifier "${specifier}" because it contains path traversal`,
|
|
58
|
+
}),
|
|
39
59
|
LABEL_MODULE: (file, error) => ({
|
|
40
60
|
category: 'lwrUnresolvable/label',
|
|
41
61
|
message: `Invalid JSON: Labels file ${file} must be a JSON object with string values or nested string values\n${error}`,
|
package/build/es/errors.d.ts
CHANGED
|
@@ -9,20 +9,12 @@ export declare class DiagnosticsError extends Error {
|
|
|
9
9
|
get message(): string;
|
|
10
10
|
diagnostics: Diagnostics;
|
|
11
11
|
}
|
|
12
|
+
export declare class LwrInvalidServerModeError extends DiagnosticsError {
|
|
13
|
+
}
|
|
12
14
|
export declare class LwrConfigValidationError extends DiagnosticsError {
|
|
13
15
|
}
|
|
14
16
|
export declare class LwrUnresolvableError extends DiagnosticsError {
|
|
15
17
|
}
|
|
16
18
|
export declare class LwrServerError extends DiagnosticsError {
|
|
17
19
|
}
|
|
18
|
-
/**
|
|
19
|
-
* Create a status object Express can return when there is an error
|
|
20
|
-
*
|
|
21
|
-
* @param name - string name of the problem module/resource
|
|
22
|
-
* @param error - an Error/Diagnostic object; thrown from try/catch
|
|
23
|
-
*/
|
|
24
|
-
export declare function createReturnStatus(name: string, error: unknown): {
|
|
25
|
-
status: number;
|
|
26
|
-
message: string;
|
|
27
|
-
};
|
|
28
20
|
//# sourceMappingURL=errors.d.ts.map
|
package/build/es/errors.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { descriptions } from './descriptions/index.js';
|
|
2
1
|
// The NodeJS Error is different from the JavaScript Error (e.g. NodeJS Error has a code)
|
|
3
2
|
export function isNodeError(error) {
|
|
4
3
|
return error instanceof Error;
|
|
@@ -27,33 +26,12 @@ export class DiagnosticsError extends Error {
|
|
|
27
26
|
return message;
|
|
28
27
|
}
|
|
29
28
|
}
|
|
29
|
+
export class LwrInvalidServerModeError extends DiagnosticsError {
|
|
30
|
+
}
|
|
30
31
|
export class LwrConfigValidationError extends DiagnosticsError {
|
|
31
32
|
}
|
|
32
33
|
export class LwrUnresolvableError extends DiagnosticsError {
|
|
33
34
|
}
|
|
34
35
|
export class LwrServerError extends DiagnosticsError {
|
|
35
36
|
}
|
|
36
|
-
/**
|
|
37
|
-
* Create a status object Express can return when there is an error
|
|
38
|
-
*
|
|
39
|
-
* @param name - string name of the problem module/resource
|
|
40
|
-
* @param error - an Error/Diagnostic object; thrown from try/catch
|
|
41
|
-
*/
|
|
42
|
-
export function createReturnStatus(name, error) {
|
|
43
|
-
let returnStatus = { status: 501, message: '' };
|
|
44
|
-
if (isNodeError(error) && error.code === 'NO_LWC_MODULE_FOUND') {
|
|
45
|
-
returnStatus = { status: 404, message: descriptions.UNRESOLVABLE.LWC_MODULE(name).message };
|
|
46
|
-
}
|
|
47
|
-
else if (error instanceof LwrUnresolvableError &&
|
|
48
|
-
error.diagnostics[0].description.category === 'lwrUnresolvable/invalid') {
|
|
49
|
-
returnStatus = { status: 400, message: error.message };
|
|
50
|
-
}
|
|
51
|
-
else if (error instanceof LwrUnresolvableError) {
|
|
52
|
-
returnStatus = { status: 404, message: error.message };
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
55
|
-
returnStatus = { status: 500, message: descriptions.UNRESOLVABLE.SERVER_ERROR(name).message };
|
|
56
|
-
}
|
|
57
|
-
return returnStatus;
|
|
58
|
-
}
|
|
59
37
|
//# sourceMappingURL=errors.js.map
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
7
|
-
"version": "0.9.0-alpha.
|
|
7
|
+
"version": "0.9.0-alpha.10",
|
|
8
8
|
"homepage": "https://developer.salesforce.com/docs/platform/lwr/overview",
|
|
9
9
|
"repository": {
|
|
10
10
|
"type": "git",
|
|
@@ -30,10 +30,10 @@
|
|
|
30
30
|
"build/**/*.d.ts"
|
|
31
31
|
],
|
|
32
32
|
"devDependencies": {
|
|
33
|
-
"@lwrjs/types": "0.9.0-alpha.
|
|
33
|
+
"@lwrjs/types": "0.9.0-alpha.10"
|
|
34
34
|
},
|
|
35
35
|
"engines": {
|
|
36
36
|
"node": ">=14.15.4 <19"
|
|
37
37
|
},
|
|
38
|
-
"gitHead": "
|
|
38
|
+
"gitHead": "ecbf031157dd87d2b1a3d528b7fae8f9142eba7e"
|
|
39
39
|
}
|