@labdigital/commercetools-mock 1.5.0 → 1.6.0

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 (129) hide show
  1. package/README.md +5 -4
  2. package/dist/index.cjs +105 -17
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.d.cts +29 -7
  5. package/dist/index.d.ts +29 -7
  6. package/dist/index.js +105 -17
  7. package/dist/index.js.map +1 -1
  8. package/package.json +4 -3
  9. package/src/constants.ts +2 -2
  10. package/src/ctMock.ts +176 -176
  11. package/src/exceptions.ts +10 -10
  12. package/src/helpers.ts +26 -26
  13. package/src/index.test.ts +173 -173
  14. package/src/index.ts +3 -3
  15. package/src/lib/expandParser.ts +19 -19
  16. package/src/lib/haversine.test.ts +13 -13
  17. package/src/lib/haversine.ts +14 -14
  18. package/src/lib/masking.ts +15 -15
  19. package/src/lib/parser.ts +2 -2
  20. package/src/lib/predicateParser.test.ts +204 -204
  21. package/src/lib/predicateParser.ts +398 -398
  22. package/src/lib/projectionSearchFilter.test.ts +168 -168
  23. package/src/lib/projectionSearchFilter.ts +272 -269
  24. package/src/lib/proxy.ts +8 -8
  25. package/src/oauth/errors.ts +4 -4
  26. package/src/oauth/helpers.ts +6 -6
  27. package/src/oauth/server.ts +103 -101
  28. package/src/oauth/store.ts +27 -27
  29. package/src/priceSelector.test.ts +68 -68
  30. package/src/priceSelector.ts +70 -70
  31. package/src/product-projection-search.ts +296 -296
  32. package/src/projectAPI.test.ts +3 -3
  33. package/src/projectAPI.ts +46 -46
  34. package/src/repositories/abstract.ts +190 -190
  35. package/src/repositories/associate-role.ts +10 -7
  36. package/src/repositories/attribute-group.ts +63 -8
  37. package/src/repositories/business-unit.ts +10 -7
  38. package/src/repositories/cart-discount.ts +134 -134
  39. package/src/repositories/cart.ts +517 -514
  40. package/src/repositories/category.ts +170 -167
  41. package/src/repositories/channel.ts +114 -111
  42. package/src/repositories/custom-object.ts +66 -63
  43. package/src/repositories/customer-group.ts +72 -69
  44. package/src/repositories/customer.ts +90 -90
  45. package/src/repositories/discount-code.ts +171 -168
  46. package/src/repositories/errors.ts +15 -15
  47. package/src/repositories/extension.ts +79 -76
  48. package/src/repositories/helpers.ts +180 -180
  49. package/src/repositories/index.ts +39 -39
  50. package/src/repositories/inventory-entry.ts +98 -95
  51. package/src/repositories/my-order.ts +11 -11
  52. package/src/repositories/order-edit.ts +29 -29
  53. package/src/repositories/order.test.ts +191 -191
  54. package/src/repositories/order.ts +393 -393
  55. package/src/repositories/payment.ts +155 -155
  56. package/src/repositories/product-discount.ts +149 -149
  57. package/src/repositories/product-projection.ts +116 -52
  58. package/src/repositories/product-selection.ts +31 -31
  59. package/src/repositories/product-type.ts +156 -156
  60. package/src/repositories/product.ts +600 -597
  61. package/src/repositories/project.ts +136 -135
  62. package/src/repositories/quote-request.ts +19 -19
  63. package/src/repositories/quote.ts +19 -19
  64. package/src/repositories/review.ts +24 -24
  65. package/src/repositories/shipping-method.ts +217 -217
  66. package/src/repositories/shopping-list.ts +49 -49
  67. package/src/repositories/staged-quote.ts +20 -20
  68. package/src/repositories/standalone-price.ts +72 -61
  69. package/src/repositories/state.ts +84 -84
  70. package/src/repositories/store.ts +114 -114
  71. package/src/repositories/subscription.ts +40 -40
  72. package/src/repositories/tax-category.ts +98 -98
  73. package/src/repositories/type.ts +157 -157
  74. package/src/repositories/zone.ts +71 -71
  75. package/src/server.ts +2 -2
  76. package/src/services/abstract.ts +173 -173
  77. package/src/services/attribute-group.ts +16 -0
  78. package/src/services/cart-discount.ts +8 -8
  79. package/src/services/cart.test.ts +409 -409
  80. package/src/services/cart.ts +50 -50
  81. package/src/services/category.test.ts +25 -25
  82. package/src/services/category.ts +8 -8
  83. package/src/services/channel.ts +8 -8
  84. package/src/services/custom-object.test.ts +184 -184
  85. package/src/services/custom-object.ts +48 -48
  86. package/src/services/customer-group.ts +8 -8
  87. package/src/services/customer.test.ts +151 -151
  88. package/src/services/customer.ts +27 -27
  89. package/src/services/discount-code.ts +8 -8
  90. package/src/services/extension.ts +8 -8
  91. package/src/services/index.ts +52 -44
  92. package/src/services/inventory-entry.test.ts +162 -162
  93. package/src/services/inventory-entry.ts +8 -8
  94. package/src/services/my-cart.test.ts +78 -78
  95. package/src/services/my-cart.ts +28 -28
  96. package/src/services/my-customer.test.ts +44 -44
  97. package/src/services/my-customer.ts +53 -53
  98. package/src/services/my-order.ts +20 -20
  99. package/src/services/my-payment.test.ts +65 -65
  100. package/src/services/my-payment.ts +8 -8
  101. package/src/services/order.test.ts +527 -527
  102. package/src/services/order.ts +31 -31
  103. package/src/services/payment.test.ts +65 -65
  104. package/src/services/payment.ts +8 -8
  105. package/src/services/product-discount.ts +8 -8
  106. package/src/services/product-projection.test.ts +492 -428
  107. package/src/services/product-projection.ts +32 -18
  108. package/src/services/product-type.test.ts +56 -56
  109. package/src/services/product-type.ts +8 -8
  110. package/src/services/product.test.ts +510 -510
  111. package/src/services/product.ts +8 -8
  112. package/src/services/project.ts +34 -34
  113. package/src/services/shipping-method.test.ts +81 -81
  114. package/src/services/shipping-method.ts +12 -12
  115. package/src/services/shopping-list.ts +8 -8
  116. package/src/services/standalone-price.test.ts +256 -256
  117. package/src/services/standalone-price.ts +8 -8
  118. package/src/services/state.test.ts +42 -42
  119. package/src/services/state.ts +8 -8
  120. package/src/services/store.test.ts +57 -57
  121. package/src/services/store.ts +8 -8
  122. package/src/services/subscription.ts +8 -8
  123. package/src/services/tax-category.test.ts +61 -61
  124. package/src/services/tax-category.ts +8 -8
  125. package/src/services/type.ts +8 -8
  126. package/src/services/zone.ts +8 -8
  127. package/src/storage/abstract.ts +58 -58
  128. package/src/storage/in-memory.ts +419 -419
  129. package/src/types.ts +82 -82
