@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,59 +1,123 @@
1
- import type { ProductDraft, ProductProjection } from '@commercetools/platform-sdk'
1
+ import type {
2
+ InvalidInputError,
3
+ ProductDraft,
4
+ ProductProjection,
5
+ QueryParam,
6
+ } from '@commercetools/platform-sdk'
2
7
  import { ParsedQs } from 'qs'
3
8
  import { QueryParamsAsArray } from '../helpers.js'
4
9
  import { ProductProjectionSearch } from '../product-projection-search.js'
5
10
  import { type AbstractStorage } from '../storage/index.js'
6
- import {
7
- AbstractResourceRepository,
8
- type QueryParams,
9
- RepositoryContext,
10
- } from './abstract.js'
11
+ import { AbstractResourceRepository, RepositoryContext } from './abstract.js'
12
+ import { parseQueryExpression } from '../lib/predicateParser.js'
13
+ import { CommercetoolsError } from '../exceptions.js'
14
+
15
+ type ProductProjectionQueryParams = {
16
+ staged?: boolean
17
+ priceCurrency?: string
18
+ priceCountry?: string
19
+ priceCustomerGroup?: string
20
+ priceChannel?: string
21
+ localeProjection?: string | string[]
22
+ storeProjection?: string
23
+ expand?: string | string[]
24
+ sort?: string | string[]
25
+ limit?: number
26
+ offset?: number
27
+ withTotal?: boolean
28
+ where?: string | string[]
29
+ [key: string]: QueryParam
30
+ }
11
31
 
12
32
  export class ProductProjectionRepository extends AbstractResourceRepository<'product-projection'> {
13
- protected _searchService: ProductProjectionSearch
14
-
15
- constructor(storage: AbstractStorage) {
16
- super(storage)
17
- this._searchService = new ProductProjectionSearch(storage)
18
- }
19
-
20
- getTypeId() {
21
- return 'product-projection' as const
22
- }
23
-
24
- create(context: RepositoryContext, draft: ProductDraft): ProductProjection {
25
- throw new Error('No valid action')
26
- }
27
-
28
- query(context: RepositoryContext, params: QueryParams = {}) {
29
- const response = this._storage.query(context.projectKey, 'product', {
30
- expand: params.expand,
31
- where: params.where,
32
- offset: params.offset,
33
- limit: params.limit,
34
- })
35
-
36
- return {
37
- ...response,
38
- results: response.results.map((r) =>
39
- this._searchService.transform(r, false)
40
- ),
41
- }
42
- }
43
-
44
- search(context: RepositoryContext, query: ParsedQs) {
45
- const results = this._searchService.search(context.projectKey, {
46
- filter: QueryParamsAsArray(query.filter),
47
- 'filter.query': QueryParamsAsArray(query['filter.query']),
48
- facet: QueryParamsAsArray(query.facet),
49
- offset: query.offset ? Number(query.offset) : undefined,
50
- limit: query.limit ? Number(query.limit) : undefined,
51
- expand: QueryParamsAsArray(query.expand),
52
- staged: query.staged === 'true',
53
- })
54
-
55
- return results
56
- }
57
-
58
- actions = {}
33
+ protected _searchService: ProductProjectionSearch
34
+
35
+ constructor(storage: AbstractStorage) {
36
+ super(storage)
37
+ this._searchService = new ProductProjectionSearch(storage)
38
+ }
39
+
40
+ getTypeId() {
41
+ return 'product-projection' as const
42
+ }
43
+
44
+ create(context: RepositoryContext, draft: ProductDraft): ProductProjection {
45
+ throw new Error('No valid action')
46
+ }
47
+
48
+ query(context: RepositoryContext, params: ProductProjectionQueryParams = {}) {
49
+ let resources = this._storage
50
+ .all(context.projectKey, 'product')
51
+ .map((r) => this._searchService.transform(r, params.staged ?? false))
52
+ .filter((p) => {
53
+ if (!params.staged ?? false) {
54
+ return p.published
55
+ }
56
+ return true
57
+ })
58
+
59
+ // Apply predicates
60
+ if (params.where) {
61
+ const variableMap: Record<string, QueryParam> = {}
62
+ for (const [k, v] of Object.entries(params)) {
63
+ if (k.startsWith('var.')) {
64
+ variableMap[k.substring(4)] = v
65
+ }
66
+ }
67
+
68
+ try {
69
+ const filterFunc = parseQueryExpression(params.where)
70
+ resources = resources.filter((resource) =>
71
+ filterFunc(resource, variableMap)
72
+ )
73
+ } catch (err) {
74
+ throw new CommercetoolsError<InvalidInputError>(
75
+ {
76
+ code: 'InvalidInput',
77
+ message: (err as any).message,
78
+ },
79
+ 400
80
+ )
81
+ }
82
+ }
83
+
84
+ // Expand the resources
85
+ if (params.expand !== undefined) {
86
+ resources = resources.map((resource) =>
87
+ this._storage.expand(context.projectKey, resource, params.expand)
88
+ )
89
+ }
90
+
91
+ // Create a slice for the pagination. If we were working with large datasets
92
+ // then we should have done this before transforming. But that isn't the
93
+ // goal of this library. So lets keep it simple.
94
+ const totalResults = resources.length
95
+ const offset = params.offset || 0
96
+ const limit = params.limit || 20
97
+ const results = resources.slice(offset, offset + limit)
98
+
99
+ return {
100
+ count: totalResults,
101
+ total: results.length,
102
+ offset: offset,
103
+ limit: limit,
104
+ results: results,
105
+ }
106
+ }
107
+
108
+ search(context: RepositoryContext, query: ParsedQs) {
109
+ const results = this._searchService.search(context.projectKey, {
110
+ filter: QueryParamsAsArray(query.filter),
111
+ 'filter.query': QueryParamsAsArray(query['filter.query']),
112
+ facet: QueryParamsAsArray(query.facet),
113
+ offset: query.offset ? Number(query.offset) : undefined,
114
+ limit: query.limit ? Number(query.limit) : undefined,
115
+ expand: QueryParamsAsArray(query.expand),
116
+ staged: query.staged === 'true',
117
+ })
118
+
119
+ return results
120
+ }
121
+
122
+ actions = {}
59
123
  }
