@rovela-ai/sdk 0.24.0 → 0.25.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/index.d.ts +1 -0
- package/dist/admin/api/index.d.ts.map +1 -1
- package/dist/admin/api/index.js +2 -0
- package/dist/admin/api/index.js.map +1 -1
- package/dist/admin/api/payment-providers.d.ts +69 -0
- package/dist/admin/api/payment-providers.d.ts.map +1 -0
- package/dist/admin/api/payment-providers.js +206 -0
- package/dist/admin/api/payment-providers.js.map +1 -0
- 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/OrderDetails.d.ts.map +1 -1
- package/dist/admin/components/OrderDetails.js +11 -2
- package/dist/admin/components/OrderDetails.js.map +1 -1
- package/dist/admin/components/PaymentProviderPanels.d.ts +3 -0
- package/dist/admin/components/PaymentProviderPanels.d.ts.map +1 -0
- package/dist/admin/components/PaymentProviderPanels.js +202 -0
- package/dist/admin/components/PaymentProviderPanels.js.map +1 -0
- package/dist/admin/components/PaymentSettings.d.ts.map +1 -1
- package/dist/admin/components/PaymentSettings.js +2 -1
- package/dist/admin/components/PaymentSettings.js.map +1 -1
- package/dist/admin/components/index.d.ts +1 -0
- package/dist/admin/components/index.d.ts.map +1 -1
- package/dist/admin/components/index.js +1 -0
- package/dist/admin/components/index.js.map +1 -1
- package/dist/admin/integrations/registry.d.ts.map +1 -1
- package/dist/admin/integrations/registry.js +5 -73
- package/dist/admin/integrations/registry.js.map +1 -1
- package/dist/checkout/api/index.d.ts +6 -0
- package/dist/checkout/api/index.d.ts.map +1 -1
- package/dist/checkout/api/index.js +6 -0
- package/dist/checkout/api/index.js.map +1 -1
- package/dist/checkout/api/manual.d.ts.map +1 -1
- package/dist/checkout/api/manual.js +5 -0
- package/dist/checkout/api/manual.js.map +1 -1
- package/dist/checkout/api/payment-methods.d.ts +22 -6
- package/dist/checkout/api/payment-methods.d.ts.map +1 -1
- package/dist/checkout/api/payment-methods.js +46 -6
- package/dist/checkout/api/payment-methods.js.map +1 -1
- package/dist/checkout/api/paypal-capture.d.ts +38 -0
- package/dist/checkout/api/paypal-capture.d.ts.map +1 -0
- package/dist/checkout/api/paypal-capture.js +126 -0
- package/dist/checkout/api/paypal-capture.js.map +1 -0
- package/dist/checkout/api/paypal-webhook.d.ts +24 -0
- package/dist/checkout/api/paypal-webhook.d.ts.map +1 -0
- package/dist/checkout/api/paypal-webhook.js +122 -0
- package/dist/checkout/api/paypal-webhook.js.map +1 -0
- package/dist/checkout/api/paypal.d.ts +30 -0
- package/dist/checkout/api/paypal.d.ts.map +1 -0
- package/dist/checkout/api/paypal.js +70 -0
- package/dist/checkout/api/paypal.js.map +1 -0
- package/dist/checkout/api/up2pay-ipn.d.ts +28 -0
- package/dist/checkout/api/up2pay-ipn.d.ts.map +1 -0
- package/dist/checkout/api/up2pay-ipn.js +88 -0
- package/dist/checkout/api/up2pay-ipn.js.map +1 -0
- package/dist/checkout/api/up2pay.d.ts +34 -0
- package/dist/checkout/api/up2pay.d.ts.map +1 -0
- package/dist/checkout/api/up2pay.js +82 -0
- package/dist/checkout/api/up2pay.js.map +1 -0
- package/dist/checkout/components/CheckoutFlow.d.ts.map +1 -1
- package/dist/checkout/components/CheckoutFlow.js +38 -8
- package/dist/checkout/components/CheckoutFlow.js.map +1 -1
- package/dist/checkout/components/PayPalCheckoutButtons.d.ts +32 -0
- package/dist/checkout/components/PayPalCheckoutButtons.d.ts.map +1 -0
- package/dist/checkout/components/PayPalCheckoutButtons.js +116 -0
- package/dist/checkout/components/PayPalCheckoutButtons.js.map +1 -0
- package/dist/checkout/components/index.d.ts +2 -0
- package/dist/checkout/components/index.d.ts.map +1 -1
- package/dist/checkout/components/index.js +1 -0
- package/dist/checkout/components/index.js.map +1 -1
- package/dist/checkout/hooks/useCheckout.d.ts.map +1 -1
- package/dist/checkout/hooks/useCheckout.js +166 -0
- package/dist/checkout/hooks/useCheckout.js.map +1 -1
- package/dist/checkout/server/confirm-order.d.ts +54 -0
- package/dist/checkout/server/confirm-order.d.ts.map +1 -0
- package/dist/checkout/server/confirm-order.js +147 -0
- package/dist/checkout/server/confirm-order.js.map +1 -0
- package/dist/checkout/server/create-checkout-session.d.ts.map +1 -1
- package/dist/checkout/server/create-checkout-session.js +13 -0
- package/dist/checkout/server/create-checkout-session.js.map +1 -1
- package/dist/checkout/server/external-checkout.d.ts +68 -0
- package/dist/checkout/server/external-checkout.d.ts.map +1 -0
- package/dist/checkout/server/external-checkout.js +184 -0
- package/dist/checkout/server/external-checkout.js.map +1 -0
- package/dist/checkout/server/handle-webhook.js +6 -0
- package/dist/checkout/server/handle-webhook.js.map +1 -1
- package/dist/checkout/server/order-service.js +19 -0
- package/dist/checkout/server/order-service.js.map +1 -1
- package/dist/checkout/server/paypal.d.ts +127 -0
- package/dist/checkout/server/paypal.d.ts.map +1 -0
- package/dist/checkout/server/paypal.js +274 -0
- package/dist/checkout/server/paypal.js.map +1 -0
- package/dist/checkout/server/pricing.d.ts +2 -0
- package/dist/checkout/server/pricing.d.ts.map +1 -1
- package/dist/checkout/server/pricing.js +3 -0
- package/dist/checkout/server/pricing.js.map +1 -1
- package/dist/checkout/server/up2pay.d.ts +152 -0
- package/dist/checkout/server/up2pay.d.ts.map +1 -0
- package/dist/checkout/server/up2pay.js +287 -0
- package/dist/checkout/server/up2pay.js.map +1 -0
- package/dist/checkout/types.d.ts +28 -1
- package/dist/checkout/types.d.ts.map +1 -1
- package/dist/core/db/queries.d.ts +61 -32
- package/dist/core/db/queries.d.ts.map +1 -1
- package/dist/core/db/queries.js +96 -0
- package/dist/core/db/queries.js.map +1 -1
- package/dist/core/db/schema.d.ts +206 -1
- package/dist/core/db/schema.d.ts.map +1 -1
- package/dist/core/db/schema.js +33 -0
- package/dist/core/db/schema.js.map +1 -1
- package/dist/core/i18n/messages/en.d.ts.map +1 -1
- package/dist/core/i18n/messages/en.js +5 -0
- package/dist/core/i18n/messages/en.js.map +1 -1
- package/dist/core/i18n/messages/fr.d.ts.map +1 -1
- package/dist/core/i18n/messages/fr.js +5 -0
- package/dist/core/i18n/messages/fr.js.map +1 -1
- package/dist/core/types.d.ts +3 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/emails/i18n.d.ts.map +1 -1
- package/dist/emails/i18n.js +4 -0
- package/dist/emails/i18n.js.map +1 -1
- package/dist/emails/send/orders.d.ts.map +1 -1
- package/dist/emails/send/orders.js +62 -0
- package/dist/emails/send/orders.js.map +1 -1
- package/dist/emails/sender.d.ts.map +1 -1
- package/dist/emails/sender.js +12 -0
- package/dist/emails/sender.js.map +1 -1
- package/dist/emails/templates/order-confirmation.d.ts.map +1 -1
- package/dist/emails/templates/order-confirmation.js +18 -0
- package/dist/emails/templates/order-confirmation.js.map +1 -1
- package/dist/emails/transport-smtp.d.ts +4 -0
- package/dist/emails/transport-smtp.d.ts.map +1 -1
- package/dist/emails/transport-smtp.js +9 -0
- package/dist/emails/transport-smtp.js.map +1 -1
- package/dist/emails/transport.d.ts +5 -0
- package/dist/emails/transport.d.ts.map +1 -1
- package/dist/emails/transport.js +3 -0
- package/dist/emails/transport.js.map +1 -1
- package/dist/emails/types.d.ts +21 -0
- package/dist/emails/types.d.ts.map +1 -1
- package/docs/changelog/epoch-11-order-extras.md +56 -0
- package/docs/changelog/epoch-12-payment-providers.md +105 -0
- package/package.json +25 -1
- package/templates/store-template/.claude/skills/build-feature/SKILL.md +2 -1
- package/templates/store-template/app/api/admin/payments/paypal/route.ts +10 -0
- package/templates/store-template/app/api/admin/payments/up2pay/route.ts +10 -0
- package/templates/store-template/app/api/checkout/paypal/capture/route.ts +8 -0
- package/templates/store-template/app/api/checkout/paypal/return/route.ts +9 -0
- package/templates/store-template/app/api/checkout/paypal/route.ts +9 -0
- package/templates/store-template/app/api/checkout/paypal/webhook/route.ts +9 -0
- package/templates/store-template/app/api/checkout/up2pay/ipn/route.ts +8 -0
- package/templates/store-template/app/api/checkout/up2pay/route.ts +9 -0
- package/templates/store-template/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/emails/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAA;IACf,6EAA6E;IAC7E,aAAa,EAAE,MAAM,CAAA;IACrB,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,6BAA6B;IAC7B,YAAY,EAAE,MAAM,CAAA;IACpB,4BAA4B;IAC5B,YAAY,EAAE,MAAM,CAAA;IACpB,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qFAAqF;IACrF,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,8BAA8B;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/emails/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,3 +40,59 @@ None — purely additive; no existing data changes meaning.
|
|
|
40
40
|
- Open any order in /admin — no "Additional details" card (empty metafields).
|
|
41
41
|
- After a PrestaShop import with order fields mapped, imported orders show
|
|
42
42
|
the card with the mapped values (e.g. "Recyclable packaging: Yes").
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
# 0.24.1 — email attachments + design-preview confirmations
|
|
47
|
+
|
|
48
|
+
## What changed
|
|
49
|
+
- `sendEmail()` accepts optional `attachments` (`{ filename, contentBase64 }[]`),
|
|
50
|
+
mapped natively on ALL THREE transports (Resend, Brevo HTTP, SMTP/nodemailer).
|
|
51
|
+
Absent = byte-identical behavior to 0.24.0.
|
|
52
|
+
- Order-confirmation emails: items flagged `attachImage` (EmailOrderItem) get
|
|
53
|
+
their `imageUrl` fetched and ATTACHED (cap 4 files / 4MB each, best-effort —
|
|
54
|
+
an attachment failure can never block the confirmation), plus one localized
|
|
55
|
+
note paragraph ("Attached to this email — the preview of your custom
|
|
56
|
+
piece…", EN/FR via the render-boundary localizer).
|
|
57
|
+
- Both confirmation call sites flag `attachImage` automatically for
|
|
58
|
+
NON-UUID variant refs with an image — the SDK's own configurator-line
|
|
59
|
+
discriminator (see order-service `isUuid`). Stock lines never attach.
|
|
60
|
+
- Stripe path: `extractItemsFromLineItems` now reads the line's expanded
|
|
61
|
+
product `images[0]` back into `item.image` — the session builder has always
|
|
62
|
+
SET it (`product_data.images`); the webhook simply dropped it. This also
|
|
63
|
+
means STOCK product thumbnails now render in card-payment confirmations
|
|
64
|
+
(they already did on the manual path via the quote's image passthrough).
|
|
65
|
+
|
|
66
|
+
## Template contract
|
|
67
|
+
No new mounts, no new routes, no new dependencies. Plain pin bump.
|
|
68
|
+
|
|
69
|
+
## Behavior contracts
|
|
70
|
+
- Stores with no configurator lines: only visible change is item thumbnails
|
|
71
|
+
appearing in Stripe-path confirmation emails (parity with the manual path).
|
|
72
|
+
- `attachments` on SendEmailOptions is additive; custom store code sending
|
|
73
|
+
emails is unaffected.
|
|
74
|
+
|
|
75
|
+
## Custom-code hazards (audit greps for CC)
|
|
76
|
+
- Custom code that forked `extractItemsFromLineItems` behavior won't gain the
|
|
77
|
+
image readback — grep for `rovela_item` in store-owned webhook code.
|
|
78
|
+
|
|
79
|
+
## MERCHANT-DATA HAZARD
|
|
80
|
+
None — additive.
|
|
81
|
+
|
|
82
|
+
## Security
|
|
83
|
+
- Confirmation attachments only fetch URLs on the store's own
|
|
84
|
+
`R2_PUBLIC_URL` base — item image URLs are client-suppliable checkout
|
|
85
|
+
data and must never drive arbitrary server-side fetches.
|
|
86
|
+
|
|
87
|
+
## Verify
|
|
88
|
+
- Place a card-paid order with a stock product: the confirmation email shows
|
|
89
|
+
the product thumbnail (previously text-only on the Stripe path).
|
|
90
|
+
- A configurator line (non-UUID variant ref + image): confirmation carries
|
|
91
|
+
the preview attachment + the note paragraph.
|
|
92
|
+
- A manual/COD order with a configurator line attaches the DESIGN preview,
|
|
93
|
+
not the stock product photo (the useCheckout manual body now carries
|
|
94
|
+
item.image — parity with the Stripe path).
|
|
95
|
+
- Multi-view designs attach EVERY view: `CartItem.previewImages` →
|
|
96
|
+
checkout passthrough (`previewUrls` line metadata on Stripe, ≤480-char
|
|
97
|
+
guard keeps the first URL when over) → `EmailOrderItem.attachImageUrls`.
|
|
98
|
+
Attachment caps: 8 files / 4MB each / 10MB total.
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# E12 Payment providers — 0.25.0..0.25.0
|
|
2
|
+
|
|
3
|
+
## What landed
|
|
4
|
+
Two native payment providers, peers of Stripe: **PayPal** (Orders v2, Smart
|
|
5
|
+
Buttons popup with a redirect fallback, server-side capture, webhook
|
|
6
|
+
backstop) and **Up2pay e-Transactions** (Crédit Agricole's hosted payment
|
|
7
|
+
page — HMAC-signed form redirect, RSA-verified IPN as the only payment
|
|
8
|
+
truth). Merchants configure both in **Admin → Payments** (Colissimo-style
|
|
9
|
+
panels: masked credentials, validate-before-persist, disconnect). Once
|
|
10
|
+
connected they appear automatically in the checkout payment selector; no
|
|
11
|
+
store code changes, no cards, no per-store payment logic.
|
|
12
|
+
|
|
13
|
+
## SDK-internal (free via pin bump)
|
|
14
|
+
- `checkout/server/{up2pay,paypal,confirm-order,external-checkout}.ts` — all
|
|
15
|
+
money logic. External orders create as `pending` (priced by `buildQuote`,
|
|
16
|
+
reference `up2pay_…`/`paypal_…` in the shared payment-intent column) and
|
|
17
|
+
flip to paid through ONE atomic claim (`claimPendingOrderPaid`) after
|
|
18
|
+
signature + amount verification against the DB order. Confirmation email
|
|
19
|
+
sends on PAID (from DB state), not at creation.
|
|
20
|
+
- `checkout/api/payment-methods.ts` — the public GET now appends synthetic
|
|
21
|
+
`kind='external'` entries (id `paypal`/`up2pay`) when a provider is
|
|
22
|
+
configured + enabled. Fail-open contract unchanged.
|
|
23
|
+
- `admin/components/{PaymentProviderPanels,PaymentSettings}.tsx` +
|
|
24
|
+
`admin/api/payment-providers.ts` — the Payments-tab panels.
|
|
25
|
+
- `admin/components/OrderDetails.tsx` — provider-aware: PayPal/Up2pay orders
|
|
26
|
+
show a provider Payment card + status-only "Mark as refunded" (never the
|
|
27
|
+
Stripe refund flow); pending external orders read as awaiting provider
|
|
28
|
+
confirmation. Transaction ids land in the order's "Additional details"
|
|
29
|
+
(metafields).
|
|
30
|
+
- `admin/integrations/registry.ts` — the `paypal` entry is REMOVED: payment
|
|
31
|
+
providers are not integrations; the hub keeps cross-domain services
|
|
32
|
+
(Brevo, pixels…). Credentials stored via the old entry keep working — the
|
|
33
|
+
columns are unchanged and now surface in Admin → Payments.
|
|
34
|
+
|
|
35
|
+
## Template contract
|
|
36
|
+
Eight new route mounts (plain re-exports — copy from the stock template):
|
|
37
|
+
- `app/api/checkout/up2pay/route.ts` (`POST` from
|
|
38
|
+
`@rovela-ai/sdk/checkout/api/up2pay`)
|
|
39
|
+
- `app/api/checkout/up2pay/ipn/route.ts` (`GET, POST` from
|
|
40
|
+
`@rovela-ai/sdk/checkout/api/up2pay-ipn`)
|
|
41
|
+
- `app/api/checkout/paypal/route.ts` (`POST` from
|
|
42
|
+
`@rovela-ai/sdk/checkout/api/paypal`)
|
|
43
|
+
- `app/api/checkout/paypal/capture/route.ts` (`POST` from
|
|
44
|
+
`@rovela-ai/sdk/checkout/api/paypal-capture`)
|
|
45
|
+
- `app/api/checkout/paypal/return/route.ts` (`ReturnGET as GET` from
|
|
46
|
+
`@rovela-ai/sdk/checkout/api/paypal-capture`)
|
|
47
|
+
- `app/api/checkout/paypal/webhook/route.ts` (`POST` from
|
|
48
|
+
`@rovela-ai/sdk/checkout/api/paypal-webhook`)
|
|
49
|
+
- `app/api/admin/payments/paypal/route.ts` +
|
|
50
|
+
`app/api/admin/payments/up2pay/route.ts` (GET/POST/DELETE trios from
|
|
51
|
+
`@rovela-ai/sdk/admin/api`)
|
|
52
|
+
|
|
53
|
+
## Behavior contracts
|
|
54
|
+
- `CheckoutFlow` renders external providers in the existing payment
|
|
55
|
+
selector; selecting PayPal swaps the Place-order button for the Smart
|
|
56
|
+
Buttons (script from paypal.com parameterized by the PUBLIC client id).
|
|
57
|
+
Stores with a custom checkout page that still mounts the SDK
|
|
58
|
+
`CheckoutFlow` get everything free; fully custom checkouts must call the
|
|
59
|
+
new hook legs (`checkoutUp2pay` / `createPaypalOrder` /
|
|
60
|
+
`capturePaypalOrder` on `useCheckout`) to offer the providers.
|
|
61
|
+
- The admin settings GET no longer returns `paypal_client_secret` /
|
|
62
|
+
`up2pay_hmac_key` (server-only strip, like `colissimo_password`).
|
|
63
|
+
|
|
64
|
+
## Custom-code hazards
|
|
65
|
+
- **A store built by the RETIRED `connect-paypal` feature card** carries a
|
|
66
|
+
per-store PayPal fork. Grep: `ls app/api/checkout/paypal/` — if
|
|
67
|
+
`create-order/` exists or `route.ts` files contain implementation (not
|
|
68
|
+
bare re-exports), DELETE the fork: replace `app/api/checkout/paypal/*`
|
|
69
|
+
with the stock re-export mounts above, delete
|
|
70
|
+
`components/checkout/PayPal*`, remove the PayPal provider mount from
|
|
71
|
+
`app/layout.tsx` and the button from `app/checkout/page.tsx`, and
|
|
72
|
+
`npm uninstall @paypal/react-paypal-js @paypal/paypal-server-sdk`.
|
|
73
|
+
Credentials in `store_settings.paypal_*` are UNTOUCHED and keep working
|
|
74
|
+
(`paypal_environment` value `'production'` is accepted alongside
|
|
75
|
+
`'live'`).
|
|
76
|
+
- Grep `fetch('/api/checkout/payment-methods')` consumers in custom code:
|
|
77
|
+
the response may now include `kind='external'` entries — code that
|
|
78
|
+
assumed every method is manual must not POST them to
|
|
79
|
+
`/api/checkout/manual` (it rejects `kind !== 'manual'` anyway).
|
|
80
|
+
|
|
81
|
+
## DB
|
|
82
|
+
`store_settings` gains 11 columns (`paypal_client_id/client_secret/
|
|
83
|
+
environment/webhook_id/enabled`, `up2pay_site/rang/identifiant/hmac_key/
|
|
84
|
+
environment/enabled`) — self-healed by `ensureStoreSettingsSchema` at the
|
|
85
|
+
settings chokepoints; parent-branch ALTER run at ship time. Card-installed
|
|
86
|
+
stores already carrying `paypal_*` columns converge idempotently
|
|
87
|
+
(`ADD COLUMN IF NOT EXISTS`). No new tables.
|
|
88
|
+
|
|
89
|
+
## New surfaces
|
|
90
|
+
- Admin → Payments: PayPal + Up2pay panels between the Stripe card and the
|
|
91
|
+
manual payment-methods list (part of the SDK `PaymentSettings` component
|
|
92
|
+
— stores mounting it get them free; stores with a custom payments page
|
|
93
|
+
add `<PaypalProviderPanel />` + `<Up2payProviderPanel />` from
|
|
94
|
+
`@rovela-ai/sdk/admin`).
|
|
95
|
+
|
|
96
|
+
## Verify
|
|
97
|
+
- `npm run build` green after the pin bump.
|
|
98
|
+
- `GET /api/checkout/payment-methods` returns 200 (fail-open even
|
|
99
|
+
unconfigured).
|
|
100
|
+
- Admin → Payments renders the two provider panels.
|
|
101
|
+
- If the store had the card-built PayPal fork: `app/api/checkout/paypal/`
|
|
102
|
+
contains ONLY re-export mounts, `@paypal/*` packages are gone from
|
|
103
|
+
package.json, and the checkout page has no leftover PayPal component
|
|
104
|
+
imports.
|
|
105
|
+
- An order list/detail read works (settings + orders self-heals ran).
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rovela-ai/sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.25.0",
|
|
4
4
|
"description": "Rovela SDK - Pre-built e-commerce components for AI-powered store generation",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -94,6 +94,30 @@
|
|
|
94
94
|
"types": "./dist/checkout/api/colissimo-relays.d.ts",
|
|
95
95
|
"import": "./dist/checkout/api/colissimo-relays.js"
|
|
96
96
|
},
|
|
97
|
+
"./checkout/api/up2pay": {
|
|
98
|
+
"types": "./dist/checkout/api/up2pay.d.ts",
|
|
99
|
+
"import": "./dist/checkout/api/up2pay.js"
|
|
100
|
+
},
|
|
101
|
+
"./checkout/api/up2pay-ipn": {
|
|
102
|
+
"types": "./dist/checkout/api/up2pay-ipn.d.ts",
|
|
103
|
+
"import": "./dist/checkout/api/up2pay-ipn.js"
|
|
104
|
+
},
|
|
105
|
+
"./checkout/api/paypal": {
|
|
106
|
+
"types": "./dist/checkout/api/paypal.d.ts",
|
|
107
|
+
"import": "./dist/checkout/api/paypal.js"
|
|
108
|
+
},
|
|
109
|
+
"./checkout/api/paypal-capture": {
|
|
110
|
+
"types": "./dist/checkout/api/paypal-capture.d.ts",
|
|
111
|
+
"import": "./dist/checkout/api/paypal-capture.js"
|
|
112
|
+
},
|
|
113
|
+
"./checkout/api/paypal-webhook": {
|
|
114
|
+
"types": "./dist/checkout/api/paypal-webhook.d.ts",
|
|
115
|
+
"import": "./dist/checkout/api/paypal-webhook.js"
|
|
116
|
+
},
|
|
117
|
+
"./admin/api/payment-providers": {
|
|
118
|
+
"types": "./dist/admin/api/payment-providers.d.ts",
|
|
119
|
+
"import": "./dist/admin/api/payment-providers.js"
|
|
120
|
+
},
|
|
97
121
|
"./checkout/server": {
|
|
98
122
|
"types": "./dist/checkout/server/index.d.ts",
|
|
99
123
|
"import": "./dist/checkout/server/index.js"
|
|
@@ -197,7 +197,8 @@ If the feature connects to an external service (API key, secret, tracking ID):
|
|
|
197
197
|
|
|
198
198
|
- Persist credentials to `store_settings` — dedicated columns for secrets (`ALTER TABLE store_settings ADD COLUMN IF NOT EXISTS …`, read server-side at request time; NEVER `.env.local`, NEVER `NEXT_PUBLIC_`), or the `analytics` JSONB for public tracking IDs.
|
|
199
199
|
- The merchant manages them at `/admin/integrations` (SDK page, already mounted). **Do NOT build a settings page, credentials form, or nav entry for keys.**
|
|
200
|
-
- Known keys are auto-rendered (brevo,
|
|
200
|
+
- Known keys are auto-rendered (brevo, turnstile, ga4, google_ads, meta, tiktok, klaviyo, intercom, trustpilot). A NOVEL integration registers a descriptor (dedup by key, then append):
|
|
201
|
+
- **Payment providers are NOT integrations**: PayPal and Up2pay e-Transactions (Crédit Agricole) are NATIVE SDK payment providers (SDK 0.25+) configured at `/admin/payments`, peers of Stripe — checkout picks them up automatically once connected. NEVER build payment-provider routes, checkout components, or credential forms for them; point the merchant to Admin → Payments.
|
|
201
202
|
|
|
202
203
|
```sql
|
|
203
204
|
ALTER TABLE store_settings ADD COLUMN IF NOT EXISTS custom_integrations jsonb NOT NULL DEFAULT '[]'::jsonb;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PayPal provider configuration (Admin → Payments)
|
|
3
|
+
*/
|
|
4
|
+
import {
|
|
5
|
+
getPaypalProviderConfig,
|
|
6
|
+
savePaypalProviderConfig,
|
|
7
|
+
deletePaypalProviderConfig,
|
|
8
|
+
} from '@rovela-ai/sdk/admin/api'
|
|
9
|
+
|
|
10
|
+
export { getPaypalProviderConfig as GET, savePaypalProviderConfig as POST, deletePaypalProviderConfig as DELETE }
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Up2pay e-Transactions provider configuration (Admin → Payments)
|
|
3
|
+
*/
|
|
4
|
+
import {
|
|
5
|
+
getUp2payProviderConfig,
|
|
6
|
+
saveUp2payProviderConfig,
|
|
7
|
+
deleteUp2payProviderConfig,
|
|
8
|
+
} from '@rovela-ai/sdk/admin/api'
|
|
9
|
+
|
|
10
|
+
export { getUp2payProviderConfig as GET, saveUp2payProviderConfig as POST, deleteUp2payProviderConfig as DELETE }
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PayPal Return Route (redirect fallback)
|
|
3
|
+
*
|
|
4
|
+
* GET /api/checkout/paypal/return - Captures server-side when the buyer
|
|
5
|
+
* comes back from the hosted approval page, then redirects to the
|
|
6
|
+
* success page (or back to checkout with the cart intact).
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export { ReturnGET as GET } from '@rovela-ai/sdk/checkout/api/paypal-capture'
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PayPal Checkout API Route
|
|
3
|
+
*
|
|
4
|
+
* POST /api/checkout/paypal - Start a PayPal payment. The order is created
|
|
5
|
+
* as 'pending' (server-priced) with a matching PayPal order; capture
|
|
6
|
+
* happens server-side after approval.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export { POST } from '@rovela-ai/sdk/checkout/api/paypal'
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PayPal Webhook Route
|
|
3
|
+
*
|
|
4
|
+
* POST /api/checkout/paypal/webhook - Async backstop: verified events
|
|
5
|
+
* confirm captures the client never reported and record PayPal-side
|
|
6
|
+
* refunds. Requires the webhook id configured in Admin → Payments.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export { POST } from '@rovela-ai/sdk/checkout/api/paypal-webhook'
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Up2pay e-Transactions IPN Route
|
|
3
|
+
*
|
|
4
|
+
* The server-to-server payment notification — the ONLY thing that flips an
|
|
5
|
+
* Up2pay order to paid (signature + amount verified against the order).
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export { GET, POST } from '@rovela-ai/sdk/checkout/api/up2pay-ipn'
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Up2pay e-Transactions Checkout API Route
|
|
3
|
+
*
|
|
4
|
+
* POST /api/checkout/up2pay - Start an Up2pay (Crédit Agricole) hosted-page
|
|
5
|
+
* payment. The order is created as 'pending' (server-priced); the IPN
|
|
6
|
+
* confirms payment server-to-server.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export { POST } from '@rovela-ai/sdk/checkout/api/up2pay'
|