@@ -1,81 +1,81 @@
1
1
  import type {
2
- Zone,
3
- ZoneAddLocationAction,
4
- ZoneChangeNameAction,
5
- ZoneDraft,
6
- ZoneRemoveLocationAction,
7
- ZoneSetDescriptionAction,
8
- ZoneSetKeyAction,
9
- ZoneUpdateAction,
2
+ Zone,
3
+ ZoneAddLocationAction,
4
+ ZoneChangeNameAction,
5
+ ZoneDraft,
6
+ ZoneRemoveLocationAction,
7
+ ZoneSetDescriptionAction,
8
+ ZoneSetKeyAction,
9
+ ZoneUpdateAction,
10
10
  } from '@commercetools/platform-sdk'
11
11
  import { getBaseResourceProperties } from '../helpers.js'
12
12
  import type { Writable } from '../types.js'
13
13
  import { AbstractResourceRepository, RepositoryContext } from './abstract.js'
14
14
 
15
15
  export class ZoneRepository extends AbstractResourceRepository<'zone'> {
16
- getTypeId() {
17
- return 'zone' as const
18
- }
16
+ getTypeId() {
17
+ return 'zone' as const
18
+ }
19
19
 
20
- create(context: RepositoryContext, draft: ZoneDraft): Zone {
21
- const resource: Zone = {
22
- ...getBaseResourceProperties(),
23
- key: draft.key,
24
- locations: draft.locations || [],
25
- name: draft.name,
26
- description: draft.description,
27
- }
28
- this.saveNew(context, resource)
29
- return resource
30
- }
20
+ create(context: RepositoryContext, draft: ZoneDraft): Zone {
21
+ const resource: Zone = {
22
+ ...getBaseResourceProperties(),
23
+ key: draft.key,
24
+ locations: draft.locations || [],
25
+ name: draft.name,
26
+ description: draft.description,
27
+ }
28
+ this.saveNew(context, resource)
29
+ return resource
30
+ }
31
31
 
32
- actions: Partial<
33
- Record<
34
- ZoneUpdateAction['action'],
35
- (
36
- context: RepositoryContext,
37
- resource: Writable<Zone>,
38
- action: any
39
- ) => void
40
- >
41
- > = {
42
- addLocation: (
43
- context: RepositoryContext,
44
- resource: Writable<Zone>,
45
- { location }: ZoneAddLocationAction
46
- ) => {
47
- resource.locations.push(location)
48
- },
49
- removeLocation: (
50
- context: RepositoryContext,
51
- resource: Writable<Zone>,
52
- { location }: ZoneRemoveLocationAction
53
- ) => {
54
- resource.locations = resource.locations.filter(
55
- (loc) =>
56
- !(loc.country === location.country && loc.state === location.state)
57
- )
58
- },
59
- changeName: (
60
- context: RepositoryContext,
61
- resource: Writable<Zone>,
62
- { name }: ZoneChangeNameAction
63
- ) => {
64
- resource.name = name
65
- },
66
- setDescription: (
67
- context: RepositoryContext,
68
- resource: Writable<Zone>,
69
- { description }: ZoneSetDescriptionAction
70
- ) => {
71
- resource.description = description
72
- },
73
- setKey: (
74
- context: RepositoryContext,
75
- resource: Writable<Zone>,
76
- { key }: ZoneSetKeyAction
77
- ) => {
78
- resource.key = key
79
- },
80
- }
32
+ actions: Partial<
33
+ Record<
34
+ ZoneUpdateAction['action'],
35
+ (
36
+ context: RepositoryContext,
37
+ resource: Writable<Zone>,
38
+ action: any
39
+ ) => void
40
+ >
41
+ > = {
42
+ addLocation: (
43
+ context: RepositoryContext,
44
+ resource: Writable<Zone>,
45
+ { location }: ZoneAddLocationAction
46
+ ) => {
47
+ resource.locations.push(location)
48
+ },
49
+ removeLocation: (
50
+ context: RepositoryContext,
51
+ resource: Writable<Zone>,
52
+ { location }: ZoneRemoveLocationAction
53
+ ) => {
54
+ resource.locations = resource.locations.filter(
55
+ (loc) =>
56
+ !(loc.country === location.country && loc.state === location.state)
57
+ )
58
+ },
59
+ changeName: (
60
+ context: RepositoryContext,
61
+ resource: Writable<Zone>,
62
+ { name }: ZoneChangeNameAction
63
+ ) => {
64
+ resource.name = name
65
+ },
66
+ setDescription: (
67
+ context: RepositoryContext,
68
+ resource: Writable<Zone>,
69
+ { description }: ZoneSetDescriptionAction
70
+ ) => {
71
+ resource.description = description
72
+ },
73
+ setKey: (
74
+ context: RepositoryContext,
75
+ resource: Writable<Zone>,
76
+ { key }: ZoneSetKeyAction
77
+ ) => {
78
+ resource.key = key
79
+ },
80
+ }
81
81
  }
