@shopfront/bridge 2.0.1 → 2.0.4

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 (46) hide show
  1. package/.github/workflows/npm-publish.yml +13 -2
  2. package/lib/Application.d.ts +2 -18
  3. package/lib/Application.js +1 -141
  4. package/lib/ApplicationEvents.d.ts +54 -5
  5. package/lib/BaseApplication.d.ts +11 -17
  6. package/lib/BaseApplication.js +197 -1
  7. package/lib/BaseBridge.d.ts +1 -0
  8. package/lib/BaseBridge.js +1 -3
  9. package/lib/Bridge.d.ts +0 -19
  10. package/lib/Bridge.js +2 -1
  11. package/lib/Events/DirectEvents/BaseDirectEvent.d.ts +13 -0
  12. package/lib/Events/DirectEvents/BaseDirectEvent.js +5 -0
  13. package/lib/Events/DirectEvents/SaleAddCustomer.d.ts +13 -0
  14. package/lib/Events/DirectEvents/SaleAddCustomer.js +24 -0
  15. package/lib/Events/DirectEvents/SaleAddProduct.d.ts +13 -0
  16. package/lib/Events/DirectEvents/SaleAddProduct.js +24 -0
  17. package/lib/Events/DirectEvents/SaleChangeQuantity.d.ts +13 -0
  18. package/lib/Events/DirectEvents/SaleChangeQuantity.js +24 -0
  19. package/lib/Events/DirectEvents/SaleClear.d.ts +13 -0
  20. package/lib/Events/DirectEvents/SaleClear.js +21 -0
  21. package/lib/Events/DirectEvents/SaleRemoveCustomer.d.ts +13 -0
  22. package/lib/Events/DirectEvents/SaleRemoveCustomer.js +21 -0
  23. package/lib/Events/DirectEvents/SaleRemoveProduct.d.ts +13 -0
  24. package/lib/Events/DirectEvents/SaleRemoveProduct.js +24 -0
  25. package/lib/Events/DirectEvents/SaleUpdateProducts.d.ts +13 -0
  26. package/lib/Events/DirectEvents/SaleUpdateProducts.js +24 -0
  27. package/lib/Events/DirectEvents/types/SaleEventData.d.ts +70 -0
  28. package/lib/Events/DirectEvents/types/SaleEventData.js +1 -0
  29. package/lib/Mocks/APIs/Sale/MockCurrentSale.d.ts +7 -2
  30. package/lib/Mocks/APIs/Sale/MockCurrentSale.js +94 -10
  31. package/lib/Mocks/MockApplication.d.ts +8 -21
  32. package/lib/Mocks/MockApplication.js +12 -165
  33. package/lib/Mocks/MockBridge.d.ts +1 -1
  34. package/lib/Mocks/MockBridge.js +3 -1
  35. package/package.json +1 -1
  36. package/.idea/codeStyles/Project.xml +0 -10
  37. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  38. package/.idea/git_toolbox_blame.xml +0 -6
  39. package/.idea/git_toolbox_prj.xml +0 -15
  40. package/.idea/inspectionProfiles/Project_Default.xml +0 -11
  41. package/.idea/jsLinters/eslint.xml +0 -6
  42. package/.idea/misc.xml +0 -6
  43. package/.idea/modules.xml +0 -8
  44. package/.idea/php.xml +0 -33
  45. package/.idea/shopfront-embedded-bridge.iml +0 -10
  46. package/.idea/vcs.xml +0 -6
@@ -1,27 +1,5 @@
1
1
  import { isDirectShopfrontEvent, ToShopfront, } from "../ApplicationEvents.js";
2
2
  import { BaseApplication } from "../BaseApplication.js";
