@labdigital/commercetools-mock 2.17.1 → 2.18.1

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 (180) hide show
  1. package/dist/index.cjs +4351 -4099
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +266 -413
  4. package/dist/index.d.ts +266 -413
  5. package/dist/index.js +4351 -4099
  6. package/dist/index.js.map +1 -1
  7. package/package.json +47 -47
  8. package/src/constants.ts +2 -2
  9. package/src/ctMock.test.ts +11 -11
  10. package/src/ctMock.ts +141 -127
  11. package/src/deprecation.ts +8 -0
  12. package/src/exceptions.ts +17 -15
  13. package/src/helpers.ts +32 -32
  14. package/src/index.test.ts +128 -128
  15. package/src/index.ts +3 -3
  16. package/src/lib/expandParser.ts +13 -13
  17. package/src/lib/haversine.test.ts +9 -9
  18. package/src/lib/haversine.ts +11 -11
  19. package/src/lib/masking.ts +11 -11
  20. package/src/lib/parser.ts +2 -2
  21. package/src/lib/password.ts +23 -3
  22. package/src/lib/predicateParser.test.ts +185 -183
  23. package/src/lib/predicateParser.ts +234 -234
  24. package/src/lib/projectionSearchFilter.test.ts +103 -101
  25. package/src/lib/projectionSearchFilter.ts +152 -150
  26. package/src/lib/proxy.ts +5 -5
  27. package/src/oauth/errors.ts +4 -4
  28. package/src/oauth/helpers.ts +6 -6
  29. package/src/oauth/server.test.ts +86 -86
  30. package/src/oauth/server.ts +158 -144
  31. package/src/oauth/store.ts +44 -43
  32. package/src/priceSelector.test.ts +35 -35
  33. package/src/priceSelector.ts +30 -30
  34. package/src/product-projection-search.ts +136 -134
  35. package/src/projectAPI.test.ts +7 -7
  36. package/src/projectAPI.ts +24 -22
  37. package/src/repositories/abstract.ts +168 -116
  38. package/src/repositories/associate-role.ts +90 -77
  39. package/src/repositories/attribute-group.ts +51 -40
  40. package/src/repositories/business-unit.ts +168 -148
  41. package/src/repositories/cart/actions.ts +489 -0
  42. package/src/repositories/cart/helpers.ts +30 -0
  43. package/src/repositories/cart/index.ts +180 -0
  44. package/src/repositories/cart-discount/actions.ts +148 -0
  45. package/src/repositories/cart-discount/index.ts +86 -0
  46. package/src/repositories/category/actions.ts +231 -0
  47. package/src/repositories/category/index.ts +52 -0
  48. package/src/repositories/channel.ts +88 -90
  49. package/src/repositories/custom-object.ts +46 -45
  50. package/src/repositories/customer/actions.ts +165 -0
  51. package/src/repositories/customer/index.ts +79 -0
  52. package/src/repositories/customer-group.ts +66 -55
  53. package/src/repositories/discount-code/actions.ts +149 -0
  54. package/src/repositories/discount-code/index.ts +50 -0
  55. package/src/repositories/errors.ts +10 -10
  56. package/src/repositories/extension.ts +64 -62
  57. package/src/repositories/helpers.ts +117 -118
  58. package/src/repositories/index.ts +80 -79
  59. package/src/repositories/inventory-entry/actions.ts +84 -0
  60. package/src/repositories/inventory-entry/index.ts +44 -0
  61. package/src/repositories/my-customer.ts +114 -0
  62. package/src/repositories/my-order.ts +8 -8
  63. package/src/repositories/order/actions.ts +281 -0
  64. package/src/repositories/{order.test.ts → order/index.test.ts} +77 -77
  65. package/src/repositories/order/index.ts +260 -0
  66. package/src/repositories/order-edit.ts +10 -23
  67. package/src/repositories/payment/actions.ts +305 -0
  68. package/src/repositories/payment/helpers.ts +17 -0
  69. package/src/repositories/payment/index.ts +56 -0
  70. package/src/repositories/product/actions.ts +943 -0
  71. package/src/repositories/product/helpers.ts +98 -0
  72. package/src/repositories/product/index.ts +130 -0
  73. package/src/repositories/product-discount.ts +127 -117
  74. package/src/repositories/product-projection.ts +56 -62
  75. package/src/repositories/product-selection.ts +31 -28
  76. package/src/repositories/product-type.ts +136 -134
  77. package/src/repositories/project.ts +133 -118
  78. package/src/repositories/quote-request.ts +7 -19
  79. package/src/repositories/quote.ts +7 -22
  80. package/src/repositories/review.ts +13 -26
  81. package/src/repositories/shipping-method/actions.ts +198 -0
  82. package/src/repositories/shipping-method/helpers.ts +10 -0
  83. package/src/repositories/shipping-method/index.ts +138 -0
  84. package/src/repositories/shopping-list/actions.ts +295 -0
  85. package/src/repositories/shopping-list/index.ts +122 -0
  86. package/src/repositories/staged-quote.ts +7 -20
  87. package/src/repositories/standalone-price.ts +57 -44
  88. package/src/repositories/state.ts +113 -68
  89. package/src/repositories/store.ts +106 -94
  90. package/src/repositories/subscription.ts +46 -22
  91. package/src/repositories/tax-category/actions.ts +94 -0
  92. package/src/repositories/tax-category/helpers.ts +8 -0
  93. package/src/repositories/tax-category/index.ts +25 -0
  94. package/src/repositories/type/actions.ts +162 -0
  95. package/src/repositories/type/index.ts +24 -0
  96. package/src/repositories/zone.ts +62 -58
  97. package/src/schemas/update-request.ts +12 -0
  98. package/src/server.ts +9 -9
  99. package/src/services/abstract.ts +85 -72
  100. package/src/services/associate-roles.test.ts +27 -27
  101. package/src/services/associate-roles.ts +7 -7
  102. package/src/services/attribute-group.ts +7 -7
  103. package/src/services/business-units.test.ts +28 -28
  104. package/src/services/business-units.ts +7 -7
  105. package/src/services/cart-discount.test.ts +199 -199
  106. package/src/services/cart-discount.ts +7 -7
  107. package/src/services/cart.test.ts +261 -261
  108. package/src/services/cart.ts +22 -21
  109. package/src/services/category.test.ts +121 -121
  110. package/src/services/category.ts +7 -7
  111. package/src/services/channel.ts +7 -7
  112. package/src/services/custom-object.test.ts +130 -130
  113. package/src/services/custom-object.ts +34 -31
  114. package/src/services/customer-group.ts +7 -7
  115. package/src/services/customer.test.ts +205 -205
  116. package/src/services/customer.ts +23 -36
  117. package/src/services/discount-code.ts +7 -7
  118. package/src/services/extension.ts +7 -7
  119. package/src/services/index.ts +85 -81
  120. package/src/services/inventory-entry.test.ts +106 -106
  121. package/src/services/inventory-entry.ts +7 -7
  122. package/src/services/my-cart.test.ts +56 -56
  123. package/src/services/my-cart.ts +20 -20
  124. package/src/services/my-customer.test.ts +155 -104
  125. package/src/services/my-customer.ts +66 -75
  126. package/src/services/my-order.ts +16 -16
  127. package/src/services/my-payment.test.ts +40 -40
  128. package/src/services/my-payment.ts +7 -7
  129. package/src/services/my-shopping-list.ts +7 -7
  130. package/src/services/order.test.ts +243 -243
  131. package/src/services/order.ts +23 -18
  132. package/src/services/payment.test.ts +40 -40
  133. package/src/services/payment.ts +7 -7
  134. package/src/services/product-discount.ts +7 -7
  135. package/src/services/product-projection.test.ts +190 -190
  136. package/src/services/product-projection.ts +34 -32
  137. package/src/services/product-selection.test.ts +19 -19
  138. package/src/services/product-selection.ts +7 -7
  139. package/src/services/product-type.test.ts +38 -38
  140. package/src/services/product-type.ts +7 -7
  141. package/src/services/product.test.ts +658 -656
  142. package/src/services/product.ts +7 -7
  143. package/src/services/project.test.ts +29 -24
  144. package/src/services/project.ts +22 -17
  145. package/src/services/reviews.ts +7 -7
  146. package/src/services/shipping-method.test.ts +78 -78
  147. package/src/services/shipping-method.ts +16 -16
  148. package/src/services/shopping-list.test.ts +170 -170
  149. package/src/services/shopping-list.ts +7 -7
  150. package/src/services/standalone-price.test.ts +112 -112
  151. package/src/services/standalone-price.ts +7 -7
  152. package/src/services/state.test.ts +30 -30
  153. package/src/services/state.ts +7 -7
  154. package/src/services/store.test.ts +40 -40
  155. package/src/services/store.ts +7 -7
  156. package/src/services/subscription.ts +7 -7
  157. package/src/services/tax-category.test.ts +43 -43
  158. package/src/services/tax-category.ts +7 -7
  159. package/src/services/type.ts +7 -7
  160. package/src/services/zone.ts +7 -7
  161. package/src/shippingCalculator.test.ts +43 -43
  162. package/src/shippingCalculator.ts +23 -23
  163. package/src/storage/abstract.ts +36 -34
  164. package/src/storage/in-memory.ts +237 -233
  165. package/src/storage/index.ts +2 -2
  166. package/src/types.ts +91 -91
  167. package/src/validate.ts +18 -0
  168. package/src/repositories/cart-discount.ts +0 -219
  169. package/src/repositories/cart.ts +0 -659
  170. package/src/repositories/category.ts +0 -256
  171. package/src/repositories/customer.ts +0 -228
  172. package/src/repositories/discount-code.ts +0 -181
  173. package/src/repositories/inventory-entry.ts +0 -109
  174. package/src/repositories/order.ts +0 -514
  175. package/src/repositories/payment.ts +0 -342
  176. package/src/repositories/product.ts +0 -1106
  177. package/src/repositories/shipping-method.ts +0 -312
  178. package/src/repositories/shopping-list.ts +0 -392
  179. package/src/repositories/tax-category.ts +0 -111
  180. package/src/repositories/type.ts +0 -172
