@labdigital/commercetools-mock 1.5.0 → 1.6.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 (129) hide show
  1. package/README.md +5 -4
  2. package/dist/index.cjs +117 -17
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.d.cts +30 -7
  5. package/dist/index.d.ts +30 -7
  6. package/dist/index.js +117 -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 +135 -50
  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 +502 -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,24 +1,24 @@
1
1
  import type {
2
- Address,
3
- BaseAddress,
4
- CentPrecisionMoney,
5
- CustomFields,
6
- CustomFieldsDraft,
7
- HighPrecisionMoney,
8
- HighPrecisionMoneyDraft,
9
- InvalidJsonInputError,
10
- Price,
11
- PriceDraft,
12
- Reference,
13
- ReferencedResourceNotFoundError,
14
- ResourceIdentifier,
15
- Store,
16
- StoreKeyReference,
17
- StoreReference,
18
- StoreResourceIdentifier,
19
- Type,
20
- TypedMoney,
21
- _Money,
2
+ Address,
3
+ BaseAddress,
4
+ CentPrecisionMoney,
5
+ CustomFields,
6
+ CustomFieldsDraft,
7
+ HighPrecisionMoney,
8
+ HighPrecisionMoneyDraft,
9
+ InvalidJsonInputError,
10
+ Price,
11
+ PriceDraft,
12
+ Reference,
13
+ ReferencedResourceNotFoundError,
14
+ ResourceIdentifier,
15
+ Store,
16
+ StoreKeyReference,
17
+ StoreReference,
18
+ StoreResourceIdentifier,
19
+ Type,
20
+ TypedMoney,
21
+ _Money,
22
22
  } from '@commercetools/platform-sdk'
23
23
  import type { Request } from 'express'
24
24
  import { v4 as uuidv4 } from 'uuid'
@@ -27,195 +27,195 @@ import { AbstractStorage } from '../storage/index.js'
27
27
  import { type RepositoryContext } from './abstract.js'
28
28
 
29
29
  export const createAddress = (
30
- base: BaseAddress | undefined,
31
- projectKey: string,
32
- storage: AbstractStorage
30
+ base: BaseAddress | undefined,
31
+ projectKey: string,
32
+ storage: AbstractStorage
33
33
  ): Address | undefined => {
34
- if (!base) return undefined
34
+ if (!base) return undefined
35
35
 
36
- if (!base?.country) {
37
- throw new Error('Country is required')
38
- }
36
+ if (!base?.country) {
37
+ throw new Error('Country is required')
38
+ }
39
39
 
40
- return {
41
- ...base,
42
- }
40
+ return {
41
+ ...base,
42
+ }
43
43
  }
44
44
 
45
45
  export const createCustomFields = (
46
- draft: CustomFieldsDraft | undefined,
47
- projectKey: string,
48
- storage: AbstractStorage
46
+ draft: CustomFieldsDraft | undefined,
47
+ projectKey: string,
48
+ storage: AbstractStorage
49
49
  ): CustomFields | undefined => {
50
- if (!draft) return undefined
51
- if (!draft.type) return undefined
52
- if (!draft.type.typeId) return undefined
53
- if (!draft.fields) return undefined
54
- const typeResource = storage.getByResourceIdentifier(
55
- projectKey,
56
- draft.type
57
- ) as Type
58
-
59
- if (!typeResource) {
60
- throw new Error(
61
- `No type '${draft.type.typeId}' with id=${draft.type.id} or key=${draft.type.key}`
62
- )
63
- }
64
-
65
- return {
66
- type: {
67
- typeId: draft.type.typeId,
68
- id: typeResource.id,
69
- },
70
- fields: draft.fields,
71
- }
50
+ if (!draft) return undefined
51
+ if (!draft.type) return undefined
52
+ if (!draft.type.typeId) return undefined
53
+ if (!draft.fields) return undefined
54
+ const typeResource = storage.getByResourceIdentifier(
55
+ projectKey,
56
+ draft.type
57
+ ) as Type
58
+
59
+ if (!typeResource) {
60
+ throw new Error(
61
+ `No type '${draft.type.typeId}' with id=${draft.type.id} or key=${draft.type.key}`
62
+ )
63
+ }
64
+
65
+ return {
66
+ type: {
67
+ typeId: draft.type.typeId,
68
+ id: typeResource.id,
69
+ },
70
+ fields: draft.fields,
71
+ }
72
72
  }
73
73
 
74
74
  export const createPrice = (draft: PriceDraft): Price => ({
75
- id: uuidv4(),
76
- value: createTypedMoney(draft.value),
75
+ id: uuidv4(),
76
+ value: createTypedMoney(draft.value),
77
77
  })
78
78
 