3
- import { AudioPermissionChange } from "../Events/AudioPermissionChange.js";
4
- import { AudioReady } from "../Events/AudioReady.js";
5
- import { FormatIntegratedProduct } from "../Events/FormatIntegratedProduct.js";
6
- import { FulfilmentCollectOrder } from "../Events/FulfilmentCollectOrder.js";
7
- import { FulfilmentCompleteOrder } from "../Events/FulfilmentCompleteOrder.js";
8
- import { FulfilmentGetOrder } from "../Events/FulfilmentGetOrder.js";
9
- import { FulfilmentOrderApproval } from "../Events/FulfilmentOrderApproval.js";
10
- import { FulfilmentProcessOrder } from "../Events/FulfilmentProcessOrder.js";
11
- import { FulfilmentVoidOrder } from "../Events/FulfilmentVoidOrder.js";
12
- import { GiftCardCodeCheck } from "../Events/GiftCardCodeCheck.js";
13
- import { InternalPageMessage } from "../Events/InternalPageMessage.js";
14
- import { PaymentMethodsEnabled } from "../Events/PaymentMethodsEnabled.js";
15
- import { Ready } from "../Events/Ready.js";
16
- import { RegisterChanged } from "../Events/RegisterChanged.js";
17
- import { RequestButtons } from "../Events/RequestButtons.js";
18
- import { RequestCustomerListOptions } from "../Events/RequestCustomerListOptions.js";
19
- import { RequestSaleKeys } from "../Events/RequestSaleKeys.js";
20
- import { RequestSellScreenOptions } from "../Events/RequestSellScreenOptions.js";
21
- import { RequestSettings } from "../Events/RequestSettings.js";
22
- import { RequestTableColumns } from "../Events/RequestTableColumns.js";
23
- import { SaleComplete } from "../Events/SaleComplete.js";
24
- import { UIPipeline } from "../Events/UIPipeline.js";
25
3
  import ActionEventRegistrar from "../Utilities/ActionEventRegistrar.js";
26
4
  import { MockCurrentSale } from "./APIs/Sale/MockCurrentSale.js";
27
5
  import { MockDatabase } from "./Database/MockDatabase.js";
