@griddo/cx 1.75.178 → 1.75.180

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.
Files changed (72) hide show
  1. package/README.md +22 -14
  2. package/build/index.js +49 -0
  3. package/gatsby-browser.tsx +140 -0
  4. package/gatsby-config.ts +40 -0
  5. package/gatsby-node.ts +130 -0
  6. package/gatsby-ssr.tsx +63 -0
  7. package/index.js +4 -0
  8. package/package.json +119 -100
  9. package/scripts/build-reset.ts +9 -0
  10. package/scripts/griddo-exporter.ts +302 -0
  11. package/src/components/Head.tsx +207 -0
  12. package/src/components/template.tsx +90 -0
  13. package/src/components/types.ts +35 -0
  14. package/src/components/utils.ts +138 -0
  15. package/src/html.tsx +31 -0
  16. package/src/services/auth.ts +64 -0
  17. package/src/services/distributors.ts +153 -0
  18. package/src/services/domains.ts +27 -0
  19. package/src/services/navigation.ts +169 -0
  20. package/src/services/robots.ts +64 -0
  21. package/src/services/settings.ts +52 -0
  22. package/src/services/sites.ts +199 -0
  23. package/src/services/store-with-for-loop.ts +513 -0
  24. package/src/services/store-with-promise-all.ts +515 -0
  25. package/src/services/store.ts +513 -0
  26. package/src/types/api.ts +155 -0
  27. package/src/types/global.ts +72 -0
  28. package/src/types/navigation.ts +25 -0
  29. package/src/types/pages.ts +145 -0
  30. package/src/types/sites.ts +64 -0
  31. package/src/types/templates.ts +11 -0
  32. package/src/utils/api.ts +326 -0
  33. package/src/utils/cache.ts +114 -0
  34. package/src/utils/domains.ts +32 -0
  35. package/src/utils/folders.ts +147 -0
  36. package/src/utils/instance.ts +71 -0
  37. package/src/utils/pages.ts +534 -0
  38. package/src/utils/searches.ts +102 -0
  39. package/src/utils/shared.ts +131 -0
  40. package/src/utils/sites.ts +280 -0
  41. package/.babelrc +0 -7
  42. package/LICENSE +0 -1
  43. package/gatsby-browser.js +0 -115
  44. package/gatsby-config.js +0 -38
  45. package/gatsby-node.js +0 -273
  46. package/gatsby-ssr.js +0 -43
  47. package/scripts/griddo-exporter.js +0 -133
  48. package/src/api/index.js +0 -172
  49. package/src/components/template.js +0 -261
  50. package/src/html.js +0 -30
  51. package/src/images/readme.md +0 -1
  52. package/src/scripts/build-reset.js +0 -12
  53. package/src/services/auth.js +0 -44
  54. package/src/services/distributors.js +0 -85
  55. package/src/services/domains.js +0 -16
  56. package/src/services/navigation.js +0 -104
  57. package/src/services/robots.js +0 -37
  58. package/src/services/settings.js +0 -25
  59. package/src/services/sites.js +0 -110
  60. package/src/utils/cache.js +0 -70
  61. package/src/utils/component-lib-helpers.js +0 -56
  62. package/src/utils/dataLayer.js +0 -47
  63. package/src/utils/delay.js +0 -5
  64. package/src/utils/domains.js +0 -24
  65. package/src/utils/folders.js +0 -123
  66. package/src/utils/helpers.js +0 -144
  67. package/src/utils/index.js +0 -44
  68. package/src/utils/package.js +0 -20
  69. package/src/utils/pages.js +0 -236
  70. package/src/utils/searches.js +0 -62
  71. package/src/utils/sites.js +0 -207
  72. package/static/griddo-full-logo.png +0 -0