@@ -1,41 +1,41 @@
1
1
  import type {
2
- ProductSelection,
3
- ProductSelectionDraft,
4
- Review,
5
- ReviewUpdateAction,
2
+ ProductSelection,
3
+ ProductSelectionDraft,
4
+ Review,
5
+ ReviewUpdateAction,
6
6
  } from '@commercetools/platform-sdk'
7
7
  import { getBaseResourceProperties } from '../helpers.js'
8
8
  import type { Writable } from '../types.js'
9
9
  import { AbstractResourceRepository, RepositoryContext } from './abstract.js'
10
10
 
11
11
  export class ProductSelectionRepository extends AbstractResourceRepository<'product-selection'> {
12
- getTypeId() {
13
- return 'product-selection' as const
14
- }
12
+ getTypeId() {
13
+ return 'product-selection' as const
14
+ }
15
15
 
16
- create(
17
- context: RepositoryContext,
18
- draft: ProductSelectionDraft
19
- ): ProductSelection {
20
- const resource: ProductSelection = {
21
- ...getBaseResourceProperties(),
22
- productCount: 0,
23
- name: draft.name,
24
- type: 'individual',
25
- mode: 'Individual',
26
- }
27
- this.saveNew(context, resource)
28
- return resource
29
- }
16
+ create(
17
+ context: RepositoryContext,
18
+ draft: ProductSelectionDraft
19
+ ): ProductSelection {
20
+ const resource: ProductSelection = {
21
+ ...getBaseResourceProperties(),
22
+ productCount: 0,
23
+ name: draft.name,
24
+ type: 'individual',
25
+ mode: 'Individual',
26
+ }
27
+ this.saveNew(context, resource)
28
+ return resource
29
+ }
30
30
 
31
- actions: Partial<
32
- Record<
33
- ReviewUpdateAction['action'],
34
- (
35
- context: RepositoryContext,
36
- resource: Writable<Review>,
37
- action: any
38
- ) => void
39
- >
40
- > = {}
31
+ actions: Partial<
32
+ Record<
33
+ ReviewUpdateAction['action'],
34
+ (
35
+ context: RepositoryContext,
36
+ resource: Writable<Review>,
37
+ action: any
38
+ ) => void
39
+ >
40
+ > = {}
41
41
  }
