@griddo/cx 11.9.12-rc.0 → 11.9.13
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/README.md +240 -13
- package/build/adapters/gatsby/index.d.ts +4 -0
- package/build/adapters/gatsby/utils.d.ts +26 -0
- package/build/artifacts/index.d.ts +6 -0
- package/build/commands/end-render.d.ts +1 -0
- package/build/commands/reset-render.d.ts +1 -0
- package/build/commands/start-render.d.ts +1 -0
- package/build/commands/upload-search-content.d.ts +1 -0
- package/build/constants/envs.d.ts +37 -0
- package/build/constants/index.d.ts +57 -0
- package/build/end-render.js +74 -0
- package/build/end-render.js.map +7 -0
- package/build/{shared/errors.d.ts → errors/errors-data.d.ts} +3 -5
- package/build/errors/index.d.ts +15 -0
- package/build/index.d.ts +29 -10
- package/build/index.js +73 -406
- package/build/index.js.map +7 -0
- package/build/prepare-domains-render.js +73 -0
- package/build/prepare-domains-render.js.map +7 -0
- package/build/react/Favicon/index.d.ts +5 -0
- package/build/react/GriddoIntegrations/index.d.ts +4 -3
- package/build/react/GriddoIntegrations/utils.d.ts +6 -7
- package/build/react/index.d.ts +2 -3
- package/build/react/index.js +3 -1
- package/build/registers/api.d.ts +9 -0
- package/build/registers/gatsby.d.ts +9 -0
- package/build/registers/index.d.ts +3 -0
- package/build/reset-render.js +74 -0
- package/build/reset-render.js.map +7 -0
- package/build/services/auth.d.ts +5 -2
- package/build/services/domains.d.ts +4 -3
- package/build/services/navigation.d.ts +16 -16
- package/build/services/reference-fields.d.ts +3 -3
- package/build/services/register.d.ts +36 -0
- package/build/services/robots.d.ts +19 -2
- package/build/services/settings.d.ts +4 -0
- package/build/services/sites.d.ts +5 -8
- package/build/services/store.d.ts +1 -10
- package/build/start-render.js +100 -0
- package/build/start-render.js.map +7 -0
- package/build/{shared/types → types}/api.d.ts +18 -18
- package/build/{shared/types → types}/global.d.ts +16 -15
- package/build/{shared/types → types}/navigation.d.ts +5 -5
- package/build/{shared/types → types}/pages.d.ts +9 -9
- package/build/{shared/types → types}/sites.d.ts +19 -18
- package/build/upload-search-content.js +74 -0
- package/build/upload-search-content.js.map +7 -0
- package/build/utils/alerts.d.ts +3 -0
- package/build/{services → utils}/api.d.ts +1 -1
- package/build/utils/cache.d.ts +35 -0
- package/build/utils/core-utils.d.ts +107 -0
- package/build/utils/create-build-data.d.ts +8 -0
- package/build/utils/domains.d.ts +13 -0
- package/build/utils/folders.d.ts +53 -0
- package/build/{core/check-env-health.d.ts → utils/health-checks.d.ts} +2 -4
- package/build/utils/loggin.d.ts +51 -0
- package/build/{services → utils}/pages.d.ts +3 -3
- package/build/utils/render.d.ts +13 -0
- package/build/utils/searches.d.ts +15 -0
- package/build/utils/sites.d.ts +31 -0
- package/build/utils/store.d.ts +81 -0
- package/cx.config.d.ts +5 -0
- package/cx.config.js +36 -0
- package/exporter/adapters/gatsby/index.ts +182 -0
- package/exporter/adapters/gatsby/utils.ts +186 -0
- package/exporter/artifacts/README.md +34 -0
- package/exporter/artifacts/index.ts +33 -0
- package/exporter/build.sh +24 -16
- package/exporter/commands/end-render.ts +86 -65
- package/exporter/commands/move-assets.ts +11 -0
- package/exporter/commands/prepare-domains-render.ts +35 -132
- package/exporter/commands/reset-render.ts +8 -13
- package/exporter/commands/start-render.ts +64 -26
- package/exporter/commands/upload-search-content.ts +26 -204
- package/exporter/{shared → constants}/endpoints.ts +11 -12
- package/exporter/constants/envs.ts +94 -0
- package/exporter/constants/index.ts +129 -0
- package/exporter/{shared/errors.ts → errors/errors-data.ts} +14 -24
- package/exporter/errors/index.ts +40 -0
- package/exporter/index.ts +56 -14
- package/exporter/react/{GriddoFavicon → Favicon}/index.tsx +9 -3
- package/exporter/react/GriddoIntegrations/index.tsx +23 -17
- package/exporter/react/GriddoIntegrations/utils.ts +12 -24
- package/exporter/react/index.tsx +9 -3
- package/exporter/registers/api.ts +14 -0
- package/exporter/registers/gatsby.ts +14 -0
- package/exporter/registers/index.ts +4 -0
- package/exporter/services/auth.ts +10 -8
- package/exporter/services/domains.ts +8 -23
- package/exporter/services/navigation.ts +18 -12
- package/exporter/services/reference-fields.ts +32 -14
- package/exporter/services/register.ts +113 -0
- package/exporter/services/robots.ts +61 -33
- package/exporter/services/settings.ts +17 -0
- package/exporter/services/sites.ts +28 -40
- package/exporter/services/store.ts +321 -354
- package/exporter/{shared/types → types}/api.ts +41 -40
- package/exporter/{shared/types → types}/global.ts +21 -17
- package/exporter/{shared/types → types}/navigation.ts +3 -3
- package/exporter/{shared/types → types}/pages.ts +11 -10
- package/exporter/{shared/types → types}/sites.ts +19 -18
- package/exporter/utils/alerts.ts +29 -0
- package/exporter/utils/api.ts +243 -0
- package/exporter/utils/cache.ts +142 -0
- package/exporter/utils/core-utils.ts +458 -0
- package/exporter/utils/create-build-data.ts +17 -0
- package/exporter/utils/domains.ts +39 -0
- package/exporter/utils/folders.ts +320 -0
- package/exporter/utils/health-checks.ts +64 -0
- package/exporter/{core → utils}/images.ts +6 -1
- package/exporter/{core → utils}/instance.ts +13 -9
- package/exporter/utils/loggin.ts +184 -0
- package/exporter/{services → utils}/pages.ts +92 -27
- package/exporter/utils/render.ts +71 -0
- package/exporter/utils/searches.ts +156 -0
- package/exporter/utils/sites.ts +312 -0
- package/exporter/utils/store.ts +314 -0
- package/gatsby-browser.tsx +58 -41
- package/gatsby-config.ts +17 -10
- package/gatsby-node.ts +79 -20
- package/gatsby-ssr.tsx +1 -2
- package/package.json +80 -41
- package/src/README.md +7 -0
- package/src/components/Head.tsx +73 -28
- package/src/components/template.tsx +29 -6
- package/src/gatsby-node-utils.ts +2 -76
- package/src/html.tsx +11 -2
- package/src/types.ts +3 -3
- package/start-render.js +7 -0
- package/tsconfig.json +3 -5
- package/build/commands/end-render.js +0 -31
- package/build/commands/end-render.js.map +0 -7
- package/build/commands/prepare-assets-directory.js +0 -9
- package/build/commands/prepare-assets-directory.js.map +0 -7
- package/build/commands/prepare-domains-render.js +0 -38
- package/build/commands/prepare-domains-render.js.map +0 -7
- package/build/commands/reset-render.js +0 -31
- package/build/commands/reset-render.js.map +0 -7
- package/build/commands/single-domain-upload-search-content.d.ts +0 -1
- package/build/commands/start-render.js +0 -66
- package/build/commands/start-render.js.map +0 -7
- package/build/commands/upload-search-content.js +0 -32
- package/build/commands/upload-search-content.js.map +0 -7
- package/build/core/GriddoLog.d.ts +0 -16
- package/build/core/db-class.d.ts +0 -11
- package/build/core/db.d.ts +0 -4
- package/build/core/dist-rollback.d.ts +0 -11
- package/build/core/errors.d.ts +0 -26
- package/build/core/fs.d.ts +0 -69
- package/build/core/life-cycle.d.ts +0 -26
- package/build/core/logger.d.ts +0 -18
- package/build/core/objects.d.ts +0 -11
- package/build/core/print-logos.d.ts +0 -5
- package/build/react/DynamicScript/index.d.ts +0 -4
- package/build/react/GriddoFavicon/index.d.ts +0 -4
- package/build/react/GriddoOpenGraph/index.d.ts +0 -10
- package/build/services/manage-sites.d.ts +0 -22
- package/build/services/manage-store.d.ts +0 -32
- package/build/services/render-artifacts.d.ts +0 -6
- package/build/services/render.d.ts +0 -70
- package/build/services/sitemaps.d.ts +0 -5
- package/build/shared/context.d.ts +0 -36
- package/build/shared/envs.d.ts +0 -19
- package/build/shared/npm-modules/brush.d.ts +0 -18
- package/build/shared/npm-modules/find-up-simple.d.ts +0 -34
- package/build/shared/npm-modules/pkg-dir.d.ts +0 -7
- package/build/shared/npm-modules/xml-parser.d.ts +0 -4
- package/build/shared/types/render.d.ts +0 -54
- package/build/shared/types.d.ts +0 -15
- package/build/ssg-adapters/gatsby/actions/clean.d.ts +0 -3
- package/build/ssg-adapters/gatsby/actions/close.d.ts +0 -3
- package/build/ssg-adapters/gatsby/actions/data.d.ts +0 -2
- package/build/ssg-adapters/gatsby/actions/healthCheck.d.ts +0 -2
- package/build/ssg-adapters/gatsby/actions/init.d.ts +0 -2
- package/build/ssg-adapters/gatsby/actions/logs.d.ts +0 -3
- package/build/ssg-adapters/gatsby/actions/meta.d.ts +0 -2
- package/build/ssg-adapters/gatsby/actions/prepare.d.ts +0 -2
- package/build/ssg-adapters/gatsby/actions/relocation.d.ts +0 -2
- package/build/ssg-adapters/gatsby/actions/restore.d.ts +0 -3
- package/build/ssg-adapters/gatsby/actions/ssg.d.ts +0 -3
- package/build/ssg-adapters/gatsby/actions/sync.d.ts +0 -3
- package/build/ssg-adapters/gatsby/index.d.ts +0 -9
- package/build/ssg-adapters/gatsby/shared/artifacts.d.ts +0 -4
- package/build/ssg-adapters/gatsby/shared/diff-assets.d.ts +0 -15
- package/build/ssg-adapters/gatsby/shared/extract-assets.d.ts +0 -7
- package/build/ssg-adapters/gatsby/shared/gatsby-build.d.ts +0 -7
- package/build/ssg-adapters/gatsby/shared/render-rollback.d.ts +0 -18
- package/build/ssg-adapters/gatsby/shared/sync-render.d.ts +0 -26
- package/build/ssg-adapters/gatsby/shared/types.d.ts +0 -34
- package/cli.mjs +0 -231
- package/exporter/build-esbuild.noop +0 -42
- package/exporter/commands/README.md +0 -151
- package/exporter/commands/prepare-assets-directory.ts +0 -35
- package/exporter/commands/single-domain-upload-search-content.ts +0 -206
- package/exporter/core/GriddoLog.ts +0 -45
- package/exporter/core/check-env-health.ts +0 -204
- package/exporter/core/db-class.ts +0 -54
- package/exporter/core/db.ts +0 -33
- package/exporter/core/dist-rollback.ts +0 -49
- package/exporter/core/errors.ts +0 -93
- package/exporter/core/fs.ts +0 -385
- package/exporter/core/life-cycle.ts +0 -73
- package/exporter/core/logger.ts +0 -141
- package/exporter/core/objects.ts +0 -37
- package/exporter/core/print-logos.ts +0 -21
- package/exporter/react/DynamicScript/index.tsx +0 -33
- package/exporter/react/GriddoOpenGraph/index.tsx +0 -39
- package/exporter/services/api.ts +0 -306
- package/exporter/services/manage-sites.ts +0 -116
- package/exporter/services/manage-store.ts +0 -173
- package/exporter/services/render-artifacts.ts +0 -44
- package/exporter/services/render.ts +0 -229
- package/exporter/services/sitemaps.ts +0 -129
- package/exporter/shared/context.ts +0 -49
- package/exporter/shared/envs.ts +0 -62
- package/exporter/shared/npm-modules/README.md +0 -36
- package/exporter/shared/npm-modules/brush.ts +0 -34
- package/exporter/shared/npm-modules/find-up-simple.ts +0 -100
- package/exporter/shared/npm-modules/pkg-dir.ts +0 -17
- package/exporter/shared/npm-modules/xml-parser.ts +0 -57
- package/exporter/shared/types/render.ts +0 -63
- package/exporter/shared/types.ts +0 -15
- package/exporter/ssg-adapters/gatsby/actions/clean.ts +0 -26
- package/exporter/ssg-adapters/gatsby/actions/close.ts +0 -17
- package/exporter/ssg-adapters/gatsby/actions/data.ts +0 -22
- package/exporter/ssg-adapters/gatsby/actions/healthCheck.ts +0 -10
- package/exporter/ssg-adapters/gatsby/actions/init.ts +0 -12
- package/exporter/ssg-adapters/gatsby/actions/logs.ts +0 -10
- package/exporter/ssg-adapters/gatsby/actions/meta.ts +0 -13
- package/exporter/ssg-adapters/gatsby/actions/prepare.ts +0 -9
- package/exporter/ssg-adapters/gatsby/actions/relocation.ts +0 -15
- package/exporter/ssg-adapters/gatsby/actions/restore.ts +0 -21
- package/exporter/ssg-adapters/gatsby/actions/ssg.ts +0 -12
- package/exporter/ssg-adapters/gatsby/actions/sync.ts +0 -65
- package/exporter/ssg-adapters/gatsby/index.ts +0 -114
- package/exporter/ssg-adapters/gatsby/shared/artifacts.ts +0 -17
- package/exporter/ssg-adapters/gatsby/shared/diff-assets.ts +0 -128
- package/exporter/ssg-adapters/gatsby/shared/extract-assets.ts +0 -75
- package/exporter/ssg-adapters/gatsby/shared/gatsby-build.ts +0 -58
- package/exporter/ssg-adapters/gatsby/shared/render-rollback.ts +0 -33
- package/exporter/ssg-adapters/gatsby/shared/sync-render.ts +0 -298
- package/exporter/ssg-adapters/gatsby/shared/types.ts +0 -35
- package/plugins/gatsby-plugin-svgr-loader/gatsby-node.js +0 -55
- package/plugins/gatsby-plugin-svgr-loader/package.json +0 -8
- package/tsconfig.commands.json +0 -36
- package/tsconfig.exporter.json +0 -21
- /package/build/commands/{prepare-assets-directory.d.ts → move-assets.d.ts} +0 -0
- /package/build/{shared → constants}/endpoints.d.ts +0 -0
- /package/build/react/{GriddoFavicon → Favicon}/utils.d.ts +0 -0
- /package/build/{shared/types → types}/templates.d.ts +0 -0
- /package/build/{core → utils}/images.d.ts +0 -0
- /package/build/{core → utils}/instance.d.ts +0 -0
- /package/exporter/react/{GriddoFavicon → Favicon}/utils.ts +0 -0
- /package/exporter/{shared/types → types}/templates.ts +0 -0
package/gatsby-browser.tsx
CHANGED
|
@@ -2,6 +2,7 @@ import type { GatsbyBrowser } from "gatsby";
|
|
|
2
2
|
|
|
3
3
|
import { SessionProvider } from "@griddo/core";
|
|
4
4
|
import { browser } from "@griddo-instance";
|
|
5
|
+
import * as React from "react";
|
|
5
6
|
|
|
6
7
|
export const disableCorePrefetching = () => {
|
|
7
8
|
if (browser.disableCorePrefetching) {
|
|
@@ -21,7 +22,9 @@ export const onInitialClientRender = () => {
|
|
|
21
22
|
}
|
|
22
23
|
};
|
|
23
24
|
|
|
24
|
-
export const onPostPrefetchPathname: GatsbyBrowser["onPostPrefetchPathname"] = (
|
|
25
|
+
export const onPostPrefetchPathname: GatsbyBrowser["onPostPrefetchPathname"] = (
|
|
26
|
+
props,
|
|
27
|
+
) => {
|
|
25
28
|
if (browser.onPostPrefetchPathname) {
|
|
26
29
|
browser.onPostPrefetchPathname(props);
|
|
27
30
|
}
|
|
@@ -33,61 +36,75 @@ export const onPreRouteUpdate: GatsbyBrowser["onPreRouteUpdate"] = (props) => {
|
|
|
33
36
|
}
|
|
34
37
|
};
|
|
35
38
|
|
|
36
|
-
export const onPrefetchPathname: GatsbyBrowser["onPrefetchPathname"] = (
|
|
39
|
+
export const onPrefetchPathname: GatsbyBrowser["onPrefetchPathname"] = (
|
|
40
|
+
props,
|
|
41
|
+
) => {
|
|
37
42
|
if (browser.onPrefetchPathname) {
|
|
38
43
|
browser.onPrefetchPathname(props);
|
|
39
44
|
}
|
|
40
45
|
};
|
|
41
46
|
|
|
42
|
-
export const onRouteUpdateDelayed: GatsbyBrowser["onRouteUpdateDelayed"] = (
|
|
47
|
+
export const onRouteUpdateDelayed: GatsbyBrowser["onRouteUpdateDelayed"] = (
|
|
48
|
+
props,
|
|
49
|
+
) => {
|
|
43
50
|
if (browser.onServiceWorkerActive) {
|
|
44
51
|
browser.onRouteUpdateDelayed(props);
|
|
45
52
|
}
|
|
46
53
|
};
|
|
47
54
|
|
|
48
|
-
export const onServiceWorkerActive: GatsbyBrowser["onServiceWorkerActive"] = (
|
|
55
|
+
export const onServiceWorkerActive: GatsbyBrowser["onServiceWorkerActive"] = (
|
|
56
|
+
props,
|
|
57
|
+
) => {
|
|
49
58
|
if (browser.onServiceWorkerActive) {
|
|
50
59
|
browser.onServiceWorkerActive(props);
|
|
51
60
|
}
|
|
52
61
|
};
|
|
53
62
|
|
|
54
|
-
export const onServiceWorkerInstalled: GatsbyBrowser["onServiceWorkerInstalled"] =
|
|
55
|
-
|
|
56
|
-
browser.onServiceWorkerInstalled
|
|
57
|
-
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
63
|
+
export const onServiceWorkerInstalled: GatsbyBrowser["onServiceWorkerInstalled"] =
|
|
64
|
+
(props) => {
|
|
65
|
+
if (browser.onServiceWorkerInstalled) {
|
|
66
|
+
browser.onServiceWorkerInstalled(props);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
export const onServiceWorkerRedundant: GatsbyBrowser["onServiceWorkerRedundant"] =
|
|
71
|
+
(props) => {
|
|
72
|
+
if (browser.onServiceWorkerRedundant) {
|
|
73
|
+
browser.onServiceWorkerRedundant(props);
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
export const onServiceWorkerUpdateFound: GatsbyBrowser["onServiceWorkerUpdateFound"] =
|
|
78
|
+
(props) => {
|
|
79
|
+
if (browser.onServiceWorkerUpdateFound) {
|
|
80
|
+
browser.onServiceWorkerUpdateFound(props);
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
export const onServiceWorkerUpdateReady: GatsbyBrowser["onServiceWorkerUpdateReady"] =
|
|
85
|
+
(props) => {
|
|
86
|
+
if (browser.onServiceWorkerUpdateReady) {
|
|
87
|
+
browser.onServiceWorkerUpdateReady(props);
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
export const registerServiceWorker: GatsbyBrowser["registerServiceWorker"] =
|
|
92
|
+
() => {
|
|
93
|
+
if (browser.registerServiceWorker) {
|
|
94
|
+
return browser.registerServiceWorker();
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
export const replaceHydrateFunction: GatsbyBrowser["replaceHydrateFunction"] =
|
|
99
|
+
() => {
|
|
100
|
+
if (browser.replaceHydrateFunction) {
|
|
101
|
+
return browser.replaceHydrateFunction();
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
export const shouldUpdateScroll: GatsbyBrowser["shouldUpdateScroll"] = (
|
|
106
|
+
props,
|
|
107
|
+
) => {
|
|
91
108
|
if (browser.shouldUpdateScroll) {
|
|
92
109
|
return browser.shouldUpdateScroll(props);
|
|
93
110
|
}
|
package/gatsby-config.ts
CHANGED
|
@@ -1,26 +1,33 @@
|
|
|
1
1
|
import type { GatsbyConfig } from "gatsby";
|
|
2
2
|
|
|
3
|
-
import { resolveComponentsPath } from "@griddo/cx";
|
|
3
|
+
import { resolveComponentsPath, verboseLog } from "@griddo/cx";
|
|
4
|
+
import dotenv from "dotenv";
|
|
5
|
+
|
|
6
|
+
dotenv.config();
|
|
4
7
|
|
|
5
8
|
/**
|
|
6
9
|
* Este process.env.SPAWN_ASSET_PREFIX_WITH_DOMAIN se lee porque
|
|
7
|
-
* se ha introducido en el spawnSync del la función
|
|
10
|
+
* se ha introducido en el spawnSync del la función runGatsbyBuildCommand.
|
|
8
11
|
*
|
|
9
12
|
* ...
|
|
10
|
-
* env: {
|
|
11
|
-
*
|
|
13
|
+
* env: Object.assign(process.env, {
|
|
14
|
+
* GRIDDO_EXPORTER: "true",
|
|
12
15
|
* SPAWN_ASSET_PREFIX_WITH_DOMAIN: assetPrefixWithDomain, <--------------
|
|
13
16
|
* NODE_OPTIONS: undefined,
|
|
14
|
-
* },
|
|
17
|
+
* }),
|
|
18
|
+
*
|
|
19
|
+
* @see runGatsbyBuildCommand()
|
|
20
|
+
* @todo quiar el `... || undefined`
|
|
15
21
|
*/
|
|
16
|
-
const griddoAssetPrefixWithDomain =
|
|
22
|
+
const griddoAssetPrefixWithDomain =
|
|
23
|
+
process.env.SPAWN_ASSET_PREFIX_WITH_DOMAIN || undefined;
|
|
17
24
|
|
|
18
|
-
|
|
19
|
-
console.log(`set config.assetPrefix=${griddoAssetPrefixWithDomain}`);
|
|
20
|
-
}
|
|
25
|
+
verboseLog(`set config.assetPrefix=${griddoAssetPrefixWithDomain}`);
|
|
21
26
|
|
|
22
27
|
// Gatsby configuration file from client
|
|
23
|
-
const { plugins, ...gatsbyConfig } = require(
|
|
28
|
+
const { plugins, ...gatsbyConfig } = require(
|
|
29
|
+
resolveComponentsPath("builder.config.js"),
|
|
30
|
+
);
|
|
24
31
|
|
|
25
32
|
const config: GatsbyConfig = {
|
|
26
33
|
// Client config
|
package/gatsby-node.ts
CHANGED
|
@@ -1,34 +1,49 @@
|
|
|
1
|
-
import type { GatsbyNode } from "gatsby";
|
|
2
1
|
import type { GatsbyPageObject } from "./src/types";
|
|
2
|
+
import type { GatsbyNode } from "gatsby";
|
|
3
3
|
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
buildLog,
|
|
8
|
+
debugLog,
|
|
9
|
+
envs,
|
|
10
|
+
getBuildPagesFromStore,
|
|
11
|
+
getConfig,
|
|
12
|
+
pageSizeLog,
|
|
13
|
+
verboseLog,
|
|
14
|
+
} from "@griddo/cx";
|
|
7
15
|
|
|
8
|
-
import {
|
|
16
|
+
import { gatsbyRegister } from "./exporter/registers";
|
|
17
|
+
import { insertAlert } from "./exporter/utils/alerts";
|
|
18
|
+
|
|
19
|
+
const showGriddoBuildLogs = envs.GRIDDO_BUILD_LOGS;
|
|
9
20
|
|
|
10
21
|
// process.env available through gatsbyBuildCommand.
|
|
11
|
-
const showGriddoBuildLogs = JSON.parse(process.env.GRIDDO_BUILD_LOGS || "false");
|
|
12
|
-
const showSSGVerboseLogs = JSON.parse(process.env.GRIDDO_VERBOSE_SSG || "false");
|
|
13
22
|
const assetPrefixWithDomain = process.env.SPAWN_ASSET_PREFIX_WITH_DOMAIN;
|
|
14
|
-
const
|
|
15
|
-
const
|
|
23
|
+
const sendAlertActive = JSON.parse(process.env.GRIDDO_ALERT_FEATURE || "false");
|
|
24
|
+
const avoidMatchPath = JSON.parse(
|
|
25
|
+
process.env.GRIDDO_EXPERIMENTAL_DO_NOT_USE_MATCH_PATH || "false",
|
|
26
|
+
);
|
|
27
|
+
const useMatchPaths = !avoidMatchPath;
|
|
28
|
+
const needsAssetDomainPrefix =
|
|
29
|
+
!!assetPrefixWithDomain && assetPrefixWithDomain !== "";
|
|
16
30
|
|
|
17
|
-
const
|
|
18
|
-
const
|
|
19
|
-
? path.resolve(__dirname, "../../..", ".griddo/cache/db.json")
|
|
20
|
-
: path.resolve(__dirname, "../..", ".griddo/cache/db.json");
|
|
31
|
+
const { __ssg } = getConfig().paths();
|
|
32
|
+
const template = path.join(__ssg, "src/components/template.tsx");
|
|
21
33
|
|
|
22
34
|
const pages = getBuildPagesFromStore<GatsbyPageObject>({
|
|
23
35
|
withSizeProp: showGriddoBuildLogs,
|
|
24
|
-
dbFilePath,
|
|
25
36
|
});
|
|
26
37
|
|
|
27
38
|
const createPages: GatsbyNode["createPages"] = async ({ actions }) => {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
39
|
+
verboseLog(`read assetPrefixWithDomain=${assetPrefixWithDomain}`);
|
|
40
|
+
verboseLog(`set needsAssetDomainPrefix=${needsAssetDomainPrefix}`);
|
|
41
|
+
console.log(
|
|
42
|
+
`using this NODE_OPTIONS in gatsby-node.ts: ${process.env.NODE_OPTIONS}`,
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
if (avoidMatchPath) {
|
|
46
|
+
console.log(`[!] GRIDDO EXPERIMENTAL: Avoiding use of matchPath`);
|
|
32
47
|
}
|
|
33
48
|
|
|
34
49
|
for await (const page of pages) {
|
|
@@ -36,16 +51,60 @@ const createPages: GatsbyNode["createPages"] = async ({ actions }) => {
|
|
|
36
51
|
return;
|
|
37
52
|
}
|
|
38
53
|
|
|
54
|
+
const matchPath =
|
|
55
|
+
needsAssetDomainPrefix && useMatchPaths
|
|
56
|
+
? page.context.fullPath.compose
|
|
57
|
+
: "";
|
|
58
|
+
|
|
39
59
|
page.component = template;
|
|
60
|
+
page.matchPath = matchPath;
|
|
40
61
|
|
|
41
62
|
actions.createPage(page);
|
|
42
63
|
|
|
64
|
+
const path = page.path;
|
|
65
|
+
const id = page.context.id;
|
|
66
|
+
const size = pageSizeLog(Math.round(page.size || 0));
|
|
67
|
+
|
|
68
|
+
if (sendAlertActive && page.size) {
|
|
69
|
+
const pageMaxSizeReached =
|
|
70
|
+
page.size >
|
|
71
|
+
Number.parseInt(process.env.GRIDDO_SSG_MAX_PAGE_SIZE || "524288") /
|
|
72
|
+
1024;
|
|
73
|
+
|
|
74
|
+
if (pageMaxSizeReached) {
|
|
75
|
+
gatsbyRegister.insert("GATSBY_PAGE_SIZE_TOO_BIG", {
|
|
76
|
+
path: page.path,
|
|
77
|
+
size: `${Math.round(page.size)}KB`,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
43
82
|
if (showGriddoBuildLogs) {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
83
|
+
buildLog(`Creating page ${path} - ${id} - ${size}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (sendAlertActive) {
|
|
88
|
+
const registerContent = gatsbyRegister.get("GATSBY_PAGE_SIZE_TOO_BIG");
|
|
89
|
+
|
|
90
|
+
if (registerContent.entries.length < 1) {
|
|
91
|
+
return;
|
|
48
92
|
}
|
|
93
|
+
|
|
94
|
+
debugLog("\nRender register report\n");
|
|
95
|
+
debugLog(registerContent);
|
|
96
|
+
debugLog();
|
|
97
|
+
|
|
98
|
+
await insertAlert({
|
|
99
|
+
description: "Render register report",
|
|
100
|
+
area: "Griddo",
|
|
101
|
+
level: "W",
|
|
102
|
+
fullData: {
|
|
103
|
+
output: registerContent,
|
|
104
|
+
date: new Date().toISOString(),
|
|
105
|
+
},
|
|
106
|
+
instantNotification: false,
|
|
107
|
+
});
|
|
49
108
|
}
|
|
50
109
|
};
|
|
51
110
|
|
package/gatsby-ssr.tsx
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import type { GatsbySSR } from "gatsby";
|
|
2
2
|
|
|
3
|
-
import * as React from "react";
|
|
4
|
-
|
|
5
3
|
import { SessionProvider } from "@griddo/core";
|
|
6
4
|
import { ssr } from "@griddo-instance";
|
|
5
|
+
import * as React from "react";
|
|
7
6
|
|
|
8
7
|
export const wrapPageElement: GatsbySSR["wrapPageElement"] = (props) => {
|
|
9
8
|
if (ssr.wrapPageElement) {
|
package/package.json
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@griddo/cx",
|
|
3
3
|
"description": "Griddo SSG based on Gatsby",
|
|
4
|
-
"version": "11.9.
|
|
4
|
+
"version": "11.9.13",
|
|
5
5
|
"authors": [
|
|
6
|
-
"
|
|
6
|
+
"Álvaro Sánchez' <alvaro.sanches@secuoyas.com>",
|
|
7
|
+
"Diego M. Béjar <diego.bejar@secuoyas.com>",
|
|
8
|
+
"Francis Vega <francis.vega@secuoyas.com>",
|
|
9
|
+
"Gonzalo Hernández <gonzalo.hernandez@secuoyas.com>",
|
|
10
|
+
"Sergio Ródenas <sergio.rodenas@secuoyas.com>"
|
|
7
11
|
],
|
|
8
12
|
"license": "UNLICENSED",
|
|
9
13
|
"homepage": "https://griddo.io",
|
|
@@ -11,6 +15,10 @@
|
|
|
11
15
|
"type": "git",
|
|
12
16
|
"url": "https://github.com/griddo/griddo"
|
|
13
17
|
},
|
|
18
|
+
"bin": {
|
|
19
|
+
"griddo-cx": "./start-render.js",
|
|
20
|
+
"griddo-start-render": "./start-render.js"
|
|
21
|
+
},
|
|
14
22
|
"exports": {
|
|
15
23
|
".": {
|
|
16
24
|
"import": "./build/index.js",
|
|
@@ -27,69 +35,100 @@
|
|
|
27
35
|
"// NPM": "",
|
|
28
36
|
"prepare": "yarn run build",
|
|
29
37
|
"// BUILD": "",
|
|
30
|
-
"build": "
|
|
31
|
-
"build:debug": "
|
|
38
|
+
"build": "sh ./exporter/build.sh",
|
|
39
|
+
"build:debug": "sh ./exporter/build.sh --debug",
|
|
32
40
|
"// TESTS": "",
|
|
33
|
-
"test": "
|
|
34
|
-
"test-
|
|
35
|
-
"test:
|
|
36
|
-
"test:remove-render-fixtures": "node --env-file=.env ./build/__tests__/utils/remove-fixtures",
|
|
37
|
-
"test:compile": "tsgo --project tsconfig.tests.json",
|
|
41
|
+
"test": "NODE_OPTIONS='--import tsx' env-cmd node --test ./__tests__/*",
|
|
42
|
+
"test:create-render-fixtures": "env-cmd tsx ./__tests__/utils/create-fixtures.ts",
|
|
43
|
+
"test:remove-render-fixtures": "env-cmd tsx ./__tests__/utils/remove-fixtures.ts",
|
|
38
44
|
"// INFRA SCRIPTS": "",
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"end-render": "node ./build/
|
|
42
|
-
"
|
|
43
|
-
"reset-render": "node ./build/
|
|
44
|
-
"
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"// LINTER
|
|
49
|
-
"lint": "
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
"
|
|
53
|
-
"
|
|
45
|
+
"upload-search-content": "node ./build/upload-search-content.js",
|
|
46
|
+
"complete-render": "node ./build/end-render.js",
|
|
47
|
+
"end-render": "node ./build/end-render.js",
|
|
48
|
+
"start-render": "node ./build/start-render.js",
|
|
49
|
+
"reset-render": "node ./build/reset-render.js",
|
|
50
|
+
"prepare-domains-render": "node ./build/prepare-domains-render.js",
|
|
51
|
+
"// SSG": "",
|
|
52
|
+
"clean": "gatsby clean; rm -rf assets .cx-cache caches store apiCache build .render-sentinel",
|
|
53
|
+
"gatsby-build": "gatsby telemetry --disable && gatsby build --prefix-paths",
|
|
54
|
+
"// LINTER": "",
|
|
55
|
+
"run:ts-lint": "tsc --noEmit",
|
|
56
|
+
"watch:ts-lint": "tsc --noEmit --watch",
|
|
57
|
+
"run:eslint": "eslint .",
|
|
58
|
+
"run:lint": "yarn run:ts-lint && yarn run:eslint",
|
|
59
|
+
"// FORMATTER": "",
|
|
60
|
+
"run:format": "prettier --write ."
|
|
54
61
|
},
|
|
55
62
|
"dependencies": {
|
|
56
|
-
"
|
|
63
|
+
"@babel/core": "7.26.0",
|
|
64
|
+
"@babel/plugin-transform-class-properties": "7.25.9",
|
|
65
|
+
"@babel/preset-env": "7.26.0",
|
|
66
|
+
"@babel/preset-react": "7.26.3",
|
|
67
|
+
"@babel/preset-typescript": "7.26.0",
|
|
68
|
+
"@griddo/core": "11.9.13",
|
|
69
|
+
"@svgr/webpack": "5.5.0",
|
|
70
|
+
"axios": "1.7.9",
|
|
71
|
+
"babel-loader": "9.2.1",
|
|
72
|
+
"babel-plugin-transform-runtime": "6.23.0",
|
|
73
|
+
"babel-polyfill": "6.26.0",
|
|
74
|
+
"dotenv": "16.4.5",
|
|
75
|
+
"esbuild": "0.24.0",
|
|
76
|
+
"find-up": "5.0.0",
|
|
77
|
+
"fs-extra": "11.2.0",
|
|
78
|
+
"gatsby": "5.14.0",
|
|
79
|
+
"gatsby-plugin-svgr-loader": "0.1.0",
|
|
80
|
+
"html-react-parser": "5.2.0",
|
|
81
|
+
"js2xmlparser": "5.0.0",
|
|
82
|
+
"kleur": "4.1.5",
|
|
83
|
+
"p-limit": "3.1.0",
|
|
84
|
+
"path-browserify": "1.0.1",
|
|
85
|
+
"pkg-dir": "5.0.0",
|
|
86
|
+
"typescript": "5.7.2",
|
|
87
|
+
"webpack": "5.76.1"
|
|
57
88
|
},
|
|
58
89
|
"devDependencies": {
|
|
59
|
-
"@
|
|
60
|
-
"@types/
|
|
61
|
-
"@
|
|
62
|
-
"
|
|
63
|
-
"
|
|
64
|
-
"
|
|
65
|
-
"typescript": "
|
|
90
|
+
"@types/cheerio": "0.22.35",
|
|
91
|
+
"@types/eslint": "8.56.10",
|
|
92
|
+
"@types/fs-extra": "11.0.4",
|
|
93
|
+
"@types/node": "20.17.10",
|
|
94
|
+
"@types/webpack": "5.28.5",
|
|
95
|
+
"@typescript-eslint/eslint-plugin": "^8.0.0",
|
|
96
|
+
"@typescript-eslint/parser": "^8.0.0",
|
|
97
|
+
"cheerio": "1.0.0",
|
|
98
|
+
"eslint": "^9.0.0",
|
|
99
|
+
"eslint-plugin-import": "2.31.0",
|
|
100
|
+
"eslint-plugin-node": "11.1.0",
|
|
101
|
+
"eslint-plugin-react": "7.37.4",
|
|
102
|
+
"eslint-plugin-react-hooks": "^4.6.0",
|
|
103
|
+
"eslint-plugin-testing-library": "^6.2.0",
|
|
104
|
+
"globals": "^16.0.0",
|
|
105
|
+
"prettier": "3.4.2"
|
|
66
106
|
},
|
|
67
107
|
"peerDependencies": {
|
|
68
|
-
"@
|
|
108
|
+
"@types/react": ">=18 <19",
|
|
109
|
+
"@types/react-dom": ">=18 <19",
|
|
69
110
|
"react": ">=18 <19",
|
|
70
111
|
"react-dom": ">=18 <19"
|
|
71
112
|
},
|
|
72
113
|
"engines": {
|
|
73
|
-
"node": ">=20
|
|
114
|
+
"node": ">=20"
|
|
74
115
|
},
|
|
75
116
|
"files": [
|
|
76
117
|
"build",
|
|
77
118
|
"exporter",
|
|
78
119
|
"src",
|
|
79
|
-
"
|
|
120
|
+
"cx.config.d.ts",
|
|
121
|
+
"cx.config.js",
|
|
80
122
|
"gatsby-browser.tsx",
|
|
81
123
|
"gatsby-config.ts",
|
|
82
124
|
"gatsby-node.ts",
|
|
83
125
|
"gatsby-ssr.tsx",
|
|
84
126
|
"global.d.ts",
|
|
85
|
-
"
|
|
86
|
-
"tsconfig.
|
|
87
|
-
"tsconfig.json",
|
|
88
|
-
"plugins",
|
|
89
|
-
"cli.mjs"
|
|
127
|
+
"start-render.js",
|
|
128
|
+
"tsconfig.json"
|
|
90
129
|
],
|
|
91
130
|
"publishConfig": {
|
|
92
131
|
"access": "public"
|
|
93
132
|
},
|
|
94
|
-
"gitHead": "
|
|
133
|
+
"gitHead": "f515b4d81ed9871544cec096eda6d5f19d592b35"
|
|
95
134
|
}
|
package/src/README.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Griddo CX + Gatsby
|
|
2
|
+
|
|
3
|
+
The `/src` dir and almost every file in the root dir is now 100% Gatsby related code along with the historical `/public`, `/dist`, `/apiCache`, `/store`, etc.. render dirs.
|
|
4
|
+
|
|
5
|
+
Griddo CX code (the business logic) is now in `/exporter` dir.
|
|
6
|
+
|
|
7
|
+
In the future, Griddo CX and Gatsby will split int their own packages dirs inside the mono-repo.
|
package/src/components/Head.tsx
CHANGED
|
@@ -1,14 +1,7 @@
|
|
|
1
1
|
import type { CustomHeadProps } from "../types";
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
function cleanCommaSeparated(str: string) {
|
|
6
|
-
return str
|
|
7
|
-
.split(",")
|
|
8
|
-
.map((item) => item.trim())
|
|
9
|
-
.filter(Boolean)
|
|
10
|
-
.join(",");
|
|
11
|
-
}
|
|
3
|
+
import { Favicon, GriddoIntegrations } from "@griddo/cx/react";
|
|
4
|
+
import * as React from "react";
|
|
12
5
|
|
|
13
6
|
/**
|
|
14
7
|
* Gatsby Head API
|
|
@@ -19,7 +12,13 @@ const Head = (props: CustomHeadProps) => {
|
|
|
19
12
|
pageContext: {
|
|
20
13
|
locale,
|
|
21
14
|
openGraph,
|
|
22
|
-
page: {
|
|
15
|
+
page: {
|
|
16
|
+
disableHrefLangs,
|
|
17
|
+
fullUrl,
|
|
18
|
+
defaultLang,
|
|
19
|
+
integrations = [],
|
|
20
|
+
dimensions,
|
|
21
|
+
},
|
|
23
22
|
pageMetadata,
|
|
24
23
|
siteMetadata,
|
|
25
24
|
siteOptions,
|
|
@@ -32,13 +31,19 @@ const Head = (props: CustomHeadProps) => {
|
|
|
32
31
|
);
|
|
33
32
|
|
|
34
33
|
const showMetaRobots =
|
|
35
|
-
!!metaRobots &&
|
|
34
|
+
!!metaRobots &&
|
|
35
|
+
(siteOptions?.showBasicMetaRobots || metaRobots !== "index,follow");
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
// Validate options
|
|
38
|
+
const cleanPageLanguages =
|
|
39
|
+
pageMetadata?.pageLanguages?.filter((item) => item.isLive) || [];
|
|
38
40
|
|
|
39
41
|
const useCanonical =
|
|
40
42
|
!!pageMetadata?.canonical &&
|
|
41
|
-
!(
|
|
43
|
+
!(
|
|
44
|
+
siteOptions?.avoidSelfReferenceCanonicals &&
|
|
45
|
+
pageMetadata?.canonical === fullUrl
|
|
46
|
+
);
|
|
42
47
|
|
|
43
48
|
const useHrefLangs =
|
|
44
49
|
!(
|
|
@@ -55,7 +60,8 @@ const Head = (props: CustomHeadProps) => {
|
|
|
55
60
|
(useHrefLangs &&
|
|
56
61
|
!siteOptions?.avoidHrefLangXDefault &&
|
|
57
62
|
defaultLangId &&
|
|
58
|
-
cleanPageLanguages.find((item) => item.languageId === defaultLangId)
|
|
63
|
+
cleanPageLanguages.find((item) => item.languageId === defaultLangId)
|
|
64
|
+
?.url) ||
|
|
59
65
|
null;
|
|
60
66
|
|
|
61
67
|
return (
|
|
@@ -66,12 +72,15 @@ const Head = (props: CustomHeadProps) => {
|
|
|
66
72
|
{!!pageMetadata?.description && (
|
|
67
73
|
<meta name="description" content={pageMetadata?.description} />
|
|
68
74
|
)}
|
|
69
|
-
{siteOptions?.useMetaTitle &&
|
|
75
|
+
{siteOptions?.useMetaTitle && (
|
|
76
|
+
<meta name="title" content={pageMetadata?.title} />
|
|
77
|
+
)}
|
|
70
78
|
{useCanonical && <link rel="canonical" href={pageMetadata?.canonical} />}
|
|
71
79
|
|
|
72
|
-
|
|
80
|
+
{/* Favicon images */}
|
|
81
|
+
<Favicon url={siteMetadata?.favicon} />
|
|
73
82
|
|
|
74
|
-
{/* Alternate,
|
|
83
|
+
{/* Alternate, solo si se indexa la página y tiene traducciones */}
|
|
75
84
|
{hrefLangXDefaultUrl && (
|
|
76
85
|
<link rel="alternate" href={hrefLangXDefaultUrl} hrefLang="x-default" />
|
|
77
86
|
)}
|
|
@@ -88,23 +97,51 @@ const Head = (props: CustomHeadProps) => {
|
|
|
88
97
|
{/* Robots */}
|
|
89
98
|
{showMetaRobots && <meta name="robots" content={metaRobots} />}
|
|
90
99
|
|
|
91
|
-
{/*
|
|
92
|
-
{
|
|
100
|
+
{/* Open Graph */}
|
|
101
|
+
{!!siteMetadata?.title && (
|
|
102
|
+
<meta property="og:site_name" content={siteMetadata?.title} />
|
|
103
|
+
)}
|
|
104
|
+
{!!locale && <meta property="og:locale" content={locale} />}
|
|
105
|
+
{(!!openGraph?.title || !!pageMetadata?.title) && (
|
|
106
|
+
<meta
|
|
107
|
+
property="og:title"
|
|
108
|
+
content={openGraph?.title || pageMetadata?.title}
|
|
109
|
+
/>
|
|
110
|
+
)}
|
|
111
|
+
<meta property="og:type" content={openGraph?.type || "website"} />
|
|
112
|
+
{(!!openGraph?.description || !!pageMetadata?.description) && (
|
|
113
|
+
<meta
|
|
114
|
+
property="og:description"
|
|
115
|
+
content={openGraph?.description || pageMetadata?.description}
|
|
116
|
+
/>
|
|
117
|
+
)}
|
|
118
|
+
{!!openGraph?.image && (
|
|
119
|
+
<meta property="og:image" content={openGraph?.image} />
|
|
120
|
+
)}
|
|
121
|
+
<meta
|
|
122
|
+
property="og:url"
|
|
123
|
+
content={pageMetadata?.canonical || fullUrl || ""}
|
|
124
|
+
/>
|
|
125
|
+
|
|
126
|
+
{/* Twitter */}
|
|
127
|
+
<meta property="twitter:card" content="summary_large_image" />
|
|
128
|
+
{!!openGraph?.twitterImage && (
|
|
129
|
+
<meta property="twitter:image" content={openGraph?.twitterImage} />
|
|
130
|
+
)}
|
|
131
|
+
|
|
132
|
+
{/* Debug */}
|
|
133
|
+
{/* {!siteOptions?.avoidDebugMetas && (
|
|
134
|
+
<meta
|
|
135
|
+
property="debug"
|
|
136
|
+
content={`Griddo v${griddoVersion} @ ${renderDate}}`}
|
|
137
|
+
/>
|
|
138
|
+
)} */}
|
|
93
139
|
|
|
94
140
|
{/* Keywords */}
|
|
95
141
|
{siteOptions?.useMetaKeywords && !!pageMetadata?.metaKeywords && (
|
|
96
142
|
<meta name="keywords" content={pageMetadata.metaKeywords} />
|
|
97
143
|
)}
|
|
98
144
|
|
|
99
|
-
{/* Open Graph */}
|
|
100
|
-
<GriddoOpenGraph
|
|
101
|
-
openGraph={openGraph}
|
|
102
|
-
pageMetadata={pageMetadata}
|
|
103
|
-
siteMetadata={siteMetadata}
|
|
104
|
-
locale={locale}
|
|
105
|
-
fullUrl={fullUrl}
|
|
106
|
-
/>
|
|
107
|
-
|
|
108
145
|
{/* Integrations */}
|
|
109
146
|
<GriddoIntegrations
|
|
110
147
|
id={fullUrl}
|
|
@@ -118,4 +155,12 @@ const Head = (props: CustomHeadProps) => {
|
|
|
118
155
|
);
|
|
119
156
|
};
|
|
120
157
|
|
|
158
|
+
function cleanCommaSeparated(str: string) {
|
|
159
|
+
return str
|
|
160
|
+
.split(",")
|
|
161
|
+
.map((item) => item.trim())
|
|
162
|
+
.filter(Boolean)
|
|
163
|
+
.join(",");
|
|
164
|
+
}
|
|
165
|
+
|
|
121
166
|
export { Head };
|