@uptrademedia/site-kit 1.1.0 → 1.1.2

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 (82) hide show
  1. package/README.md +1 -1
  2. package/dist/{chunk-6NTMCSHP.js → chunk-53UQPBNI.js} +2 -2
  3. package/dist/{chunk-6NTMCSHP.js.map → chunk-53UQPBNI.js.map} +1 -1
  4. package/dist/{chunk-GM2ZDV2B.mjs → chunk-AQWUIXKC.mjs} +4 -3
  5. package/dist/chunk-AQWUIXKC.mjs.map +1 -0
  6. package/dist/{chunk-JRCYNWUZ.js → chunk-GHSZWROI.js} +5 -5
  7. package/dist/{chunk-JRCYNWUZ.js.map → chunk-GHSZWROI.js.map} +1 -1
  8. package/dist/{chunk-ZG2AGGPZ.js → chunk-HAQGHTGV.js} +3 -3
  9. package/dist/chunk-HAQGHTGV.js.map +1 -0
  10. package/dist/{chunk-F6D3L676.js → chunk-HEUULOSC.js} +4 -4
  11. package/dist/{chunk-F6D3L676.js.map → chunk-HEUULOSC.js.map} +1 -1
  12. package/dist/{chunk-QT73LSTP.mjs → chunk-HYJHGCYY.mjs} +3 -3
  13. package/dist/chunk-HYJHGCYY.mjs.map +1 -0
  14. package/dist/{chunk-WG2SI2UN.mjs → chunk-KG46POJZ.mjs} +2 -2
  15. package/dist/{chunk-WG2SI2UN.mjs.map → chunk-KG46POJZ.mjs.map} +1 -1
  16. package/dist/{chunk-SONJCT7Z.mjs → chunk-TI5CH4WT.mjs} +142 -28
  17. package/dist/chunk-TI5CH4WT.mjs.map +1 -0
  18. package/dist/{chunk-ASVFZY6X.mjs → chunk-TJUON7TH.mjs} +2 -2
  19. package/dist/chunk-TJUON7TH.mjs.map +1 -0
  20. package/dist/{chunk-H5PVDCCM.js → chunk-UENZ4BYN.js} +4 -3
  21. package/dist/chunk-UENZ4BYN.js.map +1 -0
  22. package/dist/{chunk-4KKQQRZV.js → chunk-V7QPQBFG.js} +2 -2
  23. package/dist/chunk-V7QPQBFG.js.map +1 -0
  24. package/dist/{chunk-WZMRFNJK.mjs → chunk-YT5SBY5W.mjs} +4 -4
  25. package/dist/{chunk-WZMRFNJK.mjs.map → chunk-YT5SBY5W.mjs.map} +1 -1
  26. package/dist/{chunk-MVNUEXP3.js → chunk-YZRNC2Z6.js} +142 -28
  27. package/dist/chunk-YZRNC2Z6.js.map +1 -0
  28. package/dist/{chunk-35Y3M4ZE.mjs → chunk-ZUYWXUHQ.mjs} +5 -5
  29. package/dist/{chunk-35Y3M4ZE.mjs.map → chunk-ZUYWXUHQ.mjs.map} +1 -1
  30. package/dist/cli/index.js +4 -4
  31. package/dist/cli/index.js.map +1 -1
  32. package/dist/cli/index.mjs +2 -2
  33. package/dist/cli/index.mjs.map +1 -1
  34. package/dist/commerce/index.d.mts +1 -1
  35. package/dist/commerce/index.d.ts +1 -1
  36. package/dist/commerce/index.js +40 -40
  37. package/dist/commerce/index.mjs +1 -1
  38. package/dist/engage/index.d.mts +2 -1
  39. package/dist/engage/index.d.ts +2 -1
  40. package/dist/engage/index.js +4 -4
  41. package/dist/engage/index.mjs +1 -1
  42. package/dist/{generators-H6YQQRR4.mjs → generators-EQHJ22YW.mjs} +3 -3
  43. package/dist/{generators-H6YQQRR4.mjs.map → generators-EQHJ22YW.mjs.map} +1 -1
  44. package/dist/{generators-HZZLGIUB.js → generators-UXPMVYP4.js} +9 -9
  45. package/dist/{generators-HZZLGIUB.js.map → generators-UXPMVYP4.js.map} +1 -1
  46. package/dist/index.d.mts +10 -5
  47. package/dist/index.d.ts +10 -5
  48. package/dist/index.js +50 -48
  49. package/dist/index.js.map +1 -1
  50. package/dist/index.mjs +20 -18
  51. package/dist/index.mjs.map +1 -1
  52. package/dist/redirects/index.d.mts +1 -1
  53. package/dist/redirects/index.d.ts +1 -1
  54. package/dist/redirects/index.js +5 -5
  55. package/dist/redirects/index.mjs +1 -1
  56. package/dist/{routing-DpR93G8R.d.ts → routing-D311WhuV.d.ts} +1 -1
  57. package/dist/{routing-yuOiCiAy.d.mts → routing-bTjqOM8S.d.mts} +1 -1
  58. package/dist/seo/index.d.mts +1 -1
  59. package/dist/seo/index.d.ts +1 -1
  60. package/dist/seo/index.js +5 -5
  61. package/dist/seo/index.mjs +1 -1
  62. package/dist/seo/server.d.mts +1 -1
  63. package/dist/seo/server.d.ts +1 -1
  64. package/dist/seo/server.js +3 -3
  65. package/dist/seo/server.mjs +1 -1
  66. package/dist/setup/client.js +3 -3
  67. package/dist/setup/client.mjs +1 -1
  68. package/dist/setup/index.js +5 -5
  69. package/dist/setup/index.mjs +2 -2
  70. package/dist/setup/server.js +2 -2
  71. package/dist/setup/server.mjs +1 -1
  72. package/dist/{useEventModal-BRRT7ZSv.d.ts → useEventModal-CaDHkAMI.d.ts} +3 -1
  73. package/dist/{useEventModal-NSrCRDlG.d.mts → useEventModal-CfeDPU95.d.mts} +3 -1
  74. package/package.json +2 -2
  75. package/dist/chunk-4KKQQRZV.js.map +0 -1
  76. package/dist/chunk-ASVFZY6X.mjs.map +0 -1
  77. package/dist/chunk-GM2ZDV2B.mjs.map +0 -1
  78. package/dist/chunk-H5PVDCCM.js.map +0 -1
  79. package/dist/chunk-MVNUEXP3.js.map +0 -1
  80. package/dist/chunk-QT73LSTP.mjs.map +0 -1
  81. package/dist/chunk-SONJCT7Z.mjs.map +0 -1
  82. package/dist/chunk-ZG2AGGPZ.js.map +0 -1
