@actuate-media/plugin-commerce 0.1.1 → 0.1.3

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/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # @actuate-media/plugin-commerce
2
2
 
3
+ ## 0.1.3
4
+
5
+ ### Patch Changes
6
+
7
+ - daf91b4: Fix `syncProduct` letting caller metadata overwrite the authoritative `actuateProductId`.
8
+
9
+ The Stripe product metadata was built with `actuateProductId` assigned _before_
10
+ the `...product.metadata` spread, so a caller-supplied `metadata.actuateProductId`
11
+ won on key collision and silently corrupted the Actuate→Stripe foreign key. The
12
+ spread now comes first and the authoritative key is assigned last.
13
+
14
+ ## 0.1.2
15
+
16
+ ### Patch Changes
17
+
18
+ - e25cd48: Standardize React peer ranges to `^18.0.0 || ^19.0.0`.
19
+
20
+ Plugin React peer ranges were inconsistent: `plugin-ai`, `plugin-commerce`, and
21
+ `plugin-seo` pinned `react: ^19.2.0` (excluding React 18, which `cms-core`
22
+ supports via `react >=18.0.0`), while the others used `^18.0.0 || ^19.2.0`
23
+ (excluding React 19.0/19.1). Either produced an `ERESOLVE` install failure for
24
+ consumers on the excluded versions. All bundled plugins now declare `react`
25
+ (and `react-dom` where already peered) as `^18.0.0 || ^19.0.0`.
26
+
3
27
  ## 0.1.1
4
28
 
5
29
  ### Patch Changes
@@ -1,5 +1,5 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { buildCheckoutSessionParams } from '../stripe/checkout.js';
1
+ import { afterEach, describe, expect, it, vi } from 'vitest';
2
+ import { buildCheckoutSessionParams, createCheckoutSession } from '../stripe/checkout.js';
3
3
  const base = { successUrl: '/success', cancelUrl: '/cancel' };
4
4
  const lineItem = (over = {}) => ({
5
5
  productId: 'p1',
@@ -65,4 +65,19 @@ describe('buildCheckoutSessionParams', () => {
65
65
  expect(bare.shipping_options).toBeUndefined();
66
66
  });
67
67
  });
68
+ describe('createCheckoutSession (stub wrapper)', () => {
69
+ afterEach(() => {
70
+ vi.useRealTimers();
71
+ });
72
+ it('returns a stub session that expires ~30 minutes from now', async () => {
73
+ vi.useFakeTimers();
74
+ vi.setSystemTime(new Date('2026-07-09T00:00:00.000Z'));
75
+ const session = await createCheckoutSession({ ...base, lineItems: [lineItem()] });
76
+ const diff = session.expiresAt.getTime() - Date.now();
77
+ expect(diff).toBeGreaterThanOrEqual(29 * 60 * 1000);
78
+ expect(diff).toBeLessThanOrEqual(30 * 60 * 1000);
79
+ expect(session.id).toMatch(/^cs_stub_/);
80
+ expect(session.url).toMatch(/^https:\/\/checkout\.stripe\.com\/pay\/cs_stub_/);
81
+ });
82
+ });
68
83
  //# sourceMappingURL=checkout.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"checkout.test.js","sourceRoot":"","sources":["../../src/__tests__/checkout.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"checkout.test.js","sourceRoot":"","sources":["../../src/__tests__/checkout.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=client.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/client.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,74 @@