package/src/server.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { CommercetoolsMock } from './index.js'
2
2
 
3
3
  process.on('SIGINT', function () {
4
- console.info('Stopping server...')
5
- process.exit()
4
+ console.info('Stopping server...')
5
+ process.exit()
6
6
  })
7
7
 
8
8
  const instance = new CommercetoolsMock()
@@ -5,177 +5,177 @@ import { AbstractResourceRepository } from '../repositories/abstract.js'
5
5
  import { getRepositoryContext } from '../repositories/helpers.js'
6
6
 
7
7
  export default abstract class AbstractService {
8
- protected abstract getBasePath(): string
9
- public abstract repository: AbstractResourceRepository<any>
10
-
11
- createStatusCode = 201
12
-
13
- constructor(parent: Router) {
14
- this.registerRoutes(parent)
15
- }
16
-
17
- extraRoutes(router: Router) {}
18
-
19
- registerRoutes(parent: Router) {
20
- const basePath = this.getBasePath()
21
- const router = Router({ mergeParams: true })
22
-
23
- // Bind this first since the `/:id` routes are currently a bit to greedy
24
- this.extraRoutes(router)
25
-
26
- router.get('/', this.get.bind(this))
27
- router.get('/key=:key', this.getWithKey.bind(this)) // same thing goes for the key routes
28
- router.get('/:id', this.getWithId.bind(this))
29
-
30
- router.delete('/key=:key', this.deleteWithKey.bind(this))
31
- router.delete('/:id', this.deleteWithId.bind(this))
32
-
33
- router.post('/', this.post.bind(this))
34
- router.post('/key=:key', this.postWithKey.bind(this))
35
- router.post('/:id', this.postWithId.bind(this))
36
-
37
- parent.use(`/${basePath}`, router)
38
- }
39
-
40
- get(request: Request, response: Response) {
41
- const limit = this._parseParam(request.query.limit)
42
- const offset = this._parseParam(request.query.offset)
43
-
44
- const result = this.repository.query(getRepositoryContext(request), {
45
- expand: this._parseParam(request.query.expand),
46
- where: this._parseParam(request.query.where),
47
- limit: limit !== undefined ? Number(limit) : undefined,
48
- offset: offset !== undefined ? Number(offset) : undefined,
49
- })
50
- return response.status(200).send(result)
51
- }
52
-
53
- getWithId(request: Request, response: Response) {
54
- const result = this._expandWithId(request, request.params['id'])
55
- if (!result) {
56
- return response.status(404).send()
57
- }
58
- return response.status(200).send(result)
59
- }
60
-
61
- getWithKey(request: Request, response: Response) {
62
- const result = this.repository.getByKey(
63
- getRepositoryContext(request),
64
- request.params['key'],
65
- { expand: this._parseParam(request.query.expand) }
66
- )
67
- if (!result) return response.status(404).send()
68
- return response.status(200).send(result)
69
- }
70
-
71
- deleteWithId(request: Request, response: Response) {
72
- const result = this.repository.delete(
73
- getRepositoryContext(request),
74
- request.params['id'],
75
- {
76
- expand: this._parseParam(request.query.expand),
77
- }
78
- )
79
- if (!result) {
80
- return response.status(404).send('Not found')
81
- }
82
- return response.status(200).send(result)
83
- }
84
-
85
- deleteWithKey(request: Request, response: Response) {
86
- const resource = this.repository.getByKey(
87
- getRepositoryContext(request),
88
- request.params['key']
89
- )
90
- if (!resource) {
91
- return response.status(404).send('Not found')
92
- }
93
-
94
- const result = this.repository.delete(
95
- getRepositoryContext(request),
96
- resource.id,
97
- {
98
- expand: this._parseParam(request.query.expand),
99
- }
100
- )
101
- if (!result) {
102
- return response.status(404).send('Not found')
103
- }
104
- return response.status(200).send(result)
105
- }
106
-
107
- post(request: Request, response: Response) {
108
- const draft = request.body
109
- const resource = this.repository.create(
110
- getRepositoryContext(request),
111
- draft
112
- )
113
- const result = this._expandWithId(request, resource.id)
114
- return response.status(this.createStatusCode).send(result)
115
- }
116
-
117
- postWithId(request: Request, response: Response) {
118
- const updateRequest: Update = request.body
119
- const resource = this.repository.get(
120
- getRepositoryContext(request),
121
- request.params['id']
122
- )
123
- if (!resource) {
124
- return response.status(404).send('Not found')
125
- }
126
-
127
- const updatedResource = this.repository.processUpdateActions(
128
- getRepositoryContext(request),
129
- resource,
130
- updateRequest.version,
131
- updateRequest.actions
132
- )
133
-
134
- const result = this._expandWithId(request, updatedResource.id)
135
- return response.status(200).send(result)
136
- }
137
-
138
- postWithKey(request: Request, response: Response) {
139
- const updateRequest: Update = request.body
140
- const resource = this.repository.getByKey(
141
- getRepositoryContext(request),
142
- request.params['key']
143
- )
144
- if (!resource) {
145
- return response.status(404).send('Not found')
146
- }
147
- const updatedResource = this.repository.processUpdateActions(
148
- getRepositoryContext(request),
149
- resource,
150
- updateRequest.version,
151
- updateRequest.actions
152
- )
153
-
154
- const result = this._expandWithId(request, updatedResource.id)
155
- return response.status(200).send(result)
156
- }
157
-
158
- protected _expandWithId(request: Request, resourceId: string) {
159
- const result = this.repository.get(
160
- getRepositoryContext(request),
161
- resourceId,
162
- {
163
- expand: this._parseParam(request.query.expand),
164
- }
165
- )
166
- return result
167
- }
168
-
169
- // No idea what i'm doing
170
- private _parseParam(
171
- value: string | ParsedQs | string[] | ParsedQs[] | undefined
172
- ): string[] | undefined {
173
- if (Array.isArray(value)) {
174
- // @ts-ignore
175
- return value
176
- } else if (value !== undefined) {
177
- return [`${value}`]
178
- }
179
- return undefined
180
- }
8
+ protected abstract getBasePath(): string
9
+ public abstract repository: AbstractResourceRepository<any>
10
+
11
+ createStatusCode = 201
12
+
13
+ constructor(parent: Router) {
14
+ this.registerRoutes(parent)
15
+ }
16
+
17
+ extraRoutes(router: Router) {}
18
+
19
+ registerRoutes(parent: Router) {
20
+ const basePath = this.getBasePath()
21
+ const router = Router({ mergeParams: true })
22
+
23
+ // Bind this first since the `/:id` routes are currently a bit to greedy
24
+ this.extraRoutes(router)
25
+
26
+ router.get('/', this.get.bind(this))
27
+ router.get('/key=:key', this.getWithKey.bind(this)) // same thing goes for the key routes
28
+ router.get('/:id', this.getWithId.bind(this))
29
+
30
+ router.delete('/key=:key', this.deleteWithKey.bind(this))
31
+ router.delete('/:id', this.deleteWithId.bind(this))
32
+
33
+ router.post('/', this.post.bind(this))
34
+ router.post('/key=:key', this.postWithKey.bind(this))
35
+ router.post('/:id', this.postWithId.bind(this))
36
+
37
+ parent.use(`/${basePath}`, router)
38
+ }
39
+
40
+ get(request: Request, response: Response) {
41
+ const limit = this._parseParam(request.query.limit)
42
+ const offset = this._parseParam(request.query.offset)
43
+
44
+ const result = this.repository.query(getRepositoryContext(request), {
45
+ expand: this._parseParam(request.query.expand),
46
+ where: this._parseParam(request.query.where),
47
+ limit: limit !== undefined ? Number(limit) : undefined,
48
+ offset: offset !== undefined ? Number(offset) : undefined,
49
+ })
50
+ return response.status(200).send(result)
51
+ }
52
+
53
+ getWithId(request: Request, response: Response) {
54
+ const result = this._expandWithId(request, request.params['id'])
55
+ if (!result) {
56
+ return response.status(404).send()
57
+ }
58
+ return response.status(200).send(result)
59
+ }
60
+
61
+ getWithKey(request: Request, response: Response) {
62
+ const result = this.repository.getByKey(
63
+ getRepositoryContext(request),
64
+ request.params['key'],
65
+ { expand: this._parseParam(request.query.expand) }
66
+ )
67
+ if (!result) return response.status(404).send()
68
+ return response.status(200).send(result)
69
+ }
70
+
71
+ deleteWithId(request: Request, response: Response) {
72
+ const result = this.repository.delete(
73
+ getRepositoryContext(request),
74
+ request.params['id'],
75
+ {
76
+ expand: this._parseParam(request.query.expand),
77
+ }
78
+ )
79
+ if (!result) {
80
+ return response.status(404).send('Not found')
81
+ }
82
+ return response.status(200).send(result)
83
+ }
84
+
85
+ deleteWithKey(request: Request, response: Response) {
86
+ const resource = this.repository.getByKey(
87
+ getRepositoryContext(request),
88
+ request.params['key']
89
+ )
90
+ if (!resource) {
91
+ return response.status(404).send('Not found')
92
+ }
93
+
94
+ const result = this.repository.delete(
95
+ getRepositoryContext(request),
96
+ resource.id,
97
+ {
98
+ expand: this._parseParam(request.query.expand),
99
+ }
100
+ )
101
+ if (!result) {
102
+ return response.status(404).send('Not found')
103
+ }
104
+ return response.status(200).send(result)
105
+ }
106
+
107
+ post(request: Request, response: Response) {
108
+ const draft = request.body
109
+ const resource = this.repository.create(
110
+ getRepositoryContext(request),
111
+ draft
112
+ )
113
+ const result = this._expandWithId(request, resource.id)
114
+ return response.status(this.createStatusCode).send(result)
115
+ }
116
+
117
+ postWithId(request: Request, response: Response) {
118
+ const updateRequest: Update = request.body
119
+ const resource = this.repository.get(
120
+ getRepositoryContext(request),
121
+ request.params['id']
122
+ )
123
+ if (!resource) {
124
+ return response.status(404).send('Not found')
125
+ }
126
+
127
+ const updatedResource = this.repository.processUpdateActions(
128
+ getRepositoryContext(request),
129
+ resource,
130
+ updateRequest.version,
131
+ updateRequest.actions
132
+ )
133
+
134
+ const result = this._expandWithId(request, updatedResource.id)
135
+ return response.status(200).send(result)
136
+ }
137
+
138
+ postWithKey(request: Request, response: Response) {
139
+ const updateRequest: Update = request.body
140
+ const resource = this.repository.getByKey(
141
+ getRepositoryContext(request),
142
+ request.params['key']
143
+ )
144
+ if (!resource) {
145
+ return response.status(404).send('Not found')
146
+ }
147
+ const updatedResource = this.repository.processUpdateActions(
148
+ getRepositoryContext(request),
149
+ resource,
150
+ updateRequest.version,
151
+ updateRequest.actions
152
+ )
153
+
154
+ const result = this._expandWithId(request, updatedResource.id)
155
+ return response.status(200).send(result)
156
+ }
157
+
158
+ protected _expandWithId(request: Request, resourceId: string) {
159
+ const result = this.repository.get(
160
+ getRepositoryContext(request),
161
+ resourceId,
162
+ {
163
+ expand: this._parseParam(request.query.expand),
164
+ }
165
+ )
166
+ return result
167
+ }
168
+
169
+ // No idea what i'm doing
170
+ protected _parseParam(
171
+ value: string | ParsedQs | string[] | ParsedQs[] | undefined
172
+ ): string[] | undefined {
173
+ if (Array.isArray(value)) {
174
+ // @ts-ignore
175
+ return value
176
+ } else if (value !== undefined) {
177
+ return [`${value}`]
178
+ }
179
+ return undefined
180
+ }
181
181
  }