package/src/helpers.ts CHANGED
@@ -1,79 +1,79 @@
1
- import { OutgoingHttpHeaders } from 'node:http'
2
- import { ParsedQs } from 'qs'
3
- import { v4 as uuidv4 } from 'uuid'
1
+ import { OutgoingHttpHeaders } from "node:http";
2
+ import { ParsedQs } from "qs";
3
+ import { v4 as uuidv4 } from "uuid";
4
4
 
5
5
  export const getBaseResourceProperties = () => ({
6
6
  id: uuidv4(),
7
7
  createdAt: new Date().toISOString(),
8
8
  lastModifiedAt: new Date().toISOString(),
9
9
  version: 0,
10
- })
10
+ });
11
11
 
12
12
  /**
13
13
  * Do a nested lookup by using a path. For example `foo.bar.value` will
14
14
  * return obj['foo']['bar']['value']
15
15
  */
16
16
  export const nestedLookup = (obj: any, path: string): any => {
17
- if (!path || path === '') {
18
- return obj
17
+ if (!path || path === "") {
18
+ return obj;
19
19
  }
20
20
 
21
- const parts = path.split('.')
22
- let val = obj
21
+ const parts = path.split(".");
22
+ let val = obj;
23
23
 
24
24
  for (let i = 0; i < parts.length; i++) {
25
- const part = parts[i]
25
+ const part = parts[i];
26
26
  if (val == undefined) {
27
- return undefined
27
+ return undefined;
28
28
  }
29
29
 
30
- val = val[part]
30
+ val = val[part];
31
31
  }
32
32
 
33
- return val
34
- }
33
+ return val;
34
+ };
35
35
 
