@madgex/fert 6.3.3 → 7.0.1
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/bin/cli.js +1 -0
- package/bin/commands/build-tasks/build-templates.js +40 -0
- package/bin/commands/build-tasks/bundle-entry.js +10 -1
- package/bin/commands/build-tasks/create-absolute-manifest.js +34 -0
- package/bin/commands/build.js +6 -0
- package/bin/commands/publish.js +6 -9
- package/bin/utils/get-assets-path.js +44 -0
- package/bin/utils/index.js +1 -4
- package/constants.js +7 -12
- package/package.json +2 -2
- package/shared/Dockerfile.brandingRepoPublish +2 -1
- package/tests/fixtures/manifest.absolute-urls.json +34 -0
- package/tests/fixtures/manifest.json +34 -0
package/bin/cli.js
CHANGED
|
@@ -29,6 +29,7 @@ const run = () => {
|
|
|
29
29
|
.command('build', 'Build project. Can supply a branding directory if running FERT standalone')
|
|
30
30
|
.option('--only <task>', `Only run part of the build [ 'assets', 'tokens']`)
|
|
31
31
|
.option('--config [dir]', 'Use custom rollup config file')
|
|
32
|
+
.option('--target <env>', 'Environment to build for, "dev" or "production"')
|
|
32
33
|
.option('--service-name <serviceName>', '[string] run a single service')
|
|
33
34
|
.action((...args) => serviceCommandBootstrap('build', ...args));
|
|
34
35
|
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// eslint-disable-next-line n/no-unsupported-features/node-builtins
|
|
2
|
+
import { glob } from 'node:fs/promises';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
import { log } from '../../utils/logging.js';
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
|
|
8
|
+
export async function buildTemplates(fertConfig, assetsPath) {
|
|
9
|
+
const { rootDir, serviceName } = fertConfig;
|
|
10
|
+
const templateFiles = await Array.fromAsync(
|
|
11
|
+
glob(`**/${serviceName}/dist/templates/**/*.njk`, {
|
|
12
|
+
cwd: path.resolve(rootDir),
|
|
13
|
+
}),
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
let processedCount = 0;
|
|
17
|
+
|
|
18
|
+
for (const filePath of templateFiles) {
|
|
19
|
+
try {
|
|
20
|
+
const originalContent = fs.readFileSync(filePath, 'utf8');
|
|
21
|
+
// Update paths from `./public`, `/public` or `public` to the `assetsPath`
|
|
22
|
+
// We use positive lookbehind and lookahead to ensure we only match those paths
|
|
23
|
+
// They are preceded by `"`,`'` or `(` and followed by `/` to ensure we're targetting something that looks like a url
|
|
24
|
+
// e.g src="./public/..." or url(/public/...)
|
|
25
|
+
// We also optionally match a leading `./` or `/` to cover all cases
|
|
26
|
+
const updatedContent = originalContent.replaceAll(/(?<=["'(])\.?\/?public(?=\/)/gm, `${assetsPath}`);
|
|
27
|
+
if (originalContent !== updatedContent) {
|
|
28
|
+
fs.writeFileSync(filePath, updatedContent, 'utf8');
|
|
29
|
+
processedCount++;
|
|
30
|
+
}
|
|
31
|
+
} catch (err) {
|
|
32
|
+
log.error(err);
|
|
33
|
+
throw err;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
log.success(
|
|
38
|
+
`${chalk.cyan(`[${fertConfig.serviceName}]`)} updated asset paths in ${processedCount} of ${templateFiles.length} template${templateFiles.length === 1 ? '' : 's'}`,
|
|
39
|
+
);
|
|
40
|
+
}
|
|
@@ -4,6 +4,9 @@ import merge from 'lodash/merge.js';
|
|
|
4
4
|
import * as vite from 'vite';
|
|
5
5
|
import { buildExternalAssets } from './build-external-assets.js';
|
|
6
6
|
import { log } from '../../utils/logging.js';
|
|
7
|
+
import { getAssetsPath } from '../../utils/get-assets-path.js';
|
|
8
|
+
import { buildTemplates } from './build-templates.js';
|
|
9
|
+
import { createAbsoluteManifest } from './create-absolute-manifest.js';
|
|
7
10
|
|
|
8
11
|
export async function bundleEntry(fertConfig, options = {}) {
|
|
9
12
|
let dynamicOptions = {};
|
|
@@ -17,9 +20,11 @@ export async function bundleEntry(fertConfig, options = {}) {
|
|
|
17
20
|
viteConfig = viteConfigPkg.default;
|
|
18
21
|
}
|
|
19
22
|
|
|
23
|
+
const assetsPath = await getAssetsPath(fertConfig, options.target);
|
|
24
|
+
|
|
20
25
|
dynamicOptions = {
|
|
21
26
|
root: path.resolve(fertConfig.workingDir),
|
|
22
|
-
base:
|
|
27
|
+
base: assetsPath.href,
|
|
23
28
|
build: {
|
|
24
29
|
cssCodeSplit: false, // important: to get a single, style.css file output
|
|
25
30
|
outDir: path.resolve(fertConfig.workingDir, 'dist'),
|
|
@@ -33,6 +38,10 @@ export async function bundleEntry(fertConfig, options = {}) {
|
|
|
33
38
|
|
|
34
39
|
await vite.build(viteConfig);
|
|
35
40
|
|
|
41
|
+
createAbsoluteManifest(fertConfig.workingDir, assetsPath.href);
|
|
42
|
+
|
|
43
|
+
await buildTemplates(fertConfig, assetsPath.href);
|
|
44
|
+
|
|
36
45
|
await buildExternalAssets(fertConfig);
|
|
37
46
|
|
|
38
47
|
log.success('Assets built.');
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import { log } from '../../utils/logging.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Writes a new file based on Vite's `manifest.json`, but re-write the file paths to be absolute URLs pointing using `assetsPath`.
|
|
7
|
+
*
|
|
8
|
+
* @param {string} workingDir
|
|
9
|
+
* @param {string} assetsPath absolute URL to prefix all file paths in manifest
|
|
10
|
+
*/
|
|
11
|
+
export function createAbsoluteManifest(workingDir, assetsPath) {
|
|
12
|
+
const distDir = path.resolve(workingDir, './dist/');
|
|
13
|
+
|
|
14
|
+
if (!fs.existsSync(path.resolve(distDir, 'manifest.json'))) return;
|
|
15
|
+
|
|
16
|
+
const originalManifest = JSON.parse(fs.readFileSync(path.resolve(distDir, 'manifest.json'), 'utf8'));
|
|
17
|
+
|
|
18
|
+
for (const key in originalManifest) {
|
|
19
|
+
const entry = originalManifest[key];
|
|
20
|
+
|
|
21
|
+
// Update asset path to use asset-relay url
|
|
22
|
+
if (entry.file) {
|
|
23
|
+
entry.file = `${assetsPath}/${entry.file}`;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
fs.writeFileSync(
|
|
28
|
+
path.resolve(distDir, 'manifest.absolute-urls.json'),
|
|
29
|
+
JSON.stringify(originalManifest, null, 2),
|
|
30
|
+
'utf8',
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
log.success('manifest.absolute-urls.json created');
|
|
34
|
+
}
|
package/bin/commands/build.js
CHANGED
|
@@ -11,6 +11,12 @@ export { bundleEntry, buildExternalAssets };
|
|
|
11
11
|
|
|
12
12
|
export async function build(options = {}) {
|
|
13
13
|
const fertConfig = await resolveConfig(options);
|
|
14
|
+
const validTargets = ['dev', 'production'];
|
|
15
|
+
|
|
16
|
+
if (!validTargets.includes(options.target)) {
|
|
17
|
+
throw Error(`Missing or invalid --target option. Choose from [${validTargets}]`);
|
|
18
|
+
}
|
|
19
|
+
|
|
14
20
|
await validateLocalConfigs({
|
|
15
21
|
workingDir: fertConfig.rootDir,
|
|
16
22
|
clientPropertyId: fertConfig.clientPropertyId,
|
package/bin/commands/publish.js
CHANGED
|
@@ -6,13 +6,13 @@ import { log } from '../utils/logging.js';
|
|
|
6
6
|
import { getAwsParam } from './publish-tasks/get-aws-parameter.js';
|
|
7
7
|
import { AssetStoreUploader } from './publish-tasks/asset-store-uploader.js';
|
|
8
8
|
import { getCloudFrontDistributionsForDomain } from '../utils/lookup-cf-distribution-ids.js';
|
|
9
|
+
import { getAssetsPath } from '../utils/get-assets-path.js';
|
|
9
10
|
import {
|
|
10
11
|
ASSET_STORE_API,
|
|
11
12
|
AWS_PARAM_NAME,
|
|
12
13
|
REMOTE_UPLOAD_BASE,
|
|
13
14
|
UPLOAD_DIR,
|
|
14
15
|
ASSET_STORE_INVALIDATION_PATH,
|
|
15
|
-
BRANDED_SITE_INVALIDATION_PATH,
|
|
16
16
|
} from '../../constants.js';
|
|
17
17
|
|
|
18
18
|
export async function publish(options) {
|
|
@@ -34,22 +34,19 @@ export async function publish(options) {
|
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
const templateCtx = {
|
|
37
|
-
env: options.target
|
|
38
|
-
Environment_Name: options.target,
|
|
37
|
+
env: options.target,
|
|
39
38
|
fertConfig,
|
|
40
39
|
};
|
|
41
40
|
|
|
42
41
|
const localDir = path.resolve(fertConfig.workingDir, UPLOAD_DIR);
|
|
43
|
-
const apiUrl = Hoek.reachTemplate(templateCtx, ASSET_STORE_API);
|
|
44
42
|
const remoteBasePath = Hoek.reachTemplate(templateCtx, REMOTE_UPLOAD_BASE);
|
|
45
43
|
const apiKeyParamPath = Hoek.reachTemplate(templateCtx, AWS_PARAM_NAME);
|
|
46
44
|
const assetStoreInvPath = Hoek.reachTemplate(templateCtx, ASSET_STORE_INVALIDATION_PATH);
|
|
47
|
-
const brandedSiteInvPath = Hoek.reachTemplate(templateCtx, BRANDED_SITE_INVALIDATION_PATH);
|
|
48
45
|
|
|
49
46
|
const apiKey = await getAwsParam(apiKeyParamPath);
|
|
50
47
|
|
|
51
|
-
const
|
|
52
|
-
const clientCloudFrontDists = await getCloudFrontDistributionsForDomain(
|
|
48
|
+
const assetsPath = await getAssetsPath(fertConfig, options.target);
|
|
49
|
+
const clientCloudFrontDists = await getCloudFrontDistributionsForDomain(assetsPath.hostname, options);
|
|
53
50
|
|
|
54
51
|
log.info(
|
|
55
52
|
`\nPublishing ${chalk.cyan(localDir)} to ${chalk.green.bold(
|
|
@@ -60,7 +57,7 @@ export async function publish(options) {
|
|
|
60
57
|
try {
|
|
61
58
|
// send to S3 using the Asset Store API
|
|
62
59
|
const assetStore = new AssetStoreUploader({
|
|
63
|
-
apiUrl,
|
|
60
|
+
apiUrl: ASSET_STORE_API,
|
|
64
61
|
apiKey,
|
|
65
62
|
basePath: remoteBasePath,
|
|
66
63
|
});
|
|
@@ -76,7 +73,7 @@ export async function publish(options) {
|
|
|
76
73
|
await assetStore.invalidatePaths([assetStoreInvPath]);
|
|
77
74
|
|
|
78
75
|
for (let dist of clientCloudFrontDists) {
|
|
79
|
-
await assetStore.invalidatePaths([
|
|
76
|
+
await assetStore.invalidatePaths([`${assetsPath.pathname}/*`], dist.id);
|
|
80
77
|
}
|
|
81
78
|
|
|
82
79
|
log.info(`\nNote cloudfront invalidations may take upto ${chalk.yellow('30 seconds')} to complete.\n`);
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { ASSET_RELAY_API } from '../../constants.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* fetch the Absolute URL `publicUrl` from asset-relay API, for current client & service
|
|
5
|
+
*
|
|
6
|
+
* @param {object} fertConfig
|
|
7
|
+
* @param {object} environment
|
|
8
|
+
* @returns {URL} Absoloute Public URL for assets
|
|
9
|
+
*/
|
|
10
|
+
export async function getAssetsPath(fertConfig, environment) {
|
|
11
|
+
const { clientPropertyId, serviceName, client, config } = fertConfig;
|
|
12
|
+
|
|
13
|
+
// Try to get existing mapping
|
|
14
|
+
const getUrl = new URL(ASSET_RELAY_API);
|
|
15
|
+
getUrl.searchParams.set('clientPropertyId', clientPropertyId);
|
|
16
|
+
getUrl.searchParams.set('serviceName', serviceName);
|
|
17
|
+
|
|
18
|
+
let response = await fetch(getUrl);
|
|
19
|
+
|
|
20
|
+
// Create mapping if it doesn't exist
|
|
21
|
+
if (!response.ok) {
|
|
22
|
+
response = await fetch(ASSET_RELAY_API, {
|
|
23
|
+
method: 'POST',
|
|
24
|
+
headers: { 'Content-Type': 'application/json' },
|
|
25
|
+
body: JSON.stringify({
|
|
26
|
+
clientPropertyId,
|
|
27
|
+
rootClientPropertyId: client.rootClientPropertyId,
|
|
28
|
+
serviceName,
|
|
29
|
+
siteName: config.SiteName,
|
|
30
|
+
}),
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
if (!response.ok) {
|
|
34
|
+
throw new Error(`Failed to create asset path mapping: ${response.status}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const data = await response.json();
|
|
39
|
+
const { publicUrl } = Array.isArray(data) ? data[0] : data;
|
|
40
|
+
|
|
41
|
+
// TODO: temporarily removing environment for production until all repos are on new version
|
|
42
|
+
// return new URL(`${publicUrl}/${environment}`);
|
|
43
|
+
return new URL(`${publicUrl}${environment === 'dev' ? '/dev' : ''}`);
|
|
44
|
+
}
|
package/bin/utils/index.js
CHANGED
|
@@ -89,10 +89,7 @@ export async function resolveConfig(options = {}) {
|
|
|
89
89
|
|
|
90
90
|
fertConfig.externalAssets = resolveExternalAssets(fertConfig.externalAssets);
|
|
91
91
|
|
|
92
|
-
fertConfig.config = await getConfig(fertConfig.clientPropertyId, [
|
|
93
|
-
'JobseekerSiteWebSitePath',
|
|
94
|
-
// 'SiteName',
|
|
95
|
-
]);
|
|
92
|
+
fertConfig.config = await getConfig(fertConfig.clientPropertyId, ['JobseekerSiteWebSitePath', 'SiteName']);
|
|
96
93
|
|
|
97
94
|
return {
|
|
98
95
|
...fertConfig,
|
package/constants.js
CHANGED
|
@@ -24,7 +24,7 @@ export const ASSETS_API_URL = 'https://asset-store.job.madgexhosting.net';
|
|
|
24
24
|
export const BRAND_JSON_FILENAME = 'brand.json';
|
|
25
25
|
export const FERT_CONFIG_FILENAME = 'fert.config.js';
|
|
26
26
|
export const FERT_SERVICE_CONFIG_FILENAME = 'fert.service.config.js';
|
|
27
|
-
export const ASSET_STORE_API = 'https://asset-store-api.
|
|
27
|
+
export const ASSET_STORE_API = 'https://asset-store-api.job.madgexhosting.net/';
|
|
28
28
|
export const UPLOAD_DIR = 'dist';
|
|
29
29
|
/**
|
|
30
30
|
* use `jobseekers-frontend` AWS keys for asset-store access, even for all services (e.g. recruiterservices-frontend).
|
|
@@ -32,24 +32,17 @@ export const UPLOAD_DIR = 'dist';
|
|
|
32
32
|
* Possibly one to refactor in the future.
|
|
33
33
|
* */
|
|
34
34
|
export const AWS_PARAM_NAME =
|
|
35
|
-
'/
|
|
35
|
+
'/production/jobboard/kong/internal/consumer-key/jobseekers-frontend_{fertConfig.client.rootClientPropertyId}';
|
|
36
36
|
/**
|
|
37
37
|
* important to have the correct service name and cpid so assets are uploaded to the correct unique place per-service.
|
|
38
38
|
*/
|
|
39
|
-
export const REMOTE_UPLOAD_BASE = '/api/assets/{fertConfig.serviceName}/{fertConfig.clientPropertyId}';
|
|
39
|
+
export const REMOTE_UPLOAD_BASE = '/api/assets/{fertConfig.serviceName}/{fertConfig.clientPropertyId}/{env}';
|
|
40
40
|
/**
|
|
41
41
|
* invalidates the real asset store key path, which is related to `REMOTE_UPLOAD_BASE`
|
|
42
42
|
* asset-store puts things in `rootClientPropertyId` based on the AWS_PARAM_NAME used, and the rest of the path relates to `REMOTE_UPLOAD_BASE`
|
|
43
43
|
*/
|
|
44
|
-
export const ASSET_STORE_INVALIDATION_PATH = `/{fertConfig.client.rootClientPropertyId}/{fertConfig.serviceName}/{fertConfig.clientPropertyId}/*`;
|
|
45
|
-
|
|
46
|
-
* cloud backend cache busting for updated assets.
|
|
47
|
-
* assumption that assets are accessed on each service via a similar root.
|
|
48
|
-
* e.g.
|
|
49
|
-
* www.bigworkbag.com/_/jobseekers-frontend/assets/my-asset.png
|
|
50
|
-
* recruiter.bigworkbag.com/_/recruiterservices-frontend/assets/my-asset.png
|
|
51
|
-
*/
|
|
52
|
-
export const BRANDED_SITE_INVALIDATION_PATH = `/_/{fertConfig.serviceName}/assets/*`;
|
|
44
|
+
export const ASSET_STORE_INVALIDATION_PATH = `/{fertConfig.client.rootClientPropertyId}/{fertConfig.serviceName}/{fertConfig.clientPropertyId}/{env}/*`;
|
|
45
|
+
|
|
53
46
|
export const ASSET_STORE_USER_GUID = 'a386d4b6-f2df-4b80-ad1f-0349e23f530b';
|
|
54
47
|
|
|
55
48
|
export const CONFIG_API =
|
|
@@ -94,3 +87,5 @@ export const MOCK_AUTH_OBJECT = {
|
|
|
94
87
|
},
|
|
95
88
|
},
|
|
96
89
|
};
|
|
90
|
+
|
|
91
|
+
export const ASSET_RELAY_API = 'https://asset-relay.job.madgexhosting.net/api/v1/clients';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@madgex/fert",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "7.0.1",
|
|
4
4
|
"description": "Tool to help build the V6 branding",
|
|
5
5
|
"bin": {
|
|
6
6
|
"fert": "./bin/cli.js"
|
|
@@ -31,8 +31,8 @@
|
|
|
31
31
|
"@hapi/inert": "^7.1.0",
|
|
32
32
|
"@hapi/vision": "^7.0.3",
|
|
33
33
|
"@hapipal/toys": "^4.0.0",
|
|
34
|
-
"@madgex/design-system": "^10.1.2",
|
|
35
34
|
"@madgex/config-api-sdk": "^1.11.0",
|
|
35
|
+
"@madgex/design-system": "^10.1.2",
|
|
36
36
|
"@private/header-footer-podlet-server": "github:wiley/madgex-header-footer-podlet",
|
|
37
37
|
"axios": "^1.11.0",
|
|
38
38
|
"cac": "^6.7.14",
|
|
@@ -5,6 +5,7 @@ ENV HOME=/app/
|
|
|
5
5
|
ARG NPM_TOKEN
|
|
6
6
|
ARG GIT_USERNAME
|
|
7
7
|
ARG GIT_PASSWORD
|
|
8
|
+
ARG ENVIRONMENT
|
|
8
9
|
|
|
9
10
|
RUN apk add git
|
|
10
11
|
|
|
@@ -25,4 +26,4 @@ RUN echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" > .npmrc && \
|
|
|
25
26
|
npm install && \
|
|
26
27
|
rm -f .npmrc
|
|
27
28
|
|
|
28
|
-
RUN npm run build
|
|
29
|
+
RUN npm run build --target=${ENVIRONMENT}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"public/fonts/mdgx-icons.eot": {
|
|
3
|
+
"file": "https://asset-relay.madgexjb.com/big-work-bag-6tORXNlh/assets/mdgx-icons-nszT880f.eot",
|
|
4
|
+
"src": "public/fonts/mdgx-icons.eot"
|
|
5
|
+
},
|
|
6
|
+
"public/fonts/mdgx-icons.svg": {
|
|
7
|
+
"file": "https://asset-relay.madgexjb.com/big-work-bag-6tORXNlh/assets/mdgx-icons-CLXOai0m.svg",
|
|
8
|
+
"src": "public/fonts/mdgx-icons.svg"
|
|
9
|
+
},
|
|
10
|
+
"public/fonts/mdgx-icons.ttf": {
|
|
11
|
+
"file": "https://asset-relay.madgexjb.com/big-work-bag-6tORXNlh/assets/mdgx-icons-dLFZ0BjQ.ttf",
|
|
12
|
+
"src": "public/fonts/mdgx-icons.ttf"
|
|
13
|
+
},
|
|
14
|
+
"public/fonts/mdgx-icons.woff": {
|
|
15
|
+
"file": "https://asset-relay.madgexjb.com/big-work-bag-6tORXNlh/assets/mdgx-icons-CmuOtNp9.woff",
|
|
16
|
+
"src": "public/fonts/mdgx-icons.woff"
|
|
17
|
+
},
|
|
18
|
+
"src/index.js": {
|
|
19
|
+
"file": "https://asset-relay.madgexjb.com/big-work-bag-6tORXNlh/assets/index-PBIhszZ7.js",
|
|
20
|
+
"name": "index",
|
|
21
|
+
"src": "src/index.js",
|
|
22
|
+
"isEntry": true,
|
|
23
|
+
"assets": [
|
|
24
|
+
"assets/mdgx-icons-nszT880f.eot",
|
|
25
|
+
"assets/mdgx-icons-CmuOtNp9.woff",
|
|
26
|
+
"assets/mdgx-icons-dLFZ0BjQ.ttf",
|
|
27
|
+
"assets/mdgx-icons-CLXOai0m.svg"
|
|
28
|
+
]
|
|
29
|
+
},
|
|
30
|
+
"style.css": {
|
|
31
|
+
"file": "https://asset-relay.madgexjb.com/big-work-bag-6tORXNlh/assets/style-BzoEQQhI.css",
|
|
32
|
+
"src": "style.css"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"public/fonts/mdgx-icons.eot": {
|
|
3
|
+
"file": "assets/mdgx-icons-nszT880f.eot",
|
|
4
|
+
"src": "public/fonts/mdgx-icons.eot"
|
|
5
|
+
},
|
|
6
|
+
"public/fonts/mdgx-icons.svg": {
|
|
7
|
+
"file": "assets/mdgx-icons-CLXOai0m.svg",
|
|
8
|
+
"src": "public/fonts/mdgx-icons.svg"
|
|
9
|
+
},
|
|
10
|
+
"public/fonts/mdgx-icons.ttf": {
|
|
11
|
+
"file": "assets/mdgx-icons-dLFZ0BjQ.ttf",
|
|
12
|
+
"src": "public/fonts/mdgx-icons.ttf"
|
|
13
|
+
},
|
|
14
|
+
"public/fonts/mdgx-icons.woff": {
|
|
15
|
+
"file": "assets/mdgx-icons-CmuOtNp9.woff",
|
|
16
|
+
"src": "public/fonts/mdgx-icons.woff"
|
|
17
|
+
},
|
|
18
|
+
"src/index.js": {
|
|
19
|
+
"file": "assets/index-PBIhszZ7.js",
|
|
20
|
+
"name": "index",
|
|
21
|
+
"src": "src/index.js",
|
|
22
|
+
"isEntry": true,
|
|
23
|
+
"assets": [
|
|
24
|
+
"assets/mdgx-icons-nszT880f.eot",
|
|
25
|
+
"assets/mdgx-icons-CmuOtNp9.woff",
|
|
26
|
+
"assets/mdgx-icons-dLFZ0BjQ.ttf",
|
|
27
|
+
"assets/mdgx-icons-CLXOai0m.svg"
|
|
28
|
+
]
|
|
29
|
+
},
|
|
30
|
+
"style.css": {
|
|
31
|
+
"file": "assets/style-BzoEQQhI.css",
|
|
32
|
+
"src": "style.css"
|
|
33
|
+
}
|
|
34
|
+
}
|