@@ -32,7 +10,7 @@ export class MockApplication extends BaseApplication {
32
10
  /**
33
11
  * Handles an application event
34
12
  */
35
- this.handleEvent = (event, data, id) => {
13
+ this.handleEvent = async (event, data, id) => {
36
14
  if (event === "READY") {
37
15
  this.isReady = true;
38
16
  this.key = data.key;
@@ -66,7 +44,7 @@ export class MockApplication extends BaseApplication {
66
44
  // Handled elsewhere
67
45
  return;
68
46
  }
69
- this.emit(event, data, id);
47
+ await this.emit(event, data, id);
70
48
  };
71
49
  /**
72
50
  * Updates the cached location data
@@ -95,21 +73,18 @@ export class MockApplication extends BaseApplication {
95
73
  /**
96
74
  * Calls any registered listeners for the received event
97
75
  */
98
- emit(event, data = {}, id) {
76
+ async emit(event, data = {}, id) {
99
77
  if (isDirectShopfrontEvent(event)) {
100
78
  const listeners = this.directListeners[event];
101
79
  if (typeof listeners === "undefined") {
102
- // Don't need to do anything here
103
- return;
80
+ return this.bridge.sendMessage(ToShopfront.NOT_LISTENING_TO_EVENT);
104
81
  }
105
82
  const results = [];
106
83
  for (const e of listeners.values()) {
107
- results.push(e());
84
+ results.push(e.emit(data));
108
85
  }
109
- return Promise.all(results)
110
- .then(() => {
111
- // Ensure void is returned
112
- });
86
+ await Promise.all(results);
87
+ return;
113
88
  }
114
89
  const results = [];
115
90
  if (typeof this.listeners[event] === "undefined") {
@@ -124,137 +99,9 @@ export class MockApplication extends BaseApplication {
124
99
  for (const e of this.listeners[event].values()) {
125
100
  results.push(e.emit(data, bridge));
126
101
  }
102
+ await Promise.allSettled(results);
127
103
  // The responses have been removed as we don't currently need them
128
104
  }
129
- /**
130
- * @inheritDoc
131
- */
132
- addEventListener(event, callback) {
133
- if (isDirectShopfrontEvent(event)) {
134
- if (typeof this.directListeners[event] === "undefined") {
135
- this.directListeners[event] = new Set();
136
- }
137
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
138
- this.directListeners[event].add(callback);
139
- return;
140
- }
141
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
142
- let c;
143
- switch (event) {
144
- case "READY":
145
- c = new Ready(callback);
146
- this.listeners[event].set(callback, c);
147
- break;
148
- case "REQUEST_SETTINGS":
149
- c = new RequestSettings(callback);
150
- this.listeners[event].set(callback, c);
151
- break;
152
- case "REQUEST_BUTTONS":
153
- c = new RequestButtons(callback);
154
- this.listeners[event].set(callback, c);
155
- break;
156
- case "REQUEST_TABLE_COLUMNS":
157
- c = new RequestTableColumns(callback);
158
- this.listeners[event].set(callback, c);
159
- break;
160
- case "REQUEST_SELL_SCREEN_OPTIONS":
161
- c = new RequestSellScreenOptions(callback);
162
- this.listeners[event].set(callback, c);
163
- break;
164
- case "INTERNAL_PAGE_MESSAGE":
165
- c = new InternalPageMessage(callback, this);
166
- this.listeners[event].set(callback, c);
167
- break;
168
- case "REGISTER_CHANGED":
169
- c = new RegisterChanged(callback);
170
- this.listeners[event].set(callback, c);
171
- break;
172
- case "REQUEST_CUSTOMER_LIST_OPTIONS":
173
- c = new RequestCustomerListOptions(callback);
174
- this.listeners[event].set(callback, c);
175
- break;
176
- case "FORMAT_INTEGRATED_PRODUCT":
177
- c = new FormatIntegratedProduct(callback);
178
- this.listeners[event].set(callback, c);
179
- break;
180
- case "REQUEST_SALE_KEYS":
181
- c = new RequestSaleKeys(callback);
182
- this.listeners[event].set(callback, c);
183
- break;
184
- case "SALE_COMPLETE":
185
- c = new SaleComplete(callback);
186
- this.listeners[event].set(callback, c);
187
- break;
188
- case "UI_PIPELINE":
189
- c = new UIPipeline(callback);
190
- this.listeners[event].set(callback, c);
191
- break;
192
- case "PAYMENT_METHODS_ENABLED":
193
- c = new PaymentMethodsEnabled(callback);
194
- this.listeners[event].set(callback, c);
195
- break;
196
- case "AUDIO_READY":
197
- c = new AudioReady(callback);
198
- this.listeners[event].set(callback, c);
199
- break;
200
- case "AUDIO_PERMISSION_CHANGE":
201
- c = new AudioPermissionChange(callback);
202
- this.listeners[event].set(callback, c);
203
- break;
204
- case "FULFILMENT_GET_ORDER":
205
- if (this.listeners[event].size !== 0) {
206
- throw new TypeError("Application already has 'FULFILMENT_GET_ORDER' event listener registered.");
207
- }
208
- c = new FulfilmentGetOrder(callback);
209
- this.listeners[event].set(callback, c);
210
- break;
211
- case "FULFILMENT_VOID_ORDER":
212
- c = new FulfilmentVoidOrder(callback);
213
- this.listeners[event].set(callback, c);
214
- break;
215
- case "FULFILMENT_PROCESS_ORDER":
216
- c = new FulfilmentProcessOrder(callback);
217
- this.listeners[event].set(callback, c);
218
- break;
219
- case "FULFILMENT_ORDER_APPROVAL":
220
- c = new FulfilmentOrderApproval(callback);
221
- this.listeners[event].set(callback, c);
222
- break;
223
- case "FULFILMENT_ORDER_COLLECTED":
224
- c = new FulfilmentCollectOrder(callback);
225
- this.listeners[event].set(callback, c);
226
- break;
227
- case "FULFILMENT_ORDER_COMPLETED":
228
- c = new FulfilmentCompleteOrder(callback);
229
- this.listeners[event].set(callback, c);
230
- break;
231
- case "GIFT_CARD_CODE_CHECK":
232
- c = new GiftCardCodeCheck(callback);
233
- this.listeners[event].set(callback, c);
234
- break;
235
- }
236
- if (typeof c === "undefined") {
237
- throw new TypeError(`${event} has not been defined`);
238
- }
239
- if (event === "READY" && this.isReady) {
240
- c = c;
241
- c.emit({
242
- outlet: this.outlet,
243
- register: this.register,
244
- user: this.user,
245
- });
246
- }
247
- }
248
- /**
249
- * @inheritDoc
250
- */
251
- removeEventListener(event, callback) {
252
- if (isDirectShopfrontEvent(event)) {
253
- this.directListeners[event]?.delete(callback);
254
- return;
255
- }
256
- this.listeners[event].delete(callback);
257
- }
258
105
  /**
259
106
  * @inheritDoc
260
107
  */
@@ -319,7 +166,6 @@ export class MockApplication extends BaseApplication {
319
166
  const payments = sale.getPayments();
320
167
  let totalPaid = 0;
321
168
  for (const payment of payments) {
322
- // TODO: Double check this is still the case
323
169
  if (payment.getCashout()) {
324
170
  return {
325
171
  success: false,
@@ -463,7 +309,7 @@ export class MockApplication extends BaseApplication {
463
309
  /**
464
310
  * Mocks an event being fired from Shopfront
465
311
  */
466
- fireEvent(event, ...data) {
312
+ async fireEvent(event, ...data) {
467
313
  let params;
468
314
  if (data.length > 0) {
469
315
  if (typeof data[0] === "object") {
@@ -474,9 +320,10 @@ export class MockApplication extends BaseApplication {
474
320
  else {
475
321
  params = data[0];
476
322
  }
477
- // We don't care about the Bridge parameter, as that is passed in by the `emit` method
323
+ // We don't care about the Bridge param in FromShopfront events, as that is passed in by the `emit` method
324
+ // Direct events do not pass in a second parameter
478
325
  }
479
- this.emit(event, params, "");
326
+ await this.emit(event, params, "");
480
327
  }
481
328
  ;
482
329
  }
@@ -19,7 +19,7 @@ export declare class MockBridge extends BaseBridge {
19
19
  /**
20
20
  * @inheritDoc
21
21
  */
22
- sendMessage(type: ApplicationEvents.ToShopfront, data?: unknown, id?: string): void;
22
+ sendMessage(type: ApplicationEvents.ToShopfront, data?: unknown, id?: string): Promise<void>;
23
23
  /**
24
24
  * @inheritDoc
25
25
  */
@@ -4,6 +4,8 @@ export class MockBridge extends BaseBridge {
4
4
  constructor(key, url) {
5
5
  super(key, url);
6
6
  this.isReady = false;
7
+ this.registerListeners();
8
+ this.sendMessage(ApplicationEvents.ToShopfront.READY);
7
9
  }
8
10
  /**
9
11
  * @inheritDoc
@@ -26,7 +28,7 @@ export class MockBridge extends BaseBridge {
26
28
  /**
27
29
  * @inheritDoc
28
30
  */
29
- sendMessage(type, data, id) {
31
+ async sendMessage(type, data, id) {
30
32
  if (type === ApplicationEvents.ToShopfront.READY) {
31
33
  if (typeof data !== "undefined") {
32
34
  throw new TypeError("The `data` parameter must be undefined when requesting ready state");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shopfront/bridge",
3
- "version": "2.0.1",
3
+ "version": "2.0.4",
4
4
  "main": "./lib/index.js",
5
5
  "license": "ISC",
6
6
  "description": "The bridge used to embed your application within Shopfront",
@@ -1,10 +0,0 @@
1
- <component name="ProjectCodeStyleConfiguration">
2
- <code_scheme name="Project" version="173">
3
- <JSCodeStyleSettings version="0">
4
- <option name="FORCE_SEMICOLON_STYLE" value="true" />
5
- </JSCodeStyleSettings>
6
- <TypeScriptCodeStyleSettings version="0">
7
- <option name="FORCE_SEMICOLON_STYLE" value="true" />
8
- </TypeScriptCodeStyleSettings>
9
- </code_scheme>
10
- </component>
@@ -1,5 +0,0 @@
1
- <component name="ProjectCodeStyleConfiguration">
2
- <state>
3
- <option name="USE_PER_PROJECT_SETTINGS" value="true" />
4
- </state>
5
- </component>
@@ -1,6 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="GitToolBoxBlameSettings">
4
- <option name="version" value="2" />
5
- </component>
6
- </project>
@@ -1,15 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="GitToolBoxProjectSettings">
4
- <option name="commitMessageIssueKeyValidationOverride">
5
- <BoolValueOverride>
6
- <option name="enabled" value="true" />
7
- </BoolValueOverride>
8
- </option>
9
- <option name="commitMessageValidationEnabledOverride">
10
- <BoolValueOverride>
11
- <option name="enabled" value="true" />
12
- </BoolValueOverride>
13
- </option>
14
- </component>
15
- </project>
@@ -1,11 +0,0 @@
1
- <component name="InspectionProjectProfileManager">
2
- <profile version="1.0">
3
- <option name="myName" value="Project Default" />
4
- <inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
5
- <inspection_tool class="ImplicitTypeConversion" enabled="true" level="WARNING" enabled_by_default="true">
6
- <option name="BITS" value="1720" />
7
- <option name="FLAG_EXPLICIT_CONVERSION" value="true" />
8
- <option name="IGNORE_NODESET_TO_BOOLEAN_VIA_STRING" value="true" />
9
- </inspection_tool>
10
- </profile>
11
- </component>
@@ -1,6 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="EslintConfiguration">
4
- <option name="fix-on-save" value="true" />
5
- </component>
6
- </project>
package/.idea/misc.xml DELETED
@@ -1,6 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="TaskProjectConfiguration">
4
- <server type="JIRA" url="https://onshopfront.atlassian.net" />
5
- </component>
6
- </project>
package/.idea/modules.xml DELETED
@@ -1,8 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="ProjectModuleManager">
4
- <modules>
5
- <module fileurl="file://$PROJECT_DIR$/.idea/shopfront-embedded-bridge.iml" filepath="$PROJECT_DIR$/.idea/shopfront-embedded-bridge.iml" />
6
- </modules>
7
- </component>
8
- </project>
package/.idea/php.xml DELETED
@@ -1,33 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="MessDetectorOptionsConfiguration">
4
- <option name="transferred" value="true" />
5
- </component>
6
- <component name="PHPCSFixerOptionsConfiguration">
7
- <option name="transferred" value="true" />
8
- </component>
9
- <component name="PHPCodeSnifferOptionsConfiguration">
10
- <option name="transferred" value="true" />
11
- </component>
12
- <component name="PhpCodeSniffer">
13
- <phpcs_settings>
14
- <phpcs_by_interpreter asDefaultInterpreter="true" interpreter_id="bb870563-23b2-4cfc-9ac5-70a3316d78e5" timeout="30000" />
15
- </phpcs_settings>
16
- </component>
17
- <component name="PhpStan">
18
- <PhpStan_settings>
19
- <phpstan_by_interpreter asDefaultInterpreter="true" interpreter_id="bb870563-23b2-4cfc-9ac5-70a3316d78e5" timeout="60000" />
20
- </PhpStan_settings>
21
- </component>
22
- <component name="PhpStanOptionsConfiguration">
23
- <option name="transferred" value="true" />
24
- </component>
25
- <component name="Psalm">
26
- <Psalm_settings>
27
- <psalm_fixer_by_interpreter asDefaultInterpreter="true" interpreter_id="bb870563-23b2-4cfc-9ac5-70a3316d78e5" timeout="60000" />
28
- </Psalm_settings>
29
- </component>
30
- <component name="PsalmOptionsConfiguration">
31
- <option name="transferred" value="true" />
32
- </component>
33
- </project>
@@ -1,10 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <module type="WEB_MODULE" version="4">
3
- <component name="NewModuleRootManager">
4
- <content url="file://$MODULE_DIR$">
5
- <excludeFolder url="file://$MODULE_DIR$/lib" />
6
- </content>
7
- <orderEntry type="inheritedJdk" />
8
- <orderEntry type="sourceFolder" forTests="false" />
9
- </component>
10
- </module>
package/.idea/vcs.xml DELETED
@@ -1,6 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="VcsDirectoryMappings">
4
- <mapping directory="$PROJECT_DIR$" vcs="Git" />
5
- </component>
6
- </project>