@@ -1,173 +1,173 @@
1
1
  import type {
2
- AttributeDefinition,
3
- AttributeDefinitionDraft,
4
- AttributeType,
5
- ProductType,
6
- ProductTypeAddAttributeDefinitionAction,
7
- ProductTypeChangeAttributeOrderByNameAction,
8
- ProductTypeChangeLabelAction,
9
- ProductTypeChangeLocalizedEnumValueLabelAction,
10
- ProductTypeDraft,
11
- ProductTypeRemoveAttributeDefinitionAction,
12
- ProductTypeRemoveEnumValuesAction,
13
- ProductTypeUpdateAction,
2
+ AttributeDefinition,
3
+ AttributeDefinitionDraft,
4
+ AttributeType,
5
+ ProductType,
6
+ ProductTypeAddAttributeDefinitionAction,
7
+ ProductTypeChangeAttributeOrderByNameAction,
8
+ ProductTypeChangeLabelAction,
9
+ ProductTypeChangeLocalizedEnumValueLabelAction,
10
+ ProductTypeDraft,
11
+ ProductTypeRemoveAttributeDefinitionAction,
12
+ ProductTypeRemoveEnumValuesAction,
13
+ ProductTypeUpdateAction,
14
14
  } from '@commercetools/platform-sdk'
15
15
  import { getBaseResourceProperties } from '../helpers.js'
16
16
  import type { Writable } from '../types.js'
17
17
  import { AbstractResourceRepository, RepositoryContext } from './abstract.js'
18
18
 
