@rovela-ai/sdk 0.20.0 → 0.22.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 (140) hide show
  1. package/dist/admin/api/index.d.ts +2 -0
  2. package/dist/admin/api/index.d.ts.map +1 -1
  3. package/dist/admin/api/index.js +2 -0
  4. package/dist/admin/api/index.js.map +1 -1
  5. package/dist/admin/api/integrations.d.ts +60 -0
  6. package/dist/admin/api/integrations.d.ts.map +1 -0
  7. package/dist/admin/api/integrations.js +337 -0
  8. package/dist/admin/api/integrations.js.map +1 -0
  9. package/dist/admin/api/products.d.ts.map +1 -1
  10. package/dist/admin/api/products.js +4 -0
  11. package/dist/admin/api/products.js.map +1 -1
  12. package/dist/admin/api/tax-zones.d.ts.map +1 -1
  13. package/dist/admin/api/tax-zones.js +7 -0
  14. package/dist/admin/api/tax-zones.js.map +1 -1
  15. package/dist/admin/components/AdminNav.d.ts.map +1 -1
  16. package/dist/admin/components/AdminNav.js +3 -1
  17. package/dist/admin/components/AdminNav.js.map +1 -1
  18. package/dist/admin/components/AdminSelect.d.ts.map +1 -1
  19. package/dist/admin/components/AdminSelect.js +2 -0
  20. package/dist/admin/components/AdminSelect.js.map +1 -1
  21. package/dist/admin/components/DiscountsManager.d.ts.map +1 -1
  22. package/dist/admin/components/DiscountsManager.js +2 -2
  23. package/dist/admin/components/DiscountsManager.js.map +1 -1
  24. package/dist/admin/components/IntegrationsManager.d.ts +5 -0
  25. package/dist/admin/components/IntegrationsManager.d.ts.map +1 -0
  26. package/dist/admin/components/IntegrationsManager.js +138 -0
  27. package/dist/admin/components/IntegrationsManager.js.map +1 -0
  28. package/dist/admin/components/OrderDetails.d.ts.map +1 -1
  29. package/dist/admin/components/OrderDetails.js +12 -4
  30. package/dist/admin/components/OrderDetails.js.map +1 -1
  31. package/dist/admin/components/ProductForm.d.ts.map +1 -1
  32. package/dist/admin/components/ProductForm.js +25 -1
  33. package/dist/admin/components/ProductForm.js.map +1 -1
  34. package/dist/admin/components/ShippingSettings.d.ts.map +1 -1
  35. package/dist/admin/components/ShippingSettings.js +21 -21
  36. package/dist/admin/components/ShippingSettings.js.map +1 -1
  37. package/dist/admin/components/TaxSettings.d.ts.map +1 -1
  38. package/dist/admin/components/TaxSettings.js +14 -2
  39. package/dist/admin/components/TaxSettings.js.map +1 -1
  40. package/dist/admin/components/UsersTable.d.ts.map +1 -1
  41. package/dist/admin/components/UsersTable.js +2 -0
  42. package/dist/admin/components/UsersTable.js.map +1 -1
  43. package/dist/admin/components/VariantManager.d.ts.map +1 -1
  44. package/dist/admin/components/VariantManager.js +8 -2
  45. package/dist/admin/components/VariantManager.js.map +1 -1
  46. package/dist/admin/components/index.d.ts +2 -0
  47. package/dist/admin/components/index.d.ts.map +1 -1
  48. package/dist/admin/components/index.js +1 -0
  49. package/dist/admin/components/index.js.map +1 -1
  50. package/dist/admin/index.d.ts +1 -1
  51. package/dist/admin/index.d.ts.map +1 -1
  52. package/dist/admin/index.js +2 -0
  53. package/dist/admin/index.js.map +1 -1
  54. package/dist/admin/integrations/brevo-logo.d.ts +11 -0
  55. package/dist/admin/integrations/brevo-logo.d.ts.map +1 -0
  56. package/dist/admin/integrations/brevo-logo.js +11 -0
  57. package/dist/admin/integrations/brevo-logo.js.map +1 -0
  58. package/dist/admin/integrations/registry.d.ts +116 -0
  59. package/dist/admin/integrations/registry.d.ts.map +1 -0
  60. package/dist/admin/integrations/registry.js +389 -0
  61. package/dist/admin/integrations/registry.js.map +1 -0
  62. package/dist/admin/types.d.ts +15 -0
  63. package/dist/admin/types.d.ts.map +1 -1
  64. package/dist/checkout/api/manual.d.ts.map +1 -1
  65. package/dist/checkout/api/manual.js +7 -0
  66. package/dist/checkout/api/manual.js.map +1 -1
  67. package/dist/checkout/api/shipping.d.ts +0 -18
  68. package/dist/checkout/api/shipping.d.ts.map +1 -1
  69. package/dist/checkout/api/shipping.js +33 -3
  70. package/dist/checkout/api/shipping.js.map +1 -1
  71. package/dist/checkout/components/CheckoutFlow.d.ts.map +1 -1
  72. package/dist/checkout/components/CheckoutFlow.js +30 -14
  73. package/dist/checkout/components/CheckoutFlow.js.map +1 -1
  74. package/dist/checkout/components/OrderSummary.d.ts +1 -1
  75. package/dist/checkout/components/OrderSummary.d.ts.map +1 -1
  76. package/dist/checkout/components/OrderSummary.js +5 -2
  77. package/dist/checkout/components/OrderSummary.js.map +1 -1
  78. package/dist/checkout/server/create-checkout-session.d.ts.map +1 -1
  79. package/dist/checkout/server/create-checkout-session.js +38 -9
  80. package/dist/checkout/server/create-checkout-session.js.map +1 -1
  81. package/dist/checkout/server/handle-webhook.js +6 -0
  82. package/dist/checkout/server/handle-webhook.js.map +1 -1
  83. package/dist/checkout/server/order-service.d.ts.map +1 -1
  84. package/dist/checkout/server/order-service.js +21 -0
  85. package/dist/checkout/server/order-service.js.map +1 -1
  86. package/dist/checkout/server/pricing.d.ts +28 -1
  87. package/dist/checkout/server/pricing.d.ts.map +1 -1
  88. package/dist/checkout/server/pricing.js +84 -6
  89. package/dist/checkout/server/pricing.js.map +1 -1
  90. package/dist/checkout/types.d.ts +32 -0
  91. package/dist/checkout/types.d.ts.map +1 -1
  92. package/dist/core/db/queries.d.ts +83 -2
  93. package/dist/core/db/queries.d.ts.map +1 -1
  94. package/dist/core/db/queries.js +88 -2
  95. package/dist/core/db/queries.js.map +1 -1
  96. package/dist/core/db/schema.d.ts +65 -0
  97. package/dist/core/db/schema.d.ts.map +1 -1
  98. package/dist/core/db/schema.js +26 -0
  99. package/dist/core/db/schema.js.map +1 -1
  100. package/dist/core/i18n/messages/en.d.ts.map +1 -1
  101. package/dist/core/i18n/messages/en.js +123 -0
  102. package/dist/core/i18n/messages/en.js.map +1 -1
  103. package/dist/core/i18n/messages/fr.d.ts.map +1 -1
  104. package/dist/core/i18n/messages/fr.js +123 -0
  105. package/dist/core/i18n/messages/fr.js.map +1 -1
  106. package/dist/emails/send/orders.d.ts +4 -0
  107. package/dist/emails/send/orders.d.ts.map +1 -1
  108. package/dist/emails/send/orders.js +1 -0
  109. package/dist/emails/send/orders.js.map +1 -1
  110. package/dist/emails/templates/order-confirmation.d.ts +9 -0
  111. package/dist/emails/templates/order-confirmation.d.ts.map +1 -1
  112. package/dist/emails/templates/order-confirmation.js +19 -8
  113. package/dist/emails/templates/order-confirmation.js.map +1 -1
  114. package/dist/emails/types.d.ts +5 -0
  115. package/dist/emails/types.d.ts.map +1 -1
  116. package/dist/products/api/products.d.ts +3 -1
  117. package/dist/products/api/products.d.ts.map +1 -1
  118. package/dist/products/api/products.js +44 -3
  119. package/dist/products/api/products.js.map +1 -1
  120. package/dist/products/components/VariantSelector.d.ts.map +1 -1
  121. package/dist/products/components/VariantSelector.js +4 -1
  122. package/dist/products/components/VariantSelector.js.map +1 -1
  123. package/dist/products/hooks/useProducts.d.ts +3 -1
  124. package/dist/products/hooks/useProducts.d.ts.map +1 -1
  125. package/dist/products/hooks/useProducts.js +4 -2
  126. package/dist/products/hooks/useProducts.js.map +1 -1
  127. package/docs/changelog/epoch-08-integrations.md +125 -0
  128. package/docs/changelog/epoch-09-catalog-tax.md +91 -0
  129. package/package.json +1 -1
  130. package/templates/store-template/.claude/skills/build-feature/SKILL.md +19 -0
  131. package/templates/store-template/.claude/skills/manage-products/SKILL.md +1 -1
  132. package/templates/store-template/app/account/orders/[id]/invoice/page.tsx +19 -4
  133. package/templates/store-template/app/admin/(dashboard)/integrations/page.tsx +17 -0
  134. package/templates/store-template/app/api/admin/integrations/route.ts +9 -0
  135. package/templates/store-template/app/faq/page.tsx +42 -56
  136. package/templates/store-template/app/privacy/page.tsx +65 -105
  137. package/templates/store-template/app/products/[slug]/ProductDetailClient.tsx +6 -3
  138. package/templates/store-template/app/products/page.tsx +63 -1
  139. package/templates/store-template/app/terms/page.tsx +70 -198
  140. package/templates/store-template/package.json +1 -1
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Official Brevo brand assets as self-contained data URIs (no external
3
+ * fetch at render time — same pattern as checkout/components/colissimo-logo.ts).
4
+ * Sourced from the official logo files; the round icon was reconstructed
5
+ * onto real transparency (72px). Wordmark trimmed + downscaled to 48px tall.
6
+ */
7
+ /** Round "B" app icon — integration card tiles (rendered ~36px). */
8
+ export declare const BREVO_ICON_DATA_URI = "data:image/png;base64,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";
9
+ /** Full Brevo wordmark — configure-modal header (rendered ~20px tall). */
10
+ export declare const BREVO_LOGO_DATA_URI = "data:image/png;base64,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";
11
+ //# sourceMappingURL=brevo-logo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brevo-logo.d.ts","sourceRoot":"","sources":["../../../src/admin/integrations/brevo-logo.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,oEAAoE;AACpE,eAAO,MAAM,mBAAmB,+tOAC8rO,CAAA;AAE9tO,0EAA0E;AAC1E,eAAO,MAAM,mBAAmB,uhYACs/X,CAAA"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Official Brevo brand assets as self-contained data URIs (no external
3
+ * fetch at render time — same pattern as checkout/components/colissimo-logo.ts).
4
+ * Sourced from the official logo files; the round icon was reconstructed
5
+ * onto real transparency (72px). Wordmark trimmed + downscaled to 48px tall.
6
+ */
7
+ /** Round "B" app icon — integration card tiles (rendered ~36px). */
8
+ export const BREVO_ICON_DATA_URI = 'data:image/png;base64,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';
9
+ /** Full Brevo wordmark — configure-modal header (rendered ~20px tall). */
10
+ export const BREVO_LOGO_DATA_URI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKMAAAAwCAYAAAB9nsptAAAjw0lEQVR42u19eZhdVZXvb+29z3DvqUoIAREk2ALtw0RFBW20HUI3ztriJ3UBEUWBqiRUVRKetOjTd+u0reDAkDm3MiANolb5aFEfDqiAoKAPcMBExBalVUAxCUnVPfPeq/84506VqlQqqdjf977sfPePqrrZ95x11l7Db/3WuuTVBhmzstgwaA+I/kDED0HQN+0svH1X3/BuAEC1KuD7BofX4TXFotlTRgCCACFASoANA8b8lg1vCv7wzHXwb4ww0iNRGdWHxX54Tao+s7qbYUaWGQ5TjSQ1AD1PeO4nvefOv99bt/TFqIxqjPTIw2I/vA69MgIEkABBAiSQZsxjYUqSTkXJvau08bLTURnVqFbFYdEfXjNTRp7RPw1wBnArLiQiABaHSQYS84RU/961auDoZgx5eB1e+6WMggAlaH9f5FqSvJKCUgLMnXEhkUKSpFR2j9cOXw3fN1i0nQ6L//DadwLDrKnsSK4nw6wwzJCSoPeZdLDWRETHEMQZEPRucuwTOYwMQKLDzhIYREZkvHBs6epfH86wD6/2pSZ1zkKABP2ufumqB2e43/+dv/mKT0dxfA25zqUcxe0KSTCsqctVejw4F8C/Fpb5sDIeXlMqY6GRcPLMd6EEtu8bjulZyBjdTjh6Ie040x8D0OsNDx5DJeefOIg1iGTDX0MbgGhxoYxm9hMo8CGSFbVEc3j9VZWRmBmVUY07q4QzZ4ANVqsKQ0OaN62oIs3eBkHUfHzExJkGASdhpGqj4icHrEDMhKGhBkxkCnfPAAgjPQLbFhIWbWf0jBrQDPdnJoyOCmzbtvceDMJo+/4jBkQ8I/lMtXxfz6qyV6sCiyFw14TfLwbw9HaeMeabJ52iTebcvN52uXQ+k4OKGTPqKimMR0PjS1b7uLOqcKafzdg61Xotj51HYau/QZrl7prBUIJY611KqJP3XHrdTjDTDB+mwKLtNKkgGTSp4o2MSFQqZtoHPdIj0bOQQZMKcepD08BO/38E9BuH3p+RDkx8VmZ/Dpk6FJcPAOgbTrFx4JnOHKb5V2I7mXk2PdIjUfE1AHibBo+BEK8jw682jFOI+WiusUM1EUDiCRhsYxJ3B6b+fVQqwbRCGxpiEGkAKG2+7DhJ1quY+eUweAGYj2Ggq9DIcQh6EqBHDIn7BWf31Sur/9QBV+1tEXJF/rf/6XlBchEEREeAQkwGIgtL1o147zX1gw438sSQyxv6X0wlezGiNGtaNAEDy5YmjH4XLlv31X0Yg9zD5DLJAMDbPPhCZnEGwC8hxkkAH8XMLkBM4ABCPAXQowA/qEndH13iP9757PZ9WNUhiq0YN7zPRYyjYUynJgoCaQrGojTsDMWm2bNaJVR83b1h8G+NIy9nwz3CUvMhBIQ2YGOKnQgk6TQI8XbK9JVe5j3GmwY3OSbasKu3tgdEnXFfQ8F9H+Wty99Imi4F+CxYai4JARgDGAaYW9BpXvZ8h9QGJqWd5c0rviXAG8cv8b8/peCrVYEFiPnRXf1iXvcpCGNAFAfVGMiyA2/H2M468CVUqwdmiRorh80MEX1KdHtvZBG2Pksb0JwSOEk/DOCrRaiTTaLMBpVR7W0aPIZJXEhM54L1y4RrCRAB2oCZQXvLJb+fOA28zSvuAZt/q5toFJXhND/0Pk8VNs0+8DwyIsAgN+o+Dbb1HGRZK6MmMpACAP6AvuFgSrc60fUyA75vvNrgSuPIB8m2lhDzfA5izfUw4zDJy49JapAkhoMk/32UGIBPFHO7rorhjGK0IlCtUpuCC1RGdWnd0peXN6+8g4T6JjnqXWDMbe4RJJqjtLk/R6lu/i1MNDGOFI51PoS429u6cnTO2mUnT1L2ZAACZ/oZDF2FMDYcJDHXw6zYJ0YQZ2C+sHivOSirWBnVbm3wBEjxGrNzT8phkuafFaWcpJn+8+4dlk5rAIAhX+/lfXzfoNpjl7esuJJJ/Fy49megxOkwEBxEWVPm8RRyCRINRpks9UZynM+XlfdAV215D3w/j72nKHiIWY8vjt5GILAgqpIUALe7AGZSkhl8Xy6IqpzWIg5VCUND5NUGb6Cu0rXITDePhxk0c56lk2qWHxuv/GcFIoIxGY+FMYDPNq1Vm4KXh5d/SJTcHwhLnoUoMRzEOt8brb3b92/9nP9NM3M90pxmhix1ji47P/Y29p9blD1bnqd46JaLr5og2QUlHHBx/YDNUapA9A/u2mXPzZXhgCtUAgAk8TlUcsrQhgBY+ecwkWsrMvz13cs27MLIiOwwBtWqQmVUe2sue5F3wvE/EK59FQHP4vEwQ5IUcR+plsz3IRdm5jDRHESaBL0YJXukvHnFLXOvWjoPvm8m4yjMnjKO9EgMDRHO9LOu4cGqKLuv5zDWxUU3EUykGRnCSOFOpksoBHzfeMfu3EJzyhfxeJjCGAaRAhVemZmLMmTWVpLMy5LMhsqu4iz9RNC35tvFqWcMVQkYIm/T4A3Cc69GqlV+rSRAJJt7g03H3u37M3QjKigOheB6lEHzPCq7X/Q2DqyA72dNhcwtgtr9/lXPEPhWcm2AmpUqApuMPNeVljrnoJ7N0JAGg6BxAWe6UZJtPe9UQwvanP842mZRX6fg+1l5/WVvg2f/gJQ4ncfCDJnO5Z17NyqKxHpKubTKwZQrKEnEqeEg0sK1z0+f5d7j1AZOmow0I2ZFCdtiJG/T8s/AsYeKhys7KzuuMEl2Z9S35ocNd7LvZGVUe+sHVtCc8kW8J0gAWB3CZdZQkqjsKiq7ikq2pLKrmmVJW5GpR78MkFyNkR6JbaPcUPDy8K6bySvlCs5Ax7WCDRgaSonGflS2Zcf+riWLA6Y7yp5GGw4TTZ57XWnjZUvg+1lT6MXhM8ybOU65U/5EnGmAzQV5BuvrA3oWRFzeMPgyWPKliFLOrVdxT7YlTJL+PJr35H1gbiESIz0S/t1Zad3A28l1vgLD3RwkOj/0E+QNEIrSb0vmtqRy/jMsSzTl17o1ASLJ9SgVSi5SUn3PWb/0xImkGXXAcQkg4Pu6cUNdw/2vYbH7anLsV3EQGaBDERlKSk7TjKCX79f+Pb5xagMnQciruB5rMFvoOORsyHMlh8kTJky+AsMPMOMZEjwPoJeA8HpxRNcp2LHn41g6nKJaVVjUA1RGtbeh/2rqLp3PY0EKkNWRQzFr2JYkJcBR+jjX4++D8BOwecIAKREdCRKnEPg1EOIV5CjJQWwAotyikmi4KOnY69za4C+iyup7mweWmULQ//M2Dj6Ekn0a4lQXCiMRpQzLekmp1n9auAQPzJj/2cD4BF9Ark1cD7MiDAAAQ5YSSNMbciUYUgCy3Cj4uryh/1Sy1RdhjECmDcSE5weAyq7kOAGS9EcmTu8D0XY2eockKZnNs0H0IiZ6DdnWKSQIHKadnhGwOIwzKjknSGN9/cibBs7Y+R8Yb2T0asZ405CvCxzOAEDXlpWvYzb9DDoHSoLrUadFBBiCGFKEiJO++pJ1D7dDNFNmgwSjavgYlWyXx8Os44QSaXIsaaJklSLxL3suvW7nXnusGnA8Gu+xRXJ7vfG7yqgubxx4E5WcD/F4x4NqXKkmz5Ucp49wYv61nKS3Pd2/fnyqyywNrzxDxNmHqOSczXHCMMwgoiJWBUMKAdyAWu+p2HZsBEaB2SGjGrZCydM4TriJKBBrcixFWXoBgAfaAOT9Qxx8P8M1K0uE7ByO03bPxxBCcT2qm8SMNEFpBmEIQK23DIgvkBRljpKJHs1ASQEpYJLkFkBdG/ReM3WZuNZrlZPSWSTpn6nsLOYwZjC3wgUixVGciq7SC6I9QQ2+fz4WbZcA9PTK2H0cFeY/x5t8oHvz8v9hgLeCqcKEvyPLBgcxF/GFnKjFEJKQ6ad1Zu7pOMFTZoO+Lm1Y+Rwm3YMg7tyToalkSRPGHwn61lzVUdVYtJ2bey/34zpwc72RsGBIo+s3HojWsTYMZoF2U8vQ5DmSw+SGcpIOPt2/frzecGGNPdv3H/J1SNfdD+CdXbXlfVByHcgQNLfiyDjNRHf55PIe/mDg+/+CRSMSQxUNH0DEo0zRJyHE3CJhIgCC4xTEOAe13v+FPj/Yb8wxh4N0uVv/IznOAg5jA2qAvKzJdZSpR18LB9Y90TQGi3okfF+X1g9+RMwtvYDHgiyPD9sU0VIC4F1G6w+El6z6SjMBbCSf7TIBgD4/DYBvAPiGt2nFSijxWRgmaMMtg0IWj4eZ6CqdVxoe+GJYWXMbRnqkmtZdnt6XAkC5tuJYEvQuBvcY5jPItW1oA44S5iQzRRDfSipaHyyQaYalnivLzs9KGwbeFy71b0O1qqbA0gQAI6V+O8puucPVNBhFYfK1oG/NVaj1WnjiWD3FPjloWxk1GKpK+JR5tf5e6nJP5LFwotA1ea40QXx90Ld6Zb2h4G1hyN6lu5aijvf5Na82OAbb+jxM0+0CIMlhzJC0oqt2+frxSuUvYBBGRuR4pfK0t3HgNvKc93IQ6SJLFUgzQyX3+FJI/xgCX99vzDGPRxnM74UgBsG0WUYBbUDEWyYceuNuvXyByPQKDiIzwSIylCQw72CTnBX2rv9pcehN7hmnvKZc7gDqleuvK23sf1xY1kgOWLFoJYcQnGkmQ5/GqoFvomd1Iqb2yqzg+8a9vveE8pblq0nyL8i11ghLvhbMNgdRjuPlbkl2Bv6Simy2hYhmmYHhudK1v1Jed9n7OzLNvYUKY/gsGOZOxJEEJ1pD4KNgEObt2lf9s1V79X2duyJawVHKoLbEgVlTyZEcxN8M+lavRLWqCtA3m9YiVUZ1cR92vW/1LRwn66nsyiafk0DQWouyO48pPb8FZ40W+DNvRqo7E0mCgSAmQo45Toc4NCxVZVR71w8eA9CbOEooh43aEpc4eaSO5O7Ge4vPZJmk/VR2PBhjOsggQhgIYRAl5wa963+KWq8F38/2o96cyz1PTuxwydpbkaQryLVlB/EaJBCnRnS5z/cccTaIWExJrJVih7dh+WI5t+sh4TgDYBzJ9TAHgLnAm3I3kKf6nN80lW3J2jwNyxKQgpoKmVtIw1lmqOxsLa/rfyt8P0PPBLyplfK/iDNNzQfFMORYxGn2QP3S1T/HUJX2K7ivViUA7iL3jVRyTmjWyRtMdikEZ9mYtlRv8TDMAXAsM1SrQpBVNWG8C1LKXEYAmAiZZhh6dzNWq4waMFN01J9+aOL0YdhFBpq/X3KUEIHeVF677Nl50jNNmapwmaZEZwvP7YYxWZsFMmQpAHQj+obT4r15fFnrLQO4YEJ8iRwScyQn6dp6//rvotZroW84nXGi6/sJar1WfenatSaI7qCyIzuybBBgDDP4ksmzaYLgKAWY38yCh4jUXK5HKRhqEvjDgEhRyc6FkWW/QJxulKn5Ihucy7a8HiALWjcCewFtDIiYHHWTWxt8SdS76vcYGsrLT0VW1bVrwTxD2THQJn+YlNOIoCQgcG+7O5/efS1qwCnnCKLOUhSxppKrzFiwJVq69vcNxhEWbZczTB6AI3fK8SeO3Okdu/M28koXcRDqBgDMSQYQXuas7n9ePOj/tqiFC/ijGdUGbyBLXctJmrtVAsGYjLxStxmPzgawMVegfbpqAwBkzHugdUtmAIOE5DAKTZp9ofnekRGBSkV7wv17WNZzECcTDqgUJoieIZN+EtWqwBM4cALIvF0GADHkRzjV/wDR9gQIguOUSOBVc2oDJ00SM5JAkgK2egNlBogSBhXwB3MOpzIkHEuQpQSHScppdgcxbwlM+DUsaZ6g9d76/kfhWreBhIvMoKmQmc7Ic+eJergaRGc3S3RDQwSA0yidq1wq51nYhFwI+M2MMsxKRWPVgEOMv+ckownYnuQoyYRNm3BnVeHpRVyQBg5E+Lmy1FZ8HmwualMIwBhNZcdWIn1FDPwWgMDQkIbvwyT6SwLRxyGE10xkOOd9Evg9ADbu89AVdeSuDQMLWclXFmGIbEtcpKlH34r61z+OnjxhaYZHGm+gkmSO2+JLYk2urVAPv1RftvHPBePpwJWxwBLDJf4D5Y0D94iSs5jDpAH5ELQx5NrlNIpeP3kCQwSkmckF2kxKNJSU5NiK0xSc6l+QNl8mIUfHL75meycNa9RgqGrVl/nf6dow8D649ijrtsCeSHEQa+HY7+iqDb56vM/Pcbht+ZmxXLYYkJNFbIY4nAEeSvB97iqLE5l5ATKNFvOcDWxbIEm2jc976lc4c40GALc2eIKU8iQY82zDeo5gskEkprXBxAQmBpvjOUrRga9Rzp6H4ZcC+FID48ZIjwwr654obxj4uig75zYTGYLkKGGS8gxveMWieq+/bR8tGgKAYYnzqGTLzoQPAswESVsAEHp6gNHRpiVl4OWkDXUcHECw1mDCrTlHEbPVa8UEfBlSLM7ZFU2KAIMAIvnqfWTTJJrWEAB5rjRR8meOk1sEif9T/+MRP2wKp5231ozj8nhhvG/Nl72NA58jz72oE4NkhpJskmw50HS9s7uKpi+tzcmy5Ii2E1nEUlJwgvtQGdXe8IoLoGgJtHkZSVGGrSAJ6ATa92MZAw6TSckezHxyZxm0B8AoEWgLa3Nup9VmTSVbcT06D8DHpgxL8uTMYsPnIcnaYj82sJXgMH4siHFHbqUqpogXDVYNOET8vLxkyARQ00VzFO8RZD8EAoMrs8HGNwCYFX6IMOGOgggxsTYg4IXTtKoyQwqCY5FJslWI01ODS65fOX7xtfcWxXzVTjfaK/t84lgNZtJEVY6SAEKIFjOYJEcpgfGGrtrlR6Eyqme9Y7CI+yToOZACTb5TE3sEjKGHveHBT1K3ezMJ8WowypzkhIkmQ2UmryDRk7LqtAGAZ+c6OGIK5dBgoC6iuzhKftUspTUsVJKBmc9DrWYVLPDJSL3swXm1cOy/RZq2x36GbAsQdDOWr4kbiVwjJCoJMx/AfJgiLkcjLhcAicfH+67d0bTqB7uG/NzjJd7vWOtnJiS2BM1gxnFin4qoBEPK2KRpT3DxdSuC/vVPoVpVhRBo2lTf9w1GKyLqW/2fnJlvk2sTuBB2DnsY4VpzDPTLAQC75s0ui2hxwwTiiL26V4gkBzFI4HIo+WHeUzc5UsDcwfyZ6auz/NU6/TkW7jVddHsm3DecgnAj2Qot60cCaWqEY5/s0S9fA4D3MY3jQqj2/wuGEJKDOMlI3tSe5DTrwCXVDaAE0+YxmTjncPKfC8UVs9k9tPtPzhiAHRACHWlMntPOFVNiRYIMhCCK4/PD3jVfRq3XAnOugJNZwX1ZJwYx4TsQ1HnSCAZKMsCn5pnXsbNrGe9q3o49xYEDKXlSHh+DQMxgmCYTZbZeIA1mDZoUojEAYKR9CwdxBBKyTbYGSgCs39ty653Y4twblh/BTP/EcQIwZNMquhZgzHfjS6/7jyJx6VBGE2Z2q0KD9lIrSHDQHubMGvs/x26jyYEqssUUD8nkRfF01fjSdf+OatXOTy/xAcRtXOSHv0amWy6h89wcf0hixsWN+xHxlO9JMwZDQIiC/VOwc2bz5VgWlW3JjDmTeo+eHhldcs3jYPNNcm0ABWjOJDlOwYy3z12/dF7h1qkdW8wyfpvwnPnItJ5AFyMiyisuC/eGqUgJ3XKV7YaFASa72fWJWbSNDAKRmtSM8WS16RwIliaInhE2fbIw1dnBXo1gHbHhVrDcbp0Ml3Mruh2HyDLu2gsmal9SAuDAhEmNmB8gIJ7V69AAtCZi7J7073mWS0y0hZjPBiNPHgmETGvhuUemQfQ2ADe1YY6msJ0XFqFFC/+1lOQg/n39SHV7W9dhJw6ldV0KlYDIQXsobRggmp+rkM+zZhcJwLplHik+AsyN5rmGFyY2PK4mm7NIjiM5iO4c713zNHp6JEYPvutNCzlPSgFOqLOeQAQQ5ennooWznU0XyVL2B2gLzYfcWW1iSGE4znqCpatvx3/HynE8Co7nO7z/jB+DrU5sVYooj98ZFwK4CYBpJI3O+hUnQvDrOEqoAyVwLMFp9gVUrgv34gAM+Qwf8NxoZ6i93STEswoMGAALZBrMfML8T32ge8eHto7tV2vItAlMlQCfu6U61hCOgtYtlIIZEBLQ2dNTTJQgEGg7AMKyhQeHNTUqGSxe2spoaWKA/9QhecjbcjeTQf3ailMNQY0yXYvJbVmC42R7sHTt7bizqnDXJEyUma7jniQ8/1huWubGfov20atcrUq8xY8xPHgz2db/5jRrVGQEhwlI0OucLStOjC/2H8NI1QaQSGkqVHKdTt4iSQ7jjBg3Tpa4FIpFOy7ZOuZtHHgcSj4LWucyobx0SZZ6VnBE90IAP8ZojwAO2hgJMNhs4peS66iOwQ5EhqSQSPHI1E38ubXiWcGYmIlqA+/kiaQAznl/YPHLQ+Km8yZzJCL6nWLnt2RZJyNNucUuIkZeFMqpWot9jTNnsYl+ZuRYAwBC42YTxh8GhCrETwBnVC7Zsh5VAFyNbYV15J3nc9qGLTI0lWxhguSe+tI126cEyhtMIKKfkJKnd1ZgoMmxlEijtwP40UEdygl5A9fwDqIJSWzOsgeD7hP7JNPioCcaKPi+6dq4/GxRcl+cN/VQG+GTJIdJkjF+lP9qoZn1Hu5qVaFvOCXQ98mSEzvvBHLex8lzNq2clwfvoIMK1Bk0f/MV3RgYcDpo/dMfHINqVYwtXf1rZPxdKtltLQ1EnGaA4Xfjztztdh+z8xVkqRcXQ1lFWyswEZpUsWlwZPoeDNOEexYcpwDhvcfmRApzUDKpVgV6Rkxpw8rnkBBv52gi6A3JcWKYzXcO3YzEosGne81l81mJ6znTEyZXwJCjmMH3x0tX/a5IlGZ/CFRBlGDwKIwhcAddq0HxOiJNs3NBxBjuVQesiNWqBIGjLPqid5r1kLd55Xkd1nH6Ay4KR7slr541RSYRp0y2elHXr3e8EgC0pPeSY7W7YQOlpKlHf6pb9a9O2oba3rSVQ63fNWG0u4NllHMqNXnugt3GWg7fNwchE+C4JyWImJB9lFynG7qdqsYGtsVs+Bfh/Nc+KA7BPAnKuW93Z0evXdZlXOtWstUJhXtspykBUhIRhg9ZD3ejBMZMwZNPfc+EyaNwLOocaAriOGWyZbVc6z0WfUW/zMzvWcH3M2/jwOXkuW+B5oVkyy94e477sbd5xQV5/Ee8z6kFRdY7zvHtXI/+AEu1OIC5+4TRoie3VPwujtMWtgjOsUWmEVyydQzVqpoy8SBijIzI8b5r/0LAxE5FACQ4jDXZ1sfKG/pPRd9wilqvNWPZ12oW+obT8rqBN5Cj+jiIdBu2WVSJFJHAjahUtJgVDKlaFXmXYNGH2zecesMrFgWufRc56rV5p6BovwgN15KmHm2vh/hyEdscqjk1nPedjCaC+FqyFIHRSfLMMhaWPIZE6dZ5V/fOhe9nuLModU5/76pxz+XawAfgWNdwmGikmeEg0ZDyZWSpm70bLn+oNDxwxjRTexthRQAhvtBp+UhwmgECZ5U3Lb+QHPtZyDLTxqiXHCcGkrYCALZPQ8rdtq34u7mO41Q3uakNj2EMgUSJbHWbs2rgJPQNp/spk/z+qlWFvr60vH7wNHLlF2C44Eq0J49SmHq0Q5L6HPZqSJowiAQjPRLhTomRHp4yW/X9xjQqAKPwNg0eQySWMHAFKel1jsRrcUlyGXI/lq+Ji5jK7O+skwNIZDSqVTGOJ7eW63SZcO0XdTQekRAcJppKzhnJUXR3eUv/+4Iz/Z91dEIuWsTNPuP2zNj3M1Tf53oLjqhCqSuRpian1xdKEqealTRgvFCm2e421G2fiQxI3MhRsrItvhJIMhDj+cy8BknWlohBk2tJDpP7g6Vrfrpfh7topK9X1j3sbRz4HHWVLi4a31SLSpgYcpznKg93WrWBC8fP9O/eaxpZAz5r6w1qNOyVhgffSVJuATCvODidVtG1FfYEn9izdNVOVKtKTTkmnhAWsY6eLmN0xxccp4w+jRlvY/A7yLWPQhCjaEuYGLxn1FW2eE/wifqSNXf+lb6Og7F9u4A/mpqNy/vImB9ACm5rhMpr1WGs4dinUsb3e5uWr80EbYgv9h+bKpadv/mK7hDp2QCuIMd6EQdRJ+2uAV2UHIvH68vHL9vwy2n5gUUiU+/1t5Vrg/cI117cwTYiSBI0J7c0baZDCrAQm2dEPN62kFGtCqKxKzmM3gJLHYu0TWlICI5jA8tawFJ+z9u8okZSrB5/v//IlPv7QGnjitNJYbmQ4j2sDZDpTkU0rMlzFI9F99efenhN4/BMpoyS877295VrAy+nnOFtJoHUJYPnYhc9m5AugOuUSBAQp+DxUOdkg46TwCBk1F2yeE9wU33J6o+2jao79Gs0b2eIKqvuK2+47J/FnK7P8HiYArDayROIEwMhXCrZH1RRskxtGrybGfcKxq8MeIwhygI4AYTTIxMvFq69gLVptehSx1eRpDSnZPFY8NX6krWr84O3X/crcuomtkLQmXsZ0/ZDxGAoKU092mk54tamdfL3y2MYVKtivO/av3gbBy8kSXewEAw2bfORhGjMS6Kys5TD5OJybfAHRLgH2jzCLHeCWELgaCK8EIRXA3wG2TY4iLjZxN/el+4oaZJsp2XEBfDvzlBdLABM0jedA58gW55CSp2yz6idAdYG0Br56WUGFyMtJswJhyBBnmvxeLS5vmT1pXnKXzF/1UmwxfybYKn/2XJtcIHoLg3yWJAV10xNwTEz1yMDIcrk2G8mKd4MY0CaIfL+IIAZnGTIJy8wTdKimytiEP2onOkL6tWqQM+QAfajvl+4WFc5t4X16E+k1DHQuh0LpI7WCddWqEdf3v3+Vc/kcfsMmNm+bzAyIuuVynfL6wcuEZ6zheOUYUybNcvjyUImtnDtMyHFmci/eKqIWPPOX850bpCCvfrnAeYMtlIAAhGZd+zuX/1Yew+9mLKsnWaGwyjLeX0TX1E+cSpMNNLUdA5KImqzhbrR3AMpEx6PLq/3rrp0utFoh3T5vsZIjwz6Vi/nsfBTVHYVpCQwZx0SIGoNL2rwFJPEtH6OsjwOagw/ah8Bwoa6ypYJkzvUOL2pOQhg/4kmjGpV7bjkM2MgGiHXQmdn3YSyf5zCoEhcDqRcVqnkh3TZmq0miN4PJTQ5lgBz1oJ8JpNJrBEnJh+YlXM/EaW66OTsbHtlzqjsKABP6yh903h/25SN6eEUEh1TuDpeJDumc7UPYWoOAQJR2Zbk2oIT/S2Os1fW+1ZfB84HWf63KGKrldKgp0fW+1ZfaYL4IgjaRZ6rCspK1sZmoY7JWnvzHFtNTMz5wSs5kpQSXI8+HXzrj2/evXLVMwf4rQ6FyaGtnDdMycmYLnBsgVQ/GPZe/+OO+TkzP6RZ7jXWfo7C7Cw2/Ch1l1Q+BnuSgU4dMil0pcXnpOYQAOYMShF1lRQn2d1ZEL8qWrb2nsbEM3QMC2UcfPKQuykBpYgsKSEEOEpSTrI7mM264NKCgDAjF0K6iDO5oB7l9CkWPCsKWcSQQWX1jXNWDdybefxxkvJ8ci3FcZpTy0Am721BzjSiNoyUwPm4PxZQksixJLSByfRdIjXV+pJV388rMkx7x9z7H88Fvf5Py7WBHwnHfgVHiZ5QvchICgnCVhBxgY9mB+E1Moz0yPHKmrtxde8rvPmlj0JSH3nlbk5SIMlaVaG854c6xu4TN2RCEEKQYwkoKThK/shh/On6pavWNEnClb27HZttpgfzXFkzkGUZtH6StXkYkr5DUnxj/P3XPtI2p4f2u8vMkKCS1TnoyRhJZRuIQntWY8iRHrmnsuY3AN5d3jR4DWJcAmPeCkstICUlM+ctA9yYXtuc0EokCKwNWOs/c5J+BxluDPqu/3ZbXdocEAd0QiIDYDPKzisJkB1sFyUl18OQVOGb9zdx2Q+ZoDK8uw5c4WxYvk4huYgNv4sELSLbkuAix2mb6AsqZNKKpxPW+kGk5haVxp/fvWzDrvbxNZMPmN84+MkDsoSAYYOYFO00oCdI4bHSPPs3O87+zNh+DYOfqh5OxF21y49ipP3NedPMRBCGHaU4TG8Nlq35yax+odGE65y7/sp5qR29isCvheZTGfw3AI4Aw8npbrwboN+D6GEButckyb1B//qnWt+UUBGzAlcV9K15tQ/NjRB+UIBVc/gqM8NRiuP0l8HStZ+bFarXxM8ezfurGwOdupT7d8bQawg4DYyTwXw0AyUwMxHVIegpJvoVAT9mou8HF1/3swk8hX1a7f8CKSHfpD0XigsAAAAASUVORK5CYII=';
11
+ //# sourceMappingURL=brevo-logo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brevo-logo.js","sourceRoot":"","sources":["../../../src/admin/integrations/brevo-logo.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,oEAAoE;AACpE,MAAM,CAAC,MAAM,mBAAmB,GAC9B,4tOAA4tO,CAAA;AAE9tO,0EAA0E;AAC1E,MAAM,CAAC,MAAM,mBAAmB,GAC9B,ohYAAohY,CAAA"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * @rovela/sdk/admin/integrations/registry
3
+ *
4
+ * The integrations registry — the single source of truth behind
5
+ * /admin/integrations, the one place a merchant manages credentials for
6
+ * external services (Brevo, PayPal, analytics pixels…).
7
+ *
8
+ * TWO LAYERS:
9
+ * 1. INTEGRATION_REGISTRY — static entries for the known providers. Each
10
+ * entry describes WHERE its values live (dedicated store_settings columns
11
+ * or a key inside the `analytics` JSONB) and WHICH fields the merchant
12
+ * edits. Storage keys are a CONTRACT with the platform's Feature Store
13
+ * card prompts (lib/features-catalog/cards-*.ts on the Rovela platform):
14
+ * the card instructs Claude Code to persist to these exact columns /
15
+ * JSONB paths, and this page manages them afterwards. Never rename one
16
+ * side without the other.
17
+ * 2. Custom descriptors — chat-installed integrations the registry does not
18
+ * know register themselves in `store_settings.custom_integrations`
19
+ * (descriptors only — values ALWAYS live in dedicated store_settings
20
+ * columns per the merchant-secret rule). The page renders any sane
21
+ * descriptor as a generic form; malformed descriptors are skipped.
22
+ *
23
+ * PRESENCE SEMANTICS (the no-catalog rule): an entry renders only when its
24
+ * storage is detectable on THIS store (column exists / JSONB key present).
25
+ * Installing or removing an integration stays a Features Store / chat
26
+ * action — this page never advertises integrations a store does not have.
27
+ *
28
+ * This file is imported by the client component for labels/fields — it must
29
+ * stay free of node builtins and SQL (validators use fetch only; the API
30
+ * module owns all SQL).
31
+ */
32
+ export type IntegrationFieldKind = 'text' | 'secret' | 'number' | 'select' | 'toggle';
33
+ export interface IntegrationField {
34
+ /** Column name (columns storage) or JSONB subkey — dot-paths allowed for
35
+ * nested JSONB objects (e.g. 'labels.purchase'). */
36
+ id: string;
37
+ label: string;
38
+ kind: IntegrationFieldKind;
39
+ required?: boolean;
40
+ placeholder?: string;
41
+ help?: string;
42
+ /** select kind only */
43
+ options?: Array<{
44
+ value: string;
45
+ label: string;
46
+ }>;
47
+ }
48
+ export type IntegrationStorage =
49
+ /** Field ids are dedicated store_settings column names. */
50
+ {
51
+ kind: 'columns';
52
+ }
53
+ /** Field ids are subkeys of store_settings.analytics -> {path}. */
54
+ | {
55
+ kind: 'analytics-jsonb';
56
+ path: string;
57
+ };
58
+ export interface IntegrationDef {
59
+ /** Stable key. Contract with the Feature Store card that installs it. */
60
+ key: string;
61
+ label: string;
62
+ /** One merchant-language sentence. */
63
+ description: string;
64
+ /** Optional brand icon data URI (card tile, ~36px). Falls back to an initial tile. */
65
+ logo?: string;
66
+ /** Optional full wordmark data URI (configure-modal header). */
67
+ logoFull?: string;
68
+ storage: IntegrationStorage;
69
+ fields: IntegrationField[];
70
+ /**
71
+ * columns storage only: boolean column that turns the integration on/off.
72
+ * Surfaced as a toggle field; jsonb integrations have no enabled concept
73
+ * (key presence = active, removal is a Features Store action).
74
+ */
75
+ enabledColumn?: string;
76
+ /**
77
+ * Optional server-side credential check, run by the PUT handler BEFORE
78
+ * persisting (a failing key is never saved). Receives the MERGED values
79
+ * (stored + incoming). Returns null when valid, else a merchant-readable
80
+ * error message. fetch-only — never node builtins.
81
+ */
82
+ validate?: (values: Record<string, unknown>) => Promise<string | null>;
83
+ docsUrl?: string;
84
+ }
85
+ /** Custom descriptor shape stored in store_settings.custom_integrations. */
86
+ export interface CustomIntegrationDescriptor {
87
+ key: string;
88
+ label: string;
89
+ description?: string;
90
+ fields: Array<{
91
+ /** store_settings column name (validated against information_schema on write). */
92
+ id: string;
93
+ label: string;
94
+ kind?: IntegrationFieldKind;
95
+ secret?: boolean;
96
+ required?: boolean;
97
+ placeholder?: string;
98
+ help?: string;
99
+ options?: Array<{
100
+ value: string;
101
+ label: string;
102
+ }>;
103
+ }>;
104
+ }
105
+ export declare const INTEGRATION_REGISTRY: IntegrationDef[];
106
+ export declare function findIntegrationDef(key: string): IntegrationDef | undefined;
107
+ /**
108
+ * Validate the raw `custom_integrations` JSONB into renderable descriptors.
109
+ * Registry keys shadow custom ones (a descriptor cannot override a known
110
+ * provider); anything malformed is silently dropped — a bad descriptor must
111
+ * never break the page.
112
+ */
113
+ export declare function sanitizeCustomDescriptors(raw: unknown): CustomIntegrationDescriptor[];
114
+ /** Convert a custom descriptor to the common IntegrationDef shape (columns storage). */
115
+ export declare function descriptorToDef(d: CustomIntegrationDescriptor): IntegrationDef;
116
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/admin/integrations/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAQH,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAErF,MAAM,WAAW,gBAAgB;IAC/B;yDACqD;IACrD,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,oBAAoB,CAAA;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,uBAAuB;IACvB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAClD;AAED,MAAM,MAAM,kBAAkB;AAC5B,2DAA2D;AACzD;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE;AACrB,mEAAmE;GACjE;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAE7C,MAAM,WAAW,cAAc;IAC7B,yEAAyE;IACzE,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,sCAAsC;IACtC,WAAW,EAAE,MAAM,CAAA;IACnB,sFAAsF;IACtF,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,kBAAkB,CAAA;IAC3B,MAAM,EAAE,gBAAgB,EAAE,CAAA;IAC1B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IACtE,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,4EAA4E;AAC5E,MAAM,WAAW,2BAA2B;IAC1C,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,KAAK,CAAC;QACZ,kFAAkF;QAClF,EAAE,EAAE,MAAM,CAAA;QACV,KAAK,EAAE,MAAM,CAAA;QACb,IAAI,CAAC,EAAE,oBAAoB,CAAA;QAC3B,MAAM,CAAC,EAAE,OAAO,CAAA;QAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;QAClB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,OAAO,CAAC,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAClD,CAAC,CAAA;CACH;AA0DD,eAAO,MAAM,oBAAoB,EAAE,cAAc,EAkNhD,CAAA;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAE1E;AAUD;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,OAAO,GAAG,2BAA2B,EAAE,CAsDrF;AAED,wFAAwF;AACxF,wBAAgB,eAAe,CAAC,CAAC,EAAE,2BAA2B,GAAG,cAAc,CAgB9E"}
@@ -0,0 +1,389 @@
1
+ /**
2
+ * @rovela/sdk/admin/integrations/registry
3
+ *
4
+ * The integrations registry — the single source of truth behind
5
+ * /admin/integrations, the one place a merchant manages credentials for
6
+ * external services (Brevo, PayPal, analytics pixels…).
7
+ *
8
+ * TWO LAYERS:
9
+ * 1. INTEGRATION_REGISTRY — static entries for the known providers. Each
10
+ * entry describes WHERE its values live (dedicated store_settings columns
11
+ * or a key inside the `analytics` JSONB) and WHICH fields the merchant
12
+ * edits. Storage keys are a CONTRACT with the platform's Feature Store
13
+ * card prompts (lib/features-catalog/cards-*.ts on the Rovela platform):
14
+ * the card instructs Claude Code to persist to these exact columns /
15
+ * JSONB paths, and this page manages them afterwards. Never rename one
16
+ * side without the other.
17
+ * 2. Custom descriptors — chat-installed integrations the registry does not
18
+ * know register themselves in `store_settings.custom_integrations`
19
+ * (descriptors only — values ALWAYS live in dedicated store_settings
20
+ * columns per the merchant-secret rule). The page renders any sane
21
+ * descriptor as a generic form; malformed descriptors are skipped.
22
+ *
23
+ * PRESENCE SEMANTICS (the no-catalog rule): an entry renders only when its
24
+ * storage is detectable on THIS store (column exists / JSONB key present).
25
+ * Installing or removing an integration stays a Features Store / chat
26
+ * action — this page never advertises integrations a store does not have.
27
+ *
28
+ * This file is imported by the client component for labels/fields — it must
29
+ * stay free of node builtins and SQL (validators use fetch only; the API
30
+ * module owns all SQL).
31
+ */
32
+ import { BREVO_ICON_DATA_URI, BREVO_LOGO_DATA_URI } from './brevo-logo';
33
+ // =============================================================================
34
+ // Validators (fetch-only, server-invoked)
35
+ // =============================================================================
36
+ async function validateBrevo(values) {
37
+ const apiKey = typeof values.brevo_api_key === 'string' ? values.brevo_api_key.trim() : '';
38
+ if (!apiKey)
39
+ return 'Enter your Brevo API key.';
40
+ try {
41
+ const res = await fetch('https://api.brevo.com/v3/account', {
42
+ headers: { 'api-key': apiKey, accept: 'application/json' },
43
+ signal: AbortSignal.timeout(8000),
44
+ });
45
+ if (res.ok)
46
+ return null;
47
+ if (res.status === 401 || res.status === 403) {
48
+ return 'Brevo rejected this API key. Copy a v3 API key from Brevo → SMTP & API → API Keys.';
49
+ }
50
+ return `Brevo could not verify the key right now (HTTP ${res.status}). Try again in a minute.`;
51
+ }
52
+ catch {
53
+ return 'Could not reach Brevo to verify the key. Check your connection and try again.';
54
+ }
55
+ }
56
+ async function validatePaypal(values) {
57
+ const clientId = typeof values.paypal_client_id === 'string' ? values.paypal_client_id.trim() : '';
58
+ const secret = typeof values.paypal_client_secret === 'string' ? values.paypal_client_secret.trim() : '';
59
+ if (!clientId || !secret)
60
+ return 'Enter both the PayPal client ID and secret.';
61
+ const host = values.paypal_environment === 'sandbox'
62
+ ? 'https://api-m.sandbox.paypal.com'
63
+ : 'https://api-m.paypal.com';
64
+ try {
65
+ const res = await fetch(`${host}/v1/oauth2/token`, {
66
+ method: 'POST',
67
+ headers: {
68
+ // btoa keeps this file node-builtin-free (no Buffer).
69
+ Authorization: `Basic ${btoa(`${clientId}:${secret}`)}`,
70
+ 'Content-Type': 'application/x-www-form-urlencoded',
71
+ },
72
+ body: 'grant_type=client_credentials',
73
+ signal: AbortSignal.timeout(8000),
74
+ });
75
+ if (res.ok)
76
+ return null;
77
+ if (res.status === 401) {
78
+ return 'PayPal rejected these credentials. Check the client ID + secret and that the environment (live vs sandbox) matches the app they came from.';
79
+ }
80
+ return `PayPal could not verify the credentials right now (HTTP ${res.status}). Try again in a minute.`;
81
+ }
82
+ catch {
83
+ return 'Could not reach PayPal to verify the credentials. Check your connection and try again.';
84
+ }
85
+ }
86
+ // =============================================================================
87
+ // The registry
88
+ // =============================================================================
89
+ export const INTEGRATION_REGISTRY = [
90
+ {
91
+ key: 'brevo',
92
+ label: 'Brevo',
93
+ description: 'Marketing automation: syncs customers and orders to Brevo so your email flows (abandoned checkout, win-back…) fire automatically.',
94
+ logo: BREVO_ICON_DATA_URI,
95
+ logoFull: BREVO_LOGO_DATA_URI,
96
+ storage: { kind: 'columns' },
97
+ enabledColumn: 'brevo_enabled',
98
+ fields: [
99
+ {
100
+ id: 'brevo_api_key',
101
+ label: 'API key',
102
+ kind: 'secret',
103
+ required: true,
104
+ placeholder: 'xkeysib-…',
105
+ help: 'Brevo → SMTP & API → API Keys → Generate a new API key (v3).',
106
+ },
107
+ {
108
+ id: 'brevo_list_id',
109
+ label: 'Contact list ID',
110
+ kind: 'number',
111
+ placeholder: '3',
112
+ help: 'Optional — new contacts and newsletter signups are added to this Brevo list.',
113
+ },
114
+ ],
115
+ validate: validateBrevo,
116
+ docsUrl: 'https://help.brevo.com/hc/en-us/articles/209467485',
117
+ },
118
+ {
119
+ key: 'paypal',
120
+ label: 'PayPal',
121
+ description: 'Lets customers pay with PayPal, Pay Later or Venmo at checkout, alongside your other payment methods.',
122
+ storage: { kind: 'columns' },
123
+ enabledColumn: 'paypal_enabled',
124
+ fields: [
125
+ {
126
+ id: 'paypal_client_id',
127
+ label: 'Client ID',
128
+ kind: 'text',
129
+ required: true,
130
+ help: 'PayPal Developer Dashboard → Apps & Credentials → your REST app.',
131
+ },
132
+ {
133
+ id: 'paypal_client_secret',
134
+ label: 'Client secret',
135
+ kind: 'secret',
136
+ required: true,
137
+ },
138
+ {
139
+ id: 'paypal_environment',
140
+ label: 'Environment',
141
+ kind: 'select',
142
+ options: [
143
+ { value: 'live', label: 'Live' },
144
+ { value: 'sandbox', label: 'Sandbox (testing)' },
145
+ ],
146
+ },
147
+ {
148
+ id: 'paypal_webhook_id',
149
+ label: 'Webhook ID',
150
+ kind: 'text',
151
+ help: 'Optional — from the webhook you created on the same PayPal app.',
152
+ },
153
+ ],
154
+ validate: validatePaypal,
155
+ docsUrl: 'https://developer.paypal.com/api/rest/',
156
+ },
157
+ {
158
+ key: 'turnstile',
159
+ label: 'Spam protection (Turnstile)',
160
+ description: 'Cloudflare Turnstile keeps bots out of your public forms — invisible to real visitors.',
161
+ storage: { kind: 'columns' },
162
+ enabledColumn: 'turnstile_enabled',
163
+ fields: [
164
+ {
165
+ id: 'turnstile_site_key',
166
+ label: 'Site key',
167
+ kind: 'text',
168
+ required: true,
169
+ placeholder: '0x4AAA…',
170
+ help: 'Cloudflare dashboard → Turnstile → your widget.',
171
+ },
172
+ {
173
+ id: 'turnstile_secret_key',
174
+ label: 'Secret key',
175
+ kind: 'secret',
176
+ required: true,
177
+ },
178
+ ],
179
+ docsUrl: 'https://developers.cloudflare.com/turnstile/',
180
+ },
181
+ {
182
+ key: 'ga4',
183
+ label: 'Google Analytics 4',
184
+ description: 'Traffic and behavior analytics for your storefront.',
185
+ storage: { kind: 'analytics-jsonb', path: 'ga4' },
186
+ fields: [
187
+ {
188
+ id: 'id',
189
+ label: 'Measurement ID',
190
+ kind: 'text',
191
+ required: true,
192
+ placeholder: 'G-XXXXXXXXXX',
193
+ help: 'GA4 → Admin → Data streams → your web stream.',
194
+ },
195
+ ],
196
+ },
197
+ {
198
+ key: 'google_ads',
199
+ label: 'Google Ads',
200
+ description: 'Conversion tracking for your Google Ads campaigns.',
201
+ storage: { kind: 'analytics-jsonb', path: 'google_ads' },
202
+ fields: [
203
+ {
204
+ id: 'id',
205
+ label: 'Conversion ID',
206
+ kind: 'text',
207
+ required: true,
208
+ placeholder: 'AW-XXXXXXXXX',
209
+ },
210
+ {
211
+ id: 'labels.purchase',
212
+ label: 'Purchase conversion label',
213
+ kind: 'text',
214
+ required: true,
215
+ },
216
+ { id: 'labels.signup', label: 'Sign-up conversion label', kind: 'text' },
217
+ { id: 'labels.lead', label: 'Lead conversion label', kind: 'text' },
218
+ ],
219
+ },
220
+ {
221
+ key: 'meta',
222
+ label: 'Meta Pixel',
223
+ description: 'Facebook & Instagram ads tracking (Pixel + server-side Conversions API).',
224
+ storage: { kind: 'analytics-jsonb', path: 'meta' },
225
+ fields: [
226
+ { id: 'pixel_id', label: 'Pixel ID', kind: 'text', required: true },
227
+ {
228
+ id: 'capi_token',
229
+ label: 'Conversions API token',
230
+ kind: 'secret',
231
+ help: 'Optional — enables server-side event tracking (survives ad blockers).',
232
+ },
233
+ ],
234
+ },
235
+ {
236
+ key: 'tiktok',
237
+ label: 'TikTok Pixel',
238
+ description: 'TikTok ads tracking for your storefront.',
239
+ storage: { kind: 'analytics-jsonb', path: 'tiktok' },
240
+ fields: [
241
+ { id: 'pixel_code', label: 'Pixel code', kind: 'text', required: true },
242
+ {
243
+ id: 'events_api_token',
244
+ label: 'Events API token',
245
+ kind: 'secret',
246
+ help: 'Optional — enables server-side event tracking.',
247
+ },
248
+ ],
249
+ },
250
+ {
251
+ key: 'klaviyo',
252
+ label: 'Klaviyo',
253
+ description: 'Email & SMS marketing: onsite tracking and customer identification.',
254
+ storage: { kind: 'analytics-jsonb', path: 'klaviyo' },
255
+ fields: [
256
+ {
257
+ id: 'company_id',
258
+ label: 'Public API key',
259
+ kind: 'text',
260
+ required: true,
261
+ placeholder: 'AbC123',
262
+ help: 'Klaviyo → Settings → API Keys → Public API Key (6 characters).',
263
+ },
264
+ ],
265
+ },
266
+ {
267
+ key: 'intercom',
268
+ label: 'Intercom',
269
+ description: 'Live chat and customer support messenger on your storefront.',
270
+ storage: { kind: 'analytics-jsonb', path: 'intercom' },
271
+ fields: [
272
+ { id: 'app_id', label: 'App ID', kind: 'text', required: true },
273
+ {
274
+ id: 'region',
275
+ label: 'Data region',
276
+ kind: 'select',
277
+ options: [
278
+ { value: 'us', label: 'US' },
279
+ { value: 'eu', label: 'Europe' },
280
+ { value: 'ap', label: 'Australia' },
281
+ ],
282
+ },
283
+ ],
284
+ },
285
+ {
286
+ key: 'trustpilot',
287
+ label: 'Trustpilot',
288
+ description: 'Shows your Trustpilot reviews on the storefront and invites buyers to review.',
289
+ storage: { kind: 'analytics-jsonb', path: 'trustpilot' },
290
+ fields: [
291
+ { id: 'template_id', label: 'Widget template ID', kind: 'text', required: true },
292
+ { id: 'business_unit_id', label: 'Business unit ID', kind: 'text', required: true },
293
+ { id: 'review_url', label: 'Review link', kind: 'text' },
294
+ ],
295
+ },
296
+ ];
297
+ export function findIntegrationDef(key) {
298
+ return INTEGRATION_REGISTRY.find((d) => d.key === key);
299
+ }
300
+ // =============================================================================
301
+ // Custom descriptor sanitizer (fail-open: invalid entries are skipped)
302
+ // =============================================================================
303
+ const KEY_RE = /^[a-z][a-z0-9-]{1,40}$/;
304
+ const COLUMN_RE = /^[a-z][a-z0-9_]{1,62}$/;
305
+ const FIELD_KINDS = ['text', 'secret', 'number', 'select', 'toggle'];
306
+ /**
307
+ * Validate the raw `custom_integrations` JSONB into renderable descriptors.
308
+ * Registry keys shadow custom ones (a descriptor cannot override a known
309
+ * provider); anything malformed is silently dropped — a bad descriptor must
310
+ * never break the page.
311
+ */
312
+ export function sanitizeCustomDescriptors(raw) {
313
+ if (!Array.isArray(raw))
314
+ return [];
315
+ const out = [];
316
+ const seen = new Set(INTEGRATION_REGISTRY.map((d) => d.key));
317
+ for (const entry of raw.slice(0, 25)) {
318
+ if (!entry || typeof entry !== 'object')
319
+ continue;
320
+ const e = entry;
321
+ const key = typeof e.key === 'string' ? e.key : '';
322
+ const label = typeof e.label === 'string' ? e.label.slice(0, 60) : '';
323
+ if (!KEY_RE.test(key) || !label || seen.has(key))
324
+ continue;
325
+ if (!Array.isArray(e.fields) || e.fields.length === 0)
326
+ continue;
327
+ const fields = [];
328
+ for (const f of e.fields.slice(0, 10)) {
329
+ if (!f || typeof f !== 'object')
330
+ continue;
331
+ const ff = f;
332
+ const id = typeof ff.id === 'string' ? ff.id : '';
333
+ const fLabel = typeof ff.label === 'string' ? ff.label.slice(0, 60) : '';
334
+ if (!COLUMN_RE.test(id) || !fLabel)
335
+ continue;
336
+ const kind = FIELD_KINDS.includes(ff.kind)
337
+ ? ff.kind
338
+ : ff.secret === true
339
+ ? 'secret'
340
+ : 'text';
341
+ fields.push({
342
+ id,
343
+ label: fLabel,
344
+ kind,
345
+ secret: kind === 'secret',
346
+ required: ff.required === true,
347
+ placeholder: typeof ff.placeholder === 'string' ? ff.placeholder.slice(0, 80) : undefined,
348
+ help: typeof ff.help === 'string' ? ff.help.slice(0, 200) : undefined,
349
+ options: Array.isArray(ff.options)
350
+ ? ff.options
351
+ .slice(0, 12)
352
+ .filter((o) => !!o &&
353
+ typeof o === 'object' &&
354
+ typeof o.value === 'string' &&
355
+ typeof o.label === 'string')
356
+ : undefined,
357
+ });
358
+ }
359
+ if (fields.length === 0)
360
+ continue;
361
+ out.push({
362
+ key,
363
+ label,
364
+ description: typeof e.description === 'string' ? e.description.slice(0, 200) : undefined,
365
+ fields,
366
+ });
367
+ seen.add(key);
368
+ }
369
+ return out;
370
+ }
371
+ /** Convert a custom descriptor to the common IntegrationDef shape (columns storage). */
372
+ export function descriptorToDef(d) {
373
+ return {
374
+ key: d.key,
375
+ label: d.label,
376
+ description: d.description ?? 'Custom integration added to this store.',
377
+ storage: { kind: 'columns' },
378
+ fields: d.fields.map((f) => ({
379
+ id: f.id,
380
+ label: f.label,
381
+ kind: f.kind ?? (f.secret ? 'secret' : 'text'),
382
+ required: f.required,
383
+ placeholder: f.placeholder,
384
+ help: f.help,
385
+ options: f.options,
386
+ })),
387
+ };
388
+ }
389
+ //# sourceMappingURL=registry.js.map