36
36
  export const queryParamsArray = (
37
- input: string | ParsedQs | string[] | ParsedQs[] | undefined
37
+ input: string | ParsedQs | string[] | ParsedQs[] | undefined,
38
38
  ): string[] | undefined => {
39
39
  if (input == undefined) {
40
- return undefined
40
+ return undefined;
41
41
  }
42
42
 
43
43
  const values: string[] = Array.isArray(input)
44
44
  ? (input as string[])
45
- : ([input] as string[])
45
+ : ([input] as string[]);
46
46
  if (values.length < 1) {
47
- return undefined
47
+ return undefined;
48
48
  }
49
- return values
50
- }
49
+ return values;
50
+ };
51
51
 
52
52
  export const queryParamsValue = (
53
- value: string | ParsedQs | string[] | ParsedQs[] | undefined
53
+ value: string | ParsedQs | string[] | ParsedQs[] | undefined,
54
54
  ): string | undefined => {
55
- const values = queryParamsArray(value)
55
+ const values = queryParamsArray(value);
56
56
  if (values && values.length > 0) {
57
- return values[0]
57
+ return values[0];
58
58
  }
59
- return undefined
60
- }
59
+ return undefined;
60
+ };
61
61
 
62
- export const cloneObject = <T>(o: T): T => JSON.parse(JSON.stringify(o))
62
+ export const cloneObject = <T>(o: T): T => JSON.parse(JSON.stringify(o));
63
63
 
