cloudcommerce 0.40.4 → 0.41.0

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 (102) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/action.yml +4 -0
  3. package/package.json +4 -4
  4. package/packages/api/package.json +1 -1
  5. package/packages/apps/affilate-program/package.json +1 -1
  6. package/packages/apps/correios/package.json +2 -2
  7. package/packages/apps/custom-payment/package.json +1 -1
  8. package/packages/apps/custom-shipping/package.json +1 -1
  9. package/packages/apps/datafrete/package.json +2 -2
  10. package/packages/apps/discounts/package.json +1 -1
  11. package/packages/apps/emails/package.json +1 -1
  12. package/packages/apps/fb-conversions/package.json +2 -2
  13. package/packages/apps/flash-courier/package.json +2 -2
  14. package/packages/apps/frenet/lib/frenet-events.js +1 -1
  15. package/packages/apps/frenet/lib/frenet-events.js.map +1 -1
  16. package/packages/apps/frenet/package.json +2 -2
  17. package/packages/apps/frenet/src/frenet-events.ts +1 -1
  18. package/packages/apps/galaxpay/package.json +2 -2
  19. package/packages/apps/google-analytics/package.json +2 -2
  20. package/packages/apps/jadlog/package.json +2 -2
  21. package/packages/apps/loyalty-points/lib/loyalty-points-events.js +1 -1
  22. package/packages/apps/loyalty-points/lib/loyalty-points-events.js.map +1 -1
  23. package/packages/apps/loyalty-points/package.json +1 -1
  24. package/packages/apps/loyalty-points/src/loyalty-points-events.ts +1 -1
  25. package/packages/apps/mandae/package.json +2 -2
  26. package/packages/apps/melhor-envio/lib/melhor-envio-events.js +1 -1
  27. package/packages/apps/melhor-envio/lib/melhor-envio-events.js.map +1 -1
  28. package/packages/apps/melhor-envio/package.json +2 -2
  29. package/packages/apps/melhor-envio/src/melhor-envio-events.ts +1 -1
  30. package/packages/apps/mercadopago/package.json +2 -2
  31. package/packages/apps/pagarme/package.json +2 -2
  32. package/packages/apps/pagarme-v5/package.json +2 -2
  33. package/packages/apps/paghiper/package.json +2 -2
  34. package/packages/apps/pix/package.json +2 -2
  35. package/packages/apps/tiny-erp/package.json +2 -2
  36. package/packages/apps/webhooks/package.json +2 -2
  37. package/packages/cli/package.json +1 -1
  38. package/packages/config/package.json +1 -1
  39. package/packages/emails/package.json +3 -3
  40. package/packages/eslint/package.json +2 -2
  41. package/packages/eslint/storefront.eslintrc.cjs +2 -0
  42. package/packages/events/lib/firebase.js +2 -0
  43. package/packages/events/lib/firebase.js.map +1 -1
  44. package/packages/events/package.json +2 -1
  45. package/packages/events/src/firebase.ts +2 -0
  46. package/packages/feeds/package.json +1 -1
  47. package/packages/firebase/lib/helpers/firestore.d.ts +2 -0
  48. package/packages/firebase/lib/helpers/firestore.js +24 -0
  49. package/packages/firebase/lib/helpers/firestore.js.map +1 -0
  50. package/packages/firebase/package.json +2 -1
  51. package/packages/firebase/src/helpers/firestore.ts +31 -0
  52. package/packages/i18n/package.json +1 -1
  53. package/packages/modules/package.json +2 -2
  54. package/packages/passport/package.json +1 -1
  55. package/packages/ssr/events.js +1 -0
  56. package/packages/ssr/lib/firebase.js +1 -1
  57. package/packages/ssr/lib/firebase.js.map +1 -1
  58. package/packages/ssr/lib/index.js +1 -1
  59. package/packages/ssr/lib/index.js.map +1 -1
  60. package/packages/ssr/lib/lib/analytics/send-to-ga4.js.map +1 -0
  61. package/packages/ssr/lib/lib/analytics/send-to-meta.js.map +1 -0
  62. package/packages/ssr/lib/lib/analytics/send-to-tiktok.js.map +1 -0
  63. package/packages/ssr/lib/{analytics-events.js → lib/analytics-events.js} +4 -3
  64. package/packages/ssr/lib/lib/analytics-events.js.map +1 -0
  65. package/packages/ssr/lib/lib/cron-ssr-save-views.js +57 -0
  66. package/packages/ssr/lib/lib/cron-ssr-save-views.js.map +1 -0
  67. package/packages/ssr/lib/{firebase → lib}/serve-storefront.js +1 -1
  68. package/packages/ssr/lib/lib/serve-storefront.js.map +1 -0
  69. package/packages/ssr/lib/ssr-events.js +18 -0
  70. package/packages/ssr/lib/ssr-events.js.map +1 -0
  71. package/packages/ssr/package.json +5 -4
  72. package/packages/ssr/src/firebase.ts +1 -1
  73. package/packages/ssr/src/index.ts +1 -1
  74. package/packages/ssr/src/{analytics-events.ts → lib/analytics-events.ts} +4 -3
  75. package/packages/ssr/src/lib/cron-ssr-save-views.ts +56 -0
  76. package/packages/ssr/src/{firebase → lib}/serve-storefront.ts +2 -2
  77. package/packages/ssr/src/ssr-events.ts +17 -0
  78. package/packages/storefront/astro.config.mjs +3 -0
  79. package/packages/storefront/config/storefront.cms.js +14 -7
  80. package/packages/storefront/config/storefront.config.mjs +14 -1
  81. package/packages/storefront/package.json +8 -7
  82. package/packages/storefront/scripts/build-prod.sh +1 -0
  83. package/packages/storefront/src/lib/components/AccountLink.vue +9 -3
  84. package/packages/storefront/src/lib/composables/use-product-shelf.ts +3 -1
  85. package/packages/storefront/src/lib/content.d.ts +2 -2
  86. package/packages/storefront/src/lib/layouts/BaseHead.astro +1 -0
  87. package/packages/storefront/src/lib/layouts/use-page-main.ts +48 -20
  88. package/packages/storefront/src/lib/ssr-context.ts +1 -3
  89. package/packages/storefront/src/lib/state/use-analytics.ts +5 -2
  90. package/packages/test-base/package.json +1 -1
  91. package/packages/types/package.json +1 -1
  92. package/packages/ssr/lib/analytics/send-to-ga4.js.map +0 -1
  93. package/packages/ssr/lib/analytics/send-to-meta.js.map +0 -1
  94. package/packages/ssr/lib/analytics/send-to-tiktok.js.map +0 -1
  95. package/packages/ssr/lib/analytics-events.js.map +0 -1
  96. package/packages/ssr/lib/firebase/serve-storefront.js.map +0 -1
  97. /package/packages/ssr/lib/{analytics → lib/analytics}/send-to-ga4.js +0 -0
  98. /package/packages/ssr/lib/{analytics → lib/analytics}/send-to-meta.js +0 -0
  99. /package/packages/ssr/lib/{analytics → lib/analytics}/send-to-tiktok.js +0 -0
  100. /package/packages/ssr/src/{analytics → lib/analytics}/send-to-ga4.ts +0 -0
  101. /package/packages/ssr/src/{analytics → lib/analytics}/send-to-meta.ts +0 -0
  102. /package/packages/ssr/src/{analytics → lib/analytics}/send-to-tiktok.ts +0 -0
