includio-cms 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.
Files changed (90) hide show
  1. package/API.md +29 -6
  2. package/CHANGELOG.md +95 -0
  3. package/DOCS.md +80 -5
  4. package/ROADMAP.md +1 -0
  5. package/dist/admin/client/index.d.ts +3 -0
  6. package/dist/admin/client/index.js +3 -0
  7. package/dist/admin/client/shop/coupon-edit-page.svelte +44 -0
  8. package/dist/admin/client/shop/coupon-edit-page.svelte.d.ts +3 -0
  9. package/dist/admin/client/shop/coupon-form.svelte +170 -0
  10. package/dist/admin/client/shop/coupon-form.svelte.d.ts +18 -0
  11. package/dist/admin/client/shop/coupon-new-page.svelte +25 -0
  12. package/dist/admin/client/shop/coupon-new-page.svelte.d.ts +18 -0
  13. package/dist/admin/client/shop/coupons-list-page.svelte +135 -0
  14. package/dist/admin/client/shop/coupons-list-page.svelte.d.ts +3 -0
  15. package/dist/admin/client/shop/refund-dialog.svelte +161 -0
  16. package/dist/admin/client/shop/refund-dialog.svelte.d.ts +11 -0
  17. package/dist/admin/client/shop/shipping-method-edit-page.svelte +3 -6
  18. package/dist/admin/client/shop/shipping-method-form.svelte +15 -21
  19. package/dist/admin/client/shop/shipping-method-new-page.svelte +3 -6
  20. package/dist/admin/client/shop/shipping-methods-list-page.svelte +6 -6
  21. package/dist/admin/client/shop/shop-order-detail-page.svelte +107 -27
  22. package/dist/admin/client/shop/shop-orders-list-page.svelte +49 -11
  23. package/dist/admin/client/shop/shop-products-list-page.svelte +12 -11
  24. package/dist/admin/components/layout/lang.d.ts +1 -0
  25. package/dist/admin/components/layout/lang.js +4 -2
  26. package/dist/admin/components/layout/layout-renderer.svelte +12 -11
  27. package/dist/admin/components/layout/nav-breadcrumbs.svelte +3 -5
  28. package/dist/admin/components/layout/nav-shop.svelte +3 -1
  29. package/dist/admin/components/layout/nav-user.svelte +6 -4
  30. package/dist/admin/components/layout/site-header.svelte +11 -5
  31. package/dist/admin/remote/shop.remote.d.ts +122 -3
  32. package/dist/admin/remote/shop.remote.js +161 -5
  33. package/dist/db-postgres/schema/shop/couponRedemptions.d.ts +97 -0
  34. package/dist/db-postgres/schema/shop/couponRedemptions.js +21 -0
  35. package/dist/db-postgres/schema/shop/coupons.d.ts +197 -0
  36. package/dist/db-postgres/schema/shop/coupons.js +18 -0
  37. package/dist/db-postgres/schema/shop/index.d.ts +4 -0
  38. package/dist/db-postgres/schema/shop/index.js +4 -0
  39. package/dist/db-postgres/schema/shop/product.d.ts +17 -0
  40. package/dist/db-postgres/schema/shop/product.js +2 -0
  41. package/dist/db-postgres/schema/shop/refunds.d.ts +214 -0
  42. package/dist/db-postgres/schema/shop/refunds.js +21 -0
  43. package/dist/db-postgres/schema/shop/webhookEvents.d.ts +183 -0
  44. package/dist/db-postgres/schema/shop/webhookEvents.js +22 -0
  45. package/dist/shop/adapters/payu/client.d.ts +9 -0
  46. package/dist/shop/adapters/payu/client.js +29 -0
  47. package/dist/shop/adapters/payu/index.js +17 -1
  48. package/dist/shop/adapters/stripe/index.d.ts +64 -0
  49. package/dist/shop/adapters/stripe/index.js +169 -0
  50. package/dist/shop/adapters/stripe/payload.d.ts +38 -0
  51. package/dist/shop/adapters/stripe/payload.js +90 -0
  52. package/dist/shop/adapters/stripe/status-map.d.ts +11 -0
  53. package/dist/shop/adapters/stripe/status-map.js +31 -0
  54. package/dist/shop/cart/coupon-cookie.d.ts +7 -0
  55. package/dist/shop/cart/coupon-cookie.js +32 -0
  56. package/dist/shop/cart/types.d.ts +12 -0
  57. package/dist/shop/client/index.d.ts +118 -0
  58. package/dist/shop/client/index.js +39 -1
  59. package/dist/shop/http/cart-handler.d.ts +8 -0
  60. package/dist/shop/http/cart-handler.js +60 -1
  61. package/dist/shop/http/checkout-handler.js +7 -3
  62. package/dist/shop/http/index.d.ts +1 -1
  63. package/dist/shop/http/index.js +1 -1
  64. package/dist/shop/http/retry-payment-handler.js +1 -1
  65. package/dist/shop/http/webhook-handler.js +19 -1
  66. package/dist/shop/http/webhook-idempotency.d.ts +16 -0
  67. package/dist/shop/http/webhook-idempotency.js +51 -0
  68. package/dist/shop/http/webhook-logic.js +2 -1
  69. package/dist/shop/index.d.ts +3 -1
  70. package/dist/shop/index.js +3 -1
  71. package/dist/shop/pricing.d.ts +15 -0
  72. package/dist/shop/pricing.js +22 -0
  73. package/dist/shop/server/cart-hydrate.d.ts +1 -0
  74. package/dist/shop/server/cart-hydrate.js +58 -10
  75. package/dist/shop/server/coupons.d.ts +53 -0
  76. package/dist/shop/server/coupons.js +117 -0
  77. package/dist/shop/server/email.d.ts +15 -0
  78. package/dist/shop/server/email.js +46 -3
  79. package/dist/shop/server/orders.d.ts +1 -0
  80. package/dist/shop/server/orders.js +120 -54
  81. package/dist/shop/server/refund.d.ts +32 -0
  82. package/dist/shop/server/refund.js +140 -0
  83. package/dist/shop/svelte/InpostPicker.svelte +4 -7
  84. package/dist/shop/svelte/OrderStatus.svelte +6 -10
  85. package/dist/shop/svelte/labels.js +4 -2
  86. package/dist/shop/types.d.ts +41 -1
  87. package/dist/updates/0.25.0/index.d.ts +2 -0
  88. package/dist/updates/0.25.0/index.js +89 -0
  89. package/dist/updates/index.js +64 -1
  90. package/package.json +6 -1
