@rovela-ai/sdk 0.22.0 → 0.24.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.
- package/dist/admin/api/email-sending.d.ts +24 -0
- package/dist/admin/api/email-sending.d.ts.map +1 -0
- package/dist/admin/api/email-sending.js +155 -0
- package/dist/admin/api/email-sending.js.map +1 -0
- package/dist/admin/api/index.d.ts +2 -0
- package/dist/admin/api/index.d.ts.map +1 -1
- package/dist/admin/api/index.js +4 -0
- package/dist/admin/api/index.js.map +1 -1
- package/dist/admin/api/integrations-brevo.d.ts +24 -0
- package/dist/admin/api/integrations-brevo.d.ts.map +1 -0
- package/dist/admin/api/integrations-brevo.js +286 -0
- package/dist/admin/api/integrations-brevo.js.map +1 -0
- package/dist/admin/api/integrations.d.ts +2 -0
- package/dist/admin/api/integrations.d.ts.map +1 -1
- package/dist/admin/api/integrations.js +1 -0
- package/dist/admin/api/integrations.js.map +1 -1
- package/dist/admin/api/settings.d.ts.map +1 -1
- package/dist/admin/api/settings.js +4 -1
- package/dist/admin/api/settings.js.map +1 -1
- package/dist/admin/components/EmailsManager.d.ts.map +1 -1
- package/dist/admin/components/EmailsManager.js +2 -1
- package/dist/admin/components/EmailsManager.js.map +1 -1
- package/dist/admin/components/IntegrationsManager.d.ts.map +1 -1
- package/dist/admin/components/IntegrationsManager.js +98 -2
- package/dist/admin/components/IntegrationsManager.js.map +1 -1
- package/dist/admin/components/OrderDetails.d.ts.map +1 -1
- package/dist/admin/components/OrderDetails.js +1 -1
- package/dist/admin/components/OrderDetails.js.map +1 -1
- package/dist/admin/components/ProductForm.d.ts.map +1 -1
- package/dist/admin/components/ProductForm.js +12 -1
- package/dist/admin/components/ProductForm.js.map +1 -1
- package/dist/admin/components/TaxSettings.js +3 -3
- package/dist/admin/components/TaxSettings.js.map +1 -1
- package/dist/admin/components/emails/EmailSendingPanel.d.ts +2 -0
- package/dist/admin/components/emails/EmailSendingPanel.d.ts.map +1 -0
- package/dist/admin/components/emails/EmailSendingPanel.js +131 -0
- package/dist/admin/components/emails/EmailSendingPanel.js.map +1 -0
- package/dist/admin/integrations/registry.d.ts +2 -0
- package/dist/admin/integrations/registry.d.ts.map +1 -1
- package/dist/admin/integrations/registry.js +41 -0
- package/dist/admin/integrations/registry.js.map +1 -1
- package/dist/admin/types.d.ts +10 -0
- package/dist/admin/types.d.ts.map +1 -1
- package/dist/core/db/queries.d.ts +82 -29
- package/dist/core/db/queries.d.ts.map +1 -1
- package/dist/core/db/queries.js +44 -0
- package/dist/core/db/queries.js.map +1 -1
- package/dist/core/db/schema.d.ts +176 -1
- package/dist/core/db/schema.d.ts.map +1 -1
- package/dist/core/db/schema.js +29 -0
- package/dist/core/db/schema.js.map +1 -1
- package/dist/emails/index.d.ts +2 -0
- package/dist/emails/index.d.ts.map +1 -1
- package/dist/emails/index.js +1 -0
- package/dist/emails/index.js.map +1 -1
- package/dist/emails/sender.d.ts.map +1 -1
- package/dist/emails/sender.js +30 -5
- package/dist/emails/sender.js.map +1 -1
- package/dist/emails/transport-smtp.d.ts +58 -0
- package/dist/emails/transport-smtp.d.ts.map +1 -0
- package/dist/emails/transport-smtp.js +97 -0
- package/dist/emails/transport-smtp.js.map +1 -0
- package/dist/emails/transport.d.ts +77 -0
- package/dist/emails/transport.d.ts.map +1 -0
- package/dist/emails/transport.js +154 -0
- package/dist/emails/transport.js.map +1 -0
- package/docs/changelog/epoch-10-email-transport.md +97 -0
- package/docs/changelog/epoch-11-order-extras.md +42 -0
- package/package.json +2 -1
- package/templates/store-template/app/api/admin/emails/sending/route.ts +9 -0
- package/templates/store-template/app/api/admin/integrations/brevo/backfill/route.ts +9 -0
- package/templates/store-template/app/api/admin/integrations/brevo/route.ts +9 -0
- package/templates/store-template/next.config.js +4 -1
- 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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"}
|
package/dist/admin/api/index.js
CHANGED
|
@@ -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":"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,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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/admin/api/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;
|
|
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"}
|