64
64
  export const mapHeaderType = (
65
- outgoingHttpHeaders: OutgoingHttpHeaders
65
+ outgoingHttpHeaders: OutgoingHttpHeaders,
66
66
  ): HeadersInit => {
67
- const headersInit: HeadersInit = {}
67
+ const headersInit: HeadersInit = {};
68
68
  for (const key in outgoingHttpHeaders) {
69
- const value = outgoingHttpHeaders[key]
69
+ const value = outgoingHttpHeaders[key];
70
70
  if (Array.isArray(value)) {
71
71
  // Join multiple values for the same header with a comma
72
- headersInit[key] = value.join(', ')
72
+ headersInit[key] = value.join(", ");
73
73
  } else if (value !== undefined) {
74
74
  // Single value or undefined
75
- headersInit[key] = value.toString()
75
+ headersInit[key] = value.toString();
76
76
  }
77
77
  }
78
- return headersInit
79
- }
78
+ return headersInit;
79
+ };
package/src/index.test.ts CHANGED
@@ -1,238 +1,238 @@
1
- import { type InvalidTokenError } from '@commercetools/platform-sdk'
2
- import { CommercetoolsMock } from './index.js'
3
- import { expect, test } from 'vitest'
4
- import got from 'got'
1
+ import { type InvalidTokenError } from "@commercetools/platform-sdk";
2
+ import got from "got";
3
+ import { expect, test } from "vitest";
4
+ import { CommercetoolsMock } from "./index";
5
5
 
6
- test('node:fetch client', async () => {
6
+ test("node:fetch client", async () => {
7
7
  const ctMock = new CommercetoolsMock({
8
8
  enableAuthentication: true,
9
9
  validateCredentials: true,
10
- apiHost: 'https://localhost',
11
- authHost: 'https://localhost:8080',
12
- })
13
- ctMock.start()
14
-
15
- const authHeader = 'Basic ' + Buffer.from('foo:bar').toString('base64')
16
- let response = await fetch('https://localhost:8080/oauth/token', {
17
- method: 'POST',
10
+ apiHost: "https://localhost",
11
+ authHost: "https://localhost:8080",
12
+ });
13
+ ctMock.start();
14
+
15
+ const authHeader = "Basic " + Buffer.from("foo:bar").toString("base64");
16
+ let response = await fetch("https://localhost:8080/oauth/token", {
17
+ method: "POST",
18
18
  headers: {
19
- 'Content-Type': 'application/x-www-form-urlencoded',
20
- Authorization: authHeader,
19
+ "Content-Type": "application/x-www-form-urlencoded",
20
+ "Authorization": authHeader,
21
21
  },
22
22
  body: new URLSearchParams({
23
- grant_type: 'client_credentials',
24
- scope: 'manage_project:commercetools-node-mock',
23
+ grant_type: "client_credentials",
24
+ scope: "manage_project:commercetools-node-mock",
25
25
  }),
26
- })
26
+ });
27
27
 
28
- const authBody = await response.json()
29
- expect(response.status).toBe(200)
28
+ const authBody = await response.json();
29
+ expect(response.status).toBe(200);
30
30
 
31
- const token = authBody.access_token
32
- response = await fetch('https://localhost/my-project/orders', {
31
+ const token = authBody.access_token;
32
+ response = await fetch("https://localhost/my-project/orders", {
33
33
  headers: {
34
34
  Authorization: `Bearer ${token}`,
35
35
  },
36
- })
36
+ });
37
37
 
38
- const body = await response.json()
39
- expect(response.status).toBe(200)
38
+ const body = await response.json();
39
+ expect(response.status).toBe(200);
40
40
  expect(body).toStrictEqual({
41
41
  count: 0,
42
42
  total: 0,
43
43
  offset: 0,
44
44
  limit: 20,
45
45
  results: [],
46
- })
47
- ctMock.stop()
48
- })
46
+ });
47
+ ctMock.stop();
48
+ });
49
49
 