19
19
  export class ProductTypeRepository extends AbstractResourceRepository<'product-type'> {
20
- getTypeId() {
21
- return 'product-type' as const
22
- }
20
+ getTypeId() {
21
+ return 'product-type' as const
22
+ }
23
23
 
24
- create(context: RepositoryContext, draft: ProductTypeDraft): ProductType {
25
- const resource: ProductType = {
26
- ...getBaseResourceProperties(),
27
- key: draft.key,
28
- name: draft.name,
29
- description: draft.description,
30
- attributes: (draft.attributes ?? []).map((a) =>
31
- this.attributeDefinitionFromAttributeDefinitionDraft(context, a)
32
- ),
33
- }
24
+ create(context: RepositoryContext, draft: ProductTypeDraft): ProductType {
25
+ const resource: ProductType = {
26
+ ...getBaseResourceProperties(),
27
+ key: draft.key,
28
+ name: draft.name,
29
+ description: draft.description,
30
+ attributes: (draft.attributes ?? []).map((a) =>
31
+ this.attributeDefinitionFromAttributeDefinitionDraft(context, a)
32
+ ),
33
+ }
34
34
 
35
- this.saveNew(context, resource)
36
- return resource
37
- }
35
+ this.saveNew(context, resource)
36
+ return resource
37
+ }
38
38
 
39
- attributeDefinitionFromAttributeDefinitionDraft = (
40
- _context: RepositoryContext,
41
- draft: AttributeDefinitionDraft
42
- ): AttributeDefinition => ({
43
- ...draft,
44
- attributeConstraint: draft.attributeConstraint ?? 'None',
45
- inputHint: draft.inputHint ?? 'SingleLine',
46
- inputTip:
47
- draft.inputTip && Object.keys(draft.inputTip).length > 0
48
- ? draft.inputTip
49
- : undefined,
50
- isSearchable: draft.isSearchable ?? true,
51
- })
39
+ attributeDefinitionFromAttributeDefinitionDraft = (
40
+ _context: RepositoryContext,
41
+ draft: AttributeDefinitionDraft
42
+ ): AttributeDefinition => ({
43
+ ...draft,
44
+ attributeConstraint: draft.attributeConstraint ?? 'None',
45
+ inputHint: draft.inputHint ?? 'SingleLine',
46
+ inputTip:
47
+ draft.inputTip && Object.keys(draft.inputTip).length > 0
48
+ ? draft.inputTip
49
+ : undefined,
50
+ isSearchable: draft.isSearchable ?? true,
51
+ })
52
52
 
53
- actions: Partial<
54
- Record<
55
- ProductTypeUpdateAction['action'],
56
- (
57
- context: RepositoryContext,
58
- resource: Writable<ProductType>,
59
- action: any
60
- ) => void
61
- >
62
- > = {
63
- changeLocalizedEnumValueLabel: (
64
- context: RepositoryContext,
65
- resource: Writable<ProductType>,
66
- {
67
- attributeName,
68
- newValue,
69
- }: ProductTypeChangeLocalizedEnumValueLabelAction
70
- ) => {
71
- const updateAttributeType = (type: Writable<AttributeType>) => {
72
- switch (type.name) {
73
- case 'lenum':
74
- type.values.forEach((v) => {
75
- if (v.key === newValue.key) {
76
- v.label = newValue.label
77
- }
78
- })
79
- return
80
- case 'set':
81
- updateAttributeType(type.elementType)
82
- return
83
- }
84
- }
53
+ actions: Partial<
54
+ Record<
55
+ ProductTypeUpdateAction['action'],
56
+ (
57
+ context: RepositoryContext,
58
+ resource: Writable<ProductType>,
59
+ action: any
60
+ ) => void
61
+ >
62
+ > = {
63
+ changeLocalizedEnumValueLabel: (
64
+ context: RepositoryContext,
65
+ resource: Writable<ProductType>,
66
+ {
67
+ attributeName,
68
+ newValue,
69
+ }: ProductTypeChangeLocalizedEnumValueLabelAction
70
+ ) => {
71
+ const updateAttributeType = (type: Writable<AttributeType>) => {
72
+ switch (type.name) {
73
+ case 'lenum':
74
+ type.values.forEach((v) => {
75
+ if (v.key === newValue.key) {
76
+ v.label = newValue.label
77
+ }
78
+ })
79
+ return
80
+ case 'set':
81
+ updateAttributeType(type.elementType)
82
+ return
83
+ }
84
+ }
85
85
 
86
- resource.attributes?.forEach((value) => {
87
- if (value.name === attributeName) {
88
- updateAttributeType(value.type)
89
- }
90
- })
91
- },
92
- changeLabel: (
93
- context: RepositoryContext,
94
- resource: Writable<ProductType>,
95
- { attributeName, label }: ProductTypeChangeLabelAction
96
- ) => {
97
- resource.attributes?.forEach((value) => {
98
- if (value.name === attributeName) {
99
- value.label = label
100
- }
101
- })
102
- },
103
- addAttributeDefinition: (
104
- context: RepositoryContext,
105
- resource: Writable<ProductType>,
106
- { attribute }: ProductTypeAddAttributeDefinitionAction
107
- ) => {
108
- resource.attributes?.push(
109
- this.attributeDefinitionFromAttributeDefinitionDraft(context, attribute)
110
- )
111
- },
112
- changeAttributeOrderByName: (
113
- context: RepositoryContext,
114
- resource: Writable<ProductType>,
115
- { attributeNames }: ProductTypeChangeAttributeOrderByNameAction
116
- ) => {
117
- const attrs = new Map(
118
- resource.attributes?.map((item) => [item.name, item])
119
- )
120
- const result: AttributeDefinition[] = []
121
- let current = resource.attributes
86
+ resource.attributes?.forEach((value) => {
87
+ if (value.name === attributeName) {
88
+ updateAttributeType(value.type)
89
+ }
90
+ })
91
+ },
92
+ changeLabel: (
93
+ context: RepositoryContext,
94
+ resource: Writable<ProductType>,
95
+ { attributeName, label }: ProductTypeChangeLabelAction
96
+ ) => {
97
+ resource.attributes?.forEach((value) => {
98
+ if (value.name === attributeName) {
99
+ value.label = label
100
+ }
101
+ })
102
+ },
103
+ addAttributeDefinition: (
104
+ context: RepositoryContext,
105
+ resource: Writable<ProductType>,
106
+ { attribute }: ProductTypeAddAttributeDefinitionAction
107
+ ) => {
108
+ resource.attributes?.push(
109
+ this.attributeDefinitionFromAttributeDefinitionDraft(context, attribute)
110
+ )
111
+ },
112
+ changeAttributeOrderByName: (
113
+ context: RepositoryContext,
114
+ resource: Writable<ProductType>,
115
+ { attributeNames }: ProductTypeChangeAttributeOrderByNameAction
116
+ ) => {
117
+ const attrs = new Map(
118
+ resource.attributes?.map((item) => [item.name, item])
119
+ )
120
+ const result: AttributeDefinition[] = []
121
+ let current = resource.attributes
122
122
 
123
- attributeNames.forEach((attrName) => {
124
- const attr = attrs.get(attrName)
125
- if (attr === undefined) {
126
- throw new Error('New attr')
127
- }
128
- result.push(attr)
123
+ attributeNames.forEach((attrName) => {
124
+ const attr = attrs.get(attrName)
125
+ if (attr === undefined) {
126
+ throw new Error('New attr')
127
+ }
128
+ result.push(attr)
129
129
 
130
- // Remove from current items
131
- current = current?.filter((f) => f.name !== attrName)
132
- })
130
+ // Remove from current items
131
+ current = current?.filter((f) => f.name !== attrName)
132
+ })
133
133
 
134
- resource.attributes = result
135
- // Add attrs which were not specified in the order as last items. Not
136
- // sure if this follows commercetools
137
- if (current) {
138
- resource.attributes.push(...current)
139
- }
140
- },
141
- removeAttributeDefinition: (
142
- context: RepositoryContext,
143
- resource: Writable<ProductType>,
144
- { name }: ProductTypeRemoveAttributeDefinitionAction
145
- ) => {
146
- resource.attributes = resource.attributes?.filter((f) => f.name !== name)
147
- },
148
- removeEnumValues: (
149
- context: RepositoryContext,
150
- resource: Writable<ProductType>,
151
- { attributeName, keys }: ProductTypeRemoveEnumValuesAction
152
- ) => {
153
- resource.attributes?.forEach((attr) => {
154
- if (attr.name == attributeName) {
155
- if (attr.type.name == 'enum') {
156
- attr.type.values = attr.type.values.filter(
157
- (v) => !keys.includes(v.key)
158
- )
159
- }
134
+ resource.attributes = result
135
+ // Add attrs which were not specified in the order as last items. Not
136
+ // sure if this follows commercetools
137
+ if (current) {
138
+ resource.attributes.push(...current)
139
+ }
140
+ },
141
+ removeAttributeDefinition: (
142
+ context: RepositoryContext,
143
+ resource: Writable<ProductType>,
144
+ { name }: ProductTypeRemoveAttributeDefinitionAction
145
+ ) => {
146
+ resource.attributes = resource.attributes?.filter((f) => f.name !== name)
147
+ },
148
+ removeEnumValues: (
149
+ context: RepositoryContext,
150
+ resource: Writable<ProductType>,
151
+ { attributeName, keys }: ProductTypeRemoveEnumValuesAction
152
+ ) => {
153
+ resource.attributes?.forEach((attr) => {
154
+ if (attr.name == attributeName) {
155
+ if (attr.type.name == 'enum') {
156
+ attr.type.values = attr.type.values.filter(
157
+ (v) => !keys.includes(v.key)
158
+ )
159
+ }
160
160
 
161
- if (attr.type.name == 'set') {
162
- if (attr.type.elementType.name == 'enum') {
163
- attr.type.elementType.values =
164
- attr.type.elementType.values.filter(
165
- (v) => !keys.includes(v.key)
166
- )
167
- }
168
- }
169
- }
170
- })
171
- },
172
- }
161
+ if (attr.type.name == 'set') {
162
+ if (attr.type.elementType.name == 'enum') {
163
+ attr.type.elementType.values =
164
+ attr.type.elementType.values.filter(
165
+ (v) => !keys.includes(v.key)
166
+ )
167
+ }
168
+ }
169
+ }
170
+ })
171
+ },
172
+ }
173
173
  }