@@ -12,6 +12,7 @@ module.exports = {
12
12
  'comma-dangle': 'warn',
13
13
  'consistent-return': 'warn',
14
14
  'array-bracket-spacing': 'warn',
15
+ 'no-restricted-syntax': 'warn',
15
16
  'quote-props': 'off',
16
17
  'quotes': 'off',
17
18
  'global-require': 'off',
@@ -26,6 +27,7 @@ module.exports = {
26
27
  'Skeleton',
27
28
  'Prices',
28
29
  'Banner',
30
+ 'Breadcrumbs',
29
31
  'Countdown',
30
32
  'Collapse',
31
33
  'Accordion',
@@ -1,4 +1,6 @@
1
1
  /* eslint-disable import/prefer-default-export */
2
+ export * from '@cloudcommerce/ssr/events';
3
+
2
4
  export * from '@cloudcommerce/app-tiny-erp';
3
5
 
4
6
  export * from '@cloudcommerce/app-mercadopago/webhook';
@@ -1 +1 @@
1
- {"version":3,"file":"firebase.js","sourceRoot":"","sources":["../src/firebase.ts"],"names":[],"mappings":"AAAA,iDAAiD;AAEjD,cAAc,6BAA6B,CAAC;AAE5C,cAAc,wCAAwC,CAAC;AAEvD,cAAc,2BAA2B,CAAC;AAE1C,cAAc,oCAAoC,CAAC;AAEnD,cAAc,gCAAgC,CAAC;AAE/C,cAAc,oCAAoC,CAAC;AAEnD,cAAc,0CAA0C,CAAC;AAEzD,cAAc,kCAAkC,CAAC;AAEjD,cAAc,mCAAmC,CAAC;AAElD,cAAc,sCAAsC,CAAC;AAErD,cAAc,qCAAqC,CAAC;AAEpD,cAAc,qCAAqC,CAAC;AAEpD,cAAc,wCAAwC,CAAC;AAEvD,cAAc,6BAA6B,CAAC;AAE5C,cAAc,qCAAqC,CAAC;AAEpD,cAAc,yCAAyC,CAAC;AAExD,cAAc,sCAAsC,CAAC"}
1
+ {"version":3,"file":"firebase.js","sourceRoot":"","sources":["../src/firebase.ts"],"names":[],"mappings":"AAAA,iDAAiD;AAEjD,cAAc,2BAA2B,CAAC;AAE1C,cAAc,6BAA6B,CAAC;AAE5C,cAAc,wCAAwC,CAAC;AAEvD,cAAc,2BAA2B,CAAC;AAE1C,cAAc,oCAAoC,CAAC;AAEnD,cAAc,gCAAgC,CAAC;AAE/C,cAAc,oCAAoC,CAAC;AAEnD,cAAc,0CAA0C,CAAC;AAEzD,cAAc,kCAAkC,CAAC;AAEjD,cAAc,mCAAmC,CAAC;AAElD,cAAc,sCAAsC,CAAC;AAErD,cAAc,qCAAqC,CAAC;AAEpD,cAAc,qCAAqC,CAAC;AAEpD,cAAc,wCAAwC,CAAC;AAEvD,cAAc,6BAA6B,CAAC;AAE5C,cAAc,qCAAqC,CAAC;AAEpD,cAAc,yCAAyC,CAAC;AAExD,cAAc,sCAAsC,CAAC"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/events",
3
3
  "type": "module",
4
- "version": "0.40.4",
4
+ "version": "0.41.0",
5
5
  "description": "E-Com Plus Cloud Commerce app events",
6
6
  "main": "lib/index.js",
7
7
  "exports": {
@@ -42,6 +42,7 @@
42
42
  "@cloudcommerce/app-tiny-erp": "workspace:*",
43
43
  "@cloudcommerce/app-webhooks": "workspace:*",
44
44
  "@cloudcommerce/firebase": "workspace:*",
45
+ "@cloudcommerce/ssr": "workspace:*",
45
46
  "firebase-admin": "^11.11.1",
46
47
  "firebase-functions": "^4.5.0",
47
48
  "source-map-support": "^0.5.21"
@@ -1,5 +1,7 @@
1
1
  /* eslint-disable import/prefer-default-export */
2
2
 
3
+ export * from '@cloudcommerce/ssr/events';
4
+
3
5
  export * from '@cloudcommerce/app-tiny-erp';
4
6
 
5
7
  export * from '@cloudcommerce/app-mercadopago/webhook';
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/feeds",
3
3
  "type": "module",
4
- "version": "0.40.4",
4
+ "version": "0.41.0",
5
5
  "description": "E-Com Plus Cloud Commerce catalog feeds",
6
6
  "main": "lib/index.js",
7
7
  "exports": {
@@ -0,0 +1,2 @@
1
+ import type { Firestore, Query } from 'firebase-admin/firestore';
2
+ export declare const deleteQueryBatch: (db: Firestore, query: Query) => Promise<unknown>;
@@ -0,0 +1,24 @@
1
+ const _deleteQueryBatch = async (db, query, resolve) => {
2
+ const snapshot = await query.get();
3
+ const batchSize = snapshot.size;
4
+ if (batchSize === 0) {
5
+ resolve();
6
+ return;
7
+ }
8
+ const batch = db.batch();
9
+ snapshot.docs.forEach((doc) => {
10
+ batch.delete(doc.ref);
11
+ });
12
+ await batch.commit();
13
+ // Recurse on the next process tick to avoid exploding the stack
14
+ process.nextTick(() => {
15
+ _deleteQueryBatch(db, query, resolve);
16
+ });
17
+ };
18
+
19
+ export const deleteQueryBatch = async (db, query) => {
20
+ return new Promise((resolve, reject) => {
21
+ _deleteQueryBatch(db, query, resolve).catch(reject);
22
+ });
23
+ };
24
+ // # sourceMappingURL=firestore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firestore.js","sourceRoot":"","sources":["../../src/helpers/firestore.ts"],"names":[],"mappings":"AAIA,MAAM,iBAAiB,GAAG,KAAK,EAC7B,EAAa,EACb,KAAY,EACZ,OAAiC,EACjC,EAAE;IACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,CAAC;IACnC,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC;IAChC,IAAI,SAAS,KAAK,CAAC,EAAE;QACnB,OAAO,EAAE,CAAC;QACV,OAAO;KACR;IACD,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QAC5B,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IACH,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC;IACrB,gEAAgE;IAChE,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE;QACpB,iBAAiB,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,EAAa,EAAE,KAAY,EAAE,EAAE;IACpE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,iBAAiB,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/firebase",
3
3
  "type": "module",
4
- "version": "0.40.4",
4
+ "version": "0.41.0",
5
5
  "description": "E-Com Plus Cloud Commerce on Firebase",
6
6
  "main": "lib/index.js",
7
7
  "types": "lib/index.d.ts",
@@ -12,6 +12,7 @@
12
12
  "./lib/config": "./lib/config.js",
13
13
  "./lib/env": "./lib/env.js",
14
14
  "./lib/helpers/pubsub": "./lib/helpers/pubsub.js",
15
+ "./lib/helpers/firestore": "./lib/helpers/firestore.js",
15
16
  "./lib/helpers/update-app-data": "./lib/helpers/update-app-data.js"
16
17
  },
17
18
  "repository": {
@@ -0,0 +1,31 @@
1
+ /* eslint-disable import/prefer-default-export */
2
+ // Ref.: https://firebase.google.com/docs/firestore/manage-data/delete-data
3
+ import type { Firestore, Query } from 'firebase-admin/firestore';
4
+
5
+ const _deleteQueryBatch = async (
6
+ db: Firestore,
7
+ query: Query,
8
+ resolve: (...args: any[]) => void,
9
+ ) => {
10
+ const snapshot = await query.get();
11
+ const batchSize = snapshot.size;
12
+ if (batchSize === 0) {
13
+ resolve();
14
+ return;
15
+ }
16
+ const batch = db.batch();
17
+ snapshot.docs.forEach((doc) => {
18
+ batch.delete(doc.ref);
19
+ });
20
+ await batch.commit();
21
+ // Recurse on the next process tick to avoid exploding the stack
22
+ process.nextTick(() => {
23
+ _deleteQueryBatch(db, query, resolve);
24
+ });
25
+ };
26
+
27
+ export const deleteQueryBatch = async (db: Firestore, query: Query) => {
28
+ return new Promise((resolve, reject) => {
29
+ _deleteQueryBatch(db, query, resolve).catch(reject);
30
+ });
31
+ };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/i18n",
3
3
  "type": "module",
4
- "version": "0.40.4",
4
+ "version": "0.41.0",
5
5
  "description": "E-Com Plus Cloud Commerce i18n",
6
6
  "main": "lib/all.js",
7
7
  "exports": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/modules",
3
3
  "type": "module",
4
- "version": "0.40.4",
4
+ "version": "0.41.0",
5
5
  "description": "E-Com Plus Cloud Commerce modules API",
6
6
  "main": "lib/index.cjs",
7
7
  "exports": {
@@ -47,7 +47,7 @@
47
47
  "@ecomplus/utils": "1.5.0-rc.6",
48
48
  "ajv": "^8.12.0",
49
49
  "ajv-formats": "^2.1.1",
50
- "axios": "^1.6.2",
50
+ "axios": "^1.6.3",
51
51
  "firebase-admin": "^11.11.1",
52
52
  "firebase-functions": "^4.5.0",
53
53
  "source-map-support": "^0.5.21"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/passport",
3
3
  "type": "module",
4
- "version": "0.40.4",
4
+ "version": "0.41.0",
5
5
  "description": "E-Com Plus Cloud Commerce customers authentication (passport) API",
6
6
  "main": "lib/index.js",
7
7
  "exports": {
@@ -0,0 +1 @@
1
+ export * from './lib/ssr-events';
@@ -4,7 +4,7 @@ import { initializeApp } from 'firebase-admin/app';
4
4
  initializeApp();
5
5
  import { onRequest } from 'firebase-functions/v2/https';
6
6
  import config from '@cloudcommerce/firebase/lib/config';
7
- import serveStorefront from './firebase/serve-storefront.js';
7
+ import serveStorefront from './lib/serve-storefront.js';
8
8
 
9
9
  const { ssrFunctionOptions } = config.get();
10
10
 
@@ -1 +1 @@
1
- {"version":3,"file":"firebase.js","sourceRoot":"","sources":["../src/firebase.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,aAAa,EAAE,CAAC;AAEhB,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,MAAM,MAAM,oCAAoC,CAAC;AACxD,OAAO,eAAe,MAAM,6BAA6B,CAAC;AAE1D,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;AAE5C,MAAM,CAAC,MAAM,GAAG,GAAG,SAAS,CAAC;IAC3B,WAAW,EAAE,EAAE;IACf,GAAG,kBAAkB;CACtB,EAAE,eAAe,CAAC,CAAC"}
1
+ {"version":3,"file":"firebase.js","sourceRoot":"","sources":["../src/firebase.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,aAAa,EAAE,CAAC;AAEhB,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,MAAM,MAAM,oCAAoC,CAAC;AACxD,OAAO,eAAe,MAAM,wBAAwB,CAAC;AAErD,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;AAE5C,MAAM,CAAC,MAAM,GAAG,GAAG,SAAS,CAAC;IAC3B,WAAW,EAAE,EAAE;IACf,GAAG,kBAAkB;CACtB,EAAE,eAAe,CAAC,CAAC"}
@@ -1,4 +1,4 @@
1
- import serveStorefront from './firebase/serve-storefront.js';
1
+ import serveStorefront from './lib/serve-storefront.js';
2
2
 
3
3
  export default serveStorefront;
4
4
  // # sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,6BAA6B,CAAC;AAE1D,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,wBAAwB,CAAC;AAErD,eAAe,eAAe,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-to-ga4.js","sourceRoot":"","sources":["../../../src/lib/analytics/send-to-ga4.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,OAAO,EAAE,kCAAkC;IAC3C,OAAO,EAAE;QACP,cAAc,EAAE,kBAAkB;KACnC;CACF,CAAC,CAAC;AACH,MAAM,QAAQ,GAAG,aAAa;MAC1B,eAAe,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE;MAC1C,mBAAmB,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;AAEvD,MAAM,SAAS,GAAG,KAAK,EACrB,MAAwB,EACxB,QAAgB,EAChB,SAAiB,EACjB,MAMI,EAAE,EACN,EAAE;IACF,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE;QAC9D,MAAM,IAAI,GAAG;YACX,SAAS,EAAE,QAAQ;YACnB,MAAM,EAAE,EAAsB;SAC/B,CAAC;QACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACtC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE;gBAC9B,KAAK,CAAC,IAAI,GAAG,kBAAkB,CAAC;gBAChC,KAAK,CAAC,MAAM,GAAG;oBACb,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;oBACtB,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,UAAU,EAAE,SAAS;iBACtB,CAAC;aACH;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE;gBACvB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;aACxD;YACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,EAAE,IAAI,CAAC,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBACxD,4CAA4C;gBAC5C,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBACpC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;aAClB;SACF;KACF;AACH,CAAC,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-to-meta.js","sourceRoot":"","sources":["../../../src/lib/analytics/send-to-meta.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,4EAA4E;AAC5E,MAAM,OAAO,GAAG,OAAO,CAAC;AACxB,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC;IAC7B,OAAO,EAAE,8BAA8B,OAAO,EAAE;IAChD,OAAO,EAAE;QACP,cAAc,EAAE,kBAAkB;KACnC;CACF,CAAC,CAAC;AACH,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,SAAS;MACjD,iBAAiB,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;AAElD,MAAM,UAAU,GAAG,KAAK,EACtB,MAAwB,EACxB,YAAoB,EACpB,QAA6C,EAC7C,SAAkB,EAClB,EAAE;IACF,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE;QACzD,IAAI,IAAI,GAA+B,EAAE,CAAC;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACtC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE;gBAC7B,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC;gBACpB,IAAI,SAAS,EAAE;oBACb,KAAK,CAAC,MAAM,GAAG;wBACb,YAAY,EAAE,SAAS;qBACxB,CAAC;iBACH;aACF;YACD,IAAI,CAAC,IAAI,CAAC;gBACR,UAAU,EAAE,KAAK,CAAC,IAAI;gBACtB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;gBACtB,gBAAgB,EAAE,YAAY;gBAC9B,aAAa,EAAE,SAAS;gBACxB,SAAS,EAAE,QAAQ;gBACnB,WAAW,EAAE,KAAK,CAAC,MAAM;aAC1B,CAAC,CAAC;YACH,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBAClD,4CAA4C;gBAC5C,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;gBACzC,IAAI,GAAG,EAAE,CAAC;aACX;SACF;KACF;AACH,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-to-tiktok.js","sourceRoot":"","sources":["../../../src/lib/analytics/send-to-tiktok.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,kEAAkE;AAClE,kFAAkF;AAClF,MAAM,OAAO,GAAG,MAAM,CAAC;AACvB,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,OAAO,EAAE,4CAA4C,OAAO,cAAc;IAC1E,OAAO,EAAE;QACP,cAAc,EAAE,kBAAkB;QAClC,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB;KAChD;CACF,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,KAAK,EACxB,MAAwB,EACxB,YAAoB,EACpB,IAAyC,EACzC,EAAE;IACF,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE;QAClE,IAAI,IAAI,GAA+B,EAAE,CAAC;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACtC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE;gBAC7B,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC;aACxB;YACD,IAAI,CAAC,IAAI,CAAC;gBACR,KAAK,EAAE,KAAK,CAAC,IAAI;gBACjB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;gBACtB,IAAI;gBACJ,IAAI,EAAE;oBACJ,GAAG,EAAE,YAAY;iBAClB;gBACD,UAAU,EAAE,KAAK,CAAC,MAAM;aACzB,CAAC,CAAC;YACH,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBAClD,4CAA4C;gBAC5C,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE;oBACvB,YAAY,EAAE,KAAK;oBACnB,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe;oBAC5C,IAAI;iBACL,CAAC,CAAC;gBACH,IAAI,GAAG,EAAE,CAAC;aACX;SACF;KACF;AACH,CAAC,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -23,7 +23,8 @@ const sendAnalyticsEvents = async ({ url, events }, payload = {}) => {
23
23
  return name === 'page_view';
24
24
  });
25
25
  const productView = gaEvents.find(({ name, params }) => {
26
- return name === 'view_item' && params?.item_list_id === 'product-page';
26
+ return name === 'view_item'
27
+ && params?.items?.[0]?.item_list_id === 'product-page';
27
28
  });
28
29
  if (pageView || productView) {
29
30
  const db = getFirestore();
@@ -32,8 +33,8 @@ const sendAnalyticsEvents = async ({ url, events }, payload = {}) => {
32
33
  .add({ url, at: Timestamp.now() });
33
34
  storingEvents.push(storing);
34
35
  }
35
- const productId = productView?.params?.object_id;
36
- if (productId) {
36
+ const productId = productView?.params?.items?.[0]?.object_id;
37
+ if (typeof productId === 'string' && /[0-9a-f]{24}/.test(productId)) {
37
38
  const storing = db.doc(`ssrProductViews/${productId}`)
38
39
  .set({ countUnsaved: FieldValue.increment(1) }, { merge: true });
39
40
  storingEvents.push(storing);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics-events.js","sourceRoot":"","sources":["../../src/lib/analytics-events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import { getFirestore } from 'firebase-admin/firestore';
2
+ import { error } from 'firebase-functions/logger';
3
+ import axios from 'axios';
4
+ import api from '@cloudcommerce/api';
5
+ import { deleteQueryBatch } from '@cloudcommerce/firebase/lib/helpers/firestore';
6
+
7
+ const saveViews = async () => {
8
+ /* eslint-disable no-await-in-loop */
9
+ const db = getFirestore();
10
+ const productViewsSnapshot = await db.collection('ssrProductViews')
11
+ .limit(500).get();
12
+ for (let i = 0; i < productViewsSnapshot.docs.length; i++) {
13
+ const doc = productViewsSnapshot.docs[i];
14
+ const { countUnsaved } = doc.data();
15
+ if (countUnsaved > 0) {
16
+ const productId = doc.id;
17
+ const { views } = (await api.get(`products/${productId}`)).data;
18
+ await api.patch(`products/${productId}`, {
19
+ views: countUnsaved + (views || 0),
20
+ });
21
+ }
22
+ doc.ref.delete();
23
+ }
24
+ if (process.env.BUNNYNET_API_KEY) {
25
+ try {
26
+ const pageViewsSnapshot = await db.collection('ssrPageViews')
27
+ .where('at', '>', new Date(Date.now() - 1000 * 60 * 20))
28
+ .get();
29
+ const purgedUrls = [];
30
+ for (let i = 0; i < pageViewsSnapshot.docs.length; i++) {
31
+ const doc = pageViewsSnapshot.docs[i];
32
+ const { url } = doc.data();
33
+ if (url && !purgedUrls.includes(url)) {
34
+ await axios('https://api.bunny.net/purge', {
35
+ method: 'POST',
36
+ params: {
37
+ async: 'false',
38
+ url,
39
+ },
40
+ headers: {
41
+ AccessKey: process.env.BUNNYNET_API_KEY,
42
+ },
43
+ });
44
+ purgedUrls.push(url);
45
+ }
46
+ }
47
+ } catch (err) {
48
+ error(err);
49
+ }
50
+ }
51
+ const pageViewsQuery = db.collection('ssrPageViews')
52
+ .where('at', '<', new Date(Date.now() - 1000 * 60 * 60 * 24 * 90));
53
+ await deleteQueryBatch(db, pageViewsQuery);
54
+ };
55
+
56
+ export default saveViews;
57
+ // # sourceMappingURL=cron-ssr-save-views.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-ssr-save-views.js","sourceRoot":"","sources":["../../src/lib/cron-ssr-save-views.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,oBAAoB,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,+CAA+C,CAAC;AAEjF,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;IAC3B,qCAAqC;IACrC,MAAM,EAAE,GAAG,YAAY,EAAE,CAAC;IAC1B,MAAM,oBAAoB,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC;SAChE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,oBAAoB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACzD,MAAM,GAAG,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC,IAAI,EAA8B,CAAC;QAChE,IAAI,YAAY,GAAG,CAAC,EAAE;YACpB,MAAM,SAAS,GAAG,GAAG,CAAC,EAA6B,CAAC;YACpD,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,YAAY,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAChE,MAAM,GAAG,CAAC,KAAK,CAAC,YAAY,SAAS,EAAE,EAAE;gBACvC,KAAK,EAAE,YAAY,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC;aACnC,CAAC,CAAC;SACJ;QACD,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;KAClB;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE;QAChC,IAAI;YACF,MAAM,iBAAiB,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC;iBAC1D,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;iBACvD,GAAG,EAAE,CAAC;YACT,MAAM,UAAU,GAAa,EAAE,CAAC;YAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACtD,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACtC,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,IAAI,EAAqB,CAAC;gBAC9C,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;oBACpC,MAAM,KAAK,CAAC,6BAA6B,EAAE;wBACzC,MAAM,EAAE,MAAM;wBACd,MAAM,EAAE;4BACN,KAAK,EAAE,OAAO;4BACd,GAAG;yBACJ;wBACD,OAAO,EAAE;4BACP,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB;yBACxC;qBACF,CAAC,CAAC;oBACH,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;iBACtB;aACF;SACF;QAAC,OAAO,GAAG,EAAE;YACZ,KAAK,CAAC,GAAG,CAAC,CAAC;SACZ;KACF;IACD,MAAM,cAAc,GAAG,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC;SACjD,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACrE,MAAM,gBAAgB,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;AAC7C,CAAC,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -2,7 +2,7 @@ import { join as joinPath } from 'node:path';
2
2
  import { readFile } from 'node:fs/promises';
3
3
  import logger from 'firebase-functions/logger';
4
4
  import config from '@cloudcommerce/firebase/lib/config';
5
- import { sendAnalyticsEvents } from '../analytics-events.js';
5
+ import { sendAnalyticsEvents } from './analytics-events.js';
6
6
 
7
7
  const { STOREFRONT_BASE_DIR } = process.env;
8
8
  const baseDir = STOREFRONT_BASE_DIR || process.cwd();
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve-storefront.js","sourceRoot":"","sources":["../../src/lib/serve-storefront.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /* eslint-disable import/prefer-default-export */
2
+ import '@cloudcommerce/firebase/lib/init';
3
+ import config from '@cloudcommerce/firebase/lib/config';
4
+ import functions from 'firebase-functions';
5
+ import saveViews from './lib/cron-ssr-save-views.js';
6
+
7
+ const { httpsFunctionOptions: { region } } = config.get();
8
+
9
+ export const ssr = {
10
+ cronSaveViews: functions.region(region).runWith({
11
+ timeoutSeconds: 119,
12
+ memory: '256MB',
13
+ }).pubsub
14
+ .schedule(process.env.CRONTAB_SSR_SAVE_VIEWS
15
+ || (process.env.BUNNYNET_API_KEY ? '*/2 * * * *' : '49 * * * *'))
16
+ .onRun(saveViews),
17
+ };
18
+ // # sourceMappingURL=ssr-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssr-events.js","sourceRoot":"","sources":["../src/ssr-events.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,OAAO,kCAAkC,CAAC;AAC1C,OAAO,MAAM,MAAM,oCAAoC,CAAC;AACxD,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,SAAS,MAAM,2BAA2B,CAAC;AAElD,MAAM,EAAE,oBAAoB,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;AAE1D,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,aAAa,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;QAC9C,cAAc,EAAE,GAAG;QACnB,MAAM,EAAE,OAAO;KAChB,CAAC,CAAC,MAAM;SACN,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB;WACvC,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;SAClE,KAAK,CAAC,SAAS,CAAC;CACpB,CAAC"}
@@ -1,13 +1,14 @@
1
1
  {
2
2
  "name": "@cloudcommerce/ssr",
3
3
  "type": "module",
4
- "version": "0.40.4",
4
+ "version": "0.41.0",
5
5
  "description": "E-Com Plus Cloud Commerce storefront SSR",
6
6
  "main": "lib/index.js",
7
7
  "exports": {
8
8
  ".": "./lib/index.js",
9
9
  "./firebase": "./lib/firebase.js",
10
- "./lib/analytics-events": "./lib/analytics-events.js"
10
+ "./events": "./lib/ssr-events.js",
11
+ "./lib/analytics-events": "./lib/lib/analytics-events.js"
11
12
  },
12
13
  "repository": {
13
14
  "type": "git",
@@ -30,10 +31,10 @@
30
31
  "@cloudcommerce/firebase": "workspace:*",
31
32
  "@cloudcommerce/i18n": "workspace:*",
32
33
  "@ecomplus/utils": "1.5.0-rc.6",
33
- "@vueuse/core": "10.7.0",
34
+ "@vueuse/core": "10.7.1",
34
35
  "astro": "4.0.8",
35
36
  "astro-capo": "^0.0.1",
36
- "axios": "^1.6.2",
37
+ "axios": "^1.6.3",
37
38
  "firebase-admin": "^11.11.1",
38
39
  "firebase-functions": "^4.5.0",
39
40
  "mitt": "^3.0.1",
@@ -5,7 +5,7 @@ initializeApp();
5
5
 
6
6
  import { onRequest } from 'firebase-functions/v2/https';
7
7
  import config from '@cloudcommerce/firebase/lib/config';
8
- import serveStorefront from './firebase/serve-storefront';
8
+ import serveStorefront from './lib/serve-storefront';
9
9
 
10
10
  const { ssrFunctionOptions } = config.get();
11
11
 
@@ -1,3 +1,3 @@
1
- import serveStorefront from './firebase/serve-storefront';
1
+ import serveStorefront from './lib/serve-storefront';
2
2
 
3
3
  export default serveStorefront;
@@ -38,7 +38,8 @@ const sendAnalyticsEvents = async (
38
38
  return name === 'page_view';
39
39
  });
40
40
  const productView = gaEvents.find(({ name, params }) => {
41
- return name === 'view_item' && params?.item_list_id === 'product-page';
41
+ return name === 'view_item'
42
+ && params?.items?.[0]?.item_list_id === 'product-page';
42
43
  });
43
44
  if (pageView || productView) {
44
45
  const db = getFirestore();
@@ -47,8 +48,8 @@ const sendAnalyticsEvents = async (
47
48
  .add({ url, at: Timestamp.now() });
48
49
  storingEvents.push(storing);
49
50
  }
50
- const productId = productView?.params?.object_id;
51
- if (productId) {
51
+ const productId = productView?.params?.items?.[0]?.object_id;
52
+ if (typeof productId === 'string' && /[0-9a-f]{24}/.test(productId)) {
52
53
  const storing = db.doc(`ssrProductViews/${productId}`)
53
54
  .set({ countUnsaved: FieldValue.increment(1) }, { merge: true });
54
55
  storingEvents.push(storing);
@@ -0,0 +1,56 @@
1
+ import { getFirestore } from 'firebase-admin/firestore';
2
+ import { error } from 'firebase-functions/logger';
3
+ import axios from 'axios';
4
+ import api from '@cloudcommerce/api';
5
+ import { deleteQueryBatch } from '@cloudcommerce/firebase/lib/helpers/firestore';
6
+
7
+ const saveViews = async () => {
8
+ /* eslint-disable no-await-in-loop */
9
+ const db = getFirestore();
10
+ const productViewsSnapshot = await db.collection('ssrProductViews')
11
+ .limit(500).get();
12
+ for (let i = 0; i < productViewsSnapshot.docs.length; i++) {
13
+ const doc = productViewsSnapshot.docs[i];
14
+ const { countUnsaved } = doc.data() as { countUnsaved: number };
15
+ if (countUnsaved > 0) {
16
+ const productId = doc.id as string & { length: 24 };
17
+ const { views } = (await api.get(`products/${productId}`)).data;
18
+ await api.patch(`products/${productId}`, {
19
+ views: countUnsaved + (views || 0),
20
+ });
21
+ }
22
+ doc.ref.delete();
23
+ }
24
+ if (process.env.BUNNYNET_API_KEY) {
25
+ try {
26
+ const pageViewsSnapshot = await db.collection('ssrPageViews')
27
+ .where('at', '>', new Date(Date.now() - 1000 * 60 * 20))
28
+ .get();
29
+ const purgedUrls: string[] = [];
30
+ for (let i = 0; i < pageViewsSnapshot.docs.length; i++) {
31
+ const doc = pageViewsSnapshot.docs[i];
32
+ const { url } = doc.data() as { url: string };
33
+ if (url && !purgedUrls.includes(url)) {
34
+ await axios('https://api.bunny.net/purge', {
35
+ method: 'POST',
36
+ params: {
37
+ async: 'false',
38
+ url,
39
+ },
40
+ headers: {
41
+ AccessKey: process.env.BUNNYNET_API_KEY,
42
+ },
43
+ });
44
+ purgedUrls.push(url);
45
+ }
46
+ }
47
+ } catch (err) {
48
+ error(err);
49
+ }
50
+ }
51
+ const pageViewsQuery = db.collection('ssrPageViews')
52
+ .where('at', '<', new Date(Date.now() - 1000 * 60 * 60 * 24 * 90));
53
+ await deleteQueryBatch(db, pageViewsQuery);
54
+ };
55
+
56
+ export default saveViews;
@@ -1,11 +1,11 @@
1
1
  import type { OutgoingHttpHeaders } from 'node:http';
2
2
  import type { Request, Response } from 'firebase-functions';
3
- import type { GroupedAnalyticsEvents } from '../analytics-events';
3
+ import type { GroupedAnalyticsEvents } from './analytics-events';
4
4
  import { join as joinPath } from 'node:path';
5
5
  import { readFile } from 'node:fs/promises';
6
6
  import logger from 'firebase-functions/logger';
7
7
  import config from '@cloudcommerce/firebase/lib/config';
8
- import { sendAnalyticsEvents } from '../analytics-events';
8
+ import { sendAnalyticsEvents } from './analytics-events';
9
9
 
10
10
  declare global {
11
11
  // eslint-disable-next-line
@@ -0,0 +1,17 @@
1
+ /* eslint-disable import/prefer-default-export */
2
+ import '@cloudcommerce/firebase/lib/init';
3
+ import config from '@cloudcommerce/firebase/lib/config';
4
+ import functions from 'firebase-functions';
5
+ import saveViews from './lib/cron-ssr-save-views';
6
+
7
+ const { httpsFunctionOptions: { region } } = config.get();
8
+
9
+ export const ssr = {
10
+ cronSaveViews: functions.region(region).runWith({
11
+ timeoutSeconds: 119,
12
+ memory: '256MB',
13
+ }).pubsub
14
+ .schedule(process.env.CRONTAB_SSR_SAVE_VIEWS
15
+ || (process.env.BUNNYNET_API_KEY ? '*/2 * * * *' : '49 * * * *'))
16
+ .onRun(saveViews),
17
+ };
@@ -253,6 +253,9 @@ const genAstroConfig = ({
253
253
  preserveSymlinks: lstatSync(joinPath(process.cwd(), 'src/components')).isSymbolicLink(),
254
254
  alias: viteAlias,
255
255
  },
256
+ define: {
257
+ __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: 'false',
258
+ },
256
259
  },
257
260
  };
258
261
  };
@@ -1,4 +1,4 @@
1
- global.__storefrontCMS = (fs, resolvePath) => {
1
+ global.__storefrontCMS = (fs, resolvePath, _parseMatter) => {
2
2
  const { STOREFRONT_BASE_DIR } = process.env;
3
3
  let baseDir;
4
4
  if (STOREFRONT_BASE_DIR) {
@@ -8,6 +8,7 @@ global.__storefrontCMS = (fs, resolvePath) => {
8
8
  }
9
9
  process.env.STOREFRONT_BASE_DIR = baseDir;
10
10
  const dirContent = resolvePath(baseDir, 'content');
11
+ const resolveContent = (filename) => resolvePath(dirContent, filename);
11
12
 
12
13
  const contentCache = {};
13
14
  const getContent = (filename) => {
@@ -17,7 +18,7 @@ global.__storefrontCMS = (fs, resolvePath) => {
17
18
  let content = contentCache[filename];
18
19
  if (!content) {
19
20
  if (filename.endsWith('/')) {
20
- const dirColl = resolvePath(dirContent, filename);
21
+ const dirColl = resolveContent(filename);
21
22
  return new Promise((resolve) => {
22
23
  const slugs = fs.existsSync(dirColl)
23
24
  ? fs.readdirSync(dirColl)
@@ -27,16 +28,22 @@ global.__storefrontCMS = (fs, resolvePath) => {
27
28
  resolve(slugs);
28
29
  });
29
30
  }
30
- // @TODO: Also parse Markdown with front matter
31
- const filepath = resolvePath(dirContent, `${filename}.json`);
32
- content = fs.existsSync(filepath)
33
- ? JSON.parse(fs.readFileSync(filepath, 'utf8'))
34
- : null;
31
+ const jsonFilepath = resolveContent(`${filename}.json`);
32
+ if (fs.existsSync(jsonFilepath)) {
33
+ content = JSON.parse(fs.readFileSync(jsonFilepath, 'utf8'));
34
+ } else if (_parseMatter && fs.existsSync(resolveContent(`${filename}.md`))) {
35
+ const rawMd = fs.readFileSync(resolveContent(`${filename}.md`), 'utf8');
36
+ const { markdown, matter } = _parseMatter(rawMd);
37
+ content = { ...matter, markdown };
38
+ } else {
39
+ content = null;
40
+ }
35
41
  if (!filename.includes('/')) {
36
42
  // Caching root content only (not collections)
37
43
  contentCache[filename] = content;
38
44
  }
39
45
  }
46
+ if (typeof content.then === 'function') return content;
40
47
  return filename === 'settings'
41
48
  ? content
42
49
  : new Promise((resolve) => { resolve(content); });