50
- test('got client', async () => {
50
+ test("got client", async () => {
51
51
  const ctMock = new CommercetoolsMock({
52
52
  enableAuthentication: true,
53
53
  validateCredentials: true,
54
- apiHost: 'https://localhost',
55
- authHost: 'https://localhost:8080',
56
- })
57
- ctMock.start()
54
+ apiHost: "https://localhost",
55
+ authHost: "https://localhost:8080",
56
+ });
57
+ ctMock.start();
58
58
 
59
59
  let response = await got.post<{ access_token: string }>(
60
- 'https://localhost:8080/oauth/token',
60
+ "https://localhost:8080/oauth/token",
61
61
  {
62
62
  searchParams: {
63
- grant_type: 'client_credentials',
64
- scope: 'manage_project:commercetools-node-mock',
63
+ grant_type: "client_credentials",
64
+ scope: "manage_project:commercetools-node-mock",
65
65
  },
66
- username: 'foo',
67
- password: 'bar',
68
- responseType: 'json',
69
- }
70
- )
71
- expect(response.statusCode).toBe(200)
72
-
73
- const token = response.body.access_token
74
- expect(response.body.access_token).toBeDefined()
75
- response = await got.get('https://localhost/my-project/orders', {
66
+ username: "foo",
67
+ password: "bar",
68
+ responseType: "json",
69
+ },
70
+ );
71
+ expect(response.statusCode).toBe(200);
72
+
73
+ const token = response.body.access_token;
74
+ expect(response.body.access_token).toBeDefined();
75
+ response = await got.get("https://localhost/my-project/orders", {
76
76
  headers: {
77
77
  Authorization: `Bearer ${token}`,
78
78
  },
79
- responseType: 'json',
80
- })
81
- expect(response.statusCode).toBe(200)
79
+ responseType: "json",
80
+ });
81
+ expect(response.statusCode).toBe(200);
82
82
  expect(response.body).toStrictEqual({
83
83
  count: 0,
84
84
  total: 0,
85
85
  offset: 0,
86
86
  limit: 20,
87
87
  results: [],
88
- })
89
- ctMock.stop()
90
- })
88
+ });
89
+ ctMock.stop();
90
+ });
91
91
 
92
- test('Options.validateCredentials: true (error)', async () => {
92
+ test("Options.validateCredentials: true (error)", async () => {
93
93
  const ctMock = new CommercetoolsMock({
94
94
  enableAuthentication: true,
95
95
  validateCredentials: true,
96
- })
97
- ctMock.start()
96
+ });
97
+ ctMock.start();
98
98
 
99
99
  const response = await got.get<InvalidTokenError>(
100
- 'https://api.europe-west1.gcp.commercetools.com/my-project/orders',
100
+ "https://api.europe-west1.gcp.commercetools.com/my-project/orders",
101
101
  {
102
102
  headers: {
103
103
  Authorization: `Bearer foobar`,
104
104
  },
105
- responseType: 'json',
105
+ responseType: "json",
106
106
  throwHttpErrors: false,
107
- }
108
- )
109
- expect(response.statusCode).toBe(401)
110
- expect(response.body.message).toBe('invalid_token')
111
- ctMock.stop()
112
- })
113
-
114
- test('Options.validateCredentials: false', async () => {
107
+ },
108
+ );
109
+ expect(response.statusCode).toBe(401);
110
+ expect(response.body.message).toBe("invalid_token");
111
+ ctMock.stop();
112
+ });
113
+
114
+ test("Options.validateCredentials: false", async () => {
115
115
  const ctMock = new CommercetoolsMock({
116
116
  enableAuthentication: true,
117
117
  validateCredentials: false,
118
- })
119
- ctMock.start()
118
+ });
119
+ ctMock.start();
120
120
 
