@labdigital/commercetools-mock 0.8.0 → 0.9.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.
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.8.0",
2
+ "version": "0.9.0",
3
3
  "license": "MIT",
4
4
  "main": "dist/index.js",
5
5
  "typings": "dist/index.d.ts",
@@ -56,8 +56,6 @@
56
56
  },
57
57
  "dependencies": {
58
58
  "@types/lodash": "^4.14.182",
59
- "ajv": "^8.8.2",
60
- "ajv-formats": "^2.1.1",
61
59
  "basic-auth": "^2.0.1",
62
60
  "body-parser": "^1.20.0",
63
61
  "deep-equal": "^2.0.5",
@@ -75,7 +73,6 @@
75
73
  },
76
74
  "scripts": {
77
75
  "start": "nodemon --watch src --exec 'node -r esbuild-register' src/server.ts",
78
- "generate": "node -r esbuild-register generate-validation.ts",
79
76
  "build": "tsup",
80
77
  "test": "jest test --coverage",
81
78
  "lint": "eslint"
@@ -107,6 +107,7 @@ export class ProductProjectionSearch {
107
107
  const filters = params['filter.query'].map(f =>
108
108
  parseFilterExpression(f, params.staged ?? false)
109
109
  )
110
+
110
111
  resources = resources.filter(resource =>
111
112
  filters.every(f => f(resource, markMatchingVariant))
112
113
  )
@@ -154,6 +155,9 @@ export class ProductProjectionSearch {
154
155
  lastModifiedAt: product.lastModifiedAt,
155
156
  version: product.version,
156
157
  name: obj.name,
158
+ key: product.key,
159
+ description: obj.description,
160
+ metaDescription: obj.metaDescription,
157
161
  slug: obj.slug,
158
162
  categories: obj.categories,
159
163
  masterVariant: obj.masterVariant,
@@ -65,8 +65,18 @@ export abstract class AbstractRepository {
65
65
  if (!deepEqual(modifiedResource, resource)) {
66
66
  this.save(context, modifiedResource)
67
67
  }
68
- return modifiedResource
68
+
69
+ const result = this.postProcessResource(modifiedResource)
70
+ if (!result) {
71
+ throw new Error("invalid post process action")
72
+ }
73
+ return result
74
+ }
75
+
76
+ postProcessResource(resource: BaseResource | null): BaseResource | null {
77
+ return resource
69
78
  }
79
+
70
80
  }
71
81
 
72
82
  export abstract class AbstractResourceRepository extends AbstractRepository {
@@ -79,12 +89,17 @@ export abstract class AbstractResourceRepository extends AbstractRepository {
79
89
  }
80
90
 
81
91
  query(context: RepositoryContext, params: QueryParams = {}) {
82
- return this._storage.query(context.projectKey, this.getTypeId(), {
92
+ const result = this._storage.query(context.projectKey, this.getTypeId(), {
83
93
  expand: params.expand,
84
94
  where: params.where,
85
95
  offset: params.offset,
86
96
  limit: params.limit,
87
97
  })
98
+
99
+ // @ts-ignore
100
+ result.results = result.results.map(this.postProcessResource)
101
+
102
+ return result
88
103
  }
89
104
 
90
105
  get(
@@ -92,7 +107,8 @@ export abstract class AbstractResourceRepository extends AbstractRepository {
92
107
  id: string,
93
108
  params: GetParams = {}
94
109
  ): BaseResource | null {
95
- return this._storage.get(context.projectKey, this.getTypeId(), id, params)
110
+ const resource = this._storage.get(context.projectKey, this.getTypeId(), id, params)
111
+ return this.postProcessResource(resource)
96
112
  }
97
113
 
98
114
  getByKey(
@@ -100,12 +116,13 @@ export abstract class AbstractResourceRepository extends AbstractRepository {
100
116
  key: string,
101
117
  params: GetParams = {}
102
118
  ): BaseResource | null {
103
- return this._storage.getByKey(
119
+ const resource = this._storage.getByKey(
104
120
  context.projectKey,
105
121
  this.getTypeId(),
106
122
  key,
107
123
  params
108
124
  )
125
+ return this.postProcessResource(resource)
109
126
  }
110
127
 
111
128
  delete(
@@ -113,12 +130,13 @@ export abstract class AbstractResourceRepository extends AbstractRepository {
113
130
  id: string,
114
131
  params: GetParams = {}
115
132
  ): BaseResource | null {
116
- return this._storage.delete(
133
+ const resource = this._storage.delete(
117
134
  context.projectKey,
118
135
  this.getTypeId(),
119
136
  id,
120
137
  params
121
138
  )
139
+ return this.postProcessResource(resource)
122
140
  }
123
141
 
124
142
  save(context: RepositoryContext, resource: BaseResource) {
@@ -10,13 +10,30 @@ import {
10
10
  } from '@commercetools/platform-sdk'
11
11
  import { Writable } from '../types'
12
12
  import { getBaseResourceProperties } from '../helpers'
13
- import { AbstractResourceRepository, RepositoryContext } from './abstract'
13
+ import { AbstractResourceRepository, GetParams, RepositoryContext } from './abstract'
14
+ import { maskSecretValue } from '../lib/masking'
14
15
 
15
16
  export class ExtensionRepository extends AbstractResourceRepository {
16
17
  getTypeId(): ReferenceTypeId {
17
18
  return 'extension'
18
19
  }
19
20
 
21
+ postProcessResource(resource: Extension) {
22
+ if (resource) {
23
+ if (resource.destination.type === "HTTP" &&
24
+ resource.destination.authentication?.type === "AuthorizationHeader"
25
+ ) {
26
+ return maskSecretValue(
27
+ resource, 'destination.authentication.headerValue')
28
+ }
29
+ else if (resource.destination.type == "AWSLambda") {
30
+ return maskSecretValue(
31
+ resource, 'destination.accessSecret')
32
+ }
33
+ }
34
+ return resource
35
+ }
36
+
20
37
  create(context: RepositoryContext, draft: ExtensionDraft): Extension {
21
38
  const resource: Extension = {
22
39
  ...getBaseResourceProperties(),
@@ -75,10 +75,44 @@ export const createPrice = (draft: PriceDraft): Price => {
75
75
  }
76
76
 
77
77
  export const createTypedMoney = (value: Money): TypedMoney => {
78
+
79
+ // Taken from https://docs.adyen.com/development-resources/currency-codes
80
+ let fractionDigits = 2
81
+ switch (value.currencyCode.toUpperCase()) {
82
+ case 'BHD':
83
+ case 'IQD':
84
+ case 'JOD':
85
+ case 'KWD':
86
+ case 'LYD':
87
+ case 'OMR':
88
+ case 'TND':
89
+ fractionDigits = 3
90
+ break
91
+ case 'CVE':
92
+ case 'DJF':
93
+ case 'GNF':
94
+ case 'IDR':
95
+ case 'JPY':
96
+ case 'KMF':
97
+ case 'KRW':
98
+ case 'PYG':
99
+ case 'RWF':
100
+ case 'UGX':
101
+ case 'VND':
102
+ case 'VUV':
103
+ case 'XAF':
104
+ case 'XOF':
105
+ case 'XPF':
106
+ fractionDigits = 0
107
+ break
108
+ default:
109
+ fractionDigits = 2
110
+ }
111
+
78
112
  return {
79
113
  type: 'centPrecision',
80
- fractionDigits: 2,
81
114
  ...value,
115
+ fractionDigits: fractionDigits,
82
116
  }
83
117
  }
84
118
 
@@ -135,10 +169,10 @@ export const getReferenceFromResourceIdentifier = <T extends Reference>(
135
169
  )
136
170
  }
137
171
 
138
- return ({
172
+ return {
139
173
  typeId: resourceIdentifier.typeId,
140
174
  id: resource?.id,
141
- } as unknown) as T
175
+ } as unknown as T
142
176
  }
143
177
 
144
178
  export const getRepositoryContext = (request: Request): RepositoryContext => {
@@ -23,11 +23,16 @@ import { maskSecretValue } from '../lib/masking'
23
23
  export class ProjectRepository extends AbstractRepository {
24
24
  get(context: RepositoryContext): Project | null {
25
25
  const resource = this._storage.getProject(context.projectKey)
26
- const masked = maskSecretValue<Project>(
27
- resource,
28
- 'externalOAuth.authorizationHeader'
29
- )
30
- return masked
26
+ return this.postProcessResource(resource)
27
+ }
28
+
29
+ postProcessResource(resource: any): any {
30
+ if (resource) {
31
+ return maskSecretValue(
32
+ resource, 'externalOAuth.authorizationHeader')
33
+ }
34
+ return resource
35
+
31
36
  }
32
37
 
33
38
  save(context: RepositoryContext, resource: Project) {
@@ -2,12 +2,14 @@ import { getBaseResourceProperties } from '../helpers'
2
2
  import { getReferenceFromResourceIdentifier } from './helpers'
3
3
  import {
4
4
  ReferenceTypeId,
5
+ StateReference,
5
6
  State,
6
7
  StateChangeKeyAction,
7
8
  StateDraft,
8
9
  StateSetDescriptionAction,
9
10
  StateSetNameAction,
10
11
  StateSetRolesAction,
12
+ StateSetTransitionsAction,
11
13
  StateUpdateAction,
12
14
  } from '@commercetools/platform-sdk'
13
15
  import { AbstractResourceRepository, RepositoryContext } from './abstract'
@@ -71,5 +73,17 @@ export class StateRepository extends AbstractResourceRepository {
71
73
  ) => {
72
74
  resource.roles = roles
73
75
  },
76
+ setTransitions: (
77
+ context: RepositoryContext,
78
+ resource: Writable<State>,
79
+ { transitions }: StateSetTransitionsAction
80
+ ) => {
81
+ resource.transitions = transitions?.map((resourceId): StateReference => {
82
+ return {
83
+ id: resourceId.id || "",
84
+ typeId: "state",
85
+ }
86
+ })
87
+ }
74
88
  }
75
89
  }