@lwrjs/config 0.11.0-alpha.2 → 0.11.0-alpha.4

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.
@@ -87,6 +87,14 @@ var SSR_VIEW_TRANSFORM_PLUGIN = "@lwrjs/lwc-ssr/viewTransformer";
87
87
  var DEFAULT_ASSET_PROVIDERS = ["@lwrjs/fs-asset-provider"];
88
88
  var DEFAULT_ASSET_TRANSFORM_PLUGINS = ["@lwrjs/asset-transformer"];
89
89
  var DEFAULT_URI_TRANSFORM_PLUGINS = [];
90
+ var DEFAULT_I18N_CONFIG = {
91
+ defaultLocale: "en-US",
92
+ locales: [
93
+ {
94
+ id: "en-US"
95
+ }
96
+ ]
97
+ };
90
98
  var DEFAULT_AMD_LOADER = "lwr/loader";
91
99
  var DEFAULT_AMD_LOADER_LEGACY = "lwr/loaderLegacy";
92
100
  var DEFAULT_ESM_LOADER = "lwr/esmLoader";
@@ -157,5 +165,6 @@ var DEFAULT_LWR_CONFIG = {
157
165
  bundleConfig: getDefaultBundleConfig(MODE),
158
166
  serverType: DEFAULT_SERVER_TYPE,
159
167
  locker: import_shared_utils.DEFAULT_LWR_LOCKER_CONFIG,
160
- uriTransformers: DEFAULT_URI_TRANSFORM_PLUGINS
168
+ uriTransformers: DEFAULT_URI_TRANSFORM_PLUGINS,
169
+ i18n: DEFAULT_I18N_CONFIG
161
170
  };