121
121
  const response = await got.get(
122
- 'https://api.europe-west1.gcp.commercetools.com/my-project/orders',
122
+ "https://api.europe-west1.gcp.commercetools.com/my-project/orders",
123
123
  {
124
124
  headers: {
125
125
  Authorization: `Bearer foobar`,
126
126
  },
127
- responseType: 'json',
128
- }
129
- )
130
- expect(response.statusCode).toBe(200)
127
+ responseType: "json",
128
+ },
129
+ );
130
+ expect(response.statusCode).toBe(200);
131
131
  expect(response.body).toStrictEqual({
132
132
  count: 0,
133
133
  total: 0,
134
134
  offset: 0,
135
135
  limit: 20,
136
136
  results: [],
137
- })
138
- ctMock.stop()
139
- })
137
+ });
138
+ ctMock.stop();
139
+ });
140
140
 
141
- test('Options.enableAuthentication: false', async () => {
141
+ test("Options.enableAuthentication: false", async () => {
142
142
  const ctMock = new CommercetoolsMock({
143
143
  enableAuthentication: false,
144
144
  validateCredentials: false,
145
- })
146
- ctMock.start()
145
+ });
146
+ ctMock.start();
147
147
 
148
148
  const response = await got.get(
149
- 'https://api.europe-west1.gcp.commercetools.com/my-project/orders',
149
+ "https://api.europe-west1.gcp.commercetools.com/my-project/orders",
150
150
  {
151
- responseType: 'json',
152
- }
153
- )
154
- expect(response.statusCode).toBe(200)
151
+ responseType: "json",
152
+ },
153
+ );
154
+ expect(response.statusCode).toBe(200);
155
155
  expect(response.body).toStrictEqual({
156
156
  count: 0,
157
157
  total: 0,
158
158
  offset: 0,
159
159
  limit: 20,
160
160
  results: [],
161
- })
162
- ctMock.stop()
163
- })
161
+ });
162
+ ctMock.stop();
163
+ });
164
164
 
165
- test('Options.apiHost: is overridden is set', async () => {
165
+ test("Options.apiHost: is overridden is set", async () => {
166
166
  const ctMock = new CommercetoolsMock({
167
167
  enableAuthentication: false,
168
168
  validateCredentials: false,
169
- apiHost: 'http://api.localhost',
170
- })
171
- ctMock.start()
172
-
173
- const response = await got.get('http://api.localhost/my-project/orders', {
174
- responseType: 'json',
175
- })
176
- expect(response.statusCode).toBe(200)
169
+ apiHost: "http://api.localhost",
170
+ });
171
+ ctMock.start();
172
+
173
+ const response = await got.get("http://api.localhost/my-project/orders", {
174
+ responseType: "json",
175
+ });
176
+ expect(response.statusCode).toBe(200);
177
177
  expect(response.body).toStrictEqual({
178
178
  count: 0,
179
179
  total: 0,
180
180
  offset: 0,
181
181
  limit: 20,
182
182
  results: [],
183
- })
184
- ctMock.stop()
185
- })
183
+ });
184
+ ctMock.stop();
185
+ });
186
186
 
187
- test('Options.authHost: is set', async () => {
187
+ test("Options.authHost: is set", async () => {
188
188
  const ctMock = new CommercetoolsMock({
189
189
  enableAuthentication: true,
190
190
  validateCredentials: true,
191
- authHost: 'http://auth.localhost',
192
- })
193
- ctMock.start()
191
+ authHost: "http://auth.localhost",
192
+ });
193
+ ctMock.start();
194
194
 
195
195
  const response = await got.post<{ access_token: string }>(
196
- 'http://auth.localhost/oauth/token',
196
+ "http://auth.localhost/oauth/token",
197
197
  {
198
198
  searchParams: {
199
- grant_type: 'client_credentials',
200
- scope: 'manage_project:commercetools-node-mock',
199
+ grant_type: "client_credentials",
200
+ scope: "manage_project:commercetools-node-mock",
201
201
  },
202
- username: 'foo',
203
- password: 'bar',
204
- responseType: 'json',
205
- }
206
- )
207
- expect(response.statusCode).toBe(200)
208
-
209
- const token = response.body.access_token
210
- expect(token).toBeDefined()
211
- })
212
-
213
- test('apiHost mock proxy: querystring', async () => {
202
+ username: "foo",
203
+ password: "bar",
204
+ responseType: "json",
205
+ },
206
+ );
207
+ expect(response.statusCode).toBe(200);
208
+
209
+ const token = response.body.access_token;
210
+ expect(token).toBeDefined();
211
+ });
212
+
213
+ test("apiHost mock proxy: querystring", async () => {
214
214
  const ctMock = new CommercetoolsMock({
215
215
  enableAuthentication: false,
216
216
  validateCredentials: false,
217
- apiHost: 'http://api.localhost',
218
- })
219
- ctMock.start()
217
+ apiHost: "http://api.localhost",
218
+ });
219
+ ctMock.start();
220
220
 
