@rovela-ai/sdk 0.21.0 → 0.23.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 (124) hide show
  1. package/dist/admin/api/email-sending.d.ts +24 -0
  2. package/dist/admin/api/email-sending.d.ts.map +1 -0
  3. package/dist/admin/api/email-sending.js +155 -0
  4. package/dist/admin/api/email-sending.js.map +1 -0
  5. package/dist/admin/api/index.d.ts +2 -0
  6. package/dist/admin/api/index.d.ts.map +1 -1
  7. package/dist/admin/api/index.js +4 -0
  8. package/dist/admin/api/index.js.map +1 -1
  9. package/dist/admin/api/integrations-brevo.d.ts +24 -0
  10. package/dist/admin/api/integrations-brevo.d.ts.map +1 -0
  11. package/dist/admin/api/integrations-brevo.js +286 -0
  12. package/dist/admin/api/integrations-brevo.js.map +1 -0
  13. package/dist/admin/api/integrations.d.ts +2 -0
  14. package/dist/admin/api/integrations.d.ts.map +1 -1
  15. package/dist/admin/api/integrations.js +1 -0
  16. package/dist/admin/api/integrations.js.map +1 -1
  17. package/dist/admin/api/products.d.ts.map +1 -1
  18. package/dist/admin/api/products.js +4 -0
  19. package/dist/admin/api/products.js.map +1 -1
  20. package/dist/admin/api/settings.d.ts.map +1 -1
  21. package/dist/admin/api/settings.js +4 -1
  22. package/dist/admin/api/settings.js.map +1 -1
  23. package/dist/admin/api/tax-zones.d.ts.map +1 -1
  24. package/dist/admin/api/tax-zones.js +7 -0
  25. package/dist/admin/api/tax-zones.js.map +1 -1
  26. package/dist/admin/components/EmailsManager.d.ts.map +1 -1
  27. package/dist/admin/components/EmailsManager.js +2 -1
  28. package/dist/admin/components/EmailsManager.js.map +1 -1
  29. package/dist/admin/components/IntegrationsManager.d.ts.map +1 -1
  30. package/dist/admin/components/IntegrationsManager.js +98 -2
  31. package/dist/admin/components/IntegrationsManager.js.map +1 -1
  32. package/dist/admin/components/OrderDetails.d.ts.map +1 -1
  33. package/dist/admin/components/OrderDetails.js +5 -1
  34. package/dist/admin/components/OrderDetails.js.map +1 -1
  35. package/dist/admin/components/ProductForm.d.ts.map +1 -1
  36. package/dist/admin/components/ProductForm.js +36 -1
  37. package/dist/admin/components/ProductForm.js.map +1 -1
  38. package/dist/admin/components/TaxSettings.d.ts.map +1 -1
  39. package/dist/admin/components/TaxSettings.js +16 -4
  40. package/dist/admin/components/TaxSettings.js.map +1 -1
  41. package/dist/admin/components/emails/EmailSendingPanel.d.ts +2 -0
  42. package/dist/admin/components/emails/EmailSendingPanel.d.ts.map +1 -0
  43. package/dist/admin/components/emails/EmailSendingPanel.js +131 -0
  44. package/dist/admin/components/emails/EmailSendingPanel.js.map +1 -0
  45. package/dist/admin/integrations/registry.d.ts +2 -0
  46. package/dist/admin/integrations/registry.d.ts.map +1 -1
  47. package/dist/admin/integrations/registry.js +41 -0
  48. package/dist/admin/integrations/registry.js.map +1 -1
  49. package/dist/admin/types.d.ts +15 -0
  50. package/dist/admin/types.d.ts.map +1 -1
  51. package/dist/checkout/api/manual.d.ts.map +1 -1
  52. package/dist/checkout/api/manual.js +7 -0
  53. package/dist/checkout/api/manual.js.map +1 -1
  54. package/dist/checkout/api/shipping.d.ts +0 -18
  55. package/dist/checkout/api/shipping.d.ts.map +1 -1
  56. package/dist/checkout/api/shipping.js +33 -3
  57. package/dist/checkout/api/shipping.js.map +1 -1
  58. package/dist/checkout/components/CheckoutFlow.d.ts.map +1 -1
  59. package/dist/checkout/components/CheckoutFlow.js +30 -13
  60. package/dist/checkout/components/CheckoutFlow.js.map +1 -1
  61. package/dist/checkout/components/OrderSummary.d.ts +1 -1
  62. package/dist/checkout/components/OrderSummary.d.ts.map +1 -1
  63. package/dist/checkout/components/OrderSummary.js +5 -2
  64. package/dist/checkout/components/OrderSummary.js.map +1 -1
  65. package/dist/checkout/server/create-checkout-session.d.ts.map +1 -1
  66. package/dist/checkout/server/create-checkout-session.js +38 -9
  67. package/dist/checkout/server/create-checkout-session.js.map +1 -1
  68. package/dist/checkout/server/handle-webhook.js +6 -0
  69. package/dist/checkout/server/handle-webhook.js.map +1 -1
  70. package/dist/checkout/server/order-service.d.ts.map +1 -1
  71. package/dist/checkout/server/order-service.js +21 -0
  72. package/dist/checkout/server/order-service.js.map +1 -1
  73. package/dist/checkout/server/pricing.d.ts +28 -1
  74. package/dist/checkout/server/pricing.d.ts.map +1 -1
  75. package/dist/checkout/server/pricing.js +84 -6
  76. package/dist/checkout/server/pricing.js.map +1 -1
  77. package/dist/checkout/types.d.ts +32 -0
  78. package/dist/checkout/types.d.ts.map +1 -1
  79. package/dist/core/db/queries.d.ts +114 -25
  80. package/dist/core/db/queries.d.ts.map +1 -1
  81. package/dist/core/db/queries.js +124 -2
  82. package/dist/core/db/queries.js.map +1 -1
  83. package/dist/core/db/schema.d.ts +213 -0
  84. package/dist/core/db/schema.d.ts.map +1 -1
  85. package/dist/core/db/schema.js +42 -0
  86. package/dist/core/db/schema.js.map +1 -1
  87. package/dist/emails/index.d.ts +2 -0
  88. package/dist/emails/index.d.ts.map +1 -1
  89. package/dist/emails/index.js +1 -0
  90. package/dist/emails/index.js.map +1 -1
  91. package/dist/emails/send/orders.d.ts +4 -0
  92. package/dist/emails/send/orders.d.ts.map +1 -1
  93. package/dist/emails/send/orders.js +1 -0
  94. package/dist/emails/send/orders.js.map +1 -1
  95. package/dist/emails/sender.d.ts.map +1 -1
  96. package/dist/emails/sender.js +30 -5
  97. package/dist/emails/sender.js.map +1 -1
  98. package/dist/emails/templates/order-confirmation.d.ts +9 -0
  99. package/dist/emails/templates/order-confirmation.d.ts.map +1 -1
  100. package/dist/emails/templates/order-confirmation.js +19 -8
  101. package/dist/emails/templates/order-confirmation.js.map +1 -1
  102. package/dist/emails/transport-smtp.d.ts +58 -0
  103. package/dist/emails/transport-smtp.d.ts.map +1 -0
  104. package/dist/emails/transport-smtp.js +97 -0
  105. package/dist/emails/transport-smtp.js.map +1 -0
  106. package/dist/emails/transport.d.ts +77 -0
  107. package/dist/emails/transport.d.ts.map +1 -0
  108. package/dist/emails/transport.js +154 -0
  109. package/dist/emails/transport.js.map +1 -0
  110. package/dist/emails/types.d.ts +5 -0
  111. package/dist/emails/types.d.ts.map +1 -1
  112. package/dist/products/api/products.d.ts.map +1 -1
  113. package/dist/products/api/products.js +18 -3
  114. package/dist/products/api/products.js.map +1 -1
  115. package/docs/changelog/epoch-09-catalog-tax.md +91 -0
  116. package/docs/changelog/epoch-10-email-transport.md +97 -0
  117. package/package.json +2 -1
  118. package/templates/store-template/.claude/skills/manage-products/SKILL.md +1 -1
  119. package/templates/store-template/app/account/orders/[id]/invoice/page.tsx +19 -4
  120. package/templates/store-template/app/api/admin/emails/sending/route.ts +9 -0
  121. package/templates/store-template/app/api/admin/integrations/brevo/backfill/route.ts +9 -0
  122. package/templates/store-template/app/api/admin/integrations/brevo/route.ts +9 -0
  123. package/templates/store-template/next.config.js +4 -1
  124. package/templates/store-template/package.json +2 -1
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @rovela/sdk/admin/api/email-sending
3
+ *
4
+ * The transactional-email Sending configuration (SDK 0.23.0) — read/written
5
+ * by the Emails page's Sending panel AND the Brevo integration modal's
6
+ * "send transactional emails through Brevo" toggle (both surfaces share
7
+ * these columns so they can never disagree).
8
+ *
9
+ * GET /api/admin/emails/sending — current transport + sender identity +
10
+ * masked SMTP state + whether the Brevo transport is available.
11
+ * PUT /api/admin/emails/sending — save, with SAVE-TIME validation (the
12
+ * fail-safe delivery rule means runtime failures silently fall back to
13
+ * the platform sender — misconfiguration must surface HERE):
14
+ * - smtp: a real nodemailer verify() handshake before persisting.
15
+ * - brevo: requires the marketing integration's API key; checks the
16
+ * from-address against Brevo's verified senders and returns a
17
+ * `warning` when unverified (Brevo rejects sends from unverified
18
+ * senders → they'd all fall back to the platform path).
19
+ * SMTP password is write-only: blank keeps the stored value.
20
+ */
21
+ import { NextRequest, NextResponse } from 'next/server';
22
+ export declare function getEmailSending(): Promise<NextResponse>;
23
+ export declare function putEmailSending(request: NextRequest): Promise<NextResponse>;
24
+ //# sourceMappingURL=email-sending.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-sending.d.ts","sourceRoot":"","sources":["../../../src/admin/api/email-sending.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAcvD,wBAAsB,eAAe,IAAI,OAAO,CAAC,YAAY,CAAC,CA4B7D;AAqBD,wBAAsB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAwHjF"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * @rovela/sdk/admin/api/email-sending
3
+ *
4
+ * The transactional-email Sending configuration (SDK 0.23.0) — read/written
5
+ * by the Emails page's Sending panel AND the Brevo integration modal's
6
+ * "send transactional emails through Brevo" toggle (both surfaces share
7
+ * these columns so they can never disagree).
8
+ *
9
+ * GET /api/admin/emails/sending — current transport + sender identity +
10
+ * masked SMTP state + whether the Brevo transport is available.
11
+ * PUT /api/admin/emails/sending — save, with SAVE-TIME validation (the
12
+ * fail-safe delivery rule means runtime failures silently fall back to
13
+ * the platform sender — misconfiguration must surface HERE):
14
+ * - smtp: a real nodemailer verify() handshake before persisting.
15
+ * - brevo: requires the marketing integration's API key; checks the
16
+ * from-address against Brevo's verified senders and returns a
17
+ * `warning` when unverified (Brevo rejects sends from unverified
18
+ * senders → they'd all fall back to the platform path).
19
+ * SMTP password is write-only: blank keeps the stored value.
20
+ */
21
+ import { NextResponse } from 'next/server';
22
+ import { requireAdmin } from '../server/admin-session';
23
+ import { findSettings, upsertSettings } from '../../core/db/queries';
24
+ import { getBrevoApiKey, resolveFromIdentity, smtpConfigFromSettings, verifySmtp, } from '../../emails/transport';
25
+ // =============================================================================
26
+ // GET
27
+ // =============================================================================
28
+ export async function getEmailSending() {
29
+ const guard = await requireAdmin({ permission: 'settings.read' });
30
+ if (!guard.ok)
31
+ return guard.response;
32
+ try {
33
+ const settings = await findSettings().catch(() => null);
34
+ const brevoKey = await getBrevoApiKey();
35
+ const identity = resolveFromIdentity(settings);
36
+ return NextResponse.json({
37
+ data: {
38
+ transport: settings?.emailTransport ?? 'platform',
39
+ fromAddress: settings?.emailFromAddress ?? null,
40
+ fromName: settings?.emailFromName ?? null,
41
+ effectiveFromAddress: identity.address,
42
+ effectiveFromName: identity.name,
43
+ smtp: {
44
+ host: settings?.smtpHost ?? null,
45
+ port: settings?.smtpPort ?? null,
46
+ secure: settings?.smtpSecure ?? null,
47
+ user: settings?.smtpUser ?? null,
48
+ hasPassword: !!settings?.smtpPassword,
49
+ },
50
+ brevoAvailable: !!brevoKey,
51
+ },
52
+ });
53
+ }
54
+ catch (error) {
55
+ console.error('[Email Sending] GET failed:', error);
56
+ return NextResponse.json({ error: 'Failed to load sending settings' }, { status: 500 });
57
+ }
58
+ }
59
+ const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
60
+ export async function putEmailSending(request) {
61
+ const guard = await requireAdmin({ permission: 'settings.write' });
62
+ if (!guard.ok)
63
+ return guard.response;
64
+ try {
65
+ const body = (await request.json().catch(() => null)) ?? {};
66
+ const transport = body.transport === 'brevo' || body.transport === 'smtp' ? body.transport : 'platform';
67
+ const settings = await findSettings().catch(() => null);
68
+ const fromAddress = body.fromAddress !== undefined
69
+ ? (body.fromAddress?.trim() || null)
70
+ : (settings?.emailFromAddress ?? null);
71
+ const fromName = body.fromName !== undefined
72
+ ? (body.fromName?.trim() || null)
73
+ : (settings?.emailFromName ?? null);
74
+ if (fromAddress && !EMAIL_RE.test(fromAddress)) {
75
+ return NextResponse.json({ error: 'The sender address is not a valid email' }, { status: 400 });
76
+ }
77
+ // Merge SMTP fields (password keeps stored value when blank).
78
+ const smtpHost = body.smtp?.host !== undefined ? (body.smtp.host?.trim() || null) : (settings?.smtpHost ?? null);
79
+ const smtpPortRaw = body.smtp?.port;
80
+ const smtpPort = smtpPortRaw !== undefined && smtpPortRaw !== null && smtpPortRaw !== ''
81
+ ? Math.trunc(Number(smtpPortRaw))
82
+ : smtpPortRaw === null || smtpPortRaw === ''
83
+ ? null
84
+ : (settings?.smtpPort ?? null);
85
+ if (smtpPort !== null && (!Number.isFinite(smtpPort) || smtpPort < 1 || smtpPort > 65535)) {
86
+ return NextResponse.json({ error: 'SMTP port must be between 1 and 65535' }, { status: 400 });
87
+ }
88
+ const smtpSecure = body.smtp?.secure !== undefined ? body.smtp.secure === true : (settings?.smtpSecure ?? null);
89
+ const smtpUser = body.smtp?.user !== undefined ? (body.smtp.user?.trim() || null) : (settings?.smtpUser ?? null);
90
+ const smtpPassword = body.smtp?.password && body.smtp.password.trim()
91
+ ? body.smtp.password.trim()
92
+ : (settings?.smtpPassword ?? null);
93
+ let warning = null;
94
+ // ---- Save-time validation per transport --------------------------------
95
+ if (transport === 'smtp') {
96
+ if (!smtpHost) {
97
+ return NextResponse.json({ error: 'Enter your SMTP server host' }, { status: 400 });
98
+ }
99
+ if (!fromAddress && !settings?.storeEmail) {
100
+ return NextResponse.json({ error: 'Set a sender address — your SMTP server sends on its behalf' }, { status: 400 });
101
+ }
102
+ const cfg = smtpConfigFromSettings({
103
+ smtpHost,
104
+ smtpPort,
105
+ smtpSecure,
106
+ smtpUser,
107
+ smtpPassword,
108
+ });
109
+ const check = await verifySmtp(cfg);
110
+ if (!check.ok) {
111
+ return NextResponse.json({ error: `SMTP connection failed: ${check.error}` }, { status: 400 });
112
+ }
113
+ }
114
+ if (transport === 'brevo') {
115
+ const apiKey = await getBrevoApiKey();
116
+ if (!apiKey) {
117
+ return NextResponse.json({ error: 'Connect Brevo under Integrations first — the email transport uses the same API key' }, { status: 400 });
118
+ }
119
+ const effectiveFrom = fromAddress || settings?.storeEmail?.trim() || null;
120
+ if (!effectiveFrom) {
121
+ return NextResponse.json({ error: 'Set a sender address for Brevo to send from' }, { status: 400 });
122
+ }
123
+ try {
124
+ const res = await fetch('https://api.brevo.com/v3/senders', {
125
+ headers: { 'api-key': apiKey, accept: 'application/json' },
126
+ signal: AbortSignal.timeout(8000),
127
+ });
128
+ const json = (await res.json().catch(() => null));
129
+ const verified = (json?.senders ?? []).some((s) => s.email?.toLowerCase() === effectiveFrom.toLowerCase() && s.active !== false);
130
+ if (!verified) {
131
+ warning = `${effectiveFrom} is not a verified sender in Brevo yet — sends will fall back to the platform sender until you verify it (Brevo → Senders & IP).`;
132
+ }
133
+ }
134
+ catch {
135
+ warning = 'Could not check your Brevo verified senders right now.';
136
+ }
137
+ }
138
+ await upsertSettings({
139
+ emailTransport: transport,
140
+ emailFromAddress: fromAddress,
141
+ emailFromName: fromName,
142
+ smtpHost,
143
+ smtpPort,
144
+ smtpSecure,
145
+ smtpUser,
146
+ smtpPassword,
147
+ });
148
+ return NextResponse.json({ data: { saved: true, transport, warning } });
149
+ }
150
+ catch (error) {
151
+ console.error('[Email Sending] PUT failed:', error);
152
+ return NextResponse.json({ error: 'Failed to save sending settings' }, { status: 500 });
153
+ }
154
+ }
155
+ //# sourceMappingURL=email-sending.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-sending.js","sourceRoot":"","sources":["../../../src/admin/api/email-sending.ts"],"names":[],"mappings":"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"}
@@ -108,6 +108,8 @@ export { GET as getMe, PATCH as updateMe, PATCH_PASSWORD as updateMyPassword, }
108
108
  export { GET as getSettings, PUT as updateSettings } from './settings';
109
109
  export { getIntegrations, saveIntegration } from './integrations';
110
110
  export type { IntegrationState, IntegrationFieldState } from './integrations';
111
+ export { getBrevoStatus, postBrevoBackfill } from './integrations-brevo';
112
+ export { getEmailSending, putEmailSending } from './email-sending';
111
113
  export { GET as getStripeStatus } from './stripe-status';
112
114
  export { getCarriers as getShippingCarriers, createCarrier as createShippingCarrier, getCarrier as getShippingCarrier, updateCarrier as updateShippingCarrier, deleteCarrier as deleteShippingCarrier, } from './shipping';
113
115
  export { getZones as getShippingZones, createZone as createShippingZone, getZone as getShippingZone, updateZone as updateShippingZone, deleteZone as deleteShippingZone, createRate as createShippingRate, updateRate as updateShippingRate, deleteRate as deleteShippingRate, validateShippoApiKey, saveShippoApiKey, deleteShippoApiKey, getColissimoConfig, saveColissimoSettings, deleteColissimoSettings, } from './shipping';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/admin/api/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/admin/api/index.ts"],"names":[],"mappings":"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"}
@@ -129,6 +129,10 @@ export { GET as getMe, PATCH as updateMe, PATCH_PASSWORD as updateMyPassword, }
129
129
  export { GET as getSettings, PUT as updateSettings } from './settings';
130
130
  // Integrations (/admin/integrations — external-service credentials)
131
131
  export { getIntegrations, saveIntegration } from './integrations';
132
+ // Brevo integration extras (status echo + chunked history import)
133
+ export { getBrevoStatus, postBrevoBackfill } from './integrations-brevo';
134
+ // Transactional-email transport (Emails → Sending panel + Brevo toggle)
135
+ export { getEmailSending, putEmailSending } from './email-sending';
132
136
  // Stripe Status
133
137
  export { GET as getStripeStatus } from './stripe-status';
134
138
  // Shipping Carriers
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/admin/api/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/admin/api/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmFG;AAEH,WAAW;AACX,OAAO,EACL,GAAG,IAAI,WAAW,EAClB,IAAI,IAAI,aAAa,EACrB,UAAU,EACV,GAAG,IAAI,aAAa,EACpB,MAAM,IAAI,aAAa,EACvB,UAAU,EACV,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,YAAY,CAAA;AAEnB,0EAA0E;AAC1E,OAAO,EAAE,IAAI,IAAI,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAEtD,+EAA+E;AAC/E,OAAO,EAAE,GAAG,IAAI,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAE3D,yEAAyE;AACzE,OAAO,EACL,GAAG,IAAI,aAAa,EACpB,IAAI,IAAI,aAAa,GACtB,MAAM,eAAe,CAAA;AAGtB,SAAS;AACT,OAAO,EACL,GAAG,IAAI,SAAS,EAChB,QAAQ,EACR,GAAG,IAAI,WAAW,EAClB,sBAAsB,EACtB,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,UAAU,CAAA;AAEjB,SAAS;AACT,OAAO,EAAE,IAAI,IAAI,aAAa,EAAE,MAAM,UAAU,CAAA;AAEhD,0CAA0C;AAC1C,OAAO,EAAE,YAAY,IAAI,aAAa,EAAE,WAAW,IAAI,YAAY,EAAE,MAAM,UAAU,CAAA;AAErF,QAAQ;AACR,OAAO,EAAE,GAAG,IAAI,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEzC,aAAa;AACb,OAAO,EACL,GAAG,IAAI,aAAa,EACpB,IAAI,IAAI,cAAc,EACtB,WAAW,EACX,GAAG,IAAI,cAAc,EACrB,MAAM,IAAI,cAAc,GACzB,MAAM,cAAc,CAAA;AAErB,YAAY;AACZ,OAAO,EACL,GAAG,IAAI,YAAY,EACnB,WAAW,EACX,cAAc,EACd,cAAc,EACd,aAAa;AACb,+BAA+B;AAC/B,aAAa,IAAI,0BAA0B,EAC3C,aAAa,IAAI,0BAA0B,EAC3C,aAAa,IAAI,0BAA0B,EAC3C,aAAa,IAAI,0BAA0B,GAC5C,MAAM,aAAa,CAAA;AAEpB,qDAAqD;AACrD,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,aAAa,CAAA;AAEpB,oDAAoD;AACpD,OAAO,EACL,iBAAiB,EACjB,0BAA0B,EAC1B,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,mBAAmB,CAAA;AAE1B,+CAA+C;AAC/C,OAAO,EACL,iBAAiB,EACjB,0BAA0B,EAC1B,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,mBAAmB,CAAA;AAE1B,2DAA2D;AAC3D,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,aAAa,CAAA;AAEpB,oCAAoC;AACpC,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,SAAS,CAAA;AAE5C,gCAAgC;AAChC,OAAO,EAAE,GAAG,IAAI,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAEjD,uCAAuC;AACvC,OAAO,EAAE,IAAI,IAAI,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAC/D,OAAO,EACL,GAAG,IAAI,8BAA8B,EACrC,IAAI,IAAI,kBAAkB,GAC3B,MAAM,kBAAkB,CAAA;AAEzB,yEAAyE;AACzE,OAAO,EACL,GAAG,IAAI,QAAQ,EACf,IAAI,IAAI,UAAU,EAClB,OAAO,EACP,KAAK,IAAI,UAAU,EACnB,MAAM,IAAI,UAAU,GACrB,MAAM,SAAS,CAAA;AAGhB,2DAA2D;AAC3D,OAAO,EACL,GAAG,IAAI,0BAA0B,EACjC,IAAI,IAAI,wBAAwB,GACjC,MAAM,iBAAiB,CAAA;AAExB,yBAAyB;AACzB,OAAO,EACL,GAAG,IAAI,KAAK,EACZ,KAAK,IAAI,QAAQ,EACjB,cAAc,IAAI,gBAAgB,GACnC,MAAM,MAAM,CAAA;AAEb,WAAW;AACX,OAAO,EAAE,GAAG,IAAI,WAAW,EAAE,GAAG,IAAI,cAAc,EAAE,MAAM,YAAY,CAAA;AAEtE,oEAAoE;AACpE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAGjE,kEAAkE;AAClE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAExE,wEAAwE;AACxE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAElE,gBAAgB;AAChB,OAAO,EAAE,GAAG,IAAI,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAExD,oBAAoB;AACpB,OAAO,EACL,WAAW,IAAI,mBAAmB,EAClC,aAAa,IAAI,qBAAqB,EACtC,UAAU,IAAI,kBAAkB,EAChC,aAAa,IAAI,qBAAqB,EACtC,aAAa,IAAI,qBAAqB,GACvC,MAAM,YAAY,CAAA;AAEnB,yBAAyB;AACzB,OAAO,EACL,QAAQ,IAAI,gBAAgB,EAC5B,UAAU,IAAI,kBAAkB,EAChC,OAAO,IAAI,eAAe,EAC1B,UAAU,IAAI,kBAAkB,EAChC,UAAU,IAAI,kBAAkB,EAChC,UAAU,IAAI,kBAAkB,EAChC,UAAU,IAAI,kBAAkB,EAChC,UAAU,IAAI,kBAAkB,EAChC,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,YAAY,CAAA;AAEnB,YAAY;AACZ,OAAO,EACL,WAAW,EACX,aAAa,EACb,UAAU,EACV,aAAa,EACb,aAAa,GACd,MAAM,aAAa,CAAA"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @rovela/sdk/admin/api/integrations-brevo
3
+ *
4
+ * Brevo-specific extras behind the /admin/integrations Brevo modal:
5
+ *
6
+ * GET /api/admin/integrations/brevo — live status: account identity
7
+ * (connected as x@y, plan), verified senders + whether the store's
8
+ * from-address is one of them, whether Brevo's eCommerce module already
9
+ * holds orders (the double-count warning for the history import), and
10
+ * the current email transport.
11
+ * POST /api/admin/integrations/brevo/backfill — CHUNKED history import.
12
+ * Serverless-safe: each call processes one slice and returns a cursor;
13
+ * the modal loops until done (the runChunkedBulk pattern). Contacts
14
+ * upsert by email (updateEnabled — no duplicates, existing lists and
15
+ * consent untouched); orders push with historical:true so NO automation
16
+ * ever fires off imported history. Idempotent and resumable.
17
+ *
18
+ * This supersedes per-store backfill scripts (the EasyElec
19
+ * scripts/brevo-backfill.mjs backdoor) — the import is part of the product.
20
+ */
21
+ import { NextRequest, NextResponse } from 'next/server';
22
+ export declare function getBrevoStatus(): Promise<NextResponse>;
23
+ export declare function postBrevoBackfill(request: NextRequest): Promise<NextResponse>;
24
+ //# sourceMappingURL=integrations-brevo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrations-brevo.d.ts","sourceRoot":"","sources":["../../../src/admin/api/integrations-brevo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAmDvD,wBAAsB,cAAc,IAAI,OAAO,CAAC,YAAY,CAAC,CA4D5D;AAgBD,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAwLnF"}
@@ -0,0 +1,286 @@
1
+ /**
2
+ * @rovela/sdk/admin/api/integrations-brevo
3
+ *
4
+ * Brevo-specific extras behind the /admin/integrations Brevo modal:
5
+ *
6
+ * GET /api/admin/integrations/brevo — live status: account identity
7
+ * (connected as x@y, plan), verified senders + whether the store's
8
+ * from-address is one of them, whether Brevo's eCommerce module already
9
+ * holds orders (the double-count warning for the history import), and
10
+ * the current email transport.
11
+ * POST /api/admin/integrations/brevo/backfill — CHUNKED history import.
12
+ * Serverless-safe: each call processes one slice and returns a cursor;
13
+ * the modal loops until done (the runChunkedBulk pattern). Contacts
14
+ * upsert by email (updateEnabled — no duplicates, existing lists and
15
+ * consent untouched); orders push with historical:true so NO automation
16
+ * ever fires off imported history. Idempotent and resumable.
17
+ *
18
+ * This supersedes per-store backfill scripts (the EasyElec
19
+ * scripts/brevo-backfill.mjs backdoor) — the import is part of the product.
20
+ */
21
+ import { NextResponse } from 'next/server';
22
+ import { requireAdmin } from '../server/admin-session';
23
+ import { getSql } from '../../core/db/client';
24
+ import { findSettings } from '../../core/db/queries';
25
+ import { resolveFromIdentity } from '../../emails/transport';
26
+ const API = 'https://api.brevo.com/v3';
27
+ // =============================================================================
28
+ // Shared helpers
29
+ // =============================================================================
30
+ async function readBrevoConfig() {
31
+ try {
32
+ const sql = getSql();
33
+ const rows = (await sql `
34
+ SELECT brevo_api_key, brevo_list_id, brevo_enabled FROM store_settings LIMIT 1
35
+ `);
36
+ const row = rows[0];
37
+ return {
38
+ apiKey: row?.brevo_api_key || null,
39
+ listId: row?.brevo_list_id ?? null,
40
+ enabled: row?.brevo_enabled === true,
41
+ };
42
+ }
43
+ catch {
44
+ return { apiKey: null, listId: null, enabled: false };
45
+ }
46
+ }
47
+ async function brevo(apiKey, method, path, body) {
48
+ const res = await fetch(`${API}${path}`, {
49
+ method,
50
+ headers: { 'api-key': apiKey, 'content-type': 'application/json', accept: 'application/json' },
51
+ body: body !== undefined ? JSON.stringify(body) : undefined,
52
+ signal: AbortSignal.timeout(15000),
53
+ });
54
+ const json = await res.json().catch(() => null);
55
+ return { ok: res.ok, status: res.status, json };
56
+ }
57
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
58
+ // =============================================================================
59
+ // GET — live status for the modal
60
+ // =============================================================================
61
+ export async function getBrevoStatus() {
62
+ const guard = await requireAdmin({ permission: 'settings.read' });
63
+ if (!guard.ok)
64
+ return guard.response;
65
+ try {
66
+ const { apiKey, enabled } = await readBrevoConfig();
67
+ if (!apiKey) {
68
+ return NextResponse.json({ data: { connected: false } });
69
+ }
70
+ const settings = await findSettings().catch(() => null);
71
+ const identity = resolveFromIdentity(settings);
72
+ const [account, senders, orders] = await Promise.all([
73
+ brevo(apiKey, 'GET', '/account'),
74
+ brevo(apiKey, 'GET', '/senders'),
75
+ // One order is enough to detect a pre-populated eCommerce module
76
+ // (old PrestaShop-plugin history → the import must skip orders or
77
+ // dashboards double-count).
78
+ brevo(apiKey, 'GET', '/orders?limit=1'),
79
+ ]);
80
+ const accountData = account.ok
81
+ ? account.json
82
+ : null;
83
+ const senderList = senders.ok
84
+ ? (senders.json.senders ?? [])
85
+ : [];
86
+ const fromAddress = identity.address;
87
+ const senderVerified = fromAddress
88
+ ? senderList.some((s) => s.email?.toLowerCase() === fromAddress.toLowerCase() && s.active !== false)
89
+ : false;
90
+ const ordersJson = orders.ok ? orders.json : null;
91
+ const ecommerceHasOrders = !!ordersJson && ((ordersJson.count ?? 0) > 0 || (ordersJson.orders?.length ?? 0) > 0);
92
+ const sql = getSql();
93
+ const [{ n: customerCount }] = (await sql `
94
+ SELECT COUNT(*)::int AS n FROM customers WHERE email IS NOT NULL AND email <> ''
95
+ `);
96
+ const [{ n: orderCount }] = (await sql `
97
+ SELECT COUNT(*)::int AS n FROM orders WHERE email IS NOT NULL AND email <> ''
98
+ `);
99
+ return NextResponse.json({
100
+ data: {
101
+ connected: true,
102
+ enabled,
103
+ accountEmail: accountData?.email ?? null,
104
+ plan: accountData?.plan?.[0]?.type ?? null,
105
+ fromAddress,
106
+ senderVerified,
107
+ ecommerceHasOrders,
108
+ customerCount,
109
+ orderCount,
110
+ emailTransport: settings?.emailTransport ?? 'platform',
111
+ },
112
+ });
113
+ }
114
+ catch (error) {
115
+ console.error('[Brevo status] failed:', error);
116
+ return NextResponse.json({ error: 'Could not reach Brevo' }, { status: 502 });
117
+ }
118
+ }
119
+ // =============================================================================
120
+ // POST — chunked history import
121
+ // =============================================================================
122
+ const CONTACT_CHUNK = 200; // ~20s at 100ms pacing — safely under function limits
123
+ const ORDER_BATCH = 500; // Brevo /orders/status/batch cap
124
+ const ORDER_BATCHES_PER_CALL = 6; // ~3k orders per call, seconds of work
125
+ export async function postBrevoBackfill(request) {
126
+ const guard = await requireAdmin({ permission: 'settings.write' });
127
+ if (!guard.ok)
128
+ return guard.response;
129
+ try {
130
+ const { apiKey } = await readBrevoConfig();
131
+ if (!apiKey) {
132
+ return NextResponse.json({ error: 'Connect Brevo first' }, { status: 400 });
133
+ }
134
+ const body = (await request.json().catch(() => null)) ?? {};
135
+ const phase = body.phase ?? 'contacts';
136
+ const cursor = Math.max(0, body.cursor ?? 0);
137
+ const includeOrders = body.includeOrders === true;
138
+ const sql = getSql();
139
+ if (phase === 'contacts') {
140
+ // First slice: idempotent one-time setup (eCommerce module + the
141
+ // attribute definitions the store writes).
142
+ if (cursor === 0) {
143
+ await brevo(apiKey, 'POST', '/ecommerce/activate').catch(() => null);
144
+ const ATTRIBUTES = [
145
+ ['ORDER_COUNT', 'float'],
146
+ ['TOTAL_SPENT', 'float'],
147
+ ['LAST_ORDER_DATE', 'date'],
148
+ ['CUSTOMER_SINCE', 'date'],
149
+ ];
150
+ for (const [name, type] of ATTRIBUTES) {
151
+ await brevo(apiKey, 'POST', `/contacts/attributes/normal/${name}`, { type }).catch(() => null);
152
+ await sleep(150);
153
+ }
154
+ }
155
+ const [{ n: total }] = (await sql `
156
+ SELECT COUNT(*)::int AS n FROM customers WHERE email IS NOT NULL AND email <> ''
157
+ `);
158
+ const customers = (await sql `
159
+ SELECT c.email, c.name, c.created_at,
160
+ COUNT(o.id) FILTER (WHERE o.status NOT IN ('cancelled','refunded'))::int AS order_count,
161
+ COALESCE(SUM(o.total::numeric) FILTER (WHERE o.status NOT IN ('cancelled','refunded')), 0)::float AS total_spent,
162
+ MAX(o.created_at) AS last_order
163
+ FROM customers c
164
+ LEFT JOIN orders o ON o.email = c.email
165
+ WHERE c.email IS NOT NULL AND c.email <> ''
166
+ GROUP BY c.id, c.email, c.name, c.created_at
167
+ ORDER BY c.created_at, c.email
168
+ LIMIT ${CONTACT_CHUNK} OFFSET ${cursor}
169
+ `);
170
+ let done = 0;
171
+ let failed = 0;
172
+ for (const c of customers) {
173
+ const [firstName, ...rest] = (c.name || '').trim().split(/\s+/);
174
+ const attributes = {
175
+ ...(firstName ? { FIRSTNAME: firstName } : {}),
176
+ ...(rest.length ? { LASTNAME: rest.join(' ') } : {}),
177
+ ORDER_COUNT: c.order_count,
178
+ TOTAL_SPENT: Math.round(c.total_spent * 100) / 100,
179
+ ...(c.last_order
180
+ ? { LAST_ORDER_DATE: new Date(c.last_order).toISOString().split('T')[0] }
181
+ : {}),
182
+ CUSTOMER_SINCE: new Date(c.created_at).toISOString().split('T')[0],
183
+ };
184
+ // Upsert by email — no duplicates, existing attributes/lists/consent
185
+ // untouched. Deliberately NO listIds here: the history import must
186
+ // never change list memberships (only NEW signups join the
187
+ // configured list at runtime).
188
+ const r = await brevo(apiKey, 'POST', '/contacts', {
189
+ email: c.email,
190
+ attributes,
191
+ updateEnabled: true,
192
+ });
193
+ if (r.status === 429) {
194
+ await sleep(2000);
195
+ await brevo(apiKey, 'POST', '/contacts', { email: c.email, attributes, updateEnabled: true });
196
+ }
197
+ if (r.ok || r.status === 429)
198
+ done++;
199
+ else
200
+ failed++;
201
+ await sleep(110); // ~9 rps, under Brevo's 10 rps
202
+ }
203
+ const next = cursor + customers.length;
204
+ const contactsDone = next >= total || customers.length === 0;
205
+ return NextResponse.json({
206
+ data: {
207
+ phase: contactsDone ? (includeOrders ? 'orders' : 'done') : 'contacts',
208
+ cursor: contactsDone ? 0 : next,
209
+ processed: next,
210
+ total,
211
+ failed,
212
+ done: contactsDone && !includeOrders,
213
+ },
214
+ });
215
+ }
216
+ // phase === 'orders'
217
+ const [{ n: total }] = (await sql `
218
+ SELECT COUNT(*)::int AS n FROM orders WHERE email IS NOT NULL AND email <> ''
219
+ `);
220
+ const STATUS_MAP = {
221
+ pending: 'created',
222
+ paid: 'completed',
223
+ shipped: 'completed',
224
+ delivered: 'completed',
225
+ cancelled: 'cancelled',
226
+ refunded: 'returned',
227
+ };
228
+ let processed = cursor;
229
+ for (let b = 0; b < ORDER_BATCHES_PER_CALL; b++) {
230
+ const orders = (await sql `
231
+ SELECT o.id, o.email, o.status, o.total, o.created_at, o.updated_at,
232
+ COALESCE(
233
+ json_agg(json_build_object('productId', oi.product_id, 'quantity', oi.quantity, 'price', oi.price))
234
+ FILTER (WHERE oi.id IS NOT NULL),
235
+ '[]'
236
+ ) AS items
237
+ FROM orders o
238
+ LEFT JOIN order_items oi ON oi.order_id = o.id
239
+ WHERE o.email IS NOT NULL AND o.email <> ''
240
+ GROUP BY o.id
241
+ ORDER BY o.created_at, o.id
242
+ LIMIT ${ORDER_BATCH} OFFSET ${processed}
243
+ `);
244
+ if (orders.length === 0)
245
+ break;
246
+ await brevo(apiKey, 'POST', '/orders/status/batch', {
247
+ // historical:true is NOT optional — it populates dashboards WITHOUT
248
+ // firing a single automation over 4,000 imported orders.
249
+ historical: true,
250
+ orders: orders.map((o) => ({
251
+ id: o.id,
252
+ createdAt: new Date(o.created_at).toISOString(),
253
+ updatedAt: new Date(o.updated_at || o.created_at).toISOString(),
254
+ status: STATUS_MAP[o.status] || 'completed',
255
+ amount: Number.parseFloat(o.total) || 0,
256
+ identifiers: { email_id: o.email },
257
+ products: (typeof o.items === 'string' ? JSON.parse(o.items) : o.items).map((i) => ({
258
+ productId: i.productId,
259
+ quantity: i.quantity,
260
+ price: Number.parseFloat(i.price) || 0,
261
+ })),
262
+ })),
263
+ });
264
+ processed += orders.length;
265
+ await sleep(800);
266
+ if (processed >= total)
267
+ break;
268
+ }
269
+ const ordersDone = processed >= total;
270
+ return NextResponse.json({
271
+ data: {
272
+ phase: ordersDone ? 'done' : 'orders',
273
+ cursor: ordersDone ? 0 : processed,
274
+ processed,
275
+ total,
276
+ failed: 0,
277
+ done: ordersDone,
278
+ },
279
+ });
280
+ }
281
+ catch (error) {
282
+ console.error('[Brevo backfill] failed:', error);
283
+ return NextResponse.json({ error: 'Import failed — safe to retry (it resumes)' }, { status: 500 });
284
+ }
285
+ }
286
+ //# sourceMappingURL=integrations-brevo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrations-brevo.js","sourceRoot":"","sources":["../../../src/admin/api/integrations-brevo.ts"],"names":[],"mappings":"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"}
@@ -49,6 +49,8 @@ export interface IntegrationState {
49
49
  logo?: string;
50
50
  /** Full wordmark data URI (configure-modal header). */
51
51
  logoFull?: string;
52
+ /** What the integration does — merchant bullets for the configure modal. */
53
+ details?: string[];
52
54
  /** All required credentials present. */
53
55
  connected: boolean;
54
56
  /** Toggle state — null when the integration has no on/off switch. */
@@ -1 +1 @@
1
- {"version":3,"file":"integrations.d.ts","sourceRoot":"","sources":["../../../src/admin/api/integrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAIvD,OAAO,EAML,KAAK,gBAAgB,EACtB,MAAM,0BAA0B,CAAA;AAMjC,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAA;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACjD,0BAA0B;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAA;IACxC,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,UAAU,GAAG,QAAQ,CAAA;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,wCAAwC;IACxC,SAAS,EAAE,OAAO,CAAA;IAClB,qEAAqE;IACrE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;IACvB,MAAM,EAAE,qBAAqB,EAAE,CAAA;CAChC;AAiLD,wBAAsB,eAAe,IAAI,OAAO,CAAC,YAAY,CAAC,CAU7D;AAMD,wBAAsB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAyJjF"}
1
+ {"version":3,"file":"integrations.d.ts","sourceRoot":"","sources":["../../../src/admin/api/integrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAIvD,OAAO,EAML,KAAK,gBAAgB,EACtB,MAAM,0BAA0B,CAAA;AAMjC,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAA;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACjD,0BAA0B;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAA;IACxC,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,UAAU,GAAG,QAAQ,CAAA;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,wCAAwC;IACxC,SAAS,EAAE,OAAO,CAAA;IAClB,qEAAqE;IACrE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;IACvB,MAAM,EAAE,qBAAqB,EAAE,CAAA;CAChC;AAkLD,wBAAsB,eAAe,IAAI,OAAO,CAAC,YAAY,CAAC,CAU7D;AAMD,wBAAsB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAyJjF"}
@@ -146,6 +146,7 @@ function buildState(def, source, row, analytics, existing) {
146
146
  docsUrl: def.docsUrl,
147
147
  logo: def.logo,
148
148
  logoFull: def.logoFull,
149
+ details: def.details,
149
150
  connected,
150
151
  enabled,
151
152
  fields,