@@ -38,7 +38,7 @@ var RUNTIME_CONFIGS = {
38
38
  compat: "0",
39
39
  debug: false,
40
40
  watchFiles: true,
41
- defaultLocale: "en_US",
41
+ defaultLocale: "en-US",
42
42
  hmrEnabled: true,
43
43
  immutableAssets: false,
44
44
  env: {
@@ -52,7 +52,7 @@ var RUNTIME_CONFIGS = {
52
52
  compat: "0",
53
53
  debug: false,
54
54
  watchFiles: false,
55
- defaultLocale: "en_US",
55
+ defaultLocale: "en-US",
56
56
  hmrEnabled: false,
57
57
  immutableAssets: true,
58
58
  env: {
@@ -66,7 +66,7 @@ var RUNTIME_CONFIGS = {
66
66
  compat: "1",
67
67
  debug: false,
68
68
  watchFiles: true,
69
- defaultLocale: "en_US",
69
+ defaultLocale: "en-US",
70
70
  hmrEnabled: false,
71
71
  immutableAssets: false,
72
72
  env: {
@@ -80,7 +80,7 @@ var RUNTIME_CONFIGS = {
80
80
  compat: "1",
81
81
  debug: false,
82
82
  watchFiles: false,
83
- defaultLocale: "en_US",
83
+ defaultLocale: "en-US",
84
84
  hmrEnabled: false,
85
85
  immutableAssets: true,
86
86
  env: {
@@ -96,8 +96,9 @@ function getServerModeConfig(serverMode) {
96
96
  return selectedMode;
97
97
  }
98
98
  function getRuntimeEnvironment(config) {
99
- const {serverMode, lwrVersion, apiVersion, basePath, minify} = config;
99
+ const {serverMode, lwrVersion, apiVersion, basePath, i18n, minify} = config;
100
100
  const serverModeConfig = getServerModeConfig(config.serverMode);
101
+ const defaultLocale = i18n.defaultLocale;
101
102
  return {
102
103
  ...serverModeConfig,
103
104
  minify: minify !== null ? minify : serverModeConfig.minify,
@@ -105,6 +106,7 @@ function getRuntimeEnvironment(config) {
105
106
  serverMode,
106
107
  lwrVersion,
107
108
  apiVersion,
108
- basePath
109
+ basePath,
110
+ defaultLocale
109
111
  };
110
112
  }
@@ -29,6 +29,7 @@ __export(exports, {
29
29
  BASE_PATH_REGEX: () => BASE_PATH_REGEX,
30
30
  BOOTSTRAP_ATTRIBUTE_KEYS: () => BOOTSTRAP_ATTRIBUTE_KEYS,
31
31
  ERROR_ROUTE_ATTRIBUTE_KEYS: () => ERROR_ROUTE_ATTRIBUTE_KEYS,
32
+ I18N_ATTRIBUTE_KEYS: () => I18N_ATTRIBUTE_KEYS,
32
33
  LOCKER_ATTRIBUTE_KEYS: () => LOCKER_ATTRIBUTE_KEYS,
33
34
  ROOT_ATTRIBUTE_KEYS: () => ROOT_ATTRIBUTE_KEYS,
34
35
  ROUTE_ATTRIBUTE_KEYS: () => ROUTE_ATTRIBUTE_KEYS,
@@ -57,6 +58,7 @@ var ROOT_ATTRIBUTE_KEYS = createKeys("root", [
57
58
  "globalData",
58
59
  "globalDataDir",
59
60
  "hooks",
61
+ "i18n",
60
62
  "ignoreLwrConfigFile",
61
63
  "lwrConfigFile",
62
64
  "layoutsDir",
@@ -80,6 +82,7 @@ var ROOT_ATTRIBUTE_KEYS = createKeys("root", [
80
82
  var ASSET_DIR_ATTRIBUTE_KEYS = createKeys("assetDir", ["alias", "dir", "urlPath", "root"]);
81
83
  var ASSET_FILE_ATTRIBUTE_KEYS = createKeys("assetFile", ["alias", "file", "urlPath"]);
82
84
  var LOCKER_ATTRIBUTE_KEYS = createKeys("locker", ["enabled", "trustedComponents", "clientOnly"]);
85
+ var I18N_ATTRIBUTE_KEYS = createKeys("i18n", ["defaultLocale", "locales"]);
83
86
  var ROUTE_ATTRIBUTE_KEYS = createKeys("routes", [
84
87
  "bootstrap",
85
88
  "subRoutes",
@@ -445,4 +448,12 @@ var ValidationContext = class {
445
448
  });
446
449
  }
447
450
  }
451
+ assertDefaultInLocales(node, defaultLocale, localesIds) {
452
+ if (!localesIds.includes(defaultLocale)) {
453
+ this.diagnostics.push({
454
+ description: import_diagnostics.descriptions.CONFIG_PARSER.DEFAULT_NOT_IN_LOCALES(defaultLocale, localesIds),
455
+ location: this.getLocationFromNode(node)
456
+ });
457
+ }
458
+ }
448
459
  };
@@ -91,6 +91,23 @@ function validateRoutes(node, validationContext, preMerge) {
91
91
  }
92
92
  }
93
93
  }
94
+ function validateI18NConfig(node, validationContext, preMerge) {
95
+ if (node) {
96
+ if (!preMerge) {
97
+ validationContext.assertIsObject(node, "i18n");
98
+ }
99
+ validationContext.assertIsObject(node, "i18n");
100
+ validationContext.assertValidKeys(node, "i18n", import_app_config_context.I18N_ATTRIBUTE_KEYS);
101
+ validationContext.assertRequiredKeys(node, "i18n", ["defaultLocale", "locales"]);
102
+ const locales = (0, import_jsonc_parser.findNodeAtLocation)(node, ["locales"]);
103
+ validationContext.assertNotEmptyArray(locales, "i18n.locales");
104
+ validationContext.assertUniqueIds([...locales?.children || []], "i18n.locales");
105
+ const defaultLocale = (0, import_jsonc_parser.findNodeAtLocation)(node, ["defaultLocale"]);
106
+ validationContext.assertNotEmptyString(defaultLocale, "i18n.defaultLocale");
107
+ const localeIds = locales?.children?.map((n) => (0, import_jsonc_parser.findNodeAtLocation)(n, ["id"])?.value) || [];
108
+ validationContext.assertDefaultInLocales(node, defaultLocale?.value, localeIds);
109
+ }
110
+ }
94
111
  function validateBundleConfig(node, validationContext) {
95
112
  if (node) {
96
113
  validationContext.assertIsObject(node, "bundleConfig");
@@ -213,6 +230,7 @@ function validateRoot(node, validationContext, preMerge) {
213
230
  validateRouteHandlers((0, import_jsonc_parser.findNodeAtLocation)(node, ["routeHandlers"]), validationContext);
214
231
  validateAssets((0, import_jsonc_parser.findNodeAtLocation)(node, ["assets"]), validationContext, preMerge);
215
232
  validateLocker(lockerNode, validationContext);
233
+ validateI18NConfig((0, import_jsonc_parser.findNodeAtLocation)(node, ["i18n"]), validationContext, preMerge);
216
234
  validateBundleConfig(bundleConfigNode, validationContext);
217
235
  validationContext.assertClientLockerSSR(routes, lockerNode);
218
236
  validationContext.assertNotEmptyString((0, import_jsonc_parser.findNodeAtLocation)(node, ["apiVersion"]), "apiVersion");
@@ -47,6 +47,14 @@ export const SSR_VIEW_TRANSFORM_PLUGIN = '@lwrjs/lwc-ssr/viewTransformer';
47
47
  const DEFAULT_ASSET_PROVIDERS = ['@lwrjs/fs-asset-provider'];
48
48
  const DEFAULT_ASSET_TRANSFORM_PLUGINS = ['@lwrjs/asset-transformer'];
49
49
  const DEFAULT_URI_TRANSFORM_PLUGINS = [];
50
+ const DEFAULT_I18N_CONFIG = {
51
+ defaultLocale: 'en-US',
52
+ locales: [
53
+ {
54
+ id: 'en-US',
55
+ },
56
+ ],
57
+ };
50
58
  export const DEFAULT_AMD_LOADER = 'lwr/loader';
51
59
  export const DEFAULT_AMD_LOADER_LEGACY = 'lwr/loaderLegacy';
52
60
  export const DEFAULT_ESM_LOADER = 'lwr/esmLoader';
@@ -122,5 +130,6 @@ export const DEFAULT_LWR_CONFIG = {
122
130
  serverType: DEFAULT_SERVER_TYPE,
123
131
  locker: DEFAULT_LWR_LOCKER_CONFIG,
124
132
  uriTransformers: DEFAULT_URI_TRANSFORM_PLUGINS,
133
+ i18n: DEFAULT_I18N_CONFIG,
125
134
  };
126
135
  //# sourceMappingURL=defaults.js.map
@@ -8,7 +8,7 @@ export const RUNTIME_CONFIGS = {
8
8
  compat: '0',
9
9
  debug: false,
10
10
  watchFiles: true,
11
- defaultLocale: 'en_US',
11
+ defaultLocale: 'en-US',
12
12
  hmrEnabled: true,
13
13
  immutableAssets: false,
14
14
  env: {
@@ -22,7 +22,7 @@ export const RUNTIME_CONFIGS = {
22
22
  compat: '0',
23
23
  debug: false,
24
24
  watchFiles: false,
25
- defaultLocale: 'en_US',
25
+ defaultLocale: 'en-US',
26
26
  hmrEnabled: false,
27
27
  immutableAssets: true,
28
28
  env: {
@@ -36,7 +36,7 @@ export const RUNTIME_CONFIGS = {
36
36
  compat: '1',
37
37
  debug: false,
38
38
  watchFiles: true,
39
- defaultLocale: 'en_US',
39
+ defaultLocale: 'en-US',
40
40
  hmrEnabled: false,
41
41
  immutableAssets: false,
42
42
  env: {
@@ -50,7 +50,7 @@ export const RUNTIME_CONFIGS = {
50
50
  compat: '1',
51
51
  debug: false,
52
52
  watchFiles: false,
53
- defaultLocale: 'en_US',
53
+ defaultLocale: 'en-US',
54
54
  hmrEnabled: false,
55
55
  immutableAssets: true,
56
56
  env: {
@@ -80,8 +80,9 @@ 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, minify } = config;
83
+ const { serverMode, lwrVersion, apiVersion, basePath, i18n, minify } = config;
84
84
  const serverModeConfig = getServerModeConfig(config.serverMode);
85
+ const defaultLocale = i18n.defaultLocale;
85
86
  return {
86
87
  ...serverModeConfig,
87
88
  minify: minify !== null ? minify : serverModeConfig.minify,
@@ -90,6 +91,7 @@ export function getRuntimeEnvironment(config) {
90
91
  lwrVersion,
91
92
  apiVersion,
92
93
  basePath,
94
+ defaultLocale,
93
95
  };
94
96
  }
95
97
  //# sourceMappingURL=runtime-config.js.map
@@ -1,4 +1,4 @@
1
- import type { AssetDirConfig, AssetFileConfig, LwrErrorRoute, LwrRoute, NormalizedLwrGlobalConfig, NormalizedLwrAppBootstrapConfig, LwrLockerConfig, RouteHandlersConfig, BundleConfig } from '@lwrjs/types';
1
+ import type { AssetDirConfig, AssetFileConfig, LwrErrorRoute, LwrRoute, NormalizedLwrGlobalConfig, NormalizedLwrAppBootstrapConfig, LwrLockerConfig, RouteHandlersConfig, BundleConfig, I18NConfig } from '@lwrjs/types';
2
2
  import { Node } from 'jsonc-parser';
3
3
  import { Diagnostic } from '@lwrjs/diagnostics';
4
4
  type RequiredAssetDirConfig = Required<AssetDirConfig>;
@@ -6,6 +6,7 @@ type RequiredAssetFileConfig = Required<AssetFileConfig>;
6
6
  type RequiredLwrRoute = Required<LwrRoute>;
7
7
  type RequiredLwrErrorRoute = Required<LwrErrorRoute>;
8
8
  type RequiredLwrLockerConfig = Required<LwrLockerConfig>;
9
+ type RequiredI18NConfig = Required<I18NConfig>;
9
10
  interface ConfigMap {
10
11
  root: NormalizedLwrGlobalConfig;
11
12
  assetDir: RequiredAssetDirConfig;
@@ -18,11 +19,13 @@ interface ConfigMap {
18
19
  bundleConfig: BundleConfig;
19
20
  'bundleConfig.external': BundleConfig;
20
21
  'bundleConfig.groups': BundleConfig;
22
+ i18n: RequiredI18NConfig;
21
23
  }
22
- export declare const ROOT_ATTRIBUTE_KEYS: ["amdLoader", "apiVersion", "assets", "assetProviders", "assetTransformers", "bundleConfig", "bundleProviders", "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", "uriTransformers", "viewProviders", "viewTransformers"];
24
+ export declare const ROOT_ATTRIBUTE_KEYS: ["amdLoader", "apiVersion", "assets", "assetProviders", "assetTransformers", "bundleConfig", "bundleProviders", "cacheDir", "contentDir", "environment", "errorRoutes", "esmLoader", "staticSiteGenerator", "globalData", "globalDataDir", "hooks", "i18n", "ignoreLwrConfigFile", "lwrConfigFile", "layoutsDir", "locker", "lwc", "lwrVersion", "moduleProviders", "port", "basePath", "resourceProviders", "rootDir", "routeHandlers", "routes", "serverMode", "minify", "serverType", "uriTransformers", "viewProviders", "viewTransformers"];
23
25
  export declare const ASSET_DIR_ATTRIBUTE_KEYS: ["alias", "dir", "urlPath", "root"];
24
26
  export declare const ASSET_FILE_ATTRIBUTE_KEYS: ["alias", "file", "urlPath"];
25
27
  export declare const LOCKER_ATTRIBUTE_KEYS: ["enabled", "trustedComponents", "clientOnly"];
28
+ export declare const I18N_ATTRIBUTE_KEYS: ["defaultLocale", "locales"];
26
29
  export declare const ROUTE_ATTRIBUTE_KEYS: ["bootstrap", "subRoutes", "contentTemplate", "id", "cache", "layoutTemplate", "method", "path", "rootComponent", "routeHandler", "properties"];
27
30
  export declare const ERROR_ROUTE_ATTRIBUTE_KEYS: ["bootstrap", "subRoutes", "contentTemplate", "id", "layoutTemplate", "rootComponent", "routeHandler", "status", "properties", "cache"];
28
31
  export declare const BOOTSTRAP_ATTRIBUTE_KEYS: ["autoBoot", "syntheticShadow", "workers", "services", "configAsSrc", "ssr", "mixedMode", "module", "preloadModules"];
@@ -57,6 +60,7 @@ export declare class ValidationContext {
57
60
  assertRequiredKeys(node: Node, property: string, requiredPropertyKeys: string[]): void;
58
61
  assertValidKeys<T extends keyof ConfigMap>(node: Node, property: T, validPropertyKeys: (keyof ConfigMap[T])[]): void;
59
62
  assertNoBundleConfigDupes(node: Node, dupes: string[]): void;
63
+ assertDefaultInLocales(node: Node, defaultLocale: string, localesIds: string[]): void;
60
64
  }
61
65
  export {};
62
66
  //# sourceMappingURL=app-config-context.d.ts.map
@@ -23,6 +23,7 @@ export const ROOT_ATTRIBUTE_KEYS = createKeys('root', [
23
23
  'globalData',
24
24
  'globalDataDir',
25
25
  'hooks',
26
+ 'i18n',
26
27
  'ignoreLwrConfigFile',
27
28
  'lwrConfigFile',
28
29
  'layoutsDir',
@@ -46,6 +47,7 @@ export const ROOT_ATTRIBUTE_KEYS = createKeys('root', [
46
47
  export const ASSET_DIR_ATTRIBUTE_KEYS = createKeys('assetDir', ['alias', 'dir', 'urlPath', 'root']);
47
48
  export const ASSET_FILE_ATTRIBUTE_KEYS = createKeys('assetFile', ['alias', 'file', 'urlPath']);
48
49
  export const LOCKER_ATTRIBUTE_KEYS = createKeys('locker', ['enabled', 'trustedComponents', 'clientOnly']);
50
+ export const I18N_ATTRIBUTE_KEYS = createKeys('i18n', ['defaultLocale', 'locales']);
49
51
  export const ROUTE_ATTRIBUTE_KEYS = createKeys('routes', [
50
52
  'bootstrap',
51
53
  'subRoutes',
@@ -429,5 +431,13 @@ export class ValidationContext {
429
431
  });
430
432
  }
431
433
  }
434
+ assertDefaultInLocales(node, defaultLocale, localesIds) {
435
+ if (!localesIds.includes(defaultLocale)) {
436
+ this.diagnostics.push({
437
+ description: descriptions.CONFIG_PARSER.DEFAULT_NOT_IN_LOCALES(defaultLocale, localesIds),
438
+ location: this.getLocationFromNode(node),
439
+ });
440
+ }
441
+ }
432
442
  }
433
443
  //# sourceMappingURL=app-config-context.js.map
@@ -1,6 +1,6 @@
1
1
  import { parseTree, printParseErrorCode, findNodeAtLocation as findNode, } from 'jsonc-parser';
2
2
  import { createSingleDiagnosticError, descriptions, LwrConfigValidationError } from '@lwrjs/diagnostics';
3
- import { ASSET_DIR_ATTRIBUTE_KEYS, ASSET_FILE_ATTRIBUTE_KEYS, BOOTSTRAP_ATTRIBUTE_KEYS, ERROR_ROUTE_ATTRIBUTE_KEYS, LOCKER_ATTRIBUTE_KEYS, ROOT_ATTRIBUTE_KEYS, ROUTE_ATTRIBUTE_KEYS, ValidationContext, } from './app-config-context.js';
3
+ import { ASSET_DIR_ATTRIBUTE_KEYS, ASSET_FILE_ATTRIBUTE_KEYS, BOOTSTRAP_ATTRIBUTE_KEYS, ERROR_ROUTE_ATTRIBUTE_KEYS, I18N_ATTRIBUTE_KEYS, LOCKER_ATTRIBUTE_KEYS, ROOT_ATTRIBUTE_KEYS, ROUTE_ATTRIBUTE_KEYS, ValidationContext, } from './app-config-context.js';
4
4
  import { calculatePositionFromSource } from './helpers.js';
5
5
  import { DEFAULT_ESM_BUNDLE_EXCLUSIONS, DEFAULT_AMD_BUNDLE_EXCLUSIONS } from '../defaults.js';
6
6
  import { ConfigSpan, getTracer } from '@lwrjs/instrumentation';
@@ -96,6 +96,28 @@ function validateRoutes(node, validationContext, preMerge) {
96
96
  }
97
97
  }
98
98
  }
99
+ function validateI18NConfig(node, validationContext, preMerge) {
100
+ if (node) {
101
+ // i18n may not be defined until after config hooks are applied
102
+ // note: there are 2 "post" hooks (onConfig/onStart) that i18n can be applied.
103
+ // We need to ensure that we only validate after the last one (if both are used)
104
+ if (!preMerge) {
105
+ validationContext.assertIsObject(node, 'i18n');
106
+ }
107
+ validationContext.assertIsObject(node, 'i18n');
108
+ validationContext.assertValidKeys(node, 'i18n', I18N_ATTRIBUTE_KEYS);
109
+ validationContext.assertRequiredKeys(node, 'i18n', ['defaultLocale', 'locales']);
110
+ // Validate locales
111
+ const locales = findNode(node, ['locales']);
112
+ validationContext.assertNotEmptyArray(locales, 'i18n.locales');
113
+ validationContext.assertUniqueIds([...(locales?.children || [])], 'i18n.locales');
114
+ // Validate defaultLocale
115
+ const defaultLocale = findNode(node, ['defaultLocale']);
116
+ validationContext.assertNotEmptyString(defaultLocale, 'i18n.defaultLocale');
117
+ const localeIds = locales?.children?.map((n) => findNode(n, ['id'])?.value) || [];
118
+ validationContext.assertDefaultInLocales(node, defaultLocale?.value, localeIds);
119
+ }
120
+ }
99
121
  function validateBundleConfig(node, validationContext) {
100
122
  if (node) {
101
123
  validationContext.assertIsObject(node, 'bundleConfig');
@@ -274,6 +296,7 @@ function validateRoot(node, validationContext, preMerge) {
274
296
  validateRouteHandlers(findNode(node, ['routeHandlers']), validationContext);
275
297
  validateAssets(findNode(node, ['assets']), validationContext, preMerge);
276
298
  validateLocker(lockerNode, validationContext);
299
+ validateI18NConfig(findNode(node, ['i18n']), validationContext, preMerge);
277
300
  validateBundleConfig(bundleConfigNode, validationContext);
278
301
  validationContext.assertClientLockerSSR(routes, lockerNode);
279
302
  validationContext.assertNotEmptyString(findNode(node, ['apiVersion']), 'apiVersion');
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
- "version": "0.11.0-alpha.2",
7
+ "version": "0.11.0-alpha.4",
8
8
  "homepage": "https://developer.salesforce.com/docs/platform/lwr/overview",
9
9
  "repository": {
10
10
  "type": "git",
@@ -41,14 +41,14 @@
41
41
  "test": "jest"
42
42
  },
43
43
  "dependencies": {
44
- "@lwrjs/diagnostics": "0.11.0-alpha.2",
45
- "@lwrjs/instrumentation": "0.11.0-alpha.2",
46
- "@lwrjs/shared-utils": "0.11.0-alpha.2",
44
+ "@lwrjs/diagnostics": "0.11.0-alpha.4",
45
+ "@lwrjs/instrumentation": "0.11.0-alpha.4",
46
+ "@lwrjs/shared-utils": "0.11.0-alpha.4",
47
47
  "fs-extra": "^11.1.1",
48
48
  "jsonc-parser": "^3.0.0"
49
49
  },
50
50
  "devDependencies": {
51
- "@lwrjs/types": "0.11.0-alpha.2",
51
+ "@lwrjs/types": "0.11.0-alpha.4",
52
52
  "jest": "^26.6.3",
53
53
  "ts-jest": "^26.5.6"
54
54
  },
@@ -61,5 +61,5 @@
61
61
  "volta": {
62
62
  "extends": "../../../package.json"
63
63
  },
64
- "gitHead": "ce7d80468d289a0d24682735513166f163f29f61"
64
+ "gitHead": "89a7e9815e0e381d9fd67212f0471d9a11f73985"
65
65
  }