79
79
  export const createCentPrecisionMoney = (value: _Money): CentPrecisionMoney => {
80
- // Taken from https://docs.adyen.com/development-resources/currency-codes
81
- let fractionDigits = 2
82
- switch (value.currencyCode.toUpperCase()) {
83
- case 'BHD':
84
- case 'IQD':
85
- case 'JOD':
86
- case 'KWD':
87
- case 'LYD':
88
- case 'OMR':
89
- case 'TND':
90
- fractionDigits = 3
91
- break
92
- case 'CVE':
93
- case 'DJF':
94
- case 'GNF':
95
- case 'IDR':
96
- case 'JPY':
97
- case 'KMF':
98
- case 'KRW':
99
- case 'PYG':
100
- case 'RWF':
101
- case 'UGX':
102
- case 'VND':
103
- case 'VUV':
104
- case 'XAF':
105
- case 'XOF':
106
- case 'XPF':
107
- fractionDigits = 0
108
- break
109
- default:
110
- fractionDigits = 2
111
- }
112
-
113
- if ((value as HighPrecisionMoney & HighPrecisionMoneyDraft).preciseAmount) {
114
- throw new Error('HighPrecisionMoney not supported')
115
- }
116
-
117
- return {
118
- type: 'centPrecision',
119
- // centAmont is only optional on HighPrecisionMoney, so this should never
120
- // fallback to 0
121
- centAmount: value.centAmount ?? 0,
122
- currencyCode: value.currencyCode,
123
- fractionDigits: fractionDigits,
124
- }
80
+ // Taken from https://docs.adyen.com/development-resources/currency-codes
81
+ let fractionDigits = 2
82
+ switch (value.currencyCode.toUpperCase()) {
83
+ case 'BHD':
84
+ case 'IQD':
85
+ case 'JOD':
86
+ case 'KWD':
87
+ case 'LYD':
88
+ case 'OMR':
89
+ case 'TND':
90
+ fractionDigits = 3
91
+ break
92
+ case 'CVE':
93
+ case 'DJF':
94
+ case 'GNF':
95
+ case 'IDR':
96
+ case 'JPY':
97
+ case 'KMF':
98
+ case 'KRW':
99
+ case 'PYG':
100
+ case 'RWF':
101
+ case 'UGX':
102
+ case 'VND':
103
+ case 'VUV':
104
+ case 'XAF':
105
+ case 'XOF':
106
+ case 'XPF':
107
+ fractionDigits = 0
108
+ break
109
+ default:
110
+ fractionDigits = 2
111
+ }
112
+
113
+ if ((value as HighPrecisionMoney & HighPrecisionMoneyDraft).preciseAmount) {
114
+ throw new Error('HighPrecisionMoney not supported')
115
+ }
116
+
117
+ return {
118
+ type: 'centPrecision',
119
+ // centAmont is only optional on HighPrecisionMoney, so this should never
120
+ // fallback to 0
121
+ centAmount: value.centAmount ?? 0,
122
+ currencyCode: value.currencyCode,
123
+ fractionDigits: fractionDigits,
124
+ }
125
125
  }
126
126
 
127
127
  export const createTypedMoney = (value: _Money): TypedMoney => {
128
- const result = createCentPrecisionMoney(value)
129
- return result
128
+ const result = createCentPrecisionMoney(value)
129
+ return result
130
130
  }
131
131
 
132
132
  export const resolveStoreReference = (
133
- ref: StoreResourceIdentifier | undefined,
134
- projectKey: string,
135
- storage: AbstractStorage
133
+ ref: StoreResourceIdentifier | undefined,
134
+ projectKey: string,
135
+ storage: AbstractStorage
136
136
  ): StoreKeyReference | undefined => {
137
- if (!ref) return undefined
138
- const resource = storage.getByResourceIdentifier(projectKey, ref)
139
- if (!resource) {
140
- throw new Error('No such store')
141
- }
142
-
143
- const store = resource as Store
144
- return {
145
- typeId: 'store',
146
- key: store.key,
147
- }
137
+ if (!ref) return undefined
138
+ const resource = storage.getByResourceIdentifier(projectKey, ref)
139
+ if (!resource) {
140
+ throw new Error('No such store')
141
+ }
142
+
143
+ const store = resource as Store
144
+ return {
145
+ typeId: 'store',
146
+ key: store.key,
147
+ }
148
148
  }
149
149
 