@@ -3,7 +3,7 @@ import { NextRequest, NextResponse } from 'next/server';
3
3
  /**
4
4
  * Managed Redirects - Next.js Middleware Helper
5
5
  *
6
- * Fetches redirect rules from Uptrade Portal and applies them.
6
+ * Fetches redirect rules from Sonor and applies them.
7
7
  * Can be used in middleware.ts for server-side redirects.
8
8
  *
9
9
  * Usage in middleware.ts:
@@ -3,7 +3,7 @@ import { NextRequest, NextResponse } from 'next/server';
3
3
  /**
4
4
  * Managed Redirects - Next.js Middleware Helper
5
5
  *
6
- * Fetches redirect rules from Uptrade Portal and applies them.
6
+ * Fetches redirect rules from Sonor and applies them.
7
7
  * Can be used in middleware.ts for server-side redirects.
8
8
  *
9
9
  * Usage in middleware.ts:
@@ -1,25 +1,25 @@
1
1
  'use strict';
2
2
 
3
- var chunk4KKQQRZV_js = require('../chunk-4KKQQRZV.js');
3
+ var chunkV7QPQBFG_js = require('../chunk-V7QPQBFG.js');
4
4
  require('../chunk-ZSMWDLMK.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "clearRedirectCache", {
9
9
  enumerable: true,
10
- get: function () { return chunk4KKQQRZV_js.clearRedirectCache; }
10
+ get: function () { return chunkV7QPQBFG_js.clearRedirectCache; }
11
11
  });
12
12
  Object.defineProperty(exports, "fetchRedirectRules", {
13
13
  enumerable: true,
14
- get: function () { return chunk4KKQQRZV_js.fetchRedirectRules; }
14
+ get: function () { return chunkV7QPQBFG_js.fetchRedirectRules; }
15
15
  });
16
16
  Object.defineProperty(exports, "generateNextRedirects", {
17
17
  enumerable: true,
18
- get: function () { return chunk4KKQQRZV_js.generateNextRedirects; }
18
+ get: function () { return chunkV7QPQBFG_js.generateNextRedirects; }
19
19
  });
20
20
  Object.defineProperty(exports, "handleManagedRedirects", {
21
21
  enumerable: true,
22
- get: function () { return chunk4KKQQRZV_js.handleManagedRedirects; }
22
+ get: function () { return chunkV7QPQBFG_js.handleManagedRedirects; }
23
23
  });
24
24
  //# sourceMappingURL=index.js.map
25
25
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,4 @@
1
- export { clearRedirectCache, fetchRedirectRules, generateNextRedirects, handleManagedRedirects } from '../chunk-ASVFZY6X.mjs';
1
+ export { clearRedirectCache, fetchRedirectRules, generateNextRedirects, handleManagedRedirects } from '../chunk-TJUON7TH.mjs';
2
2
  import '../chunk-4XPGGLVP.mjs';
3
3
  //# sourceMappingURL=index.mjs.map
4
4
  //# sourceMappingURL=index.mjs.map
@@ -60,7 +60,7 @@ declare function getRobotsDirective(options: GetRobotsOptions): Promise<RobotsDi
60
60
  */
