@lwrjs/config 0.9.0-alpha.22 → 0.9.0-alpha.24
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/defaults.cjs +2 -1
- package/build/cjs/hooks.cjs +8 -4
- package/build/cjs/index.cjs +3 -1
- package/build/cjs/runtime-config.cjs +4 -2
- package/build/cjs/validation/app-config-context.cjs +3 -1
- package/build/cjs/validation/app-config.cjs +1 -0
- package/build/es/defaults.js +2 -1
- package/build/es/hooks.d.ts +2 -2
- package/build/es/hooks.js +8 -4
- package/build/es/index.d.ts +1 -0
- package/build/es/index.js +1 -0
- package/build/es/runtime-config.js +4 -2
- package/build/es/validation/app-config-context.d.ts +2 -2
- package/build/es/validation/app-config-context.js +2 -0
- package/build/es/validation/app-config.js +5 -0
- package/package.json +6 -6
package/build/cjs/defaults.cjs
CHANGED
|
@@ -94,7 +94,7 @@ var DEFAULT_ESM_BUNDLE_EXCLUSIONS = [
|
|
|
94
94
|
"lwr/esmLoader",
|
|
95
95
|
"lwr/profiler"
|
|
96
96
|
];
|
|
97
|
-
var DEFAULT_AMD_BUNDLE_EXCLUSIONS = ["lwc", "
|
|
97
|
+
var DEFAULT_AMD_BUNDLE_EXCLUSIONS = ["lwc", "lwr/navigation", "lwr/profiler"];
|
|
98
98
|
var DEFAULT_ESM_BUNDLE_EXTERNALS = {};
|
|
99
99
|
var DEFAULT_AMD_BUNDLE_EXTERNALS = {
|
|
100
100
|
"lwr/loader": "lwr-loader-shim.bundle.min.js"
|
|
@@ -118,6 +118,7 @@ var DEFAULT_LWR_CONFIG = {
|
|
|
118
118
|
rootDir: DEFAULT_ROOT_DIR,
|
|
119
119
|
cacheDir: DEFAULT_CACHE_FOLDER,
|
|
120
120
|
serverMode: MODE,
|
|
121
|
+
minify: null,
|
|
121
122
|
apiVersion: DEFAULT_API_VERSION,
|
|
122
123
|
assets: DEFAULT_ASSETS_DIR,
|
|
123
124
|
assetProviders: DEFAULT_ASSET_PROVIDERS,
|
package/build/cjs/hooks.cjs
CHANGED
|
@@ -29,7 +29,7 @@ __export(exports, {
|
|
|
29
29
|
});
|
|
30
30
|
var import_routes = __toModule(require("./utils/routes.cjs"));
|
|
31
31
|
var import_app_config = __toModule(require("./validation/app-config.cjs"));
|
|
32
|
-
async function executeConfigHooks(hooks, globalConfig, runtimeEnvironment, globalData) {
|
|
32
|
+
async function executeConfigHooks(hooks, globalConfig, runtimeEnvironment, globalData, skipValidate = false) {
|
|
33
33
|
if (!hooks.length) {
|
|
34
34
|
return;
|
|
35
35
|
}
|
|
@@ -41,9 +41,11 @@ async function executeConfigHooks(hooks, globalConfig, runtimeEnvironment, globa
|
|
|
41
41
|
}
|
|
42
42
|
globalConfig.routes = (0, import_routes.normalizeRoutes)(globalConfig.routes, globalConfig.routeHandlers);
|
|
43
43
|
globalConfig.errorRoutes = (0, import_routes.normalizeRoutes)(globalConfig.errorRoutes, globalConfig.routeHandlers);
|
|
44
|
-
(
|
|
44
|
+
if (!skipValidate) {
|
|
45
|
+
(0, import_app_config.validateLwrAppConfig)(globalConfig, "post");
|
|
46
|
+
}
|
|
45
47
|
}
|
|
46
|
-
function executeStartHooks(hooks, globalConfig) {
|
|
48
|
+
function executeStartHooks(hooks, globalConfig, skipValidate = false) {
|
|
47
49
|
if (!hooks.length) {
|
|
48
50
|
return;
|
|
49
51
|
}
|
|
@@ -54,5 +56,7 @@ function executeStartHooks(hooks, globalConfig) {
|
|
|
54
56
|
hook.onStart(globalConfig.routes);
|
|
55
57
|
}
|
|
56
58
|
globalConfig.routes = (0, import_routes.normalizeRoutes)(globalConfig.routes, globalConfig.routeHandlers);
|
|
57
|
-
(
|
|
59
|
+
if (!skipValidate) {
|
|
60
|
+
(0, import_app_config.validateLwrAppConfig)(globalConfig, "post");
|
|
61
|
+
}
|
|
58
62
|
}
|
package/build/cjs/index.cjs
CHANGED
|
@@ -30,9 +30,11 @@ __export(exports, {
|
|
|
30
30
|
executeStartHooks: () => import_hooks.executeStartHooks,
|
|
31
31
|
getRuntimeEnvironment: () => import_runtime_config.getRuntimeEnvironment,
|
|
32
32
|
loadConfig: () => import_global_config.loadConfig,
|
|
33
|
-
normalizeConfig: () => import_global_config.resolveGlobalConfig
|
|
33
|
+
normalizeConfig: () => import_global_config.resolveGlobalConfig,
|
|
34
|
+
validateLwrAppConfig: () => import_app_config.validateLwrAppConfig
|
|
34
35
|
});
|
|
35
36
|
var import_package = __toModule(require("@lwrjs/config/package"));
|
|
36
37
|
var import_global_config = __toModule(require("./global-config.cjs"));
|
|
37
38
|
var import_runtime_config = __toModule(require("./runtime-config.cjs"));
|
|
38
39
|
var import_hooks = __toModule(require("./hooks.cjs"));
|
|
40
|
+
var import_app_config = __toModule(require("./validation/app-config.cjs"));
|
|
@@ -96,9 +96,11 @@ function getServerModeConfig(serverMode) {
|
|
|
96
96
|
return selectedMode;
|
|
97
97
|
}
|
|
98
98
|
function getRuntimeEnvironment(config) {
|
|
99
|
-
const {serverMode, lwrVersion, apiVersion, basePath} = config;
|
|
99
|
+
const {serverMode, lwrVersion, apiVersion, basePath, minify} = config;
|
|
100
|
+
const serverModeConfig = getServerModeConfig(config.serverMode);
|
|
100
101
|
return {
|
|
101
|
-
...
|
|
102
|
+
...serverModeConfig,
|
|
103
|
+
minify: minify !== null ? minify : serverModeConfig.minify,
|
|
102
104
|
featureFlags: (0, import_shared_utils.getFeatureFlags)(),
|
|
103
105
|
serverMode,
|
|
104
106
|
lwrVersion,
|
|
@@ -70,6 +70,7 @@ var ROOT_ATTRIBUTE_KEYS = createKeys("root", [
|
|
|
70
70
|
"routeHandlers",
|
|
71
71
|
"routes",
|
|
72
72
|
"serverMode",
|
|
73
|
+
"minify",
|
|
73
74
|
"serverType",
|
|
74
75
|
"viewProviders",
|
|
75
76
|
"viewTransformers"
|
|
@@ -108,7 +109,8 @@ var BOOTSTRAP_ATTRIBUTE_KEYS = createKeys("bootstrap", [
|
|
|
108
109
|
"workers",
|
|
109
110
|
"services",
|
|
110
111
|
"configAsSrc",
|
|
111
|
-
"ssr"
|
|
112
|
+
"ssr",
|
|
113
|
+
"module"
|
|
112
114
|
]);
|
|
113
115
|
var SPECIFIER_REGEX = /^@?[\w-]+(\/[\w-]+)*$/;
|
|
114
116
|
function isNotEmptyString(node) {
|
|
@@ -44,6 +44,7 @@ function validateBootstrap(node, validationContext, propPrefix) {
|
|
|
44
44
|
validationContext.assertIsBoolean((0, import_jsonc_parser.findNodeAtLocation)(node, ["autoBoot"]), `${propPrefix}.autoBoot`);
|
|
45
45
|
validationContext.assertIsBoolean((0, import_jsonc_parser.findNodeAtLocation)(node, ["ssr"]), `${propPrefix}.ssr`);
|
|
46
46
|
validationContext.assertIsBoolean((0, import_jsonc_parser.findNodeAtLocation)(node, ["configAsSrc"]), `${propPrefix}.configAsSrc`);
|
|
47
|
+
validationContext.assertIsSpecifier((0, import_jsonc_parser.findNodeAtLocation)(node, ["module"]), `${propPrefix}.module`);
|
|
47
48
|
validationContext.assertIsBoolean((0, import_jsonc_parser.findNodeAtLocation)(node, ["syntheticShadow"]), `${propPrefix}.syntheticShadow`);
|
|
48
49
|
const workers = (0, import_jsonc_parser.findNodeAtLocation)(node, ["workers"]);
|
|
49
50
|
if (workers && workers.children) {
|
package/build/es/defaults.js
CHANGED
|
@@ -58,7 +58,7 @@ const DEFAULT_ESM_BUNDLE_EXCLUSIONS = [
|
|
|
58
58
|
'lwr/esmLoader',
|
|
59
59
|
'lwr/profiler',
|
|
60
60
|
];
|
|
61
|
-
const DEFAULT_AMD_BUNDLE_EXCLUSIONS = ['lwc', '
|
|
61
|
+
const DEFAULT_AMD_BUNDLE_EXCLUSIONS = ['lwc', 'lwr/navigation', 'lwr/profiler'];
|
|
62
62
|
const DEFAULT_ESM_BUNDLE_EXTERNALS = {};
|
|
63
63
|
const DEFAULT_AMD_BUNDLE_EXTERNALS = {
|
|
64
64
|
'lwr/loader': 'lwr-loader-shim.bundle.min.js',
|
|
@@ -86,6 +86,7 @@ export const DEFAULT_LWR_CONFIG = {
|
|
|
86
86
|
rootDir: DEFAULT_ROOT_DIR,
|
|
87
87
|
cacheDir: DEFAULT_CACHE_FOLDER,
|
|
88
88
|
serverMode: MODE,
|
|
89
|
+
minify: null,
|
|
89
90
|
apiVersion: DEFAULT_API_VERSION,
|
|
90
91
|
assets: DEFAULT_ASSETS_DIR,
|
|
91
92
|
assetProviders: DEFAULT_ASSET_PROVIDERS,
|
package/build/es/hooks.d.ts
CHANGED
|
@@ -13,7 +13,7 @@ import type { GlobalData, HooksPlugin, NormalizedLwrGlobalConfig, RuntimeEnviron
|
|
|
13
13
|
* @param runtimeEnvironment - runtime environment resolved from programmatic config and config file
|
|
14
14
|
* @param globalData - resolved global data
|
|
15
15
|
*/
|
|
16
|
-
export declare function executeConfigHooks(hooks: HooksPlugin[], globalConfig: NormalizedLwrGlobalConfig, runtimeEnvironment: RuntimeEnvironment, globalData: GlobalData): Promise<void>;
|
|
16
|
+
export declare function executeConfigHooks(hooks: HooksPlugin[], globalConfig: NormalizedLwrGlobalConfig, runtimeEnvironment: RuntimeEnvironment, globalData: GlobalData, skipValidate?: boolean): Promise<void>;
|
|
17
17
|
/**
|
|
18
18
|
* Run `onStart` hooks
|
|
19
19
|
*
|
|
@@ -28,5 +28,5 @@ export declare function executeConfigHooks(hooks: HooksPlugin[], globalConfig: N
|
|
|
28
28
|
* @param hooks - hooks plugins
|
|
29
29
|
* @param globalConfig - global configuration
|
|
30
30
|
*/
|
|
31
|
-
export declare function executeStartHooks(hooks: HooksPlugin[], globalConfig: NormalizedLwrGlobalConfig): void;
|
|
31
|
+
export declare function executeStartHooks(hooks: HooksPlugin[], globalConfig: NormalizedLwrGlobalConfig, skipValidate?: boolean): void;
|
|
32
32
|
//# sourceMappingURL=hooks.d.ts.map
|
package/build/es/hooks.js
CHANGED
|
@@ -14,7 +14,7 @@ import { validateLwrAppConfig } from './validation/app-config.js';
|
|
|
14
14
|
* @param runtimeEnvironment - runtime environment resolved from programmatic config and config file
|
|
15
15
|
* @param globalData - resolved global data
|
|
16
16
|
*/
|
|
17
|
-
export async function executeConfigHooks(hooks, globalConfig, runtimeEnvironment, globalData) {
|
|
17
|
+
export async function executeConfigHooks(hooks, globalConfig, runtimeEnvironment, globalData, skipValidate = false) {
|
|
18
18
|
if (!hooks.length) {
|
|
19
19
|
return;
|
|
20
20
|
}
|
|
@@ -27,7 +27,9 @@ export async function executeConfigHooks(hooks, globalConfig, runtimeEnvironment
|
|
|
27
27
|
}
|
|
28
28
|
globalConfig.routes = normalizeRoutes(globalConfig.routes, globalConfig.routeHandlers);
|
|
29
29
|
globalConfig.errorRoutes = normalizeRoutes(globalConfig.errorRoutes, globalConfig.routeHandlers);
|
|
30
|
-
|
|
30
|
+
if (!skipValidate) {
|
|
31
|
+
validateLwrAppConfig(globalConfig, 'post');
|
|
32
|
+
}
|
|
31
33
|
}
|
|
32
34
|
/**
|
|
33
35
|
* Run `onStart` hooks
|
|
@@ -43,7 +45,7 @@ export async function executeConfigHooks(hooks, globalConfig, runtimeEnvironment
|
|
|
43
45
|
* @param hooks - hooks plugins
|
|
44
46
|
* @param globalConfig - global configuration
|
|
45
47
|
*/
|
|
46
|
-
export function executeStartHooks(hooks, globalConfig) {
|
|
48
|
+
export function executeStartHooks(hooks, globalConfig, skipValidate = false) {
|
|
47
49
|
if (!hooks.length) {
|
|
48
50
|
return;
|
|
49
51
|
}
|
|
@@ -54,6 +56,8 @@ export function executeStartHooks(hooks, globalConfig) {
|
|
|
54
56
|
hook.onStart(globalConfig.routes);
|
|
55
57
|
}
|
|
56
58
|
globalConfig.routes = normalizeRoutes(globalConfig.routes, globalConfig.routeHandlers);
|
|
57
|
-
|
|
59
|
+
if (!skipValidate) {
|
|
60
|
+
validateLwrAppConfig(globalConfig, 'post');
|
|
61
|
+
}
|
|
58
62
|
}
|
|
59
63
|
//# sourceMappingURL=hooks.js.map
|
package/build/es/index.d.ts
CHANGED
|
@@ -2,4 +2,5 @@ export { version as LWR_VERSION, lwcVersion as LWC_VERSION } from '@lwrjs/config
|
|
|
2
2
|
export { loadConfig, resolveGlobalConfig as normalizeConfig } from './global-config.js';
|
|
3
3
|
export { getRuntimeEnvironment } from './runtime-config.js';
|
|
4
4
|
export { executeConfigHooks, executeStartHooks } from './hooks.js';
|
|
5
|
+
export { validateLwrAppConfig } from './validation/app-config.js';
|
|
5
6
|
//# sourceMappingURL=index.d.ts.map
|
package/build/es/index.js
CHANGED
|
@@ -2,4 +2,5 @@ export { version as LWR_VERSION, lwcVersion as LWC_VERSION } from '@lwrjs/config
|
|
|
2
2
|
export { loadConfig, resolveGlobalConfig as normalizeConfig } from './global-config.js';
|
|
3
3
|
export { getRuntimeEnvironment } from './runtime-config.js';
|
|
4
4
|
export { executeConfigHooks, executeStartHooks } from './hooks.js';
|
|
5
|
+
export { validateLwrAppConfig } from './validation/app-config.js';
|
|
5
6
|
//# sourceMappingURL=index.js.map
|
|
@@ -80,9 +80,11 @@ export function getServerModeConfig(serverMode) {
|
|
|
80
80
|
* @returns {RuntimeEnvironment} the complete runtime environment
|
|
81
81
|
*/
|
|
82
82
|
export function getRuntimeEnvironment(config) {
|
|
83
|
-
const { serverMode, lwrVersion, apiVersion, basePath } = config;
|
|
83
|
+
const { serverMode, lwrVersion, apiVersion, basePath, minify } = config;
|
|
84
|
+
const serverModeConfig = getServerModeConfig(config.serverMode);
|
|
84
85
|
return {
|
|
85
|
-
...
|
|
86
|
+
...serverModeConfig,
|
|
87
|
+
minify: minify !== null ? minify : serverModeConfig.minify,
|
|
86
88
|
featureFlags: getFeatureFlags(),
|
|
87
89
|
serverMode,
|
|
88
90
|
lwrVersion,
|
|
@@ -16,13 +16,13 @@ interface ConfigMap {
|
|
|
16
16
|
bootstrap: NormalizedLwrAppBootstrapConfig;
|
|
17
17
|
locker: RequiredLwrLockerConfig;
|
|
18
18
|
}
|
|
19
|
-
export declare const ROOT_ATTRIBUTE_KEYS: ["amdLoader", "apiVersion", "assets", "assetProviders", "assetTransformers", "bundleConfig", "cacheDir", "contentDir", "environment", "errorRoutes", "esmLoader", "staticSiteGenerator", "globalData", "globalDataDir", "hooks", "ignoreLwrConfigFile", "lwrConfigFile", "layoutsDir", "locker", "lwc", "lwrVersion", "moduleProviders", "port", "basePath", "resourceProviders", "rootDir", "routeHandlers", "routes", "serverMode", "serverType", "viewProviders", "viewTransformers"];
|
|
19
|
+
export declare const ROOT_ATTRIBUTE_KEYS: ["amdLoader", "apiVersion", "assets", "assetProviders", "assetTransformers", "bundleConfig", "cacheDir", "contentDir", "environment", "errorRoutes", "esmLoader", "staticSiteGenerator", "globalData", "globalDataDir", "hooks", "ignoreLwrConfigFile", "lwrConfigFile", "layoutsDir", "locker", "lwc", "lwrVersion", "moduleProviders", "port", "basePath", "resourceProviders", "rootDir", "routeHandlers", "routes", "serverMode", "minify", "serverType", "viewProviders", "viewTransformers"];
|
|
20
20
|
export declare const ASSET_DIR_ATTRIBUTE_KEYS: ["alias", "dir", "urlPath"];
|
|
21
21
|
export declare const ASSET_FILE_ATTRIBUTE_KEYS: ["alias", "file", "urlPath"];
|
|
22
22
|
export declare const LOCKER_ATTRIBUTE_KEYS: ["enabled", "trustedComponents", "clientOnly"];
|
|
23
23
|
export declare const ROUTE_ATTRIBUTE_KEYS: ["bootstrap", "subRoutes", "contentTemplate", "id", "cache", "layoutTemplate", "method", "path", "rootComponent", "routeHandler", "properties"];
|
|
24
24
|
export declare const ERROR_ROUTE_ATTRIBUTE_KEYS: ["bootstrap", "subRoutes", "contentTemplate", "id", "layoutTemplate", "rootComponent", "routeHandler", "status", "properties", "cache"];
|
|
25
|
-
export declare const BOOTSTRAP_ATTRIBUTE_KEYS: ["autoBoot", "syntheticShadow", "workers", "services", "configAsSrc", "ssr"];
|
|
25
|
+
export declare const BOOTSTRAP_ATTRIBUTE_KEYS: ["autoBoot", "syntheticShadow", "workers", "services", "configAsSrc", "ssr", "module"];
|
|
26
26
|
export declare const BASE_PATH_REGEX: RegExp;
|
|
27
27
|
export declare class ValidationContext {
|
|
28
28
|
diagnostics: Diagnostic[];
|
|
@@ -36,6 +36,7 @@ export const ROOT_ATTRIBUTE_KEYS = createKeys('root', [
|
|
|
36
36
|
'routeHandlers',
|
|
37
37
|
'routes',
|
|
38
38
|
'serverMode',
|
|
39
|
+
'minify',
|
|
39
40
|
'serverType',
|
|
40
41
|
'viewProviders',
|
|
41
42
|
'viewTransformers',
|
|
@@ -75,6 +76,7 @@ export const BOOTSTRAP_ATTRIBUTE_KEYS = createKeys('bootstrap', [
|
|
|
75
76
|
'services',
|
|
76
77
|
'configAsSrc',
|
|
77
78
|
'ssr',
|
|
79
|
+
'module',
|
|
78
80
|
]);
|
|
79
81
|
const SPECIFIER_REGEX = /^@?[\w-]+(\/[\w-]+)*$/;
|
|
80
82
|
function isNotEmptyString(node) {
|
|
@@ -13,7 +13,9 @@ export const SOURCE_BY_PHASE = {
|
|
|
13
13
|
* - autoBoot: optional boolean
|
|
14
14
|
* - syntheticShadow: optional boolean
|
|
15
15
|
* - workers: optional map of string:specifier pairs
|
|
16
|
+
* - ssr: optional boolean
|
|
16
17
|
* - configAsSrc: optional boolean to include the client bootstrap config as src via in-lined
|
|
18
|
+
* - module: optional string specifier
|
|
17
19
|
*/
|
|
18
20
|
function validateBootstrap(node, validationContext, propPrefix) {
|
|
19
21
|
if (node) {
|
|
@@ -23,6 +25,7 @@ function validateBootstrap(node, validationContext, propPrefix) {
|
|
|
23
25
|
validationContext.assertIsBoolean(findNode(node, ['autoBoot']), `${propPrefix}.autoBoot`);
|
|
24
26
|
validationContext.assertIsBoolean(findNode(node, ['ssr']), `${propPrefix}.ssr`);
|
|
25
27
|
validationContext.assertIsBoolean(findNode(node, ['configAsSrc']), `${propPrefix}.configAsSrc`);
|
|
28
|
+
validationContext.assertIsSpecifier(findNode(node, ['module']), `${propPrefix}.module`);
|
|
26
29
|
validationContext.assertIsBoolean(findNode(node, ['syntheticShadow']), `${propPrefix}.syntheticShadow`);
|
|
27
30
|
// Each value in the worker map msut be a specifier
|
|
28
31
|
const workers = findNode(node, ['workers']);
|
|
@@ -71,6 +74,8 @@ function validateRouteCommon(node, validationContext, propPrefix) {
|
|
|
71
74
|
function validateRoutes(node, validationContext, preMerge) {
|
|
72
75
|
if (node) {
|
|
73
76
|
// routes may not be defined until after config hooks are applied
|
|
77
|
+
// note: there are 2 "post" hooks (onConfig/onStart) that routes can be applied.
|
|
78
|
+
// We need to ensure that we only validate after the last one (if both are used)
|
|
74
79
|
if (!preMerge) {
|
|
75
80
|
validationContext.assertNotEmptyArray(node, 'routes');
|
|
76
81
|
}
|
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.24",
|
|
8
8
|
"homepage": "https://developer.salesforce.com/docs/platform/lwr/overview",
|
|
9
9
|
"repository": {
|
|
10
10
|
"type": "git",
|
|
@@ -36,19 +36,19 @@
|
|
|
36
36
|
"package.cjs"
|
|
37
37
|
],
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@lwrjs/diagnostics": "0.9.0-alpha.
|
|
40
|
-
"@lwrjs/shared-utils": "0.9.0-alpha.
|
|
39
|
+
"@lwrjs/diagnostics": "0.9.0-alpha.24",
|
|
40
|
+
"@lwrjs/shared-utils": "0.9.0-alpha.24",
|
|
41
41
|
"fs-extra": "^10.1.0",
|
|
42
42
|
"jsonc-parser": "^3.0.0"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
|
-
"@lwrjs/types": "0.9.0-alpha.
|
|
45
|
+
"@lwrjs/types": "0.9.0-alpha.24"
|
|
46
46
|
},
|
|
47
47
|
"peerDependencies": {
|
|
48
48
|
"lwc": "2.x"
|
|
49
49
|
},
|
|
50
50
|
"engines": {
|
|
51
|
-
"node": ">=
|
|
51
|
+
"node": ">=16.0.0 <20"
|
|
52
52
|
},
|
|
53
|
-
"gitHead": "
|
|
53
|
+
"gitHead": "94326d9e8c80254cfab9c17b2235b10fdee13b4d"
|
|
54
54
|
}
|