Skip to content

Commit 072992f

Browse files
committed
Create mocks for the entire point-of-sale extension API
1 parent c8b1e1c commit 072992f

6 files changed

Lines changed: 933 additions & 1 deletion

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: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
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

68
function isCheckoutTarget(target: string): target is CheckoutExtensionTarget {
79
return (
@@ -12,17 +14,27 @@ function isCheckoutTarget(target: string): target is CheckoutExtensionTarget {
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.
1723
*/
1824
export function createMockTargetApi<T extends CheckoutExtensionTarget>(
1925
target: T,
2026
): ApiForTarget<T>;
27+
export function createMockTargetApi<T extends PosExtensionTarget>(
28+
target: T,
29+
): ApiForTarget<T>;
2130
export function createMockTargetApi(target: AnyExtensionTarget): never;
2231
export function createMockTargetApi(target: AnyExtensionTarget): object {
2332
if (isCheckoutTarget(target)) {
2433
return createMockCheckoutTargetApi(target);
2534
}
35+
if (isPosTarget(target)) {
36+
return createMockPosTargetApi(target);
37+
}
2638
throw new Error(
2739
`Unsupported target: "${target}". No mock factory is available for this target.`,
2840
);

0 commit comments

Comments
 (0)