@lwrjs/core 0.6.0 → 0.6.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.
- package/build/cjs/env-config.cjs +2 -0
- package/build/cjs/index.cjs +5 -2
- package/build/cjs/middlewares/api-middleware.cjs +3 -1
- package/build/cjs/tools/static-generation.cjs +7 -7
- package/build/cjs/validation/app-config-context.cjs +1 -0
- package/build/es/env-config.js +2 -0
- package/build/es/index.js +5 -2
- package/build/es/middlewares/api-middleware.js +3 -1
- package/build/es/tools/static-generation.js +10 -10
- package/build/es/validation/app-config-context.d.ts +1 -1
- package/build/es/validation/app-config-context.js +1 -0
- package/package.json +28 -28
package/build/cjs/env-config.cjs
CHANGED
|
@@ -36,6 +36,7 @@ var import_app_config = __toModule(require("./validation/app-config.cjs"));
|
|
|
36
36
|
var import_diagnostics = __toModule(require("@lwrjs/diagnostics"));
|
|
37
37
|
var PORT = process.env.PORT ? parseInt(process.env.PORT, 10) : 3e3;
|
|
38
38
|
var MODE = process.env.MODE || "dev";
|
|
39
|
+
var DEFAULT_BASE_PATH = "";
|
|
39
40
|
var DEFAULT_API_VERSION = "1";
|
|
40
41
|
var LWR_VERSION = import_package.version;
|
|
41
42
|
var DEFAULT_SERVER_TYPE = "express";
|
|
@@ -91,6 +92,7 @@ var DEFAULT_LWR_CONFIG = {
|
|
|
91
92
|
port: PORT,
|
|
92
93
|
ignoreLwrConfigFile: false,
|
|
93
94
|
lwrConfigFile: DEFAULT_LWR_CONFIG_JSON,
|
|
95
|
+
basePath: DEFAULT_BASE_PATH,
|
|
94
96
|
rootDir: DEFAULT_ROOT_DIR,
|
|
95
97
|
cacheDir: DEFAULT_CACHE_FOLDER,
|
|
96
98
|
serverMode: MODE,
|
package/build/cjs/index.cjs
CHANGED
|
@@ -66,11 +66,12 @@ function initMiddlewares(app, server, serverContext) {
|
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
async function initContext(app, server, rawLwrConfig) {
|
|
69
|
-
const {apiVersion, lwrVersion, serverMode, globalDataDir, globalData} = rawLwrConfig;
|
|
69
|
+
const {apiVersion, basePath, lwrVersion, serverMode, globalDataDir, globalData} = rawLwrConfig;
|
|
70
70
|
const rawDataConfig = (0, import_global_data.getGlobalData)(globalDataDir, globalData);
|
|
71
71
|
const rawRuntimeEnvConfig = {
|
|
72
72
|
...(0, import_env_config.explodeMode)(serverMode),
|
|
73
73
|
apiVersion,
|
|
74
|
+
basePath,
|
|
74
75
|
lwrVersion,
|
|
75
76
|
debug: false,
|
|
76
77
|
serverMode,
|
|
@@ -159,6 +160,7 @@ async function initContext(app, server, rawLwrConfig) {
|
|
|
159
160
|
routes,
|
|
160
161
|
errorRoutes,
|
|
161
162
|
rootDir,
|
|
163
|
+
basePath,
|
|
162
164
|
contentDir,
|
|
163
165
|
layoutsDir,
|
|
164
166
|
locker,
|
|
@@ -185,7 +187,8 @@ var LwrApp = class {
|
|
|
185
187
|
constructor(config) {
|
|
186
188
|
this.initialized = false;
|
|
187
189
|
this.config = (0, import_env_config.normalizeConfig)(config);
|
|
188
|
-
|
|
190
|
+
const {basePath} = this.config;
|
|
191
|
+
this.app = (0, import_server.createInternalServer)(this.config.serverType, {basePath});
|
|
189
192
|
this.server = this.app.createHttpServer();
|
|
190
193
|
}
|
|
191
194
|
setConfig(config) {
|
|
@@ -332,11 +332,13 @@ function apiMiddleware(app, context) {
|
|
|
332
332
|
});
|
|
333
333
|
app.all("/:apiVersion/:assetType/:immutable?/s/:signature/" + app.getRegexWildcard(), async (req, res) => {
|
|
334
334
|
const {runtimeEnvironment} = req.getRuntimeContext(defaultRuntimeEnvironment);
|
|
335
|
+
const {basePath} = runtimeEnvironment;
|
|
335
336
|
const {signature} = req.params;
|
|
336
337
|
const {immutable, assetType: type} = req.params;
|
|
337
338
|
const specifier = req.params[0] ? `/${req.params[0]}` : req.originalUrl;
|
|
339
|
+
const basePathSpecifier = `${basePath}${specifier}`;
|
|
338
340
|
try {
|
|
339
|
-
const assetObj = await context.assetRegistry.getAsset({specifier, signature, type}, runtimeEnvironment);
|
|
341
|
+
const assetObj = await context.assetRegistry.getAsset({specifier: basePathSpecifier, signature, type}, runtimeEnvironment);
|
|
340
342
|
if (immutable) {
|
|
341
343
|
}
|
|
342
344
|
if (assetObj.mime) {
|
|
@@ -27,6 +27,7 @@ __export(exports, {
|
|
|
27
27
|
ViewImportMetadataImpl: () => ViewImportMetadataImpl,
|
|
28
28
|
default: () => static_generation_default
|
|
29
29
|
});
|
|
30
|
+
var import_perf_hooks = __toModule(require("perf_hooks"));
|
|
30
31
|
var import_shared_utils = __toModule(require("@lwrjs/shared-utils"));
|
|
31
32
|
var import_path = __toModule(require("path"));
|
|
32
33
|
var import_fs_extra = __toModule(require("fs-extra"));
|
|
@@ -34,6 +35,7 @@ var import_stream = __toModule(require("./utils/stream.cjs"));
|
|
|
34
35
|
var import_dir = __toModule(require("./utils/dir.cjs"));
|
|
35
36
|
var SiteGenerator = class {
|
|
36
37
|
async buildStaticApplication(config, dispatcher) {
|
|
38
|
+
const startTime = import_perf_hooks.performance.now();
|
|
37
39
|
console.log("[Static Generation] starting");
|
|
38
40
|
const {routes, staticSiteGenerator, rootDir, assets} = config;
|
|
39
41
|
if (!staticSiteGenerator.outputDir) {
|
|
@@ -46,27 +48,27 @@ var SiteGenerator = class {
|
|
|
46
48
|
await this.generateRoutes(staticSiteGenerator, routes, dispatcher, outputDir, urlRewriteMap);
|
|
47
49
|
this.writeNetlifyRedirectConfig(outputDir, urlRewriteMap);
|
|
48
50
|
this.copyAssets(assets, outputDir);
|
|
49
|
-
|
|
51
|
+
const endTime = import_perf_hooks.performance.now();
|
|
52
|
+
const timeDiff = (endTime - startTime) / 1e3;
|
|
53
|
+
console.log(`[Static Generation] complete in ${Math.round(timeDiff)} seconds`);
|
|
50
54
|
}
|
|
51
55
|
async generateRoutes(staticSiteGenerator, routes, dispatcher, outputDir, urlRewriteMap = new Map()) {
|
|
52
56
|
if (!staticSiteGenerator.locales) {
|
|
53
57
|
staticSiteGenerator.locales = ["en-US"];
|
|
54
58
|
}
|
|
55
|
-
const dispatchRequests = [];
|
|
56
59
|
const generateUrl = this.createGenerateURLFunction(dispatcher);
|
|
57
60
|
for (const locale of staticSiteGenerator.locales) {
|
|
58
61
|
for (const route of routes) {
|
|
59
62
|
const siteConfig = this.createSiteConfig(outputDir, locale, urlRewriteMap);
|
|
60
|
-
|
|
63
|
+
await generateUrl(route.path, siteConfig);
|
|
61
64
|
}
|
|
62
65
|
if (staticSiteGenerator._additionalRoutePaths) {
|
|
63
66
|
for (const uri of staticSiteGenerator._additionalRoutePaths) {
|
|
64
67
|
const siteConfig = this.createSiteConfig(outputDir, locale, urlRewriteMap);
|
|
65
|
-
|
|
68
|
+
await generateUrl(uri, siteConfig);
|
|
66
69
|
}
|
|
67
70
|
}
|
|
68
71
|
}
|
|
69
|
-
await Promise.all(dispatchRequests);
|
|
70
72
|
}
|
|
71
73
|
createGenerateURLFunction(dispatcher) {
|
|
72
74
|
const generateRoute = async (uri, siteConfig) => {
|
|
@@ -235,8 +237,6 @@ var SiteGenerator = class {
|
|
|
235
237
|
} else {
|
|
236
238
|
console.warn('[WARN] Unable to fetch mapping for bare specifier or variable dynamic import: "' + jsUri + '"');
|
|
237
239
|
}
|
|
238
|
-
} else {
|
|
239
|
-
console.warn('[WARN] Unable to resolve bare specifier or variable dynamic import: "' + jsUri + '"');
|
|
240
240
|
}
|
|
241
241
|
}
|
|
242
242
|
}
|
package/build/es/env-config.js
CHANGED
|
@@ -7,6 +7,7 @@ import { validateLwrAppConfig } from './validation/app-config.js';
|
|
|
7
7
|
import { LwrConfigValidationError } from '@lwrjs/diagnostics';
|
|
8
8
|
const PORT = process.env.PORT ? parseInt(process.env.PORT, 10) : 3000;
|
|
9
9
|
const MODE = process.env.MODE || 'dev';
|
|
10
|
+
const DEFAULT_BASE_PATH = '';
|
|
10
11
|
const DEFAULT_API_VERSION = '1';
|
|
11
12
|
const LWR_VERSION = version;
|
|
12
13
|
const DEFAULT_SERVER_TYPE = 'express';
|
|
@@ -66,6 +67,7 @@ const DEFAULT_LWR_CONFIG = {
|
|
|
66
67
|
port: PORT,
|
|
67
68
|
ignoreLwrConfigFile: false,
|
|
68
69
|
lwrConfigFile: DEFAULT_LWR_CONFIG_JSON,
|
|
70
|
+
basePath: DEFAULT_BASE_PATH,
|
|
69
71
|
rootDir: DEFAULT_ROOT_DIR,
|
|
70
72
|
cacheDir: DEFAULT_CACHE_FOLDER,
|
|
71
73
|
serverMode: MODE,
|
package/build/es/index.js
CHANGED
|
@@ -41,11 +41,12 @@ function initMiddlewares(app, server, serverContext) {
|
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
43
|
async function initContext(app, server, rawLwrConfig) {
|
|
44
|
-
const { apiVersion, lwrVersion, serverMode, globalDataDir, globalData } = rawLwrConfig;
|
|
44
|
+
const { apiVersion, basePath, lwrVersion, serverMode, globalDataDir, globalData } = rawLwrConfig;
|
|
45
45
|
const rawDataConfig = getGlobalData(globalDataDir, globalData);
|
|
46
46
|
const rawRuntimeEnvConfig = {
|
|
47
47
|
...explodeMode(serverMode),
|
|
48
48
|
apiVersion,
|
|
49
|
+
basePath,
|
|
49
50
|
lwrVersion,
|
|
50
51
|
debug: false,
|
|
51
52
|
serverMode,
|
|
@@ -119,6 +120,7 @@ async function initContext(app, server, rawLwrConfig) {
|
|
|
119
120
|
routes,
|
|
120
121
|
errorRoutes,
|
|
121
122
|
rootDir,
|
|
123
|
+
basePath,
|
|
122
124
|
contentDir,
|
|
123
125
|
layoutsDir,
|
|
124
126
|
locker,
|
|
@@ -150,7 +152,8 @@ export class LwrApp {
|
|
|
150
152
|
constructor(config) {
|
|
151
153
|
this.initialized = false;
|
|
152
154
|
this.config = normalizeConfig(config);
|
|
153
|
-
|
|
155
|
+
const { basePath } = this.config;
|
|
156
|
+
this.app = createInternalServer(this.config.serverType, { basePath });
|
|
154
157
|
this.server = this.app.createHttpServer();
|
|
155
158
|
}
|
|
156
159
|
setConfig(config) {
|
|
@@ -380,11 +380,13 @@ export default function apiMiddleware(app, context) {
|
|
|
380
380
|
// Koa routing (Path-To-RegExp) breaks compatibility with Express routing & asterisk wildcards
|
|
381
381
|
app.all('/:apiVersion/:assetType/:immutable?/s/:signature/' + app.getRegexWildcard(), async (req, res) => {
|
|
382
382
|
const { runtimeEnvironment } = req.getRuntimeContext(defaultRuntimeEnvironment);
|
|
383
|
+
const { basePath } = runtimeEnvironment;
|
|
383
384
|
const { signature } = req.params;
|
|
384
385
|
const { immutable, assetType: type } = req.params;
|
|
385
386
|
const specifier = req.params[0] ? `/${req.params[0]}` : req.originalUrl;
|
|
387
|
+
const basePathSpecifier = `${basePath}${specifier}`;
|
|
386
388
|
try {
|
|
387
|
-
const assetObj = await context.assetRegistry.getAsset({ specifier, signature, type: type }, runtimeEnvironment);
|
|
389
|
+
const assetObj = await context.assetRegistry.getAsset({ specifier: basePathSpecifier, signature, type: type }, runtimeEnvironment);
|
|
388
390
|
if (immutable) {
|
|
389
391
|
// WIP: ?
|
|
390
392
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { performance } from 'perf_hooks';
|
|
1
2
|
import { getSpecifier, getExperimentalFeatures, hashContent } from '@lwrjs/shared-utils';
|
|
2
3
|
import { join, dirname, extname } from 'path';
|
|
3
4
|
import fs from 'fs-extra';
|
|
@@ -13,6 +14,7 @@ export default class SiteGenerator {
|
|
|
13
14
|
* @param dispatcher - Facilitate server requests
|
|
14
15
|
*/
|
|
15
16
|
async buildStaticApplication(config, dispatcher) {
|
|
17
|
+
const startTime = performance.now();
|
|
16
18
|
console.log('[Static Generation] starting');
|
|
17
19
|
const { routes, staticSiteGenerator, rootDir, assets } = config;
|
|
18
20
|
if (!staticSiteGenerator.outputDir) {
|
|
@@ -28,7 +30,9 @@ export default class SiteGenerator {
|
|
|
28
30
|
this.writeNetlifyRedirectConfig(outputDir, urlRewriteMap);
|
|
29
31
|
// Copy over assets
|
|
30
32
|
this.copyAssets(assets, outputDir);
|
|
31
|
-
|
|
33
|
+
const endTime = performance.now();
|
|
34
|
+
const timeDiff = (endTime - startTime) / 1000;
|
|
35
|
+
console.log(`[Static Generation] complete in ${Math.round(timeDiff)} seconds`);
|
|
32
36
|
}
|
|
33
37
|
/**
|
|
34
38
|
* Crawl all view routes for a site
|
|
@@ -37,25 +41,24 @@ export default class SiteGenerator {
|
|
|
37
41
|
if (!staticSiteGenerator.locales) {
|
|
38
42
|
staticSiteGenerator.locales = ['en-US'];
|
|
39
43
|
}
|
|
40
|
-
// Build up a list of dispatch requests to kick off in parallel
|
|
41
|
-
const dispatchRequests = [];
|
|
42
44
|
const generateUrl = this.createGenerateURLFunction(dispatcher);
|
|
45
|
+
// Note: generateUrl can consume a lot of memory so we need to do this sequentially
|
|
43
46
|
for (const locale of staticSiteGenerator.locales) {
|
|
44
47
|
// Generate all the routes
|
|
45
48
|
for (const route of routes) {
|
|
46
49
|
const siteConfig = this.createSiteConfig(outputDir, locale, urlRewriteMap);
|
|
47
|
-
|
|
50
|
+
// eslint-disable-next-line no-await-in-loop
|
|
51
|
+
await generateUrl(route.path, siteConfig);
|
|
48
52
|
}
|
|
49
53
|
// Generate any additional urls
|
|
50
54
|
if (staticSiteGenerator._additionalRoutePaths) {
|
|
51
55
|
for (const uri of staticSiteGenerator._additionalRoutePaths) {
|
|
52
56
|
const siteConfig = this.createSiteConfig(outputDir, locale, urlRewriteMap);
|
|
53
|
-
|
|
57
|
+
// eslint-disable-next-line no-await-in-loop
|
|
58
|
+
await generateUrl(uri, siteConfig);
|
|
54
59
|
}
|
|
55
60
|
}
|
|
56
61
|
}
|
|
57
|
-
// -- Dispatch routes
|
|
58
|
-
await Promise.all(dispatchRequests);
|
|
59
62
|
}
|
|
60
63
|
/**
|
|
61
64
|
* Creates a function to dispatch the root requests for a given view url
|
|
@@ -336,9 +339,6 @@ export default class SiteGenerator {
|
|
|
336
339
|
'"');
|
|
337
340
|
}
|
|
338
341
|
}
|
|
339
|
-
else {
|
|
340
|
-
console.warn('[WARN] Unable to resolve bare specifier or variable dynamic import: "' + jsUri + '"');
|
|
341
|
-
}
|
|
342
342
|
}
|
|
343
343
|
}
|
|
344
344
|
/**
|
|
@@ -15,7 +15,7 @@ interface ConfigMap {
|
|
|
15
15
|
bootstrap: NormalizedLwrAppBootstrapConfig;
|
|
16
16
|
locker: RequiredLwrLockerConfig;
|
|
17
17
|
}
|
|
18
|
-
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", "resourceProviders", "rootDir", "routes", "serverMode", "serverType", "templateEngine", "viewProviders", "viewTransformers"];
|
|
18
|
+
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", "routes", "serverMode", "serverType", "templateEngine", "viewProviders", "viewTransformers"];
|
|
19
19
|
export declare const ASSET_DIR_ATTRIBUTE_KEYS: ["alias", "dir", "urlPath"];
|
|
20
20
|
export declare const ASSET_FILE_ATTRIBUTE_KEYS: ["alias", "file", "urlPath"];
|
|
21
21
|
export declare const LOCKER_ATTRIBUTE_KEYS: ["enabled", "trustedComponents", "clientOnly"];
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
7
|
-
"version": "0.6.
|
|
7
|
+
"version": "0.6.4",
|
|
8
8
|
"homepage": "https://developer.salesforce.com/docs/platform/lwr/overview",
|
|
9
9
|
"repository": {
|
|
10
10
|
"type": "git",
|
|
@@ -33,31 +33,31 @@
|
|
|
33
33
|
"package.cjs"
|
|
34
34
|
],
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@lwrjs/app-service": "0.6.
|
|
37
|
-
"@lwrjs/asset-registry": "0.6.
|
|
38
|
-
"@lwrjs/asset-transformer": "0.6.
|
|
39
|
-
"@lwrjs/base-template-engine": "0.6.
|
|
40
|
-
"@lwrjs/base-view-provider": "0.6.
|
|
41
|
-
"@lwrjs/base-view-transformer": "0.6.
|
|
42
|
-
"@lwrjs/client-modules": "0.6.
|
|
43
|
-
"@lwrjs/compiler": "0.6.
|
|
44
|
-
"@lwrjs/diagnostics": "0.6.
|
|
45
|
-
"@lwrjs/fs-asset-provider": "0.6.
|
|
46
|
-
"@lwrjs/html-view-provider": "0.6.
|
|
47
|
-
"@lwrjs/loader": "0.6.
|
|
48
|
-
"@lwrjs/lwc-module-provider": "0.6.
|
|
49
|
-
"@lwrjs/lwc-ssr": "0.6.
|
|
50
|
-
"@lwrjs/markdown-view-provider": "0.6.
|
|
51
|
-
"@lwrjs/module-bundler": "0.6.
|
|
52
|
-
"@lwrjs/module-registry": "0.6.
|
|
53
|
-
"@lwrjs/npm-module-provider": "0.6.
|
|
54
|
-
"@lwrjs/nunjucks-view-provider": "0.6.
|
|
55
|
-
"@lwrjs/o11y": "0.6.
|
|
56
|
-
"@lwrjs/resource-registry": "0.6.
|
|
57
|
-
"@lwrjs/router": "0.6.
|
|
58
|
-
"@lwrjs/server": "0.6.
|
|
59
|
-
"@lwrjs/shared-utils": "0.6.
|
|
60
|
-
"@lwrjs/view-registry": "0.6.
|
|
36
|
+
"@lwrjs/app-service": "0.6.4",
|
|
37
|
+
"@lwrjs/asset-registry": "0.6.4",
|
|
38
|
+
"@lwrjs/asset-transformer": "0.6.4",
|
|
39
|
+
"@lwrjs/base-template-engine": "0.6.4",
|
|
40
|
+
"@lwrjs/base-view-provider": "0.6.4",
|
|
41
|
+
"@lwrjs/base-view-transformer": "0.6.4",
|
|
42
|
+
"@lwrjs/client-modules": "0.6.4",
|
|
43
|
+
"@lwrjs/compiler": "0.6.4",
|
|
44
|
+
"@lwrjs/diagnostics": "0.6.4",
|
|
45
|
+
"@lwrjs/fs-asset-provider": "0.6.4",
|
|
46
|
+
"@lwrjs/html-view-provider": "0.6.4",
|
|
47
|
+
"@lwrjs/loader": "0.6.4",
|
|
48
|
+
"@lwrjs/lwc-module-provider": "0.6.4",
|
|
49
|
+
"@lwrjs/lwc-ssr": "0.6.4",
|
|
50
|
+
"@lwrjs/markdown-view-provider": "0.6.4",
|
|
51
|
+
"@lwrjs/module-bundler": "0.6.4",
|
|
52
|
+
"@lwrjs/module-registry": "0.6.4",
|
|
53
|
+
"@lwrjs/npm-module-provider": "0.6.4",
|
|
54
|
+
"@lwrjs/nunjucks-view-provider": "0.6.4",
|
|
55
|
+
"@lwrjs/o11y": "0.6.4",
|
|
56
|
+
"@lwrjs/resource-registry": "0.6.4",
|
|
57
|
+
"@lwrjs/router": "0.6.4",
|
|
58
|
+
"@lwrjs/server": "0.6.4",
|
|
59
|
+
"@lwrjs/shared-utils": "0.6.4",
|
|
60
|
+
"@lwrjs/view-registry": "0.6.4",
|
|
61
61
|
"dompurify": "^2.3.0",
|
|
62
62
|
"fs-extra": "^10.0.0",
|
|
63
63
|
"jsdom": "^16.7.0",
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
"qs": "^6.9.4"
|
|
68
68
|
},
|
|
69
69
|
"devDependencies": {
|
|
70
|
-
"@lwrjs/types": "0.6.
|
|
70
|
+
"@lwrjs/types": "0.6.4"
|
|
71
71
|
},
|
|
72
72
|
"peerDependencies": {
|
|
73
73
|
"lwc": ">= 1.x <= 2.x"
|
|
@@ -75,5 +75,5 @@
|
|
|
75
75
|
"engines": {
|
|
76
76
|
"node": ">=14.15.4 <17"
|
|
77
77
|
},
|
|
78
|
-
"gitHead": "
|
|
78
|
+
"gitHead": "80b73fe4558dc3db0afcdbe80eb17f5a1464e34e"
|
|
79
79
|
}
|