@@ -1,261 +0,0 @@
1
- /* eslint-disable node/no-extraneous-import */
2
- import { Page as RenderGriddoPage } from '@griddo/core';
3
- import {
4
- components,
5
- generateAutomaticDimensions,
6
- SiteProvider,
7
- templates,
8
- } from 'components';
9
- import { Link, navigate } from 'gatsby';
10
- import parse from 'html-react-parser';
11
- import * as React from 'react';
12
- import { Helmet } from 'react-helmet';
13
- import { composeAnalytics } from '../utils/dataLayer';
14
- import { formatImage, cleanCommaSeparated } from '../utils/helpers';
15
-
16
- //
17
- // Gatsby Head API, almost deprecate Helmet.
18
- //
19
- // I put here everything we had in the seo.js component because is easier to
20
- // access to the `pageContext` prop of the Gatsby `<Head>` component. If this
21
- // strategy works, maybe we want to isolate `<Head>` in its own file as we did
22
- // with seo.js.
23
- //
24
- export const Head = data => {
25
- const {
26
- pageContext: {
27
- siteMetadata,
28
- pageMetadata,
29
- siteOptions,
30
- locale,
31
- openGraph,
32
- componentsVersion,
33
- griddoVersion,
34
- page: { defaultLang, fullUrl, disableHrefLangs },
35
- },
36
- } = data;
37
-
38
- const metaRobots = cleanCommaSeparated(
39
- `${pageMetadata?.index},${pageMetadata?.follow},${pageMetadata?.translate},${pageMetadata?.metasAdvanced}`
40
- );
41
-
42
- const showMetaRobots =
43
- !!metaRobots &&
44
- (siteOptions?.showBasicMetaRobots || metaRobots !== 'index,follow');
45
-
46
- const { analyticsScript, analyticsDimensions } = composeAnalytics(
47
- data,
48
- generateAutomaticDimensions
49
- );
50
-
51
- const emptyCodeScript = { props: { dangerouslySetInnerHTML: {} } };
52
-
53
- const analyticsSrc =
54
- (analyticsScript &&
55
- analyticsScript.startsWith('UA-') &&
56
- `https://www.googletagmanager.com/gtag/js?id=${analyticsScript}`) ||
57
- null;
58
-
59
- const analyticsCode =
60
- analyticsScript && !analyticsSrc && analyticsScript.includes('<script')
61
- ? parse(analyticsScript)
62
- : emptyCodeScript;
63
-
64
- const fixedAnalyticsCode = Array.isArray(analyticsCode)
65
- ? analyticsCode.find(item => item.type === 'script') || emptyCodeScript
66
- : analyticsCode;
67
-
68
- const {
69
- props: {
70
- dangerouslySetInnerHTML: { __html: analyticsScriptCode },
71
- // eslint-disable-next-line no-unused-vars
72
- children: analyticsScriptChildren,
73
- ...analyticsScriptProps
74
- },
75
- } = fixedAnalyticsCode;
76
-
77
- // Resize favicon
78
- const faviconResized = formatImage(siteMetadata?.favicon, 32, 32, 'png');
79
-
80
- // Validate options
81
- const cleanPageLanguages =
82
- pageMetadata?.pageLanguages?.filter(item => item.isLive) || [];
83
-
84
- const useCanonical =
85
- !!pageMetadata?.canonical &&
86
- !(
87
- siteOptions?.avoidSelfReferenceCanonicals &&
88
- pageMetadata?.canonical === fullUrl
89
- );
90
-
91
- const useHrefLangs =
92
- !(
93
- siteOptions?.avoidHrefLangsOnCanonicals &&
94
- useCanonical &&
95
- pageMetadata?.canonical !== fullUrl
96
- ) &&
97
- pageMetadata?.index === 'index' &&
98
- cleanPageLanguages.length > 1 &&
99
- !disableHrefLangs;
100
-
101
- const defaultLangId = defaultLang?.id || null;
102
- const hrefLangXDefaultUrl =
103
- (useHrefLangs &&
104
- !siteOptions?.avoidHrefLangXDefault &&
105
- defaultLangId &&
106
- cleanPageLanguages.find(item => item.languageId === defaultLangId)
107
- ?.url) ||
108
- null;
109
-
110
- const currentTime = new Date().toString();
111
-
112
- return (
113
- <>
114
- {!!pageMetadata?.title && <title>{pageMetadata?.title}</title>}
115
- {!!pageMetadata?.description && (
116
- <meta name="description" content={pageMetadata?.description} />
117
- )}
118
- {siteOptions?.useMetaTitle && (
119
- <meta name="title" content={pageMetadata?.title} />
120
- )}
121
- {useCanonical && <link rel="canonical" href={pageMetadata?.canonical} />}
122
- {!!faviconResized && <link rel="icon" href={faviconResized} />}
123
-
124
- {/* Alternate, solo si se indexa la página y tiene traducciones */}
125
- {hrefLangXDefaultUrl && (
126
- <link rel="alternate" href={hrefLangXDefaultUrl} hreflang="x-default" />
127
- )}
128
- {useHrefLangs &&
129
- cleanPageLanguages.map(item => (
130
- <link
131
- key={item.pageId}
132
- rel="alternate"
133
- href={`${item.url}`}
134
- hreflang={item.locale?.replace(/_/g, '-')}
135
- />
136
- ))}
137
-
138
- {/* Robots */}
139
- {showMetaRobots && <meta name="robots" content={metaRobots} />}
140
-
141
- {/* Open Graph */}
142
- {!!siteMetadata?.title && (
143
- <meta property="og:site_name" content={siteMetadata?.title} />
144
- )}
145
- {!!locale && <meta property="og:locale" content={locale} />}
146
- {(!!openGraph?.title || !!pageMetadata?.title) && (
147
- <meta
148
- property="og:title"
149
- content={openGraph?.title || pageMetadata?.title}
150
- />
151
- )}
152
- <meta property="og:type" content={openGraph?.type || 'website'} />
153
- {(!!openGraph?.description || !!pageMetadata?.description) && (
154
- <meta
155
- property="og:description"
156
- content={openGraph?.description || pageMetadata?.description}
157
- />
158
- )}
159
- {!!openGraph?.image && (
160
- <meta property="og:image" content={openGraph?.image} />
161
- )}
162
- <meta property="og:url" content={pageMetadata?.canonical || fullUrl} />
163
-
164
- {/* Twitter */}
165
- <meta property="twitter:card" content="summary_large_image" />
166
- {!!openGraph?.twitterImage && (
167
- <meta property="twitter:image" content={openGraph?.twitterImage} />
168
- )}
169
-
170
- {/* Debug */}
171
- {!siteOptions?.avoidDebugMetas && (
172
- <meta
173
- property="debug"
174
- content={`Components v${componentsVersion} by Griddo v${griddoVersion} @ ${currentTime}}`}
175
- />
176
- )}
177
-
178
- {/* Data Layer */}
179
- <script>{`window.dataLayer = window.dataLayer || [];`}</script>
180
- {analyticsDimensions && (
181
- <script>{`const {__HIDDEN, ...newDataLayer} = ${analyticsDimensions};newDataLayer && window.dataLayer && window.dataLayer.push(newDataLayer);`}</script>
182
- )}
183
-
184
- {/* Analytics with UA- */}
185
- {analyticsSrc && <script src={analyticsSrc}></script>}
186
-
187
- {/* {analyticsCode} */}
188
- {(analyticsScriptProps?.src || analyticsScriptCode) && (
189
- <script {...analyticsScriptProps} data-griddo-id={fullUrl}>
190
- {analyticsScriptCode}
191
- </script>
192
- )}
193
- </>
194
- );
195
- };
196
-
197
- export default data => {
198
- const {
199
- pageContext: {
200
- page: content,
201
- locale,
202
- header,
203
- footer,
204
- siteMetadata,
205
- theme,
206
- cloudinaryName,
207
- socials,
208
- siteLangs,
209
- BUILD_MODE,
210
- page: { site: siteId, apiUrl, publicApiUrl, instance },
211
- sitePages,
212
- },
213
- } = data;
214
-
215
- const library = {
216
- components,
217
- templates,
218
- };
219
-
220
- const mappedTheme = theme || 'default-theme';
221
-
222
- return (
223
- <SiteProvider
224
- theme={mappedTheme}
225
- cloudinaryCloudName={cloudinaryName}
226
- linkComponent={Link}
227
- navigate={navigate}
228
- location={data.location}
229
- socials={socials}
230
- siteLangs={siteLangs}
231
- siteMetadata={siteMetadata}
232
- renderer="gatsby"
233
- buildMode={BUILD_MODE}
234
- siteId={siteId}
235
- apiUrl={apiUrl}
236
- publicApiUrl={publicApiUrl}
237
- instance={instance}
238
- sitePages={sitePages}
239
- >
240
- {/*
241
- Gatsby Head doesn't support anything outside of the <head> tag so we
242
- need to use Helmet.
243
- NOTE: I can´t realize why, but the html-lang tag only render in the hydration phase...
244
- */}
245
- <Helmet>
246
- <html lang={locale} />
247
- </Helmet>
248
-
249
- {/* Render every page */}
250
- <RenderGriddoPage
251
- content={content}
252
- header={header}
253
- footer={footer}
254
- apiUrl={content.apiUrl}
255
- library={library}
256
- languageId={content.language}
257
- pageLanguages={content.pageLanguages}
258
- />
259
- </SiteProvider>
260
- );
261
- };
package/src/html.js DELETED
@@ -1,30 +0,0 @@
1
- import * as React from 'react';
2
-
3
- export default function HTML(props) {
4
- return (
5
- <html {...props.htmlAttributes}>
6
- <head>
7
- <meta charSet="utf-8" />
8
- <meta httpEquiv="x-ua-compatible" content="ie=edge" />
9
- <meta
10
- name="viewport"
11
- content="width=device-width, initial-scale=1, shrink-to-fit=no"
12
- />
13
- {props.headComponents}
14
- </head>
15
- <body {...props.bodyAttributes}>
16
- {props.preBodyComponents}
17
- <noscript key="noscript" id="gatsby-noscript">
18
- This app works best with JavaScript enabled.
19
- </noscript>
20
- <div
21
- key={`body`}
22
- id="___gatsby"
23
- dangerouslySetInnerHTML={{ __html: props.body }}
24
- />
25
- <div id="modal" />
26
- {props.postBodyComponents}
27
- </body>
28
- </html>
29
- );
30
- }
@@ -1 +0,0 @@
1
- Do not remove directory for Git purposes
@@ -1,12 +0,0 @@
1
-
2
- const AuthService = require("../services/auth").default
3
- const SettingsService = require("../services/settings").default
4
-
5
-
6
- // TODO: QUITAR
7
- const resetRender = async() => {
8
- await AuthService.login();
9
- await SettingsService.resetRender();
10
- }
11
-
12
- resetRender();
@@ -1,44 +0,0 @@
1
- const axios = require('axios');
2
- const helpers = require('../utils/helpers');
3
-
4
- class AuthService {
5
- constructor() {
6
- this.user = process.env.botEmail;
7
- this.password = process.env.botPassword;
8
- this.baseUrl = process.env.API_URL;
9
- }
10
-
11
- async login() {
12
- try {
13
- const response = await axios({
14
- url: `${this.baseUrl}/login_check`,
15
- method: 'post',
16
- headers: {
17
- 'Content-Type': 'application/json',
18
- },
19
- data: {
20
- username: this.user,
21
- password: this.password,
22
- },
23
- });
24
-
25
- helpers.log('success', 'LOGIN', response.status);
26
-
27
- if (response.status === 200) {
28
- const {
29
- data: { token },
30
- } = response;
31
- this.headers = {
32
- Authorization: 'bearer ' + token,
33
- 'Cache-Control': 'no-store',
34
- };
35
- }
36
- } catch (e) {
37
- helpers.log('error', 'FALLO EN CREDENCIALES');
38
- console.error(`===========================\nFallo en credenciales. Autenticación no válida.\n===========================`);
39
- process.exit(1);
40
- }
41
- }
42
- }
43
-
44
- exports.default = new AuthService();
@@ -1,85 +0,0 @@
1
- const helpers = require('../utils/helpers');
2
- const SitesService = require('./sites').default;
3
-
4
- class DistributorService {
5
- static getBody(data) {
6
- const {
7
- order,
8
- source,
9
- quantity,
10
- mode,
11
- fixed,
12
- filter,
13
- fullRelations = false,
14
- allLanguages = false,
15
- } = data;
16
-
17
- return mode === 'auto'
18
- ? {
19
- mode,
20
- order,
21
- source,
22
- quantity,
23
- filter,
24
- fullRelations,
25
- allLanguages,
26
- }
27
- : {
28
- mode,
29
- fixed,
30
- fullRelations,
31
- };
32
- }
33
-
34
- static async fetchData({ page, component, cached }) {
35
- const { data } = component;
36
- if (!data) {
37
- console.log(
38
- `======= ERROR: Página ${page.id} tiene un hasDistributorData pero no un elemento data con la configuración del distribuidor en el mismo nivel.`
39
- );
40
- return [];
41
- }
42
- const body = this.getBody(data);
43
- const response = await SitesService.getDistributorData(page, body, cached);
44
- return response;
45
- }
46
-
47
- static async getDistributorData(page, cached = false) {
48
- try {
49
- const { template } = page;
50
-
51
- const checkDistributors = async (template, level = 1) => {
52
- if (!template || typeof template !== 'object') return;
53
- if (!JSON.stringify(template).includes('"hasDistributorData":true'))
54
- return;
55
- for (let key in template) {
56
- if (key === 'queriedItems') continue;
57
- const component = template[key];
58
- if (!component || typeof component !== 'object') continue;
59
- if (component.hasDistributorData) {
60
- component.queriedItems = await this.fetchData({
61
- page,
62
- component,
63
- cached,
64
- });
65
- }
66
-
67
- await checkDistributors(component, level + 1);
68
- }
69
- };
70
-
71
- const getDistributors = async template => {
72
- await checkDistributors([template]); // ==> En array para que también revise la propia template como objeto.
73
- return template;
74
- };
75
-
76
- const response = await getDistributors(template);
77
- return response;
78
- } catch (e) {
79
- helpers.log('error', `ERROR EN GET DISTRIBUTOR ${e}`);
80
- return e.response;
81
- }
82
- }
83
- }
84
-
85
- exports.default = DistributorService;
@@ -1,16 +0,0 @@
1
- const api = require('./../api');
2
-
3
- const baseURL = process.env.API_URL;
4
- const ENDPOINTS = {
5
- GET_ALL: `${baseURL}/domains`,
6
- };
7
-
8
- class DomainsService {
9
- static async getAll() {
10
- const { GET_ALL } = ENDPOINTS;
11
- const response = await api.get(GET_ALL);
12
- return response;
13
- }
14
- }
15
-
16
- exports.default = DomainsService;
@@ -1,104 +0,0 @@
1
- class NavigationService {
2
- constructor() {
3
- this._navigations = [];
4
- this._defaultHeaders = {};
5
- this._defaultFooters = {};
6
- }
7
-
8
- set navigations(navigations) {
9
- this._navigations = navigations;
10
- this._defaultFooters = this.getDefaultFooters();
11
- this._defaultHeaders = this.getDefaultHeaders();
12
- }
13
-
14
- get navigations() {
15
- return this._navigations;
16
- }
17
-
18
- getDefaultFooters() {
19
- const safeFooters = [...this.navigations.footers];
20
- const defaultFooters = safeFooters.filter(footer => !!footer.setAsDefault);
21
- const defaultFootersByLang = defaultFooters.reduce((prev, footer) => {
22
- const { language } = footer;
23
- return { ...prev, [language]: footer };
24
- }, {});
25
- return defaultFootersByLang;
26
- }
27
-
28
- getDefaultHeaders() {
29
- const safeHeaders = [...this.navigations.headers];
30
- const defaultHeaders = safeHeaders.filter(header => !!header.setAsDefault);
31
- const defaultHeadersByLang = defaultHeaders.reduce((prev, header) => {
32
- const { language } = header;
33
- return { ...prev, [language]: header };
34
- }, {});
35
- return defaultHeadersByLang;
36
- }
37
-
38
- getRightLanguage(list, id, language) {
39
- if (!list || !id) return null;
40
- const rightLanguageItem = list.find(
41
- item =>
42
- item.language === language &&
43
- item.navigationLanguages?.find(version => version.navigationId === id)
44
- );
45
- const result = rightLanguageItem || list.find(item => item.id === id);
46
- return result ? { ...result } : null;
47
- }
48
-
49
- getPageHeader(id, language) {
50
- return this.getRightLanguage(this.navigations.headers, id, language);
51
- }
52
-
53
- getPageFooter(id, language) {
54
- return this.getRightLanguage(this.navigations.footers, id, language);
55
- }
56
-
57
- getPageNavigations(page) {
58
- const {
59
- header: pageHeader,
60
- footer: pageFooter,
61
- language,
62
- template: { templateType },
63
- templateConfig: { defaultHeader, defaultFooter, templates },
64
- } = page;
65
-
66
- // Los navigations serían el que tenga la página,
67
- // si no el que tenga definido para esa template
68
- // si no el que tenga definido para ese paquete de datos
69
- const getFineNavigation = values => {
70
- const fineNavigation = values.find(item => typeof item === 'number');
71
- return typeof fineNavigation === 'number' ? fineNavigation : null;
72
- };
73
-
74
- const headerID = getFineNavigation([
75
- pageHeader,
76
- templates?.[templateType]?.defaultHeader,
77
- defaultHeader,
78
- ]);
79
- const footerID = getFineNavigation([
80
- pageFooter,
81
- templates?.[templateType]?.defaultFooter,
82
- defaultFooter,
83
- ]);
84
-
85
- // Seleccionar navigations
86
- const header = headerID
87
- ? this.getPageHeader(headerID, language)
88
- : headerID === 0
89
- ? null
90
- : this._defaultHeaders[language];
91
- const footer = footerID
92
- ? this.getPageFooter(footerID, language)
93
- : footerID === 0
94
- ? null
95
- : this._defaultFooters[language];
96
-
97
- return {
98
- header,
99
- footer,
100
- };
101
- }
102
- }
103
-
104
- exports.default = NavigationService;
@@ -1,37 +0,0 @@
1
- const fs = require('fs');
2
- const path = require('path');
3
- const api = require('../api');
4
- const helpers = require('../utils/helpers');
5
-
6
- class RobotsService {
7
- constructor() {
8
- this.robots = [];
9
- this.baseURL = process.env.API_URL;
10
- this.settings = {};
11
- this.ENDPOINT = `${this.baseURL}/domains/robots`;
12
- }
13
-
14
- async loadRobots() {
15
- try {
16
- const apiRobots = await api.get(this.ENDPOINT);
17
- this.robots = apiRobots.filter(r => !!r.path).map(({ path, content }) => ({
18
- path,
19
- content: content || 'User-agent: *\n\r\n\rAllow: /'
20
- })) || [];
21
- } catch (e) {
22
- helpers.log('error', `${this.constructor.name}: ${e.message}`);
23
- }
24
- }
25
-
26
- async writeFiles(basePath = '') {
27
- for (const robot of this.robots) {
28
- const basePathLocation = path.join(basePath, robot.path);
29
- const fileLocation = path.join(basePathLocation, 'robots.txt');
30
- if (fs.existsSync(basePathLocation)) {
31
- fs.writeFileSync(fileLocation, robot.content);
32
- }
33
- }
34
- }
35
- }
36
-
37
- exports.default = new RobotsService();
@@ -1,25 +0,0 @@
1
- const api = require("../api")
2
- class SettingsService {
3
-
4
- constructor() {
5
- this.baseURL = process.env.API_URL
6
- this.settings = {};
7
- this.ENDPOINTS = {
8
- GET_ALL: `${this.baseURL}/settings`,
9
- RESET_RENDER: `${this.baseURL}/debug/reset-render`
10
- }
11
- }
12
-
13
- async getAll() {
14
- const { GET_ALL } = this.ENDPOINTS
15
- const response = await api.get(GET_ALL);
16
- this.settings = response;
17
- }
18
-
19
- async resetRender() {
20
- const{ RESET_RENDER } = this.ENDPOINTS;
21
- const response = await api.post(RESET_RENDER);
22
- }
23
- }
24
-
25
- exports.default = new SettingsService();