150
150
  export const getReferenceFromResourceIdentifier = <T extends Reference>(
151
- resourceIdentifier: ResourceIdentifier,
152
- projectKey: string,
153
- storage: AbstractStorage
151
+ resourceIdentifier: ResourceIdentifier,
152
+ projectKey: string,
153
+ storage: AbstractStorage
154
154
  ): T => {
155
- if (!resourceIdentifier.id && !resourceIdentifier.key) {
156
- throw new CommercetoolsError<InvalidJsonInputError>(
157
- {
158
- code: 'InvalidJsonInput',
159
- message: `${resourceIdentifier.typeId}: ResourceIdentifier requires an 'id' xor a 'key'`,
160
- detailedErrorMessage: `ResourceIdentifier requires an 'id' xor a 'key'`,
161
- },
162
- 400
163
- )
164
- }
165
-
166
- const resource = storage.getByResourceIdentifier(
167
- projectKey,
168
- resourceIdentifier
169
- )
170
- if (!resource) {
171
- const errIdentifier = resourceIdentifier.key
172
- ? `key '${resourceIdentifier.key}'`
173
- : `identifier '${resourceIdentifier.key}'`
174
-
175
- throw new CommercetoolsError<ReferencedResourceNotFoundError>(
176
- {
177
- code: 'ReferencedResourceNotFound',
178
- // @ts-ignore
179
- typeId: resourceIdentifier.typeId,
180
- message: `The referenced object of type '${resourceIdentifier.typeId}' with '${errIdentifier}' was not found. It either doesn't exist, or it can't be accessed from this endpoint (e.g., if the endpoint filters by store or customer account).`,
181
- },
182
- 400
183
- )
184
- }
185
-
186
- return {
187
- typeId: resourceIdentifier.typeId,
188
- id: resource?.id,
189
- } as unknown as T
155
+ if (!resourceIdentifier.id && !resourceIdentifier.key) {
156
+ throw new CommercetoolsError<InvalidJsonInputError>(
157
+ {
158
+ code: 'InvalidJsonInput',
159
+ message: `${resourceIdentifier.typeId}: ResourceIdentifier requires an 'id' xor a 'key'`,
160
+ detailedErrorMessage: `ResourceIdentifier requires an 'id' xor a 'key'`,
161
+ },
162
+ 400
163
+ )
164
+ }
165
+
166
+ const resource = storage.getByResourceIdentifier(
167
+ projectKey,
168
+ resourceIdentifier
169
+ )
170
+ if (!resource) {
171
+ const errIdentifier = resourceIdentifier.key
172
+ ? `key '${resourceIdentifier.key}'`
173
+ : `identifier '${resourceIdentifier.key}'`
174
+
175
+ throw new CommercetoolsError<ReferencedResourceNotFoundError>(
176
+ {
177
+ code: 'ReferencedResourceNotFound',
178
+ // @ts-ignore
179
+ typeId: resourceIdentifier.typeId,
180
+ message: `The referenced object of type '${resourceIdentifier.typeId}' with '${errIdentifier}' was not found. It either doesn't exist, or it can't be accessed from this endpoint (e.g., if the endpoint filters by store or customer account).`,
181
+ },
182
+ 400
183
+ )
184
+ }
185
+
186
+ return {
187
+ typeId: resourceIdentifier.typeId,
188
+ id: resource?.id,
189
+ } as unknown as T
190
190
  }
191
191
 
192
192
  export const getStoreKeyReference = (
193
- id: StoreResourceIdentifier,
194
- projectKey: string,
195
- storage: AbstractStorage
193
+ id: StoreResourceIdentifier,
194
+ projectKey: string,
195
+ storage: AbstractStorage
196
196
  ): StoreKeyReference => {
197
- if (id.key) {
198
- return {
199
- typeId: 'store',
200
- key: id.key,
201
- }
202
- }
203
- const value = getReferenceFromResourceIdentifier<StoreReference>(
204
- id,
205
- projectKey,
206
- storage
207
- )
208
-
209
- if (!value.obj?.key) {
210
- throw new Error('No store found for reference')
211
- }
212
- return {
213
- typeId: 'store',
214
- key: value.obj?.key,
215
- }
197
+ if (id.key) {
198
+ return {
199
+ typeId: 'store',
200
+ key: id.key,
201
+ }
202
+ }
203
+ const value = getReferenceFromResourceIdentifier<StoreReference>(
204
+ id,
205
+ projectKey,
206
+ storage
207
+ )
208
+
209
+ if (!value.obj?.key) {
210
+ throw new Error('No store found for reference')
211
+ }
212
+ return {
213
+ typeId: 'store',
214
+ key: value.obj?.key,
215
+ }
216
216
  }
217
217
 
218
218
  export const getRepositoryContext = (request: Request): RepositoryContext => ({
219
- projectKey: request.params.projectKey,
220
- storeKey: request.params.storeKey,
219
+ projectKey: request.params.projectKey,
220
+ storeKey: request.params.storeKey,
221
221
  })