@@ -1,6 +1,6 @@
1
1
  import type { Language } from '../types/languages.js';
2
2
  export type Currency = 'PLN';
3
- export type OrderStatus = 'new' | 'awaitingPayment' | 'paid' | 'preparing' | 'sent' | 'done' | 'cancelled' | 'paymentRejected';
3
+ export type OrderStatus = 'new' | 'awaitingPayment' | 'paid' | 'preparing' | 'sent' | 'done' | 'cancelled' | 'paymentRejected' | 'refunded';
4
4
  export type I18nText = {
5
5
  [lang: string]: string;
6
6
  };
@@ -8,6 +8,7 @@ export interface ShopFeatures {
8
8
  variants?: boolean;
9
9
  stock?: boolean;
10
10
  accounts?: boolean;
11
+ coupons?: boolean;
11
12
  }
12
13
  export interface RateLimitRule {
13
14
  limit: number;
@@ -37,6 +38,27 @@ export interface PaymentAdapter {
37
38
  * returned as `PaymentCreateResult.providerRef`.
38
39
  */
39
40
  getStatus?(providerRef: string): Promise<PaymentEvent>;
41
+ /**
42
+ * Refund a captured payment. Optional — adapters that omit this method are
43
+ * treated as "refund not supported" by `refundOrder()`. `amount` is the
44
+ * gross amount in minor currency units (e.g. grosze for PLN); when omitted
45
+ * the adapter MUST refund the full remaining captured amount.
46
+ *
47
+ * Throws on provider error. The server records pending refund row before
48
+ * calling, transitions to `succeeded` on resolve or `failed` on reject.
49
+ */
50
+ refund?(input: PaymentRefundInput): Promise<PaymentRefundResult>;
51
+ }
52
+ export interface PaymentRefundInput {
53
+ providerRef: string;
54
+ amount?: number;
55
+ currency: Currency;
56
+ reason?: string;
57
+ }
58
+ export interface PaymentRefundResult {
59
+ providerRef: string;
60
+ amount: number;
61
+ raw?: unknown;
40
62
  }
41
63
  export interface CarrierAdapter {
42
64
  id: string;
@@ -111,6 +133,19 @@ export interface PaymentEvent {
111
133
  status: 'paid' | 'paymentRejected' | 'pending';
112
134
  providerRef: string;
113
135
  raw: unknown;
136
+ /**
137
+ * Provider-assigned event id used for webhook idempotency. Stripe `event.id`,
138
+ * PayU `notify_id` (header), InPost message id. When omitted, the handler
139
+ * falls back to terminal-status idempotency only (replay-safety best-effort).
140
+ */
141
+ eventId?: string;
142
+ eventType?: string;
143
+ }
144
+ export interface CouponRef {
145
+ code: string;
146
+ type: 'percent' | 'fixed';
147
+ value: number;
148
+ discountAmount: number;
114
149
  }
115
150
  export interface ShopConfig {
116
151
  currency: Currency;
@@ -128,6 +163,11 @@ export interface ShopConfig {
128
163
  * Default when omitted: `/shop/order/{orderNumber}?token={accessToken}`.
129
164
  */
130
165
  orderViewUrl?: string;
166
+ /**
167
+ * Admin notification email address. Used by low-stock alerts and other
168
+ * automatic admin notifications. Omitted = those alerts are no-ops.
169
+ */
170
+ adminEmail?: string;
131
171
  }
132
172
  export interface ResolvedShopConfig extends ShopConfig {
133
173
  features: Required<ShopFeatures>;
@@ -0,0 +1,2 @@
1
+ import type { CmsUpdate } from '../index.js';
2
+ export declare const update: CmsUpdate;
@@ -0,0 +1,89 @@
1
+ export const update = {
2
+ version: '0.25.0',
3
+ date: '2026-05-06',
4
+ description: 'Faza 11.5 — Shop polish. Stripe payment adapter (Checkout Session flow z native webhook signature verify), refund infrastructure (full + partial, cross-adapter Stripe + PayU), webhook idempotency table (`shop_webhook_events` z UNIQUE(provider, event_id)), coupons (% / fixed PLN, expiresAt, maxUses, minOrderAmount, OCC race-safe redemption), low-stock email alert (per-product `lowStockThreshold`), order export CSV w admin, default email templates rozszerzone o `refunded` status, SDK `applyCoupon`/`removeCoupon` + JSDoc body + `@public` tagi, pełna dokumentacja shopa (DOCS.md + adapter guides + cURL examples + Stripe/Coupons/Refund pages). Shop = `@public` w v1.0.',
5
+ features: [
6
+ '`stripeAdapter()` — Stripe Checkout Session flow. `createPayment()` → `stripe.checkout.sessions.create` (zwraca redirect URL); `handleWebhook()` → natywny `stripe.webhooks.constructEvent` (sig + timestamp skew); `getStatus()` → `checkout.sessions.retrieve` poll fallback dla lost webhooks; `refund()` → resolve session → payment_intent → `stripe.refunds.create({ amount? })`. Stripe SDK = optional peer (lazy import + caching). Status mapping: `complete + paid → paid`, `expired → paymentRejected`. Eksport: `stripeAdapter`, `StripeAdapterOptions`.',
7
+ '**Refund infrastructure** (cross-adapter, full + partial). `PaymentAdapter.refund?(input)` opcjonalna metoda interfejsu (`PaymentRefundInput` / `PaymentRefundResult`). Server: `refundOrder({ orderId, amount?, reason?, createdBy })` w `src/lib/shop/server/refund.ts` — walidacja eligibility (status `paid|preparing|sent|done`, `paymentProviderRef`, adapter wsparcie, `amount <= remaining`), insert pending row, call adapter, update do `succeeded`/`failed`, full refund → `updateOrderStatus(refunded)`. PayU `client.refundOrder()` + `payuAdapter().refund()`. Stripe refund built-in. DB: nowa tabela `shop_refunds` (orderId FK, paymentId FK?, provider, providerRef, amount cents, currency, reason, status, createdBy, createdAt). `getRefundedAmount()` + `listRefunds()` helpers.',
8
+ '**Webhook idempotency table** (`shop_webhook_events`). UNIQUE(provider, event_id) — duplikaty short-circuit z 200 + `replay: true` przed mutacją state. PayU `notify_id` (lub fallback `${orderId}:${status}`), Stripe natywny `event.id`. `reserveWebhookEvent()` + `markWebhookEventProcessed()` w `src/lib/shop/http/webhook-idempotency.ts`. Stara terminal-status check zachowana jako fallback dla adapterów bez `eventId`.',
9
+ '**Coupons** — code-based discounts. DB: `shop_coupons` (code UNIQUE uppercase, type `percent|fixed`, value numeric 20,6, minOrderAmount cents, maxUses, usedCount, expiresAt, isActive) + `shop_coupon_redemptions` (couponId FK, orderId FK UNIQUE, discountAmount, redeemedAt). Server: `validateCoupon()` (feature flag + lookup + isActive + expiresAt + maxUses + minOrderAmount), `reserveCouponSlot()` z OCC `WHERE max_uses IS NULL OR used_count < max_uses`, `recordCouponRedemption()` `onConflictDoNothing(orderId)`, `releaseCouponSlot()`. Pricing: discount przed VAT, uniform per-line factor (`calculateCouponDiscountNet()` + line-level factor w `cart-hydrate`). REST: `POST/DELETE /api/shop/cart/coupon` (`createCartCouponHandler()`), separate cookie `aria_shop_coupon` (7d TTL, `[A-Z0-9_-]{1,64}`). SDK: `cart.applyCoupon(code)` / `cart.removeCoupon()`. Admin UI: lista kodów + new/edit form, walidacja kodu (uppercase, alfanumeryczny). Feature flag: `defineShop({ features: { coupons: true } })`.',
10
+ '**Low-stock email alert.** Per-produkt `lowStockThreshold: int?` w `shop_products`. Hook po `updateOrderStatus(paid)` decrement: jeśli `stock <= threshold` AND `stock + qty > threshold` (boundary cross), `sendLowStockEmail()` (PL) → `shop.adminEmail`. Brak `adminEmail` lub brak email adaptera = no-op.',
11
+ '**Order export CSV** (admin). `exportOrdersCsv(filters)` query w `shop.remote.ts` — RFC 4180 escape (commas, quotes, newlines), BOM dla Excel UTF-8. Button "Eksport CSV" na orders list page (honors current `status` + `email` filters). Kolumny: number, status, customerEmail, customerName, totalGross, currency, shippingGross, paymentMethod, createdAt.',
12
+ '**Default email templates** — `OrderStatus` += `refunded` (terminal w webhook-logic, propagacja: `STATUS_SUBJECTS`/`STATUS_INTRO` PL/EN, customer-facing labels, admin Zod schema, admin detail page styles). Plus low-stock template dla admina.',
13
+ '**SDK polish** — `createShopClient()` + `ShopClient` + `ShopClientOptions` z pełnym JSDoc body (description + @param + @returns + @example). Per-method docs dla `cart.{get,add,update,remove,clear,applyCoupon,removeCoupon}`, `shipping.list`, `checkout.submit`, `orders.{get,refreshPayment,retryPayment}`. Wszystkie eksporty `@public`.',
14
+ '**Dokumentacja** — pełna sekcja Shop w `DOCS.md` (overview rozszerzony o Coupons/Refunds/Stripe/Low-stock/CSV export, sekcja "cURL examples" + "Error codes"), 5 nowych stron: `/docs/shop/{stripe,coupons,refund,payment-adapter,carrier-adapter}`. `payment-adapter` guide pokazuje pełen interfejs + lazy peer pattern + signature verify + idempotency via eventId + lost-webhook recovery + refund. Update `nav.ts`.',
15
+ '**Admin UI**. Order detail: sidebar "Zwroty" (lista refund rows + aggregate refunded/remaining + `RefundDialog` modal z full/partial mode + reason). Orders list: "Eksport CSV" button. Coupons CRUD: `/admin/shop/coupons` lista + `/new` + `/[id]` edit (validacja code uppercase + alfanumeryczny). Nav-shop link. Refunded status w STATUS_STYLES.'
16
+ ],
17
+ fixes: [],
18
+ breakingChanges: [
19
+ '`OrderStatus` typ rozszerzony o `"refunded"` (terminal status). Custom UI/email logic używające `Record<OrderStatus, …>` musi dodać entry. Zaktualizowane in-tree: email templates, `svelte/labels.ts` `DEFAULT_LABELS_PL`, admin detail page, admin Zod schema, webhook-logic terminal set.',
20
+ '`PaymentAdapter` interface += optional `refund?(input)` method i optional `eventId?` / `eventType?` fields w `PaymentEvent`. Custom adaptery działają bez zmian (`refund` opcjonalne; brak `eventId` skutkuje fallback do terminal-status idempotency).',
21
+ '`CartSnapshot` rozszerzony o `subtotalNet`/`subtotalGross`/`subtotalVat` + opcjonalny `coupon: AppliedCoupon`. `totalNet`/`totalGross` teraz reprezentują wartość PO odjęciu discountu. Storefronty czytające tylko `total*` działają bez zmian dla cartów bez coupons; kod renderujący detal pre-discount musi czytać `subtotal*`.',
22
+ '`ShopFeatures` += opcjonalny `coupons?: boolean` (default `false`). `ShopConfig` += opcjonalny `adminEmail?: string` (default brak — low-stock alert no-op). Backward compatible defaults.'
23
+ ],
24
+ sql: `-- 0.25.0 — Shop polish DB additions
25
+ -- Run via drizzle-kit push or apply manually before deploying 0.25.0.
26
+
27
+ -- Refunds — one row per refund attempt (succeeded / pending / failed)
28
+ CREATE TABLE IF NOT EXISTS shop_refunds (
29
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
30
+ order_id uuid NOT NULL REFERENCES shop_orders(id) ON DELETE CASCADE,
31
+ payment_id uuid REFERENCES shop_payments(id) ON DELETE SET NULL,
32
+ provider text NOT NULL,
33
+ provider_ref text,
34
+ amount integer NOT NULL,
35
+ currency text NOT NULL,
36
+ reason text,
37
+ status text NOT NULL DEFAULT 'pending',
38
+ created_by text,
39
+ created_at timestamptz NOT NULL DEFAULT now(),
40
+ updated_at timestamptz NOT NULL DEFAULT now()
41
+ );
42
+
43
+ -- Webhook idempotency log — UNIQUE(provider, event_id) prevents replay
44
+ CREATE TABLE IF NOT EXISTS shop_webhook_events (
45
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
46
+ provider text NOT NULL,
47
+ event_id text NOT NULL,
48
+ event_type text,
49
+ order_id uuid REFERENCES shop_orders(id) ON DELETE SET NULL,
50
+ order_number text,
51
+ payload_hash text,
52
+ raw jsonb,
53
+ received_at timestamptz NOT NULL DEFAULT now(),
54
+ processed_at timestamptz
55
+ );
56
+ CREATE UNIQUE INDEX IF NOT EXISTS shop_webhook_events_provider_event_unique
57
+ ON shop_webhook_events (provider, event_id);
58
+
59
+ -- Coupons
60
+ CREATE TABLE IF NOT EXISTS shop_coupons (
61
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
62
+ code text NOT NULL,
63
+ type text NOT NULL,
64
+ value numeric(20,6) NOT NULL,
65
+ min_order_amount integer,
66
+ max_uses integer,
67
+ used_count integer NOT NULL DEFAULT 0,
68
+ expires_at timestamptz,
69
+ is_active boolean NOT NULL DEFAULT true,
70
+ created_at timestamptz NOT NULL DEFAULT now(),
71
+ updated_at timestamptz NOT NULL DEFAULT now()
72
+ );
73
+ CREATE UNIQUE INDEX IF NOT EXISTS shop_coupons_code_unique ON shop_coupons (code);
74
+
75
+ -- Coupon redemptions — UNIQUE(order_id) prevents double-redeem on retry
76
+ CREATE TABLE IF NOT EXISTS shop_coupon_redemptions (
77
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
78
+ coupon_id uuid NOT NULL REFERENCES shop_coupons(id) ON DELETE CASCADE,
79
+ order_id uuid NOT NULL REFERENCES shop_orders(id) ON DELETE CASCADE,
80
+ discount_amount integer NOT NULL,
81
+ redeemed_at timestamptz NOT NULL DEFAULT now()
82
+ );
83
+ CREATE UNIQUE INDEX IF NOT EXISTS shop_coupon_redemptions_order_unique
84
+ ON shop_coupon_redemptions (order_id);
85
+
86
+ -- Low-stock alert column
87
+ ALTER TABLE shop_products ADD COLUMN IF NOT EXISTS low_stock_threshold integer;`,
88
+ notes: 'Migracja czysto additive — istniejące zamówienia pozostają nietknięte, refunded jest nową gałęzią graph statusów. Stripe SDK trzeba zainstalować osobno (`pnpm add stripe`) jeśli używa się `stripeAdapter()` — `optionalDependencies` + `peerDependenciesMeta`. Coupons opt-in via `features: { coupons: true }`. Low-stock email wymaga `shop.adminEmail` w `defineShop` + skonfigurowanego email adaptera. Webhook idempotency table jest backwards-compatible: adaptery które nie surface eventId nadal działają poprzez terminal-status fallback. Test coverage 1053/1053 unit tests zielone (37 nowych: Stripe sig verify 4, getStatus 1, refund 3, payload 6, status-map 10, pricing-coupon 5, coupon-cookie 8). DoD: gap analysis vs Woo/Presta zatwierdzona, MUST-v1 (Stripe + Refund + Idempotency + Coupons) wdrożone, NICE-v1 (Low-stock + CSV export) wdrożone, dokumentacja shopa pełna.'
89
+ };
@@ -58,7 +58,70 @@ import { update as update0210 } from './0.21.0/index.js';
58
58
  import { update as update0220 } from './0.22.0/index.js';
59
59
  import { update as update0230 } from './0.23.0/index.js';
60
60
  import { update as update0240 } from './0.24.0/index.js';
61
- export const updates = [update0065, update0066, update0067, update0068, update0069, update010, update011, update012, update013, update014, update015, update020, update022, update050, update051, update052, update053, update054, update055, update056, update057, update058, update060, update061, update062, update070, update071, update072, update073, update080, update090, update0100, update0110, update0120, update0130, update0131, update0132, update0133, update0134, update0140, update0141, update0142, update0143, update0144, update0145, update0146, update0150, update0151, update0152, update0153, update0154, update0155, update0160, update0180, update0190, update0200, update0210, update0220, update0230, update0240];
61
+ import { update as update0250 } from './0.25.0/index.js';
62
+ export const updates = [
63
+ update0065,
64
+ update0066,
65
+ update0067,
66
+ update0068,
67
+ update0069,
68
+ update010,
69
+ update011,
70
+ update012,
71
+ update013,
72
+ update014,
73
+ update015,
74
+ update020,
75
+ update022,
76
+ update050,
77
+ update051,
78
+ update052,
79
+ update053,
80
+ update054,
81
+ update055,
82
+ update056,
83
+ update057,
84
+ update058,
85
+ update060,
86
+ update061,
87
+ update062,
88
+ update070,
89
+ update071,
90
+ update072,
91
+ update073,
92
+ update080,
93
+ update090,
94
+ update0100,
95
+ update0110,
96
+ update0120,
97
+ update0130,
98
+ update0131,
99
+ update0132,
100
+ update0133,
101
+ update0134,
102
+ update0140,
103
+ update0141,
104
+ update0142,
105
+ update0143,
106
+ update0144,
107
+ update0145,
108
+ update0146,
109
+ update0150,
110
+ update0151,
111
+ update0152,
112
+ update0153,
113
+ update0154,
114
+ update0155,
115
+ update0160,
116
+ update0180,
117
+ update0190,
118
+ update0200,
119
+ update0210,
120
+ update0220,
121
+ update0230,
122
+ update0240,
123
+ update0250
124
+ ];
62
125
  export const getUpdatesFrom = (fromVersion) => {
63
126
  const fromParts = fromVersion.split('.').map(Number);
64
127
  return updates.filter((update) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "includio-cms",
3
- "version": "0.24.0",
3
+ "version": "0.25.0",
4
4
  "scripts": {
5
5
  "dev": "vite dev",
6
6
  "build": "vite build && npm run prepack",
@@ -141,6 +141,7 @@
141
141
  "postgres": "^3.4.5",
142
142
  "runed": "^0.35.1",
143
143
  "sharp": "^0.34.2",
144
+ "stripe": ">=17.0.0",
144
145
  "svelte": "^5.43.0",
145
146
  "svelte-sonner": "^1.0.5",
146
147
  "svelte-tiptap": "^3.0.1",
@@ -160,6 +161,9 @@
160
161
  "openai": {
161
162
  "optional": true
162
163
  },
164
+ "stripe": {
165
+ "optional": true
166
+ },
163
167
  "svelte-tiptap": {
164
168
  "optional": true
165
169
  },
@@ -220,6 +224,7 @@
220
224
  "prettier-plugin-svelte": "^3.3.3",
221
225
  "prettier-plugin-tailwindcss": "^0.6.11",
222
226
  "publint": "^0.3.2",
227
+ "stripe": "^17.0.0",
223
228
  "rehype-autolink-headings": "^7.1.0",
224
229
  "rehype-slug": "^6.0.0",
225
230
  "remark-gfm": "^4.0.1",