@@ -0,0 +1,16 @@
1
+ import { Router } from 'express'
2
+ import AbstractService from './abstract.js'
3
+ import { AttributeGroupRepository } from '../repositories/attribute-group.js'
4
+
5
+ export class AttributeGroupService extends AbstractService {
6
+ public repository: AttributeGroupRepository
7
+
8
+ constructor(parent: Router, repository: AttributeGroupRepository) {
9
+ super(parent)
10
+ this.repository = repository
11
+ }
12
+
13
+ getBasePath() {
14
+ return 'attribute-groups'
15
+ }
16
+ }
@@ -3,14 +3,14 @@ import { CartDiscountRepository } from '../repositories/cart-discount.js'
3
3
  import AbstractService from './abstract.js'
4
4
 
5
5
  export class CartDiscountService extends AbstractService {
6
- public repository: CartDiscountRepository
6
+ public repository: CartDiscountRepository
7
7
 
8
- constructor(parent: Router, repository: CartDiscountRepository) {
9
- super(parent)
10
- this.repository = repository
11
- }
8
+ constructor(parent: Router, repository: CartDiscountRepository) {
9
+ super(parent)
10
+ this.repository = repository
11
+ }
12
12
 
13
- getBasePath() {
14
- return 'cart-discounts'
15
- }
13
+ getBasePath() {
14
+ return 'cart-discounts'
15
+ }
16
16
  }