61
61
  declare function generateSitemap(options: GetSitemapEntriesOptions): Promise<SitemapEntry[]>;
62
62
  /**
63
- * Register local sitemap entries with Uptrade Portal
63
+ * Register local sitemap entries with Sonor
64
64
  *
65
65
  * Call this at build time to sync your local routes to seo_pages.
66
66
  * This ensures analytics only tracks real pages.
@@ -60,7 +60,7 @@ declare function getRobotsDirective(options: GetRobotsOptions): Promise<RobotsDi
60
60
  */
61
61
  declare function generateSitemap(options: GetSitemapEntriesOptions): Promise<SitemapEntry[]>;
62
62
  /**
63
- * Register local sitemap entries with Uptrade Portal
63
+ * Register local sitemap entries with Sonor
64
64
  *
65
65
  * Call this at build time to sync your local routes to seo_pages.
66
66
  * This ensures analytics only tracks real pages.
@@ -1,6 +1,6 @@
1
1
  import { G as GetABVariantOptions, a as ABTestResult, b as GetManagedMetadataOptions, k as ManagedMetadataResult, m as ManagedSchemaProps, h as ManagedFAQProps, i as ManagedInternalLinksProps, f as ManagedContentProps, M as ManagedContentBlock, o as ManagedScriptsProps } from '../types-BF2v5qX3.mjs';
2
2
  export { A as ABTest, F as FAQItem, c as GetRedirectOptions, d as GetRobotsOptions, e as GetSitemapEntriesOptions, g as ManagedFAQData, j as ManagedLink, l as ManagedRedirect, n as ManagedScript, R as RedirectResult, p as RobotsDirective, q as SEOPageData, r as SchemaMarkup, s as SitemapEntry, U as UptradeSEOConfig } from '../types-BF2v5qX3.mjs';
3
- export { g as generateSitemap, a as getRedirect, b as getRobotsDirective, i as isIndexable } from '../routing-yuOiCiAy.mjs';
3
+ export { g as generateSitemap, a as getRedirect, b as getRobotsDirective, i as isIndexable } from '../routing-bTjqOM8S.mjs';
4
4
  import * as React from 'react';
5
5
  import 'next';
6
6
 
@@ -1,6 +1,6 @@
1
1
  import { G as GetABVariantOptions, a as ABTestResult, b as GetManagedMetadataOptions, k as ManagedMetadataResult, m as ManagedSchemaProps, h as ManagedFAQProps, i as ManagedInternalLinksProps, f as ManagedContentProps, M as ManagedContentBlock, o as ManagedScriptsProps } from '../types-BF2v5qX3.js';
2
2
  export { A as ABTest, F as FAQItem, c as GetRedirectOptions, d as GetRobotsOptions, e as GetSitemapEntriesOptions, g as ManagedFAQData, j as ManagedLink, l as ManagedRedirect, n as ManagedScript, R as RedirectResult, p as RobotsDirective, q as SEOPageData, r as SchemaMarkup, s as SitemapEntry, U as UptradeSEOConfig } from '../types-BF2v5qX3.js';
3
- export { g as generateSitemap, a as getRedirect, b as getRobotsDirective, i as isIndexable } from '../routing-DpR93G8R.js';
3
+ export { g as generateSitemap, a as getRedirect, b as getRobotsDirective, i as isIndexable } from '../routing-D311WhuV.js';
4
4
  import * as React from 'react';
5
5
  import 'next';
6
6
 
package/dist/seo/index.js CHANGED
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var chunkG7RSD56P_js = require('../chunk-G7RSD56P.js');
6
- var chunk6NTMCSHP_js = require('../chunk-6NTMCSHP.js');
6
+ var chunk53UQPBNI_js = require('../chunk-53UQPBNI.js');
7
7
  var chunkFOBATMSH_js = require('../chunk-FOBATMSH.js');
8
8
  require('../chunk-ZSMWDLMK.js');
9
9
  var jsxRuntime = require('react/jsx-runtime');
@@ -759,19 +759,19 @@ Object.defineProperty(exports, "SitemapSync", {
759
759
  });
760
760
  Object.defineProperty(exports, "generateSitemap", {
761
761
  enumerable: true,
762
- get: function () { return chunk6NTMCSHP_js.generateSitemap; }
762
+ get: function () { return chunk53UQPBNI_js.generateSitemap; }
763
763
  });
764
764
  Object.defineProperty(exports, "getRedirect", {
765
765
  enumerable: true,
766
- get: function () { return chunk6NTMCSHP_js.getRedirect; }
766
+ get: function () { return chunk53UQPBNI_js.getRedirect; }
767
767
  });
768
768
  Object.defineProperty(exports, "getRobotsDirective", {
769
769
  enumerable: true,
770
- get: function () { return chunk6NTMCSHP_js.getRobotsDirective; }
770
+ get: function () { return chunk53UQPBNI_js.getRobotsDirective; }
771
771
  });
772
772
  Object.defineProperty(exports, "isIndexable", {
773
773
  enumerable: true,
774
- get: function () { return chunk6NTMCSHP_js.isIndexable; }
774
+ get: function () { return chunk53UQPBNI_js.isIndexable; }
775
775
  });
776
776
  Object.defineProperty(exports, "getABTest", {
777
777
  enumerable: true,
@@ -1,5 +1,5 @@
1
1
  export { SitemapSync } from '../chunk-BQOFRBGZ.mjs';
2
- export { generateSitemap, getRedirect, getRobotsDirective, isIndexable } from '../chunk-WG2SI2UN.mjs';
2
+ export { generateSitemap, getRedirect, getRobotsDirective, isIndexable } from '../chunk-KG46POJZ.mjs';
3
3
  import { getSEOPageData, getABTest, recordABImpression, getSchemaMarkups, getEntityEnhancedSchema, getFAQData, getInternalLinks, getContentBlock, getEntities, getManagedScripts } from '../chunk-MLY7AWHG.mjs';
4
4
  export { getABTest, getContentBlock, getEntities, getEntityEnhancedSchema, getFAQData, getInternalLinks, getManagedScripts, getPrimaryEntity, getRedirectData, getRobotsData, getSEOPageData, getSchemaMarkups, getSitemapEntries, getVisibilityScore, getVisibilitySummary, recordABImpression, registerSitemap } from '../chunk-MLY7AWHG.mjs';
5
5
  import '../chunk-4XPGGLVP.mjs';
@@ -1,4 +1,4 @@
1
- export { g as generateSitemap, r as registerLocalSitemap } from '../routing-yuOiCiAy.mjs';
1
+ export { g as generateSitemap, r as registerLocalSitemap } from '../routing-bTjqOM8S.mjs';
2
2
  export { A as ABTest, a as ABTestResult, F as FAQItem, G as GetABVariantOptions, b as GetManagedMetadataOptions, c as GetRedirectOptions, d as GetRobotsOptions, e as GetSitemapEntriesOptions, M as ManagedContentBlock, f as ManagedContentProps, g as ManagedFAQData, h as ManagedFAQProps, i as ManagedInternalLinksProps, j as ManagedLink, k as ManagedMetadataResult, l as ManagedRedirect, m as ManagedSchemaProps, n as ManagedScript, o as ManagedScriptsProps, R as RedirectResult, p as RobotsDirective, S as SEOEntity, q as SEOPageData, r as SchemaMarkup, s as SitemapEntry, U as UptradeSEOConfig } from '../types-BF2v5qX3.mjs';
3
3
  import 'next';
4
4
 
@@ -1,4 +1,4 @@
1
- export { g as generateSitemap, r as registerLocalSitemap } from '../routing-DpR93G8R.js';
1
+ export { g as generateSitemap, r as registerLocalSitemap } from '../routing-D311WhuV.js';
2
2
  export { A as ABTest, a as ABTestResult, F as FAQItem, G as GetABVariantOptions, b as GetManagedMetadataOptions, c as GetRedirectOptions, d as GetRobotsOptions, e as GetSitemapEntriesOptions, M as ManagedContentBlock, f as ManagedContentProps, g as ManagedFAQData, h as ManagedFAQProps, i as ManagedInternalLinksProps, j as ManagedLink, k as ManagedMetadataResult, l as ManagedRedirect, m as ManagedSchemaProps, n as ManagedScript, o as ManagedScriptsProps, R as RedirectResult, p as RobotsDirective, S as SEOEntity, q as SEOPageData, r as SchemaMarkup, s as SitemapEntry, U as UptradeSEOConfig } from '../types-BF2v5qX3.js';
3
3
  import 'next';
4
4
 
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunk6NTMCSHP_js = require('../chunk-6NTMCSHP.js');
3
+ var chunk53UQPBNI_js = require('../chunk-53UQPBNI.js');
4
4
  require('../chunk-FOBATMSH.js');
5
5
  require('../chunk-ZSMWDLMK.js');
6
6
  var react = require('react');
@@ -185,11 +185,11 @@ react.cache(async (projectId) => {
185
185
 
186
186
  Object.defineProperty(exports, "generateSitemap", {
187
187
  enumerable: true,
188
- get: function () { return chunk6NTMCSHP_js.generateSitemap; }
188
+ get: function () { return chunk53UQPBNI_js.generateSitemap; }
189
189
  });
190
190
  Object.defineProperty(exports, "registerLocalSitemap", {
191
191
  enumerable: true,
192
- get: function () { return chunk6NTMCSHP_js.registerLocalSitemap; }
192
+ get: function () { return chunk53UQPBNI_js.registerLocalSitemap; }
193
193
  });
194
194
  exports.getABTest = getABTest;
195
195
  exports.getContentBlock = getContentBlock;
@@ -1,4 +1,4 @@
1
- export { generateSitemap, registerLocalSitemap } from '../chunk-WG2SI2UN.mjs';
1
+ export { generateSitemap, registerLocalSitemap } from '../chunk-KG46POJZ.mjs';
2
2
  import '../chunk-MLY7AWHG.mjs';
3
3
  import '../chunk-4XPGGLVP.mjs';
4
4
  import { cache } from 'react';
@@ -2,7 +2,7 @@
2
2
  'use strict';
3
3
 
4
4
  var chunk5TTUNB63_js = require('../chunk-5TTUNB63.js');
5
- var chunkJRCYNWUZ_js = require('../chunk-JRCYNWUZ.js');
5
+ var chunkGHSZWROI_js = require('../chunk-GHSZWROI.js');
6
6
  require('../chunk-ZSMWDLMK.js');
7
7
 
8
8
 
@@ -21,11 +21,11 @@ Object.defineProperty(exports, "getSnippetsByModule", {
21
21
  });
22
22
  Object.defineProperty(exports, "SetupWizard", {
23
23
  enumerable: true,
24
- get: function () { return chunkJRCYNWUZ_js.SetupWizard; }
24
+ get: function () { return chunkGHSZWROI_js.SetupWizard; }
25
25
  });
26
26
  Object.defineProperty(exports, "UptradeSetup", {
27
27
  enumerable: true,
28
- get: function () { return chunkJRCYNWUZ_js.SetupWizard; }
28
+ get: function () { return chunkGHSZWROI_js.SetupWizard; }
29
29
  });
30
30
  //# sourceMappingURL=client.js.map
31
31
  //# sourceMappingURL=client.js.map
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  export { IntegrationCodeView, generateIntegrationCode, getSnippetsByModule } from '../chunk-TEYPRKYU.mjs';
3
- export { SetupWizard, SetupWizard as UptradeSetup } from '../chunk-35Y3M4ZE.mjs';
3
+ export { SetupWizard, SetupWizard as UptradeSetup } from '../chunk-ZUYWXUHQ.mjs';
4
4
  import '../chunk-4XPGGLVP.mjs';
5
5
  //# sourceMappingURL=client.mjs.map
6
6
  //# sourceMappingURL=client.mjs.map
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  var chunk5TTUNB63_js = require('../chunk-5TTUNB63.js');
4
- var chunkF6D3L676_js = require('../chunk-F6D3L676.js');
5
- var chunkJRCYNWUZ_js = require('../chunk-JRCYNWUZ.js');
4
+ var chunkHEUULOSC_js = require('../chunk-HEUULOSC.js');
5
+ var chunkGHSZWROI_js = require('../chunk-GHSZWROI.js');
6
6
  require('../chunk-ZSMWDLMK.js');
7
7
 
8
8
 
@@ -21,15 +21,15 @@ Object.defineProperty(exports, "getSnippetsByModule", {
21
21
  });
22
22
  Object.defineProperty(exports, "handleRequest", {
23
23
  enumerable: true,
24
- get: function () { return chunkF6D3L676_js.handleRequest; }
24
+ get: function () { return chunkHEUULOSC_js.handleRequest; }
25
25
  });
26
26
  Object.defineProperty(exports, "SetupWizard", {
27
27
  enumerable: true,
28
- get: function () { return chunkJRCYNWUZ_js.SetupWizard; }
28
+ get: function () { return chunkGHSZWROI_js.SetupWizard; }
29
29
  });
30
30
  Object.defineProperty(exports, "UptradeSetup", {
31
31
  enumerable: true,
32
- get: function () { return chunkJRCYNWUZ_js.SetupWizard; }
32
+ get: function () { return chunkGHSZWROI_js.SetupWizard; }
33
33
  });
34
34
  //# sourceMappingURL=index.js.map
35
35
  //# sourceMappingURL=index.js.map
@@ -1,6 +1,6 @@
1
1
  export { IntegrationCodeView, generateIntegrationCode, getSnippetsByModule } from '../chunk-TEYPRKYU.mjs';
2
- export { handleRequest } from '../chunk-WZMRFNJK.mjs';
3
- export { SetupWizard, SetupWizard as UptradeSetup } from '../chunk-35Y3M4ZE.mjs';
2
+ export { handleRequest } from '../chunk-YT5SBY5W.mjs';
3
+ export { SetupWizard, SetupWizard as UptradeSetup } from '../chunk-ZUYWXUHQ.mjs';
4
4
  import '../chunk-4XPGGLVP.mjs';
5
5
  //# sourceMappingURL=index.mjs.map
6
6
  //# sourceMappingURL=index.mjs.map
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
- var chunkF6D3L676_js = require('../chunk-F6D3L676.js');
3
+ var chunkHEUULOSC_js = require('../chunk-HEUULOSC.js');
4
4
  require('../chunk-ZSMWDLMK.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "handleRequest", {
9
9
  enumerable: true,
10
- get: function () { return chunkF6D3L676_js.handleRequest; }
10
+ get: function () { return chunkHEUULOSC_js.handleRequest; }
11
11
  });
12
12
  //# sourceMappingURL=server.js.map
13
13
  //# sourceMappingURL=server.js.map
@@ -1,4 +1,4 @@
1
- export { handleRequest } from '../chunk-WZMRFNJK.mjs';
1
+ export { handleRequest } from '../chunk-YT5SBY5W.mjs';
2
2
  import '../chunk-4XPGGLVP.mjs';
3
3
  //# sourceMappingURL=server.mjs.map
4
4
  //# sourceMappingURL=server.mjs.map
@@ -141,6 +141,8 @@ interface CalendarViewProps {
141
141
  minDate?: Date;
142
142
  /** Maximum date to show */
