Skip to content

Commit fb69053

Browse files
committed
Create mocks for the entire point-of-sale extension API
1 parent d914c44 commit fb69053

6 files changed

Lines changed: 932 additions & 3 deletions

File tree

packages/ui-extensions-tester/loom.config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ import {defaultProjectPlugin} from '../../config/loom';
44
export default createPackage((pkg) => {
55
pkg.entry({root: './src/index.ts'});
66
pkg.entry({name: 'checkout', root: './src/checkout/index.ts'});
7+
pkg.entry({name: 'point-of-sale', root: './src/point-of-sale/index.ts'});
78
pkg.use(defaultProjectPlugin());
89
});

packages/ui-extensions-tester/package.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,21 @@
1717
"esnext": "./checkout.esnext",
1818
"import": "./checkout.mjs",
1919
"require": "./checkout.js"
20+
},
21+
"./point-of-sale": {
22+
"types": "./build/ts/point-of-sale/index.d.ts",
23+
"esnext": "./point-of-sale.esnext",
24+
"import": "./point-of-sale.mjs",
25+
"require": "./point-of-sale.js"
2026
}
2127
},
2228
"typesVersions": {
2329
"*": {
2430
"checkout": [
2531
"./build/ts/checkout/index.d.ts"
32+
],
33+
"point-of-sale": [
34+
"./build/ts/point-of-sale/index.d.ts"
2635
]
2736
}
2837
},

packages/ui-extensions-tester/src/mocks/signals.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,24 @@ export function createSubscribableSignalLike<T>(
1414
destroy: async () => {},
1515
};
1616
}
17+
18+
/**
19+
* A minimal read-only signal for surfaces (like POS) that use
20+
* `ReadonlySignalLike` instead of `SubscribableSignalLike`.
21+
*/
22+
export interface MockReadonlySignalLike<T> {
23+
readonly value: T;
24+
subscribe(fn: (value: T) => void): () => void;
25+
}
26+
27+
/**
28+
* Creates a mock `ReadonlySignalLike` that wraps a static value.
29+
*/
30+
export function createReadonlySignalLike<T>(
31+
value: T,
32+
): MockReadonlySignalLike<T> {
33+
return {
34+
value,
35+
subscribe: () => () => {},
36+
};
37+
}

packages/ui-extensions-tester/src/mocks/target-apis.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
import type {ExtensionTarget} from '@shopify/ui-extensions/checkout';
1+
import type {ExtensionTarget as CheckoutExtensionTarget} from '@shopify/ui-extensions/checkout';
2+
import type {ExtensionTarget as PosExtensionTarget} from '@shopify/ui-extensions/point-of-sale';
23

34
import type {AnyExtensionTarget, ApiForTarget} from '../targets';
45
import {createMockCheckoutTargetApi} from '../checkout';
6+
import {createMockPosTargetApi} from '../point-of-sale';
57

6-
function isCheckoutTarget(target: string): target is ExtensionTarget {
8+
function isCheckoutTarget(target: string): target is CheckoutExtensionTarget {
79
return (
810
target.startsWith('purchase.checkout') ||
911
target.startsWith('purchase.thank-you') ||
@@ -12,6 +14,10 @@ function isCheckoutTarget(target: string): target is ExtensionTarget {
1214
);
1315
}
1416

17+
function isPosTarget(target: string): target is PosExtensionTarget {
18+
return target.startsWith('pos.');
19+
}
20+
1521
/**
1622
* Returns the default mock API values for a given target, or an empty
1723
* object if no mock has been implemented yet.
@@ -22,5 +28,8 @@ export function createMockTargetApi<T extends AnyExtensionTarget>(
2228
if (isCheckoutTarget(target)) {
2329
return createMockCheckoutTargetApi(target) as Partial<ApiForTarget<T>>;
2430
}
31+
if (isPosTarget(target)) {
32+
return createMockPosTargetApi(target) as Partial<ApiForTarget<T>>;
33+
}
2534
return {} as Partial<ApiForTarget<T>>;
2635
}

0 commit comments

Comments
 (0)