221
- const response = await got.get('http://api.localhost/my-project/orders', {
222
- responseType: 'json',
221
+ const response = await got.get("http://api.localhost/my-project/orders", {
222
+ responseType: "json",
223
223
  searchParams: {
224
224
  where: 'orderNumber="foobar"',
225
- expand: 'custom.type',
225
+ expand: "custom.type",
226
226
  },
227
- })
227
+ });
228
228
 
229
- expect(response.statusCode).toBe(200)
229
+ expect(response.statusCode).toBe(200);
230
230
  expect(response.body).toStrictEqual({
231
231
  count: 0,
232
232
  total: 0,
233
233
  offset: 0,
234
234
  limit: 20,
235
235
  results: [],
236
- })
237
- ctMock.stop()
238
- })
236
+ });
237
+ ctMock.stop();
238
+ });
package/src/index.ts CHANGED
@@ -1,8 +1,8 @@
1
- import { CommercetoolsMock, CommercetoolsMockOptions } from './ctMock.js'
2
- import { getBaseResourceProperties } from './helpers.js'
1
+ import { CommercetoolsMock, CommercetoolsMockOptions } from "./ctMock";
2
+ import { getBaseResourceProperties } from "./helpers";
3
3
 
4
4
  export {
5
5
  CommercetoolsMock,
6
6
  getBaseResourceProperties,
7
7
  type CommercetoolsMockOptions,
8
- }
8
+ };
@@ -7,28 +7,28 @@
7
7
  * TODO: implement support for multi-dimensional array
8
8
  */
9
9
  type ExpandResult = {
10
- element: string
11
- index?: string | number
12
- rest?: string
13
- }
10
+ element: string;
11
+ index?: string | number;
12
+ rest?: string;
13
+ };
14
14
 
15
15
  export const parseExpandClause = (clause: string): ExpandResult => {
16
16
  const result: ExpandResult = {
17
17
  element: clause,
18
18
  index: undefined,
19
19
  rest: undefined,
20
- }
20
+ };
21
21
 
22
- const pos = clause.indexOf('.')
22
+ const pos = clause.indexOf(".");
23
23
  if (pos > 0) {
24
- result.element = clause.substring(0, pos)
25
- result.rest = clause.substring(pos + 1)
24
+ result.element = clause.substring(0, pos);
25
+ result.rest = clause.substring(pos + 1);
26
26
  }
27
27
 
28
- const match = result.element.match(/\[([^\]+])]/)
28
+ const match = result.element.match(/\[([^\]+])]/);
29
29
  if (match) {
30
- result.index = match[1] === '*' ? '*' : parseInt(match[1], 10)
31
- result.element = result.element.substring(0, match.index)
30
+ result.index = match[1] === "*" ? "*" : parseInt(match[1], 10);
31
+ result.element = result.element.substring(0, match.index);
32
32
  }
33
- return result
34
- }
33
+ return result;
34
+ };
@@ -1,20 +1,20 @@
1
- import { expect, test } from 'vitest'
2
- import { haversineDistance, Location } from './haversine.js'
1
+ import { expect, test } from "vitest";
2
+ import { Location, haversineDistance } from "./haversine";
3
3
 
4
- test('haversine', () => {
4
+ test("haversine", () => {
5
5
  // Lab Digital
6
6
  const src: Location = {
7
7
  latitude: 5.110230209615395,
8
8
  longitude: 52.06969591642097,
9
- }
9
+ };
10
10
 
11
11
  // Dom Tower
12
12
  const dst: Location = {
13
13
  latitude: 5.121310867198959,
14
14
  longitude: 52.09068804569714,
15
- }
15
+ };
16
16
 
17
- const dist = haversineDistance(src, dst)
18
- expect(dist).toBeGreaterThan(2631)
19
- expect(dist).toBeLessThan(2632)
20
- })
17
+ const dist = haversineDistance(src, dst);
18
+ expect(dist).toBeGreaterThan(2631);
19
+ expect(dist).toBeLessThan(2632);
20
+ });
@@ -1,24 +1,24 @@
1
1
  export type Location = {
2
- latitude: number
3
- longitude: number
4
- }
2
+ latitude: number;
3
+ longitude: number;
4
+ };
5
5
 