143
143
  maxDate?: Date;
144
+ /** How to display events in cells: 'title' = text, 'image' = thumbnail with details on hover */
145
+ eventDisplay?: 'title' | 'image';
144
146
  /** Custom class names */
145
147
  className?: string;
146
148
  headerClassName?: string;
@@ -152,7 +154,7 @@ interface EventOnDay {
152
154
  event: CommerceOffering;
153
155
  schedule: CommerceSchedule;
154
156
  }
155
- declare function CalendarView({ events: propEvents, initialDate, category, onEventClick, onDayClick, showNavigation, showHeader, weekStartsOn, minDate, maxDate, className, headerClassName, dayClassName, eventClassName, todayClassName, }: CalendarViewProps): react_jsx_runtime.JSX.Element;
157
+ declare function CalendarView({ events: propEvents, initialDate, category, onEventClick, onDayClick, showNavigation, showHeader, weekStartsOn, minDate, maxDate, eventDisplay, className, headerClassName, dayClassName, eventClassName, todayClassName, }: CalendarViewProps): react_jsx_runtime.JSX.Element;
156
158
 
157
159
  interface EventModalProps {
158
160
  /** Event to display */
@@ -141,6 +141,8 @@ interface CalendarViewProps {
141
141
  minDate?: Date;
142
142
  /** Maximum date to show */
143
143
  maxDate?: Date;
144
+ /** How to display events in cells: 'title' = text, 'image' = thumbnail with details on hover */
145
+ eventDisplay?: 'title' | 'image';
144
146
  /** Custom class names */
145
147
  className?: string;
146
148
  headerClassName?: string;
@@ -152,7 +154,7 @@ interface EventOnDay {
152
154
  event: CommerceOffering;
153
155
  schedule: CommerceSchedule;
154
156
  }
155
- declare function CalendarView({ events: propEvents, initialDate, category, onEventClick, onDayClick, showNavigation, showHeader, weekStartsOn, minDate, maxDate, className, headerClassName, dayClassName, eventClassName, todayClassName, }: CalendarViewProps): react_jsx_runtime.JSX.Element;
157
+ declare function CalendarView({ events: propEvents, initialDate, category, onEventClick, onDayClick, showNavigation, showHeader, weekStartsOn, minDate, maxDate, eventDisplay, className, headerClassName, dayClassName, eventClassName, todayClassName, }: CalendarViewProps): react_jsx_runtime.JSX.Element;
156
158
 
157
159
  interface EventModalProps {
158
160
  /** Event to display */
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@uptrademedia/site-kit",
3
- "version": "1.1.0",
4
- "description": "Complete client-side integration kit for Uptrade Portal - SEO, Analytics, Engage, Forms, Blog",
3
+ "version": "1.1.2",
4
+ "description": "Complete client-side integration kit for Sonor - SEO, Analytics, Engage, Forms, Blog",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.mjs",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/redirects/index.ts"],"names":["NextResponse"],"mappings":"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","file":"chunk-4KKQQRZV.js","sourcesContent":["/**\n * Managed Redirects - Next.js Middleware Helper\n * \n * Fetches redirect rules from Uptrade Portal and applies them.\n * Can be used in middleware.ts for server-side redirects.\n * \n * Usage in middleware.ts:\n * \n * import { handleManagedRedirects } from '@uptrade/site-kit/redirects'\n * \n * export async function middleware(request: NextRequest) {\n * const redirect = await handleManagedRedirects(request, {\n * domain: 'example.com', // Your site's domain (without https://)\n * portalApiUrl: process.env.PORTAL_API_URL || 'https://api.uptrademedia.com',\n * })\n * \n * if (redirect) return redirect\n * \n * return NextResponse.next()\n * }\n */\n\nimport { NextRequest, NextResponse } from 'next/server'\n\nexport interface RedirectRule {\n from_path: string\n to_path: string\n redirect_type: '301' | '302' | '307' | '308'\n is_enabled: boolean\n}\n\nexport interface RedirectConfig {\n domain: string // Required: the domain to fetch redirects for\n portalApiUrl?: string\n cacheSeconds?: number\n}\n\n// Cache for redirect rules\nlet cachedRules: RedirectRule[] = []\nlet cacheExpiry = 0\n\n/**\n * Fetch redirect rules from Portal API\n */\nexport async function fetchRedirectRules(config: RedirectConfig): Promise<RedirectRule[]> {\n const now = Date.now()\n const cacheSeconds = config.cacheSeconds ?? 300 // 5 min default\n\n // Return cached if still valid\n if (cachedRules.length > 0 && now < cacheExpiry) {\n return cachedRules\n }\n\n try {\n const baseUrl = config.portalApiUrl || 'https://api.uptrademedia.com'\n // Use domain-based lookup from public endpoint (no auth required)\n const domain = config.domain || ''\n const url = `${baseUrl}/api/public/seo/redirects?domain=${encodeURIComponent(domain)}`\n\n const res = await fetch(url, {\n headers: { 'Content-Type': 'application/json' },\n next: { revalidate: cacheSeconds },\n })\n\n if (!res.ok) {\n console.error(`[site-kit] Failed to fetch redirects: ${res.status}`)\n return cachedRules\n }\n\n const data = await res.json()\n cachedRules = (data.redirects || []).filter((r: RedirectRule) => r.is_enabled)\n cacheExpiry = now + (cacheSeconds * 1000)\n \n return cachedRules\n } catch (error) {\n console.error('[site-kit] Error fetching redirects:', error)\n return cachedRules\n }\n}\n\n/**\n * Handle managed redirects in middleware\n * Returns a NextResponse.redirect if a match is found, otherwise undefined\n */\nexport async function handleManagedRedirects(\n request: NextRequest,\n config: RedirectConfig,\n): Promise<NextResponse | undefined> {\n const pathname = request.nextUrl.pathname\n \n // Skip for static assets and API routes\n if (\n pathname.startsWith('/_next') ||\n pathname.startsWith('/api') ||\n pathname.includes('.') // Has file extension\n ) {\n return undefined\n }\n\n const rules = await fetchRedirectRules(config)\n \n // Find matching redirect\n const match = rules.find(r => {\n // Exact match\n if (r.from_path === pathname) return true\n \n // Match with trailing slash variance\n const normalizedFrom = r.from_path.endsWith('/') \n ? r.from_path.slice(0, -1) \n : r.from_path\n const normalizedPath = pathname.endsWith('/') \n ? pathname.slice(0, -1) \n : pathname\n \n return normalizedFrom === normalizedPath\n })\n\n if (!match) {\n return undefined\n }\n\n // Build redirect URL\n const redirectUrl = new URL(match.to_path, request.url)\n \n // Preserve query params\n request.nextUrl.searchParams.forEach((value, key) => {\n redirectUrl.searchParams.set(key, value)\n })\n\n // Track hit (fire and forget)\n trackRedirectHit(config, match.from_path).catch(() => {})\n\n // Return redirect response\n const statusCode = parseInt(match.redirect_type) as 301 | 302 | 307 | 308\n return NextResponse.redirect(redirectUrl, statusCode)\n}\n\n/**\n * Track redirect hit for analytics\n */\nasync function trackRedirectHit(config: RedirectConfig, fromPath: string): Promise<void> {\n try {\n const baseUrl = config.portalApiUrl || 'https://api.uptrademedia.com'\n await fetch(`${baseUrl}/api/public/seo/redirects/hit`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ domain: config.domain, from_path: fromPath }),\n })\n } catch {\n // Ignore tracking errors\n }\n}\n\n/**\n * Generate Next.js redirects config from Portal\n * Use this in next.config.js for build-time redirects\n * \n * Usage in next.config.js:\n * \n * const { generateNextRedirects } = require('@uptrade/site-kit/redirects')\n * \n * module.exports = {\n * async redirects() {\n * return generateNextRedirects({\n * domain: 'example.com',\n * portalApiUrl: process.env.PORTAL_API_URL,\n * })\n * }\n * }\n */\nexport async function generateNextRedirects(config: RedirectConfig): Promise<Array<{\n source: string\n destination: string\n permanent: boolean\n}>> {\n const rules = await fetchRedirectRules({ ...config, cacheSeconds: 0 })\n \n return rules.map(r => ({\n source: r.from_path,\n destination: r.to_path,\n permanent: r.redirect_type === '301' || r.redirect_type === '308',\n }))\n}\n\n/**\n * Clear redirect cache (useful for development)\n */\nexport function clearRedirectCache(): void {\n cachedRules = []\n cacheExpiry = 0\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/redirects/index.ts"],"names":[],"mappings":"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","file":"chunk-ASVFZY6X.mjs","sourcesContent":["/**\n * Managed Redirects - Next.js Middleware Helper\n * \n * Fetches redirect rules from Uptrade Portal and applies them.\n * Can be used in middleware.ts for server-side redirects.\n * \n * Usage in middleware.ts:\n * \n * import { handleManagedRedirects } from '@uptrade/site-kit/redirects'\n * \n * export async function middleware(request: NextRequest) {\n * const redirect = await handleManagedRedirects(request, {\n * domain: 'example.com', // Your site's domain (without https://)\n * portalApiUrl: process.env.PORTAL_API_URL || 'https://api.uptrademedia.com',\n * })\n * \n * if (redirect) return redirect\n * \n * return NextResponse.next()\n * }\n */\n\nimport { NextRequest, NextResponse } from 'next/server'\n\nexport interface RedirectRule {\n from_path: string\n to_path: string\n redirect_type: '301' | '302' | '307' | '308'\n is_enabled: boolean\n}\n\nexport interface RedirectConfig {\n domain: string // Required: the domain to fetch redirects for\n portalApiUrl?: string\n cacheSeconds?: number\n}\n\n// Cache for redirect rules\nlet cachedRules: RedirectRule[] = []\nlet cacheExpiry = 0\n\n/**\n * Fetch redirect rules from Portal API\n */\nexport async function fetchRedirectRules(config: RedirectConfig): Promise<RedirectRule[]> {\n const now = Date.now()\n const cacheSeconds = config.cacheSeconds ?? 300 // 5 min default\n\n // Return cached if still valid\n if (cachedRules.length > 0 && now < cacheExpiry) {\n return cachedRules\n }\n\n try {\n const baseUrl = config.portalApiUrl || 'https://api.uptrademedia.com'\n // Use domain-based lookup from public endpoint (no auth required)\n const domain = config.domain || ''\n const url = `${baseUrl}/api/public/seo/redirects?domain=${encodeURIComponent(domain)}`\n\n const res = await fetch(url, {\n headers: { 'Content-Type': 'application/json' },\n next: { revalidate: cacheSeconds },\n })\n\n if (!res.ok) {\n console.error(`[site-kit] Failed to fetch redirects: ${res.status}`)\n return cachedRules\n }\n\n const data = await res.json()\n cachedRules = (data.redirects || []).filter((r: RedirectRule) => r.is_enabled)\n cacheExpiry = now + (cacheSeconds * 1000)\n \n return cachedRules\n } catch (error) {\n console.error('[site-kit] Error fetching redirects:', error)\n return cachedRules\n }\n}\n\n/**\n * Handle managed redirects in middleware\n * Returns a NextResponse.redirect if a match is found, otherwise undefined\n */\nexport async function handleManagedRedirects(\n request: NextRequest,\n config: RedirectConfig,\n): Promise<NextResponse | undefined> {\n const pathname = request.nextUrl.pathname\n \n // Skip for static assets and API routes\n if (\n pathname.startsWith('/_next') ||\n pathname.startsWith('/api') ||\n pathname.includes('.') // Has file extension\n ) {\n return undefined\n }\n\n const rules = await fetchRedirectRules(config)\n \n // Find matching redirect\n const match = rules.find(r => {\n // Exact match\n if (r.from_path === pathname) return true\n \n // Match with trailing slash variance\n const normalizedFrom = r.from_path.endsWith('/') \n ? r.from_path.slice(0, -1) \n : r.from_path\n const normalizedPath = pathname.endsWith('/') \n ? pathname.slice(0, -1) \n : pathname\n \n return normalizedFrom === normalizedPath\n })\n\n if (!match) {\n return undefined\n }\n\n // Build redirect URL\n const redirectUrl = new URL(match.to_path, request.url)\n \n // Preserve query params\n request.nextUrl.searchParams.forEach((value, key) => {\n redirectUrl.searchParams.set(key, value)\n })\n\n // Track hit (fire and forget)\n trackRedirectHit(config, match.from_path).catch(() => {})\n\n // Return redirect response\n const statusCode = parseInt(match.redirect_type) as 301 | 302 | 307 | 308\n return NextResponse.redirect(redirectUrl, statusCode)\n}\n\n/**\n * Track redirect hit for analytics\n */\nasync function trackRedirectHit(config: RedirectConfig, fromPath: string): Promise<void> {\n try {\n const baseUrl = config.portalApiUrl || 'https://api.uptrademedia.com'\n await fetch(`${baseUrl}/api/public/seo/redirects/hit`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ domain: config.domain, from_path: fromPath }),\n })\n } catch {\n // Ignore tracking errors\n }\n}\n\n/**\n * Generate Next.js redirects config from Portal\n * Use this in next.config.js for build-time redirects\n * \n * Usage in next.config.js:\n * \n * const { generateNextRedirects } = require('@uptrade/site-kit/redirects')\n * \n * module.exports = {\n * async redirects() {\n * return generateNextRedirects({\n * domain: 'example.com',\n * portalApiUrl: process.env.PORTAL_API_URL,\n * })\n * }\n * }\n */\nexport async function generateNextRedirects(config: RedirectConfig): Promise<Array<{\n source: string\n destination: string\n permanent: boolean\n}>> {\n const rules = await fetchRedirectRules({ ...config, cacheSeconds: 0 })\n \n return rules.map(r => ({\n source: r.from_path,\n destination: r.to_path,\n permanent: r.redirect_type === '301' || r.redirect_type === '308',\n }))\n}\n\n/**\n * Clear redirect cache (useful for development)\n */\nexport function clearRedirectCache(): void {\n cachedRules = []\n cacheExpiry = 0\n}\n"]}