1
+ import { describe, it, expect, vi, afterEach } from 'vitest';
2
+ import { createCommerceClient } from '../client.js';
3
+ const originalFetch = globalThis.fetch;
4
+ /** Replaces the global fetch with a spy that resolves a controllable Response-like object. */
5
+ function stubFetch(overrides = {}) {
6
+ const fn = vi.fn(async (_input, _init) => ({
7
+ ok: true,
8
+ status: 200,
9
+ statusText: 'OK',
10
+ json: async () => ({}),
11
+ ...overrides,
12
+ }));
13
+ globalThis.fetch = fn;
14
+ return fn;
15
+ }
16
+ afterEach(() => {
17
+ globalThis.fetch = originalFetch;
18
+ vi.restoreAllMocks();
19
+ });
20
+ describe('createCommerceClient request/URL construction', () => {
21
+ it('normalizes a trailing slash and drops undefined query params (URL-encoded)', async () => {
22
+ const fetchMock = stubFetch({ json: async () => ({ data: [], total: 0 }) });
23
+ await createCommerceClient('http://x/').products.find({
24
+ status: 'active',
25
+ minPrice: undefined,
26
+ search: 'a b',
27
+ });
28
+ expect(fetchMock).toHaveBeenCalledTimes(1);
29
+ // No double slash after 'http://x', minPrice dropped, space encoded to %20.
30
+ expect(fetchMock.mock.calls[0][0]).toBe('http://x/api/commerce/products?status=active&search=a%20b');
31
+ });
32
+ it('emits no query string when there are no filters', async () => {
33
+ const fetchMock = stubFetch({ json: async () => ({ data: [], total: 0 }) });
34
+ await createCommerceClient('http://x/').products.find();
35
+ expect(fetchMock.mock.calls[0][0]).toBe('http://x/api/commerce/products');
36
+ });
37
+ it('URL-encodes a path segment containing a slash (sessionId)', async () => {
38
+ const fetchMock = stubFetch();
39
+ await createCommerceClient('http://x').cart.get('sess/1');
40
+ expect(fetchMock.mock.calls[0][0]).toBe('http://x/api/commerce/cart/sess%2F1');
41
+ });
42
+ it('POSTs addItem with the correct method and JSON body', async () => {
43
+ const fetchMock = stubFetch();
44
+ await createCommerceClient('http://x').cart.addItem('s', 'p', 2, 'v');
45
+ const [url, init] = fetchMock.mock.calls[0];
46
+ expect(url).toBe('http://x/api/commerce/cart/s/items');
47
+ expect(init.method).toBe('POST');
48
+ expect(JSON.parse(init.body)).toEqual({
49
+ productId: 'p',
50
+ quantity: 2,
51
+ variantId: 'v',
52
+ });
53
+ });
54
+ it('POSTs checkout with sessionId spread alongside the options', async () => {
55
+ const fetchMock = stubFetch();
56
+ await createCommerceClient('http://x').checkout.create('s', {
57
+ email: 'a@b.com',
58
+ shippingAddress: { line1: '1 St' },
59
+ });
60
+ const [url, init] = fetchMock.mock.calls[0];
61
+ expect(url).toBe('http://x/api/commerce/checkout');
62
+ expect(init.method).toBe('POST');
63
+ expect(JSON.parse(init.body)).toEqual({
64
+ sessionId: 's',
65
+ email: 'a@b.com',
66
+ shippingAddress: { line1: '1 St' },
67
+ });
68
+ });
69
+ it('throws "Commerce API error: <status> <statusText>" on a non-ok response', async () => {
70
+ stubFetch({ ok: false, status: 404, statusText: 'Not Found' });
71
+ await expect(createCommerceClient('http://x').orders.findById('o1')).rejects.toThrow(/Commerce API error: 404 Not Found/);
72
+ });
73
+ });
74
+ //# sourceMappingURL=client.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.test.js","sourceRoot":"","sources":["../../src/__tests__/client.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=customer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customer.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/customer.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { getOrCreateCustomer, syncCustomer } from '../stripe/customer.js';
3
+ describe('getOrCreateCustomer', () => {
4
+ it('passes the email through and starts with empty metadata', async () => {
5
+ const customer = await getOrCreateCustomer('a@b.com');
6
+ expect(customer.email).toBe('a@b.com');
7
+ expect(customer.metadata).toEqual({});
8
+ expect(customer.id).toMatch(/^cus_stub_/);
9
+ });
10
+ });
11
+ describe('syncCustomer', () => {
12
+ it('injects actuateUserId while preserving the resolved customer email and metadata', async () => {
13
+ const customer = await syncCustomer('user_7', 'a@b.com');
14
+ // Delegates to getOrCreateCustomer (email passthrough, cus_stub_ id) and then
15
+ // spreads its metadata ({}), adding only actuateUserId — nothing dropped/added.
16
+ expect(customer.email).toBe('a@b.com');
17
+ expect(customer.metadata).toEqual({ actuateUserId: 'user_7' });
18
+ expect(customer.id).toMatch(/^cus_stub_/);
19
+ });
20
+ });
21
+ //# sourceMappingURL=customer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customer.test.js","sourceRoot":"","sources":["../../src/__tests__/customer.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAEzE,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,SAAS,CAAC,CAAA;QACrD,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACtC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACrC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;QAC/F,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;QACxD,8EAA8E;QAC9E,gFAAgF;QAChF,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACtC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAA;QAC9D,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=hooks.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/hooks.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,119 @@
1
+ import { describe, it, expect, vi, afterEach } from 'vitest';
2
+ import { commerceHooks } from '../hooks.js';
3
+ // Find hooks by their registered event so the assertions stay order-independent.
4
+ const orderHook = commerceHooks.find((h) => h.event === 'afterCreate:orders');
5
+ const productHook = commerceHooks.find((h) => h.event === 'afterUpdate:products');
6
+ function orderPayload(data, id = 'ord_1') {
7
+ return { id, collection: 'orders', slug: null, status: null, data };
8
+ }
9
+ function productPayload(data) {
10
+ return { id: 'prod_1', collection: 'products', slug: null, status: null, data };
11
+ }
12
+ afterEach(() => {
13
+ vi.restoreAllMocks();
14
+ });
15
+ // Commerce hooks read only payload.data and their ONLY observable effect is a
16
+ // console line — they do not touch globalThis.__actuateConfig or emit cache tags.
17
+ describe('afterCreate:orders hook (Stripe sync side effect)', () => {
18
+ it('does not log when the order id is missing (!orderId guard)', async () => {
19
+ const spy = vi.spyOn(console, 'info').mockImplementation(() => { });
20
+ await orderHook.handler(orderPayload({ total: 50 }, ''));
21
+ expect(spy).not.toHaveBeenCalled();
22
+ });
23
+ it('does not log when total is undefined (total === undefined guard)', async () => {
24
+ const spy = vi.spyOn(console, 'info').mockImplementation(() => { });
25
+ await orderHook.handler(orderPayload({}));
26
+ expect(spy).not.toHaveBeenCalled();
27
+ });
28
+ it('logs one sync line and defaults currency to USD when absent', async () => {
29
+ const spy = vi.spyOn(console, 'info').mockImplementation(() => { });
30
+ await orderHook.handler(orderPayload({ total: 50 }));
31
+ expect(spy).toHaveBeenCalledTimes(1);
32
+ const msg = String(spy.mock.calls[0][0]);
33
+ expect(msg).toContain('ord_1');
34
+ expect(msg).toContain('USD 50');
35
+ });
36
+ it('uses the provided currency instead of the USD default', async () => {
37
+ const spy = vi.spyOn(console, 'info').mockImplementation(() => { });
38
+ await orderHook.handler(orderPayload({ total: 50, currency: 'EUR' }));
39
+ expect(spy).toHaveBeenCalledTimes(1);
40
+ expect(String(spy.mock.calls[0][0])).toContain('EUR 50');
41
+ });
42
+ it('still logs when total is 0 (guard is === undefined, not falsy)', async () => {
43
+ const spy = vi.spyOn(console, 'info').mockImplementation(() => { });
44
+ await orderHook.handler(orderPayload({ total: 0 }));
45
+ expect(spy).toHaveBeenCalledTimes(1);
46
+ expect(String(spy.mock.calls[0][0])).toContain('USD 0');
47
+ });
48
+ });
49
+ describe('afterUpdate:products hook (low-stock alert)', () => {
50
+ it('does not warn when trackInventory is falsy', async () => {
51
+ const spy = vi.spyOn(console, 'warn').mockImplementation(() => { });
52
+ await productHook.handler(productPayload({ trackInventory: false, inventoryCount: 1 }));
53
+ expect(spy).not.toHaveBeenCalled();
54
+ });
55
+ it('does not warn when inventoryCount is undefined', async () => {
56
+ const spy = vi.spyOn(console, 'warn').mockImplementation(() => { });
57
+ await productHook.handler(productPayload({ trackInventory: true }));
58
+ expect(spy).not.toHaveBeenCalled();
59
+ });
60
+ it('does not warn just above the threshold (6 > 5)', async () => {
61
+ const spy = vi.spyOn(console, 'warn').mockImplementation(() => { });
62
+ await productHook.handler(productPayload({ trackInventory: true, inventoryCount: 6 }));
63
+ expect(spy).not.toHaveBeenCalled();
64
+ });
65
+ it('warns at the exact boundary (inventoryCount === 5, <= is inclusive)', async () => {
66
+ const spy = vi.spyOn(console, 'warn').mockImplementation(() => { });
67
+ await productHook.handler(productPayload({ trackInventory: true, inventoryCount: 5, name: 'Widget' }));
68
+ expect(spy).toHaveBeenCalledTimes(1);
69
+ });
70
+ it('warns at zero stock and embeds the product name and remaining count', async () => {
71
+ const spy = vi.spyOn(console, 'warn').mockImplementation(() => { });
72
+ await productHook.handler(productPayload({ trackInventory: true, inventoryCount: 2, name: 'Widget' }));
73
+ expect(spy).toHaveBeenCalledTimes(1);
74
+ const msg = String(spy.mock.calls[0][0]);
75
+ expect(msg).toMatch(/Widget/);
76
+ expect(msg).toMatch(/2 unit/);
77
+ });
78
+ it('warns at zero (0 <= 5)', async () => {
79
+ const spy = vi.spyOn(console, 'warn').mockImplementation(() => { });
80
+ await productHook.handler(productPayload({ trackInventory: true, inventoryCount: 0, name: 'Gadget' }));
81
+ expect(spy).toHaveBeenCalledTimes(1);
82
+ });
83
+ });
84
+ describe('hook event wiring', () => {
85
+ it('registers exactly the two collection-namespaced events', () => {
86
+ const events = commerceHooks.map((h) => h.event);
87
+ expect(events).toContain('afterCreate:orders');
88
+ expect(events).toContain('afterUpdate:products');
89
+ });
90
+ it('wires the order Stripe-sync side effect to afterCreate:orders (found by behavior)', async () => {
91
+ const spy = vi.spyOn(console, 'info').mockImplementation(() => { });
92
+ let syncHook;
93
+ for (const h of commerceHooks) {
94
+ spy.mockClear();
95
+ await h.handler(orderPayload({ total: 1 }));
96
+ if (spy.mock.calls.length > 0) {
97
+ syncHook = h;
98
+ break;
99
+ }
100
+ }
101
+ expect(syncHook).toBeDefined();
102
+ expect(syncHook.event).toBe('afterCreate:orders');
103
+ });
104
+ it('wires the low-stock warning side effect to afterUpdate:products (found by behavior)', async () => {
105
+ const spy = vi.spyOn(console, 'warn').mockImplementation(() => { });
106
+ let stockHook;
107
+ for (const h of commerceHooks) {
108
+ spy.mockClear();
109
+ await h.handler(productPayload({ trackInventory: true, inventoryCount: 1, name: 'X' }));
110
+ if (spy.mock.calls.length > 0) {
111
+ stockHook = h;
112
+ break;
113
+ }
114
+ }
115
+ expect(stockHook).toBeDefined();
116
+ expect(stockHook.event).toBe('afterUpdate:products');
117
+ });
118
+ });
119
+ //# sourceMappingURL=hooks.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.test.js","sourceRoot":"","sources":["../../src/__tests__/hooks.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=products.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"products.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/products.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,39 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { syncPrice, syncProduct } from '../stripe/products.js';
3
+ describe('syncPrice', () => {
4
+ it('converts dollars to integer cents (float-safe) and lowercases the currency', async () => {
5
+ const price = await syncPrice('prod_1', 19.99, 'USD');
6
+ expect(price.unitAmount).toBe(1999); // 19.99 * 100 = 1998.999… → Math.round
7
+ expect(price.currency).toBe('usd');
8
+ expect(price.productId).toBe('prod_1');
9
+ expect(price.active).toBe(true);
10
+ });
11
+ it('rounds a value that floats below the integer (10.1 → 1010c)', async () => {
12
+ const price = await syncPrice('prod_1', 10.1, 'usd');
13
+ expect(price.unitAmount).toBe(1010);
14
+ });
15
+ });
16
+ describe('syncProduct', () => {
17
+ it('merges actuateProductId with caller metadata and marks the product active', async () => {
18
+ const product = await syncProduct({ id: 'p1', name: 'W', metadata: { color: 'red' } });
19
+ expect(product.metadata).toEqual({ actuateProductId: 'p1', color: 'red' });
20
+ expect(product.active).toBe(true);
21
+ expect(product.name).toBe('W');
22
+ });
23
+ it('sets only actuateProductId when no caller metadata is provided', async () => {
24
+ const product = await syncProduct({ id: 'p2', name: 'X' });
25
+ expect(product.metadata).toEqual({ actuateProductId: 'p2' });
26
+ });
27
+ // The authoritative Actuate→Stripe foreign key must win over any
28
+ // caller-supplied metadata.actuateProductId (syncProduct assigns it after the
29
+ // metadata spread, so a colliding caller key cannot corrupt the linkage).
30
+ it('does not let caller metadata override the authoritative actuateProductId', async () => {
31
+ const product = await syncProduct({
32
+ id: 'p1',
33
+ name: 'W',
34
+ metadata: { actuateProductId: 'HACK' },
35
+ });
36
+ expect(product.metadata.actuateProductId).toBe('p1');
37
+ });
38
+ });
39
+ //# sourceMappingURL=products.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"products.test.js","sourceRoot":"","sources":["../../src/__tests__/products.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAE9D,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;QAC1F,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;QACrD,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAC,uCAAuC;QAC3E,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACtC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;QACpD,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACzF,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAA;QACtF,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;QAC1E,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAA;QAC1D,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAA;IAC9D,CAAC,CAAC,CAAA;IAEF,iEAAiE;IACjE,8EAA8E;IAC9E,0EAA0E;IAC1E,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC;YAChC,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,GAAG;YACT,QAAQ,EAAE,EAAE,gBAAgB,EAAE,MAAM,EAAE;SACvC,CAAC,CAAA;QACF,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"products.d.ts","sourceRoot":"","sources":["../../src/stripe/products.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,OAAO,CAAA;IACf,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,+EAA+E;AAC/E,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAa9E;AAED,oEAAoE;AACpE,wBAAsB,SAAS,CAC7B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC,CAWtB"}
1
+ {"version":3,"file":"products.d.ts","sourceRoot":"","sources":["../../src/stripe/products.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,OAAO,CAAA;IACf,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,+EAA+E;AAC/E,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAe9E;AAED,oEAAoE;AACpE,wBAAsB,SAAS,CAC7B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC,CAWtB"}
@@ -6,9 +6,11 @@ export async function syncProduct(product) {
6
6
  id: `prod_stub_${Date.now()}`,
7
7
  name: product.name,
8
8
  active: true,
9
+ // Spread caller metadata FIRST so it can never override the authoritative
10
+ // actuateProductId that links this Stripe product back to the Actuate record.
9
11
  metadata: {
10
- actuateProductId: product.id,
11
12
  ...product.metadata,
13
+ actuateProductId: product.id,
12
14
  },
13
15
  };
14
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"products.js","sourceRoot":"","sources":["../../src/stripe/products.ts"],"names":[],"mappings":"AAuBA,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAoB;IACpD,gEAAgE;IAChE,sDAAsD;IAEtD,OAAO;QACL,EAAE,EAAE,aAAa,IAAI,CAAC,GAAG,EAAE,EAAE;QAC7B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE;YACR,gBAAgB,EAAE,OAAO,CAAC,EAAE;YAC5B,GAAG,OAAO,CAAC,QAAQ;SACpB;KACF,CAAA;AACH,CAAC;AAED,oEAAoE;AACpE,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,SAAiB,EACjB,MAAc,EACd,QAAgB;IAEhB,4EAA4E;IAC5E,yFAAyF;IAEzF,OAAO;QACL,EAAE,EAAE,cAAc,IAAI,CAAC,GAAG,EAAE,EAAE;QAC9B,SAAS;QACT,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;QACpC,QAAQ,EAAE,QAAQ,CAAC,WAAW,EAAE;QAChC,MAAM,EAAE,IAAI;KACb,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"products.js","sourceRoot":"","sources":["../../src/stripe/products.ts"],"names":[],"mappings":"AAuBA,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAoB;IACpD,gEAAgE;IAChE,sDAAsD;IAEtD,OAAO;QACL,EAAE,EAAE,aAAa,IAAI,CAAC,GAAG,EAAE,EAAE;QAC7B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM,EAAE,IAAI;QACZ,0EAA0E;QAC1E,8EAA8E;QAC9E,QAAQ,EAAE;YACR,GAAG,OAAO,CAAC,QAAQ;YACnB,gBAAgB,EAAE,OAAO,CAAC,EAAE;SAC7B;KACF,CAAA;AACH,CAAC;AAED,oEAAoE;AACpE,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,SAAiB,EACjB,MAAc,EACd,QAAgB;IAEhB,4EAA4E;IAC5E,yFAAyF;IAEzF,OAAO;QACL,EAAE,EAAE,cAAc,IAAI,CAAC,GAAG,EAAE,EAAE;QAC9B,SAAS;QACT,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;QACpC,QAAQ,EAAE,QAAQ,CAAC,WAAW,EAAE;QAChC,MAAM,EAAE,IAAI;KACb,CAAA;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@actuate-media/plugin-commerce",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -28,11 +28,11 @@
28
28
  "@types/react": "^19.0.0",
29
29
  "typescript": "^5.7.0",
30
30
  "vitest": "^4.1.0",
31
- "@actuate-media/cms-core": "0.93.3"
31
+ "@actuate-media/cms-core": "0.95.1"
32
32
  },
33
33
  "peerDependencies": {
34
34
  "@actuate-media/cms-core": ">=0.1.0",
35
- "react": "^19.2.0"
35
+ "react": "^18.0.0 || ^19.0.0"
36
36
  },
37
37
  "scripts": {
38
38
  "build": "tsc --project tsconfig.json",