6
6
  /**
7
7
  * Returns the distance between src and dst as meters
8
8
  */
9
9
  export const haversineDistance = (src: Location, dst: Location) => {
10
- const RADIUS_OF_EARTH_IN_KM = 6371
11
- const toRadian = (deg: number) => deg * (Math.PI / 180)
10
+ const RADIUS_OF_EARTH_IN_KM = 6371;
11
+ const toRadian = (deg: number) => deg * (Math.PI / 180);
12
12
 
13
- const dLat = toRadian(dst.latitude - src.latitude)
14
- const dLon = toRadian(dst.longitude - src.longitude)
13
+ const dLat = toRadian(dst.latitude - src.latitude);
14
+ const dLon = toRadian(dst.longitude - src.longitude);
15
15
 
16
16
  const a =
17
17
  Math.sin(dLat / 2) * Math.sin(dLat / 2) +
18
18
  Math.cos(toRadian(src.latitude)) *
19
19
  Math.cos(toRadian(dst.latitude)) *
20
20
  Math.sin(dLon / 2) *
21
- Math.sin(dLon / 2)
22
- const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))
23
- return RADIUS_OF_EARTH_IN_KM * c * 1000
24
- }
21
+ Math.sin(dLon / 2);
22
+ const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
23
+ return RADIUS_OF_EARTH_IN_KM * c * 1000;
24
+ };
@@ -1,22 +1,22 @@
1
- import { cloneObject } from '../helpers.js'
1
+ import { cloneObject } from "../helpers";
2
2
 
3
3
  export const maskSecretValue = <T>(resource: T, path: string): T => {
4
- const parts = path.split('.')
5
- const clone = cloneObject(resource) as any
6
- let val = clone
4
+ const parts = path.split(".");
5
+ const clone = cloneObject(resource) as any;
6
+ let val = clone;
7
7
 
8
- const target = parts.pop()
8
+ const target = parts.pop();
9
9
  for (let i = 0; i < parts.length; i++) {
10
- const part = parts[i]
11
- val = val[part]
10
+ const part = parts[i];
11
+ val = val[part];
12
12
 
13
13
  if (val === undefined) {
14
- return resource
14
+ return resource;
15
15
  }
16
16
  }
17
17
 
18
18
  if (val && target && val[target]) {
19
- val[target] = '****'
19
+ val[target] = "****";
20
20
  }
21
- return clone
22
- }
21
+ return clone;
22
+ };
package/src/lib/parser.ts CHANGED
@@ -1,2 +1,2 @@
1
- export { Lexer } from '~vendor/perplex/lexer.js'
2
- export { Parser, type ITokenPosition } from '~vendor/pratt/index.js'
1
+ export { Lexer } from "~vendor/perplex/lexer";
2
+ export { Parser, type ITokenPosition } from "~vendor/pratt";
@@ -1,7 +1,27 @@
1
+ import { Customer } from "@commercetools/platform-sdk";
2
+ import { v4 as uuidv4 } from "uuid";
3
+
4
+ const PWRESET_SECRET = "pwreset";
5
+
1
6
  export const validatePassword = (
2
7
  clearPassword: string,
3
- hashedPassword: string
4
- ) => hashPassword(clearPassword) === hashedPassword
8
+ hashedPassword: string,
9
+ ) => hashPassword(clearPassword) === hashedPassword;
5
10
 
6
11
  export const hashPassword = (clearPassword: string) =>
7
- Buffer.from(clearPassword).toString('base64')
12
+ Buffer.from(clearPassword).toString("base64");
13
+
14
+ export const createPasswordResetToken = (customer: Customer) =>
15
+ Buffer.from(`${customer.id}:${PWRESET_SECRET}:${uuidv4()}`).toString(
16
+ "base64",
17
+ );
18
+
19
+ export const validatePasswordResetToken = (token: string) => {
20
+ const items = Buffer.from(token, "base64").toString("utf-8").split(":");
21
+ const [customerId, secret] = items;
22
+ if (secret !== PWRESET_SECRET) {
23
+ return undefined;
24
+ }
25
+
26
+ return customerId;
27
+ };