@@ -39,43 +39,43 @@ import { ZoneRepository } from './zone.js'
39
39
  export type RepositoryMap = ReturnType<typeof createRepositories>
40
40
 
41
41
  export const createRepositories = (storage: AbstractStorage) => ({
42
- 'associate-role': new AssociateRoleRepository(storage),
43
- 'attribute-group': new AttributeGroupRepository(storage),
44
- 'business-unit': new BusinessUnitRepository(storage),
45
- category: new CategoryRepository(storage),
46
- cart: new CartRepository(storage),
47
- 'cart-discount': new CartDiscountRepository(storage),
48
- customer: new CustomerRepository(storage),
49
- channel: new ChannelRepository(storage),
50
- 'customer-group': new CustomerGroupRepository(storage),
51
- 'discount-code': new DiscountCodeRepository(storage),
52
- extension: new ExtensionRepository(storage),
53
- 'inventory-entry': new InventoryEntryRepository(storage),
54
- 'key-value-document': new CustomObjectRepository(storage),
55
- order: new OrderRepository(storage),
56
- 'order-edit': new OrderEditRepository(storage),
57
- payment: new PaymentRepository(storage),
58
- 'my-cart': new CartRepository(storage),
59
- 'my-order': new MyOrderRepository(storage),
60
- 'my-customer': new CustomerRepository(storage),
61
- 'my-payment': new PaymentRepository(storage),
62
- product: new ProductRepository(storage),
63
- 'product-type': new ProductTypeRepository(storage),
64
- 'product-discount': new ProductDiscountRepository(storage),
65
- 'product-projection': new ProductProjectionRepository(storage),
66
- 'product-selection': new ProductSelectionRepository(storage),
67
- project: new ProjectRepository(storage),
68
- review: new ReviewRepository(storage),
69
- quote: new QuoteRepository(storage),
70
- 'quote-request': new QuoteRequestRepository(storage),
71
- 'shipping-method': new ShippingMethodRepository(storage),
72
- 'shopping-list': new ShoppingListRepository(storage),
73
- 'staged-quote': new StagedQuoteRepository(storage),
74
- 'standalone-price': new StandAlonePriceRepository(storage),
75
- state: new StateRepository(storage),
76
- store: new StoreRepository(storage),
77
- subscription: new SubscriptionRepository(storage),
78
- 'tax-category': new TaxCategoryRepository(storage),
79
- type: new TypeRepository(storage),
80
- zone: new ZoneRepository(storage),
42
+ 'associate-role': new AssociateRoleRepository(storage),
43
+ 'attribute-group': new AttributeGroupRepository(storage),
44
+ 'business-unit': new BusinessUnitRepository(storage),
45
+ category: new CategoryRepository(storage),
46
+ cart: new CartRepository(storage),
47
+ 'cart-discount': new CartDiscountRepository(storage),
48
+ customer: new CustomerRepository(storage),
49
+ channel: new ChannelRepository(storage),
50
+ 'customer-group': new CustomerGroupRepository(storage),
51
+ 'discount-code': new DiscountCodeRepository(storage),
52
+ extension: new ExtensionRepository(storage),
53
+ 'inventory-entry': new InventoryEntryRepository(storage),
54
+ 'key-value-document': new CustomObjectRepository(storage),
55
+ order: new OrderRepository(storage),
56
+ 'order-edit': new OrderEditRepository(storage),
57
+ payment: new PaymentRepository(storage),
58
+ 'my-cart': new CartRepository(storage),
59
+ 'my-order': new MyOrderRepository(storage),
60
+ 'my-customer': new CustomerRepository(storage),
61
+ 'my-payment': new PaymentRepository(storage),
62
+ product: new ProductRepository(storage),
63
+ 'product-type': new ProductTypeRepository(storage),
64
+ 'product-discount': new ProductDiscountRepository(storage),
65
+ 'product-projection': new ProductProjectionRepository(storage),
66
+ 'product-selection': new ProductSelectionRepository(storage),
67
+ project: new ProjectRepository(storage),
68
+ review: new ReviewRepository(storage),
69
+ quote: new QuoteRepository(storage),
70
+ 'quote-request': new QuoteRequestRepository(storage),
71
+ 'shipping-method': new ShippingMethodRepository(storage),
72
+ 'shopping-list': new ShoppingListRepository(storage),
73
+ 'staged-quote': new StagedQuoteRepository(storage),
74
+ 'standalone-price': new StandAlonePriceRepository(storage),
75
+ state: new StateRepository(storage),
76
+ store: new StoreRepository(storage),
77
+ subscription: new SubscriptionRepository(storage),
78
+ 'tax-category': new TaxCategoryRepository(storage),
79
+ type: new TypeRepository(storage),
80
+ zone: new ZoneRepository(storage),
81
81
  })