@labdigital/commercetools-mock 0.9.0 → 0.10.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 (95) hide show
  1. package/README.md +8 -0
  2. package/dist/index.d.ts +18 -17
  3. package/dist/index.global.js +1751 -1664
  4. package/dist/index.global.js.map +1 -1
  5. package/dist/index.js +1773 -1684
  6. package/dist/index.js.map +1 -1
  7. package/dist/index.mjs +1966 -1877
  8. package/dist/index.mjs.map +1 -1
  9. package/package.json +28 -20
  10. package/src/constants.ts +4 -2
  11. package/src/ctMock.ts +19 -84
  12. package/src/helpers.ts +9 -10
  13. package/src/index.test.ts +1 -1
  14. package/src/lib/haversine.ts +2 -2
  15. package/src/lib/masking.ts +3 -1
  16. package/src/lib/predicateParser.test.ts +16 -0
  17. package/src/lib/predicateParser.ts +94 -86
  18. package/src/lib/projectionSearchFilter.test.ts +28 -36
  19. package/src/lib/projectionSearchFilter.ts +86 -102
  20. package/src/oauth/store.ts +3 -3
  21. package/src/priceSelector.test.ts +18 -35
  22. package/src/priceSelector.ts +6 -9
  23. package/src/product-projection-search.ts +51 -57
  24. package/src/repositories/abstract.ts +85 -41
  25. package/src/repositories/cart-discount.ts +1 -1
  26. package/src/repositories/cart.ts +36 -31
  27. package/src/repositories/category.ts +17 -19
  28. package/src/repositories/channel.ts +1 -1
  29. package/src/repositories/custom-object.ts +35 -22
  30. package/src/repositories/customer-group.ts +1 -1
  31. package/src/repositories/customer.ts +39 -1
  32. package/src/repositories/discount-code.ts +1 -1
  33. package/src/repositories/errors.ts +9 -11
  34. package/src/repositories/extension.ts +13 -11
  35. package/src/repositories/helpers.ts +8 -13
  36. package/src/repositories/index.ts +59 -0
  37. package/src/repositories/inventory-entry.ts +1 -1
  38. package/src/repositories/order.ts +6 -6
  39. package/src/repositories/payment.ts +3 -3
  40. package/src/repositories/product-discount.ts +1 -1
  41. package/src/repositories/product-projection.ts +1 -0
  42. package/src/repositories/product-type.ts +29 -34
  43. package/src/repositories/product.ts +124 -80
  44. package/src/repositories/project.ts +10 -27
  45. package/src/repositories/shipping-method.ts +15 -17
  46. package/src/repositories/shopping-list.ts +2 -2
  47. package/src/repositories/state.ts +9 -9
  48. package/src/repositories/store.ts +2 -2
  49. package/src/repositories/subscription.ts +1 -1
  50. package/src/repositories/tax-category.ts +4 -4
  51. package/src/repositories/type.ts +12 -14
  52. package/src/repositories/zone.ts +5 -6
  53. package/src/server.ts +5 -0
  54. package/src/services/abstract.ts +44 -11
  55. package/src/services/cart-discount.ts +2 -3
  56. package/src/services/cart.test.ts +8 -10
  57. package/src/services/cart.ts +8 -11
  58. package/src/services/category.test.ts +1 -2
  59. package/src/services/category.ts +2 -3
  60. package/src/services/channel.ts +2 -3
  61. package/src/services/custom-object.test.ts +5 -5
  62. package/src/services/custom-object.ts +2 -3
  63. package/src/services/customer-group.ts +2 -3
  64. package/src/services/customer.test.ts +136 -0
  65. package/src/services/customer.ts +2 -3
  66. package/src/services/discount-code.ts +2 -3
  67. package/src/services/extension.ts +2 -3
  68. package/src/services/index.ts +74 -0
  69. package/src/services/inventory-entry.test.ts +8 -12
  70. package/src/services/inventory-entry.ts +2 -3
  71. package/src/services/my-cart.ts +3 -4
  72. package/src/services/my-customer.ts +2 -3
  73. package/src/services/my-order.ts +3 -4
  74. package/src/services/my-payment.ts +2 -3
  75. package/src/services/order.test.ts +4 -6
  76. package/src/services/order.ts +2 -3
  77. package/src/services/payment.ts +2 -3
  78. package/src/services/product-discount.ts +2 -3
  79. package/src/services/product-projection.test.ts +76 -8
  80. package/src/services/product-projection.ts +2 -3
  81. package/src/services/product-type.ts +2 -3
  82. package/src/services/product.test.ts +199 -89
  83. package/src/services/product.ts +2 -3
  84. package/src/services/project.ts +3 -3
  85. package/src/services/shipping-method.ts +2 -3
  86. package/src/services/shopping-list.ts +2 -3
  87. package/src/services/state.ts +2 -3
  88. package/src/services/store.test.ts +11 -2
  89. package/src/services/store.ts +2 -3
  90. package/src/services/subscription.ts +2 -3
  91. package/src/services/tax-category.ts +2 -3
  92. package/src/services/type.ts +2 -3
  93. package/src/services/zone.ts +2 -3
  94. package/src/storage.ts +23 -30
  95. package/src/types.ts +46 -6
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/ctMock.ts","../src/storage.ts","../src/lib/expandParser.ts","../src/lib/predicateParser.ts","../src/lib/haversine.ts","../src/exceptions.ts","../src/oauth/server.ts","../src/oauth/store.ts","../src/oauth/helpers.ts","../src/helpers.ts","../src/projectAPI.ts","../src/lib/proxy.ts","../src/constants.ts","../src/services/abstract.ts","../src/repositories/helpers.ts","../src/repositories/abstract.ts","../src/repositories/errors.ts","../src/repositories/cart-discount.ts","../src/services/cart-discount.ts","../src/repositories/cart.ts","../src/repositories/order.ts","../src/services/cart.ts","../src/repositories/category.ts","../src/services/category.ts","../src/repositories/channel.ts","../src/services/channel.ts","../src/repositories/customer-group.ts","../src/services/customer-group.ts","../src/repositories/customer.ts","../src/services/customer.ts","../src/repositories/custom-object.ts","../src/services/custom-object.ts","../src/repositories/discount-code.ts","../src/services/discount-code.ts","../src/lib/masking.ts","../src/repositories/extension.ts","../src/services/extension.ts","../src/repositories/inventory-entry.ts","../src/services/inventory-entry.ts","../src/services/my-cart.ts","../src/repositories/payment.ts","../src/services/my-payment.ts","../src/services/order.ts","../src/services/payment.ts","../src/repositories/product-discount.ts","../src/services/product-discount.ts","../src/lib/projectionSearchFilter.ts","../src/priceSelector.ts","../src/product-projection-search.ts","../src/repositories/product-projection.ts","../src/services/product-projection.ts","../src/repositories/product.ts","../src/services/product.ts","../src/repositories/product-type.ts","../src/services/product-type.ts","../src/repositories/project.ts","../src/services/project.ts","../src/repositories/shipping-method.ts","../src/services/shipping-method.ts","../src/repositories/shopping-list.ts","../src/services/shopping-list.ts","../src/repositories/state.ts","../src/services/state.ts","../src/repositories/store.ts","../src/services/store.ts","../src/repositories/subscription.ts","../src/services/subscription.ts","../src/repositories/tax-category.ts","../src/services/tax-category.ts","../src/repositories/type.ts","../src/services/type.ts","../src/repositories/zone.ts","../src/services/zone.ts","../src/services/my-customer.ts","../src/services/my-order.ts","../src/repositories/my-order.ts"],"sourcesContent":["import { CommercetoolsMock, CommercetoolsMockOptions } from './ctMock'\nimport { getBaseResourceProperties } from './helpers'\n\nexport {\n CommercetoolsMock,\n getBaseResourceProperties,\n CommercetoolsMockOptions,\n}\n","import nock from 'nock'\nimport express, { NextFunction, Request, Response } from 'express'\nimport supertest from 'supertest'\nimport morgan from 'morgan'\nimport { AbstractStorage, InMemoryStorage } from './storage'\nimport { Services } from './types'\nimport { CommercetoolsError } from './exceptions'\nimport { OAuth2Server } from './oauth/server'\nimport { ProjectAPI } from './projectAPI'\nimport { copyHeaders } from './lib/proxy'\nimport { DEFAULT_API_HOSTNAME, DEFAULT_AUTH_HOSTNAME } from './constants'\n\n// Services\nimport { CartDiscountService } from './services/cart-discount'\nimport { CartService } from './services/cart'\nimport { CategoryServices } from './services/category'\nimport { ChannelService } from './services/channel'\nimport { CustomerGroupService } from './services/customer-group'\nimport { CustomerService } from './services/customer'\nimport { CustomObjectService } from './services/custom-object'\nimport { DiscountCodeService } from './services/discount-code'\nimport { ExtensionServices } from './services/extension'\nimport { InventoryEntryService } from './services/inventory-entry'\nimport { MyCartService } from './services/my-cart'\nimport { MyPaymentService } from './services/my-payment'\nimport { OrderService } from './services/order'\nimport { PaymentService } from './services/payment'\nimport { ProductDiscountService } from './services/product-discount'\nimport { ProductProjectionService } from './services/product-projection'\nimport { ProductService } from './services/product'\nimport { ProductTypeService } from './services/product-type'\nimport { ProjectService } from './services/project'\nimport { ShippingMethodService } from './services/shipping-method'\nimport { ShoppingListService } from './services/shopping-list'\nimport { StateService } from './services/state'\nimport { StoreService } from './services/store'\nimport { SubscriptionService } from './services/subscription'\nimport { TaxCategoryService } from './services/tax-category'\nimport { TypeService } from './services/type'\nimport { ZoneService } from './services/zone'\nimport { MyCustomerService } from './services/my-customer'\nimport { MyOrderService } from './services/my-order'\n\nexport type CommercetoolsMockOptions = {\n validateCredentials: boolean\n enableAuthentication: boolean\n defaultProjectKey: string | undefined\n apiHost: RegExp | string\n authHost: RegExp | string\n silent: boolean\n}\n\ntype AppOptions = { silent?: boolean }\n\nconst DEFAULT_OPTIONS: CommercetoolsMockOptions = {\n enableAuthentication: false,\n validateCredentials: false,\n defaultProjectKey: undefined,\n apiHost: DEFAULT_API_HOSTNAME,\n authHost: DEFAULT_AUTH_HOSTNAME,\n silent: false,\n}\n\nexport class CommercetoolsMock {\n public app: express.Express\n public options: CommercetoolsMockOptions\n\n private _storage: AbstractStorage\n private _oauth2: OAuth2Server\n private _nockScopes: {\n auth: nock.Scope | undefined\n api: nock.Scope | undefined\n } = { auth: undefined, api: undefined }\n private _services: Services\n private _projectService?: ProjectService\n\n constructor(options: Partial<CommercetoolsMockOptions> = {}) {\n this.options = { ...DEFAULT_OPTIONS, ...options }\n this._services = {}\n this._projectService = undefined\n\n this._storage = new InMemoryStorage()\n this._oauth2 = new OAuth2Server({\n enabled: this.options.enableAuthentication,\n validate: this.options.validateCredentials,\n })\n\n this.app = this.createApp({ silent: this.options.silent })\n }\n\n start() {\n // Order is important here when the hostnames match\n this.mockAuthHost()\n this.mockApiHost()\n }\n\n stop() {\n this._nockScopes.auth?.persist(false)\n this._nockScopes.auth = undefined\n\n this._nockScopes.api?.persist(false)\n this._nockScopes.api = undefined\n }\n\n clear() {\n this._storage.clear()\n }\n\n project(projectKey?: string) {\n if (!projectKey && !this.options.defaultProjectKey) {\n throw new Error('No projectKey passed and no default set')\n }\n\n return new ProjectAPI(\n projectKey || this.options.defaultProjectKey!,\n this._services,\n this._storage\n )\n }\n\n runServer(port: number = 3000, options?: AppOptions) {\n const app = this.createApp(options)\n const server = app.listen(port, () => {\n console.log(`Mock server listening at http://localhost:${port}`)\n })\n server.keepAliveTimeout = 60 * 1000\n }\n\n private createApp(options?: AppOptions): express.Express {\n const app = express()\n\n const projectRouter = express.Router({ mergeParams: true })\n projectRouter.use(express.json())\n\n if (!options?.silent) {\n app.use(morgan('tiny'))\n }\n app.use('/oauth', this._oauth2.createRouter())\n\n // Only enable auth middleware if we have enabled this\n if (this.options.enableAuthentication) {\n app.use('/:projectKey', this._oauth2.createMiddleware(), projectRouter)\n app.use(\n '/:projectKey/in-store/key=:storeKey',\n this._oauth2.createMiddleware(),\n projectRouter\n )\n } else {\n app.use('/:projectKey', projectRouter)\n app.use('/:projectKey/in-store/key=:storeKey', projectRouter)\n }\n\n this._projectService = new ProjectService(projectRouter, this._storage)\n\n this._services = {\n category: new CategoryServices(projectRouter, this._storage),\n cart: new CartService(projectRouter, this._storage),\n 'cart-discount': new CartDiscountService(projectRouter, this._storage),\n customer: new CustomerService(projectRouter, this._storage),\n channel: new ChannelService(projectRouter, this._storage),\n 'customer-group': new CustomerGroupService(projectRouter, this._storage),\n 'discount-code': new DiscountCodeService(projectRouter, this._storage),\n extension: new ExtensionServices(projectRouter, this._storage),\n 'inventory-entry': new InventoryEntryService(\n projectRouter,\n this._storage\n ),\n 'key-value-document': new CustomObjectService(\n projectRouter,\n this._storage\n ),\n order: new OrderService(projectRouter, this._storage),\n payment: new PaymentService(projectRouter, this._storage),\n 'my-cart': new MyCartService(projectRouter, this._storage),\n 'my-order': new MyOrderService(projectRouter, this._storage),\n 'my-customer': new MyCustomerService(projectRouter, this._storage),\n 'my-payment': new MyPaymentService(projectRouter, this._storage),\n 'shipping-method': new ShippingMethodService(\n projectRouter,\n this._storage\n ),\n 'product-type': new ProductTypeService(projectRouter, this._storage),\n product: new ProductService(projectRouter, this._storage),\n 'product-discount': new ProductDiscountService(\n projectRouter,\n this._storage\n ),\n 'product-projection': new ProductProjectionService(\n projectRouter,\n this._storage\n ),\n 'shopping-list': new ShoppingListService(projectRouter, this._storage),\n state: new StateService(projectRouter, this._storage),\n store: new StoreService(projectRouter, this._storage),\n subscription: new SubscriptionService(projectRouter, this._storage),\n 'tax-category': new TaxCategoryService(projectRouter, this._storage),\n type: new TypeService(projectRouter, this._storage),\n zone: new ZoneService(projectRouter, this._storage),\n }\n\n app.use((err: Error, req: Request, resp: Response, next: NextFunction) => {\n if (err instanceof CommercetoolsError) {\n return resp.status(err.statusCode).send({\n statusCode: err.statusCode,\n message: err.message,\n errors: [err.info],\n })\n } else {\n console.error(err)\n return resp.status(500).send({\n error: err.message,\n })\n }\n })\n\n return app\n }\n\n private mockApiHost() {\n const app = this.app\n\n this._nockScopes.api = nock(this.options.apiHost)\n .persist()\n .get(/.*/)\n .reply(async function(uri) {\n const response = await supertest(app)\n .get(uri)\n .set(copyHeaders(this.req.headers))\n return [response.status, response.body]\n })\n .post(/.*/)\n .reply(async function(uri, body) {\n const response = await supertest(app)\n .post(uri)\n .set(copyHeaders(this.req.headers))\n .send(body)\n return [response.status, response.body]\n })\n .delete(/.*/)\n .reply(async function(uri, body) {\n const response = await supertest(app)\n .delete(uri)\n .set(copyHeaders(this.req.headers))\n .send(body)\n return [response.status, response.body]\n })\n }\n\n private mockAuthHost() {\n const app = this.app\n\n this._nockScopes.auth = nock(this.options.authHost)\n .persist()\n .post(/^\\/oauth\\/.*/)\n .reply(async function(uri, body) {\n const response = await supertest(app)\n .post(uri + '?' + body)\n .set(copyHeaders(this.req.headers))\n .send()\n return [response.status, response.body]\n })\n }\n}\n","import assert from 'assert'\nimport {\n BaseResource,\n Cart,\n Category,\n Customer,\n CustomObject,\n InventoryEntry,\n Order,\n PagedQueryResponse,\n QueryParam,\n Reference,\n ResourceIdentifier,\n Product,\n Store,\n Type,\n Payment,\n Project,\n State,\n TaxCategory,\n ShippingMethod,\n ProductType,\n InvalidInputError,\n ProductProjection,\n ShoppingList,\n Extension,\n CartDiscount,\n CustomerGroup,\n DiscountCode,\n Zone,\n Channel,\n Subscription,\n ProductDiscount,\n} from '@commercetools/platform-sdk'\nimport { parseExpandClause } from './lib/expandParser'\nimport { RepositoryTypes, ResourceMap, Writable } from './types'\nimport { parseQueryExpression } from './lib/predicateParser'\nimport { CommercetoolsError } from './exceptions'\n\ntype GetParams = {\n expand?: string[]\n}\n\ntype QueryParams = {\n expand?: string | string[]\n sort?: string | string[]\n limit?: number\n offset?: number\n withTotal?: boolean\n where?: string | string[]\n [key: string]: QueryParam\n}\n\nexport abstract class AbstractStorage {\n abstract clear(): void\n\n abstract assertStorage(typeId: RepositoryTypes): void\n\n abstract all<RT extends RepositoryTypes>(\n projectKey: string,\n typeId: RT\n ): Array<ResourceMap[RT]>\n\n abstract add<RT extends RepositoryTypes>(\n projectKey: string,\n typeId: RT,\n obj: ResourceMap[RT]\n ): void\n\n abstract get<RT extends RepositoryTypes>(\n projectKey: string,\n typeId: RT,\n id: string,\n params?: GetParams\n ): ResourceMap[RT] | null\n\n abstract getByKey<RT extends RepositoryTypes>(\n projectKey: string,\n typeId: RT,\n key: string,\n params: GetParams\n ): ResourceMap[RT] | null\n\n abstract addProject(projectKey: string): Project\n abstract getProject(projectKey: string): Project\n abstract saveProject(project: Project): Project\n\n abstract delete<RT extends RepositoryTypes>(\n projectKey: string,\n typeId: RT,\n id: string,\n params: GetParams\n ): BaseResource | null\n\n abstract query(\n projectKey: string,\n typeId: RepositoryTypes,\n params: QueryParams\n ): PagedQueryResponse\n\n abstract getByResourceIdentifier<RT extends RepositoryTypes>(\n projectKey: string,\n identifier: ResourceIdentifier\n ): ResourceMap[RT] | undefined\n\n abstract expand<T>(\n projectKey: string,\n obj: T,\n clause: undefined | string | string[]\n ): T\n}\n\ntype ProjectStorage = {\n [index in RepositoryTypes]: Map<string, BaseResource>\n}\n\nexport class InMemoryStorage extends AbstractStorage {\n protected resources: {\n [projectKey: string]: ProjectStorage\n } = {}\n\n protected projects: {\n [projectKey: string]: Project\n } = {}\n\n private forProjectKey(projectKey: string): ProjectStorage {\n this.addProject(projectKey)\n\n let projectStorage = this.resources[projectKey]\n if (!projectStorage) {\n projectStorage = this.resources[projectKey] = {\n cart: new Map<string, Cart>(),\n 'cart-discount': new Map<string, CartDiscount>(),\n category: new Map<string, Category>(),\n channel: new Map<string, Channel>(),\n customer: new Map<string, Customer>(),\n 'customer-group': new Map<string, CustomerGroup>(),\n 'discount-code': new Map<string, DiscountCode>(),\n extension: new Map<string, Extension>(),\n 'inventory-entry': new Map<string, InventoryEntry>(),\n 'key-value-document': new Map<string, CustomObject>(),\n order: new Map<string, Order>(),\n 'order-edit': new Map<string, any>(),\n payment: new Map<string, Payment>(),\n product: new Map<string, Product>(),\n 'product-discount': new Map<string, ProductDiscount>(),\n 'product-price': new Map<string, any>(),\n 'product-selection': new Map<string, any>(),\n 'product-type': new Map<string, ProductType>(),\n 'product-projection': new Map<string, ProductProjection>(),\n review: new Map<string, any>(),\n 'shipping-method': new Map<string, ShippingMethod>(),\n state: new Map<string, State>(),\n store: new Map<string, Store>(),\n 'shopping-list': new Map<string, ShoppingList>(),\n 'standalone-price': new Map<string, any>(),\n subscription: new Map<string, Subscription>(),\n 'tax-category': new Map<string, TaxCategory>(),\n type: new Map<string, Type>(),\n zone: new Map<string, Zone>(),\n }\n }\n return projectStorage\n }\n\n clear() {\n for (const [, projectStorage] of Object.entries(this.resources)) {\n for (const [, value] of Object.entries(projectStorage)) {\n value?.clear()\n }\n }\n }\n\n assertStorage(typeId: RepositoryTypes) {}\n\n all<RT extends RepositoryTypes>(\n projectKey: string,\n typeId: RT\n ): ResourceMap[RT][] {\n const store = this.forProjectKey(projectKey)[typeId]\n if (store) {\n return Array.from(store.values()) as ResourceMap[RT][]\n }\n return []\n }\n\n add<RT extends RepositoryTypes>(\n projectKey: string,\n typeId: RT,\n obj: ResourceMap[RT],\n params: GetParams = {}\n ): ResourceMap[RT] {\n const store = this.forProjectKey(projectKey)\n store[typeId]?.set(obj.id, obj)\n\n const resource = this.get(projectKey, typeId, obj.id, params)\n assert(resource, `resource of type ${typeId} with id ${obj.id} not created`)\n return resource\n }\n\n get<RT extends RepositoryTypes>(\n projectKey: string,\n typeId: RT,\n id: string,\n params: GetParams = {}\n ): ResourceMap[RT] | null {\n const resource = this.forProjectKey(projectKey)[typeId]?.get(id)\n if (resource) {\n return this.expand(projectKey, resource, params.expand) as ResourceMap[RT]\n }\n return null\n }\n\n getByKey<RT extends RepositoryTypes>(\n projectKey: string,\n typeId: RT,\n key: string,\n params: GetParams = {}\n ): ResourceMap[RT] | null {\n const store = this.forProjectKey(projectKey)\n const resourceStore = store[typeId]\n if (!store) {\n throw new Error('No type')\n }\n\n const resources: any[] = Array.from(resourceStore.values())\n const resource = resources.find(e => e.key === key)\n if (resource) {\n return this.expand(projectKey, resource, params.expand) as ResourceMap[RT]\n }\n return null\n }\n\n delete<RT extends RepositoryTypes>(\n projectKey: string,\n typeId: RT,\n id: string,\n params: GetParams = {}\n ): BaseResource | null {\n const resource = this.get(projectKey, typeId, id)\n\n if (resource) {\n this.forProjectKey(projectKey)[typeId]?.delete(id)\n return this.expand(projectKey, resource, params.expand) as ResourceMap[RT]\n }\n return resource\n }\n\n query(\n projectKey: string,\n typeId: RepositoryTypes,\n params: QueryParams\n ): PagedQueryResponse {\n const store = this.forProjectKey(projectKey)[typeId]\n if (!store) {\n throw new Error('No type')\n }\n\n let resources = Array.from(store.values())\n\n // Apply predicates\n if (params.where) {\n try {\n const filterFunc = parseQueryExpression(params.where)\n resources = resources.filter(resource => filterFunc(resource, {}))\n } catch (err) {\n throw new CommercetoolsError<InvalidInputError>(\n {\n code: 'InvalidInput',\n message: (err as any).message,\n },\n 400\n )\n }\n }\n\n // Get the total before slicing the array\n const totalResources = resources.length\n\n // Apply offset, limit\n const offset = params.offset || 0\n const limit = params.limit || 20\n resources = resources.slice(offset, offset + limit)\n\n // Expand the resources\n if (params.expand !== undefined) {\n resources = resources.map(resource => {\n return this.expand(projectKey, resource, params.expand)\n })\n }\n\n return {\n count: totalResources,\n total: resources.length,\n offset: offset,\n limit: limit,\n results: resources,\n }\n }\n\n search(\n projectKey: string,\n typeId: RepositoryTypes,\n params: QueryParams\n ): PagedQueryResponse {\n const store = this.forProjectKey(projectKey)[typeId]\n if (!store) {\n throw new Error('No type')\n }\n\n let resources = Array.from(store.values())\n\n // Apply predicates\n if (params.where) {\n try {\n const filterFunc = parseQueryExpression(params.where)\n resources = resources.filter(resource => filterFunc(resource, {}))\n } catch (err) {\n throw new CommercetoolsError<InvalidInputError>(\n {\n code: 'InvalidInput',\n message: (err as any).message,\n },\n 400\n )\n }\n }\n\n // Get the total before slicing the array\n const totalResources = resources.length\n\n // Apply offset, limit\n const offset = params.offset || 0\n const limit = params.limit || 20\n resources = resources.slice(offset, offset + limit)\n\n // Expand the resources\n if (params.expand !== undefined) {\n resources = resources.map(resource => {\n return this.expand(projectKey, resource, params.expand)\n })\n }\n\n return {\n count: totalResources,\n total: resources.length,\n offset: offset,\n limit: limit,\n results: resources,\n }\n }\n\n getByResourceIdentifier<RT extends RepositoryTypes>(\n projectKey: string,\n identifier: ResourceIdentifier\n ): ResourceMap[RT] | undefined {\n if (identifier.id) {\n const resource = this.get(projectKey, identifier.typeId, identifier.id)\n if (resource) {\n return resource as ResourceMap[RT]\n }\n console.error(\n `No resource found with typeId=${identifier.typeId}, id=${identifier.id}`\n )\n return undefined\n }\n\n if (identifier.key) {\n const store = this.forProjectKey(projectKey)[identifier.typeId]\n\n if (store) {\n // TODO: BaseResource has no key attribute, but the subclasses should\n // have them all.\n const resource = Array.from(store.values()).find(\n // @ts-ignore\n r => r.key === identifier.key\n )\n if (resource) {\n return resource as ResourceMap[RT]\n }\n } else {\n throw new Error(\n `No storage found for resource type: ${identifier.typeId}`\n )\n }\n }\n return undefined\n }\n\n addProject = (projectKey: string): Project => {\n if (!this.projects[projectKey]) {\n this.projects[projectKey] = {\n key: projectKey,\n name: '',\n countries: [],\n currencies: [],\n languages: [],\n createdAt: '2018-10-04T11:32:12.603Z',\n trialUntil: '2018-12',\n carts: {\n countryTaxRateFallbackEnabled: false,\n deleteDaysAfterLastModification: 90,\n },\n messages: { enabled: false, deleteDaysAfterCreation: 15 },\n shippingRateInputType: undefined,\n externalOAuth: undefined,\n searchIndexing: {\n products: {\n status: 'Deactivated',\n },\n orders: {\n status: 'Deactivated',\n },\n },\n version: 1,\n }\n }\n return this.projects[projectKey]\n }\n\n saveProject = (project: Project): Project => {\n this.projects[project.key] = project\n return project\n }\n\n getProject = (projectKey: string): Project => {\n return this.addProject(projectKey)\n }\n\n public expand = <T>(\n projectKey: string,\n obj: T,\n clause: undefined | string | string[]\n ): T => {\n if (!clause) return obj\n const newObj = JSON.parse(JSON.stringify(obj))\n if (Array.isArray(clause)) {\n clause.forEach(c => {\n this._resolveResource(projectKey, newObj, c)\n })\n } else {\n this._resolveResource(projectKey, newObj, clause)\n }\n return newObj\n }\n\n private _resolveResource = (projectKey: string, obj: any, expand: string) => {\n const params = parseExpandClause(expand)\n\n if (!params.index) {\n const reference = obj[params.element]\n if (reference === undefined) {\n return\n }\n this._resolveReference(projectKey, reference, params.rest)\n } else if (params.index === '*') {\n const reference = obj[params.element]\n if (reference === undefined || !Array.isArray(reference)) return\n reference.forEach((itemRef: Writable<Reference>) => {\n this._resolveReference(projectKey, itemRef, params.rest)\n })\n } else {\n const reference = obj[params.element][params.index]\n if (reference === undefined) return\n this._resolveReference(projectKey, reference, params.rest)\n }\n }\n\n private _resolveReference(\n projectKey: string,\n reference: any,\n expand: string | undefined\n ) {\n if (reference === undefined) return\n\n if (\n reference.typeId !== undefined &&\n (reference.id !== undefined || reference.key !== undefined)\n ) {\n // @ts-ignore\n reference.obj = this.getByResourceIdentifier(projectKey, {\n typeId: reference.typeId,\n id: reference.id,\n key: reference.key,\n } as ResourceIdentifier)\n if (expand) {\n this._resolveResource(projectKey, reference.obj, expand)\n }\n } else {\n if (expand) {\n this._resolveResource(projectKey, reference, expand)\n }\n }\n }\n}\n","/**\n * This module implements the reference expansion as imeplemented by\n * commercetools.\n *\n * See https://docs.commercetools.com/api/general-concepts#reference-expansion\n *\n * TODO: implement support for multi-dimensional array\n */\ntype ExpandResult = {\n element: string\n index?: string | number\n rest?: string\n}\n\nexport const parseExpandClause = (clause: string): ExpandResult => {\n const result: ExpandResult = {\n element: clause,\n index: undefined,\n rest: undefined,\n }\n\n const pos = clause.indexOf('.')\n if (pos > 0) {\n result.element = clause.substring(0, pos)\n result.rest = clause.substring(pos + 1)\n }\n\n const match = result.element.match(/\\[([^\\]+])]/)\n if (match) {\n result.index = match[1] === '*' ? '*' : parseInt(match[1], 10)\n result.element = result.element.substring(0, match.index)\n }\n return result\n}\n","/**\n * This module implements the commercetools query predicate filter expression.\n * Support should be 100% complete.\n *\n * See https://docs.commercetools.com/api/predicates/query\n */\nimport perplex from 'perplex'\nimport { ITokenPosition, Parser } from 'pratt'\nimport { haversineDistance } from './haversine'\n\nexport class PredicateError {\n message: string\n\n constructor(message: string) {\n this.message = message\n }\n}\n\ntype MatchFunc = (target: any, variables: VariableMap) => boolean\ntype VariableMap = {\n [key: string]: any\n}\n\nexport const matchesPredicate = (\n predicate: string | string[] | undefined,\n target: any,\n variables?: VariableMap\n): boolean => {\n if (!predicate) {\n return true\n }\n\n if (Array.isArray(predicate)) {\n return predicate.every(item => {\n const func = generateMatchFunc(item)\n return func(target, variables || {})\n })\n } else {\n const func = generateMatchFunc(predicate)\n return func(target, variables || {})\n }\n}\n\nexport const parseQueryExpression = (\n predicate: string | string[]\n): MatchFunc => {\n if (Array.isArray(predicate)) {\n const callbacks = predicate.map(item => generateMatchFunc(item))\n return (target: any, variables: VariableMap) => {\n return callbacks.every(callback => callback(target, variables))\n }\n } else {\n return generateMatchFunc(predicate)\n }\n}\n\ntype Symbol = {\n type: 'var' | 'boolean' | 'string' | 'float' | 'int' | 'identifier'\n value: any\n pos?: ITokenPosition\n}\n\nconst validateSymbol = (val: Symbol) => {\n if (!val.type) {\n throw new PredicateError('Internal error')\n }\n\n if (val.type === 'identifier') {\n const char = val.value.charAt(0)\n const line = val.pos?.start.line\n const column = val.pos?.start.column\n\n throw new PredicateError(\n `Invalid input '${char}', expected input parameter or primitive value (line ${line}, column ${column})`\n )\n }\n}\n\nconst resolveSymbol = (val: Symbol, vars: VariableMap): any => {\n if (val.type === 'var') {\n if (!(val.value in vars)) {\n throw new PredicateError(`Missing parameter value for ${val.value}`)\n }\n return vars[val.value]\n }\n\n return val.value\n}\n\nconst resolveValue = (obj: any, val: Symbol): any => {\n if (val.type !== 'identifier') {\n throw new PredicateError('Internal error')\n }\n\n if (!(val.value in obj)) {\n if (Array.isArray(obj)) {\n return Object.values(obj)\n .filter(v => val.value in v)\n .map(v => v[val.value])\n }\n throw new PredicateError(`The field '${val.value}' does not exist.`)\n }\n\n return obj[val.value]\n}\n\nconst getLexer = (value: string) => {\n return new perplex(value)\n\n .token('AND', /and(?![-_a-z0-9]+)/i)\n .token('OR', /or(?![-_a-z0-9]+)/i)\n .token('NOT', /not(?![-_a-z0-9]+)/i)\n\n .token('WITHIN', /within(?![-_a-z0-9]+)/i)\n .token('IN', /in(?![-_a-z0-9]+)/i)\n .token('MATCHES_IGNORE_CASE', /matches\\s+ignore\\s+case(?![-_a-z0-9]+)/i)\n .token('CONTAINS', /contains(?![-_a-z0-9]+)/i)\n .token('ALL', /all(?![-_a-z0-9]+)/i)\n .token('ANY', /any(?![-_a-z0-9]+)/i)\n .token('EMPTY', /empty(?![-_a-z0-9]+)/i)\n .token('IS', /is(?![-_a-z0-9]+)/i)\n .token('DEFINED', /defined(?![-_a-z0-9]+)/i)\n\n .token('FLOAT', /\\d+\\.\\d+/)\n .token('INT', /\\d+/)\n .token('VARIABLE', /:([-_A-Za-z0-9]+)/)\n .token('IDENTIFIER', /[-_A-Za-z0-9]+/)\n .token('STRING', /\"((?:\\\\.|[^\"\\\\])*)\"/)\n .token('STRING', /'((?:\\\\.|[^'\\\\])*)'/)\n\n .token('COMMA', ',')\n .token('(', '(')\n .token(')', ')')\n .token('>=', '>=')\n .token('<=', '<=')\n .token('>', '>')\n .token('<', '<')\n .token('!=', '!=')\n .token('=', '=')\n .token('\"', '\"')\n .token('WS', /\\s+/, true) // skip\n}\n\n/**\n * This function converts a query expression in to a callable which returns a\n * boolean to indicate if the given object matches or not.\n *\n * This currently parses the predicate each time it is called, but it should be\n * straight-forward to add a query cache (lru-cache)\n */\nconst generateMatchFunc = (predicate: string): MatchFunc => {\n const lexer = getLexer(predicate)\n const parser = new Parser(lexer)\n .builder()\n .nud('IDENTIFIER', 100, t => {\n return {\n type: 'identifier',\n value: t.token.match,\n pos: t.token.strpos(),\n } as Symbol\n })\n .nud('VARIABLE', 100, t => {\n return {\n type: 'var',\n // @ts-ignore\n value: t.token.groups[1],\n pos: t.token.strpos(),\n } as Symbol\n })\n .nud('STRING', 100, t => {\n return {\n type: 'string',\n // @ts-ignore\n value: t.token.groups[1],\n pos: t.token.strpos(),\n } as Symbol\n })\n .nud('INT', 1, t => {\n return {\n type: 'int',\n value: parseInt(t.token.match, 10),\n pos: t.token.strpos(),\n } as Symbol\n })\n .nud('FLOAT', 1, t => {\n return {\n type: 'float',\n value: parseFloat(t.token.match),\n pos: t.token.strpos(),\n } as Symbol\n })\n .nud('NOT', 100, ({ bp }) => {\n const expr = parser.parse({ terminals: [bp - 1] })\n return (obj: any) => {\n return !expr(obj)\n }\n })\n .nud('EMPTY', 10, ({ bp }) => {\n return 'empty'\n })\n .nud('DEFINED', 10, ({ bp }) => {\n return 'defined'\n })\n\n .led('AND', 5, ({ left, bp }) => {\n const expr = parser.parse({ terminals: [bp - 1] })\n return (obj: any) => {\n return left(obj) && expr(obj)\n }\n })\n .led('OR', 5, ({ left, token, bp }) => {\n const expr = parser.parse({ terminals: [bp - 1] })\n return (obj: any, vars: object) => {\n return left(obj, vars) || expr(obj, vars)\n }\n })\n .led('COMMA', 1, ({ left, token, bp }) => {\n const expr: any = parser.parse({ terminals: [bp - 1] })\n if (Array.isArray(expr)) {\n return [left, ...expr]\n } else {\n return [left, expr]\n }\n })\n .nud('(', 100, t => {\n const expr: any = parser.parse({ terminals: [')'] })\n return expr\n })\n .led('(', 100, ({ left, bp }) => {\n const expr = parser.parse()\n lexer.expect(')')\n return (obj: any, vars: object) => {\n const value = resolveValue(obj, left)\n if (value) {\n return expr(value)\n }\n return false\n }\n })\n .bp(')', 0)\n .led('=', 20, ({ left, bp }) => {\n const expr = parser.parse({ terminals: [bp - 1] })\n validateSymbol(expr)\n\n return (obj: any, vars: VariableMap) => {\n const resolvedValue = resolveValue(obj, left)\n const resolvedSymbol = resolveSymbol(expr, vars)\n if (Array.isArray(resolvedValue)) {\n return !!resolvedValue.some(elem => elem === resolvedSymbol)\n }\n return resolvedValue === resolvedSymbol\n }\n })\n .led('!=', 20, ({ left, bp }) => {\n const expr = parser.parse({ terminals: [bp - 1] })\n validateSymbol(expr)\n\n return (obj: any, vars: VariableMap) => {\n return resolveValue(obj, left) !== resolveSymbol(expr, vars)\n }\n })\n .led('>', 20, ({ left, bp }) => {\n const expr = parser.parse({ terminals: [bp - 1] })\n validateSymbol(expr)\n\n return (obj: any, vars: object) => {\n return resolveValue(obj, left) > resolveSymbol(expr, vars)\n }\n })\n .led('>=', 20, ({ left, bp }) => {\n const expr = parser.parse({ terminals: [bp - 1] })\n validateSymbol(expr)\n\n return (obj: any, vars: object) => {\n return resolveValue(obj, left) >= resolveSymbol(expr, vars)\n }\n })\n .led('<', 20, ({ left, bp }) => {\n const expr = parser.parse({ terminals: [bp - 1] })\n validateSymbol(expr)\n\n return (obj: any, vars: object) => {\n return resolveValue(obj, left) < resolveSymbol(expr, vars)\n }\n })\n .led('<=', 20, ({ left, bp }) => {\n const expr = parser.parse({ terminals: [bp - 1] })\n validateSymbol(expr)\n\n return (obj: any, vars: object) => {\n return resolveValue(obj, left) <= resolveSymbol(expr, vars)\n }\n })\n .led('IS', 20, ({ left, bp }) => {\n let invert = false\n\n // Peek if this is a `is not` statement\n const next = lexer.peek()\n if (next.type === 'NOT') {\n invert = true\n lexer.next()\n }\n\n const expr: any = parser.parse({ terminals: [bp - 1] })\n\n switch (expr) {\n case 'empty': {\n if (!invert) {\n return (obj: any, vars: VariableMap) => {\n const val = resolveValue(obj, left)\n return val.length === 0\n }\n } else {\n return (obj: any, vars: VariableMap) => {\n const val = resolveValue(obj, left)\n return val.length !== 0\n }\n }\n }\n case 'defined': {\n if (!invert) {\n return (obj: any, vars: VariableMap) => {\n const val = resolveValue(obj, left)\n return val !== undefined\n }\n } else {\n return (obj: any, vars: VariableMap) => {\n const val = resolveValue(obj, left)\n return val === undefined\n }\n }\n }\n default: {\n throw new Error('Unexpected')\n }\n }\n })\n .led('IN', 20, ({ left, bp }) => {\n const expr = parser.parse({ terminals: [bp - 1] })\n return (obj: any, vars: object) => {\n let symbols = expr\n if (!Array.isArray(symbols)) {\n symbols = [expr]\n }\n\n const inValues = symbols.map((item: Symbol) =>\n resolveSymbol(item, vars)\n )\n return inValues.includes(resolveValue(obj, left))\n }\n })\n .led('MATCHES_IGNORE_CASE', 20, ({ left, bp }) => {\n const expr = parser.parse({ terminals: [bp - 1] })\n validateSymbol(expr)\n\n return (obj: any, vars: VariableMap) => {\n const value = resolveValue(obj, left)\n const other = resolveSymbol(expr, vars)\n\n if (typeof value != 'string') {\n throw new PredicateError(\n `The field '${left.value}' does not support this expression.`\n )\n }\n return value.toLowerCase() === other.toLowerCase()\n }\n })\n .led('WITHIN', 20, ({ left, bp }) => {\n const type = lexer.next()\n\n if (type.match !== 'circle') {\n throw new PredicateError(\n `Invalid input '${type.match}', expected circle`\n )\n }\n\n lexer.expect('(')\n const expr = parser.parse({ terminals: [')'] })\n\n return (obj: any, vars: object) => {\n const value = resolveValue(obj, left)\n if (!value) return false\n\n const maxDistance = resolveSymbol(expr[2], vars)\n const distance = haversineDistance(\n {\n longitude: value[0],\n latitude: value[1],\n },\n {\n longitude: resolveSymbol(expr[0], vars),\n latitude: resolveSymbol(expr[1], vars),\n }\n )\n return distance <= maxDistance\n }\n })\n .led('CONTAINS', 20, ({ left, bp }) => {\n const keyword = lexer.next()\n\n let expr = parser.parse()\n if (!Array.isArray(expr)) {\n expr = [expr]\n }\n\n return (obj: any, vars: object) => {\n const value = resolveValue(obj, left)\n\n if (!Array.isArray(value)) {\n throw new PredicateError(\n `The field '${left.value}' does not support this expression.`\n )\n }\n\n const array = expr.map((item: Symbol) => resolveSymbol(item, vars))\n if (keyword.type === 'ALL') {\n return array.every((item: any) => value.includes(item))\n } else {\n return array.some((item: any) => value.includes(item))\n }\n }\n })\n\n .build()\n\n const result = parser.parse()\n\n if (typeof result !== 'function') {\n const lines = predicate.split('\\n')\n const column = lines[lines.length - 1].length\n\n throw new PredicateError(\n `Unexpected end of input, expected SphereIdentifierChar, comparison ` +\n `operator, not, in, contains, is, within or matches` +\n ` (line ${lines.length}, column ${column})`\n )\n }\n return result\n}\n","export type Location = {\n latitude: number\n longitude: number\n}\n\n/**\n * Returns the distance between src and dst as meters\n */\nexport const haversineDistance = (src: Location, dst: Location) => {\n const RADIUS_OF_EARTH_IN_KM = 6371\n const toRadian = (deg: number) => deg * (Math.PI / 180)\n\n const dLat = toRadian(dst.latitude - src.latitude)\n const dLon = toRadian(dst.longitude - src.longitude)\n\n var a =\n Math.sin(dLat / 2) * Math.sin(dLat / 2) +\n Math.cos(toRadian(src.latitude)) *\n Math.cos(toRadian(dst.latitude)) *\n Math.sin(dLon / 2) *\n Math.sin(dLon / 2)\n var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))\n return RADIUS_OF_EARTH_IN_KM * c * 1000\n}\n","export abstract class BaseError {\n abstract message: string\n}\n\nexport class CommercetoolsError<T extends BaseError> extends Error {\n info: T\n statusCode: number\n\n constructor(info: T, statusCode = 400) {\n super(info.message)\n this.info = info\n this.statusCode = statusCode || 500\n }\n}\n\nexport interface InvalidRequestError {\n readonly code: 'invalid_request'\n readonly message: string\n}\n","import auth from 'basic-auth'\nimport bodyParser from 'body-parser'\nimport express, { NextFunction, Request, Response } from 'express'\nimport {\n AccessDeniedError,\n InvalidTokenError,\n} from '@commercetools/platform-sdk'\nimport { CommercetoolsError, InvalidRequestError } from '../exceptions'\nimport { InvalidClientError, UnsupportedGrantType } from './errors'\nimport { OAuth2Store } from './store'\nimport { getBearerToken } from './helpers'\n\nexport class OAuth2Server {\n store: OAuth2Store\n\n constructor(options: { enabled: boolean; validate: boolean }) {\n this.store = new OAuth2Store(options.validate)\n }\n\n createRouter() {\n const router = express.Router()\n router.use(bodyParser.urlencoded({ extended: true }))\n router.post('/token', this.tokenHandler.bind(this))\n return router\n }\n\n createMiddleware() {\n return async (request: Request, response: Response, next: NextFunction) => {\n const token = getBearerToken(request)\n if (!token) {\n next(\n new CommercetoolsError<AccessDeniedError>(\n {\n code: 'access_denied',\n message:\n 'This endpoint requires an access token. You can get one from the authorization server.',\n },\n 401\n )\n )\n }\n\n if (!token || !this.store.validateToken(token)) {\n next(\n new CommercetoolsError<InvalidTokenError>(\n {\n code: 'invalid_token',\n message: 'invalid_token',\n },\n 401\n )\n )\n }\n\n next()\n }\n }\n async tokenHandler(request: Request, response: Response, next: NextFunction) {\n const authHeader = request.header('Authorization')\n if (!authHeader) {\n return next(\n new CommercetoolsError<InvalidClientError>(\n {\n code: 'invalid_client',\n message:\n 'Please provide valid client credentials using HTTP Basic Authentication.',\n },\n 401\n )\n )\n }\n const credentials = auth.parse(authHeader)\n if (!credentials) {\n return next(\n new CommercetoolsError<InvalidClientError>(\n {\n code: 'invalid_client',\n message:\n 'Please provide valid client credentials using HTTP Basic Authentication.',\n },\n 400\n )\n )\n }\n\n const grantType = request.query.grant_type || request.body.grant_type\n if (!grantType) {\n return next(\n new CommercetoolsError<InvalidRequestError>(\n {\n code: 'invalid_request',\n message: 'Missing required parameter: grant_type.',\n },\n 400\n )\n )\n }\n\n if (grantType === 'client_credentials') {\n const token = this.store.getClientToken(\n credentials.name,\n credentials.pass,\n request.query.scope?.toString()\n )\n return response.status(200).send(token)\n } else {\n return next(\n new CommercetoolsError<UnsupportedGrantType>(\n {\n code: 'unsupported_grant_type',\n message: `Invalid parameter: grant_type: Invalid grant type: ${grantType}`,\n },\n 400\n )\n )\n }\n }\n}\n","import { randomBytes } from 'crypto'\n\ntype Token = {\n access_token: string\n token_type: 'Bearer'\n expires_in: number\n scope: string\n}\n\nexport class OAuth2Store {\n tokens: Token[] = []\n validate: Boolean = true\n\n constructor(validate: Boolean = true) {\n this.validate = validate\n }\n\n getClientToken(clientId: string, clientSecret: string, scope?: string) {\n const token: Token = {\n access_token: randomBytes(16).toString('base64'),\n token_type: 'Bearer',\n expires_in: 172800,\n scope: scope || 'todo',\n }\n this.tokens.push(token)\n return token\n }\n\n validateToken(token: string) {\n if (!this.validate) return true\n\n const foundToken = this.tokens.find(t => t.access_token === token)\n if (foundToken) {\n return true\n }\n return false\n }\n}\n","import { Request } from 'express'\n\nexport const getBearerToken = (request: Request): string | undefined => {\n const authHeader = request.header('Authorization')\n const match = authHeader?.match(/^Bearer\\s(?<token>[^\\s]+)$/)\n if (match) {\n return match.groups?.token\n }\n return undefined\n}\n","import { v4 as uuidv4 } from 'uuid'\nimport { ParsedQs } from 'qs'\nimport { Price } from '@commercetools/platform-sdk'\n\nexport const getBaseResourceProperties = () => {\n return {\n id: uuidv4(),\n createdAt: new Date().toISOString(),\n lastModifiedAt: new Date().toISOString(),\n version: 0,\n }\n}\n\n/**\n * Do a nested lookup by using a path. For example `foo.bar.value` will\n * return obj['foo']['bar']['value']\n */\nexport const nestedLookup = (obj: any, path: string): any => {\n if (!path || path === '') {\n return obj\n }\n\n const parts = path.split('.')\n let val = obj\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]\n if (val == undefined) {\n return undefined\n }\n\n val = val[part]\n }\n\n return val\n}\n\nexport const QueryParamsAsArray = (\n input: string | ParsedQs | string[] | ParsedQs[] | undefined\n): string[] => {\n if (input == undefined) {\n return []\n }\n\n if (Array.isArray(input)) {\n return input as string[]\n }\n return [input] as string[]\n}\n","import { ReferenceTypeId } from '@commercetools/platform-sdk'\nimport { GetParams } from 'repositories/abstract'\nimport { getBaseResourceProperties } from './helpers'\nimport { AbstractStorage } from './storage'\nimport {\n RepositoryMap,\n RepositoryTypes,\n ResourceMap,\n Services,\n ServiceTypes,\n} from './types'\n\nexport class ProjectAPI {\n private projectKey: string\n private _storage: AbstractStorage\n private _services: Services\n\n constructor(\n projectKey: string,\n services: Services,\n storage: AbstractStorage\n ) {\n this.projectKey = projectKey\n this._storage = storage\n this._services = services\n }\n\n add(typeId: ReferenceTypeId, resource: ResourceMap[ReferenceTypeId]) {\n const service = this._services[typeId]\n if (service) {\n this._storage.add(this.projectKey, typeId as ReferenceTypeId, {\n ...getBaseResourceProperties(),\n ...resource,\n })\n } else {\n throw new Error(`Service for ${typeId} not implemented yet`)\n }\n }\n\n get<RT extends RepositoryTypes>(\n typeId: RT,\n id: string,\n params?: GetParams\n ): ResourceMap[RT] {\n return this._storage.get(\n this.projectKey,\n typeId,\n id,\n params\n ) as ResourceMap[RT]\n }\n\n // TODO: Not sure if we want to expose this...\n getRepository<RT extends keyof RepositoryMap>(\n typeId: ServiceTypes\n ): RepositoryMap[RT] {\n const service = this._services[typeId]\n if (service !== undefined) {\n return service.repository as RepositoryMap[RT]\n }\n throw new Error('No such repository')\n }\n}\n","export const copyHeaders = (headers: Record<string, string>) => {\n const validHeaders = ['accept', 'host', 'authorization']\n const result: Record<string, string> = {}\n\n Object.entries(headers).forEach(([key, value]) => {\n if (validHeaders.includes(key.toLowerCase())) {\n result[key] = value\n }\n })\n\n return result\n}\n","export const DEFAULT_API_HOSTNAME = /^https:\\/\\/api\\..*?\\.commercetools.com:443$/\nexport const DEFAULT_AUTH_HOSTNAME = /^https:\\/\\/auth\\..*?\\.commercetools.com:443$/\n","import { Update } from '@commercetools/platform-sdk'\nimport { ParsedQs } from 'qs'\nimport { Request, Response, Router } from 'express'\nimport { AbstractResourceRepository } from '../repositories/abstract'\nimport { getRepositoryContext } from '../repositories/helpers'\n\nexport default abstract class AbstractService {\n protected abstract getBasePath(): string\n public abstract repository: AbstractResourceRepository\n\n createStatusCode = 201\n\n constructor(parent: Router) {\n this.registerRoutes(parent)\n }\n\n extraRoutes(router: Router) {}\n\n registerRoutes(parent: Router) {\n const basePath = this.getBasePath()\n const router = Router({ mergeParams: true })\n\n // Bind this first since the `/:id` routes are currently a bit to greedy\n this.extraRoutes(router)\n\n router.get('/', this.get.bind(this))\n router.get('/key=:key', this.getWithKey.bind(this)) // same thing goes for the key routes\n router.get('/:id', this.getWithId.bind(this))\n\n router.delete('/key=:key', this.deletewithKey.bind(this))\n router.delete('/:id', this.deletewithId.bind(this))\n\n router.post('/', this.post.bind(this))\n router.post('/key=:key', this.postWithKey.bind(this))\n router.post('/:id', this.postWithId.bind(this))\n\n parent.use(`/${basePath}`, router)\n }\n\n get(request: Request, response: Response) {\n const limit = this._parseParam(request.query.limit)\n const offset = this._parseParam(request.query.offset)\n\n const result = this.repository.query(getRepositoryContext(request), {\n expand: this._parseParam(request.query.expand),\n where: this._parseParam(request.query.where),\n limit: limit !== undefined ? Number(limit) : undefined,\n offset: offset !== undefined ? Number(offset) : undefined,\n })\n return response.status(200).send(result)\n }\n\n getWithId(request: Request, response: Response) {\n const result = this._expandWithId(request, request.params['id'])\n if (!result) {\n return response.status(404).send()\n }\n return response.status(200).send(result)\n }\n\n getWithKey(request: Request, response: Response) {\n const result = this.repository.getByKey(\n getRepositoryContext(request),\n request.params['key'],\n { expand: this._parseParam(request.query.expand) }\n )\n if (!result) return response.status(404).send()\n return response.status(200).send(result)\n }\n\n deletewithId(request: Request, response: Response) {\n const result = this.repository.delete(\n getRepositoryContext(request),\n request.params['id'],\n {\n expand: this._parseParam(request.query.expand),\n }\n )\n if (!result) {\n return response.status(404).send('Not found')\n }\n return response.status(200).send(result)\n }\n\n deletewithKey(request: Request, response: Response) {\n return response.status(500).send('Not implemented')\n }\n\n post(request: Request, response: Response) {\n const draft = request.body\n const resource = this.repository.create(\n getRepositoryContext(request),\n draft\n )\n const result = this._expandWithId(request, resource.id)\n return response.status(this.createStatusCode).send(result)\n }\n\n postWithId(request: Request, response: Response) {\n const updateRequest: Update = request.body\n const resource = this.repository.get(\n getRepositoryContext(request),\n request.params['id']\n )\n if (!resource) {\n return response.status(404).send('Not found')\n }\n\n if (resource.version !== updateRequest.version) {\n return response.status(409).send('Concurrent modification')\n }\n\n const updatedResource = this.repository.processUpdateActions(\n getRepositoryContext(request),\n resource,\n updateRequest.actions\n )\n\n const result = this._expandWithId(request, updatedResource.id)\n return response.status(200).send(result)\n }\n\n postWithKey(request: Request, response: Response) {\n return response.status(500).send('Not implemented')\n }\n\n protected _expandWithId(request: Request, resourceId: string) {\n const result = this.repository.get(\n getRepositoryContext(request),\n resourceId,\n {\n expand: this._parseParam(request.query.expand),\n }\n )\n return result\n }\n\n // No idea what i'm doing\n private _parseParam(\n value: string | ParsedQs | string[] | ParsedQs[] | undefined\n ): string[] | undefined {\n if (Array.isArray(value)) {\n // @ts-ignore\n return value\n } else if (value !== undefined) {\n return [`${value}`]\n }\n return undefined\n }\n}\n","import { v4 as uuidv4 } from 'uuid'\nimport {\n Address,\n BaseAddress,\n CustomFields,\n CustomFieldsDraft,\n InvalidJsonInputError,\n Money,\n Price,\n PriceDraft,\n Reference,\n ReferencedResourceNotFoundError,\n ResourceIdentifier,\n Store,\n StoreKeyReference,\n StoreResourceIdentifier,\n Type,\n TypedMoney,\n} from '@commercetools/platform-sdk'\nimport { Request } from 'express'\nimport { AbstractStorage } from '../storage'\nimport { RepositoryContext } from './abstract'\nimport { CommercetoolsError } from '../exceptions'\n\nexport const createAddress = (\n base: BaseAddress | undefined,\n projectKey: string,\n storage: AbstractStorage\n): Address | undefined => {\n if (!base) return undefined\n\n if (!base?.country) {\n throw new Error('Country is required')\n }\n\n return {\n ...base,\n }\n}\n\nexport const createCustomFields = (\n draft: CustomFieldsDraft | undefined,\n projectKey: string,\n storage: AbstractStorage\n): CustomFields | undefined => {\n if (!draft) return undefined\n if (!draft.type) return undefined\n if (!draft.type.typeId) return undefined\n if (!draft.fields) return undefined\n const typeResource = storage.getByResourceIdentifier(\n projectKey,\n draft.type\n ) as Type\n\n if (!typeResource) {\n throw new Error(\n `No type '${draft.type.typeId}' with id=${draft.type.id} or key=${draft.type.key}`\n )\n }\n\n return {\n type: {\n typeId: draft.type.typeId,\n id: typeResource.id,\n },\n fields: draft.fields,\n }\n}\n\nexport const createPrice = (draft: PriceDraft): Price => {\n return {\n id: uuidv4(),\n value: createTypedMoney(draft.value),\n }\n}\n\nexport const createTypedMoney = (value: Money): TypedMoney => {\n\n // Taken from https://docs.adyen.com/development-resources/currency-codes\n let fractionDigits = 2\n switch (value.currencyCode.toUpperCase()) {\n case 'BHD':\n case 'IQD':\n case 'JOD':\n case 'KWD':\n case 'LYD':\n case 'OMR':\n case 'TND':\n fractionDigits = 3\n break\n case 'CVE':\n case 'DJF':\n case 'GNF':\n case 'IDR':\n case 'JPY':\n case 'KMF':\n case 'KRW':\n case 'PYG':\n case 'RWF':\n case 'UGX':\n case 'VND':\n case 'VUV':\n case 'XAF':\n case 'XOF':\n case 'XPF':\n fractionDigits = 0\n break\n default:\n fractionDigits = 2\n }\n\n return {\n type: 'centPrecision',\n ...value,\n fractionDigits: fractionDigits,\n }\n}\n\nexport const resolveStoreReference = (\n ref: StoreResourceIdentifier | undefined,\n projectKey: string,\n storage: AbstractStorage\n): StoreKeyReference | undefined => {\n if (!ref) return undefined\n const resource = storage.getByResourceIdentifier(projectKey, ref)\n if (!resource) {\n throw new Error('No such store')\n }\n\n const store = resource as Store\n return {\n typeId: 'store',\n key: store.key,\n }\n}\n\nexport const getReferenceFromResourceIdentifier = <T extends Reference>(\n resourceIdentifier: ResourceIdentifier,\n projectKey: string,\n storage: AbstractStorage\n): T => {\n if (!resourceIdentifier.id && !resourceIdentifier.key) {\n throw new CommercetoolsError<InvalidJsonInputError>(\n {\n code: 'InvalidJsonInput',\n message: `${resourceIdentifier.typeId}: ResourceIdentifier requires an 'id' xor a 'key'`,\n },\n 400\n )\n }\n\n const resource = storage.getByResourceIdentifier(\n projectKey,\n resourceIdentifier\n )\n if (!resource) {\n const errIdentifier = resourceIdentifier.key\n ? `key '${resourceIdentifier.key}'`\n : `identifier '${resourceIdentifier.key}'`\n\n throw new CommercetoolsError<ReferencedResourceNotFoundError>(\n {\n code: 'ReferencedResourceNotFound',\n // @ts-ignore\n typeId: resourceIdentifier.typeId,\n 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).`,\n },\n 400\n )\n }\n\n return {\n typeId: resourceIdentifier.typeId,\n id: resource?.id,\n } as unknown as T\n}\n\nexport const getRepositoryContext = (request: Request): RepositoryContext => {\n return {\n projectKey: request.params.projectKey,\n storeKey: request.params.storeKey,\n }\n}\n","import { RepositoryTypes } from './../types'\nimport deepEqual from 'deep-equal'\n\nimport {\n BaseResource,\n InvalidOperationError,\n Project,\n UpdateAction,\n} from '@commercetools/platform-sdk'\nimport { AbstractStorage } from '../storage'\nimport { checkConcurrentModification } from './errors'\nimport { CommercetoolsError } from '../exceptions'\n\nexport type QueryParams = {\n expand?: string[]\n where?: string[]\n offset?: number\n limit?: number\n}\n\nexport type GetParams = {\n expand?: string[]\n}\n\nexport type RepositoryContext = {\n projectKey: string\n storeKey?: string\n}\nexport abstract class AbstractRepository {\n protected _storage: AbstractStorage\n protected actions: Partial<\n Record<\n any,\n (context: RepositoryContext, resource: any, action: any) => void\n >\n > = {}\n\n constructor(storage: AbstractStorage) {\n this._storage = storage\n }\n\n abstract save(\n { projectKey }: RepositoryContext,\n resource: BaseResource | Project\n ): void\n\n processUpdateActions(\n context: RepositoryContext,\n resource: BaseResource | Project,\n actions: UpdateAction[]\n ): BaseResource {\n // Deep-copy\n const modifiedResource = JSON.parse(JSON.stringify(resource))\n\n actions.forEach(action => {\n const updateFunc = this.actions[action.action]\n\n if (!updateFunc) {\n console.error(`No mock implemented for update action ${action.action}`)\n return\n }\n updateFunc(context, modifiedResource, action)\n })\n\n if (!deepEqual(modifiedResource, resource)) {\n this.save(context, modifiedResource)\n }\n\n const result = this.postProcessResource(modifiedResource)\n if (!result) {\n throw new Error(\"invalid post process action\")\n }\n return result\n }\n\n postProcessResource(resource: BaseResource | null): BaseResource | null {\n return resource\n }\n\n}\n\nexport abstract class AbstractResourceRepository extends AbstractRepository {\n abstract create(context: RepositoryContext, draft: any): BaseResource\n abstract getTypeId(): RepositoryTypes\n\n constructor(storage: AbstractStorage) {\n super(storage)\n this._storage.assertStorage(this.getTypeId())\n }\n\n query(context: RepositoryContext, params: QueryParams = {}) {\n const result = this._storage.query(context.projectKey, this.getTypeId(), {\n expand: params.expand,\n where: params.where,\n offset: params.offset,\n limit: params.limit,\n })\n\n // @ts-ignore\n result.results = result.results.map(this.postProcessResource)\n\n return result\n }\n\n get(\n context: RepositoryContext,\n id: string,\n params: GetParams = {}\n ): BaseResource | null {\n const resource = this._storage.get(context.projectKey, this.getTypeId(), id, params)\n return this.postProcessResource(resource)\n }\n\n getByKey(\n context: RepositoryContext,\n key: string,\n params: GetParams = {}\n ): BaseResource | null {\n const resource = this._storage.getByKey(\n context.projectKey,\n this.getTypeId(),\n key,\n params\n )\n return this.postProcessResource(resource)\n }\n\n delete(\n context: RepositoryContext,\n id: string,\n params: GetParams = {}\n ): BaseResource | null {\n const resource = this._storage.delete(\n context.projectKey,\n this.getTypeId(),\n id,\n params\n )\n return this.postProcessResource(resource)\n }\n\n save(context: RepositoryContext, resource: BaseResource) {\n const current = this.get(context, resource.id)\n\n if (current) {\n checkConcurrentModification(current, resource.version)\n } else {\n if (resource.version !== 0) {\n throw new CommercetoolsError<InvalidOperationError>(\n {\n code: 'InvalidOperation',\n message: 'version on create must be 0',\n },\n 400\n )\n }\n }\n\n // @ts-ignore\n resource.version += 1\n this._storage.add(context.projectKey, this.getTypeId(), resource as any)\n }\n}\n","import {\n BaseResource,\n ConcurrentModificationError,\n Project,\n} from '@commercetools/platform-sdk'\nimport { CommercetoolsError } from '../exceptions'\n\nexport const checkConcurrentModification = (\n resource: BaseResource | Project,\n expectedVersion: number\n) => {\n if (resource.version === expectedVersion) return\n\n const identifier = (resource as BaseResource).id\n ? (resource as BaseResource).id\n : (resource as Project).key\n\n throw new CommercetoolsError<ConcurrentModificationError>(\n {\n message: `Object ${identifier} has a different version than expected. Expected: ${expectedVersion} - Actual: ${resource.version}.`,\n currentVersion: resource.version,\n code: 'ConcurrentModification',\n },\n 409\n )\n}\n","import {\n CartDiscount,\n CartDiscountChangeIsActiveAction,\n CartDiscountChangeSortOrderAction,\n CartDiscountDraft,\n CartDiscountSetDescriptionAction,\n CartDiscountSetKeyAction,\n CartDiscountSetValidFromAction,\n CartDiscountSetValidFromAndUntilAction,\n CartDiscountSetValidUntilAction,\n CartDiscountUpdateAction,\n CartDiscountValueAbsolute,\n CartDiscountValueDraft,\n CartDiscountValueFixed,\n CartDiscountValueGiftLineItem,\n CartDiscountValueRelative,\n ReferenceTypeId,\n} from '@commercetools/platform-sdk'\nimport { Writable } from 'types'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { createTypedMoney } from './helpers'\n\nexport class CartDiscountRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'cart-discount'\n }\n\n create(context: RepositoryContext, draft: CartDiscountDraft): CartDiscount {\n const resource: CartDiscount = {\n ...getBaseResourceProperties(),\n key: draft.key,\n description: draft.description,\n cartPredicate: draft.cartPredicate,\n isActive: draft.isActive || false,\n name: draft.name,\n references: [],\n target: draft.target,\n requiresDiscountCode: draft.requiresDiscountCode || false,\n sortOrder: draft.sortOrder,\n stackingMode: draft.stackingMode || 'Stacking',\n validFrom: draft.validFrom,\n validUntil: draft.validUntil,\n value: this.transformValueDraft(draft.value),\n }\n this.save(context, resource)\n return resource\n }\n\n private transformValueDraft(value: CartDiscountValueDraft) {\n switch (value.type) {\n case 'absolute': {\n return {\n type: 'absolute',\n money: value.money.map(createTypedMoney),\n } as CartDiscountValueAbsolute\n }\n case 'fixed': {\n return {\n type: 'fixed',\n money: value.money.map(createTypedMoney),\n } as CartDiscountValueFixed\n }\n case 'giftLineItem': {\n return {\n ...value,\n } as CartDiscountValueGiftLineItem\n }\n case 'relative': {\n return {\n ...value,\n } as CartDiscountValueRelative\n }\n }\n\n return value\n }\n\n actions: Partial<\n Record<\n CartDiscountUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<CartDiscount>,\n action: any\n ) => void\n >\n > = {\n setKey: (\n context: RepositoryContext,\n resource: Writable<CartDiscount>,\n { key }: CartDiscountSetKeyAction\n ) => {\n resource.key = key\n },\n setDescription: (\n context: RepositoryContext,\n resource: Writable<CartDiscount>,\n { description }: CartDiscountSetDescriptionAction\n ) => {\n resource.description = description\n },\n setValidFrom: (\n context: RepositoryContext,\n resource: Writable<CartDiscount>,\n { validFrom }: CartDiscountSetValidFromAction\n ) => {\n resource.validFrom = validFrom\n },\n setValidUntil: (\n context: RepositoryContext,\n resource: Writable<CartDiscount>,\n { validUntil }: CartDiscountSetValidUntilAction\n ) => {\n resource.validUntil = validUntil\n },\n setValidFromAndUntil: (\n context: RepositoryContext,\n resource: Writable<CartDiscount>,\n { validFrom, validUntil }: CartDiscountSetValidFromAndUntilAction\n ) => {\n resource.validFrom = validFrom\n resource.validUntil = validUntil\n },\n changeSortOrder: (\n context: RepositoryContext,\n resource: Writable<CartDiscount>,\n { sortOrder }: CartDiscountChangeSortOrderAction\n ) => {\n resource.sortOrder = sortOrder\n },\n changeIsActive: (\n context: RepositoryContext,\n resource: Writable<CartDiscount>,\n { isActive }: CartDiscountChangeIsActiveAction\n ) => {\n resource.isActive = isActive\n },\n }\n}\n","import { Router } from 'express'\nimport AbstractService from './abstract'\nimport { AbstractStorage } from '../storage'\nimport { CartDiscountRepository } from '../repositories/cart-discount'\n\nexport class CartDiscountService extends AbstractService {\n public repository: CartDiscountRepository\n\n constructor(parent: Router, storage: AbstractStorage) {\n super(parent)\n this.repository = new CartDiscountRepository(storage)\n }\n\n getBasePath() {\n return 'cart-discounts'\n }\n}\n","import {\n Cart,\n CartAddLineItemAction,\n CartDraft,\n CartRemoveLineItemAction,\n CartSetBillingAddressAction,\n CartSetCountryAction,\n CartSetCustomerEmailAction,\n CartSetCustomFieldAction,\n CartSetCustomTypeAction,\n CartSetLocaleAction,\n CartSetShippingAddressAction,\n CartSetShippingMethodAction,\n GeneralError,\n LineItem,\n LineItemDraft,\n Price,\n Product,\n ProductPagedQueryResponse,\n ProductVariant,\n ReferenceTypeId,\n} from '@commercetools/platform-sdk'\nimport { v4 as uuidv4 } from 'uuid'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { createCustomFields } from './helpers'\nimport { Writable } from '../types'\nimport { CommercetoolsError } from '../exceptions'\n\nexport class CartRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'cart'\n }\n\n create(context: RepositoryContext, draft: CartDraft): Cart {\n const lineItems =\n draft.lineItems?.map(draftLineItem =>\n this.draftLineItemtoLineItem(\n context.projectKey,\n draftLineItem,\n draft.currency,\n draft.country\n )\n ) ?? []\n\n const resource: Cart = {\n ...getBaseResourceProperties(),\n cartState: 'Active',\n lineItems,\n customLineItems: [],\n totalPrice: {\n type: 'centPrecision',\n centAmount: 0,\n currencyCode: draft.currency,\n fractionDigits: 0,\n },\n taxMode: draft.taxMode ?? 'Platform',\n taxRoundingMode: draft.taxRoundingMode ?? 'HalfEven',\n taxCalculationMode: draft.taxCalculationMode ?? 'LineItemLevel',\n refusedGifts: [],\n locale: draft.locale,\n country: draft.country,\n origin: draft.origin ?? 'Customer',\n custom: createCustomFields(\n draft.custom,\n context.projectKey,\n this._storage\n ),\n }\n\n // @ts-ignore\n resource.totalPrice.centAmount = calculateCartTotalPrice(resource)\n\n this.save(context, resource)\n return resource\n }\n\n getActiveCart(projectKey: string): Cart | undefined {\n // Get first active cart\n const results = this._storage.query(projectKey, this.getTypeId(), {\n where: [`cartState=\"Active\"`],\n })\n if (results.count > 0) {\n return results.results[0] as Cart\n }\n\n return\n }\n\n actions = {\n addLineItem: (\n context: RepositoryContext,\n resource: Writable<Cart>,\n { productId, variantId, sku, quantity = 1 }: CartAddLineItemAction\n ) => {\n let product: Product | null = null\n let variant: ProductVariant | undefined\n\n if (productId && variantId) {\n // Fetch product and variant by ID\n product = this._storage.get(\n context.projectKey,\n 'product',\n productId,\n {}\n )\n } else if (sku) {\n // Fetch product and variant by SKU\n const items = this._storage.query(context.projectKey, 'product', {\n where: [\n `masterData(current(masterVariant(sku=\"${sku}\"))) or masterData(current(variants(sku=\"${sku}\")))`,\n ],\n }) as ProductPagedQueryResponse\n\n if (items.count === 1) {\n product = items.results[0]\n }\n }\n\n if (!product) {\n // Check if product is found\n throw new CommercetoolsError<GeneralError>({\n code: 'General',\n message: sku\n ? `A product containing a variant with SKU '${sku}' not found.`\n : `A product with ID '${productId}' not found.`,\n })\n }\n\n // Find matching variant\n variant = [\n product.masterData.current.masterVariant,\n ...product.masterData.current.variants,\n ].find(x => {\n if (sku) return x.sku === sku\n if (variantId) return x.id === variantId\n return false\n })\n\n if (!variant) {\n // Check if variant is found\n throw new CommercetoolsError<GeneralError>({\n code: 'General',\n message: sku\n ? `A variant with SKU '${sku}' for product '${product.id}' not found.`\n : `A variant with ID '${variantId}' for product '${product.id}' not found.`,\n })\n }\n\n const alreadyAdded = resource.lineItems.some(\n x => x.productId === product?.id && x.variant.id === variant?.id\n )\n if (alreadyAdded) {\n // increase quantity and update total price\n resource.lineItems.map(x => {\n if (x.productId === product?.id && x.variant.id === variant?.id) {\n x.quantity += quantity\n x.totalPrice.centAmount = calculateLineItemTotalPrice(x)\n }\n return x\n })\n } else {\n // add line item\n if (!variant.prices?.length) {\n throw new CommercetoolsError<GeneralError>({\n code: 'General',\n message: `A product with ID '${productId}' doesn't have any prices.`,\n })\n }\n\n const currency = resource.totalPrice.currencyCode\n\n const price = selectPrice({\n prices: variant.prices,\n currency,\n country: resource.country,\n })\n if (!price) {\n throw new Error(\n `No valid price found for ${productId} for country ${resource.country} and currency ${currency}`\n )\n }\n resource.lineItems.push({\n id: uuidv4(),\n productId: product.id,\n productKey: product.key,\n name: product.masterData.current.name,\n productSlug: product.masterData.current.slug,\n productType: product.productType,\n variant,\n price: price,\n totalPrice: {\n ...price.value,\n centAmount: price.value.centAmount * quantity,\n },\n quantity,\n discountedPricePerQuantity: [],\n lineItemMode: 'Standard',\n priceMode: 'Platform',\n state: [],\n })\n }\n\n // Update cart total price\n resource.totalPrice.centAmount = calculateCartTotalPrice(resource)\n },\n removeLineItem: (\n context: RepositoryContext,\n resource: Writable<Cart>,\n { lineItemId, quantity }: CartRemoveLineItemAction\n ) => {\n const lineItem = resource.lineItems.find(x => x.id === lineItemId)\n if (!lineItem) {\n // Check if product is found\n throw new CommercetoolsError<GeneralError>({\n code: 'General',\n message: `A line item with ID '${lineItemId}' not found.`,\n })\n }\n\n const shouldDelete = !quantity || quantity >= lineItem.quantity\n if (shouldDelete) {\n // delete line item\n resource.lineItems = resource.lineItems.filter(x => x.id !== lineItemId)\n } else {\n // decrease quantity and update total price\n resource.lineItems.map(x => {\n if (x.id === lineItemId && quantity) {\n x.quantity -= quantity\n x.totalPrice.centAmount = calculateLineItemTotalPrice(x)\n }\n return x\n })\n }\n\n // Update cart total price\n resource.totalPrice.centAmount = calculateCartTotalPrice(resource)\n },\n setBillingAddress: (\n context: RepositoryContext,\n resource: Writable<Cart>,\n { address }: CartSetBillingAddressAction\n ) => {\n resource.billingAddress = address\n },\n setShippingMethod: (\n context: RepositoryContext,\n resource: Writable<Cart>,\n { shippingMethod }: CartSetShippingMethodAction\n ) => {\n const resolvedType = this._storage.getByResourceIdentifier(\n context.projectKey,\n //@ts-ignore\n shippingMethod\n )\n\n if (!resolvedType) {\n throw new Error(`Type ${shippingMethod} not found`)\n }\n //@ts-ignore\n resource.shippingInfo = {\n shippingMethod: {\n typeId: 'shipping-method',\n id: resolvedType.id,\n },\n }\n },\n setCountry: (\n context: RepositoryContext,\n resource: Writable<Cart>,\n { country }: CartSetCountryAction\n ) => {\n resource.country = country\n },\n setCustomerEmail: (\n context: RepositoryContext,\n resource: Writable<Cart>,\n { email }: CartSetCustomerEmailAction\n ) => {\n resource.customerEmail = email\n },\n setCustomField: (\n context: RepositoryContext,\n resource: Cart,\n { name, value }: CartSetCustomFieldAction\n ) => {\n if (!resource.custom) {\n throw new Error('Resource has no custom field')\n }\n resource.custom.fields[name] = value\n },\n setCustomType: (\n context: RepositoryContext,\n resource: Writable<Cart>,\n { type, fields }: CartSetCustomTypeAction\n ) => {\n if (!type) {\n resource.custom = undefined\n } else {\n const resolvedType = this._storage.getByResourceIdentifier(\n context.projectKey,\n type\n )\n if (!resolvedType) {\n throw new Error(`Type ${type} not found`)\n }\n\n resource.custom = {\n type: {\n typeId: 'type',\n id: resolvedType.id,\n },\n fields: fields || [],\n }\n }\n },\n setLocale: (\n context: RepositoryContext,\n resource: Writable<Cart>,\n { locale }: CartSetLocaleAction\n ) => {\n resource.locale = locale\n },\n setShippingAddress: (\n context: RepositoryContext,\n resource: Writable<Cart>,\n { address }: CartSetShippingAddressAction\n ) => {\n resource.shippingAddress = address\n },\n }\n draftLineItemtoLineItem = (\n projectKey: string,\n draftLineItem: LineItemDraft,\n currency: string,\n country: string | undefined\n ): LineItem => {\n const { productId, quantity, variantId, sku } = draftLineItem\n\n let product: Product | null = null\n let variant: ProductVariant | undefined\n\n if (productId && variantId) {\n // Fetch product and variant by ID\n product = this._storage.get(projectKey, 'product', productId, {})\n } else if (sku) {\n // Fetch product and variant by SKU\n const items = this._storage.query(projectKey, 'product', {\n where: [\n `masterData(current(masterVariant(sku=\"${sku}\"))) or masterData(current(variants(sku=\"${sku}\")))`,\n ],\n }) as ProductPagedQueryResponse\n\n if (items.count === 1) {\n product = items.results[0]\n }\n }\n\n if (!product) {\n // Check if product is found\n throw new CommercetoolsError<GeneralError>({\n code: 'General',\n message: sku\n ? `A product containing a variant with SKU '${sku}' not found.`\n : `A product with ID '${productId}' not found.`,\n })\n }\n\n // Find matching variant\n variant = [\n product.masterData.current.masterVariant,\n ...product.masterData.current.variants,\n ].find(x => {\n if (sku) return x.sku === sku\n if (variantId) return x.id === variantId\n return false\n })\n\n if (!variant) {\n // Check if variant is found\n throw new Error(\n sku\n ? `A variant with SKU '${sku}' for product '${product.id}' not found.`\n : `A variant with ID '${variantId}' for product '${product.id}' not found.`\n )\n }\n\n const quant = quantity ?? 1\n\n const price = selectPrice({ prices: variant.prices, currency, country })\n if (!price) {\n throw new Error(\n `No valid price found for ${productId} for country ${country} and currency ${currency}`\n )\n }\n\n return {\n id: uuidv4(),\n productId: product.id,\n productKey: product.key,\n name: product.masterData.current.name,\n productSlug: product.masterData.current.slug,\n productType: product.productType,\n variant,\n price: price,\n totalPrice: {\n ...price.value,\n centAmount: price.value.centAmount * quant,\n },\n quantity: quant,\n discountedPricePerQuantity: [],\n lineItemMode: 'Standard',\n priceMode: 'Platform',\n state: [],\n }\n }\n}\n\nconst selectPrice = ({\n prices,\n currency,\n country,\n}: {\n prices: Price[] | undefined\n currency: string\n country: string | undefined\n}) => {\n if (!prices) {\n return undefined\n }\n\n // Quick-and-dirty way of selecting price based on the given currency and country.\n // Can be improved later to give more priority to exact matches over\n // 'all country' matches, and include customer groups in the mix as well\n return prices.find(price => {\n const countryMatch = !price.country || price.country === country\n const currencyMatch = price.value.currencyCode === currency\n return countryMatch && currencyMatch\n })\n}\n\nconst calculateLineItemTotalPrice = (lineItem: LineItem): number =>\n lineItem.price!.value.centAmount * lineItem.quantity\n\nconst calculateCartTotalPrice = (cart: Cart): number =>\n cart.lineItems.reduce((cur, item) => cur + item.totalPrice.centAmount, 0)\n","import assert from 'assert'\nimport {\n Cart,\n CartReference,\n CustomLineItem,\n CustomLineItemDraft,\n GeneralError,\n LineItem,\n LineItemImportDraft,\n Order,\n OrderAddPaymentAction,\n OrderChangeOrderStateAction,\n OrderChangePaymentStateAction,\n OrderFromCartDraft,\n OrderImportDraft,\n OrderSetBillingAddressAction,\n OrderSetCustomerEmailAction,\n OrderSetCustomFieldAction,\n OrderSetCustomTypeAction,\n OrderSetLocaleAction,\n OrderSetOrderNumberAction,\n OrderSetShippingAddressAction,\n OrderSetStoreAction,\n OrderTransitionStateAction,\n Product,\n ProductPagedQueryResponse,\n ProductVariant,\n ReferenceTypeId,\n State,\n Store,\n} from '@commercetools/platform-sdk'\nimport {\n AbstractResourceRepository,\n QueryParams,\n RepositoryContext,\n} from './abstract'\nimport {\n createCustomFields,\n createPrice,\n createTypedMoney,\n resolveStoreReference,\n} from './helpers'\nimport { Writable } from '../types'\nimport { getBaseResourceProperties } from '../helpers'\nimport { CommercetoolsError } from '../exceptions'\n\nexport class OrderRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'order'\n }\n\n create(context: RepositoryContext, draft: OrderFromCartDraft): Order {\n assert(draft.cart, 'draft.cart is missing')\n return this.createFromCart(\n context,\n {\n id: draft.cart.id!,\n typeId: 'cart',\n },\n draft.orderNumber\n )\n }\n\n createFromCart(\n context: RepositoryContext,\n cartReference: CartReference,\n orderNumber?: string\n ) {\n const cart = this._storage.getByResourceIdentifier(\n context.projectKey,\n cartReference\n ) as Cart | null\n if (!cart) {\n throw new Error('Cannot find cart')\n }\n\n const resource: Order = {\n ...getBaseResourceProperties(),\n orderNumber,\n cart: cartReference,\n orderState: 'Open',\n lineItems: [],\n customLineItems: [],\n totalPrice: cart.totalPrice,\n refusedGifts: [],\n origin: 'Customer',\n syncInfo: [],\n store: context.storeKey\n ? {\n key: context.storeKey,\n typeId: 'store',\n }\n : undefined,\n lastMessageSequenceNumber: 0,\n }\n this.save(context, resource)\n return resource\n }\n\n import(context: RepositoryContext, draft: OrderImportDraft): Order {\n // TODO: Check if order with given orderNumber already exists\n assert(this, 'OrderRepository not valid')\n const resource: Order = {\n ...getBaseResourceProperties(),\n\n billingAddress: draft.billingAddress,\n shippingAddress: draft.shippingAddress,\n\n custom: createCustomFields(\n draft.custom,\n context.projectKey,\n this._storage\n ),\n customerEmail: draft.customerEmail,\n lastMessageSequenceNumber: 0,\n orderNumber: draft.orderNumber,\n orderState: draft.orderState || 'Open',\n origin: draft.origin || 'Customer',\n paymentState: draft.paymentState,\n refusedGifts: [],\n store: resolveStoreReference(\n draft.store,\n context.projectKey,\n this._storage\n ),\n syncInfo: [],\n\n lineItems:\n draft.lineItems?.map(item =>\n this.lineItemFromImportDraft.bind(this)(context, item)\n ) || [],\n customLineItems:\n draft.customLineItems?.map(item =>\n this.customLineItemFromImportDraft.bind(this)(context, item)\n ) || [],\n\n totalPrice: {\n type: 'centPrecision',\n ...draft.totalPrice,\n fractionDigits: 2,\n },\n }\n this.save(context, resource)\n return resource\n }\n\n private lineItemFromImportDraft(\n context: RepositoryContext,\n draft: LineItemImportDraft\n ): LineItem {\n let product: Product\n let variant: ProductVariant | undefined\n\n if (draft.variant.sku) {\n variant = {\n id: 0,\n sku: draft.variant.sku,\n }\n\n var items = this._storage.query(context.projectKey, 'product', {\n where: [\n `masterData(current(masterVariant(sku=\"${draft.variant.sku}\"))) or masterData(current(variants(sku=\"${draft.variant.sku}\")))`,\n ],\n }) as ProductPagedQueryResponse\n\n if (items.count !== 1) {\n throw new CommercetoolsError<GeneralError>({\n code: 'General',\n message: `A product containing a variant with SKU '${draft.variant.sku}' not found.`,\n })\n }\n\n product = items.results[0]\n if (product.masterData.current.masterVariant.sku === draft.variant.sku) {\n variant = product.masterData.current.masterVariant\n } else {\n variant = product.masterData.current.variants.find(\n v => v.sku === draft.variant.sku\n )\n }\n if (!variant) {\n throw new Error('Internal state error')\n }\n } else {\n throw new Error('No product found')\n }\n\n const lineItem: LineItem = {\n ...getBaseResourceProperties(),\n custom: createCustomFields(\n draft.custom,\n context.projectKey,\n this._storage\n ),\n discountedPricePerQuantity: [],\n lineItemMode: 'Standard',\n name: draft.name,\n price: createPrice(draft.price),\n priceMode: 'Platform',\n productId: product.id,\n productType: product.productType,\n quantity: draft.quantity,\n state: draft.state || [],\n taxRate: draft.taxRate,\n totalPrice: createTypedMoney(draft.price.value),\n variant: {\n id: variant.id,\n sku: variant.sku,\n price: createPrice(draft.price),\n },\n }\n\n return lineItem\n }\n\n private customLineItemFromImportDraft(\n context: RepositoryContext,\n draft: CustomLineItemDraft\n ): CustomLineItem {\n const lineItem: CustomLineItem = {\n ...getBaseResourceProperties(),\n custom: createCustomFields(\n draft.custom,\n context.projectKey,\n this._storage\n ),\n discountedPricePerQuantity: [],\n money: createTypedMoney(draft.money),\n name: draft.name,\n quantity: draft.quantity,\n slug: draft.slug,\n state: [],\n totalPrice: createTypedMoney(draft.money),\n }\n\n return lineItem\n }\n\n getWithOrderNumber(\n context: RepositoryContext,\n orderNumber: string,\n params: QueryParams = {}\n ): Order | undefined {\n const result = this._storage.query(context.projectKey, this.getTypeId(), {\n ...params,\n where: [`orderNumber=\"${orderNumber}\"`],\n })\n if (result.count === 1) {\n return result.results[0] as Order\n }\n\n // Catch this for now, should be checked when creating/updating\n if (result.count > 1) {\n throw new Error('Duplicate order numbers')\n }\n\n return\n }\n\n actions = {\n addPayment: (\n context: RepositoryContext,\n resource: Writable<Order>,\n { payment }: OrderAddPaymentAction\n ) => {\n const resolvedPayment = this._storage.getByResourceIdentifier(\n context.projectKey,\n payment\n )\n if (!resolvedPayment) {\n throw new Error(`Payment ${payment.id} not found`)\n }\n\n if (!resource.paymentInfo) {\n resource.paymentInfo = {\n payments: [],\n }\n }\n\n resource.paymentInfo.payments.push({\n typeId: 'payment',\n id: payment.id!,\n })\n },\n changeOrderState: (\n context: RepositoryContext,\n resource: Writable<Order>,\n { orderState }: OrderChangeOrderStateAction\n ) => {\n resource.orderState = orderState\n },\n changePaymentState: (\n context: RepositoryContext,\n resource: Writable<Order>,\n { paymentState }: OrderChangePaymentStateAction\n ) => {\n resource.paymentState = paymentState\n },\n transitionState: (\n context: RepositoryContext,\n resource: Writable<Order>,\n { state }: OrderTransitionStateAction\n ) => {\n const resolvedType = this._storage.getByResourceIdentifier(\n context.projectKey,\n state\n ) as State | null\n\n if (!resolvedType) {\n throw new Error(\n `No state found with key=${state.key} or id=${state.key}`\n )\n }\n\n resource.state = { typeId: 'state', id: resolvedType.id }\n },\n setBillingAddress: (\n context: RepositoryContext,\n resource: Writable<Order>,\n { address }: OrderSetBillingAddressAction\n ) => {\n resource.billingAddress = address\n },\n setCustomerEmail: (\n context: RepositoryContext,\n resource: Writable<Order>,\n { email }: OrderSetCustomerEmailAction\n ) => {\n resource.customerEmail = email\n },\n setCustomField: (\n context: RepositoryContext,\n resource: Order,\n { name, value }: OrderSetCustomFieldAction\n ) => {\n if (!resource.custom) {\n throw new Error('Resource has no custom field')\n }\n resource.custom.fields[name] = value\n },\n setCustomType: (\n context: RepositoryContext,\n resource: Writable<Order>,\n { type, fields }: OrderSetCustomTypeAction\n ) => {\n if (!type) {\n resource.custom = undefined\n } else {\n const resolvedType = this._storage.getByResourceIdentifier(\n context.projectKey,\n type\n )\n if (!resolvedType) {\n throw new Error(`Type ${type} not found`)\n }\n\n resource.custom = {\n type: {\n typeId: 'type',\n id: resolvedType.id,\n },\n fields: fields || [],\n }\n }\n },\n setLocale: (\n context: RepositoryContext,\n resource: Writable<Order>,\n { locale }: OrderSetLocaleAction\n ) => {\n resource.locale = locale\n },\n setOrderNumber: (\n context: RepositoryContext,\n resource: Writable<Order>,\n { orderNumber }: OrderSetOrderNumberAction\n ) => {\n resource.orderNumber = orderNumber\n },\n setShippingAddress: (\n context: RepositoryContext,\n resource: Writable<Order>,\n { address }: OrderSetShippingAddressAction\n ) => {\n resource.shippingAddress = address\n },\n setStore: (\n context: RepositoryContext,\n resource: Writable<Order>,\n { store }: OrderSetStoreAction\n ) => {\n if (!store) return\n const resolvedType = this._storage.getByResourceIdentifier(\n context.projectKey,\n store\n )\n if (!resolvedType) {\n throw new Error(`No store found with key=${store.key}`)\n }\n\n const storeReference = resolvedType as Store\n resource.store = {\n typeId: 'store',\n key: storeReference.key,\n }\n },\n }\n}\n","import AbstractService from './abstract'\nimport { Router } from 'express'\nimport { CartRepository } from '../repositories/cart'\nimport { AbstractStorage } from '../storage'\nimport { Cart, CartDraft, Order } from '@commercetools/platform-sdk'\nimport { OrderRepository } from '../repositories/order'\nimport { getRepositoryContext } from '../repositories/helpers'\n\nexport class CartService extends AbstractService {\n public repository: CartRepository\n public orderRepository: OrderRepository\n\n constructor(parent: Router, storage: AbstractStorage) {\n super(parent)\n this.repository = new CartRepository(storage)\n this.orderRepository = new OrderRepository(storage)\n }\n\n getBasePath() {\n return 'carts'\n }\n\n extraRoutes(parent: Router) {\n parent.post('/replicate', (request, response) => {\n const context = getRepositoryContext(request)\n\n // @ts-ignore\n const cartOrOrder: Cart | Order | null =\n request.body.reference.typeId === 'order'\n ? this.orderRepository.get(context, request.body.reference.id)\n : this.repository.get(context, request.body.reference.id)\n\n if (!cartOrOrder) {\n return response.status(400).send()\n }\n\n const cartDraft: CartDraft = {\n ...cartOrOrder,\n currency: cartOrOrder.totalPrice.currencyCode,\n discountCodes: [],\n lineItems: cartOrOrder.lineItems.map(lineItem => {\n return {\n ...lineItem,\n variantId: lineItem.variant.id,\n sku: lineItem.variant.sku,\n }\n }),\n }\n\n const newCart = this.repository.create(context, cartDraft)\n\n return response.status(200).send(newCart)\n })\n }\n}\n","import { v4 as uuidv4 } from 'uuid'\nimport {\n Category,\n CategoryChangeAssetNameAction,\n CategoryChangeSlugAction,\n CategoryDraft,\n CategorySetAssetDescriptionAction,\n CategorySetAssetSourcesAction,\n CategorySetCustomFieldAction,\n CategorySetCustomTypeAction,\n CategorySetDescriptionAction,\n CategorySetKeyAction,\n CategorySetMetaDescriptionAction,\n CategorySetMetaKeywordsAction,\n CategorySetMetaTitleAction,\n ReferenceTypeId,\n} from '@commercetools/platform-sdk'\nimport { Writable } from 'types'\nimport { getBaseResourceProperties } from '../helpers'\nimport { createCustomFields } from './helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class CategoryRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'category'\n }\n\n create(context: RepositoryContext, draft: CategoryDraft): Category {\n const resource: Category = {\n ...getBaseResourceProperties(),\n key: draft.key,\n name: draft.name,\n slug: draft.slug,\n orderHint: draft.orderHint || '',\n externalId: draft.externalId || '',\n parent: draft.parent\n ? { typeId: 'category', id: draft.parent.id! }\n : undefined,\n ancestors: [], // TODO\n assets:\n draft.assets?.map(d => {\n return {\n id: uuidv4(),\n name: d.name,\n description: d.description,\n sources: d.sources,\n tags: d.tags,\n key: d.key,\n custom: createCustomFields(\n draft.custom,\n context.projectKey,\n this._storage\n ),\n }\n }) || [],\n custom: createCustomFields(\n draft.custom,\n context.projectKey,\n this._storage\n ),\n }\n this.save(context, resource)\n return resource\n }\n\n actions = {\n changeAssetName: (\n context: RepositoryContext,\n resource: Writable<Category>,\n { assetId, assetKey, name }: CategoryChangeAssetNameAction\n ) => {\n resource.assets?.forEach(asset => {\n if (assetId && assetId === asset.id) {\n asset.name = name\n }\n if (assetKey && assetKey === asset.key) {\n asset.name = name\n }\n })\n },\n changeSlug: (\n context: RepositoryContext,\n resource: Writable<Category>,\n { slug }: CategoryChangeSlugAction\n ) => {\n resource.slug = slug\n },\n setKey: (\n context: RepositoryContext,\n resource: Writable<Category>,\n { key }: CategorySetKeyAction\n ) => {\n resource.key = key\n },\n setAssetDescription: (\n context: RepositoryContext,\n resource: Writable<Category>,\n { assetId, assetKey, description }: CategorySetAssetDescriptionAction\n ) => {\n resource.assets?.forEach(asset => {\n if (assetId && assetId === asset.id) {\n asset.description = description\n }\n if (assetKey && assetKey === asset.key) {\n asset.description = description\n }\n })\n },\n setAssetSources: (\n context: RepositoryContext,\n resource: Writable<Category>,\n { assetId, assetKey, sources }: CategorySetAssetSourcesAction\n ) => {\n resource.assets?.forEach(asset => {\n if (assetId && assetId === asset.id) {\n asset.sources = sources\n }\n if (assetKey && assetKey === asset.key) {\n asset.sources = sources\n }\n })\n },\n setDescription: (\n context: RepositoryContext,\n resource: Writable<Category>,\n { description }: CategorySetDescriptionAction\n ) => {\n resource.description = description\n },\n setMetaDescription: (\n context: RepositoryContext,\n resource: Writable<Category>,\n { metaDescription }: CategorySetMetaDescriptionAction\n ) => {\n resource.metaDescription = metaDescription\n },\n setMetaKeywords: (\n context: RepositoryContext,\n resource: Writable<Category>,\n { metaKeywords }: CategorySetMetaKeywordsAction\n ) => {\n resource.metaKeywords = metaKeywords\n },\n setMetaTitle: (\n context: RepositoryContext,\n resource: Writable<Category>,\n { metaTitle }: CategorySetMetaTitleAction\n ) => {\n resource.metaTitle = metaTitle\n },\n setCustomType: (\n context: RepositoryContext,\n resource: Writable<Category>,\n { type, fields }: CategorySetCustomTypeAction\n ) => {\n if (type) {\n resource.custom = createCustomFields(\n { type, fields },\n context.projectKey,\n this._storage\n )\n } else {\n resource.custom = undefined\n }\n },\n setCustomField: (\n context: RepositoryContext,\n resource: Writable<Category>,\n { name, value }: CategorySetCustomFieldAction\n ) => {\n if (!resource.custom) {\n return\n }\n if (value === null) {\n delete resource.custom.fields[name]\n } else {\n resource.custom.fields[name] = value\n }\n },\n }\n}\n","import AbstractService from './abstract'\nimport { Router } from 'express'\nimport { AbstractStorage } from '../storage'\nimport { CategoryRepository } from '../repositories/category'\n\nexport class CategoryServices extends AbstractService {\n public repository: CategoryRepository\n\n constructor(parent: Router, storage: AbstractStorage) {\n super(parent)\n this.repository = new CategoryRepository(storage)\n }\n\n getBasePath() {\n return 'categories'\n }\n}\n","import {\n Channel,\n ChannelChangeDescriptionAction,\n ChannelChangeKeyAction,\n ChannelChangeNameAction,\n ChannelDraft,\n ChannelSetAddressAction,\n ChannelSetCustomFieldAction,\n ChannelSetCustomTypeAction,\n ChannelSetGeoLocationAction,\n ChannelUpdateAction,\n ReferenceTypeId,\n} from '@commercetools/platform-sdk'\nimport { Writable } from 'types'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { createAddress, createCustomFields } from './helpers'\n\nexport class ChannelRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'channel'\n }\n\n create(context: RepositoryContext, draft: ChannelDraft): Channel {\n const resource: Channel = {\n ...getBaseResourceProperties(),\n key: draft.key,\n name: draft.name,\n description: draft.description,\n roles: draft.roles || [],\n geoLocation: draft.geoLocation,\n address: createAddress(draft.address, context.projectKey, this._storage),\n custom: createCustomFields(\n draft.custom,\n context.projectKey,\n this._storage\n ),\n }\n this.save(context, resource)\n return resource\n }\n\n actions: Partial<\n Record<\n ChannelUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<Channel>,\n action: any\n ) => void\n >\n > = {\n changeKey: (\n context: RepositoryContext,\n resource: Writable<Channel>,\n { key }: ChannelChangeKeyAction\n ) => {\n resource.key = key\n },\n\n changeName: (\n context: RepositoryContext,\n resource: Writable<Channel>,\n { name }: ChannelChangeNameAction\n ) => {\n resource.name = name\n },\n\n changeDescription: (\n context: RepositoryContext,\n resource: Writable<Channel>,\n { description }: ChannelChangeDescriptionAction\n ) => {\n resource.description = description\n },\n\n setAddress: (\n context: RepositoryContext,\n resource: Writable<Channel>,\n { address }: ChannelSetAddressAction\n ) => {\n resource.address = createAddress(\n address,\n context.projectKey,\n this._storage\n )\n },\n\n setGeoLocation: (\n context: RepositoryContext,\n resource: Writable<Channel>,\n { geoLocation }: ChannelSetGeoLocationAction\n ) => {\n resource.geoLocation = geoLocation\n },\n\n setCustomType: (\n context: RepositoryContext,\n resource: Writable<Channel>,\n { type, fields }: ChannelSetCustomTypeAction\n ) => {\n if (type) {\n resource.custom = createCustomFields(\n { type, fields },\n context.projectKey,\n this._storage\n )\n } else {\n resource.custom = undefined\n }\n },\n setCustomField: (\n context: RepositoryContext,\n resource: Writable<Channel>,\n { name, value }: ChannelSetCustomFieldAction\n ) => {\n if (!resource.custom) {\n return\n }\n if (value === null) {\n delete resource.custom.fields[name]\n } else {\n resource.custom.fields[name] = value\n }\n },\n }\n}\n","import AbstractService from './abstract'\nimport { Router } from 'express'\nimport { ChannelRepository } from '../repositories/channel'\nimport { AbstractStorage } from '../storage'\n\nexport class ChannelService extends AbstractService {\n public repository: ChannelRepository\n\n constructor(parent: Router, storage: AbstractStorage) {\n super(parent)\n this.repository = new ChannelRepository(storage)\n }\n\n getBasePath() {\n return 'channels'\n }\n}\n","import {\n CustomerGroup,\n CustomerGroupChangeNameAction,\n CustomerGroupDraft,\n CustomerGroupSetCustomFieldAction,\n CustomerGroupSetCustomTypeAction,\n CustomerGroupSetKeyAction,\n ReferenceTypeId,\n} from '@commercetools/platform-sdk'\nimport { Writable } from 'types'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { createCustomFields } from './helpers'\n\nexport class CustomerGroupRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'customer'\n }\n create(context: RepositoryContext, draft: CustomerGroupDraft): CustomerGroup {\n const resource: CustomerGroup = {\n ...getBaseResourceProperties(),\n key: draft.key,\n name: draft.groupName,\n custom: createCustomFields(\n draft.custom,\n context.projectKey,\n this._storage\n ),\n }\n this.save(context, resource)\n return resource\n }\n\n actions = {\n setKey: (\n context: RepositoryContext,\n resource: Writable<CustomerGroup>,\n { key }: CustomerGroupSetKeyAction\n ) => {\n resource.key = key\n },\n changeName: (\n context: RepositoryContext,\n resource: Writable<CustomerGroup>,\n { name }: CustomerGroupChangeNameAction\n ) => {\n resource.name = name\n },\n setCustomType: (\n context: RepositoryContext,\n resource: Writable<CustomerGroup>,\n { type, fields }: CustomerGroupSetCustomTypeAction\n ) => {\n if (type) {\n resource.custom = createCustomFields(\n { type, fields },\n context.projectKey,\n this._storage\n )\n } else {\n resource.custom = undefined\n }\n },\n setCustomField: (\n context: RepositoryContext,\n resource: Writable<CustomerGroup>,\n { name, value }: CustomerGroupSetCustomFieldAction\n ) => {\n if (!resource.custom) {\n return\n }\n if (value === null) {\n delete resource.custom.fields[name]\n } else {\n resource.custom.fields[name] = value\n }\n },\n }\n}\n","import AbstractService from './abstract'\nimport { Router } from 'express'\nimport { CustomerGroupRepository } from '../repositories/customer-group'\nimport { AbstractStorage } from '../storage'\n\nexport class CustomerGroupService extends AbstractService {\n public repository: CustomerGroupRepository\n\n constructor(parent: Router, storage: AbstractStorage) {\n super(parent)\n this.repository = new CustomerGroupRepository(storage)\n }\n\n getBasePath() {\n return 'customer-groups'\n }\n}\n","import {\n Customer,\n CustomerChangeEmailAction,\n CustomerDraft,\n ReferenceTypeId,\n} from '@commercetools/platform-sdk'\nimport { Writable } from 'types'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class CustomerRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'customer'\n }\n\n create(context: RepositoryContext, draft: CustomerDraft): Customer {\n const resource: Customer = {\n ...getBaseResourceProperties(),\n email: draft.email,\n password: draft.password\n ? Buffer.from(draft.password).toString('base64')\n : undefined,\n isEmailVerified: draft.isEmailVerified || false,\n addresses: [],\n }\n this.save(context, resource)\n return resource\n }\n\n getMe(context: RepositoryContext): Customer | undefined {\n const results = this._storage.query(\n context.projectKey,\n this.getTypeId(),\n {}\n ) // grab the first customer you can find\n if (results.count > 0) {\n return results.results[0] as Customer\n }\n\n return\n }\n\n actions = {\n changeEmail: (\n _context: RepositoryContext,\n resource: Writable<Customer>,\n { email }: CustomerChangeEmailAction\n ) => {\n resource.email = email\n },\n }\n}\n","import AbstractService from './abstract'\nimport { Router } from 'express'\nimport { CustomerRepository } from '../repositories/customer'\nimport { AbstractStorage } from '../storage'\nimport { getBaseResourceProperties } from '../helpers'\nimport { v4 as uuidv4 } from 'uuid'\nimport { getRepositoryContext } from '../repositories/helpers'\n\nexport class CustomerService extends AbstractService {\n public repository: CustomerRepository\n\n constructor(parent: Router, storage: AbstractStorage) {\n super(parent)\n this.repository = new CustomerRepository(storage)\n }\n\n getBasePath() {\n return 'customers'\n }\n\n extraRoutes(parent: Router) {\n parent.post('/password-token', (request, response) => {\n const customer = this.repository.query(getRepositoryContext(request), {\n where: [`email=\"${request.body.email}\"`],\n })\n // @ts-ignore\n const ttlMinutes: number = request.params.ttlMinutes\n ? // @ts-ignore\n +request.params.ttlMinutes\n : 34560\n const { version, ...rest } = getBaseResourceProperties()\n\n return response.status(200).send({\n ...rest,\n customerId: customer.results[0].id,\n expiresAt: new Date(Date.now() + ttlMinutes * 60).toISOString(),\n value: uuidv4(),\n })\n })\n }\n}\n","import {\n CustomObject,\n CustomObjectDraft,\n ReferenceTypeId,\n} from '@commercetools/platform-sdk'\nimport { checkConcurrentModification } from './errors'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { Writable } from '../types'\nimport { getBaseResourceProperties } from '../helpers'\n\nexport class CustomObjectRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'key-value-document'\n }\n\n create(\n context: RepositoryContext,\n draft: Writable<CustomObjectDraft>\n ): CustomObject {\n const current = this.getWithContainerAndKey(\n context,\n draft.container,\n draft.key\n )\n\n const baseProperties = getBaseResourceProperties()\n if (current) {\n baseProperties.id = current.id\n\n if (!draft.version) {\n draft.version = current.version\n }\n\n checkConcurrentModification(current, draft.version)\n if (draft.value === current.value) {\n return current\n }\n\n baseProperties.version = current.version\n } else {\n if (draft.version) {\n baseProperties.version = draft.version\n }\n }\n\n const resource: CustomObject = {\n ...baseProperties,\n container: draft.container,\n key: draft.key,\n value: draft.value,\n }\n\n this.save(context, resource)\n return resource\n }\n\n getWithContainerAndKey(\n context: RepositoryContext,\n container: string,\n key: string\n ) {\n const items = this._storage.all(\n context.projectKey,\n this.getTypeId()\n ) as Array<CustomObject>\n return items.find(item => item.container === container && item.key === key)\n }\n}\n","import AbstractService from './abstract'\nimport { Request, Response, Router } from 'express'\nimport { CustomObjectRepository } from '../repositories/custom-object'\nimport { AbstractStorage } from '../storage'\nimport { CustomObjectDraft } from '@commercetools/platform-sdk'\nimport { getRepositoryContext } from '../repositories/helpers'\n\nexport class CustomObjectService extends AbstractService {\n public repository: CustomObjectRepository\n\n constructor(parent: Router, storage: AbstractStorage) {\n super(parent)\n this.repository = new CustomObjectRepository(storage)\n }\n\n getBasePath() {\n return 'custom-objects'\n }\n\n extraRoutes(router: Router) {\n router.get('/:container/:key', this.getWithContainerAndKey.bind(this))\n router.post('/:container/:key', this.createWithContainerAndKey.bind(this))\n router.delete('/:container/:key', this.deleteWithContainerAndKey.bind(this))\n }\n\n getWithContainerAndKey(request: Request, response: Response) {\n const result = this.repository.getWithContainerAndKey(\n getRepositoryContext(request),\n request.params.container,\n request.params.key\n )\n\n if (!result) {\n return response.status(404).send('Not Found')\n }\n return response.status(200).send(result)\n }\n\n createWithContainerAndKey(request: Request, response: Response) {\n const draft: CustomObjectDraft = {\n ...request.body,\n key: request.params.key,\n container: request.params.container,\n }\n\n const result = this.repository.create(getRepositoryContext(request), draft)\n return response.status(200).send(result)\n }\n\n deleteWithContainerAndKey(request: Request, response: Response) {\n const current = this.repository.getWithContainerAndKey(\n getRepositoryContext(request),\n request.params.container,\n request.params.key\n )\n\n if (!current) {\n return response.status(404).send('Not Found')\n }\n\n const result = this.repository.delete(\n getRepositoryContext(request),\n current.id\n )\n\n return response.status(200).send(result)\n }\n}\n","import {\n CartDiscountReference,\n DiscountCode,\n DiscountCodeChangeCartDiscountsAction,\n DiscountCodeChangeIsActiveAction,\n DiscountCodeDraft,\n DiscountCodeSetCartPredicateAction,\n DiscountCodeSetCustomFieldAction,\n DiscountCodeSetCustomTypeAction,\n DiscountCodeSetDescriptionAction,\n DiscountCodeSetMaxApplicationsAction,\n DiscountCodeSetMaxApplicationsPerCustomerAction,\n DiscountCodeSetNameAction,\n DiscountCodeSetValidFromAction,\n DiscountCodeSetValidFromAndUntilAction,\n DiscountCodeSetValidUntilAction,\n DiscountCodeUpdateAction,\n ReferenceTypeId,\n} from '@commercetools/platform-sdk'\nimport { Writable } from 'types'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { createCustomFields } from './helpers'\n\nexport class DiscountCodeRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'cart-discount'\n }\n\n create(context: RepositoryContext, draft: DiscountCodeDraft): DiscountCode {\n const resource: DiscountCode = {\n ...getBaseResourceProperties(),\n applicationVersion: 1,\n cartDiscounts: draft.cartDiscounts.map(\n (obj): CartDiscountReference => ({\n typeId: 'cart-discount',\n id: obj.id!,\n })\n ),\n cartPredicate: draft.cartPredicate,\n code: draft.code,\n description: draft.description,\n groups: draft.groups || [],\n isActive: draft.isActive || true,\n name: draft.name,\n references: [],\n validFrom: draft.validFrom,\n validUntil: draft.validUntil,\n maxApplications: draft.maxApplications,\n maxApplicationsPerCustomer: draft.maxApplicationsPerCustomer,\n custom: createCustomFields(\n draft.custom,\n context.projectKey,\n this._storage\n ),\n }\n this.save(context, resource)\n return resource\n }\n\n actions: Partial<\n Record<\n DiscountCodeUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<DiscountCode>,\n action: any\n ) => void\n >\n > = {\n changeIsActive: (\n context: RepositoryContext,\n resource: Writable<DiscountCode>,\n { isActive }: DiscountCodeChangeIsActiveAction\n ) => {\n resource.isActive = isActive\n },\n changeCartDiscounts: (\n context: RepositoryContext,\n resource: Writable<DiscountCode>,\n { cartDiscounts }: DiscountCodeChangeCartDiscountsAction\n ) => {\n resource.cartDiscounts = cartDiscounts.map(\n (obj): CartDiscountReference => ({\n typeId: 'cart-discount',\n id: obj.id!,\n })\n )\n },\n setDescription: (\n context: RepositoryContext,\n resource: Writable<DiscountCode>,\n { description }: DiscountCodeSetDescriptionAction\n ) => {\n resource.description = description\n },\n setCartPredicate: (\n context: RepositoryContext,\n resource: Writable<DiscountCode>,\n { cartPredicate }: DiscountCodeSetCartPredicateAction\n ) => {\n resource.cartPredicate = cartPredicate\n },\n setName: (\n context: RepositoryContext,\n resource: Writable<DiscountCode>,\n { name }: DiscountCodeSetNameAction\n ) => {\n resource.name = name\n },\n setMaxApplications: (\n context: RepositoryContext,\n resource: Writable<DiscountCode>,\n { maxApplications }: DiscountCodeSetMaxApplicationsAction\n ) => {\n resource.maxApplications = maxApplications\n },\n setMaxApplicationsPerCustomer: (\n context: RepositoryContext,\n resource: Writable<DiscountCode>,\n {\n maxApplicationsPerCustomer,\n }: DiscountCodeSetMaxApplicationsPerCustomerAction\n ) => {\n resource.maxApplicationsPerCustomer = maxApplicationsPerCustomer\n },\n setValidFrom: (\n context: RepositoryContext,\n resource: Writable<DiscountCode>,\n { validFrom }: DiscountCodeSetValidFromAction\n ) => {\n resource.validFrom = validFrom\n },\n setValidUntil: (\n context: RepositoryContext,\n resource: Writable<DiscountCode>,\n { validUntil }: DiscountCodeSetValidUntilAction\n ) => {\n resource.validUntil = validUntil\n },\n setValidFromAndUntil: (\n context: RepositoryContext,\n resource: Writable<DiscountCode>,\n { validFrom, validUntil }: DiscountCodeSetValidFromAndUntilAction\n ) => {\n resource.validFrom = validFrom\n resource.validUntil = validUntil\n },\n setCustomType: (\n context: RepositoryContext,\n resource: Writable<DiscountCode>,\n { type, fields }: DiscountCodeSetCustomTypeAction\n ) => {\n if (type) {\n resource.custom = createCustomFields(\n { type, fields },\n context.projectKey,\n this._storage\n )\n } else {\n resource.custom = undefined\n }\n },\n setCustomField: (\n context: RepositoryContext,\n resource: Writable<DiscountCode>,\n { name, value }: DiscountCodeSetCustomFieldAction\n ) => {\n if (!resource.custom) {\n return\n }\n if (value === null) {\n delete resource.custom.fields[name]\n } else {\n resource.custom.fields[name] = value\n }\n },\n }\n}\n","import { Router } from 'express'\nimport AbstractService from './abstract'\nimport { AbstractStorage } from '../storage'\nimport { DiscountCodeRepository } from '../repositories/discount-code'\n\nexport class DiscountCodeService extends AbstractService {\n public repository: DiscountCodeRepository\n\n constructor(parent: Router, storage: AbstractStorage) {\n super(parent)\n this.repository = new DiscountCodeRepository(storage)\n }\n\n getBasePath() {\n return 'discount-codes'\n }\n}\n","export const maskSecretValue = <T>(resource: T, path: string): T => {\n const parts = path.split('.')\n const clone = JSON.parse(JSON.stringify(resource))\n let val = clone\n\n const target = parts.pop()\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]\n val = val[part]\n\n if (val === undefined) {\n return resource\n }\n }\n\n if (val && target && val[target]) {\n val[target] = '****'\n }\n return clone\n}\n","import {\n Extension,\n ExtensionChangeDestinationAction,\n ExtensionChangeTriggersAction,\n ExtensionDraft,\n ExtensionSetKeyAction,\n ExtensionSetTimeoutInMsAction,\n ExtensionUpdateAction,\n ReferenceTypeId,\n} from '@commercetools/platform-sdk'\nimport { Writable } from '../types'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, GetParams, RepositoryContext } from './abstract'\nimport { maskSecretValue } from '../lib/masking'\n\nexport class ExtensionRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'extension'\n }\n\n postProcessResource(resource: Extension) {\n if (resource) {\n if (resource.destination.type === \"HTTP\" &&\n resource.destination.authentication?.type === \"AuthorizationHeader\"\n ) {\n return maskSecretValue(\n resource, 'destination.authentication.headerValue')\n }\n else if (resource.destination.type == \"AWSLambda\") {\n return maskSecretValue(\n resource, 'destination.accessSecret')\n }\n }\n return resource\n }\n\n create(context: RepositoryContext, draft: ExtensionDraft): Extension {\n const resource: Extension = {\n ...getBaseResourceProperties(),\n key: draft.key,\n timeoutInMs: draft.timeoutInMs,\n destination: draft.destination,\n triggers: draft.triggers,\n }\n this.save(context, resource)\n return resource\n }\n\n actions: Record<\n ExtensionUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<Extension>,\n action: any\n ) => void\n > = {\n setKey: (\n context: RepositoryContext,\n resource: Writable<Extension>,\n { key }: ExtensionSetKeyAction\n ) => {\n resource.key = key\n },\n setTimeoutInMs: (\n context: RepositoryContext,\n resource: Writable<Extension>,\n { timeoutInMs }: ExtensionSetTimeoutInMsAction\n ) => {\n resource.timeoutInMs = timeoutInMs\n },\n changeTriggers: (\n context: RepositoryContext,\n resource: Writable<Extension>,\n { triggers }: ExtensionChangeTriggersAction\n ) => {\n resource.triggers = triggers\n },\n changeDestination: (\n context: RepositoryContext,\n resource: Writable<Extension>,\n { destination }: ExtensionChangeDestinationAction\n ) => {\n resource.destination = destination\n },\n }\n}\n","import AbstractService from './abstract'\nimport { Router } from 'express'\nimport { AbstractStorage } from '../storage'\nimport { ExtensionRepository } from '../repositories/extension'\n\nexport class ExtensionServices extends AbstractService {\n public repository: ExtensionRepository\n\n constructor(parent: Router, storage: AbstractStorage) {\n super(parent)\n this.repository = new ExtensionRepository(storage)\n }\n\n getBasePath() {\n return 'extensions'\n }\n}\n","import {\n InventoryEntry,\n InventoryEntryChangeQuantityAction,\n InventoryEntryDraft,\n InventoryEntrySetCustomFieldAction,\n InventoryEntrySetCustomTypeAction,\n InventoryEntrySetExpectedDeliveryAction,\n InventoryEntrySetRestockableInDaysAction,\n ReferenceTypeId,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { createCustomFields } from './helpers'\nimport { Writable } from '../types'\n\nexport class InventoryEntryRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'inventory-entry'\n }\n\n create(\n context: RepositoryContext,\n draft: InventoryEntryDraft\n ): InventoryEntry {\n const resource: InventoryEntry = {\n ...getBaseResourceProperties(),\n sku: draft.sku,\n quantityOnStock: draft.quantityOnStock,\n availableQuantity: draft.quantityOnStock,\n expectedDelivery: draft.expectedDelivery,\n restockableInDays: draft.restockableInDays,\n supplyChannel: {\n ...draft.supplyChannel,\n typeId: 'channel',\n id: draft.supplyChannel?.id ?? '',\n },\n custom: createCustomFields(\n draft.custom,\n context.projectKey,\n this._storage\n ),\n }\n this.save(context, resource)\n return resource\n }\n\n actions = {\n changeQuantity: (\n context: RepositoryContext,\n resource: Writable<InventoryEntry>,\n { quantity }: InventoryEntryChangeQuantityAction\n ) => {\n resource.quantityOnStock = quantity\n // don't know active reservations so just set to same value\n resource.availableQuantity = quantity\n },\n setExpectedDelivery: (\n context: RepositoryContext,\n resource: Writable<InventoryEntry>,\n { expectedDelivery }: InventoryEntrySetExpectedDeliveryAction\n ) => {\n resource.expectedDelivery = new Date(expectedDelivery!).toISOString()\n },\n setCustomField: (\n context: RepositoryContext,\n resource: InventoryEntry,\n { name, value }: InventoryEntrySetCustomFieldAction\n ) => {\n if (!resource.custom) {\n throw new Error('Resource has no custom field')\n }\n resource.custom.fields[name] = value\n },\n setCustomType: (\n context: RepositoryContext,\n resource: Writable<InventoryEntry>,\n { type, fields }: InventoryEntrySetCustomTypeAction\n ) => {\n if (!type) {\n resource.custom = undefined\n } else {\n const resolvedType = this._storage.getByResourceIdentifier(\n context.projectKey,\n type\n )\n if (!resolvedType) {\n throw new Error(`Type ${type} not found`)\n }\n\n resource.custom = {\n type: {\n typeId: 'type',\n id: resolvedType.id,\n },\n fields: fields || [],\n }\n }\n },\n setRestockableInDays: (\n context: RepositoryContext,\n resource: Writable<InventoryEntry>,\n { restockableInDays }: InventoryEntrySetRestockableInDaysAction\n ) => {\n resource.restockableInDays = restockableInDays\n },\n }\n}\n","import AbstractService from './abstract'\nimport { Router } from 'express'\nimport { AbstractStorage } from '../storage'\nimport { InventoryEntryRepository } from '../repositories/inventory-entry'\n\nexport class InventoryEntryService extends AbstractService {\n public repository: InventoryEntryRepository\n\n constructor(parent: Router, storage: AbstractStorage) {\n super(parent)\n this.repository = new InventoryEntryRepository(storage)\n }\n\n getBasePath() {\n return 'inventory'\n }\n}\n","import AbstractService from './abstract'\nimport { Request, Response, Router } from 'express'\nimport { AbstractStorage } from '../storage'\nimport { CartRepository } from '../repositories/cart'\n\nexport class MyCartService extends AbstractService {\n public repository: CartRepository\n\n constructor(parent: Router, storage: AbstractStorage) {\n super(parent)\n this.repository = new CartRepository(storage)\n }\n\n getBasePath() {\n return 'me'\n }\n\n registerRoutes(parent: Router) {\n // Overwrite this function to be able to handle /me/active-cart path.\n const basePath = this.getBasePath()\n const router = Router({ mergeParams: true })\n\n this.extraRoutes(router)\n\n router.get('/active-cart', this.activeCart.bind(this))\n router.get('/carts/', this.get.bind(this))\n router.get('/carts/:id', this.getWithId.bind(this))\n\n router.delete('/carts/:id', this.deletewithId.bind(this))\n\n router.post('/carts/', this.post.bind(this))\n router.post('/carts/:id', this.postWithId.bind(this))\n\n parent.use(`/${basePath}`, router)\n }\n\n activeCart(request: Request, response: Response) {\n const resource = this.repository.getActiveCart(request.params.projectKey)\n if (!resource) {\n return response.status(404).send('Not found')\n }\n return response.status(200).send(resource)\n }\n}\n","import {\n Payment,\n PaymentAddTransactionAction,\n PaymentChangeTransactionStateAction,\n PaymentDraft,\n PaymentSetCustomFieldAction,\n PaymentSetCustomTypeAction,\n PaymentTransitionStateAction,\n ReferenceTypeId,\n State,\n StateReference,\n Transaction,\n TransactionDraft,\n} from '@commercetools/platform-sdk'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport {\n createCustomFields,\n createTypedMoney,\n getReferenceFromResourceIdentifier,\n} from './helpers'\nimport { getBaseResourceProperties } from '../helpers'\nimport { v4 as uuidv4 } from 'uuid'\nimport { Writable } from '../types'\n\nexport class PaymentRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'payment'\n }\n\n create(context: RepositoryContext, draft: PaymentDraft): Payment {\n const resource: Payment = {\n ...getBaseResourceProperties(),\n amountPlanned: createTypedMoney(draft.amountPlanned),\n paymentMethodInfo: draft.paymentMethodInfo!,\n paymentStatus: draft.paymentStatus\n ? {\n ...draft.paymentStatus,\n state: draft.paymentStatus.state\n ? getReferenceFromResourceIdentifier<StateReference>(\n draft.paymentStatus.state,\n context.projectKey,\n this._storage\n )\n : undefined,\n }\n : {},\n transactions: (draft.transactions || []).map(t =>\n this.transactionFromTransactionDraft(t, context)\n ),\n interfaceInteractions: (draft.interfaceInteractions || []).map(\n interaction =>\n createCustomFields(interaction, context.projectKey, this._storage)!\n ),\n custom: createCustomFields(\n draft.custom,\n context.projectKey,\n this._storage\n ),\n }\n\n this.save(context, resource)\n return resource\n }\n\n transactionFromTransactionDraft = (\n draft: TransactionDraft,\n context: RepositoryContext\n ) => ({\n ...draft,\n id: uuidv4(),\n amount: createTypedMoney(draft.amount),\n custom: createCustomFields(draft.custom, context.projectKey, this._storage),\n })\n\n actions = {\n setCustomField: (\n context: RepositoryContext,\n resource: Payment,\n { name, value }: PaymentSetCustomFieldAction\n ) => {\n if (!resource.custom) {\n throw new Error('Resource has no custom field')\n }\n\n resource.custom.fields[name] = value\n },\n setCustomType: (\n context: RepositoryContext,\n resource: Writable<Payment>,\n { type, fields }: PaymentSetCustomTypeAction\n ) => {\n if (!type) {\n resource.custom = undefined\n } else {\n const resolvedType = this._storage.getByResourceIdentifier(\n context.projectKey,\n type\n )\n if (!resolvedType) {\n throw new Error(`Type ${type} not found`)\n }\n\n resource.custom = {\n type: {\n typeId: 'type',\n id: resolvedType.id,\n },\n fields: fields || [],\n }\n }\n },\n addTransaction: (\n context: RepositoryContext,\n resource: Writable<Payment>,\n { transaction }: PaymentAddTransactionAction\n ) => {\n resource.transactions = [\n ...resource.transactions,\n this.transactionFromTransactionDraft(transaction, context),\n ]\n },\n changeTransactionState: (\n _context: RepositoryContext,\n resource: Writable<Payment>,\n { transactionId, state }: PaymentChangeTransactionStateAction\n ) => {\n const index = resource.transactions.findIndex(\n (e: Transaction) => e.id === transactionId\n )\n const updatedTransaction: Transaction = {\n ...resource.transactions[index],\n state,\n }\n resource.transactions[index] = updatedTransaction\n },\n transitionState: (\n context: RepositoryContext,\n resource: Writable<Payment>,\n { state }: PaymentTransitionStateAction\n ) => {\n const stateObj = this._storage.getByResourceIdentifier(\n context.projectKey,\n state\n ) as State | null\n\n if (!stateObj) {\n throw new Error(`State ${state} not found`)\n }\n\n resource.paymentStatus.state = {\n typeId: 'state',\n id: stateObj.id,\n obj: stateObj,\n }\n },\n // addInterfaceInteraction: () => {},\n // changeAmountPlanned: () => {},\n // changeTransactionInteractionId: () => {},\n // changeTransactionTimestamp: () => {},\n // setAmountPaid: () => {},\n // setAmountRefunded: () => {},\n // setAnonymousId: () => {},\n // setAuthorization: () => {},\n // setCustomer: () => {},\n // setExternalId: () => {},\n // setInterfaceId: () => {},\n // setKey: () => {},\n // setMethodInfoInterface: () => {},\n // setMethodInfoMethod: () => {},\n // setMethodInfoName: () => {},\n // setStatusInterfaceCode: () => {},\n // setStatusInterfaceText: () => {},\n }\n}\n","import AbstractService from './abstract'\nimport { Router } from 'express'\nimport { AbstractStorage } from '../storage'\nimport { PaymentRepository } from '../repositories/payment'\n\nexport class MyPaymentService extends AbstractService {\n public repository: PaymentRepository\n\n constructor(parent: Router, storage: AbstractStorage) {\n super(parent)\n this.repository = new PaymentRepository(storage)\n }\n\n getBasePath() {\n return 'me/payments'\n }\n}\n","import AbstractService from './abstract'\nimport { Request, Response, Router } from 'express'\nimport { OrderRepository } from '../repositories/order'\nimport { AbstractStorage } from '../storage'\nimport { getRepositoryContext } from '../repositories/helpers'\n\nexport class OrderService extends AbstractService {\n public repository: OrderRepository\n\n constructor(parent: Router, storage: AbstractStorage) {\n super(parent)\n this.repository = new OrderRepository(storage)\n }\n\n getBasePath() {\n return 'orders'\n }\n\n extraRoutes(router: Router) {\n router.post('/import', this.import.bind(this))\n router.get('/order-number=:orderNumber', this.getWithOrderNumber.bind(this))\n }\n\n import(request: Request, response: Response) {\n const importDraft = request.body\n const resource = this.repository.import(\n getRepositoryContext(request),\n importDraft\n )\n return response.status(200).send(resource)\n }\n\n getWithOrderNumber(request: Request, response: Response) {\n const resource = this.repository.getWithOrderNumber(\n getRepositoryContext(request),\n request.params.orderNumber,\n request.query\n )\n if (resource) {\n return response.status(200).send(resource)\n }\n return response.status(404).send('Not found')\n }\n}\n","import AbstractService from './abstract'\nimport { Router } from 'express'\nimport { AbstractStorage } from '../storage'\nimport { PaymentRepository } from '../repositories/payment'\n\nexport class PaymentService extends AbstractService {\n public repository: PaymentRepository\n\n constructor(parent: Router, storage: AbstractStorage) {\n super(parent)\n this.repository = new PaymentRepository(storage)\n }\n\n getBasePath() {\n return 'payments'\n }\n}\n","import {\n ProductDiscount,\n ProductDiscountChangeIsActiveAction,\n ProductDiscountChangeNameAction,\n ProductDiscountChangePredicateAction,\n ProductDiscountChangeSortOrderAction,\n ProductDiscountChangeValueAction,\n ProductDiscountDraft,\n ProductDiscountSetDescriptionAction,\n ProductDiscountSetKeyAction,\n ProductDiscountSetValidFromAction,\n ProductDiscountSetValidFromAndUntilAction,\n ProductDiscountSetValidUntilAction,\n ProductDiscountUpdateAction,\n ProductDiscountValue,\n ProductDiscountValueAbsolute,\n ProductDiscountValueDraft,\n ProductDiscountValueExternal,\n ProductDiscountValueRelative,\n ReferenceTypeId,\n} from '@commercetools/platform-sdk'\nimport { Writable } from 'types'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { createTypedMoney } from './helpers'\n\nexport class ProductDiscountRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'product-discount'\n }\n\n create(\n context: RepositoryContext,\n draft: ProductDiscountDraft\n ): ProductDiscount {\n const resource: ProductDiscount = {\n ...getBaseResourceProperties(),\n key: draft.key,\n name: draft.name,\n description: draft.description,\n value: this.transformValueDraft(draft.value),\n predicate: draft.predicate,\n sortOrder: draft.sortOrder,\n isActive: draft.isActive || false,\n validFrom: draft.validFrom,\n validUntil: draft.validUntil,\n references: [],\n }\n this.save(context, resource)\n return resource\n }\n\n private transformValueDraft(\n value: ProductDiscountValueDraft\n ): ProductDiscountValue {\n switch (value.type) {\n case 'absolute': {\n return {\n type: 'absolute',\n money: value.money.map(createTypedMoney),\n } as ProductDiscountValueAbsolute\n }\n case 'external': {\n return {\n type: 'external',\n } as ProductDiscountValueExternal\n }\n case 'relative': {\n return {\n ...value,\n } as ProductDiscountValueRelative\n }\n }\n }\n\n getWithKey(\n context: RepositoryContext,\n key: string\n ): ProductDiscount | undefined {\n const result = this._storage.query(context.projectKey, this.getTypeId(), {\n where: [`key=\"${key}\"`],\n })\n if (result.count === 1) {\n return result.results[0] as ProductDiscount\n }\n\n // Catch this for now, should be checked when creating/updating\n if (result.count > 1) {\n throw new Error('Duplicate product discount key')\n }\n\n return\n }\n\n actions: Partial<\n Record<\n ProductDiscountUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<ProductDiscount>,\n action: any\n ) => void\n >\n > = {\n setKey: (\n context: RepositoryContext,\n resource: Writable<ProductDiscount>,\n { key }: ProductDiscountSetKeyAction\n ) => {\n resource.key = key\n },\n setDescription: (\n context: RepositoryContext,\n resource: Writable<ProductDiscount>,\n { description }: ProductDiscountSetDescriptionAction\n ) => {\n if (description && Object.keys(description).length > 0) {\n resource.description = description\n } else {\n resource.description = undefined\n }\n },\n changeName: (\n context: RepositoryContext,\n resource: Writable<ProductDiscount>,\n { name }: ProductDiscountChangeNameAction\n ) => {\n resource.name = name\n },\n changeValue: (\n context: RepositoryContext,\n resource: Writable<ProductDiscount>,\n { value }: ProductDiscountChangeValueAction\n ) => {\n resource.value = this.transformValueDraft(value)\n },\n changePredicate: (\n context: RepositoryContext,\n resource: Writable<ProductDiscount>,\n { predicate }: ProductDiscountChangePredicateAction\n ) => {\n resource.predicate = predicate\n },\n changeSortOrder: (\n context: RepositoryContext,\n resource: Writable<ProductDiscount>,\n { sortOrder }: ProductDiscountChangeSortOrderAction\n ) => {\n resource.sortOrder = sortOrder\n },\n changeIsActive: (\n context: RepositoryContext,\n resource: Writable<ProductDiscount>,\n { isActive }: ProductDiscountChangeIsActiveAction\n ) => {\n resource.isActive = isActive\n },\n setValidFrom: (\n context: RepositoryContext,\n resource: Writable<ProductDiscount>,\n { validFrom }: ProductDiscountSetValidFromAction\n ) => {\n resource.validFrom = validFrom\n },\n setValidUntil: (\n context: RepositoryContext,\n resource: Writable<ProductDiscount>,\n { validUntil }: ProductDiscountSetValidUntilAction\n ) => {\n resource.validUntil = validUntil\n },\n setValidFromAndUntil: (\n context: RepositoryContext,\n resource: Writable<ProductDiscount>,\n { validFrom, validUntil }: ProductDiscountSetValidFromAndUntilAction\n ) => {\n resource.validFrom = validFrom\n resource.validUntil = validUntil\n },\n }\n}\n","import { ProductDiscountRepository } from '../repositories/product-discount'\nimport AbstractService from './abstract'\nimport { Request, Response, Router } from 'express'\nimport { AbstractStorage } from '../storage'\nimport { getRepositoryContext } from '../repositories/helpers'\n\nexport class ProductDiscountService extends AbstractService {\n public repository: ProductDiscountRepository\n\n constructor(parent: Router, storage: AbstractStorage) {\n super(parent)\n this.repository = new ProductDiscountRepository(storage)\n }\n\n getBasePath() {\n return 'product-discounts'\n }\n\n extraRoutes(router: Router) {\n router.get('/key=:key', this.getWithKey.bind(this))\n }\n\n getWithKey(request: Request, response: Response) {\n const resource = this.repository.getWithKey(\n getRepositoryContext(request),\n request.params.key\n )\n if (resource) {\n return response.status(200).send(resource)\n }\n return response.status(404).send('Not found')\n }\n}\n","/**\n * This module implements the commercetools product projection filter expression.\n */\n\nimport { Product, ProductVariant } from '@commercetools/platform-sdk'\nimport perplex from 'perplex'\nimport Parser from 'pratt'\nimport { nestedLookup } from '../helpers'\nimport { Writable } from '../types'\n\ntype MatchFunc = (target: any) => boolean\n\ntype ProductFilter = (\n p: Writable<Product>,\n markMatchingVariants: boolean\n) => boolean\n\ntype Symbol = {\n type: 'Symbol'\n kind: 'int' | 'string' | 'any'\n value: any\n}\n\ntype RangeExpressionSet = {\n source: string\n type: 'RangeExpression'\n children?: RangeExpression[]\n}\n\ntype FilterExpressionSet = {\n source: string\n type: 'FilterExpression'\n children?: FilterExpression[]\n}\n\ntype TermExpressionSet = {\n source: string\n type: 'TermExpression'\n}\n\ntype ExpressionSet = RangeExpressionSet | FilterExpressionSet | TermExpressionSet\n\nexport type RangeExpression = {\n type: 'RangeExpression'\n start?: number\n stop?: number\n match: (obj: any) => boolean\n}\n\nexport type FilterExpression = {\n type: 'FilterExpression'\n match: (obj: any) => boolean\n}\n\n/**\n * Returns a function (ProductFilter).\n * NOTE: The filter can alter the resources in-place (FIXME)\n */\nexport const parseFilterExpression = (\n filter: string,\n staged: boolean\n): ProductFilter => {\n const exprFunc = generateMatchFunc(filter)\n const [source] = filter.split(':', 1)\n\n if (source.startsWith('variants.')) {\n return filterVariants(source, staged, exprFunc)\n }\n return filterProduct(source, exprFunc)\n}\n\nconst getLexer = (value: string) => {\n return new perplex(value)\n .token('MISSING', /missing(?![-_a-z0-9]+)/i)\n .token('EXISTS', /exists(?![-_a-z0-9]+)/i)\n .token('RANGE', /range(?![-_a-z0-9]+)/i)\n .token('TO', /to(?![-_a-z0-9]+)/i)\n .token('IDENTIFIER', /[-_\\.a-z]+/i)\n\n .token('FLOAT', /\\d+\\.\\d+/)\n .token('INT', /\\d+/)\n .token('STRING', /\"((?:\\\\.|[^\"\\\\])*)\"/)\n .token('STRING', /'((?:\\\\.|[^'\\\\])*)'/)\n\n .token('COMMA', ',')\n .token('STAR', '*')\n .token('(', '(')\n .token(':', ':')\n .token(')', ')')\n .token('\"', '\"')\n .token('WS', /\\s+/, true) // skip\n}\n\nconst parseFilter = (filter: string): ExpressionSet => {\n const lexer = getLexer(filter)\n const parser = new Parser(lexer)\n .builder()\n .nud('IDENTIFIER', 100, t => {\n return t.token.match\n })\n .led(':', 100, ({ left, bp }) => {\n let parsed: any = parser.parse({ terminals: [bp - 1] })\n let expressions: RangeExpression[] | FilterExpression[] | Symbol[]\n expressions = !Array.isArray(parsed) ? [parsed] : parsed\n\n // Make sure we only have one type of expression (cannot mix)\n const unique = new Set(expressions.map(expr => expr.type))\n if (unique.size > 1) {\n throw new Error('Invalid expression')\n }\n\n // Convert plain symbols to a filter expression. For example\n // variants.attribute.foobar:4 where 4 is a Symbol should result\n // in a comparison\n if (expressions.some(expr => expr.type == 'Symbol')) {\n return {\n source: left as string,\n type: 'FilterExpression',\n children: expressions.map((e): FilterExpression => {\n if (e.type != 'Symbol') {\n throw new Error('Invalid expression')\n }\n\n return {\n type: 'FilterExpression',\n match: (obj: any): boolean => {\n return obj === e.value\n },\n }\n })\n }\n }\n\n return {\n source: left,\n type: expressions[0].type,\n children: expressions,\n }\n })\n .nud('STRING', 20, t => {\n return {\n type: 'Symbol',\n kind: 'string',\n // @ts-ignore\n value: t.token.groups[1],\n } as Symbol\n })\n .nud('INT', 5, t => {\n return {\n type: 'Symbol',\n kind: 'int',\n value: parseInt(t.token.match, 10),\n } as Symbol\n })\n .nud('STAR', 5, t => {\n return {\n type: 'Symbol',\n kind: 'any',\n value: null,\n }\n })\n .nud('EXISTS', 10, ({ bp }) => {\n return {\n type: 'FilterExpression',\n match: (obj: any): boolean => {\n return obj !== undefined\n },\n } as FilterExpression\n })\n .nud('MISSING', 10, ({ bp }) => {\n return {\n type: 'FilterExpression',\n match: (obj: any): boolean => {\n return obj === undefined\n },\n } as FilterExpression\n })\n .led('COMMA', 200, ({ left, token, bp }) => {\n const expr: any = parser.parse({ terminals: [bp - 1] })\n if (Array.isArray(expr)) {\n return [left, ...expr]\n } else {\n return [left, expr]\n }\n })\n .nud('(', 100, t => {\n const expr: any = parser.parse({ terminals: [')'] })\n lexer.expect(')')\n return expr\n })\n .bp(')', 0)\n .led('TO', 20, ({ left, bp }) => {\n const expr: any = parser.parse({ terminals: [bp - 1] })\n return {\n start: left.value,\n stop: expr.value,\n }\n })\n .nud('RANGE', 20, ({ bp }) => {\n let ranges: any = parser.parse()\n\n // If multiple ranges are defined we receive an array of ranges. So let's\n // make sure we always have an array\n if (!Array.isArray(ranges)) {\n ranges = [ranges]\n }\n\n // Return a list of functions which matches the ranges. These functions\n // are processed as an OR clause\n return ranges.map((range: any) => {\n let func = undefined\n\n if (range.start !== null && range.stop !== null) {\n func = (obj: any): boolean => {\n return obj >= range.start && obj <= range.stop\n }\n } else if (range.start === null && range.stop !== null) {\n func = (obj: any): boolean => {\n return obj <= range.stop\n }\n } else if (range.start !== null && range.stop === null) {\n func = (obj: any): boolean => {\n return obj >= range.start\n }\n } else {\n func = (obj: any): boolean => {\n return true\n }\n }\n\n return {\n type: 'RangeExpression',\n start: range.start,\n stop: range.stop,\n match: func,\n } as RangeExpression\n })\n })\n .build()\n\n return parser.parse()\n}\n\nconst generateMatchFunc = (filter: string) => {\n const result = parseFilter(filter)\n if (!result) {\n const lines = filter.split('\\n')\n const column = lines[lines.length - 1].length\n throw new Error(`Syntax error while parsing '${filter}'.`)\n }\n if (result.type == 'TermExpression') {\n throw new Error(`Syntax error while parsing '${filter}'.`)\n }\n\n return (obj: any) => {\n if (!result.children) return false\n return result.children.some(c => c.match(obj))\n }\n}\n\nexport const generateFacetFunc = (filter: string): ExpressionSet => {\n if (!filter.includes(':')) {\n return {\n source: filter,\n type: 'TermExpression',\n }\n }\n return parseFilter(filter)\n}\n\nconst filterProduct = (source: string, exprFunc: MatchFunc): ProductFilter => {\n return (p: Product, markMatchingVariants: boolean): boolean => {\n const value = nestedLookup(p, source)\n return exprFunc(value)\n }\n}\n\nconst filterVariants = (\n source: string,\n staged: boolean,\n exprFunc: MatchFunc\n): ProductFilter => {\n return (p: Product, markMatchingVariants: boolean): boolean => {\n const [, ...paths] = source.split('.')\n const path = paths.join('.')\n\n const variants = getVariants(p, staged) as Writable<ProductVariant>[]\n for (const variant of variants) {\n const value = resolveVariantValue(variant, path)\n\n if (exprFunc(value)) {\n // If markMatchingVariants parameter is true those ProductVariants that\n // match the search query have the additional field isMatchingVariant\n // set to true. For the other variants in the same product projection\n // this field is set to false.\n if (markMatchingVariants) {\n variants.forEach(v => (v.isMatchingVariant = false))\n variant.isMatchingVariant = true\n }\n return true\n }\n }\n\n return false\n }\n}\n\nexport const resolveVariantValue = (obj: ProductVariant, path: string): any => {\n if (path === undefined) {\n return obj\n }\n if (path.startsWith('variants.')) {\n path = path.substring(path.indexOf('.') + 1)\n }\n\n if (path.startsWith('attributes.')) {\n const [, attrName, ...rest] = path.split('.')\n if (!obj.attributes) {\n return undefined\n }\n\n for (const attr of obj.attributes) {\n if (attr.name === attrName) {\n return nestedLookup(attr.value, rest.join('.'))\n }\n }\n }\n\n if (path === 'price.centAmount') {\n return obj.prices && obj.prices.length > 0\n ? obj.prices[0].value.centAmount\n : undefined\n }\n\n return nestedLookup(obj, path)\n}\n\nexport const getVariants = (p: Product, staged: boolean): ProductVariant[] => {\n return [\n staged\n ? p.masterData.staged?.masterVariant\n : p.masterData.current?.masterVariant,\n ...(staged\n ? p.masterData.staged?.variants\n : p.masterData.current?.variants),\n ]\n}\n","import {\n InvalidInputError,\n Price,\n Product,\n ProductVariant,\n} from '@commercetools/platform-sdk'\nimport { CommercetoolsError } from './exceptions'\nimport { Writable } from './types'\n\nexport type PriceSelector = {\n currency?: string\n country?: string\n customerGroup?: string\n channel?: string\n}\n\n/**\n * Apply the price selector on all the variants. The price selector is applied\n * on all the prices per variant and the first match per variant is stored in\n * the scopedPrice attribute\n */\nexport const applyPriceSelector = (\n products: Product[],\n selector: PriceSelector\n) => {\n validatePriceSelector(selector)\n\n for (const product of products) {\n const variants: Writable<ProductVariant>[] = [\n product.masterData.staged?.masterVariant,\n ...(product.masterData.staged?.variants || []),\n\n product.masterData.current?.masterVariant,\n ...(product.masterData.current?.variants || []),\n ].filter(x => x != undefined)\n\n for (const variant of variants) {\n const scopedPrices =\n variant.prices?.filter(p => priceSelectorFilter(p, selector)) ?? []\n\n if (scopedPrices.length > 0) {\n const price = scopedPrices[0]\n\n variant.scopedPriceDiscounted = false\n variant.scopedPrice = {\n ...price,\n currentValue: price.value,\n }\n }\n }\n }\n}\n\nconst validatePriceSelector = (selector: PriceSelector) => {\n if (\n (selector.country || selector.channel || selector.customerGroup) &&\n !selector.currency\n ) {\n throw new CommercetoolsError<InvalidInputError>(\n {\n code: 'InvalidInput',\n message:\n 'The price selecting parameters country, channel and customerGroup ' +\n 'cannot be used without the currency.',\n },\n 400\n )\n }\n}\n\n/**\n * Return a boolean to indicate if the price matches the selector. Price\n * selection requires that if the selector or the price has a specific value\n * then it should match.\n */\nexport const priceSelectorFilter = (\n price: Price,\n selector: PriceSelector\n): boolean => {\n if (\n (selector.country || price.country) &&\n selector.country !== price.country\n ) {\n return false\n }\n\n if (\n (selector.currency || price.value.currencyCode) &&\n selector.currency !== price.value.currencyCode\n ) {\n return false\n }\n\n if (\n (selector.channel || price.channel?.id) &&\n selector.channel !== price.channel?.id\n ) {\n return false\n }\n\n if (\n (selector.customerGroup || price.customerGroup?.id) &&\n selector.customerGroup !== price.customerGroup?.id\n ) {\n return false\n }\n\n return true\n}\n","import {\n InvalidInputError,\n ProductProjectionPagedSearchResponse,\n Product,\n ProductProjection,\n QueryParam,\n FacetResults,\n FacetTerm,\n TermFacetResult,\n RangeFacetResult,\n FilteredFacetResult,\n} from '@commercetools/platform-sdk'\nimport { ByProjectKeyProductProjectionsSearchRequestBuilder } from '@commercetools/platform-sdk/dist/declarations/src/generated/client/search/by-project-key-product-projections-search-request-builder'\nimport { nestedLookup } from './helpers'\nimport { ProductService } from './services/product'\nimport { Writable } from './types'\nimport { CommercetoolsError } from './exceptions'\nimport {\n FilterExpression,\n generateFacetFunc,\n getVariants,\n parseFilterExpression,\n RangeExpression,\n resolveVariantValue,\n} from './lib/projectionSearchFilter'\nimport { applyPriceSelector } from './priceSelector'\nimport { AbstractStorage } from './storage'\n\nexport type ProductProjectionSearchParams = {\n fuzzy?: boolean\n fuzzyLevel?: number\n markMatchingVariants?: boolean\n staged?: boolean\n filter?: string[]\n 'filter.facets'?: string[]\n 'filter.query'?: string[]\n facet?: string | string[]\n sort?: string | string[]\n limit?: number\n offset?: number\n withTotal?: boolean\n priceCurrency?: string\n priceCountry?: string\n priceCustomerGroup?: string\n priceChannel?: string\n localeProjection?: string\n storeProjection?: string\n expand?: string | string[]\n [key: string]: QueryParam\n}\n\nexport class ProductProjectionSearch {\n protected _storage: AbstractStorage\n\n constructor(storage: AbstractStorage) {\n this._storage = storage\n }\n\n search(\n projectKey: string,\n params: ProductProjectionSearchParams\n ): ProductProjectionPagedSearchResponse {\n // Get a copy of all the products in the storage engine. We need a copy\n // since we will be modifying the data.\n let resources = this._storage\n .all(projectKey, 'product')\n .map(r => JSON.parse(JSON.stringify(r)))\n\n let markMatchingVariant = params.markMatchingVariants ?? false\n\n // Apply the priceSelector\n applyPriceSelector(resources, {\n country: params.priceCountry,\n channel: params.priceChannel,\n customerGroup: params.priceCustomerGroup,\n currency: params.priceCurrency,\n })\n\n // Apply filters pre facetting\n if (params.filter) {\n try {\n const filters = params.filter.map(f =>\n parseFilterExpression(f, params.staged ?? false)\n )\n\n // Filters can modify the output. So clone the resources first.\n resources = resources.filter(resource =>\n filters.every(f => f(resource, markMatchingVariant))\n )\n } catch (err) {\n throw new CommercetoolsError<InvalidInputError>(\n {\n code: 'InvalidInput',\n message: (err as any).message,\n },\n 400\n )\n }\n }\n\n // TODO: Calculate facets\n const facets = this.getFacets(params, resources)\n\n // Apply filters post facetting\n if (params['filter.query']) {\n try {\n const filters = params['filter.query'].map(f =>\n parseFilterExpression(f, params.staged ?? false)\n )\n \n resources = resources.filter(resource =>\n filters.every(f => f(resource, markMatchingVariant))\n )\n } catch (err) {\n throw new CommercetoolsError<InvalidInputError>(\n {\n code: 'InvalidInput',\n message: (err as any).message,\n },\n 400\n )\n }\n }\n\n // Get the total before slicing the array\n const totalResources = resources.length\n\n // Apply offset, limit\n const offset = params.offset || 0\n const limit = params.limit || 20\n resources = resources.slice(offset, offset + limit)\n\n // Expand the resources\n if (params.expand !== undefined) {\n resources = resources.map(resource => {\n return this._storage.expand(projectKey, resource, params.expand)\n })\n }\n\n return {\n count: totalResources,\n total: resources.length,\n offset: offset,\n limit: limit,\n results: resources.map(this.transform),\n facets: facets,\n }\n }\n\n transform(product: Product): ProductProjection {\n const obj = product.masterData.current\n return {\n id: product.id,\n createdAt: product.createdAt,\n lastModifiedAt: product.lastModifiedAt,\n version: product.version,\n name: obj.name,\n key: product.key,\n description: obj.description,\n metaDescription: obj.metaDescription,\n slug: obj.slug,\n categories: obj.categories,\n masterVariant: obj.masterVariant,\n variants: obj.variants,\n productType: product.productType,\n }\n }\n\n getFacets(\n params: ProductProjectionSearchParams,\n products: Product[]\n ): FacetResults {\n if (!params.facet) return {}\n const staged = false\n const result: FacetResults = {}\n\n for (const facet of params.facet) {\n const expression = generateFacetFunc(facet)\n\n // Term Facet\n if (expression.type === 'TermExpression') {\n result[facet] = this.termFacet(expression.source, products, staged)\n }\n\n // Range Facet\n if (expression.type === 'RangeExpression') {\n result[expression.source] = this.rangeFacet(\n expression.source,\n expression.children,\n products,\n staged\n )\n }\n\n // FilteredFacet\n if (expression.type === 'FilterExpression') {\n result[expression.source] = this.filterFacet(\n expression.source,\n expression.children,\n products,\n staged\n )\n }\n }\n\n return result\n }\n\n /**\n * TODO: This implemention needs the following additional features:\n * - counting products\n * - correct dataType\n */\n termFacet(\n facet: string,\n products: Product[],\n staged: boolean\n ): TermFacetResult {\n const result: Writable<TermFacetResult> = {\n type: 'terms',\n dataType: 'text',\n missing: 0,\n total: 0,\n other: 0,\n terms: [],\n }\n const terms: Record<any, number> = {}\n\n if (facet.startsWith('variants.')) {\n products.forEach(p => {\n const variants = getVariants(p, staged)\n variants.forEach(v => {\n result.total++\n\n let value = resolveVariantValue(v, facet)\n if (value === undefined) {\n result.missing++\n } else {\n if (typeof value === 'number') {\n value = Number(value).toFixed(1)\n }\n terms[value] = value in terms ? terms[value] + 1 : 1\n }\n })\n })\n } else {\n products.forEach(p => {\n const value = nestedLookup(p, facet)\n result.total++\n if (value === undefined) {\n result.missing++\n } else {\n terms[value] = value in terms ? terms[value] + 1 : 1\n }\n })\n }\n for (const term in terms) {\n result.terms.push({\n term: term as any,\n count: terms[term],\n })\n }\n return result\n }\n\n filterFacet(\n source: string,\n filters: FilterExpression[] | undefined,\n products: Product[],\n staged: boolean\n ): FilteredFacetResult {\n let count = 0\n if (source.startsWith('variants.')) {\n for (const p of products) {\n for (const v of getVariants(p, staged)) {\n const val = resolveVariantValue(v, source)\n if (filters?.some(f => f.match(val))) {\n count++\n }\n }\n }\n } else {\n throw new Error('not supported')\n }\n\n return {\n type: 'filter',\n count: count,\n }\n }\n\n rangeFacet(\n source: string,\n ranges: RangeExpression[] | undefined,\n products: Product[],\n staged: boolean\n ): RangeFacetResult {\n const counts =\n ranges?.map(range => {\n if (source.startsWith('variants.')) {\n const values = []\n for (const p of products) {\n for (const v of getVariants(p, staged)) {\n const val = resolveVariantValue(v, source)\n if (val === undefined) {\n continue\n }\n\n if (range.match(val)) {\n values.push(val)\n }\n }\n }\n\n const numValues = values.length\n return {\n type: 'double',\n from: range.start || 0,\n fromStr: range.start !== null ? Number(range.start).toFixed(1) : '',\n to: range.stop || 0,\n toStr: range.stop !== null ? Number(range.stop).toFixed(1) : '',\n count: numValues,\n // totalCount: 0,\n total: values.reduce((a, b) => a + b, 0),\n min: numValues > 0 ? Math.min(...values) : 0,\n max: numValues > 0 ? Math.max(...values) : 0,\n mean: numValues > 0 ? mean(values) : 0,\n }\n } else {\n throw new Error('not supported')\n }\n }) || []\n const data: RangeFacetResult = {\n type: 'range',\n // @ts-ignore\n dataType: 'number',\n ranges: counts,\n }\n return data\n }\n}\n\nconst mean = (arr: number[]) => {\n let total = 0\n for (let i = 0; i < arr.length; i++) {\n total += arr[i]\n }\n return total / arr.length\n}\n","import { ParsedQs } from 'qs'\nimport { ProductDraft, ProductProjection } from '@commercetools/platform-sdk'\nimport {\n AbstractResourceRepository,\n QueryParams,\n RepositoryContext,\n} from './abstract'\nimport { RepositoryTypes } from '../types'\nimport { AbstractStorage } from '../storage'\nimport { ProductProjectionSearch } from '../product-projection-search'\nimport { QueryParamsAsArray } from '../helpers'\n\nexport class ProductProjectionRepository extends AbstractResourceRepository {\n protected _searchService: ProductProjectionSearch\n\n constructor(storage: AbstractStorage) {\n super(storage)\n this._searchService = new ProductProjectionSearch(storage)\n }\n\n getTypeId(): RepositoryTypes {\n return 'product-projection'\n }\n\n create(context: RepositoryContext, draft: ProductDraft): ProductProjection {\n throw new Error('No valid action')\n }\n\n query(context: RepositoryContext, params: QueryParams = {}) {\n return this._storage.query(context.projectKey, 'product', {\n expand: params.expand,\n where: params.where,\n offset: params.offset,\n limit: params.limit,\n })\n }\n\n search(context: RepositoryContext, query: ParsedQs) {\n const results = this._searchService.search(context.projectKey, {\n filter: QueryParamsAsArray(query.filter),\n 'filter.query': QueryParamsAsArray(query['filter.query']),\n facet: QueryParamsAsArray(query.facet),\n offset: query.offset ? Number(query.offset) : undefined,\n limit: query.limit ? Number(query.limit) : undefined,\n expand: QueryParamsAsArray(query.expand),\n })\n\n return results\n }\n\n actions = {}\n}\n","import { ProductProjectionRepository } from './../repositories/product-projection'\nimport AbstractService from './abstract'\nimport { AbstractStorage } from '../storage'\nimport { Request, Response, Router } from 'express'\nimport { getRepositoryContext } from '../repositories/helpers'\n\nexport class ProductProjectionService extends AbstractService {\n public repository: ProductProjectionRepository\n\n constructor(parent: Router, storage: AbstractStorage) {\n super(parent)\n this.repository = new ProductProjectionRepository(storage)\n }\n\n getBasePath() {\n return 'product-projections'\n }\n\n extraRoutes(router: Router) {\n router.get('/search', this.search.bind(this))\n }\n\n search(request: Request, response: Response) {\n const resource = this.repository.search(\n getRepositoryContext(request),\n request.query\n )\n return response.status(200).send(resource)\n }\n}\n","import {\n Price,\n PriceDraft,\n Product,\n ProductData,\n ProductDraft,\n ProductPublishAction,\n ProductSetAttributeAction,\n ProductType,\n ProductTypeReference,\n ProductVariant,\n ProductVariantDraft,\n ReferenceTypeId,\n} from '@commercetools/platform-sdk'\nimport { v4 as uuidv4 } from 'uuid'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { Writable } from '../types'\nimport { getReferenceFromResourceIdentifier } from './helpers'\n\nexport class ProductRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'product'\n }\n\n create(context: RepositoryContext, draft: ProductDraft): Product {\n if (!draft.masterVariant) {\n throw new Error('Missing master variant')\n }\n\n let productType: ProductTypeReference | undefined = undefined\n try {\n productType = getReferenceFromResourceIdentifier<ProductTypeReference>(\n draft.productType,\n context.projectKey,\n this._storage\n )\n } catch (err) {\n // For now accept missing product types (but warn)\n console.warn(\n `Error resolving product-type '${draft.productType.id}'. This will be throw an error in later releases.`\n )\n productType = {\n typeId: 'product-type',\n id: draft.productType.id || '',\n }\n }\n\n const productData: ProductData = {\n name: draft.name,\n slug: draft.slug,\n categories: [],\n masterVariant: variantFromDraft(1, draft.masterVariant),\n variants:\n draft.variants?.map((variant, index) => {\n return variantFromDraft(index + 2, variant)\n }) ?? [],\n\n // @ts-ignore\n searchKeywords: draft.searchKeywords,\n }\n\n const resource: Product = {\n ...getBaseResourceProperties(),\n productType: productType,\n masterData: {\n // @ts-ignore\n current: draft.publish ? productData : undefined,\n // @ts-ignore\n staged: draft.publish ? undefined : productData,\n hasStagedChanges: draft.publish ?? true,\n published: draft.publish ?? false,\n },\n }\n\n this.save(context, resource)\n\n return resource\n }\n\n actions = {\n publish: (\n context: RepositoryContext,\n resource: Writable<Product>,\n { scope }: ProductPublishAction\n ) => {\n if (resource.masterData.staged) {\n resource.masterData.current = resource.masterData.staged\n // @ts-ignore\n resource.masterData.staged = undefined\n }\n resource.masterData.hasStagedChanges = false\n resource.masterData.published = true\n },\n setAttribute: (\n context: RepositoryContext,\n resource: Writable<Product>,\n { variantId, sku, name, value, staged }: ProductSetAttributeAction\n ) => {\n const isStaged = staged !== undefined ? staged : false\n const productData = getProductData(resource, isStaged)\n const { variant, isMasterVariant, variantIndex } = getVariant(\n productData,\n variantId,\n sku\n )\n if (!variant) {\n throw new Error(\n `Variant with id ${variantId} or sku ${sku} not found on product ${resource.id}`\n )\n }\n\n if (!variant.attributes) {\n variant.attributes = []\n }\n\n const existingAttr = variant.attributes.find(attr => attr.name === name)\n if (existingAttr) {\n existingAttr.value = value\n } else {\n variant.attributes.push({\n name,\n value,\n })\n }\n if (isStaged) {\n resource.masterData.staged = productData\n if (isMasterVariant) {\n resource.masterData.staged.masterVariant = variant\n } else {\n resource.masterData.staged.variants[variantIndex] = variant\n }\n resource.masterData.hasStagedChanges = true\n } else {\n resource.masterData.current = productData\n if (isMasterVariant) {\n resource.masterData.current.masterVariant = variant\n } else {\n resource.masterData.current.variants[variantIndex] = variant\n }\n }\n },\n // 'setKey': () => {},\n // 'changeName': () => {},\n // 'setDescription': () => {},\n // 'changeSlug': () => {},\n // 'addVariant': () => {},\n // 'removeVariant': () => {},\n // 'changeMasterVariant': () => {},\n // 'addPrice': () => {},\n // 'setPrices': () => {},\n // 'changePrice': () => {},\n // 'removePrice': () => {},\n // 'setProductPriceCustomType': () => {},\n // 'setProductPriceCustomField': () => {},\n // 'setDiscountedPrice': () => {},\n // 'setAttributeInAllVariants': () => {},\n // 'addToCategory': () => {},\n // 'setCategoryOrderHint': () => {},\n // 'removeFromCategory': () => {},\n // 'setTaxCategory': () => {},\n // 'setSku': () => {},\n // 'setProductVariantKey': () => {},\n // 'addExternalImage': () => {},\n // 'moveImageToPosition': () => {},\n // 'removeImage': () => {},\n // 'setImageLabel': () => {},\n // 'addAsset': () => {},\n // 'removeAsset': () => {},\n // 'setAssetKey': () => {},\n // 'changeAssetOrder': () => {},\n // 'changeAssetName': () => {},\n // 'setAssetDescription': () => {},\n // 'setAssetTags': () => {},\n // 'setAssetSources': () => {},\n // 'setAssetCustomType': () => {},\n // 'setAssetCustomField': () => {},\n // 'setSearchKeywords': () => {},\n // 'setMetaTitle': () => {},\n // 'setMetaDescription': () => {},\n // 'setMetaKeywords': () => {},\n // 'revertStagedChanges': () => {},\n // 'revertStagedVariantChanges': () => {},\n // 'unpublish': () => {},\n // 'transitionState': () => {},\n }\n}\n\nconst getProductData = (product: Product, staged: boolean) => {\n if (!staged && product.masterData.current) {\n return product.masterData.current\n }\n return product.masterData.staged\n}\n\ninterface VariantResult {\n variant: Writable<ProductVariant> | undefined\n isMasterVariant: boolean\n variantIndex: number\n}\n\nconst getVariant = (\n productData: ProductData,\n variantId?: number,\n sku?: string\n): VariantResult => {\n const variants = [productData.masterVariant, ...productData.variants]\n const foundVariant = variants.find((variant: ProductVariant) => {\n if (variantId) {\n return variant.id === variantId\n }\n if (sku) {\n return variant.sku === sku\n }\n return false\n })\n\n const isMasterVariant = foundVariant === productData.masterVariant\n return {\n variant: foundVariant,\n isMasterVariant,\n variantIndex:\n !isMasterVariant && foundVariant\n ? productData.variants.indexOf(foundVariant)\n : -1,\n }\n}\n\nconst variantFromDraft = (\n variantId: number,\n variant: ProductVariantDraft\n): ProductVariant => {\n return {\n id: variantId,\n sku: variant?.sku,\n attributes: variant?.attributes ?? [],\n prices: variant?.prices?.map(priceFromDraft),\n assets: [],\n images: [],\n }\n}\n\nconst priceFromDraft = (draft: PriceDraft): Price => {\n return {\n id: uuidv4(),\n value: {\n currencyCode: draft.value.currencyCode,\n centAmount: draft.value.centAmount,\n fractionDigits: 2,\n type: 'centPrecision',\n },\n }\n}\n","import AbstractService from './abstract'\nimport { Router } from 'express'\nimport { AbstractStorage } from '../storage'\nimport { ProductRepository } from '../repositories/product'\n\nexport class ProductService extends AbstractService {\n public repository: ProductRepository\n\n constructor(parent: Router, storage: AbstractStorage) {\n super(parent)\n this.repository = new ProductRepository(storage)\n }\n\n getBasePath() {\n return 'products'\n }\n}\n","import { getBaseResourceProperties } from '../helpers'\nimport {\n AttributeDefinition,\n AttributeDefinitionDraft,\n AttributeType,\n ProductType,\n ProductTypeAddAttributeDefinitionAction,\n ProductTypeChangeAttributeOrderAction,\n ProductTypeChangeLabelAction,\n ProductTypeChangeLocalizedEnumValueLabelAction,\n ProductTypeDraft,\n ProductTypeRemoveAttributeDefinitionAction,\n ProductTypeRemoveEnumValuesAction,\n ProductTypeUpdateAction,\n ReferenceTypeId,\n} from '@commercetools/platform-sdk'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { Writable } from 'types'\n\nexport class ProductTypeRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'product-type'\n }\n\n create(context: RepositoryContext, draft: ProductTypeDraft): ProductType {\n const resource: ProductType = {\n ...getBaseResourceProperties(),\n key: draft.key,\n name: draft.name,\n description: draft.description,\n attributes: (draft.attributes ?? []).map(a =>\n this.attributeDefinitionFromAttributeDefinitionDraft(context, a)\n ),\n }\n\n this.save(context, resource)\n return resource\n }\n\n attributeDefinitionFromAttributeDefinitionDraft = (\n _context: RepositoryContext,\n draft: AttributeDefinitionDraft\n ): AttributeDefinition => {\n return {\n ...draft,\n attributeConstraint: draft.attributeConstraint ?? 'None',\n inputHint: draft.inputHint ?? 'SingleLine',\n inputTip:\n draft.inputTip && Object.keys(draft.inputTip).length > 0\n ? draft.inputTip\n : undefined,\n isSearchable: draft.isSearchable ?? true,\n }\n }\n\n getWithKey(context: RepositoryContext, key: string): ProductType | undefined {\n const result = this._storage.query(context.projectKey, this.getTypeId(), {\n where: [`key=\"${key}\"`],\n })\n if (result.count === 1) {\n return result.results[0] as ProductType\n }\n\n // Catch this for now, should be checked when creating/updating\n if (result.count > 1) {\n throw new Error('Duplicate product type key')\n }\n\n return\n }\n\n actions: Partial<\n Record<\n ProductTypeUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<ProductType>,\n action: any\n ) => void\n >\n > = {\n changeLocalizedEnumValueLabel: (\n context: RepositoryContext,\n resource: Writable<ProductType>,\n {\n attributeName,\n newValue,\n }: ProductTypeChangeLocalizedEnumValueLabelAction\n ) => {\n const updateAttributeType = (type: Writable<AttributeType>) => {\n switch (type.name) {\n case 'lenum':\n type.values.forEach(v => {\n if (v.key === newValue.key) {\n v.label = newValue.label\n }\n })\n return\n case 'set':\n updateAttributeType(type.elementType)\n return\n }\n }\n\n resource.attributes?.forEach(value => {\n if (value.name === attributeName) {\n updateAttributeType(value.type)\n }\n })\n },\n changeLabel: (\n context: RepositoryContext,\n resource: Writable<ProductType>,\n { attributeName, label }: ProductTypeChangeLabelAction\n ) => {\n resource.attributes?.forEach(value => {\n if (value.name === attributeName) {\n value.label = label\n }\n })\n },\n addAttributeDefinition: (\n context: RepositoryContext,\n resource: Writable<ProductType>,\n { attribute }: ProductTypeAddAttributeDefinitionAction\n ) => {\n resource.attributes?.push(\n this.attributeDefinitionFromAttributeDefinitionDraft(context, attribute)\n )\n },\n changeAttributeOrder: (\n context: RepositoryContext,\n resource: Writable<ProductType>,\n { attributes }: ProductTypeChangeAttributeOrderAction\n ) => {\n const attrs = new Map(resource.attributes?.map(item => [item.name, item]))\n const result: AttributeDefinition[] = []\n let current = resource.attributes\n\n attributes.forEach(iAttr => {\n const attr = attrs.get(iAttr.name)\n if (attr === undefined) {\n throw new Error('New attr')\n }\n result.push(attr)\n\n // Remove from current items\n current = current?.filter(f => {\n return f.name !== iAttr.name\n })\n })\n\n resource.attributes = result\n // Add attrs which were not specified in the order as last items. Not\n // sure if this follows commercetools\n if (current) {\n resource.attributes.push(...current)\n }\n },\n removeAttributeDefinition: (\n context: RepositoryContext,\n resource: Writable<ProductType>,\n { name }: ProductTypeRemoveAttributeDefinitionAction\n ) => {\n resource.attributes = resource.attributes?.filter(f => {\n return f.name !== name\n })\n },\n removeEnumValues: (\n context: RepositoryContext,\n resource: Writable<ProductType>,\n { attributeName, keys }: ProductTypeRemoveEnumValuesAction\n ) => {\n resource.attributes?.forEach(attr => {\n if (attr.name == attributeName) {\n if (attr.type.name == 'enum') {\n attr.type.values = attr.type.values.filter(v => {\n return !keys.includes(v.key)\n })\n }\n\n if (attr.type.name == 'set') {\n if (attr.type.elementType.name == 'enum') {\n attr.type.elementType.values = attr.type.elementType.values.filter(\n v => {\n return !keys.includes(v.key)\n }\n )\n }\n }\n }\n })\n },\n }\n}\n","import { ProductTypeRepository } from '../repositories/product-type'\nimport AbstractService from './abstract'\nimport { Request, Response, Router } from 'express'\nimport { AbstractStorage } from '../storage'\nimport { getRepositoryContext } from '../repositories/helpers'\n\nexport class ProductTypeService extends AbstractService {\n public repository: ProductTypeRepository\n\n constructor(parent: Router, storage: AbstractStorage) {\n super(parent)\n this.repository = new ProductTypeRepository(storage)\n }\n\n getBasePath() {\n return 'product-types'\n }\n\n extraRoutes(router: Router) {\n router.get('/key=:key', this.getWithKey.bind(this))\n }\n\n getWithKey(request: Request, response: Response) {\n const resource = this.repository.getWithKey(\n getRepositoryContext(request),\n request.params.key\n )\n if (resource) {\n return response.status(200).send(resource)\n }\n return response.status(404).send('Not found')\n }\n}\n","import {\n Project,\n ProjectChangeCartsConfigurationAction,\n ProjectChangeCountriesAction,\n ProjectChangeCountryTaxRateFallbackEnabledAction,\n ProjectChangeCurrenciesAction,\n ProjectChangeLanguagesAction,\n ProjectChangeMessagesEnabledAction,\n ProjectChangeNameAction,\n ProjectChangeOrderSearchStatusAction,\n ProjectChangeProductSearchIndexingEnabledAction,\n ProjectSetExternalOAuthAction,\n ProjectSetShippingRateInputTypeAction,\n ProjectUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { InvalidOperationError } from '@commercetools/platform-sdk'\nimport { Writable } from 'types'\nimport { checkConcurrentModification } from './errors'\nimport { CommercetoolsError } from '../exceptions'\nimport { AbstractRepository, RepositoryContext } from './abstract'\nimport { maskSecretValue } from '../lib/masking'\n\nexport class ProjectRepository extends AbstractRepository {\n get(context: RepositoryContext): Project | null {\n const resource = this._storage.getProject(context.projectKey)\n return this.postProcessResource(resource)\n }\n\n postProcessResource(resource: any): any {\n if (resource) {\n return maskSecretValue(\n resource, 'externalOAuth.authorizationHeader')\n }\n return resource\n\n }\n\n save(context: RepositoryContext, resource: Project) {\n const current = this.get(context)\n\n if (current) {\n checkConcurrentModification(current, resource.version)\n } else {\n if (resource.version !== 0) {\n throw new CommercetoolsError<InvalidOperationError>(\n {\n code: 'InvalidOperation',\n message: 'version on create must be 0',\n },\n 400\n )\n }\n }\n\n // @ts-ignore\n resource.version += 1\n this._storage.saveProject(resource)\n }\n\n actions: Partial<\n Record<\n ProjectUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<Project>,\n action: any\n ) => void\n >\n > = {\n changeName: (\n context: RepositoryContext,\n resource: Writable<Project>,\n { name }: ProjectChangeNameAction\n ) => {\n resource.name = name\n },\n changeCurrencies: (\n context: RepositoryContext,\n resource: Writable<Project>,\n { currencies }: ProjectChangeCurrenciesAction\n ) => {\n resource.currencies = currencies\n },\n changeCountries: (\n context: RepositoryContext,\n resource: Writable<Project>,\n { countries }: ProjectChangeCountriesAction\n ) => {\n resource.countries = countries\n },\n changeLanguages: (\n context: RepositoryContext,\n resource: Writable<Project>,\n { languages }: ProjectChangeLanguagesAction\n ) => {\n resource.languages = languages\n },\n changeMessagesEnabled: (\n context: RepositoryContext,\n resource: Writable<Project>,\n { messagesEnabled }: ProjectChangeMessagesEnabledAction\n ) => {\n resource.messages.enabled = messagesEnabled\n },\n changeProductSearchIndexingEnabled: (\n context: RepositoryContext,\n resource: Writable<Project>,\n { enabled }: ProjectChangeProductSearchIndexingEnabledAction\n ) => {\n if (!resource.searchIndexing?.products) {\n throw new Error('Invalid project state')\n }\n resource.searchIndexing.products.status = enabled\n ? 'Activated'\n : 'Deactivated'\n resource.searchIndexing.products.lastModifiedAt = new Date().toISOString()\n },\n changeOrderSearchStatus: (\n context: RepositoryContext,\n resource: Writable<Project>,\n { status }: ProjectChangeOrderSearchStatusAction\n ) => {\n if (!resource.searchIndexing?.orders) {\n throw new Error('Invalid project state')\n }\n resource.searchIndexing.orders.status = status\n resource.searchIndexing.orders.lastModifiedAt = new Date().toISOString()\n },\n setShippingRateInputType: (\n context: RepositoryContext,\n resource: Writable<Project>,\n { shippingRateInputType }: ProjectSetShippingRateInputTypeAction\n ) => {\n resource.shippingRateInputType = shippingRateInputType\n },\n setExternalOAuth: (\n context: RepositoryContext,\n resource: Writable<Project>,\n { externalOAuth }: ProjectSetExternalOAuthAction\n ) => {\n resource.externalOAuth = externalOAuth\n },\n changeCountryTaxRateFallbackEnabled: (\n context: RepositoryContext,\n resource: Writable<Project>,\n {\n countryTaxRateFallbackEnabled,\n }: ProjectChangeCountryTaxRateFallbackEnabledAction\n ) => {\n resource.carts.countryTaxRateFallbackEnabled = countryTaxRateFallbackEnabled\n },\n changeCartsConfiguration: (\n context: RepositoryContext,\n resource: Writable<Project>,\n { cartsConfiguration }: ProjectChangeCartsConfigurationAction\n ) => {\n resource.carts = cartsConfiguration || {\n countryTaxRateFallbackEnabled: false,\n deleteDaysAfterLastModification: 90,\n }\n },\n }\n}\n","import { Router } from 'express'\nimport { Request, Response } from 'express'\nimport { AbstractStorage } from '../storage'\nimport { ProjectRepository } from '../repositories/project'\nimport { Update } from '@commercetools/platform-sdk'\nimport { getRepositoryContext } from '../repositories/helpers'\n\nexport class ProjectService {\n public repository: ProjectRepository\n\n constructor(parent: Router, storage: AbstractStorage) {\n this.repository = new ProjectRepository(storage)\n this.registerRoutes(parent)\n }\n\n registerRoutes(parent: Router) {\n parent.get('', this.get.bind(this))\n parent.post('', this.post.bind(this))\n }\n\n get(request: Request, response: Response) {\n const project = this.repository.get(getRepositoryContext(request))\n return response.status(200).send(project)\n }\n\n post(request: Request, response: Response) {\n const updateRequest: Update = request.body\n const project = this.repository.get(getRepositoryContext(request))\n\n if (!project) {\n return response.status(404).send({})\n }\n\n this.repository.processUpdateActions(\n getRepositoryContext(request),\n project,\n updateRequest.actions\n )\n\n return response.status(200).send({})\n }\n}\n","import {\n createCustomFields,\n createTypedMoney,\n getReferenceFromResourceIdentifier,\n} from './helpers'\nimport {\n ReferenceTypeId,\n ShippingMethod,\n ShippingMethodAddShippingRateAction,\n ShippingMethodAddZoneAction,\n ShippingMethodChangeIsDefaultAction,\n ShippingMethodChangeNameAction,\n ShippingMethodDraft,\n ShippingMethodRemoveZoneAction,\n ShippingMethodSetCustomFieldAction,\n ShippingMethodSetCustomTypeAction,\n ShippingMethodSetDescriptionAction,\n ShippingMethodSetKeyAction,\n ShippingMethodSetLocalizedDescriptionAction,\n ShippingMethodSetPredicateAction,\n ShippingMethodUpdateAction,\n ShippingRate,\n ShippingRateDraft,\n ZoneRate,\n ZoneRateDraft,\n ZoneReference,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { Writable } from 'types'\nimport deepEqual from 'deep-equal'\n\nexport class ShippingMethodRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'shipping-method'\n }\n\n create(\n context: RepositoryContext,\n draft: ShippingMethodDraft\n ): ShippingMethod {\n const resource: ShippingMethod = {\n ...getBaseResourceProperties(),\n ...draft,\n taxCategory: getReferenceFromResourceIdentifier(\n draft.taxCategory,\n context.projectKey,\n this._storage\n ),\n zoneRates: draft.zoneRates?.map(z =>\n this._transformZoneRateDraft(context, z)\n ),\n custom: createCustomFields(\n draft.custom,\n context.projectKey,\n this._storage\n ),\n }\n this.save(context, resource)\n return resource\n }\n\n private _transformZoneRateDraft = (\n context: RepositoryContext,\n draft: ZoneRateDraft\n ): ZoneRate => ({\n ...draft,\n zone: getReferenceFromResourceIdentifier<ZoneReference>(\n draft.zone,\n context.projectKey,\n this._storage\n ),\n shippingRates: draft.shippingRates?.map(this._transformShippingRate),\n })\n\n private _transformShippingRate = (rate: ShippingRateDraft): ShippingRate => {\n return {\n price: createTypedMoney(rate.price),\n freeAbove: rate.freeAbove && createTypedMoney(rate.freeAbove),\n tiers: rate.tiers || [],\n }\n }\n\n actions: Partial<\n Record<\n ShippingMethodUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<ShippingMethod>,\n action: any\n ) => void\n >\n > = {\n addShippingRate: (\n _context: RepositoryContext,\n resource: Writable<ShippingMethod>,\n { shippingRate, zone }: ShippingMethodAddShippingRateAction\n ) => {\n const rate = this._transformShippingRate(shippingRate)\n\n resource.zoneRates.forEach(zoneRate => {\n if (zoneRate.zone.id === zone.id) {\n zoneRate.shippingRates.push(rate)\n return\n }\n })\n resource.zoneRates.push({\n zone: {\n typeId: 'zone',\n id: zone.id!,\n },\n shippingRates: [rate],\n })\n },\n removeShippingRate: (\n _context: RepositoryContext,\n resource: Writable<ShippingMethod>,\n { shippingRate, zone }: ShippingMethodAddShippingRateAction\n ) => {\n const rate = this._transformShippingRate(shippingRate)\n\n resource.zoneRates.forEach(zoneRate => {\n if (zoneRate.zone.id === zone.id) {\n zoneRate.shippingRates = zoneRate.shippingRates.filter(otherRate => {\n return !deepEqual(rate, otherRate)\n })\n }\n })\n },\n addZone: (\n context: RepositoryContext,\n resource: Writable<ShippingMethod>,\n { zone }: ShippingMethodAddZoneAction\n ) => {\n const zoneReference = getReferenceFromResourceIdentifier<ZoneReference>(\n zone,\n context.projectKey,\n this._storage\n )\n\n if (resource.zoneRates === undefined) {\n resource.zoneRates = []\n }\n\n resource.zoneRates.push({\n zone: zoneReference,\n shippingRates: [],\n })\n },\n removeZone: (\n _context: RepositoryContext,\n resource: Writable<ShippingMethod>,\n { zone }: ShippingMethodRemoveZoneAction\n ) => {\n resource.zoneRates = resource.zoneRates.filter(zoneRate => {\n return zoneRate.zone.id !== zone.id\n })\n },\n setKey: (\n _context: RepositoryContext,\n resource: Writable<ShippingMethod>,\n { key }: ShippingMethodSetKeyAction\n ) => {\n resource.key = key\n },\n setDescription: (\n _context: RepositoryContext,\n resource: Writable<ShippingMethod>,\n { description }: ShippingMethodSetDescriptionAction\n ) => {\n resource.description = description\n },\n setLocalizedDescription: (\n _context: RepositoryContext,\n resource: Writable<ShippingMethod>,\n { localizedDescription }: ShippingMethodSetLocalizedDescriptionAction\n ) => {\n resource.localizedDescription = localizedDescription\n },\n setPredicate: (\n _context: RepositoryContext,\n resource: Writable<ShippingMethod>,\n { predicate }: ShippingMethodSetPredicateAction\n ) => {\n resource.predicate = predicate\n },\n changeIsDefault: (\n _context: RepositoryContext,\n resource: Writable<ShippingMethod>,\n { isDefault }: ShippingMethodChangeIsDefaultAction\n ) => {\n resource.isDefault = isDefault\n },\n changeName: (\n _context: RepositoryContext,\n resource: Writable<ShippingMethod>,\n { name }: ShippingMethodChangeNameAction\n ) => {\n resource.name = name\n },\n setCustomType: (\n context: RepositoryContext,\n resource: Writable<ShippingMethod>,\n { type, fields }: ShippingMethodSetCustomTypeAction\n ) => {\n if (type) {\n resource.custom = createCustomFields(\n { type, fields },\n context.projectKey,\n this._storage\n )\n } else {\n resource.custom = undefined\n }\n },\n setCustomField: (\n context: RepositoryContext,\n resource: Writable<ShippingMethod>,\n { name, value }: ShippingMethodSetCustomFieldAction\n ) => {\n if (!resource.custom) {\n return\n }\n if (value === null) {\n delete resource.custom.fields[name]\n } else {\n resource.custom.fields[name] = value\n }\n },\n }\n}\n","import { ShippingMethodRepository } from '../repositories/shipping-method'\nimport AbstractService from './abstract'\nimport { AbstractStorage } from '../storage'\nimport { Router } from 'express'\n\nexport class ShippingMethodService extends AbstractService {\n public repository: ShippingMethodRepository\n\n constructor(parent: Router, storage: AbstractStorage) {\n super(parent)\n this.repository = new ShippingMethodRepository(storage)\n this.registerRoutes(parent)\n }\n\n getBasePath() {\n return 'shipping-methods'\n }\n\n extraRoutes(parent: Router) {\n parent.get('/matching-cart', this.get.bind(this))\n }\n}\n","import {\n CustomerReference,\n ReferenceTypeId,\n ShoppingList,\n ShoppingListDraft,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport {\n createCustomFields,\n getReferenceFromResourceIdentifier,\n} from './helpers'\n\nexport class ShoppingListRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'shopping-list'\n }\n create(context: RepositoryContext, draft: ShoppingListDraft): ShoppingList {\n // const product =\n\n const resource: ShoppingList = {\n ...getBaseResourceProperties(),\n ...draft,\n custom: createCustomFields(\n draft.custom,\n context.projectKey,\n this._storage\n ),\n textLineItems: [],\n lineItems: draft.lineItems?.map(e => ({\n ...getBaseResourceProperties(),\n ...e,\n addedAt: e.addedAt ?? '',\n productId: e.productId ?? '',\n name: {},\n quantity: e.quantity ?? 1,\n productType: { typeId: 'product-type', id: '' },\n custom: createCustomFields(e.custom, context.projectKey, this._storage),\n })),\n customer: draft.customer\n ? getReferenceFromResourceIdentifier<CustomerReference>(\n draft.customer,\n context.projectKey,\n this._storage\n )\n : undefined,\n store: draft.store?.key\n ? { typeId: 'store', key: draft.store.key! }\n : undefined,\n }\n this.save(context, resource)\n return resource\n }\n}\n","import { ShoppingListRepository } from './../repositories/shopping-list'\nimport AbstractService from './abstract'\nimport { Router } from 'express'\nimport { AbstractStorage } from '../storage'\n\nexport class ShoppingListService extends AbstractService {\n public repository: ShoppingListRepository\n\n constructor(parent: Router, storage: AbstractStorage) {\n super(parent)\n this.repository = new ShoppingListRepository(storage)\n }\n\n getBasePath() {\n return 'shopping-lists'\n }\n}\n","import { getBaseResourceProperties } from '../helpers'\nimport { getReferenceFromResourceIdentifier } from './helpers'\nimport {\n ReferenceTypeId,\n StateReference,\n State,\n StateChangeKeyAction,\n StateDraft,\n StateSetDescriptionAction,\n StateSetNameAction,\n StateSetRolesAction,\n StateSetTransitionsAction,\n StateUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { Writable } from 'types'\n\nexport class StateRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'state'\n }\n\n create(context: RepositoryContext, draft: StateDraft): State {\n const resource: State = {\n ...getBaseResourceProperties(),\n ...draft,\n builtIn: false,\n initial: draft.initial || false,\n transitions: (draft.transitions || []).map(t =>\n getReferenceFromResourceIdentifier(t, context.projectKey, this._storage)\n ),\n }\n\n this.save(context, resource)\n return resource\n }\n\n actions: Partial<\n Record<\n StateUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<State>,\n action: any\n ) => void\n >\n > = {\n changeKey: (\n context: RepositoryContext,\n resource: Writable<State>,\n { key }: StateChangeKeyAction\n ) => {\n resource.key = key\n },\n setDescription: (\n context: RepositoryContext,\n resource: Writable<State>,\n { description }: StateSetDescriptionAction\n ) => {\n resource.description = description\n },\n setName: (\n context: RepositoryContext,\n resource: Writable<State>,\n { name }: StateSetNameAction\n ) => {\n resource.name = name\n },\n setRoles: (\n context: RepositoryContext,\n resource: Writable<State>,\n { roles }: StateSetRolesAction\n ) => {\n resource.roles = roles\n },\n setTransitions: (\n context: RepositoryContext,\n resource: Writable<State>,\n { transitions }: StateSetTransitionsAction\n ) => {\n resource.transitions = transitions?.map((resourceId): StateReference => {\n return {\n id: resourceId.id || \"\",\n typeId: \"state\",\n }\n })\n }\n }\n}\n","import { StateRepository } from '../repositories/state'\nimport AbstractService from './abstract'\nimport { Router } from 'express'\nimport { AbstractStorage } from '../storage'\n\nexport class StateService extends AbstractService {\n public repository: StateRepository\n\n constructor(parent: Router, storage: AbstractStorage) {\n super(parent)\n this.repository = new StateRepository(storage)\n }\n\n getBasePath() {\n return 'states'\n }\n}\n","import {\n Store,\n StoreDraft,\n ReferenceTypeId,\n StoreUpdateAction,\n StoreSetNameAction,\n ChannelReference,\n StoreSetDistributionChannelsAction,\n ChannelResourceIdentifier,\n StoreSetLanguagesAction,\n StoreSetCustomFieldAction,\n StoreSetCustomTypeAction,\n} from '@commercetools/platform-sdk'\nimport { Writable } from 'types'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport {\n getReferenceFromResourceIdentifier,\n createCustomFields,\n} from './helpers'\n\nexport class StoreRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'store'\n }\n\n create(context: RepositoryContext, draft: StoreDraft): Store {\n const resource: Store = {\n ...getBaseResourceProperties(),\n key: draft.key,\n name: draft.name,\n languages: draft.languages ?? [],\n distributionChannels: this.transformChannels(\n context,\n draft.distributionChannels\n ),\n supplyChannels: this.transformChannels(context, draft.supplyChannels),\n productSelections: [],\n custom: createCustomFields(\n draft.custom,\n context.projectKey,\n this._storage\n ),\n }\n this.save(context, resource)\n return resource\n }\n\n private transformChannels(\n context: RepositoryContext,\n channels?: ChannelResourceIdentifier[]\n ) {\n if (!channels) return []\n\n return channels.map(ref =>\n getReferenceFromResourceIdentifier<ChannelReference>(\n ref,\n context.projectKey,\n this._storage\n )\n )\n }\n\n getWithKey(context: RepositoryContext, key: string): Store | undefined {\n const result = this._storage.query(context.projectKey, this.getTypeId(), {\n where: [`key=\"${key}\"`],\n })\n if (result.count === 1) {\n return result.results[0] as Store\n }\n\n if (result.count > 1) {\n throw new Error('Duplicate store key')\n }\n\n return\n }\n\n actions: Partial<\n Record<\n StoreUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<Store>,\n action: any\n ) => void\n >\n > = {\n setName: (\n context: RepositoryContext,\n resource: Writable<Store>,\n { name }: StoreSetNameAction\n ) => {\n resource.name = name\n },\n setDistributionChannels: (\n context: RepositoryContext,\n resource: Writable<Store>,\n { distributionChannels }: StoreSetDistributionChannelsAction\n ) => {\n resource.distributionChannels = this.transformChannels(\n context,\n distributionChannels\n )\n },\n setLanguages: (\n context: RepositoryContext,\n resource: Writable<Store>,\n { languages }: StoreSetLanguagesAction\n ) => {\n resource.languages = languages ?? []\n },\n setCustomType: (\n context: RepositoryContext,\n resource: Writable<Store>,\n { type, fields }: StoreSetCustomTypeAction\n ) => {\n if (type) {\n resource.custom = createCustomFields(\n { type, fields },\n context.projectKey,\n this._storage\n )\n } else {\n resource.custom = undefined\n }\n },\n setCustomField: (\n context: RepositoryContext,\n resource: Writable<Store>,\n { name, value }: StoreSetCustomFieldAction\n ) => {\n if (!resource.custom) {\n return\n }\n if (value === null) {\n delete resource.custom.fields[name]\n } else {\n resource.custom.fields[name] = value\n }\n },\n }\n}\n","import AbstractService from './abstract'\nimport { Router, Request, Response } from 'express'\nimport { StoreRepository } from '../repositories/store'\nimport { AbstractStorage } from '../storage'\nimport { getRepositoryContext } from '../repositories/helpers'\n\nexport class StoreService extends AbstractService {\n public repository: StoreRepository\n\n constructor(parent: Router, storage: AbstractStorage) {\n super(parent)\n this.repository = new StoreRepository(storage)\n }\n\n getBasePath() {\n return 'stores'\n }\n\n extraRoutes(router: Router) {\n router.get('/key=:key', this.getWithKey.bind(this))\n }\n\n getWithKey(request: Request, response: Response) {\n const resource = this.repository.getWithKey(\n getRepositoryContext(request),\n request.params.key\n )\n if (resource) {\n return response.status(200).send(resource)\n }\n return response.status(404).send('Not found')\n }\n}\n","import {\n InvalidInputError,\n ReferenceTypeId,\n Subscription,\n SubscriptionDraft,\n} from '@commercetools/platform-sdk'\nimport { CommercetoolsError } from '../exceptions'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class SubscriptionRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'subscription'\n }\n create(context: RepositoryContext, draft: SubscriptionDraft): Subscription {\n // TODO: We could actually test this here by using the aws sdk. For now\n // hardcode a failed check when account id is 0000000000\n if (draft.destination.type === 'SQS') {\n const queueURL = new URL(draft.destination.queueUrl)\n const accountId = queueURL.pathname.split('/')[1]\n if (accountId === '0000000000') {\n const dest = draft.destination\n throw new CommercetoolsError<InvalidInputError>(\n {\n code: 'InvalidInput',\n message:\n 'A test message could not be delivered to this destination: ' +\n `SQS ${dest.queueUrl} in ${dest.region} for ${dest.accessKey}. ` +\n 'Please make sure your destination is correctly configured.',\n },\n 400\n )\n }\n }\n\n const resource: Subscription = {\n ...getBaseResourceProperties(),\n changes: draft.changes || [],\n destination: draft.destination,\n format: draft.format || {\n type: 'Platform',\n },\n key: draft.key,\n messages: draft.messages || [],\n status: 'Healthy',\n }\n this.save(context, resource)\n return resource\n }\n}\n","import AbstractService from './abstract'\nimport { Router } from 'express'\nimport { AbstractStorage } from '../storage'\nimport { SubscriptionRepository } from '../repositories/subscription'\n\nexport class SubscriptionService extends AbstractService {\n public repository: SubscriptionRepository\n\n constructor(parent: Router, storage: AbstractStorage) {\n super(parent)\n this.repository = new SubscriptionRepository(storage)\n }\n\n getBasePath() {\n return 'subscriptions'\n }\n}\n","import {\n ReferenceTypeId,\n TaxCategory,\n TaxCategoryAddTaxRateAction,\n TaxCategoryChangeNameAction,\n TaxCategoryDraft,\n TaxCategoryRemoveTaxRateAction,\n TaxCategoryReplaceTaxRateAction,\n TaxCategorySetDescriptionAction,\n TaxCategorySetKeyAction,\n TaxCategoryUpdateAction,\n TaxRate,\n TaxRateDraft,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { v4 as uuidv4 } from 'uuid'\nimport { Writable } from 'types'\n\nexport class TaxCategoryRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'tax-category'\n }\n\n create(context: RepositoryContext, draft: TaxCategoryDraft): TaxCategory {\n const resource: TaxCategory = {\n ...getBaseResourceProperties(),\n ...draft,\n rates: draft.rates?.map(this.taxRateFromTaxRateDraft) || [],\n }\n this.save(context, resource)\n return resource\n }\n\n private taxRateFromTaxRateDraft = (draft: TaxRateDraft): TaxRate => ({\n ...draft,\n id: uuidv4(),\n amount: draft.amount || 0,\n })\n\n getWithKey(context: RepositoryContext, key: string): TaxCategory | undefined {\n const result = this._storage.query(context.projectKey, this.getTypeId(), {\n where: [`key=\"${key}\"`],\n })\n if (result.count === 1) {\n return result.results[0] as TaxCategory\n }\n\n // Catch this for now, should be checked when creating/updating\n if (result.count > 1) {\n throw new Error('Duplicate tax category key')\n }\n\n return\n }\n\n actions: Partial<\n Record<\n TaxCategoryUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<TaxCategory>,\n action: any\n ) => void\n >\n > = {\n addTaxRate: (\n context: RepositoryContext,\n resource: Writable<TaxCategory>,\n { taxRate }: TaxCategoryAddTaxRateAction\n ) => {\n if (resource.rates === undefined) {\n resource.rates = []\n }\n resource.rates.push(this.taxRateFromTaxRateDraft(taxRate))\n },\n removeTaxRate: (\n context: RepositoryContext,\n resource: Writable<TaxCategory>,\n { taxRateId }: TaxCategoryRemoveTaxRateAction\n ) => {\n if (resource.rates === undefined) {\n resource.rates = []\n }\n resource.rates = resource.rates.filter(taxRate => {\n return taxRate.id !== taxRateId\n })\n },\n replaceTaxRate: (\n context: RepositoryContext,\n resource: Writable<TaxCategory>,\n { taxRateId, taxRate }: TaxCategoryReplaceTaxRateAction\n ) => {\n if (resource.rates === undefined) {\n resource.rates = []\n }\n\n const taxRateObj = this.taxRateFromTaxRateDraft(taxRate)\n for (let i = 0; i < resource.rates.length; i++) {\n const rate = resource.rates[i]\n if (rate.id === taxRateId) {\n resource.rates[i] = taxRateObj\n }\n }\n },\n setDescription: (\n context: RepositoryContext,\n resource: Writable<TaxCategory>,\n { description }: TaxCategorySetDescriptionAction\n ) => {\n resource.description = description\n },\n setKey: (\n context: RepositoryContext,\n resource: Writable<TaxCategory>,\n { key }: TaxCategorySetKeyAction\n ) => {\n resource.key = key\n },\n changeName: (\n context: RepositoryContext,\n resource: Writable<TaxCategory>,\n { name }: TaxCategoryChangeNameAction\n ) => {\n resource.name = name\n },\n }\n}\n","import { TaxCategoryRepository } from '../repositories/tax-category'\nimport AbstractService from './abstract'\nimport { AbstractStorage } from '../storage'\nimport { Request, Response, Router } from 'express'\nimport { getRepositoryContext } from '../repositories/helpers'\n\nexport class TaxCategoryService extends AbstractService {\n public repository: TaxCategoryRepository\n\n constructor(parent: Router, storage: AbstractStorage) {\n super(parent)\n this.repository = new TaxCategoryRepository(storage)\n }\n\n getBasePath() {\n return 'tax-categories'\n }\n\n extraRoutes(router: Router) {\n router.get('/key=:key', this.getWithKey.bind(this))\n }\n\n getWithKey(request: Request, response: Response) {\n const resource = this.repository.getWithKey(\n getRepositoryContext(request),\n request.params.key\n )\n if (resource) {\n return response.status(200).send(resource)\n }\n return response.status(404).send('Not found')\n }\n}\n","import {\n Type,\n TypeDraft,\n InvalidOperationError,\n ReferenceTypeId,\n TypeUpdateAction,\n FieldDefinition,\n TypeSetDescriptionAction,\n TypeChangeNameAction,\n TypeAddFieldDefinitionAction,\n TypeChangeEnumValueLabelAction,\n TypeAddEnumValueAction,\n TypeChangeFieldDefinitionOrderAction,\n TypeRemoveFieldDefinitionAction,\n} from '@commercetools/platform-sdk'\nimport { CommercetoolsError } from '../exceptions'\nimport { isEqual } from 'lodash'\nimport { Writable } from 'types'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class TypeRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'type'\n }\n\n create(context: RepositoryContext, draft: TypeDraft): Type {\n const resource: Type = {\n ...getBaseResourceProperties(),\n key: draft.key,\n name: draft.name,\n resourceTypeIds: draft.resourceTypeIds,\n fieldDefinitions: draft.fieldDefinitions || [],\n description: draft.description,\n }\n this.save(context, resource)\n return resource\n }\n actions: Partial<\n Record<\n TypeUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<Type>,\n action: any\n ) => void\n >\n > = {\n addFieldDefinition: (\n context: RepositoryContext,\n resource: Writable<Type>,\n { fieldDefinition }: TypeAddFieldDefinitionAction\n ) => {\n resource.fieldDefinitions.push(fieldDefinition)\n },\n removeFieldDefinition: (\n context: RepositoryContext,\n resource: Writable<Type>,\n { fieldName }: TypeRemoveFieldDefinitionAction\n ) => {\n resource.fieldDefinitions = resource.fieldDefinitions.filter(f => {\n return f.name !== fieldName\n })\n },\n setDescription: (\n context: RepositoryContext,\n resource: Writable<Type>,\n { description }: TypeSetDescriptionAction\n ) => {\n resource.description = description\n },\n changeName: (\n context: RepositoryContext,\n resource: Writable<Type>,\n { name }: TypeChangeNameAction\n ) => {\n resource.name = name\n },\n changeFieldDefinitionOrder: (\n context: RepositoryContext,\n resource: Writable<Type>,\n { fieldNames }: TypeChangeFieldDefinitionOrderAction\n ) => {\n const fields = new Map(\n resource.fieldDefinitions.map(item => [item.name, item])\n )\n const result: FieldDefinition[] = []\n let current = resource.fieldDefinitions\n\n fieldNames.forEach(fieldName => {\n const field = fields.get(fieldName)\n if (field === undefined) {\n throw new Error('New field')\n }\n result.push(field)\n\n // Remove from current items\n current = current.filter(f => {\n return f.name !== fieldName\n })\n })\n\n if (\n isEqual(\n fieldNames,\n resource.fieldDefinitions.map(item => item.name)\n )\n ) {\n throw new CommercetoolsError<InvalidOperationError>({\n code: 'InvalidOperation',\n message: \"'fieldDefinitions' has no changes.\",\n action: {\n action: 'changeFieldDefinitionOrder',\n fieldNames: fieldNames,\n },\n })\n }\n\n resource.fieldDefinitions = result\n // Add fields which were not specified in the order as last items. Not\n // sure if this follows commercetools\n resource.fieldDefinitions.push(...current)\n },\n addEnumValue: (\n context: RepositoryContext,\n resource: Writable<Type>,\n { fieldName, value }: TypeAddEnumValueAction\n ) => {\n resource.fieldDefinitions.forEach(field => {\n if (field.name === fieldName) {\n // TODO, should be done better i suppose\n if (field.type.name === 'Enum') {\n field.type.values.push(value)\n } else if (\n field.type.name === 'Set' &&\n field.type.elementType.name === 'Enum'\n ) {\n field.type.elementType.values.push(value)\n } else {\n throw new Error('Type is not a Enum (or Set of Enum)')\n }\n }\n })\n },\n changeEnumValueLabel: (\n context: RepositoryContext,\n resource: Writable<Type>,\n { fieldName, value }: TypeChangeEnumValueLabelAction\n ) => {\n resource.fieldDefinitions.forEach(field => {\n if (field.name === fieldName) {\n // TODO, should be done better i suppose\n if (field.type.name === 'Enum') {\n field.type.values.forEach(v => {\n if (v.key === value.key) {\n v.label = value.label\n }\n })\n } else if (\n field.type.name === 'Set' &&\n field.type.elementType.name === 'Enum'\n ) {\n field.type.elementType.values.forEach(v => {\n if (v.key === value.key) {\n v.label = value.label\n }\n })\n } else {\n throw new Error('Type is not a Enum (or Set of Enum)')\n }\n }\n })\n },\n }\n}\n","import AbstractService from './abstract'\nimport { Router } from 'express'\nimport { TypeRepository } from '../repositories/type'\nimport { AbstractStorage } from '../storage'\n\nexport class TypeService extends AbstractService {\n public repository: TypeRepository\n\n constructor(parent: Router, storage: AbstractStorage) {\n super(parent)\n this.repository = new TypeRepository(storage)\n }\n\n getBasePath() {\n return 'types'\n }\n}\n","import {\n ReferenceTypeId,\n Zone,\n ZoneAddLocationAction,\n ZoneChangeNameAction,\n ZoneDraft,\n ZoneRemoveLocationAction,\n ZoneSetDescriptionAction,\n ZoneSetKeyAction,\n ZoneUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { Writable } from 'types'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class ZoneRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'zone'\n }\n\n create(context: RepositoryContext, draft: ZoneDraft): Zone {\n const resource: Zone = {\n ...getBaseResourceProperties(),\n key: draft.key,\n locations: draft.locations || [],\n name: draft.name,\n description: draft.description,\n }\n this.save(context, resource)\n return resource\n }\n\n actions: Partial<\n Record<\n ZoneUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<Zone>,\n action: any\n ) => void\n >\n > = {\n addLocation: (\n context: RepositoryContext,\n resource: Writable<Zone>,\n { location }: ZoneAddLocationAction\n ) => {\n resource.locations.push(location)\n },\n removeLocation: (\n context: RepositoryContext,\n resource: Writable<Zone>,\n { location }: ZoneRemoveLocationAction\n ) => {\n resource.locations = resource.locations.filter(loc => {\n return !(\n loc.country === location.country && loc.state === location.state\n )\n })\n },\n changeName: (\n context: RepositoryContext,\n resource: Writable<Zone>,\n { name }: ZoneChangeNameAction\n ) => {\n resource.name = name\n },\n setDescription: (\n context: RepositoryContext,\n resource: Writable<Zone>,\n { description }: ZoneSetDescriptionAction\n ) => {\n resource.description = description\n },\n setKey: (\n context: RepositoryContext,\n resource: Writable<Zone>,\n { key }: ZoneSetKeyAction\n ) => {\n resource.key = key\n },\n }\n}\n","import { Router } from 'express'\nimport AbstractService from './abstract'\nimport { AbstractStorage } from '../storage'\nimport { ZoneRepository } from '../repositories/zone'\n\nexport class ZoneService extends AbstractService {\n public repository: ZoneRepository\n\n constructor(parent: Router, storage: AbstractStorage) {\n super(parent)\n this.repository = new ZoneRepository(storage)\n }\n\n getBasePath() {\n return 'zones'\n }\n}\n","import AbstractService from './abstract'\nimport { Request, Response, Router } from 'express'\nimport { AbstractStorage } from '../storage'\nimport { CustomerRepository } from '../repositories/customer'\nimport { getRepositoryContext } from '../repositories/helpers'\n\nexport class MyCustomerService extends AbstractService {\n public repository: CustomerRepository\n\n constructor(parent: Router, storage: AbstractStorage) {\n super(parent)\n this.repository = new CustomerRepository(storage)\n }\n\n getBasePath() {\n return 'me'\n }\n\n registerRoutes(parent: Router) {\n // Overwrite this function to be able to handle /me path.\n const basePath = this.getBasePath()\n const router = Router({ mergeParams: true })\n\n this.extraRoutes(router)\n\n router.get('', this.getMe.bind(this))\n\n router.post('/signup', this.signUp.bind(this))\n\n router.post('/login', this.signIn.bind(this))\n\n parent.use(`/${basePath}`, router)\n }\n\n getMe(request: Request, response: Response) {\n const resource = this.repository.getMe(getRepositoryContext(request))\n if (!resource) {\n return response.status(404).send('Not found')\n }\n return response.status(200).send(resource)\n }\n\n signUp(request: Request, response: Response) {\n const draft = request.body\n const resource = this.repository.create(\n getRepositoryContext(request),\n draft\n )\n const result = this._expandWithId(request, resource.id)\n return response.status(this.createStatusCode).send({ customer: result })\n }\n\n signIn(request: Request, response: Response) {\n const { email, password } = request.body\n const encodedPassword = Buffer.from(password).toString('base64')\n\n const result = this.repository.query(getRepositoryContext(request), {\n where: [`email = \"${email}\"`, `password = \"${encodedPassword}\"`],\n })\n\n if (result.count === 0) {\n return response.status(400).send({\n message: 'Account with the given credentials not found.',\n errors: [\n {\n code: 'InvalidCredentials',\n message: 'Account with the given credentials not found.',\n },\n ],\n })\n }\n\n return response.status(200).send({ customer: result.results[0] })\n }\n}\n","import AbstractService from './abstract'\nimport { Router } from 'express'\nimport { AbstractStorage } from '../storage'\nimport { MyOrderRepository } from '../repositories/my-order'\n\nexport class MyOrderService extends AbstractService {\n public repository: MyOrderRepository\n\n constructor(parent: Router, storage: AbstractStorage) {\n super(parent)\n this.repository = new MyOrderRepository(storage)\n }\n\n getBasePath() {\n return 'me'\n }\n\n registerRoutes(parent: Router) {\n // Overwrite this function to be able to handle /me/active-cart path.\n const basePath = this.getBasePath()\n const router = Router({ mergeParams: true })\n\n this.extraRoutes(router)\n\n router.get('/orders/', this.get.bind(this))\n router.get('/orders/:id', this.getWithId.bind(this))\n\n router.delete('/orders/:id', this.deletewithId.bind(this))\n\n router.post('/orders/', this.post.bind(this))\n router.post('/orders/:id', this.postWithId.bind(this))\n\n parent.use(`/${basePath}`, router)\n }\n}\n","import assert from 'assert'\nimport {\n CartReference,\n MyOrderFromCartDraft,\n Order,\n} from '@commercetools/platform-sdk'\nimport { OrderRepository } from './order'\nimport { RepositoryContext } from './abstract'\n\nexport class MyOrderRepository extends OrderRepository {\n create(context: RepositoryContext, draft: MyOrderFromCartDraft): Order {\n assert(draft.id, 'draft.id is missing')\n const cartIdentifier = {\n id: draft.id,\n typeId: 'cart',\n } as CartReference\n return this.createFromCart(context, cartIdentifier)\n }\n}\n"],"mappings":"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","names":["import_express","perplex","assert","express","bodyParser","auth","uuidv4","import_express","import_uuid","uuidv4","deepEqual","import_uuid","uuidv4","import_assert","assert","import_uuid","uuidv4","import_uuid","uuidv4","import_express","import_uuid","uuidv4","import_perplex","import_pratt","generateMatchFunc","getLexer","perplex","Parser","import_uuid","uuidv4","import_deep_equal","deepEqual","import_uuid","uuidv4","import_express","import_express","import_assert","assert","express","morgan","nock","supertest"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/ctMock.ts","../src/storage.ts","../src/lib/expandParser.ts","../src/lib/predicateParser.ts","../src/lib/haversine.ts","../src/exceptions.ts","../src/helpers.ts","../src/oauth/server.ts","../src/oauth/store.ts","../src/oauth/helpers.ts","../src/projectAPI.ts","../src/lib/proxy.ts","../src/constants.ts","../src/repositories/helpers.ts","../src/services/project.ts","../src/repositories/cart.ts","../src/repositories/abstract.ts","../src/repositories/errors.ts","../src/repositories/cart-discount.ts","../src/repositories/category.ts","../src/repositories/channel.ts","../src/repositories/custom-object.ts","../src/repositories/customer.ts","../src/repositories/customer-group.ts","../src/repositories/discount-code.ts","../src/lib/masking.ts","../src/repositories/extension.ts","../src/repositories/inventory-entry.ts","../src/repositories/my-order.ts","../src/repositories/order.ts","../src/repositories/payment.ts","../src/repositories/product.ts","../src/repositories/product-discount.ts","../src/lib/projectionSearchFilter.ts","../src/priceSelector.ts","../src/product-projection-search.ts","../src/repositories/product-projection.ts","../src/repositories/product-type.ts","../src/repositories/project.ts","../src/repositories/shipping-method.ts","../src/repositories/shopping-list.ts","../src/repositories/state.ts","../src/repositories/store.ts","../src/repositories/subscription.ts","../src/repositories/tax-category.ts","../src/repositories/type.ts","../src/repositories/zone.ts","../src/repositories/index.ts","../src/services/abstract.ts","../src/services/cart.ts","../src/services/cart-discount.ts","../src/services/category.ts","../src/services/channel.ts","../src/services/custom-object.ts","../src/services/customer.ts","../src/services/customer-group.ts","../src/services/discount-code.ts","../src/services/extension.ts","../src/services/inventory-entry.ts","../src/services/my-cart.ts","../src/services/my-customer.ts","../src/services/my-order.ts","../src/services/my-payment.ts","../src/services/order.ts","../src/services/payment.ts","../src/services/product.ts","../src/services/product-discount.ts","../src/services/product-projection.ts","../src/services/product-type.ts","../src/services/shipping-method.ts","../src/services/shopping-list.ts","../src/services/state.ts","../src/services/store.ts","../src/services/subscription.ts","../src/services/tax-category.ts","../src/services/type.ts","../src/services/zone.ts","../src/services/index.ts"],"sourcesContent":["import { CommercetoolsMock, CommercetoolsMockOptions } from './ctMock'\nimport { getBaseResourceProperties } from './helpers'\n\nexport {\n CommercetoolsMock,\n getBaseResourceProperties,\n CommercetoolsMockOptions,\n}\n","import nock from 'nock'\nimport express, { NextFunction, Request, Response } from 'express'\nimport supertest from 'supertest'\nimport morgan from 'morgan'\nimport { AbstractStorage, InMemoryStorage } from './storage'\nimport { Repositories, Services } from './types'\nimport { CommercetoolsError } from './exceptions'\nimport { OAuth2Server } from './oauth/server'\nimport { ProjectAPI } from './projectAPI'\nimport { copyHeaders } from './lib/proxy'\nimport { DEFAULT_API_HOSTNAME, DEFAULT_AUTH_HOSTNAME } from './constants'\n\n// Services\nimport { ProjectService } from './services/project'\nimport { createRepositories } from './repositories'\nimport { createServices } from './services'\nimport { ProjectRepository } from 'repositories/project'\n\nexport type CommercetoolsMockOptions = {\n validateCredentials: boolean\n enableAuthentication: boolean\n defaultProjectKey: string | undefined\n apiHost: RegExp | string\n authHost: RegExp | string\n silent: boolean\n}\n\ntype AppOptions = { silent?: boolean }\n\nconst DEFAULT_OPTIONS: CommercetoolsMockOptions = {\n enableAuthentication: false,\n validateCredentials: false,\n defaultProjectKey: undefined,\n apiHost: DEFAULT_API_HOSTNAME,\n authHost: DEFAULT_AUTH_HOSTNAME,\n silent: false,\n}\n\nexport class CommercetoolsMock {\n public app: express.Express\n public options: CommercetoolsMockOptions\n\n private _storage: AbstractStorage\n private _oauth2: OAuth2Server\n private _nockScopes: {\n auth: nock.Scope | undefined\n api: nock.Scope | undefined\n } = { auth: undefined, api: undefined }\n private _services: Services\n private _repositories: Repositories\n private _projectService?: ProjectService\n\n constructor(options: Partial<CommercetoolsMockOptions> = {}) {\n this.options = { ...DEFAULT_OPTIONS, ...options }\n this._services = {}\n this._repositories = {}\n this._projectService = undefined\n\n this._storage = new InMemoryStorage()\n this._oauth2 = new OAuth2Server({\n enabled: this.options.enableAuthentication,\n validate: this.options.validateCredentials,\n })\n\n this.app = this.createApp({ silent: this.options.silent })\n }\n\n start() {\n // Order is important here when the hostnames match\n this.mockAuthHost()\n this.mockApiHost()\n }\n\n stop() {\n this._nockScopes.auth?.persist(false)\n this._nockScopes.auth = undefined\n\n this._nockScopes.api?.persist(false)\n this._nockScopes.api = undefined\n }\n\n clear() {\n this._storage.clear()\n }\n\n project(projectKey?: string) {\n if (!projectKey && !this.options.defaultProjectKey) {\n throw new Error('No projectKey passed and no default set')\n }\n\n return new ProjectAPI(\n projectKey || this.options.defaultProjectKey!,\n this._services,\n this._storage\n )\n }\n\n runServer(port = 3000, options?: AppOptions) {\n const server = this.app.listen(port, () => {\n console.info(`Mock server listening at http://localhost:${port}`)\n })\n server.keepAliveTimeout = 60 * 1000\n }\n\n private createApp(options?: AppOptions): express.Express {\n const app = express()\n\n const projectRouter = express.Router({ mergeParams: true })\n projectRouter.use(express.json())\n\n if (!options?.silent) {\n app.use(morgan('tiny'))\n }\n app.use('/oauth', this._oauth2.createRouter())\n\n // Only enable auth middleware if we have enabled this\n if (this.options.enableAuthentication) {\n app.use('/:projectKey', this._oauth2.createMiddleware(), projectRouter)\n app.use(\n '/:projectKey/in-store/key=:storeKey',\n this._oauth2.createMiddleware(),\n projectRouter\n )\n } else {\n app.use('/:projectKey', projectRouter)\n app.use('/:projectKey/in-store/key=:storeKey', projectRouter)\n }\n\n this._repositories = createRepositories(this._storage)\n this._projectService = new ProjectService(\n projectRouter,\n this._repositories.project as ProjectRepository\n )\n this._services = createServices(projectRouter, this._repositories)\n\n app.use((err: Error, req: Request, resp: Response, next: NextFunction) => {\n if (err instanceof CommercetoolsError) {\n return resp.status(err.statusCode).send({\n statusCode: err.statusCode,\n message: err.message,\n errors: [err.info],\n })\n } else {\n console.error(err)\n return resp.status(500).send({\n error: err.message,\n })\n }\n })\n\n return app\n }\n\n private mockApiHost() {\n const app = this.app\n\n this._nockScopes.api = nock(this.options.apiHost)\n .persist()\n .get(/.*/)\n .reply(async function (uri) {\n const response = await supertest(app)\n .get(uri)\n .set(copyHeaders(this.req.headers))\n return [response.status, response.body]\n })\n .post(/.*/)\n .reply(async function (uri, body) {\n const response = await supertest(app)\n .post(uri)\n .set(copyHeaders(this.req.headers))\n .send(body)\n return [response.status, response.body]\n })\n .delete(/.*/)\n .reply(async function (uri, body) {\n const response = await supertest(app)\n .delete(uri)\n .set(copyHeaders(this.req.headers))\n .send(body)\n return [response.status, response.body]\n })\n }\n\n private mockAuthHost() {\n const app = this.app\n\n this._nockScopes.auth = nock(this.options.authHost)\n .persist()\n .post(/^\\/oauth\\/.*/)\n .reply(async function (uri, body) {\n const response = await supertest(app)\n .post(uri + '?' + body)\n .set(copyHeaders(this.req.headers))\n .send()\n return [response.status, response.body]\n })\n }\n}\n","import assert from 'assert'\nimport {\n BaseResource,\n Cart,\n Category,\n Customer,\n CustomObject,\n InventoryEntry,\n Order,\n PagedQueryResponse,\n QueryParam,\n Reference,\n ResourceIdentifier,\n Product,\n Store,\n Type,\n Payment,\n Project,\n State,\n TaxCategory,\n ShippingMethod,\n ProductType,\n InvalidInputError,\n ProductProjection,\n ShoppingList,\n Extension,\n CartDiscount,\n CustomerGroup,\n DiscountCode,\n Zone,\n Channel,\n Subscription,\n ProductDiscount,\n} from '@commercetools/platform-sdk'\nimport { parseExpandClause } from './lib/expandParser'\nimport { RepositoryTypes, ResourceMap, Writable } from './types'\nimport { parseQueryExpression } from './lib/predicateParser'\nimport { CommercetoolsError } from './exceptions'\nimport { cloneObject } from './helpers'\n\ntype GetParams = {\n expand?: string[]\n}\n\ntype QueryParams = {\n expand?: string | string[]\n sort?: string | string[]\n limit?: number\n offset?: number\n withTotal?: boolean\n where?: string | string[]\n [key: string]: QueryParam\n}\n\nexport abstract class AbstractStorage {\n abstract clear(): void\n\n abstract all<RT extends RepositoryTypes>(\n projectKey: string,\n typeId: RT\n ): Array<ResourceMap[RT]>\n\n abstract add<RT extends RepositoryTypes>(\n projectKey: string,\n typeId: RT,\n obj: ResourceMap[RT]\n ): void\n\n abstract get<RT extends RepositoryTypes>(\n projectKey: string,\n typeId: RT,\n id: string,\n params?: GetParams\n ): ResourceMap[RT] | null\n\n abstract getByKey<RT extends RepositoryTypes>(\n projectKey: string,\n typeId: RT,\n key: string,\n params: GetParams\n ): ResourceMap[RT] | null\n\n abstract addProject(projectKey: string): Project\n abstract getProject(projectKey: string): Project\n abstract saveProject(project: Project): Project\n\n abstract delete<RT extends RepositoryTypes>(\n projectKey: string,\n typeId: RT,\n id: string,\n params: GetParams\n ): BaseResource | null\n\n abstract query(\n projectKey: string,\n typeId: RepositoryTypes,\n params: QueryParams\n ): PagedQueryResponse\n\n abstract getByResourceIdentifier<RT extends RepositoryTypes>(\n projectKey: string,\n identifier: ResourceIdentifier\n ): ResourceMap[RT] | undefined\n\n abstract expand<T>(\n projectKey: string,\n obj: T,\n clause: undefined | string | string[]\n ): T\n}\n\ntype ProjectStorage = {\n [index in RepositoryTypes]: Map<string, BaseResource>\n}\n\nexport class InMemoryStorage extends AbstractStorage {\n protected resources: {\n [projectKey: string]: ProjectStorage\n } = {}\n\n protected projects: {\n [projectKey: string]: Project\n } = {}\n\n private forProjectKey(projectKey: string): ProjectStorage {\n this.addProject(projectKey)\n\n let projectStorage = this.resources[projectKey]\n if (!projectStorage) {\n projectStorage = this.resources[projectKey] = {\n cart: new Map<string, Cart>(),\n 'cart-discount': new Map<string, CartDiscount>(),\n category: new Map<string, Category>(),\n channel: new Map<string, Channel>(),\n customer: new Map<string, Customer>(),\n 'customer-group': new Map<string, CustomerGroup>(),\n 'discount-code': new Map<string, DiscountCode>(),\n extension: new Map<string, Extension>(),\n 'inventory-entry': new Map<string, InventoryEntry>(),\n 'key-value-document': new Map<string, CustomObject>(),\n order: new Map<string, Order>(),\n 'order-edit': new Map<string, any>(),\n payment: new Map<string, Payment>(),\n product: new Map<string, Product>(),\n 'product-discount': new Map<string, ProductDiscount>(),\n 'product-price': new Map<string, any>(),\n 'product-selection': new Map<string, any>(),\n 'product-type': new Map<string, ProductType>(),\n 'product-projection': new Map<string, ProductProjection>(),\n review: new Map<string, any>(),\n 'shipping-method': new Map<string, ShippingMethod>(),\n state: new Map<string, State>(),\n store: new Map<string, Store>(),\n 'shopping-list': new Map<string, ShoppingList>(),\n 'standalone-price': new Map<string, any>(),\n subscription: new Map<string, Subscription>(),\n 'tax-category': new Map<string, TaxCategory>(),\n type: new Map<string, Type>(),\n zone: new Map<string, Zone>(),\n }\n }\n return projectStorage\n }\n\n clear() {\n for (const [, projectStorage] of Object.entries(this.resources)) {\n for (const [, value] of Object.entries(projectStorage)) {\n value?.clear()\n }\n }\n }\n\n all<RT extends RepositoryTypes>(\n projectKey: string,\n typeId: RT\n ): ResourceMap[RT][] {\n const store = this.forProjectKey(projectKey)[typeId]\n if (store) {\n return Array.from(store.values()).map(cloneObject) as ResourceMap[RT][]\n }\n return []\n }\n\n add<RT extends RepositoryTypes>(\n projectKey: string,\n typeId: RT,\n obj: ResourceMap[RT],\n params: GetParams = {}\n ): ResourceMap[RT] {\n const store = this.forProjectKey(projectKey)\n store[typeId]?.set(obj.id, obj)\n\n const resource = this.get(projectKey, typeId, obj.id, params)\n assert(resource, `resource of type ${typeId} with id ${obj.id} not created`)\n return cloneObject(resource)\n }\n\n get<RT extends RepositoryTypes>(\n projectKey: string,\n typeId: RT,\n id: string,\n params: GetParams = {}\n ): ResourceMap[RT] | null {\n const resource = this.forProjectKey(projectKey)[typeId]?.get(id)\n if (resource) {\n const clone = cloneObject(resource)\n return this.expand(projectKey, clone, params.expand) as ResourceMap[RT]\n }\n return null\n }\n\n getByKey<RT extends RepositoryTypes>(\n projectKey: string,\n typeId: RT,\n key: string,\n params: GetParams = {}\n ): ResourceMap[RT] | null {\n const store = this.forProjectKey(projectKey)\n const resourceStore = store[typeId]\n if (!store) {\n throw new Error('No type')\n }\n\n const resources: any[] = Array.from(resourceStore.values())\n const resource = resources.find((e) => e.key === key)\n if (resource) {\n const clone = cloneObject(resource)\n return this.expand(projectKey, clone, params.expand) as ResourceMap[RT]\n }\n return null\n }\n\n delete<RT extends RepositoryTypes>(\n projectKey: string,\n typeId: RT,\n id: string,\n params: GetParams = {}\n ): BaseResource | null {\n const resource = this.get(projectKey, typeId, id)\n\n if (resource) {\n this.forProjectKey(projectKey)[typeId]?.delete(id)\n return this.expand(projectKey, resource, params.expand) as ResourceMap[RT]\n }\n return resource\n }\n\n query(\n projectKey: string,\n typeId: RepositoryTypes,\n params: QueryParams\n ): PagedQueryResponse {\n const store = this.forProjectKey(projectKey)[typeId]\n if (!store) {\n throw new Error('No type')\n }\n\n let resources = Array.from(store.values())\n\n // Apply predicates\n if (params.where) {\n try {\n const filterFunc = parseQueryExpression(params.where)\n resources = resources.filter((resource) => filterFunc(resource, {}))\n } catch (err) {\n throw new CommercetoolsError<InvalidInputError>(\n {\n code: 'InvalidInput',\n message: (err as any).message,\n },\n 400\n )\n }\n }\n\n // Get the total before slicing the array\n const totalResources = resources.length\n\n // Apply offset, limit\n const offset = params.offset || 0\n const limit = params.limit || 20\n resources = resources.slice(offset, offset + limit)\n\n // Expand the resources\n if (params.expand !== undefined) {\n resources = resources.map((resource) =>\n this.expand(projectKey, resource, params.expand)\n )\n }\n\n return {\n count: totalResources,\n total: resources.length,\n offset: offset,\n limit: limit,\n results: resources.map(cloneObject),\n }\n }\n\n search(\n projectKey: string,\n typeId: RepositoryTypes,\n params: QueryParams\n ): PagedQueryResponse {\n let resources = this.all(projectKey, typeId)\n\n // Apply predicates\n if (params.where) {\n try {\n const filterFunc = parseQueryExpression(params.where)\n resources = resources.filter((resource) => filterFunc(resource, {}))\n } catch (err) {\n throw new CommercetoolsError<InvalidInputError>(\n {\n code: 'InvalidInput',\n message: (err as any).message,\n },\n 400\n )\n }\n }\n\n // Get the total before slicing the array\n const totalResources = resources.length\n\n // Apply offset, limit\n const offset = params.offset || 0\n const limit = params.limit || 20\n resources = resources.slice(offset, offset + limit)\n\n // Expand the resources\n if (params.expand !== undefined) {\n resources = resources.map((resource) =>\n this.expand(projectKey, resource, params.expand)\n )\n }\n\n return {\n count: totalResources,\n total: resources.length,\n offset: offset,\n limit: limit,\n results: resources,\n }\n }\n\n getByResourceIdentifier<RT extends RepositoryTypes>(\n projectKey: string,\n identifier: ResourceIdentifier\n ): ResourceMap[RT] | undefined {\n if (identifier.id) {\n const resource = this.get(projectKey, identifier.typeId, identifier.id)\n if (resource) {\n return resource as ResourceMap[RT]\n }\n console.error(\n `No resource found with typeId=${identifier.typeId}, id=${identifier.id}`\n )\n return undefined\n }\n\n if (identifier.key) {\n const store = this.forProjectKey(projectKey)[identifier.typeId]\n\n if (store) {\n // TODO: BaseResource has no key attribute, but the subclasses should\n // have them all.\n const resource = Array.from(store.values()).find(\n // @ts-ignore\n (r) => r.key === identifier.key\n )\n if (resource) {\n return resource as ResourceMap[RT]\n }\n } else {\n throw new Error(\n `No storage found for resource type: ${identifier.typeId}`\n )\n }\n }\n return undefined\n }\n\n addProject = (projectKey: string): Project => {\n if (!this.projects[projectKey]) {\n this.projects[projectKey] = {\n key: projectKey,\n name: '',\n countries: [],\n currencies: [],\n languages: [],\n createdAt: '2018-10-04T11:32:12.603Z',\n trialUntil: '2018-12',\n carts: {\n countryTaxRateFallbackEnabled: false,\n deleteDaysAfterLastModification: 90,\n },\n messages: { enabled: false, deleteDaysAfterCreation: 15 },\n shippingRateInputType: undefined,\n externalOAuth: undefined,\n searchIndexing: {\n products: {\n status: 'Deactivated',\n },\n orders: {\n status: 'Deactivated',\n },\n },\n version: 1,\n }\n }\n return this.projects[projectKey]\n }\n\n saveProject = (project: Project): Project => {\n this.projects[project.key] = project\n return project\n }\n\n getProject = (projectKey: string): Project => this.addProject(projectKey)\n\n // Expand resolves a nested reference and injects the object in the given obj\n public expand = <T>(\n projectKey: string,\n obj: T,\n clause: undefined | string | string[]\n ): T => {\n if (!clause) return obj\n const newObj = cloneObject(obj)\n if (Array.isArray(clause)) {\n clause.forEach((c) => {\n this._resolveResource(projectKey, newObj, c)\n })\n } else {\n this._resolveResource(projectKey, newObj, clause)\n }\n return newObj\n }\n\n private _resolveResource = (projectKey: string, obj: any, expand: string) => {\n const params = parseExpandClause(expand)\n\n if (!params.index) {\n const reference = obj[params.element]\n if (reference === undefined) {\n return\n }\n this._resolveReference(projectKey, reference, params.rest)\n } else if (params.index === '*') {\n const reference = obj[params.element]\n if (reference === undefined || !Array.isArray(reference)) return\n reference.forEach((itemRef: Writable<Reference>) => {\n this._resolveReference(projectKey, itemRef, params.rest)\n })\n } else {\n const reference = obj[params.element][params.index]\n if (reference === undefined) return\n this._resolveReference(projectKey, reference, params.rest)\n }\n }\n\n private _resolveReference(\n projectKey: string,\n reference: any,\n expand: string | undefined\n ) {\n if (reference === undefined) return\n\n if (\n reference.typeId !== undefined &&\n (reference.id !== undefined || reference.key !== undefined)\n ) {\n // @ts-ignore\n reference.obj = this.getByResourceIdentifier(projectKey, {\n typeId: reference.typeId,\n id: reference.id,\n key: reference.key,\n } as ResourceIdentifier)\n if (expand) {\n this._resolveResource(projectKey, reference.obj, expand)\n }\n } else {\n if (expand) {\n this._resolveResource(projectKey, reference, expand)\n }\n }\n }\n}\n","/**\n * This module implements the reference expansion as imeplemented by\n * commercetools.\n *\n * See https://docs.commercetools.com/api/general-concepts#reference-expansion\n *\n * TODO: implement support for multi-dimensional array\n */\ntype ExpandResult = {\n element: string\n index?: string | number\n rest?: string\n}\n\nexport const parseExpandClause = (clause: string): ExpandResult => {\n const result: ExpandResult = {\n element: clause,\n index: undefined,\n rest: undefined,\n }\n\n const pos = clause.indexOf('.')\n if (pos > 0) {\n result.element = clause.substring(0, pos)\n result.rest = clause.substring(pos + 1)\n }\n\n const match = result.element.match(/\\[([^\\]+])]/)\n if (match) {\n result.index = match[1] === '*' ? '*' : parseInt(match[1], 10)\n result.element = result.element.substring(0, match.index)\n }\n return result\n}\n","/**\n * This module implements the commercetools query predicate filter expression.\n * Support should be 100% complete.\n *\n * See https://docs.commercetools.com/api/predicates/query\n */\nimport perplex from 'perplex'\nimport { ITokenPosition, Parser } from 'pratt'\nimport { haversineDistance } from './haversine'\n\nexport class PredicateError {\n message: string\n\n constructor(message: string) {\n this.message = message\n }\n}\n\ntype MatchFunc = (target: any, variables: VariableMap) => boolean\ntype VariableMap = {\n [key: string]: any\n}\n\nexport const matchesPredicate = (\n predicate: string | string[] | undefined,\n target: any,\n variables?: VariableMap\n): boolean => {\n if (!predicate) {\n return true\n }\n\n if (Array.isArray(predicate)) {\n return predicate.every((item) => {\n const func = generateMatchFunc(item)\n return func(target, variables || {})\n })\n } else {\n const func = generateMatchFunc(predicate)\n return func(target, variables || {})\n }\n}\n\nexport const parseQueryExpression = (\n predicate: string | string[]\n): MatchFunc => {\n if (Array.isArray(predicate)) {\n const callbacks = predicate.map((item) => generateMatchFunc(item))\n return (target: any, variables: VariableMap) =>\n callbacks.every((callback) => callback(target, variables))\n } else {\n return generateMatchFunc(predicate)\n }\n}\n\ntype TypeSymbol = {\n type: 'var' | 'boolean' | 'string' | 'float' | 'int' | 'identifier'\n value: any\n pos?: ITokenPosition\n}\n\nconst validateSymbol = (val: TypeSymbol) => {\n if (!val.type) {\n throw new PredicateError('Internal error')\n }\n\n if (val.type === 'identifier') {\n const char = val.value.charAt(0)\n const line = val.pos?.start.line\n const column = val.pos?.start.column\n\n throw new PredicateError(\n `Invalid input '${char}', expected input parameter or primitive value (line ${line}, column ${column})`\n )\n }\n}\n\nconst resolveSymbol = (val: TypeSymbol, vars: VariableMap): any => {\n if (val.type === 'var') {\n if (!(val.value in vars)) {\n throw new PredicateError(`Missing parameter value for ${val.value}`)\n }\n return vars[val.value]\n }\n\n return val.value\n}\n\nconst resolveValue = (obj: any, val: TypeSymbol): any => {\n if (val.type !== 'identifier') {\n throw new PredicateError('Internal error')\n }\n\n if (!(val.value in obj)) {\n if (Array.isArray(obj)) {\n return Object.values(obj)\n .filter((v) => val.value in v)\n .map((v) => v[val.value])\n }\n throw new PredicateError(`The field '${val.value}' does not exist.`)\n }\n\n return obj[val.value]\n}\n\nconst getLexer = (value: string) =>\n new perplex(value)\n\n .token('AND', /and(?![-_a-z0-9]+)/i)\n .token('OR', /or(?![-_a-z0-9]+)/i)\n .token('NOT', /not(?![-_a-z0-9]+)/i)\n\n .token('WITHIN', /within(?![-_a-z0-9]+)/i)\n .token('IN', /in(?![-_a-z0-9]+)/i)\n .token('MATCHES_IGNORE_CASE', /matches\\s+ignore\\s+case(?![-_a-z0-9]+)/i)\n .token('CONTAINS', /contains(?![-_a-z0-9]+)/i)\n .token('ALL', /all(?![-_a-z0-9]+)/i)\n .token('ANY', /any(?![-_a-z0-9]+)/i)\n .token('EMPTY', /empty(?![-_a-z0-9]+)/i)\n .token('IS', /is(?![-_a-z0-9]+)/i)\n .token('DEFINED', /defined(?![-_a-z0-9]+)/i)\n\n .token('FLOAT', /\\d+\\.\\d+/)\n .token('INT', /\\d+/)\n .token('VARIABLE', /:([-_A-Za-z0-9]+)/)\n .token('BOOLEAN', /(true|false)/)\n .token('IDENTIFIER', /[-_A-Za-z0-9]+/)\n .token('STRING', /\"((?:\\\\.|[^\"\\\\])*)\"/)\n .token('STRING', /'((?:\\\\.|[^'\\\\])*)'/)\n\n .token('COMMA', ',')\n .token('(', '(')\n .token(')', ')')\n .token('>=', '>=')\n .token('<=', '<=')\n .token('>', '>')\n .token('<', '<')\n .token('!=', '!=')\n .token('=', '=')\n .token('\"', '\"')\n .token('WS', /\\s+/, true) // skip\n\n/**\n * This function converts a query expression in to a callable which returns a\n * boolean to indicate if the given object matches or not.\n *\n * This currently parses the predicate each time it is called, but it should be\n * straight-forward to add a query cache (lru-cache)\n */\nconst generateMatchFunc = (predicate: string): MatchFunc => {\n const lexer = getLexer(predicate)\n const parser = new Parser(lexer)\n .builder()\n .nud(\n 'IDENTIFIER',\n 100,\n (t) =>\n ({\n type: 'identifier',\n value: t.token.match,\n pos: t.token.strpos(),\n } as TypeSymbol)\n )\n .nud(\n 'BOOLEAN',\n 1,\n (t) =>\n ({\n type: 'boolean',\n value: t.token.match === 'true' ? true : false,\n pos: t.token.strpos(),\n } as TypeSymbol)\n )\n .nud(\n 'VARIABLE',\n 100,\n (t) =>\n ({\n type: 'var',\n // @ts-ignore\n value: t.token.groups[1],\n pos: t.token.strpos(),\n } as TypeSymbol)\n )\n .nud(\n 'STRING',\n 100,\n (t) =>\n ({\n type: 'string',\n // @ts-ignore\n value: t.token.groups[1],\n pos: t.token.strpos(),\n } as TypeSymbol)\n )\n .nud(\n 'INT',\n 1,\n (t) =>\n ({\n type: 'int',\n value: parseInt(t.token.match, 10),\n pos: t.token.strpos(),\n } as TypeSymbol)\n )\n .nud(\n 'FLOAT',\n 1,\n (t) =>\n ({\n type: 'float',\n value: parseFloat(t.token.match),\n pos: t.token.strpos(),\n } as TypeSymbol)\n )\n .nud('NOT', 100, ({ bp }) => {\n const expr = parser.parse({ terminals: [bp - 1] })\n return (obj: any) => !expr(obj)\n })\n .nud('EMPTY', 10, ({ bp }) => 'empty')\n .nud('DEFINED', 10, ({ bp }) => 'defined')\n\n .led('AND', 5, ({ left, bp }) => {\n const expr = parser.parse({ terminals: [bp - 1] })\n return (obj: any) => left(obj) && expr(obj)\n })\n .led('OR', 5, ({ left, token, bp }) => {\n const expr = parser.parse({ terminals: [bp - 1] })\n return (obj: any, vars: object) => left(obj, vars) || expr(obj, vars)\n })\n .led('COMMA', 1, ({ left, token, bp }) => {\n const expr: any = parser.parse({ terminals: [bp - 1] })\n if (Array.isArray(expr)) {\n return [left, ...expr]\n } else {\n return [left, expr]\n }\n })\n .nud('(', 100, (t) => {\n const expr: any = parser.parse({ terminals: [')'] })\n return expr\n })\n .led('(', 100, ({ left, bp }) => {\n const expr = parser.parse()\n lexer.expect(')')\n return (obj: any, vars: object) => {\n const value = resolveValue(obj, left)\n if (value) {\n return expr(value)\n }\n return false\n }\n })\n .bp(')', 0)\n .led('=', 20, ({ left, bp }) => {\n const expr = parser.parse({ terminals: [bp - 1] })\n validateSymbol(expr)\n\n return (obj: any, vars: VariableMap) => {\n const resolvedValue = resolveValue(obj, left)\n const resolvedSymbol = resolveSymbol(expr, vars)\n if (Array.isArray(resolvedValue)) {\n return !!resolvedValue.some((elem) => elem === resolvedSymbol)\n }\n return resolvedValue === resolvedSymbol\n }\n })\n .led('!=', 20, ({ left, bp }) => {\n const expr = parser.parse({ terminals: [bp - 1] })\n validateSymbol(expr)\n return (obj: any, vars: VariableMap) =>\n resolveValue(obj, left) !== resolveSymbol(expr, vars)\n })\n .led('>', 20, ({ left, bp }) => {\n const expr = parser.parse({ terminals: [bp - 1] })\n validateSymbol(expr)\n\n return (obj: any, vars: object) =>\n resolveValue(obj, left) > resolveSymbol(expr, vars)\n })\n .led('>=', 20, ({ left, bp }) => {\n const expr = parser.parse({ terminals: [bp - 1] })\n validateSymbol(expr)\n\n return (obj: any, vars: object) =>\n resolveValue(obj, left) >= resolveSymbol(expr, vars)\n })\n .led('<', 20, ({ left, bp }) => {\n const expr = parser.parse({ terminals: [bp - 1] })\n validateSymbol(expr)\n\n return (obj: any, vars: object) =>\n resolveValue(obj, left) < resolveSymbol(expr, vars)\n })\n .led('<=', 20, ({ left, bp }) => {\n const expr = parser.parse({ terminals: [bp - 1] })\n validateSymbol(expr)\n\n return (obj: any, vars: object) =>\n resolveValue(obj, left) <= resolveSymbol(expr, vars)\n })\n .led('IS', 20, ({ left, bp }) => {\n let invert = false\n\n // Peek if this is a `is not` statement\n const next = lexer.peek()\n if (next.type === 'NOT') {\n invert = true\n lexer.next()\n }\n\n const expr: any = parser.parse({ terminals: [bp - 1] })\n\n switch (expr) {\n case 'empty': {\n if (!invert) {\n return (obj: any, vars: VariableMap) => {\n const val = resolveValue(obj, left)\n return val.length === 0\n }\n } else {\n return (obj: any, vars: VariableMap) => {\n const val = resolveValue(obj, left)\n return val.length !== 0\n }\n }\n }\n case 'defined': {\n if (!invert) {\n return (obj: any, vars: VariableMap) => {\n const val = resolveValue(obj, left)\n return val !== undefined\n }\n } else {\n return (obj: any, vars: VariableMap) => {\n const val = resolveValue(obj, left)\n return val === undefined\n }\n }\n }\n default: {\n throw new Error('Unexpected')\n }\n }\n })\n .led('IN', 20, ({ left, bp }) => {\n const expr = parser.parse({ terminals: [bp - 1] })\n return (obj: any, vars: object) => {\n let symbols = expr\n if (!Array.isArray(symbols)) {\n symbols = [expr]\n }\n\n const inValues = symbols.map((item: TypeSymbol) =>\n resolveSymbol(item, vars)\n )\n return inValues.includes(resolveValue(obj, left))\n }\n })\n .led('MATCHES_IGNORE_CASE', 20, ({ left, bp }) => {\n const expr = parser.parse({ terminals: [bp - 1] })\n validateSymbol(expr)\n\n return (obj: any, vars: VariableMap) => {\n const value = resolveValue(obj, left)\n const other = resolveSymbol(expr, vars)\n\n if (typeof value != 'string') {\n throw new PredicateError(\n `The field '${left.value}' does not support this expression.`\n )\n }\n return value.toLowerCase() === other.toLowerCase()\n }\n })\n .led('WITHIN', 20, ({ left, bp }) => {\n const type = lexer.next()\n\n if (type.match !== 'circle') {\n throw new PredicateError(\n `Invalid input '${type.match}', expected circle`\n )\n }\n\n lexer.expect('(')\n const expr = parser.parse({ terminals: [')'] })\n\n return (obj: any, vars: object) => {\n const value = resolveValue(obj, left)\n if (!value) return false\n\n const maxDistance = resolveSymbol(expr[2], vars)\n const distance = haversineDistance(\n {\n longitude: value[0],\n latitude: value[1],\n },\n {\n longitude: resolveSymbol(expr[0], vars),\n latitude: resolveSymbol(expr[1], vars),\n }\n )\n return distance <= maxDistance\n }\n })\n .led('CONTAINS', 20, ({ left, bp }) => {\n const keyword = lexer.next()\n\n let expr = parser.parse()\n if (!Array.isArray(expr)) {\n expr = [expr]\n }\n\n return (obj: any, vars: object) => {\n const value = resolveValue(obj, left)\n\n if (!Array.isArray(value)) {\n throw new PredicateError(\n `The field '${left.value}' does not support this expression.`\n )\n }\n\n const array = expr.map((item: TypeSymbol) => resolveSymbol(item, vars))\n if (keyword.type === 'ALL') {\n return array.every((item: any) => value.includes(item))\n } else {\n return array.some((item: any) => value.includes(item))\n }\n }\n })\n\n .build()\n\n const result = parser.parse()\n\n if (typeof result !== 'function') {\n const lines = predicate.split('\\n')\n const column = lines[lines.length - 1].length\n\n throw new PredicateError(\n `Unexpected end of input, expected SphereIdentifierChar, comparison ` +\n `operator, not, in, contains, is, within or matches` +\n ` (line ${lines.length}, column ${column})`\n )\n }\n return result\n}\n","export type Location = {\n latitude: number\n longitude: number\n}\n\n/**\n * Returns the distance between src and dst as meters\n */\nexport const haversineDistance = (src: Location, dst: Location) => {\n const RADIUS_OF_EARTH_IN_KM = 6371\n const toRadian = (deg: number) => deg * (Math.PI / 180)\n\n const dLat = toRadian(dst.latitude - src.latitude)\n const dLon = toRadian(dst.longitude - src.longitude)\n\n const a =\n Math.sin(dLat / 2) * Math.sin(dLat / 2) +\n Math.cos(toRadian(src.latitude)) *\n Math.cos(toRadian(dst.latitude)) *\n Math.sin(dLon / 2) *\n Math.sin(dLon / 2)\n const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))\n return RADIUS_OF_EARTH_IN_KM * c * 1000\n}\n","export abstract class BaseError {\n abstract message: string\n}\n\nexport class CommercetoolsError<T extends BaseError> extends Error {\n info: T\n statusCode: number\n\n constructor(info: T, statusCode = 400) {\n super(info.message)\n this.info = info\n this.statusCode = statusCode || 500\n }\n}\n\nexport interface InvalidRequestError {\n readonly code: 'invalid_request'\n readonly message: string\n}\n","import { v4 as uuidv4 } from 'uuid'\nimport { ParsedQs } from 'qs'\n\nexport const getBaseResourceProperties = () => ({\n id: uuidv4(),\n createdAt: new Date().toISOString(),\n lastModifiedAt: new Date().toISOString(),\n version: 0,\n})\n\n/**\n * Do a nested lookup by using a path. For example `foo.bar.value` will\n * return obj['foo']['bar']['value']\n */\nexport const nestedLookup = (obj: any, path: string): any => {\n if (!path || path === '') {\n return obj\n }\n\n const parts = path.split('.')\n let val = obj\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]\n if (val == undefined) {\n return undefined\n }\n\n val = val[part]\n }\n\n return val\n}\n\nexport const QueryParamsAsArray = (\n input: string | ParsedQs | string[] | ParsedQs[] | undefined\n): string[] => {\n if (input == undefined) {\n return []\n }\n\n if (Array.isArray(input)) {\n return input as string[]\n }\n return [input] as string[]\n}\n\nexport const cloneObject = <T>(o: T): T => JSON.parse(JSON.stringify(o))\n","import auth from 'basic-auth'\nimport bodyParser from 'body-parser'\nimport express, { NextFunction, Request, Response } from 'express'\nimport {\n AccessDeniedError,\n InvalidTokenError,\n} from '@commercetools/platform-sdk'\nimport { CommercetoolsError, InvalidRequestError } from '../exceptions'\nimport { InvalidClientError, UnsupportedGrantType } from './errors'\nimport { OAuth2Store } from './store'\nimport { getBearerToken } from './helpers'\n\nexport class OAuth2Server {\n store: OAuth2Store\n\n constructor(options: { enabled: boolean; validate: boolean }) {\n this.store = new OAuth2Store(options.validate)\n }\n\n createRouter() {\n const router = express.Router()\n router.use(bodyParser.urlencoded({ extended: true }))\n router.post('/token', this.tokenHandler.bind(this))\n return router\n }\n\n createMiddleware() {\n return async (request: Request, response: Response, next: NextFunction) => {\n const token = getBearerToken(request)\n if (!token) {\n next(\n new CommercetoolsError<AccessDeniedError>(\n {\n code: 'access_denied',\n message:\n 'This endpoint requires an access token. You can get one from the authorization server.',\n },\n 401\n )\n )\n }\n\n if (!token || !this.store.validateToken(token)) {\n next(\n new CommercetoolsError<InvalidTokenError>(\n {\n code: 'invalid_token',\n message: 'invalid_token',\n },\n 401\n )\n )\n }\n\n next()\n }\n }\n async tokenHandler(request: Request, response: Response, next: NextFunction) {\n const authHeader = request.header('Authorization')\n if (!authHeader) {\n return next(\n new CommercetoolsError<InvalidClientError>(\n {\n code: 'invalid_client',\n message:\n 'Please provide valid client credentials using HTTP Basic Authentication.',\n },\n 401\n )\n )\n }\n const credentials = auth.parse(authHeader)\n if (!credentials) {\n return next(\n new CommercetoolsError<InvalidClientError>(\n {\n code: 'invalid_client',\n message:\n 'Please provide valid client credentials using HTTP Basic Authentication.',\n },\n 400\n )\n )\n }\n\n const grantType = request.query.grant_type || request.body.grant_type\n if (!grantType) {\n return next(\n new CommercetoolsError<InvalidRequestError>(\n {\n code: 'invalid_request',\n message: 'Missing required parameter: grant_type.',\n },\n 400\n )\n )\n }\n\n if (grantType === 'client_credentials') {\n const token = this.store.getClientToken(\n credentials.name,\n credentials.pass,\n request.query.scope?.toString()\n )\n return response.status(200).send(token)\n } else {\n return next(\n new CommercetoolsError<UnsupportedGrantType>(\n {\n code: 'unsupported_grant_type',\n message: `Invalid parameter: grant_type: Invalid grant type: ${grantType}`,\n },\n 400\n )\n )\n }\n }\n}\n","import { randomBytes } from 'crypto'\n\ntype Token = {\n access_token: string\n token_type: 'Bearer'\n expires_in: number\n scope: string\n}\n\nexport class OAuth2Store {\n tokens: Token[] = []\n validate = true\n\n constructor(validate = true) {\n this.validate = validate\n }\n\n getClientToken(clientId: string, clientSecret: string, scope?: string) {\n const token: Token = {\n access_token: randomBytes(16).toString('base64'),\n token_type: 'Bearer',\n expires_in: 172800,\n scope: scope || 'todo',\n }\n this.tokens.push(token)\n return token\n }\n\n validateToken(token: string) {\n if (!this.validate) return true\n\n const foundToken = this.tokens.find((t) => t.access_token === token)\n if (foundToken) {\n return true\n }\n return false\n }\n}\n","import { Request } from 'express'\n\nexport const getBearerToken = (request: Request): string | undefined => {\n const authHeader = request.header('Authorization')\n const match = authHeader?.match(/^Bearer\\s(?<token>[^\\s]+)$/)\n if (match) {\n return match.groups?.token\n }\n return undefined\n}\n","import { ReferenceTypeId } from '@commercetools/platform-sdk'\nimport { GetParams } from 'repositories/abstract'\nimport { getBaseResourceProperties } from './helpers'\nimport { AbstractStorage } from './storage'\nimport {\n RepositoryMap,\n RepositoryTypes,\n ResourceMap,\n Services,\n ServiceTypes,\n} from './types'\n\nexport class ProjectAPI {\n private projectKey: string\n private _storage: AbstractStorage\n private _services: Services\n\n constructor(\n projectKey: string,\n services: Services,\n storage: AbstractStorage\n ) {\n this.projectKey = projectKey\n this._storage = storage\n this._services = services\n }\n\n add(typeId: ReferenceTypeId, resource: ResourceMap[ReferenceTypeId]) {\n const service = this._services[typeId]\n if (service) {\n this._storage.add(this.projectKey, typeId as ReferenceTypeId, {\n ...getBaseResourceProperties(),\n ...resource,\n })\n } else {\n throw new Error(`Service for ${typeId} not implemented yet`)\n }\n }\n\n get<RT extends RepositoryTypes>(\n typeId: RT,\n id: string,\n params?: GetParams\n ): ResourceMap[RT] {\n return this._storage.get(\n this.projectKey,\n typeId,\n id,\n params\n ) as ResourceMap[RT]\n }\n\n // TODO: Not sure if we want to expose this...\n getRepository<RT extends keyof RepositoryMap>(\n typeId: ServiceTypes\n ): RepositoryMap[RT] {\n const service = this._services[typeId]\n if (service !== undefined) {\n return service.repository as RepositoryMap[RT]\n }\n throw new Error('No such repository')\n }\n}\n","export const copyHeaders = (headers: Record<string, string>) => {\n const validHeaders = ['accept', 'host', 'authorization']\n const result: Record<string, string> = {}\n\n Object.entries(headers).forEach(([key, value]) => {\n if (validHeaders.includes(key.toLowerCase())) {\n result[key] = value\n }\n })\n\n return result\n}\n","export const DEFAULT_API_HOSTNAME =\n /^https:\\/\\/api\\..*?\\.commercetools.com:443$/\nexport const DEFAULT_AUTH_HOSTNAME =\n /^https:\\/\\/auth\\..*?\\.commercetools.com:443$/\n","import { v4 as uuidv4 } from 'uuid'\nimport {\n Address,\n BaseAddress,\n CustomFields,\n CustomFieldsDraft,\n InvalidJsonInputError,\n Money,\n Price,\n PriceDraft,\n Reference,\n ReferencedResourceNotFoundError,\n ResourceIdentifier,\n Store,\n StoreKeyReference,\n StoreResourceIdentifier,\n Type,\n TypedMoney,\n} from '@commercetools/platform-sdk'\nimport { Request } from 'express'\nimport { AbstractStorage } from '../storage'\nimport { RepositoryContext } from './abstract'\nimport { CommercetoolsError } from '../exceptions'\n\nexport const createAddress = (\n base: BaseAddress | undefined,\n projectKey: string,\n storage: AbstractStorage\n): Address | undefined => {\n if (!base) return undefined\n\n if (!base?.country) {\n throw new Error('Country is required')\n }\n\n return {\n ...base,\n }\n}\n\nexport const createCustomFields = (\n draft: CustomFieldsDraft | undefined,\n projectKey: string,\n storage: AbstractStorage\n): CustomFields | undefined => {\n if (!draft) return undefined\n if (!draft.type) return undefined\n if (!draft.type.typeId) return undefined\n if (!draft.fields) return undefined\n const typeResource = storage.getByResourceIdentifier(\n projectKey,\n draft.type\n ) as Type\n\n if (!typeResource) {\n throw new Error(\n `No type '${draft.type.typeId}' with id=${draft.type.id} or key=${draft.type.key}`\n )\n }\n\n return {\n type: {\n typeId: draft.type.typeId,\n id: typeResource.id,\n },\n fields: draft.fields,\n }\n}\n\nexport const createPrice = (draft: PriceDraft): Price => ({\n id: uuidv4(),\n value: createTypedMoney(draft.value),\n})\n\nexport const createTypedMoney = (value: Money): TypedMoney => {\n // Taken from https://docs.adyen.com/development-resources/currency-codes\n let fractionDigits = 2\n switch (value.currencyCode.toUpperCase()) {\n case 'BHD':\n case 'IQD':\n case 'JOD':\n case 'KWD':\n case 'LYD':\n case 'OMR':\n case 'TND':\n fractionDigits = 3\n break\n case 'CVE':\n case 'DJF':\n case 'GNF':\n case 'IDR':\n case 'JPY':\n case 'KMF':\n case 'KRW':\n case 'PYG':\n case 'RWF':\n case 'UGX':\n case 'VND':\n case 'VUV':\n case 'XAF':\n case 'XOF':\n case 'XPF':\n fractionDigits = 0\n break\n default:\n fractionDigits = 2\n }\n\n return {\n type: 'centPrecision',\n ...value,\n fractionDigits: fractionDigits,\n }\n}\n\nexport const resolveStoreReference = (\n ref: StoreResourceIdentifier | undefined,\n projectKey: string,\n storage: AbstractStorage\n): StoreKeyReference | undefined => {\n if (!ref) return undefined\n const resource = storage.getByResourceIdentifier(projectKey, ref)\n if (!resource) {\n throw new Error('No such store')\n }\n\n const store = resource as Store\n return {\n typeId: 'store',\n key: store.key,\n }\n}\n\nexport const getReferenceFromResourceIdentifier = <T extends Reference>(\n resourceIdentifier: ResourceIdentifier,\n projectKey: string,\n storage: AbstractStorage\n): T => {\n if (!resourceIdentifier.id && !resourceIdentifier.key) {\n throw new CommercetoolsError<InvalidJsonInputError>(\n {\n code: 'InvalidJsonInput',\n message: `${resourceIdentifier.typeId}: ResourceIdentifier requires an 'id' xor a 'key'`,\n },\n 400\n )\n }\n\n const resource = storage.getByResourceIdentifier(\n projectKey,\n resourceIdentifier\n )\n if (!resource) {\n const errIdentifier = resourceIdentifier.key\n ? `key '${resourceIdentifier.key}'`\n : `identifier '${resourceIdentifier.key}'`\n\n throw new CommercetoolsError<ReferencedResourceNotFoundError>(\n {\n code: 'ReferencedResourceNotFound',\n // @ts-ignore\n typeId: resourceIdentifier.typeId,\n 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).`,\n },\n 400\n )\n }\n\n return {\n typeId: resourceIdentifier.typeId,\n id: resource?.id,\n } as unknown as T\n}\n\nexport const getRepositoryContext = (request: Request): RepositoryContext => ({\n projectKey: request.params.projectKey,\n storeKey: request.params.storeKey,\n})\n","import { Router } from 'express'\nimport { Request, Response } from 'express'\nimport { ProjectRepository } from '../repositories/project'\nimport { Update } from '@commercetools/platform-sdk'\nimport { getRepositoryContext } from '../repositories/helpers'\n\nexport class ProjectService {\n public repository: ProjectRepository\n\n constructor(parent: Router, repository: ProjectRepository) {\n this.repository = repository\n this.registerRoutes(parent)\n }\n\n registerRoutes(parent: Router) {\n parent.get('', this.get.bind(this))\n parent.post('', this.post.bind(this))\n }\n\n get(request: Request, response: Response) {\n const project = this.repository.get(getRepositoryContext(request))\n return response.status(200).send(project)\n }\n\n post(request: Request, response: Response) {\n const updateRequest: Update = request.body\n const project = this.repository.get(getRepositoryContext(request))\n\n if (!project) {\n return response.status(404).send({})\n }\n\n this.repository.processUpdateActions(\n getRepositoryContext(request),\n project,\n updateRequest.version,\n updateRequest.actions\n )\n\n return response.status(200).send({})\n }\n}\n","import {\n Cart,\n CartAddLineItemAction,\n CartDraft,\n CartRemoveLineItemAction,\n CartSetBillingAddressAction,\n CartSetCountryAction,\n CartSetCustomerEmailAction,\n CartSetCustomFieldAction,\n CartSetCustomTypeAction,\n CartSetLocaleAction,\n CartSetShippingAddressAction,\n CartSetShippingMethodAction,\n GeneralError,\n LineItem,\n LineItemDraft,\n Price,\n Product,\n ProductPagedQueryResponse,\n ProductVariant,\n ReferenceTypeId,\n} from '@commercetools/platform-sdk'\nimport { v4 as uuidv4 } from 'uuid'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { createCustomFields } from './helpers'\nimport { Writable } from '../types'\nimport { CommercetoolsError } from '../exceptions'\n\nexport class CartRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'cart'\n }\n\n create(context: RepositoryContext, draft: CartDraft): Cart {\n const lineItems =\n draft.lineItems?.map((draftLineItem) =>\n this.draftLineItemtoLineItem(\n context.projectKey,\n draftLineItem,\n draft.currency,\n draft.country\n )\n ) ?? []\n\n const resource: Writable<Cart> = {\n ...getBaseResourceProperties(),\n cartState: 'Active',\n lineItems,\n customLineItems: [],\n totalPrice: {\n type: 'centPrecision',\n centAmount: 0,\n currencyCode: draft.currency,\n fractionDigits: 0,\n },\n taxMode: draft.taxMode ?? 'Platform',\n taxRoundingMode: draft.taxRoundingMode ?? 'HalfEven',\n taxCalculationMode: draft.taxCalculationMode ?? 'LineItemLevel',\n refusedGifts: [],\n locale: draft.locale,\n country: draft.country,\n origin: draft.origin ?? 'Customer',\n custom: createCustomFields(\n draft.custom,\n context.projectKey,\n this._storage\n ),\n }\n resource.totalPrice.centAmount = calculateCartTotalPrice(resource)\n\n this.saveNew(context, resource)\n return resource\n }\n\n getActiveCart(projectKey: string): Cart | undefined {\n // Get first active cart\n const results = this._storage.query(projectKey, this.getTypeId(), {\n where: [`cartState=\"Active\"`],\n })\n if (results.count > 0) {\n return results.results[0] as Cart\n }\n\n return\n }\n\n actions = {\n addLineItem: (\n context: RepositoryContext,\n resource: Writable<Cart>,\n { productId, variantId, sku, quantity = 1 }: CartAddLineItemAction\n ) => {\n let product: Product | null = null\n\n if (productId && variantId) {\n // Fetch product and variant by ID\n product = this._storage.get(\n context.projectKey,\n 'product',\n productId,\n {}\n )\n } else if (sku) {\n // Fetch product and variant by SKU\n const items = this._storage.query(context.projectKey, 'product', {\n where: [\n `masterData(current(masterVariant(sku=\"${sku}\"))) or masterData(current(variants(sku=\"${sku}\")))`,\n ],\n }) as ProductPagedQueryResponse\n\n if (items.count === 1) {\n product = items.results[0]\n }\n }\n\n if (!product) {\n // Check if product is found\n throw new CommercetoolsError<GeneralError>({\n code: 'General',\n message: sku\n ? `A product containing a variant with SKU '${sku}' not found.`\n : `A product with ID '${productId}' not found.`,\n })\n }\n\n // Find matching variant\n const variant: ProductVariant | undefined = [\n product.masterData.current.masterVariant,\n ...product.masterData.current.variants,\n ].find((x) => {\n if (sku) return x.sku === sku\n if (variantId) return x.id === variantId\n return false\n })\n\n if (!variant) {\n // Check if variant is found\n throw new CommercetoolsError<GeneralError>({\n code: 'General',\n message: sku\n ? `A variant with SKU '${sku}' for product '${product.id}' not found.`\n : `A variant with ID '${variantId}' for product '${product.id}' not found.`,\n })\n }\n\n const alreadyAdded = resource.lineItems.some(\n (x) => x.productId === product?.id && x.variant.id === variant?.id\n )\n if (alreadyAdded) {\n // increase quantity and update total price\n resource.lineItems.map((x) => {\n if (x.productId === product?.id && x.variant.id === variant?.id) {\n x.quantity += quantity\n x.totalPrice.centAmount = calculateLineItemTotalPrice(x)\n }\n return x\n })\n } else {\n // add line item\n if (!variant.prices?.length) {\n throw new CommercetoolsError<GeneralError>({\n code: 'General',\n message: `A product with ID '${productId}' doesn't have any prices.`,\n })\n }\n\n const currency = resource.totalPrice.currencyCode\n\n const price = selectPrice({\n prices: variant.prices,\n currency,\n country: resource.country,\n })\n if (!price) {\n throw new Error(\n `No valid price found for ${productId} for country ${resource.country} and currency ${currency}`\n )\n }\n resource.lineItems.push({\n id: uuidv4(),\n productId: product.id,\n productKey: product.key,\n name: product.masterData.current.name,\n productSlug: product.masterData.current.slug,\n productType: product.productType,\n variant,\n price: price,\n totalPrice: {\n ...price.value,\n centAmount: price.value.centAmount * quantity,\n },\n quantity,\n discountedPricePerQuantity: [],\n lineItemMode: 'Standard',\n priceMode: 'Platform',\n state: [],\n })\n }\n\n // Update cart total price\n resource.totalPrice.centAmount = calculateCartTotalPrice(resource)\n },\n removeLineItem: (\n context: RepositoryContext,\n resource: Writable<Cart>,\n { lineItemId, quantity }: CartRemoveLineItemAction\n ) => {\n const lineItem = resource.lineItems.find((x) => x.id === lineItemId)\n if (!lineItem) {\n // Check if product is found\n throw new CommercetoolsError<GeneralError>({\n code: 'General',\n message: `A line item with ID '${lineItemId}' not found.`,\n })\n }\n\n const shouldDelete = !quantity || quantity >= lineItem.quantity\n if (shouldDelete) {\n // delete line item\n resource.lineItems = resource.lineItems.filter(\n (x) => x.id !== lineItemId\n )\n } else {\n // decrease quantity and update total price\n resource.lineItems.map((x) => {\n if (x.id === lineItemId && quantity) {\n x.quantity -= quantity\n x.totalPrice.centAmount = calculateLineItemTotalPrice(x)\n }\n return x\n })\n }\n\n // Update cart total price\n resource.totalPrice.centAmount = calculateCartTotalPrice(resource)\n },\n setBillingAddress: (\n context: RepositoryContext,\n resource: Writable<Cart>,\n { address }: CartSetBillingAddressAction\n ) => {\n resource.billingAddress = address\n },\n setShippingMethod: (\n context: RepositoryContext,\n resource: Writable<Cart>,\n { shippingMethod }: CartSetShippingMethodAction\n ) => {\n if (shippingMethod) {\n const method = this._storage.getByResourceIdentifier<'shipping-method'>(\n context.projectKey,\n shippingMethod\n )\n\n if (!method) {\n throw new Error(`Type ${shippingMethod} not found`)\n }\n\n // Based on the address we should select a shipping zone and\n // use that to define the price.\n // @ts-ignore\n resource.shippingInfo = {\n shippingMethod: {\n typeId: 'shipping-method',\n id: method.id,\n },\n shippingMethodName: method.name,\n }\n } else {\n resource.shippingInfo = undefined\n }\n },\n setCountry: (\n context: RepositoryContext,\n resource: Writable<Cart>,\n { country }: CartSetCountryAction\n ) => {\n resource.country = country\n },\n setCustomerEmail: (\n context: RepositoryContext,\n resource: Writable<Cart>,\n { email }: CartSetCustomerEmailAction\n ) => {\n resource.customerEmail = email\n },\n setCustomField: (\n context: RepositoryContext,\n resource: Cart,\n { name, value }: CartSetCustomFieldAction\n ) => {\n if (!resource.custom) {\n throw new Error('Resource has no custom field')\n }\n resource.custom.fields[name] = value\n },\n setCustomType: (\n context: RepositoryContext,\n resource: Writable<Cart>,\n { type, fields }: CartSetCustomTypeAction\n ) => {\n if (!type) {\n resource.custom = undefined\n } else {\n const resolvedType = this._storage.getByResourceIdentifier(\n context.projectKey,\n type\n )\n if (!resolvedType) {\n throw new Error(`Type ${type} not found`)\n }\n\n resource.custom = {\n type: {\n typeId: 'type',\n id: resolvedType.id,\n },\n fields: fields || [],\n }\n }\n },\n setLocale: (\n context: RepositoryContext,\n resource: Writable<Cart>,\n { locale }: CartSetLocaleAction\n ) => {\n resource.locale = locale\n },\n setShippingAddress: (\n context: RepositoryContext,\n resource: Writable<Cart>,\n { address }: CartSetShippingAddressAction\n ) => {\n resource.shippingAddress = address\n },\n }\n draftLineItemtoLineItem = (\n projectKey: string,\n draftLineItem: LineItemDraft,\n currency: string,\n country: string | undefined\n ): LineItem => {\n const { productId, quantity, variantId, sku } = draftLineItem\n\n let product: Product | null = null\n\n if (productId && variantId) {\n // Fetch product and variant by ID\n product = this._storage.get(projectKey, 'product', productId, {})\n } else if (sku) {\n // Fetch product and variant by SKU\n const items = this._storage.query(projectKey, 'product', {\n where: [\n `masterData(current(masterVariant(sku=\"${sku}\"))) or masterData(current(variants(sku=\"${sku}\")))`,\n ],\n }) as ProductPagedQueryResponse\n\n if (items.count === 1) {\n product = items.results[0]\n }\n }\n\n if (!product) {\n // Check if product is found\n throw new CommercetoolsError<GeneralError>({\n code: 'General',\n message: sku\n ? `A product containing a variant with SKU '${sku}' not found.`\n : `A product with ID '${productId}' not found.`,\n })\n }\n\n // Find matching variant\n const variant = [\n product.masterData.current.masterVariant,\n ...product.masterData.current.variants,\n ].find((x) => {\n if (sku) return x.sku === sku\n if (variantId) return x.id === variantId\n return false\n })\n\n if (!variant) {\n // Check if variant is found\n throw new Error(\n sku\n ? `A variant with SKU '${sku}' for product '${product.id}' not found.`\n : `A variant with ID '${variantId}' for product '${product.id}' not found.`\n )\n }\n\n const quant = quantity ?? 1\n\n const price = selectPrice({ prices: variant.prices, currency, country })\n if (!price) {\n throw new Error(\n `No valid price found for ${productId} for country ${country} and currency ${currency}`\n )\n }\n\n return {\n id: uuidv4(),\n productId: product.id,\n productKey: product.key,\n name: product.masterData.current.name,\n productSlug: product.masterData.current.slug,\n productType: product.productType,\n variant,\n price: price,\n totalPrice: {\n ...price.value,\n centAmount: price.value.centAmount * quant,\n },\n quantity: quant,\n discountedPricePerQuantity: [],\n lineItemMode: 'Standard',\n priceMode: 'Platform',\n state: [],\n }\n }\n}\n\nconst selectPrice = ({\n prices,\n currency,\n country,\n}: {\n prices: Price[] | undefined\n currency: string\n country: string | undefined\n}) => {\n if (!prices) {\n return undefined\n }\n\n // Quick-and-dirty way of selecting price based on the given currency and country.\n // Can be improved later to give more priority to exact matches over\n // 'all country' matches, and include customer groups in the mix as well\n return prices.find((price) => {\n const countryMatch = !price.country || price.country === country\n const currencyMatch = price.value.currencyCode === currency\n return countryMatch && currencyMatch\n })\n}\n\nconst calculateLineItemTotalPrice = (lineItem: LineItem): number =>\n lineItem.price!.value.centAmount * lineItem.quantity\n\nconst calculateCartTotalPrice = (cart: Cart): number =>\n cart.lineItems.reduce((cur, item) => cur + item.totalPrice.centAmount, 0)\n","import { RepositoryTypes, Resource, Writable } from './../types'\nimport deepEqual from 'deep-equal'\n\nimport {\n BaseResource,\n Project,\n ResourceNotFoundError,\n UpdateAction,\n} from '@commercetools/platform-sdk'\nimport { AbstractStorage } from '../storage'\nimport { checkConcurrentModification } from './errors'\nimport { CommercetoolsError } from '../exceptions'\nimport { cloneObject } from '../helpers'\n\nexport type QueryParams = {\n expand?: string[]\n where?: string[]\n offset?: number\n limit?: number\n}\n\nexport type GetParams = {\n expand?: string[]\n}\n\nexport type RepositoryContext = {\n projectKey: string\n storeKey?: string\n}\nexport abstract class AbstractRepository {\n protected _storage: AbstractStorage\n protected actions: Partial<\n Record<\n any,\n (context: RepositoryContext, resource: any, action: any) => void\n >\n > = {}\n\n constructor(storage: AbstractStorage) {\n this._storage = storage\n }\n\n abstract saveNew({ projectKey }: RepositoryContext, resource: Resource): void\n\n abstract saveUpdate(\n { projectKey }: RepositoryContext,\n version: number,\n resource: Resource\n ): void\n\n processUpdateActions<T extends Resource>(\n context: RepositoryContext,\n resource: T,\n version: number,\n actions: UpdateAction[]\n ): T {\n // Deep-copy\n const updatedResource = cloneObject(resource) as Writable<Resource>\n const identifier = (resource as BaseResource).id\n ? (resource as BaseResource).id\n : (resource as Project).key\n\n actions.forEach((action) => {\n const updateFunc = this.actions[action.action]\n\n if (!updateFunc) {\n console.error(`No mock implemented for update action ${action.action}`)\n throw new Error(\n `No mock implemented for update action ${action.action}`\n )\n }\n\n const beforeUpdate = cloneObject(resource)\n updateFunc(context, updatedResource, action)\n\n // Check if the object is updated. We need to increase the version of\n // an object per action which does an actual modification.\n // This isn't the most performant method to do this (the update action\n // should return a flag) but for now the easiest.\n if (!deepEqual(beforeUpdate, updatedResource)) {\n // We only check the version when there is an actual modification to\n // be stored.\n checkConcurrentModification(resource.version, version, identifier)\n\n updatedResource.version += 1\n }\n })\n\n // If all actions succeeded we write the new version\n // to the storage.\n if (resource.version != updatedResource.version) {\n this.saveUpdate(context, version, updatedResource)\n }\n\n const result = this.postProcessResource(updatedResource)\n if (!result) {\n throw new Error('invalid post process action')\n }\n return result as T\n }\n\n postProcessResource<T extends Resource>(resource: T): T {\n return resource\n }\n}\n\nexport abstract class AbstractResourceRepository extends AbstractRepository {\n abstract create(context: RepositoryContext, draft: any): BaseResource\n abstract getTypeId(): RepositoryTypes\n\n constructor(storage: AbstractStorage) {\n super(storage)\n }\n\n query(context: RepositoryContext, params: QueryParams = {}) {\n const result = this._storage.query(context.projectKey, this.getTypeId(), {\n expand: params.expand,\n where: params.where,\n offset: params.offset,\n limit: params.limit,\n })\n\n // @ts-ignore\n result.results = result.results.map(this.postProcessResource)\n return result\n }\n\n get(\n context: RepositoryContext,\n id: string,\n params: GetParams = {}\n ): BaseResource | null {\n const resource = this._storage.get(\n context.projectKey,\n this.getTypeId(),\n id,\n params\n )\n return resource ? this.postProcessResource(resource) : null\n }\n\n getByKey(\n context: RepositoryContext,\n key: string,\n params: GetParams = {}\n ): BaseResource | null {\n const resource = this._storage.getByKey(\n context.projectKey,\n this.getTypeId(),\n key,\n params\n )\n return resource ? this.postProcessResource(resource) : null\n }\n\n delete(\n context: RepositoryContext,\n id: string,\n params: GetParams = {}\n ): BaseResource | null {\n const resource = this._storage.delete(\n context.projectKey,\n this.getTypeId(),\n id,\n params\n )\n return resource ? this.postProcessResource(resource) : null\n }\n\n saveNew(context: RepositoryContext, resource: Writable<BaseResource>) {\n resource.version = 1\n this._storage.add(context.projectKey, this.getTypeId(), resource as any)\n }\n\n saveUpdate(\n context: RepositoryContext,\n version: number,\n resource: Writable<BaseResource>\n ) {\n // Check if the resource still exists.\n const current = this._storage.get(\n context.projectKey,\n this.getTypeId(),\n resource.id\n )\n if (!current) {\n throw new CommercetoolsError<ResourceNotFoundError>(\n {\n code: 'ResourceNotFound',\n message: 'Resource not found while updating',\n },\n 400\n )\n }\n\n checkConcurrentModification(current.version, version, resource.id)\n\n if (current.version === resource.version) {\n throw new Error('Internal error: no changes to save')\n }\n resource.lastModifiedAt = new Date().toISOString()\n\n this._storage.add(context.projectKey, this.getTypeId(), resource as any)\n\n return resource\n }\n}\n","import {\n ConcurrentModificationError,\n} from '@commercetools/platform-sdk'\nimport { CommercetoolsError } from '../exceptions'\n\nexport const checkConcurrentModification = (\n currentVersion: number,\n expectedVersion: number,\n identifier: string\n) => {\n if (currentVersion === expectedVersion) return\n console.error(\n `Object ${identifier} has a different version than expected. Expected: ${expectedVersion} - Actual: ${currentVersion}.`\n )\n\n throw new CommercetoolsError<ConcurrentModificationError>(\n {\n message: `Object ${identifier} has a different version than expected. Expected: ${expectedVersion} - Actual: ${currentVersion}.`,\n currentVersion: currentVersion,\n code: 'ConcurrentModification',\n },\n 409\n )\n}\n","import {\n CartDiscount,\n CartDiscountChangeIsActiveAction,\n CartDiscountChangeSortOrderAction,\n CartDiscountDraft,\n CartDiscountSetDescriptionAction,\n CartDiscountSetKeyAction,\n CartDiscountSetValidFromAction,\n CartDiscountSetValidFromAndUntilAction,\n CartDiscountSetValidUntilAction,\n CartDiscountUpdateAction,\n CartDiscountValueAbsolute,\n CartDiscountValueDraft,\n CartDiscountValueFixed,\n CartDiscountValueGiftLineItem,\n CartDiscountValueRelative,\n ReferenceTypeId,\n} from '@commercetools/platform-sdk'\nimport { Writable } from 'types'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { createTypedMoney } from './helpers'\n\nexport class CartDiscountRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'cart-discount'\n }\n\n create(context: RepositoryContext, draft: CartDiscountDraft): CartDiscount {\n const resource: CartDiscount = {\n ...getBaseResourceProperties(),\n key: draft.key,\n description: draft.description,\n cartPredicate: draft.cartPredicate,\n isActive: draft.isActive || false,\n name: draft.name,\n references: [],\n target: draft.target,\n requiresDiscountCode: draft.requiresDiscountCode || false,\n sortOrder: draft.sortOrder,\n stackingMode: draft.stackingMode || 'Stacking',\n validFrom: draft.validFrom,\n validUntil: draft.validUntil,\n value: this.transformValueDraft(draft.value),\n }\n this.saveNew(context, resource)\n return resource\n }\n\n private transformValueDraft(value: CartDiscountValueDraft) {\n switch (value.type) {\n case 'absolute': {\n return {\n type: 'absolute',\n money: value.money.map(createTypedMoney),\n } as CartDiscountValueAbsolute\n }\n case 'fixed': {\n return {\n type: 'fixed',\n money: value.money.map(createTypedMoney),\n } as CartDiscountValueFixed\n }\n case 'giftLineItem': {\n return {\n ...value,\n } as CartDiscountValueGiftLineItem\n }\n case 'relative': {\n return {\n ...value,\n } as CartDiscountValueRelative\n }\n }\n\n return value\n }\n\n actions: Partial<\n Record<\n CartDiscountUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<CartDiscount>,\n action: any\n ) => void\n >\n > = {\n setKey: (\n context: RepositoryContext,\n resource: Writable<CartDiscount>,\n { key }: CartDiscountSetKeyAction\n ) => {\n resource.key = key\n },\n setDescription: (\n context: RepositoryContext,\n resource: Writable<CartDiscount>,\n { description }: CartDiscountSetDescriptionAction\n ) => {\n resource.description = description\n },\n setValidFrom: (\n context: RepositoryContext,\n resource: Writable<CartDiscount>,\n { validFrom }: CartDiscountSetValidFromAction\n ) => {\n resource.validFrom = validFrom\n },\n setValidUntil: (\n context: RepositoryContext,\n resource: Writable<CartDiscount>,\n { validUntil }: CartDiscountSetValidUntilAction\n ) => {\n resource.validUntil = validUntil\n },\n setValidFromAndUntil: (\n context: RepositoryContext,\n resource: Writable<CartDiscount>,\n { validFrom, validUntil }: CartDiscountSetValidFromAndUntilAction\n ) => {\n resource.validFrom = validFrom\n resource.validUntil = validUntil\n },\n changeSortOrder: (\n context: RepositoryContext,\n resource: Writable<CartDiscount>,\n { sortOrder }: CartDiscountChangeSortOrderAction\n ) => {\n resource.sortOrder = sortOrder\n },\n changeIsActive: (\n context: RepositoryContext,\n resource: Writable<CartDiscount>,\n { isActive }: CartDiscountChangeIsActiveAction\n ) => {\n resource.isActive = isActive\n },\n }\n}\n","import { v4 as uuidv4 } from 'uuid'\nimport {\n Category,\n CategoryChangeAssetNameAction,\n CategoryChangeSlugAction,\n CategoryDraft,\n CategorySetAssetDescriptionAction,\n CategorySetAssetSourcesAction,\n CategorySetCustomFieldAction,\n CategorySetCustomTypeAction,\n CategorySetDescriptionAction,\n CategorySetKeyAction,\n CategorySetMetaDescriptionAction,\n CategorySetMetaKeywordsAction,\n CategorySetMetaTitleAction,\n ReferenceTypeId,\n} from '@commercetools/platform-sdk'\nimport { Writable } from 'types'\nimport { getBaseResourceProperties } from '../helpers'\nimport { createCustomFields } from './helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class CategoryRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'category'\n }\n\n create(context: RepositoryContext, draft: CategoryDraft): Category {\n const resource: Category = {\n ...getBaseResourceProperties(),\n key: draft.key,\n name: draft.name,\n slug: draft.slug,\n orderHint: draft.orderHint || '',\n externalId: draft.externalId || '',\n parent: draft.parent\n ? { typeId: 'category', id: draft.parent.id! }\n : undefined,\n ancestors: [], // TODO\n assets:\n draft.assets?.map((d) => ({\n id: uuidv4(),\n name: d.name,\n description: d.description,\n sources: d.sources,\n tags: d.tags,\n key: d.key,\n custom: createCustomFields(\n draft.custom,\n context.projectKey,\n this._storage\n ),\n })) || [],\n custom: createCustomFields(\n draft.custom,\n context.projectKey,\n this._storage\n ),\n }\n this.saveNew(context, resource)\n return resource\n }\n\n actions = {\n changeAssetName: (\n context: RepositoryContext,\n resource: Writable<Category>,\n { assetId, assetKey, name }: CategoryChangeAssetNameAction\n ) => {\n resource.assets?.forEach((asset) => {\n if (assetId && assetId === asset.id) {\n asset.name = name\n }\n if (assetKey && assetKey === asset.key) {\n asset.name = name\n }\n })\n },\n changeSlug: (\n context: RepositoryContext,\n resource: Writable<Category>,\n { slug }: CategoryChangeSlugAction\n ) => {\n resource.slug = slug\n },\n setKey: (\n context: RepositoryContext,\n resource: Writable<Category>,\n { key }: CategorySetKeyAction\n ) => {\n resource.key = key\n },\n setAssetDescription: (\n context: RepositoryContext,\n resource: Writable<Category>,\n { assetId, assetKey, description }: CategorySetAssetDescriptionAction\n ) => {\n resource.assets?.forEach((asset) => {\n if (assetId && assetId === asset.id) {\n asset.description = description\n }\n if (assetKey && assetKey === asset.key) {\n asset.description = description\n }\n })\n },\n setAssetSources: (\n context: RepositoryContext,\n resource: Writable<Category>,\n { assetId, assetKey, sources }: CategorySetAssetSourcesAction\n ) => {\n resource.assets?.forEach((asset) => {\n if (assetId && assetId === asset.id) {\n asset.sources = sources\n }\n if (assetKey && assetKey === asset.key) {\n asset.sources = sources\n }\n })\n },\n setDescription: (\n context: RepositoryContext,\n resource: Writable<Category>,\n { description }: CategorySetDescriptionAction\n ) => {\n resource.description = description\n },\n setMetaDescription: (\n context: RepositoryContext,\n resource: Writable<Category>,\n { metaDescription }: CategorySetMetaDescriptionAction\n ) => {\n resource.metaDescription = metaDescription\n },\n setMetaKeywords: (\n context: RepositoryContext,\n resource: Writable<Category>,\n { metaKeywords }: CategorySetMetaKeywordsAction\n ) => {\n resource.metaKeywords = metaKeywords\n },\n setMetaTitle: (\n context: RepositoryContext,\n resource: Writable<Category>,\n { metaTitle }: CategorySetMetaTitleAction\n ) => {\n resource.metaTitle = metaTitle\n },\n setCustomType: (\n context: RepositoryContext,\n resource: Writable<Category>,\n { type, fields }: CategorySetCustomTypeAction\n ) => {\n if (type) {\n resource.custom = createCustomFields(\n { type, fields },\n context.projectKey,\n this._storage\n )\n } else {\n resource.custom = undefined\n }\n },\n setCustomField: (\n context: RepositoryContext,\n resource: Writable<Category>,\n { name, value }: CategorySetCustomFieldAction\n ) => {\n if (!resource.custom) {\n return\n }\n if (value === null) {\n delete resource.custom.fields[name]\n } else {\n resource.custom.fields[name] = value\n }\n },\n }\n}\n","import {\n Channel,\n ChannelChangeDescriptionAction,\n ChannelChangeKeyAction,\n ChannelChangeNameAction,\n ChannelDraft,\n ChannelSetAddressAction,\n ChannelSetCustomFieldAction,\n ChannelSetCustomTypeAction,\n ChannelSetGeoLocationAction,\n ChannelUpdateAction,\n ReferenceTypeId,\n} from '@commercetools/platform-sdk'\nimport { Writable } from 'types'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { createAddress, createCustomFields } from './helpers'\n\nexport class ChannelRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'channel'\n }\n\n create(context: RepositoryContext, draft: ChannelDraft): Channel {\n const resource: Channel = {\n ...getBaseResourceProperties(),\n key: draft.key,\n name: draft.name,\n description: draft.description,\n roles: draft.roles || [],\n geoLocation: draft.geoLocation,\n address: createAddress(draft.address, context.projectKey, this._storage),\n custom: createCustomFields(\n draft.custom,\n context.projectKey,\n this._storage\n ),\n }\n this.saveNew(context, resource)\n return resource\n }\n\n actions: Partial<\n Record<\n ChannelUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<Channel>,\n action: any\n ) => void\n >\n > = {\n changeKey: (\n context: RepositoryContext,\n resource: Writable<Channel>,\n { key }: ChannelChangeKeyAction\n ) => {\n resource.key = key\n },\n\n changeName: (\n context: RepositoryContext,\n resource: Writable<Channel>,\n { name }: ChannelChangeNameAction\n ) => {\n resource.name = name\n },\n\n changeDescription: (\n context: RepositoryContext,\n resource: Writable<Channel>,\n { description }: ChannelChangeDescriptionAction\n ) => {\n resource.description = description\n },\n\n setAddress: (\n context: RepositoryContext,\n resource: Writable<Channel>,\n { address }: ChannelSetAddressAction\n ) => {\n resource.address = createAddress(\n address,\n context.projectKey,\n this._storage\n )\n },\n\n setGeoLocation: (\n context: RepositoryContext,\n resource: Writable<Channel>,\n { geoLocation }: ChannelSetGeoLocationAction\n ) => {\n resource.geoLocation = geoLocation\n },\n\n setCustomType: (\n context: RepositoryContext,\n resource: Writable<Channel>,\n { type, fields }: ChannelSetCustomTypeAction\n ) => {\n if (type) {\n resource.custom = createCustomFields(\n { type, fields },\n context.projectKey,\n this._storage\n )\n } else {\n resource.custom = undefined\n }\n },\n setCustomField: (\n context: RepositoryContext,\n resource: Writable<Channel>,\n { name, value }: ChannelSetCustomFieldAction\n ) => {\n if (!resource.custom) {\n return\n }\n if (value === null) {\n delete resource.custom.fields[name]\n } else {\n resource.custom.fields[name] = value\n }\n },\n }\n}\n","import {\n CustomObject,\n CustomObjectDraft,\n InvalidOperationError,\n ReferenceTypeId,\n} from '@commercetools/platform-sdk'\nimport { checkConcurrentModification } from './errors'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { Writable } from '../types'\nimport { cloneObject, getBaseResourceProperties } from '../helpers'\nimport { CommercetoolsError } from '../exceptions'\n\nexport class CustomObjectRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'key-value-document'\n }\n\n create(\n context: RepositoryContext,\n draft: Writable<CustomObjectDraft>\n ): CustomObject {\n const current = this.getWithContainerAndKey(\n context,\n draft.container,\n draft.key\n ) as Writable<CustomObject | undefined>\n\n if (current) {\n // Only check version if it is passed in the draft\n if (draft.version) {\n checkConcurrentModification(current.version, draft.version, current.id)\n } else {\n draft.version = current.version\n }\n\n if (draft.value !== current.value) {\n const updated = cloneObject(current)\n updated.value = draft.value\n updated.version += 1\n this.saveUpdate(context, draft.version, updated)\n return updated\n }\n return current\n } else {\n // If the resource is new the only valid version is 0\n if (draft.version) {\n throw new CommercetoolsError<InvalidOperationError>(\n {\n code: 'InvalidOperation',\n message: 'version on create must be 0',\n },\n 400\n )\n }\n const baseProperties = getBaseResourceProperties()\n const resource: CustomObject = {\n ...baseProperties,\n container: draft.container,\n key: draft.key,\n value: draft.value,\n }\n\n this.saveNew(context, resource)\n return resource\n }\n }\n\n getWithContainerAndKey(\n context: RepositoryContext,\n container: string,\n key: string\n ) {\n const items = this._storage.all(\n context.projectKey,\n this.getTypeId()\n ) as Array<CustomObject>\n return items.find(\n (item) => item.container === container && item.key === key\n )\n }\n}\n","import {\n Customer,\n CustomerChangeEmailAction,\n CustomerDraft,\n CustomerSetAuthenticationModeAction,\n InvalidInputError,\n InvalidJsonInputError,\n ReferenceTypeId,\n} from '@commercetools/platform-sdk'\nimport { Writable } from 'types'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { CommercetoolsError } from '../exceptions'\n\nexport class CustomerRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'customer'\n }\n\n create(context: RepositoryContext, draft: CustomerDraft): Customer {\n const resource: Customer = {\n ...getBaseResourceProperties(),\n email: draft.email,\n password: draft.password\n ? Buffer.from(draft.password).toString('base64')\n : undefined,\n isEmailVerified: draft.isEmailVerified || false,\n addresses: [],\n }\n this.saveNew(context, resource)\n return resource\n }\n\n getMe(context: RepositoryContext): Customer | undefined {\n const results = this._storage.query(\n context.projectKey,\n this.getTypeId(),\n {}\n ) // grab the first customer you can find\n if (results.count > 0) {\n return results.results[0] as Customer\n }\n\n return\n }\n\n actions = {\n changeEmail: (\n _context: RepositoryContext,\n resource: Writable<Customer>,\n { email }: CustomerChangeEmailAction\n ) => {\n resource.email = email\n },\n setAuthenticationMode: (\n _context: RepositoryContext,\n resource: Writable<Customer>,\n { authMode, password }: CustomerSetAuthenticationModeAction\n ) => {\n if (resource.authenticationMode === authMode) {\n throw new CommercetoolsError<InvalidInputError>(\n {\n code: 'InvalidInput',\n message: `The customer is already using the '${resource.authenticationMode}' authentication mode.`,\n },\n 400\n )\n }\n resource.authenticationMode = authMode\n if (authMode === 'ExternalAuth') {\n delete resource.password\n return\n }\n if (authMode === 'Password') {\n resource.password = password\n ? Buffer.from(password).toString('base64')\n : undefined\n return\n }\n throw new CommercetoolsError<InvalidJsonInputError>(\n {\n code: 'InvalidJsonInput',\n message: 'Request body does not contain valid JSON.',\n detailedErrorMessage: `actions -> authMode: Invalid enum value: '${authMode}'. Expected one of: 'Password','ExternalAuth'`,\n },\n 400\n )\n },\n }\n}\n","import {\n CustomerGroup,\n CustomerGroupChangeNameAction,\n CustomerGroupDraft,\n CustomerGroupSetCustomFieldAction,\n CustomerGroupSetCustomTypeAction,\n CustomerGroupSetKeyAction,\n ReferenceTypeId,\n} from '@commercetools/platform-sdk'\nimport { Writable } from 'types'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { createCustomFields } from './helpers'\n\nexport class CustomerGroupRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'customer'\n }\n create(context: RepositoryContext, draft: CustomerGroupDraft): CustomerGroup {\n const resource: CustomerGroup = {\n ...getBaseResourceProperties(),\n key: draft.key,\n name: draft.groupName,\n custom: createCustomFields(\n draft.custom,\n context.projectKey,\n this._storage\n ),\n }\n this.saveNew(context, resource)\n return resource\n }\n\n actions = {\n setKey: (\n context: RepositoryContext,\n resource: Writable<CustomerGroup>,\n { key }: CustomerGroupSetKeyAction\n ) => {\n resource.key = key\n },\n changeName: (\n context: RepositoryContext,\n resource: Writable<CustomerGroup>,\n { name }: CustomerGroupChangeNameAction\n ) => {\n resource.name = name\n },\n setCustomType: (\n context: RepositoryContext,\n resource: Writable<CustomerGroup>,\n { type, fields }: CustomerGroupSetCustomTypeAction\n ) => {\n if (type) {\n resource.custom = createCustomFields(\n { type, fields },\n context.projectKey,\n this._storage\n )\n } else {\n resource.custom = undefined\n }\n },\n setCustomField: (\n context: RepositoryContext,\n resource: Writable<CustomerGroup>,\n { name, value }: CustomerGroupSetCustomFieldAction\n ) => {\n if (!resource.custom) {\n return\n }\n if (value === null) {\n delete resource.custom.fields[name]\n } else {\n resource.custom.fields[name] = value\n }\n },\n }\n}\n","import {\n CartDiscountReference,\n DiscountCode,\n DiscountCodeChangeCartDiscountsAction,\n DiscountCodeChangeIsActiveAction,\n DiscountCodeDraft,\n DiscountCodeSetCartPredicateAction,\n DiscountCodeSetCustomFieldAction,\n DiscountCodeSetCustomTypeAction,\n DiscountCodeSetDescriptionAction,\n DiscountCodeSetMaxApplicationsAction,\n DiscountCodeSetMaxApplicationsPerCustomerAction,\n DiscountCodeSetNameAction,\n DiscountCodeSetValidFromAction,\n DiscountCodeSetValidFromAndUntilAction,\n DiscountCodeSetValidUntilAction,\n DiscountCodeUpdateAction,\n ReferenceTypeId,\n} from '@commercetools/platform-sdk'\nimport { Writable } from 'types'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { createCustomFields } from './helpers'\n\nexport class DiscountCodeRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'cart-discount'\n }\n\n create(context: RepositoryContext, draft: DiscountCodeDraft): DiscountCode {\n const resource: DiscountCode = {\n ...getBaseResourceProperties(),\n applicationVersion: 1,\n cartDiscounts: draft.cartDiscounts.map(\n (obj): CartDiscountReference => ({\n typeId: 'cart-discount',\n id: obj.id!,\n })\n ),\n cartPredicate: draft.cartPredicate,\n code: draft.code,\n description: draft.description,\n groups: draft.groups || [],\n isActive: draft.isActive || true,\n name: draft.name,\n references: [],\n validFrom: draft.validFrom,\n validUntil: draft.validUntil,\n maxApplications: draft.maxApplications,\n maxApplicationsPerCustomer: draft.maxApplicationsPerCustomer,\n custom: createCustomFields(\n draft.custom,\n context.projectKey,\n this._storage\n ),\n }\n this.saveNew(context, resource)\n return resource\n }\n\n actions: Partial<\n Record<\n DiscountCodeUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<DiscountCode>,\n action: any\n ) => void\n >\n > = {\n changeIsActive: (\n context: RepositoryContext,\n resource: Writable<DiscountCode>,\n { isActive }: DiscountCodeChangeIsActiveAction\n ) => {\n resource.isActive = isActive\n },\n changeCartDiscounts: (\n context: RepositoryContext,\n resource: Writable<DiscountCode>,\n { cartDiscounts }: DiscountCodeChangeCartDiscountsAction\n ) => {\n resource.cartDiscounts = cartDiscounts.map(\n (obj): CartDiscountReference => ({\n typeId: 'cart-discount',\n id: obj.id!,\n })\n )\n },\n setDescription: (\n context: RepositoryContext,\n resource: Writable<DiscountCode>,\n { description }: DiscountCodeSetDescriptionAction\n ) => {\n resource.description = description\n },\n setCartPredicate: (\n context: RepositoryContext,\n resource: Writable<DiscountCode>,\n { cartPredicate }: DiscountCodeSetCartPredicateAction\n ) => {\n resource.cartPredicate = cartPredicate\n },\n setName: (\n context: RepositoryContext,\n resource: Writable<DiscountCode>,\n { name }: DiscountCodeSetNameAction\n ) => {\n resource.name = name\n },\n setMaxApplications: (\n context: RepositoryContext,\n resource: Writable<DiscountCode>,\n { maxApplications }: DiscountCodeSetMaxApplicationsAction\n ) => {\n resource.maxApplications = maxApplications\n },\n setMaxApplicationsPerCustomer: (\n context: RepositoryContext,\n resource: Writable<DiscountCode>,\n {\n maxApplicationsPerCustomer,\n }: DiscountCodeSetMaxApplicationsPerCustomerAction\n ) => {\n resource.maxApplicationsPerCustomer = maxApplicationsPerCustomer\n },\n setValidFrom: (\n context: RepositoryContext,\n resource: Writable<DiscountCode>,\n { validFrom }: DiscountCodeSetValidFromAction\n ) => {\n resource.validFrom = validFrom\n },\n setValidUntil: (\n context: RepositoryContext,\n resource: Writable<DiscountCode>,\n { validUntil }: DiscountCodeSetValidUntilAction\n ) => {\n resource.validUntil = validUntil\n },\n setValidFromAndUntil: (\n context: RepositoryContext,\n resource: Writable<DiscountCode>,\n { validFrom, validUntil }: DiscountCodeSetValidFromAndUntilAction\n ) => {\n resource.validFrom = validFrom\n resource.validUntil = validUntil\n },\n setCustomType: (\n context: RepositoryContext,\n resource: Writable<DiscountCode>,\n { type, fields }: DiscountCodeSetCustomTypeAction\n ) => {\n if (type) {\n resource.custom = createCustomFields(\n { type, fields },\n context.projectKey,\n this._storage\n )\n } else {\n resource.custom = undefined\n }\n },\n setCustomField: (\n context: RepositoryContext,\n resource: Writable<DiscountCode>,\n { name, value }: DiscountCodeSetCustomFieldAction\n ) => {\n if (!resource.custom) {\n return\n }\n if (value === null) {\n delete resource.custom.fields[name]\n } else {\n resource.custom.fields[name] = value\n }\n },\n }\n}\n","import { cloneObject } from '../helpers'\n\nexport const maskSecretValue = <T>(resource: T, path: string): T => {\n const parts = path.split('.')\n const clone = cloneObject(resource) as any\n let val = clone\n\n const target = parts.pop()\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]\n val = val[part]\n\n if (val === undefined) {\n return resource\n }\n }\n\n if (val && target && val[target]) {\n val[target] = '****'\n }\n return clone\n}\n","import {\n Extension,\n ExtensionChangeDestinationAction,\n ExtensionChangeTriggersAction,\n ExtensionDraft,\n ExtensionSetKeyAction,\n ExtensionSetTimeoutInMsAction,\n ExtensionUpdateAction,\n ReferenceTypeId,\n} from '@commercetools/platform-sdk'\nimport { Resource, Writable } from '../types'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { maskSecretValue } from '../lib/masking'\n\nexport class ExtensionRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'extension'\n }\n\n postProcessResource<T extends Resource>(resource: T): T {\n if (resource) {\n const extension = resource as Extension\n if (\n extension.destination.type === 'HTTP' &&\n extension.destination.authentication?.type === 'AuthorizationHeader'\n ) {\n return maskSecretValue(\n extension,\n 'destination.authentication.headerValue'\n ) as T\n } else if (extension.destination.type == 'AWSLambda') {\n return maskSecretValue(resource, 'destination.accessSecret')\n }\n }\n return resource\n }\n\n create(context: RepositoryContext, draft: ExtensionDraft): Extension {\n const resource: Extension = {\n ...getBaseResourceProperties(),\n key: draft.key,\n timeoutInMs: draft.timeoutInMs,\n destination: draft.destination,\n triggers: draft.triggers,\n }\n this.saveNew(context, resource)\n return resource\n }\n\n actions: Record<\n ExtensionUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<Extension>,\n action: any\n ) => void\n > = {\n setKey: (\n context: RepositoryContext,\n resource: Writable<Extension>,\n { key }: ExtensionSetKeyAction\n ) => {\n resource.key = key\n },\n setTimeoutInMs: (\n context: RepositoryContext,\n resource: Writable<Extension>,\n { timeoutInMs }: ExtensionSetTimeoutInMsAction\n ) => {\n resource.timeoutInMs = timeoutInMs\n },\n changeTriggers: (\n context: RepositoryContext,\n resource: Writable<Extension>,\n { triggers }: ExtensionChangeTriggersAction\n ) => {\n resource.triggers = triggers\n },\n changeDestination: (\n context: RepositoryContext,\n resource: Writable<Extension>,\n { destination }: ExtensionChangeDestinationAction\n ) => {\n resource.destination = destination\n },\n }\n}\n","import {\n InventoryEntry,\n InventoryEntryChangeQuantityAction,\n InventoryEntryDraft,\n InventoryEntrySetCustomFieldAction,\n InventoryEntrySetCustomTypeAction,\n InventoryEntrySetExpectedDeliveryAction,\n InventoryEntrySetRestockableInDaysAction,\n ReferenceTypeId,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { createCustomFields } from './helpers'\nimport { Writable } from '../types'\n\nexport class InventoryEntryRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'inventory-entry'\n }\n\n create(\n context: RepositoryContext,\n draft: InventoryEntryDraft\n ): InventoryEntry {\n const resource: InventoryEntry = {\n ...getBaseResourceProperties(),\n sku: draft.sku,\n quantityOnStock: draft.quantityOnStock,\n availableQuantity: draft.quantityOnStock,\n expectedDelivery: draft.expectedDelivery,\n restockableInDays: draft.restockableInDays,\n supplyChannel: {\n ...draft.supplyChannel,\n typeId: 'channel',\n id: draft.supplyChannel?.id ?? '',\n },\n custom: createCustomFields(\n draft.custom,\n context.projectKey,\n this._storage\n ),\n }\n this.saveNew(context, resource)\n return resource\n }\n\n actions = {\n changeQuantity: (\n context: RepositoryContext,\n resource: Writable<InventoryEntry>,\n { quantity }: InventoryEntryChangeQuantityAction\n ) => {\n resource.quantityOnStock = quantity\n // don't know active reservations so just set to same value\n resource.availableQuantity = quantity\n },\n setExpectedDelivery: (\n context: RepositoryContext,\n resource: Writable<InventoryEntry>,\n { expectedDelivery }: InventoryEntrySetExpectedDeliveryAction\n ) => {\n resource.expectedDelivery = new Date(expectedDelivery!).toISOString()\n },\n setCustomField: (\n context: RepositoryContext,\n resource: InventoryEntry,\n { name, value }: InventoryEntrySetCustomFieldAction\n ) => {\n if (!resource.custom) {\n throw new Error('Resource has no custom field')\n }\n resource.custom.fields[name] = value\n },\n setCustomType: (\n context: RepositoryContext,\n resource: Writable<InventoryEntry>,\n { type, fields }: InventoryEntrySetCustomTypeAction\n ) => {\n if (!type) {\n resource.custom = undefined\n } else {\n const resolvedType = this._storage.getByResourceIdentifier(\n context.projectKey,\n type\n )\n if (!resolvedType) {\n throw new Error(`Type ${type} not found`)\n }\n\n resource.custom = {\n type: {\n typeId: 'type',\n id: resolvedType.id,\n },\n fields: fields || [],\n }\n }\n },\n setRestockableInDays: (\n context: RepositoryContext,\n resource: Writable<InventoryEntry>,\n { restockableInDays }: InventoryEntrySetRestockableInDaysAction\n ) => {\n resource.restockableInDays = restockableInDays\n },\n }\n}\n","import assert from 'assert'\nimport {\n CartReference,\n MyOrderFromCartDraft,\n Order,\n} from '@commercetools/platform-sdk'\nimport { OrderRepository } from './order'\nimport { RepositoryContext } from './abstract'\n\nexport class MyOrderRepository extends OrderRepository {\n create(context: RepositoryContext, draft: MyOrderFromCartDraft): Order {\n assert(draft.id, 'draft.id is missing')\n const cartIdentifier = {\n id: draft.id,\n typeId: 'cart',\n } as CartReference\n return this.createFromCart(context, cartIdentifier)\n }\n}\n","import assert from 'assert'\nimport {\n Cart,\n CartReference,\n CustomLineItem,\n CustomLineItemDraft,\n GeneralError,\n LineItem,\n LineItemImportDraft,\n Order,\n OrderAddPaymentAction,\n OrderChangeOrderStateAction,\n OrderChangePaymentStateAction,\n OrderFromCartDraft,\n OrderImportDraft,\n OrderSetBillingAddressAction,\n OrderSetCustomerEmailAction,\n OrderSetCustomFieldAction,\n OrderSetCustomTypeAction,\n OrderSetLocaleAction,\n OrderSetOrderNumberAction,\n OrderSetShippingAddressAction,\n OrderSetStoreAction,\n OrderTransitionStateAction,\n Product,\n ProductPagedQueryResponse,\n ProductVariant,\n ReferenceTypeId,\n State,\n Store,\n} from '@commercetools/platform-sdk'\nimport {\n AbstractResourceRepository,\n QueryParams,\n RepositoryContext,\n} from './abstract'\nimport {\n createCustomFields,\n createPrice,\n createTypedMoney,\n resolveStoreReference,\n} from './helpers'\nimport { Writable } from '../types'\nimport { getBaseResourceProperties } from '../helpers'\nimport { CommercetoolsError } from '../exceptions'\n\nexport class OrderRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'order'\n }\n\n create(context: RepositoryContext, draft: OrderFromCartDraft): Order {\n assert(draft.cart, 'draft.cart is missing')\n return this.createFromCart(\n context,\n {\n id: draft.cart.id!,\n typeId: 'cart',\n },\n draft.orderNumber\n )\n }\n\n createFromCart(\n context: RepositoryContext,\n cartReference: CartReference,\n orderNumber?: string\n ) {\n const cart = this._storage.getByResourceIdentifier(\n context.projectKey,\n cartReference\n ) as Cart | null\n if (!cart) {\n throw new Error('Cannot find cart')\n }\n\n const resource: Order = {\n ...getBaseResourceProperties(),\n orderNumber,\n cart: cartReference,\n orderState: 'Open',\n lineItems: [],\n customLineItems: [],\n totalPrice: cart.totalPrice,\n refusedGifts: [],\n origin: 'Customer',\n syncInfo: [],\n store: context.storeKey\n ? {\n key: context.storeKey,\n typeId: 'store',\n }\n : undefined,\n lastMessageSequenceNumber: 0,\n }\n this.saveNew(context, resource)\n return resource\n }\n\n import(context: RepositoryContext, draft: OrderImportDraft): Order {\n // TODO: Check if order with given orderNumber already exists\n assert(this, 'OrderRepository not valid')\n const resource: Order = {\n ...getBaseResourceProperties(),\n\n billingAddress: draft.billingAddress,\n shippingAddress: draft.shippingAddress,\n\n custom: createCustomFields(\n draft.custom,\n context.projectKey,\n this._storage\n ),\n customerEmail: draft.customerEmail,\n lastMessageSequenceNumber: 0,\n orderNumber: draft.orderNumber,\n orderState: draft.orderState || 'Open',\n origin: draft.origin || 'Customer',\n paymentState: draft.paymentState,\n refusedGifts: [],\n store: resolveStoreReference(\n draft.store,\n context.projectKey,\n this._storage\n ),\n syncInfo: [],\n\n lineItems:\n draft.lineItems?.map((item) =>\n this.lineItemFromImportDraft.bind(this)(context, item)\n ) || [],\n customLineItems:\n draft.customLineItems?.map((item) =>\n this.customLineItemFromImportDraft.bind(this)(context, item)\n ) || [],\n\n totalPrice: {\n type: 'centPrecision',\n ...draft.totalPrice,\n fractionDigits: 2,\n },\n }\n this.saveNew(context, resource)\n return resource\n }\n\n private lineItemFromImportDraft(\n context: RepositoryContext,\n draft: LineItemImportDraft\n ): LineItem {\n let product: Product\n let variant: ProductVariant | undefined\n\n if (draft.variant.sku) {\n variant = {\n id: 0,\n sku: draft.variant.sku,\n }\n\n const items = this._storage.query(context.projectKey, 'product', {\n where: [\n `masterData(current(masterVariant(sku=\"${draft.variant.sku}\"))) or masterData(current(variants(sku=\"${draft.variant.sku}\")))`,\n ],\n }) as ProductPagedQueryResponse\n\n if (items.count !== 1) {\n throw new CommercetoolsError<GeneralError>({\n code: 'General',\n message: `A product containing a variant with SKU '${draft.variant.sku}' not found.`,\n })\n }\n\n product = items.results[0]\n if (product.masterData.current.masterVariant.sku === draft.variant.sku) {\n variant = product.masterData.current.masterVariant\n } else {\n variant = product.masterData.current.variants.find(\n (v) => v.sku === draft.variant.sku\n )\n }\n if (!variant) {\n throw new Error('Internal state error')\n }\n } else {\n throw new Error('No product found')\n }\n\n const lineItem: LineItem = {\n ...getBaseResourceProperties(),\n custom: createCustomFields(\n draft.custom,\n context.projectKey,\n this._storage\n ),\n discountedPricePerQuantity: [],\n lineItemMode: 'Standard',\n name: draft.name,\n price: createPrice(draft.price),\n priceMode: 'Platform',\n productId: product.id,\n productType: product.productType,\n quantity: draft.quantity,\n state: draft.state || [],\n taxRate: draft.taxRate,\n totalPrice: createTypedMoney(draft.price.value),\n variant: {\n id: variant.id,\n sku: variant.sku,\n price: createPrice(draft.price),\n },\n }\n\n return lineItem\n }\n\n private customLineItemFromImportDraft(\n context: RepositoryContext,\n draft: CustomLineItemDraft\n ): CustomLineItem {\n const lineItem: CustomLineItem = {\n ...getBaseResourceProperties(),\n custom: createCustomFields(\n draft.custom,\n context.projectKey,\n this._storage\n ),\n discountedPricePerQuantity: [],\n money: createTypedMoney(draft.money),\n name: draft.name,\n quantity: draft.quantity,\n slug: draft.slug,\n state: [],\n totalPrice: createTypedMoney(draft.money),\n }\n\n return lineItem\n }\n\n getWithOrderNumber(\n context: RepositoryContext,\n orderNumber: string,\n params: QueryParams = {}\n ): Order | undefined {\n const result = this._storage.query(context.projectKey, this.getTypeId(), {\n ...params,\n where: [`orderNumber=\"${orderNumber}\"`],\n })\n if (result.count === 1) {\n return result.results[0] as Order\n }\n\n // Catch this for now, should be checked when creating/updating\n if (result.count > 1) {\n throw new Error('Duplicate order numbers')\n }\n\n return\n }\n\n actions = {\n addPayment: (\n context: RepositoryContext,\n resource: Writable<Order>,\n { payment }: OrderAddPaymentAction\n ) => {\n const resolvedPayment = this._storage.getByResourceIdentifier(\n context.projectKey,\n payment\n )\n if (!resolvedPayment) {\n throw new Error(`Payment ${payment.id} not found`)\n }\n\n if (!resource.paymentInfo) {\n resource.paymentInfo = {\n payments: [],\n }\n }\n\n resource.paymentInfo.payments.push({\n typeId: 'payment',\n id: payment.id!,\n })\n },\n changeOrderState: (\n context: RepositoryContext,\n resource: Writable<Order>,\n { orderState }: OrderChangeOrderStateAction\n ) => {\n resource.orderState = orderState\n },\n changePaymentState: (\n context: RepositoryContext,\n resource: Writable<Order>,\n { paymentState }: OrderChangePaymentStateAction\n ) => {\n resource.paymentState = paymentState\n },\n transitionState: (\n context: RepositoryContext,\n resource: Writable<Order>,\n { state }: OrderTransitionStateAction\n ) => {\n const resolvedType = this._storage.getByResourceIdentifier(\n context.projectKey,\n state\n ) as State | null\n\n if (!resolvedType) {\n throw new Error(\n `No state found with key=${state.key} or id=${state.key}`\n )\n }\n\n resource.state = { typeId: 'state', id: resolvedType.id }\n },\n setBillingAddress: (\n context: RepositoryContext,\n resource: Writable<Order>,\n { address }: OrderSetBillingAddressAction\n ) => {\n resource.billingAddress = address\n },\n setCustomerEmail: (\n context: RepositoryContext,\n resource: Writable<Order>,\n { email }: OrderSetCustomerEmailAction\n ) => {\n resource.customerEmail = email\n },\n setCustomField: (\n context: RepositoryContext,\n resource: Order,\n { name, value }: OrderSetCustomFieldAction\n ) => {\n if (!resource.custom) {\n throw new Error('Resource has no custom field')\n }\n resource.custom.fields[name] = value\n },\n setCustomType: (\n context: RepositoryContext,\n resource: Writable<Order>,\n { type, fields }: OrderSetCustomTypeAction\n ) => {\n if (!type) {\n resource.custom = undefined\n } else {\n const resolvedType = this._storage.getByResourceIdentifier(\n context.projectKey,\n type\n )\n if (!resolvedType) {\n throw new Error(`Type ${type} not found`)\n }\n\n resource.custom = {\n type: {\n typeId: 'type',\n id: resolvedType.id,\n },\n fields: fields || [],\n }\n }\n },\n setLocale: (\n context: RepositoryContext,\n resource: Writable<Order>,\n { locale }: OrderSetLocaleAction\n ) => {\n resource.locale = locale\n },\n setOrderNumber: (\n context: RepositoryContext,\n resource: Writable<Order>,\n { orderNumber }: OrderSetOrderNumberAction\n ) => {\n resource.orderNumber = orderNumber\n },\n setShippingAddress: (\n context: RepositoryContext,\n resource: Writable<Order>,\n { address }: OrderSetShippingAddressAction\n ) => {\n resource.shippingAddress = address\n },\n setStore: (\n context: RepositoryContext,\n resource: Writable<Order>,\n { store }: OrderSetStoreAction\n ) => {\n if (!store) return\n const resolvedType = this._storage.getByResourceIdentifier(\n context.projectKey,\n store\n )\n if (!resolvedType) {\n throw new Error(`No store found with key=${store.key}`)\n }\n\n const storeReference = resolvedType as Store\n resource.store = {\n typeId: 'store',\n key: storeReference.key,\n }\n },\n }\n}\n","import {\n Payment,\n PaymentAddTransactionAction,\n PaymentChangeTransactionStateAction,\n PaymentDraft,\n PaymentSetCustomFieldAction,\n PaymentSetCustomTypeAction,\n PaymentTransitionStateAction,\n ReferenceTypeId,\n State,\n StateReference,\n Transaction,\n TransactionDraft,\n} from '@commercetools/platform-sdk'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport {\n createCustomFields,\n createTypedMoney,\n getReferenceFromResourceIdentifier,\n} from './helpers'\nimport { getBaseResourceProperties } from '../helpers'\nimport { v4 as uuidv4 } from 'uuid'\nimport { Writable } from '../types'\n\nexport class PaymentRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'payment'\n }\n\n create(context: RepositoryContext, draft: PaymentDraft): Payment {\n const resource: Payment = {\n ...getBaseResourceProperties(),\n amountPlanned: createTypedMoney(draft.amountPlanned),\n paymentMethodInfo: draft.paymentMethodInfo!,\n paymentStatus: draft.paymentStatus\n ? {\n ...draft.paymentStatus,\n state: draft.paymentStatus.state\n ? getReferenceFromResourceIdentifier<StateReference>(\n draft.paymentStatus.state,\n context.projectKey,\n this._storage\n )\n : undefined,\n }\n : {},\n transactions: (draft.transactions || []).map((t) =>\n this.transactionFromTransactionDraft(t, context)\n ),\n interfaceInteractions: (draft.interfaceInteractions || []).map(\n (interaction) =>\n createCustomFields(interaction, context.projectKey, this._storage)!\n ),\n custom: createCustomFields(\n draft.custom,\n context.projectKey,\n this._storage\n ),\n }\n\n this.saveNew(context, resource)\n return resource\n }\n\n transactionFromTransactionDraft = (\n draft: TransactionDraft,\n context: RepositoryContext\n ) => ({\n ...draft,\n id: uuidv4(),\n amount: createTypedMoney(draft.amount),\n custom: createCustomFields(draft.custom, context.projectKey, this._storage),\n })\n\n actions = {\n setCustomField: (\n context: RepositoryContext,\n resource: Payment,\n { name, value }: PaymentSetCustomFieldAction\n ) => {\n if (!resource.custom) {\n throw new Error('Resource has no custom field')\n }\n\n resource.custom.fields[name] = value\n },\n setCustomType: (\n context: RepositoryContext,\n resource: Writable<Payment>,\n { type, fields }: PaymentSetCustomTypeAction\n ) => {\n if (!type) {\n resource.custom = undefined\n } else {\n const resolvedType = this._storage.getByResourceIdentifier(\n context.projectKey,\n type\n )\n if (!resolvedType) {\n throw new Error(`Type ${type} not found`)\n }\n\n resource.custom = {\n type: {\n typeId: 'type',\n id: resolvedType.id,\n },\n fields: fields || [],\n }\n }\n },\n addTransaction: (\n context: RepositoryContext,\n resource: Writable<Payment>,\n { transaction }: PaymentAddTransactionAction\n ) => {\n resource.transactions = [\n ...resource.transactions,\n this.transactionFromTransactionDraft(transaction, context),\n ]\n },\n changeTransactionState: (\n _context: RepositoryContext,\n resource: Writable<Payment>,\n { transactionId, state }: PaymentChangeTransactionStateAction\n ) => {\n const index = resource.transactions.findIndex(\n (e: Transaction) => e.id === transactionId\n )\n const updatedTransaction: Transaction = {\n ...resource.transactions[index],\n state,\n }\n resource.transactions[index] = updatedTransaction\n },\n transitionState: (\n context: RepositoryContext,\n resource: Writable<Payment>,\n { state }: PaymentTransitionStateAction\n ) => {\n const stateObj = this._storage.getByResourceIdentifier(\n context.projectKey,\n state\n ) as State | null\n\n if (!stateObj) {\n throw new Error(`State ${state} not found`)\n }\n\n resource.paymentStatus.state = {\n typeId: 'state',\n id: stateObj.id,\n obj: stateObj,\n }\n },\n // addInterfaceInteraction: () => {},\n // changeAmountPlanned: () => {},\n // changeTransactionInteractionId: () => {},\n // changeTransactionTimestamp: () => {},\n // setAmountPaid: () => {},\n // setAmountRefunded: () => {},\n // setAnonymousId: () => {},\n // setAuthorization: () => {},\n // setCustomer: () => {},\n // setExternalId: () => {},\n // setInterfaceId: () => {},\n // setKey: () => {},\n // setMethodInfoInterface: () => {},\n // setMethodInfoMethod: () => {},\n // setMethodInfoName: () => {},\n // setStatusInterfaceCode: () => {},\n // setStatusInterfaceText: () => {},\n }\n}\n","import {\n Price,\n PriceDraft,\n Product,\n ProductData,\n ProductDraft,\n ProductPublishAction,\n ProductSetAttributeAction,\n ProductSetDescriptionAction,\n ProductSetKeyAction,\n ProductTypeReference,\n ProductUpdateAction,\n ProductVariant,\n ProductVariantDraft,\n ReferenceTypeId,\n} from '@commercetools/platform-sdk'\nimport { v4 as uuidv4 } from 'uuid'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { Writable } from '../types'\nimport { getReferenceFromResourceIdentifier } from './helpers'\nimport deepEqual from 'deep-equal'\n\nexport class ProductRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'product'\n }\n\n create(context: RepositoryContext, draft: ProductDraft): Product {\n if (!draft.masterVariant) {\n throw new Error('Missing master variant')\n }\n\n let productType: ProductTypeReference | undefined = undefined\n try {\n productType = getReferenceFromResourceIdentifier<ProductTypeReference>(\n draft.productType,\n context.projectKey,\n this._storage\n )\n } catch (err) {\n // For now accept missing product types (but warn)\n console.warn(\n `Error resolving product-type '${draft.productType.id}'. This will be throw an error in later releases.`\n )\n productType = {\n typeId: 'product-type',\n id: draft.productType.id || '',\n }\n }\n\n const productData: ProductData = {\n name: draft.name,\n slug: draft.slug,\n categories: [],\n masterVariant: variantFromDraft(1, draft.masterVariant),\n variants:\n draft.variants?.map((variant, index) =>\n variantFromDraft(index + 2, variant)\n ) ?? [],\n\n searchKeywords: draft.searchKeywords ?? {},\n }\n\n const resource: Product = {\n ...getBaseResourceProperties(),\n key: draft.key,\n productType: productType,\n masterData: {\n current: productData,\n staged: productData,\n hasStagedChanges: false,\n published: draft.publish ?? false,\n },\n }\n\n this.saveNew(context, resource)\n\n return resource\n }\n\n actions: Partial<\n Record<\n ProductUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<Product>,\n action: any\n ) => void\n >\n > = {\n publish: (\n context: RepositoryContext,\n resource: Writable<Product>,\n { scope }: ProductPublishAction\n ) => {\n resource.masterData.current = resource.masterData.staged\n resource.masterData.published = true\n checkForStagedChanges(resource)\n },\n unpublish: (\n context: RepositoryContext,\n resource: Writable<Product>,\n // { action }: ProductUnpublishAction\n ) => {\n resource.masterData.published = false\n checkForStagedChanges(resource)\n },\n setAttribute: (\n context: RepositoryContext,\n resource: Writable<Product>,\n { variantId, sku, name, value, staged }: ProductSetAttributeAction\n ) => {\n const setAttr = (data: Writable<ProductData>) => {\n const { variant, isMasterVariant, variantIndex } = getVariant(\n data,\n variantId,\n sku\n )\n if (!variant) {\n throw new Error(\n `Variant with id ${variantId} or sku ${sku} not found on product ${resource.id}`\n )\n }\n\n if (!variant.attributes) {\n variant.attributes = []\n }\n\n const existingAttr = variant.attributes.find(\n (attr) => attr.name === name\n )\n if (existingAttr) {\n existingAttr.value = value\n } else {\n variant.attributes.push({\n name,\n value,\n })\n }\n if (isMasterVariant) {\n data.masterVariant = variant\n } else {\n data.variants[variantIndex] = variant\n }\n }\n\n // If true, only the staged Attribute is set. If false, both current and\n // staged Attribute is set. Default is true\n const onlyStaged = staged !== undefined ? staged : true\n\n // Write the attribute to the staged data\n setAttr(resource.masterData.staged)\n\n // Also write to published data is isStaged = false\n // if isStaged is false we set the attribute on both the staged and\n // published data.\n if (!onlyStaged) {\n setAttr(resource.masterData.current)\n }\n checkForStagedChanges(resource)\n\n return resource\n },\n 'setDescription': (\n context: RepositoryContext,\n resource: Writable<Product>,\n { description, staged }: ProductSetDescriptionAction\n ) => {\n const onlyStaged = staged !== undefined ? staged : true\n\n resource.masterData.staged.description = description\n if (!onlyStaged) {\n resource.masterData.current.description = description\n }\n checkForStagedChanges(resource)\n return resource\n },\n 'setKey': (\n context: RepositoryContext,\n resource: Writable<Product>,\n { key }: ProductSetKeyAction\n ) => {\n resource.key = key\n return resource\n },\n // 'changeName': () => {},\n // 'changeSlug': () => {},\n // 'addVariant': () => {},\n // 'removeVariant': () => {},\n // 'changeMasterVariant': () => {},\n // 'addPrice': () => {},\n // 'setPrices': () => {},\n // 'changePrice': () => {},\n // 'removePrice': () => {},\n // 'setProductPriceCustomType': () => {},\n // 'setProductPriceCustomField': () => {},\n // 'setDiscountedPrice': () => {},\n // 'setAttributeInAllVariants': () => {},\n // 'addToCategory': () => {},\n // 'setCategoryOrderHint': () => {},\n // 'removeFromCategory': () => {},\n // 'setTaxCategory': () => {},\n // 'setSku': () => {},\n // 'setProductVariantKey': () => {},\n // 'addExternalImage': () => {},\n // 'moveImageToPosition': () => {},\n // 'removeImage': () => {},\n // 'setImageLabel': () => {},\n // 'addAsset': () => {},\n // 'removeAsset': () => {},\n // 'setAssetKey': () => {},\n // 'changeAssetOrder': () => {},\n // 'changeAssetName': () => {},\n // 'setAssetDescription': () => {},\n // 'setAssetTags': () => {},\n // 'setAssetSources': () => {},\n // 'setAssetCustomType': () => {},\n // 'setAssetCustomField': () => {},\n // 'setSearchKeywords': () => {},\n // 'setMetaTitle': () => {},\n // 'setMetaDescription': () => {},\n // 'setMetaKeywords': () => {},\n // 'revertStagedChanges': () => {},\n // 'revertStagedVariantChanges': () => {},\n // 'transitionState': () => {},\n }\n}\n\n// Check if the product still has staged data that is different from the\n// current data.\nconst checkForStagedChanges = (product: Writable<Product>) => {\n if (!product.masterData.staged) {\n product.masterData.staged = product.masterData.current\n }\n\n if (deepEqual(product.masterData.current, product.masterData.staged)) {\n product.masterData.hasStagedChanges = false\n } else {\n product.masterData.hasStagedChanges = true\n }\n}\n\ninterface VariantResult {\n variant: Writable<ProductVariant> | undefined\n isMasterVariant: boolean\n variantIndex: number\n}\n\nconst getVariant = (\n productData: ProductData,\n variantId?: number,\n sku?: string\n): VariantResult => {\n const variants = [productData.masterVariant, ...productData.variants]\n const foundVariant = variants.find((variant: ProductVariant) => {\n if (variantId) {\n return variant.id === variantId\n }\n if (sku) {\n return variant.sku === sku\n }\n return false\n })\n\n const isMasterVariant = foundVariant === productData.masterVariant\n return {\n variant: foundVariant,\n isMasterVariant,\n variantIndex:\n !isMasterVariant && foundVariant\n ? productData.variants.indexOf(foundVariant)\n : -1,\n }\n}\n\nconst variantFromDraft = (\n variantId: number,\n variant: ProductVariantDraft\n): ProductVariant => ({\n id: variantId,\n sku: variant?.sku,\n attributes: variant?.attributes ?? [],\n prices: variant?.prices?.map(priceFromDraft),\n assets: [],\n images: [],\n})\n\nconst priceFromDraft = (draft: PriceDraft): Price => ({\n id: uuidv4(),\n value: {\n currencyCode: draft.value.currencyCode,\n centAmount: draft.value.centAmount,\n fractionDigits: 2,\n type: 'centPrecision',\n },\n})\n","import {\n ProductDiscount,\n ProductDiscountChangeIsActiveAction,\n ProductDiscountChangeNameAction,\n ProductDiscountChangePredicateAction,\n ProductDiscountChangeSortOrderAction,\n ProductDiscountChangeValueAction,\n ProductDiscountDraft,\n ProductDiscountSetDescriptionAction,\n ProductDiscountSetKeyAction,\n ProductDiscountSetValidFromAction,\n ProductDiscountSetValidFromAndUntilAction,\n ProductDiscountSetValidUntilAction,\n ProductDiscountUpdateAction,\n ProductDiscountValue,\n ProductDiscountValueAbsolute,\n ProductDiscountValueDraft,\n ProductDiscountValueExternal,\n ProductDiscountValueRelative,\n ReferenceTypeId,\n} from '@commercetools/platform-sdk'\nimport { Writable } from 'types'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { createTypedMoney } from './helpers'\n\nexport class ProductDiscountRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'product-discount'\n }\n\n create(\n context: RepositoryContext,\n draft: ProductDiscountDraft\n ): ProductDiscount {\n const resource: ProductDiscount = {\n ...getBaseResourceProperties(),\n key: draft.key,\n name: draft.name,\n description: draft.description,\n value: this.transformValueDraft(draft.value),\n predicate: draft.predicate,\n sortOrder: draft.sortOrder,\n isActive: draft.isActive || false,\n validFrom: draft.validFrom,\n validUntil: draft.validUntil,\n references: [],\n }\n this.saveNew(context, resource)\n return resource\n }\n\n private transformValueDraft(\n value: ProductDiscountValueDraft\n ): ProductDiscountValue {\n switch (value.type) {\n case 'absolute': {\n return {\n type: 'absolute',\n money: value.money.map(createTypedMoney),\n } as ProductDiscountValueAbsolute\n }\n case 'external': {\n return {\n type: 'external',\n } as ProductDiscountValueExternal\n }\n case 'relative': {\n return {\n ...value,\n } as ProductDiscountValueRelative\n }\n }\n }\n\n getWithKey(\n context: RepositoryContext,\n key: string\n ): ProductDiscount | undefined {\n const result = this._storage.query(context.projectKey, this.getTypeId(), {\n where: [`key=\"${key}\"`],\n })\n if (result.count === 1) {\n return result.results[0] as ProductDiscount\n }\n\n // Catch this for now, should be checked when creating/updating\n if (result.count > 1) {\n throw new Error('Duplicate product discount key')\n }\n\n return\n }\n\n actions: Partial<\n Record<\n ProductDiscountUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<ProductDiscount>,\n action: any\n ) => void\n >\n > = {\n setKey: (\n context: RepositoryContext,\n resource: Writable<ProductDiscount>,\n { key }: ProductDiscountSetKeyAction\n ) => {\n resource.key = key\n },\n setDescription: (\n context: RepositoryContext,\n resource: Writable<ProductDiscount>,\n { description }: ProductDiscountSetDescriptionAction\n ) => {\n if (description && Object.keys(description).length > 0) {\n resource.description = description\n } else {\n resource.description = undefined\n }\n },\n changeName: (\n context: RepositoryContext,\n resource: Writable<ProductDiscount>,\n { name }: ProductDiscountChangeNameAction\n ) => {\n resource.name = name\n },\n changeValue: (\n context: RepositoryContext,\n resource: Writable<ProductDiscount>,\n { value }: ProductDiscountChangeValueAction\n ) => {\n resource.value = this.transformValueDraft(value)\n },\n changePredicate: (\n context: RepositoryContext,\n resource: Writable<ProductDiscount>,\n { predicate }: ProductDiscountChangePredicateAction\n ) => {\n resource.predicate = predicate\n },\n changeSortOrder: (\n context: RepositoryContext,\n resource: Writable<ProductDiscount>,\n { sortOrder }: ProductDiscountChangeSortOrderAction\n ) => {\n resource.sortOrder = sortOrder\n },\n changeIsActive: (\n context: RepositoryContext,\n resource: Writable<ProductDiscount>,\n { isActive }: ProductDiscountChangeIsActiveAction\n ) => {\n resource.isActive = isActive\n },\n setValidFrom: (\n context: RepositoryContext,\n resource: Writable<ProductDiscount>,\n { validFrom }: ProductDiscountSetValidFromAction\n ) => {\n resource.validFrom = validFrom\n },\n setValidUntil: (\n context: RepositoryContext,\n resource: Writable<ProductDiscount>,\n { validUntil }: ProductDiscountSetValidUntilAction\n ) => {\n resource.validUntil = validUntil\n },\n setValidFromAndUntil: (\n context: RepositoryContext,\n resource: Writable<ProductDiscount>,\n { validFrom, validUntil }: ProductDiscountSetValidFromAndUntilAction\n ) => {\n resource.validFrom = validFrom\n resource.validUntil = validUntil\n },\n }\n}\n","/**\n * This module implements the commercetools product projection filter expression.\n */\n\nimport { ProductProjection, ProductVariant } from '@commercetools/platform-sdk'\nimport perplex from 'perplex'\nimport Parser from 'pratt'\nimport { nestedLookup } from '../helpers'\nimport { Writable } from '../types'\n\ntype MatchFunc = (target: any) => boolean\n\ntype ProductProjectionFilter = (\n p: Writable<ProductProjection>,\n markMatchingVariants: boolean\n) => boolean\n\ntype TypeSymbol = {\n type: 'Symbol'\n kind: 'int' | 'string' | 'any'\n value: any\n}\n\ntype RangeExpressionSet = {\n source: string\n type: 'RangeExpression'\n children?: RangeExpression[]\n}\n\ntype FilterExpressionSet = {\n source: string\n type: 'FilterExpression'\n children?: FilterExpression[]\n}\n\ntype TermExpressionSet = {\n source: string\n type: 'TermExpression'\n}\n\ntype ExpressionSet =\n | RangeExpressionSet\n | FilterExpressionSet\n | TermExpressionSet\n\nexport type RangeExpression = {\n type: 'RangeExpression'\n start?: number\n stop?: number\n match: (obj: any) => boolean\n}\n\nexport type FilterExpression = {\n type: 'FilterExpression'\n match: (obj: any) => boolean\n}\n\n/**\n * Returns a function (ProductProjectionFilter).\n * NOTE: The filter can alter the resources in-place (FIXME)\n */\nexport const parseFilterExpression = (\n filter: string\n): ProductProjectionFilter => {\n const exprFunc = generateMatchFunc(filter)\n const [source] = filter.split(':', 1)\n\n if (source.startsWith('variants.')) {\n return filterVariants(source, exprFunc)\n }\n return filterProduct(source, exprFunc)\n}\n\nconst getLexer = (value: string) =>\n new perplex(value)\n .token('MISSING', /missing(?![-_a-z0-9]+)/i)\n .token('EXISTS', /exists(?![-_a-z0-9]+)/i)\n .token('RANGE', /range(?![-_a-z0-9]+)/i)\n .token('TO', /to(?![-_a-z0-9]+)/i)\n .token('IDENTIFIER', /[-_.a-z]+/i)\n\n .token('FLOAT', /\\d+\\.\\d+/)\n .token('INT', /\\d+/)\n .token('STRING', /\"((?:\\\\.|[^\"\\\\])*)\"/)\n .token('STRING', /'((?:\\\\.|[^'\\\\])*)'/)\n\n .token('COMMA', ',')\n .token('STAR', '*')\n .token('(', '(')\n .token(':', ':')\n .token(')', ')')\n .token('\"', '\"')\n .token('WS', /\\s+/, true) // skip\n\nconst parseFilter = (filter: string): ExpressionSet => {\n const lexer = getLexer(filter)\n const parser = new Parser(lexer)\n .builder()\n .nud('IDENTIFIER', 100, (t) => t.token.match)\n .led(':', 100, ({ left, bp }) => {\n const parsed: any = parser.parse({ terminals: [bp - 1] })\n const expressions: RangeExpression[] | FilterExpression[] | TypeSymbol[] = !Array.isArray(parsed) ? [parsed] : parsed\n\n // Make sure we only have one type of expression (cannot mix)\n const unique = new Set(expressions.map((expr) => expr.type))\n if (unique.size > 1) {\n throw new Error('Invalid expression')\n }\n\n // Convert plain symbols to a filter expression. For example\n // variants.attribute.foobar:4 where 4 is a Symbol should result\n // in a comparison\n if (expressions.some((expr) => expr.type == 'Symbol')) {\n return {\n source: left as string,\n type: 'FilterExpression',\n children: expressions.map((e): FilterExpression => {\n if (e.type != 'Symbol') {\n throw new Error('Invalid expression')\n }\n\n return {\n type: 'FilterExpression',\n match: (obj: any): boolean => obj === e.value,\n }\n }),\n }\n }\n\n return {\n source: left,\n type: expressions[0].type,\n children: expressions,\n }\n })\n .nud(\n 'STRING',\n 20,\n (t) =>\n ({\n type: 'Symbol',\n kind: 'string',\n // @ts-ignore\n value: t.token.groups[1],\n } as TypeSymbol)\n )\n .nud(\n 'INT',\n 5,\n (t) =>\n ({\n type: 'Symbol',\n kind: 'int',\n value: parseInt(t.token.match, 10),\n } as TypeSymbol)\n )\n .nud('STAR', 5, (_) => ({\n type: 'Symbol',\n kind: 'any',\n value: null,\n }))\n .nud(\n 'EXISTS',\n 10,\n ({ bp }) =>\n ({\n type: 'FilterExpression',\n match: (obj: any): boolean => obj !== undefined,\n } as FilterExpression)\n )\n .nud(\n 'MISSING',\n 10,\n ({ bp }) =>\n ({\n type: 'FilterExpression',\n match: (obj: any): boolean => obj === undefined,\n } as FilterExpression)\n )\n .led('COMMA', 200, ({ left, token, bp }) => {\n const expr: any = parser.parse({ terminals: [bp - 1] })\n if (Array.isArray(expr)) {\n return [left, ...expr]\n } else {\n return [left, expr]\n }\n })\n .nud('(', 100, (t) => {\n const expr: any = parser.parse({ terminals: [')'] })\n lexer.expect(')')\n return expr\n })\n .bp(')', 0)\n .led('TO', 20, ({ left, bp }) => {\n const expr: any = parser.parse({ terminals: [bp - 1] })\n return {\n start: left.value,\n stop: expr.value,\n }\n })\n .nud('RANGE', 20, ({ bp }) => {\n let ranges: any = parser.parse()\n\n // If multiple ranges are defined we receive an array of ranges. So let's\n // make sure we always have an array\n if (!Array.isArray(ranges)) {\n ranges = [ranges]\n }\n\n // Return a list of functions which matches the ranges. These functions\n // are processed as an OR clause\n return ranges.map((range: any) => {\n let func = undefined\n\n if (range.start !== null && range.stop !== null) {\n func = (obj: any): boolean => obj >= range.start && obj <= range.stop\n } else if (range.start === null && range.stop !== null) {\n func = (obj: any): boolean => obj <= range.stop\n } else if (range.start !== null && range.stop === null) {\n func = (obj: any): boolean => obj >= range.start\n } else {\n func = (obj: any): boolean => true\n }\n\n return {\n type: 'RangeExpression',\n start: range.start,\n stop: range.stop,\n match: func,\n } as RangeExpression\n })\n })\n .build()\n\n return parser.parse()\n}\n\nconst generateMatchFunc = (filter: string) => {\n const result = parseFilter(filter)\n if (!result) {\n // const lines = filter.split('\\n')\n // const column = lines[lines.length - 1].length\n throw new Error(`Syntax error while parsing '${filter}'.`)\n }\n if (result.type == 'TermExpression') {\n throw new Error(`Syntax error while parsing '${filter}'.`)\n }\n\n return (obj: any) => {\n if (!result.children) return false\n return result.children.some((c) => c.match(obj))\n }\n}\n\nexport const generateFacetFunc = (filter: string): ExpressionSet => {\n if (!filter.includes(':')) {\n return {\n source: filter,\n type: 'TermExpression',\n }\n }\n return parseFilter(filter)\n}\n\nconst filterProduct =\n (source: string, exprFunc: MatchFunc): ProductProjectionFilter =>\n (p: ProductProjection, markMatchingVariants: boolean): boolean => {\n const value = nestedLookup(p, source)\n return exprFunc(value)\n }\n\nconst filterVariants =\n (source: string, exprFunc: MatchFunc): ProductProjectionFilter =>\n (p: ProductProjection, markMatchingVariants: boolean): boolean => {\n const [, ...paths] = source.split('.')\n const path = paths.join('.')\n\n const variants = getVariants(p) as Writable<ProductVariant>[]\n for (const variant of variants) {\n const value = resolveVariantValue(variant, path)\n\n if (exprFunc(value)) {\n // If markMatchingVariants parameter is true those ProductVariants that\n // match the search query have the additional field isMatchingVariant\n // set to true. For the other variants in the same product projection\n // this field is set to false.\n if (markMatchingVariants) {\n variants.forEach((v) => (v.isMatchingVariant = false))\n variant.isMatchingVariant = true\n }\n return true\n }\n }\n\n return false\n }\n\nexport const resolveVariantValue = (obj: ProductVariant, path: string): any => {\n if (path === undefined) {\n return obj\n }\n if (path.startsWith('variants.')) {\n path = path.substring(path.indexOf('.') + 1)\n }\n\n if (path.startsWith('attributes.')) {\n const [, attrName, ...rest] = path.split('.')\n if (!obj.attributes) {\n return undefined\n }\n\n for (const attr of obj.attributes) {\n if (attr.name === attrName) {\n return nestedLookup(attr.value, rest.join('.'))\n }\n }\n }\n\n if (path === 'price.centAmount') {\n return obj.prices && obj.prices.length > 0\n ? obj.prices[0].value.centAmount\n : undefined\n }\n\n return nestedLookup(obj, path)\n}\n\nexport const getVariants = (p: ProductProjection): ProductVariant[] => [\n p.masterVariant,\n ...(p.variants ?? []),\n]\n","import {\n InvalidInputError,\n Price,\n ProductProjection,\n ProductVariant,\n} from '@commercetools/platform-sdk'\nimport { CommercetoolsError } from './exceptions'\nimport { Writable } from './types'\n\nexport type PriceSelector = {\n currency?: string\n country?: string\n customerGroup?: string\n channel?: string\n}\n\n/**\n * Apply the price selector on all the variants. The price selector is applied\n * on all the prices per variant and the first match per variant is stored in\n * the scopedPrice attribute\n */\nexport const applyPriceSelector = (\n products: ProductProjection[],\n selector: PriceSelector\n) => {\n validatePriceSelector(selector)\n\n for (const product of products) {\n const variants: Writable<ProductVariant>[] = [\n product.masterVariant,\n ...(product.variants ?? []),\n ].filter((x) => x != undefined)\n\n for (const variant of variants) {\n const scopedPrices =\n variant.prices?.filter((p) => priceSelectorFilter(p, selector)) ?? []\n\n if (scopedPrices.length > 0) {\n const price = scopedPrices[0]\n\n variant.scopedPriceDiscounted = false\n variant.scopedPrice = {\n ...price,\n currentValue: price.value,\n }\n }\n }\n }\n}\n\nconst validatePriceSelector = (selector: PriceSelector) => {\n if (\n (selector.country || selector.channel || selector.customerGroup) &&\n !selector.currency\n ) {\n throw new CommercetoolsError<InvalidInputError>(\n {\n code: 'InvalidInput',\n message:\n 'The price selecting parameters country, channel and customerGroup ' +\n 'cannot be used without the currency.',\n },\n 400\n )\n }\n}\n\n/**\n * Return a boolean to indicate if the price matches the selector. Price\n * selection requires that if the selector or the price has a specific value\n * then it should match.\n */\nexport const priceSelectorFilter = (\n price: Price,\n selector: PriceSelector\n): boolean => {\n if (\n (selector.country || price.country) &&\n selector.country !== price.country\n ) {\n return false\n }\n\n if (\n (selector.currency || price.value.currencyCode) &&\n selector.currency !== price.value.currencyCode\n ) {\n return false\n }\n\n if (\n (selector.channel || price.channel?.id) &&\n selector.channel !== price.channel?.id\n ) {\n return false\n }\n\n if (\n (selector.customerGroup || price.customerGroup?.id) &&\n selector.customerGroup !== price.customerGroup?.id\n ) {\n return false\n }\n\n return true\n}\n","import {\n InvalidInputError,\n ProductProjectionPagedSearchResponse,\n Product,\n ProductProjection,\n QueryParam,\n FacetResults,\n TermFacetResult,\n RangeFacetResult,\n FilteredFacetResult,\n} from '@commercetools/platform-sdk'\nimport { nestedLookup } from './helpers'\nimport { Writable } from './types'\nimport { CommercetoolsError } from './exceptions'\nimport {\n FilterExpression,\n generateFacetFunc,\n getVariants,\n parseFilterExpression,\n RangeExpression,\n resolveVariantValue,\n} from './lib/projectionSearchFilter'\nimport { applyPriceSelector } from './priceSelector'\nimport { AbstractStorage } from './storage'\n\nexport type ProductProjectionSearchParams = {\n fuzzy?: boolean\n fuzzyLevel?: number\n markMatchingVariants?: boolean\n staged?: boolean\n filter?: string[]\n 'filter.facets'?: string[]\n 'filter.query'?: string[]\n facet?: string | string[]\n sort?: string | string[]\n limit?: number\n offset?: number\n withTotal?: boolean\n priceCurrency?: string\n priceCountry?: string\n priceCustomerGroup?: string\n priceChannel?: string\n localeProjection?: string\n storeProjection?: string\n expand?: string | string[]\n [key: string]: QueryParam\n}\n\nexport class ProductProjectionSearch {\n protected _storage: AbstractStorage\n\n constructor(storage: AbstractStorage) {\n this._storage = storage\n }\n\n search(\n projectKey: string,\n params: ProductProjectionSearchParams\n ): ProductProjectionPagedSearchResponse {\n let resources = this._storage\n .all(projectKey, 'product')\n .map((r) => this.transform(r, params.staged ?? false))\n .filter((p): p is ProductProjection => p !== null)\n .filter((p) => {\n if (!params.staged ?? false) {\n return p.published\n }\n return true\n })\n\n const markMatchingVariant = params.markMatchingVariants ?? false\n\n // Apply the priceSelector\n applyPriceSelector(resources, {\n country: params.priceCountry,\n channel: params.priceChannel,\n customerGroup: params.priceCustomerGroup,\n currency: params.priceCurrency,\n })\n\n // Apply filters pre facetting\n if (params.filter) {\n try {\n const filters = params.filter.map(parseFilterExpression)\n\n // Filters can modify the output. So clone the resources first.\n resources = resources.filter((resource) =>\n filters.every((f) => f(resource, markMatchingVariant))\n )\n } catch (err) {\n console.error(err)\n throw new CommercetoolsError<InvalidInputError>(\n {\n code: 'InvalidInput',\n message: (err as any).message,\n },\n 400\n )\n }\n }\n\n // TODO: Calculate facets\n const facets = this.getFacets(params, resources)\n\n // Apply filters post facetting\n if (params['filter.query']) {\n try {\n const filters = params['filter.query'].map(parseFilterExpression)\n resources = resources.filter((resource) =>\n filters.every((f) => f(resource, markMatchingVariant))\n )\n } catch (err) {\n throw new CommercetoolsError<InvalidInputError>(\n {\n code: 'InvalidInput',\n message: (err as any).message,\n },\n 400\n )\n }\n }\n\n // Expand the resources\n if (params.expand !== undefined) {\n resources = resources.map((resource) =>\n this._storage.expand(projectKey, resource, params.expand)\n )\n }\n\n // Create a slice for the pagination. If we were working with large datasets\n // then we should have done this before transforming. But that isn't the\n // goal of this library. So lets keep it simple.\n const totalResults = resources.length\n const offset = params.offset || 0\n const limit = params.limit || 20\n const results = resources.slice(offset, offset + limit)\n\n return {\n count: totalResults,\n total: results.length,\n offset: offset,\n limit: limit,\n results: results,\n facets: facets,\n }\n }\n\n transform(product: Product, staged: boolean): ProductProjection | null {\n const obj = !staged ? product.masterData.current : product.masterData.staged\n if (!obj) return null\n\n return {\n id: product.id,\n createdAt: product.createdAt,\n lastModifiedAt: product.lastModifiedAt,\n version: product.version,\n name: obj.name,\n key: product.key,\n description: obj.description,\n metaDescription: obj.metaDescription,\n slug: obj.slug,\n categories: obj.categories,\n masterVariant: obj.masterVariant,\n variants: obj.variants,\n productType: product.productType,\n hasStagedChanges: product.masterData.hasStagedChanges,\n published: product.masterData.published,\n }\n }\n\n getFacets(\n params: ProductProjectionSearchParams,\n products: ProductProjection[]\n ): FacetResults {\n if (!params.facet) return {}\n const staged = false\n const result: FacetResults = {}\n\n for (const facet of params.facet) {\n const expression = generateFacetFunc(facet)\n\n // Term Facet\n if (expression.type === 'TermExpression') {\n result[facet] = this.termFacet(expression.source, products)\n }\n\n // Range Facet\n if (expression.type === 'RangeExpression') {\n result[expression.source] = this.rangeFacet(\n expression.source,\n expression.children,\n products\n )\n }\n\n // FilteredFacet\n if (expression.type === 'FilterExpression') {\n result[expression.source] = this.filterFacet(\n expression.source,\n expression.children,\n products\n )\n }\n }\n\n return result\n }\n\n /**\n * TODO: This implemention needs the following additional features:\n * - counting products\n * - correct dataType\n */\n termFacet(facet: string, products: ProductProjection[]): TermFacetResult {\n const result: Writable<TermFacetResult> = {\n type: 'terms',\n dataType: 'text',\n missing: 0,\n total: 0,\n other: 0,\n terms: [],\n }\n const terms: Record<any, number> = {}\n\n if (facet.startsWith('variants.')) {\n products.forEach((p) => {\n const variants = getVariants(p)\n variants.forEach((v) => {\n result.total++\n\n let value = resolveVariantValue(v, facet)\n if (value === undefined) {\n result.missing++\n } else {\n if (typeof value === 'number') {\n value = Number(value).toFixed(1)\n }\n terms[value] = value in terms ? terms[value] + 1 : 1\n }\n })\n })\n } else {\n products.forEach((p) => {\n const value = nestedLookup(p, facet)\n result.total++\n if (value === undefined) {\n result.missing++\n } else {\n terms[value] = value in terms ? terms[value] + 1 : 1\n }\n })\n }\n for (const term in terms) {\n result.terms.push({\n term: term as any,\n count: terms[term],\n })\n }\n return result\n }\n\n filterFacet(\n source: string,\n filters: FilterExpression[] | undefined,\n products: ProductProjection[]\n ): FilteredFacetResult {\n let count = 0\n if (source.startsWith('variants.')) {\n for (const p of products) {\n for (const v of getVariants(p)) {\n const val = resolveVariantValue(v, source)\n if (filters?.some((f) => f.match(val))) {\n count++\n }\n }\n }\n } else {\n throw new Error('not supported')\n }\n\n return {\n type: 'filter',\n count: count,\n }\n }\n\n rangeFacet(\n source: string,\n ranges: RangeExpression[] | undefined,\n products: ProductProjection[]\n ): RangeFacetResult {\n const counts =\n ranges?.map((range) => {\n if (source.startsWith('variants.')) {\n const values = []\n for (const p of products) {\n for (const v of getVariants(p)) {\n const val = resolveVariantValue(v, source)\n if (val === undefined) {\n continue\n }\n\n if (range.match(val)) {\n values.push(val)\n }\n }\n }\n\n const numValues = values.length\n return {\n type: 'double',\n from: range.start || 0,\n fromStr: range.start !== null ? Number(range.start).toFixed(1) : '',\n to: range.stop || 0,\n toStr: range.stop !== null ? Number(range.stop).toFixed(1) : '',\n count: numValues,\n // totalCount: 0,\n total: values.reduce((a, b) => a + b, 0),\n min: numValues > 0 ? Math.min(...values) : 0,\n max: numValues > 0 ? Math.max(...values) : 0,\n mean: numValues > 0 ? mean(values) : 0,\n }\n } else {\n throw new Error('not supported')\n }\n }) || []\n const data: RangeFacetResult = {\n type: 'range',\n // @ts-ignore\n dataType: 'number',\n ranges: counts,\n }\n return data\n }\n}\n\nconst mean = (arr: number[]) => {\n let total = 0\n for (let i = 0; i < arr.length; i++) {\n total += arr[i]\n }\n return total / arr.length\n}\n","import { ParsedQs } from 'qs'\nimport { ProductDraft, ProductProjection } from '@commercetools/platform-sdk'\nimport {\n AbstractResourceRepository,\n QueryParams,\n RepositoryContext,\n} from './abstract'\nimport { RepositoryTypes } from '../types'\nimport { AbstractStorage } from '../storage'\nimport { ProductProjectionSearch } from '../product-projection-search'\nimport { QueryParamsAsArray } from '../helpers'\n\nexport class ProductProjectionRepository extends AbstractResourceRepository {\n protected _searchService: ProductProjectionSearch\n\n constructor(storage: AbstractStorage) {\n super(storage)\n this._searchService = new ProductProjectionSearch(storage)\n }\n\n getTypeId(): RepositoryTypes {\n return 'product-projection'\n }\n\n create(context: RepositoryContext, draft: ProductDraft): ProductProjection {\n throw new Error('No valid action')\n }\n\n query(context: RepositoryContext, params: QueryParams = {}) {\n return this._storage.query(context.projectKey, 'product', {\n expand: params.expand,\n where: params.where,\n offset: params.offset,\n limit: params.limit,\n })\n }\n\n search(context: RepositoryContext, query: ParsedQs) {\n const results = this._searchService.search(context.projectKey, {\n filter: QueryParamsAsArray(query.filter),\n 'filter.query': QueryParamsAsArray(query['filter.query']),\n facet: QueryParamsAsArray(query.facet),\n offset: query.offset ? Number(query.offset) : undefined,\n limit: query.limit ? Number(query.limit) : undefined,\n expand: QueryParamsAsArray(query.expand),\n staged: query.staged === 'true',\n })\n\n return results\n }\n\n actions = {}\n}\n","import { getBaseResourceProperties } from '../helpers'\nimport {\n AttributeDefinition,\n AttributeDefinitionDraft,\n AttributeType,\n ProductType,\n ProductTypeAddAttributeDefinitionAction,\n ProductTypeChangeAttributeOrderAction,\n ProductTypeChangeLabelAction,\n ProductTypeChangeLocalizedEnumValueLabelAction,\n ProductTypeDraft,\n ProductTypeRemoveAttributeDefinitionAction,\n ProductTypeRemoveEnumValuesAction,\n ProductTypeUpdateAction,\n ReferenceTypeId,\n} from '@commercetools/platform-sdk'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { Writable } from 'types'\n\nexport class ProductTypeRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'product-type'\n }\n\n create(context: RepositoryContext, draft: ProductTypeDraft): ProductType {\n const resource: ProductType = {\n ...getBaseResourceProperties(),\n key: draft.key,\n name: draft.name,\n description: draft.description,\n attributes: (draft.attributes ?? []).map((a) =>\n this.attributeDefinitionFromAttributeDefinitionDraft(context, a)\n ),\n }\n\n this.saveNew(context, resource)\n return resource\n }\n\n attributeDefinitionFromAttributeDefinitionDraft = (\n _context: RepositoryContext,\n draft: AttributeDefinitionDraft\n ): AttributeDefinition => ({\n ...draft,\n attributeConstraint: draft.attributeConstraint ?? 'None',\n inputHint: draft.inputHint ?? 'SingleLine',\n inputTip:\n draft.inputTip && Object.keys(draft.inputTip).length > 0\n ? draft.inputTip\n : undefined,\n isSearchable: draft.isSearchable ?? true,\n })\n\n getWithKey(context: RepositoryContext, key: string): ProductType | undefined {\n const result = this._storage.query(context.projectKey, this.getTypeId(), {\n where: [`key=\"${key}\"`],\n })\n if (result.count === 1) {\n return result.results[0] as ProductType\n }\n\n // Catch this for now, should be checked when creating/updating\n if (result.count > 1) {\n throw new Error('Duplicate product type key')\n }\n\n return\n }\n\n actions: Partial<\n Record<\n ProductTypeUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<ProductType>,\n action: any\n ) => void\n >\n > = {\n changeLocalizedEnumValueLabel: (\n context: RepositoryContext,\n resource: Writable<ProductType>,\n {\n attributeName,\n newValue,\n }: ProductTypeChangeLocalizedEnumValueLabelAction\n ) => {\n const updateAttributeType = (type: Writable<AttributeType>) => {\n switch (type.name) {\n case 'lenum':\n type.values.forEach((v) => {\n if (v.key === newValue.key) {\n v.label = newValue.label\n }\n })\n return\n case 'set':\n updateAttributeType(type.elementType)\n return\n }\n }\n\n resource.attributes?.forEach((value) => {\n if (value.name === attributeName) {\n updateAttributeType(value.type)\n }\n })\n },\n changeLabel: (\n context: RepositoryContext,\n resource: Writable<ProductType>,\n { attributeName, label }: ProductTypeChangeLabelAction\n ) => {\n resource.attributes?.forEach((value) => {\n if (value.name === attributeName) {\n value.label = label\n }\n })\n },\n addAttributeDefinition: (\n context: RepositoryContext,\n resource: Writable<ProductType>,\n { attribute }: ProductTypeAddAttributeDefinitionAction\n ) => {\n resource.attributes?.push(\n this.attributeDefinitionFromAttributeDefinitionDraft(context, attribute)\n )\n },\n changeAttributeOrder: (\n context: RepositoryContext,\n resource: Writable<ProductType>,\n { attributes }: ProductTypeChangeAttributeOrderAction\n ) => {\n const attrs = new Map(\n resource.attributes?.map((item) => [item.name, item])\n )\n const result: AttributeDefinition[] = []\n let current = resource.attributes\n\n attributes.forEach((iAttr) => {\n const attr = attrs.get(iAttr.name)\n if (attr === undefined) {\n throw new Error('New attr')\n }\n result.push(attr)\n\n // Remove from current items\n current = current?.filter((f) => f.name !== iAttr.name)\n })\n\n resource.attributes = result\n // Add attrs which were not specified in the order as last items. Not\n // sure if this follows commercetools\n if (current) {\n resource.attributes.push(...current)\n }\n },\n removeAttributeDefinition: (\n context: RepositoryContext,\n resource: Writable<ProductType>,\n { name }: ProductTypeRemoveAttributeDefinitionAction\n ) => {\n resource.attributes = resource.attributes?.filter((f) => f.name !== name)\n },\n removeEnumValues: (\n context: RepositoryContext,\n resource: Writable<ProductType>,\n { attributeName, keys }: ProductTypeRemoveEnumValuesAction\n ) => {\n resource.attributes?.forEach((attr) => {\n if (attr.name == attributeName) {\n if (attr.type.name == 'enum') {\n attr.type.values = attr.type.values.filter(\n (v) => !keys.includes(v.key)\n )\n }\n\n if (attr.type.name == 'set') {\n if (attr.type.elementType.name == 'enum') {\n attr.type.elementType.values =\n attr.type.elementType.values.filter(\n (v) => !keys.includes(v.key)\n )\n }\n }\n }\n })\n },\n }\n}\n","import {\n Project,\n ProjectChangeCartsConfigurationAction,\n ProjectChangeCountriesAction,\n ProjectChangeCountryTaxRateFallbackEnabledAction,\n ProjectChangeCurrenciesAction,\n ProjectChangeLanguagesAction,\n ProjectChangeMessagesEnabledAction,\n ProjectChangeNameAction,\n ProjectChangeOrderSearchStatusAction,\n ProjectChangeProductSearchIndexingEnabledAction,\n ProjectSetExternalOAuthAction,\n ProjectSetShippingRateInputTypeAction,\n ProjectUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { Resource, Writable } from 'types'\nimport { AbstractRepository, RepositoryContext } from './abstract'\nimport { maskSecretValue } from '../lib/masking'\n\nexport class ProjectRepository extends AbstractRepository {\n get(context: RepositoryContext): Project | null {\n const resource = this._storage.getProject(context.projectKey)\n return this.postProcessResource(resource)\n }\n\n postProcessResource<T extends Resource>(resource: T): T {\n if (resource) {\n return maskSecretValue(resource, 'externalOAuth.authorizationHeader')\n }\n return resource\n }\n\n saveNew(context: RepositoryContext, resource: Writable<Project>) {\n resource.version = 1\n this._storage.saveProject(resource)\n }\n\n saveUpdate(context: RepositoryContext, version: number, resource: Project) {\n this._storage.saveProject(resource)\n }\n\n actions: Partial<\n Record<\n ProjectUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<Project>,\n action: any\n ) => void\n >\n > = {\n changeName: (\n context: RepositoryContext,\n resource: Writable<Project>,\n { name }: ProjectChangeNameAction\n ) => {\n resource.name = name\n },\n changeCurrencies: (\n context: RepositoryContext,\n resource: Writable<Project>,\n { currencies }: ProjectChangeCurrenciesAction\n ) => {\n resource.currencies = currencies\n },\n changeCountries: (\n context: RepositoryContext,\n resource: Writable<Project>,\n { countries }: ProjectChangeCountriesAction\n ) => {\n resource.countries = countries\n },\n changeLanguages: (\n context: RepositoryContext,\n resource: Writable<Project>,\n { languages }: ProjectChangeLanguagesAction\n ) => {\n resource.languages = languages\n },\n changeMessagesEnabled: (\n context: RepositoryContext,\n resource: Writable<Project>,\n { messagesEnabled }: ProjectChangeMessagesEnabledAction\n ) => {\n resource.messages.enabled = messagesEnabled\n },\n changeProductSearchIndexingEnabled: (\n context: RepositoryContext,\n resource: Writable<Project>,\n { enabled }: ProjectChangeProductSearchIndexingEnabledAction\n ) => {\n if (!resource.searchIndexing?.products) {\n throw new Error('Invalid project state')\n }\n resource.searchIndexing.products.status = enabled\n ? 'Activated'\n : 'Deactivated'\n resource.searchIndexing.products.lastModifiedAt = new Date().toISOString()\n },\n changeOrderSearchStatus: (\n context: RepositoryContext,\n resource: Writable<Project>,\n { status }: ProjectChangeOrderSearchStatusAction\n ) => {\n if (!resource.searchIndexing?.orders) {\n throw new Error('Invalid project state')\n }\n resource.searchIndexing.orders.status = status\n resource.searchIndexing.orders.lastModifiedAt = new Date().toISOString()\n },\n setShippingRateInputType: (\n context: RepositoryContext,\n resource: Writable<Project>,\n { shippingRateInputType }: ProjectSetShippingRateInputTypeAction\n ) => {\n resource.shippingRateInputType = shippingRateInputType\n },\n setExternalOAuth: (\n context: RepositoryContext,\n resource: Writable<Project>,\n { externalOAuth }: ProjectSetExternalOAuthAction\n ) => {\n resource.externalOAuth = externalOAuth\n },\n changeCountryTaxRateFallbackEnabled: (\n context: RepositoryContext,\n resource: Writable<Project>,\n {\n countryTaxRateFallbackEnabled,\n }: ProjectChangeCountryTaxRateFallbackEnabledAction\n ) => {\n resource.carts.countryTaxRateFallbackEnabled =\n countryTaxRateFallbackEnabled\n },\n changeCartsConfiguration: (\n context: RepositoryContext,\n resource: Writable<Project>,\n { cartsConfiguration }: ProjectChangeCartsConfigurationAction\n ) => {\n resource.carts = cartsConfiguration || {\n countryTaxRateFallbackEnabled: false,\n deleteDaysAfterLastModification: 90,\n }\n },\n }\n}\n","import {\n createCustomFields,\n createTypedMoney,\n getReferenceFromResourceIdentifier,\n} from './helpers'\nimport {\n ReferenceTypeId,\n ShippingMethod,\n ShippingMethodAddShippingRateAction,\n ShippingMethodAddZoneAction,\n ShippingMethodChangeIsDefaultAction,\n ShippingMethodChangeNameAction,\n ShippingMethodDraft,\n ShippingMethodRemoveZoneAction,\n ShippingMethodSetCustomFieldAction,\n ShippingMethodSetCustomTypeAction,\n ShippingMethodSetDescriptionAction,\n ShippingMethodSetKeyAction,\n ShippingMethodSetLocalizedDescriptionAction,\n ShippingMethodSetPredicateAction,\n ShippingMethodUpdateAction,\n ShippingRate,\n ShippingRateDraft,\n ZoneRate,\n ZoneRateDraft,\n ZoneReference,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { Writable } from 'types'\nimport deepEqual from 'deep-equal'\n\nexport class ShippingMethodRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'shipping-method'\n }\n\n create(\n context: RepositoryContext,\n draft: ShippingMethodDraft\n ): ShippingMethod {\n const resource: ShippingMethod = {\n ...getBaseResourceProperties(),\n ...draft,\n taxCategory: getReferenceFromResourceIdentifier(\n draft.taxCategory,\n context.projectKey,\n this._storage\n ),\n zoneRates: draft.zoneRates?.map((z) =>\n this._transformZoneRateDraft(context, z)\n ),\n custom: createCustomFields(\n draft.custom,\n context.projectKey,\n this._storage\n ),\n }\n this.saveNew(context, resource)\n return resource\n }\n\n private _transformZoneRateDraft = (\n context: RepositoryContext,\n draft: ZoneRateDraft\n ): ZoneRate => ({\n ...draft,\n zone: getReferenceFromResourceIdentifier<ZoneReference>(\n draft.zone,\n context.projectKey,\n this._storage\n ),\n shippingRates: draft.shippingRates?.map(this._transformShippingRate),\n })\n\n private _transformShippingRate = (rate: ShippingRateDraft): ShippingRate => ({\n price: createTypedMoney(rate.price),\n freeAbove: rate.freeAbove && createTypedMoney(rate.freeAbove),\n tiers: rate.tiers || [],\n })\n\n actions: Partial<\n Record<\n ShippingMethodUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<ShippingMethod>,\n action: any\n ) => void\n >\n > = {\n addShippingRate: (\n _context: RepositoryContext,\n resource: Writable<ShippingMethod>,\n { shippingRate, zone }: ShippingMethodAddShippingRateAction\n ) => {\n const rate = this._transformShippingRate(shippingRate)\n\n resource.zoneRates.forEach((zoneRate) => {\n if (zoneRate.zone.id === zone.id) {\n zoneRate.shippingRates.push(rate)\n return\n }\n })\n resource.zoneRates.push({\n zone: {\n typeId: 'zone',\n id: zone.id!,\n },\n shippingRates: [rate],\n })\n },\n removeShippingRate: (\n _context: RepositoryContext,\n resource: Writable<ShippingMethod>,\n { shippingRate, zone }: ShippingMethodAddShippingRateAction\n ) => {\n const rate = this._transformShippingRate(shippingRate)\n\n resource.zoneRates.forEach((zoneRate) => {\n if (zoneRate.zone.id === zone.id) {\n zoneRate.shippingRates = zoneRate.shippingRates.filter(\n (otherRate) => !deepEqual(rate, otherRate)\n )\n }\n })\n },\n addZone: (\n context: RepositoryContext,\n resource: Writable<ShippingMethod>,\n { zone }: ShippingMethodAddZoneAction\n ) => {\n const zoneReference = getReferenceFromResourceIdentifier<ZoneReference>(\n zone,\n context.projectKey,\n this._storage\n )\n\n if (resource.zoneRates === undefined) {\n resource.zoneRates = []\n }\n\n resource.zoneRates.push({\n zone: zoneReference,\n shippingRates: [],\n })\n },\n removeZone: (\n _context: RepositoryContext,\n resource: Writable<ShippingMethod>,\n { zone }: ShippingMethodRemoveZoneAction\n ) => {\n resource.zoneRates = resource.zoneRates.filter(\n (zoneRate) => zoneRate.zone.id !== zone.id\n )\n },\n setKey: (\n _context: RepositoryContext,\n resource: Writable<ShippingMethod>,\n { key }: ShippingMethodSetKeyAction\n ) => {\n resource.key = key\n },\n setDescription: (\n _context: RepositoryContext,\n resource: Writable<ShippingMethod>,\n { description }: ShippingMethodSetDescriptionAction\n ) => {\n resource.description = description\n },\n setLocalizedDescription: (\n _context: RepositoryContext,\n resource: Writable<ShippingMethod>,\n { localizedDescription }: ShippingMethodSetLocalizedDescriptionAction\n ) => {\n resource.localizedDescription = localizedDescription\n },\n setPredicate: (\n _context: RepositoryContext,\n resource: Writable<ShippingMethod>,\n { predicate }: ShippingMethodSetPredicateAction\n ) => {\n resource.predicate = predicate\n },\n changeIsDefault: (\n _context: RepositoryContext,\n resource: Writable<ShippingMethod>,\n { isDefault }: ShippingMethodChangeIsDefaultAction\n ) => {\n resource.isDefault = isDefault\n },\n changeName: (\n _context: RepositoryContext,\n resource: Writable<ShippingMethod>,\n { name }: ShippingMethodChangeNameAction\n ) => {\n resource.name = name\n },\n setCustomType: (\n context: RepositoryContext,\n resource: Writable<ShippingMethod>,\n { type, fields }: ShippingMethodSetCustomTypeAction\n ) => {\n if (type) {\n resource.custom = createCustomFields(\n { type, fields },\n context.projectKey,\n this._storage\n )\n } else {\n resource.custom = undefined\n }\n },\n setCustomField: (\n context: RepositoryContext,\n resource: Writable<ShippingMethod>,\n { name, value }: ShippingMethodSetCustomFieldAction\n ) => {\n if (!resource.custom) {\n return\n }\n if (value === null) {\n delete resource.custom.fields[name]\n } else {\n resource.custom.fields[name] = value\n }\n },\n }\n}\n","import {\n CustomerReference,\n ReferenceTypeId,\n ShoppingList,\n ShoppingListDraft,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport {\n createCustomFields,\n getReferenceFromResourceIdentifier,\n} from './helpers'\n\nexport class ShoppingListRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'shopping-list'\n }\n create(context: RepositoryContext, draft: ShoppingListDraft): ShoppingList {\n // const product =\n\n const resource: ShoppingList = {\n ...getBaseResourceProperties(),\n ...draft,\n custom: createCustomFields(\n draft.custom,\n context.projectKey,\n this._storage\n ),\n textLineItems: [],\n lineItems: draft.lineItems?.map((e) => ({\n ...getBaseResourceProperties(),\n ...e,\n addedAt: e.addedAt ?? '',\n productId: e.productId ?? '',\n name: {},\n quantity: e.quantity ?? 1,\n productType: { typeId: 'product-type', id: '' },\n custom: createCustomFields(e.custom, context.projectKey, this._storage),\n })),\n customer: draft.customer\n ? getReferenceFromResourceIdentifier<CustomerReference>(\n draft.customer,\n context.projectKey,\n this._storage\n )\n : undefined,\n store: draft.store?.key\n ? { typeId: 'store', key: draft.store.key! }\n : undefined,\n }\n this.saveNew(context, resource)\n return resource\n }\n}\n","import { getBaseResourceProperties } from '../helpers'\nimport { getReferenceFromResourceIdentifier } from './helpers'\nimport {\n ReferenceTypeId,\n StateReference,\n State,\n StateChangeKeyAction,\n StateDraft,\n StateSetDescriptionAction,\n StateSetNameAction,\n StateSetRolesAction,\n StateSetTransitionsAction,\n StateUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { Writable } from 'types'\n\nexport class StateRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'state'\n }\n\n create(context: RepositoryContext, draft: StateDraft): State {\n const resource: State = {\n ...getBaseResourceProperties(),\n ...draft,\n builtIn: false,\n initial: draft.initial || false,\n transitions: (draft.transitions || []).map((t) =>\n getReferenceFromResourceIdentifier(t, context.projectKey, this._storage)\n ),\n }\n\n this.saveNew(context, resource)\n return resource\n }\n\n actions: Partial<\n Record<\n StateUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<State>,\n action: any\n ) => void\n >\n > = {\n changeKey: (\n context: RepositoryContext,\n resource: Writable<State>,\n { key }: StateChangeKeyAction\n ) => {\n resource.key = key\n },\n setDescription: (\n context: RepositoryContext,\n resource: Writable<State>,\n { description }: StateSetDescriptionAction\n ) => {\n resource.description = description\n },\n setName: (\n context: RepositoryContext,\n resource: Writable<State>,\n { name }: StateSetNameAction\n ) => {\n resource.name = name\n },\n setRoles: (\n context: RepositoryContext,\n resource: Writable<State>,\n { roles }: StateSetRolesAction\n ) => {\n resource.roles = roles\n },\n setTransitions: (\n context: RepositoryContext,\n resource: Writable<State>,\n { transitions }: StateSetTransitionsAction\n ) => {\n resource.transitions = transitions?.map(\n (resourceId): StateReference => ({\n id: resourceId.id || '',\n typeId: 'state',\n })\n )\n },\n }\n}\n","import {\n Store,\n StoreDraft,\n ReferenceTypeId,\n StoreUpdateAction,\n StoreSetNameAction,\n ChannelReference,\n StoreSetDistributionChannelsAction,\n ChannelResourceIdentifier,\n StoreSetLanguagesAction,\n StoreSetCustomFieldAction,\n StoreSetCustomTypeAction,\n} from '@commercetools/platform-sdk'\nimport { Writable } from 'types'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport {\n getReferenceFromResourceIdentifier,\n createCustomFields,\n} from './helpers'\n\nexport class StoreRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'store'\n }\n\n create(context: RepositoryContext, draft: StoreDraft): Store {\n const resource: Store = {\n ...getBaseResourceProperties(),\n key: draft.key,\n name: draft.name,\n languages: draft.languages ?? [],\n distributionChannels: this.transformChannels(\n context,\n draft.distributionChannels\n ),\n supplyChannels: this.transformChannels(context, draft.supplyChannels),\n productSelections: [],\n custom: createCustomFields(\n draft.custom,\n context.projectKey,\n this._storage\n ),\n }\n this.saveNew(context, resource)\n return resource\n }\n\n private transformChannels(\n context: RepositoryContext,\n channels?: ChannelResourceIdentifier[]\n ) {\n if (!channels) return []\n\n return channels.map((ref) =>\n getReferenceFromResourceIdentifier<ChannelReference>(\n ref,\n context.projectKey,\n this._storage\n )\n )\n }\n\n getWithKey(context: RepositoryContext, key: string): Store | undefined {\n const result = this._storage.query(context.projectKey, this.getTypeId(), {\n where: [`key=\"${key}\"`],\n })\n if (result.count === 1) {\n return result.results[0] as Store\n }\n\n if (result.count > 1) {\n throw new Error('Duplicate store key')\n }\n\n return\n }\n\n actions: Partial<\n Record<\n StoreUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<Store>,\n action: any\n ) => void\n >\n > = {\n setName: (\n context: RepositoryContext,\n resource: Writable<Store>,\n { name }: StoreSetNameAction\n ) => {\n resource.name = name\n },\n setDistributionChannels: (\n context: RepositoryContext,\n resource: Writable<Store>,\n { distributionChannels }: StoreSetDistributionChannelsAction\n ) => {\n resource.distributionChannels = this.transformChannels(\n context,\n distributionChannels\n )\n },\n setLanguages: (\n context: RepositoryContext,\n resource: Writable<Store>,\n { languages }: StoreSetLanguagesAction\n ) => {\n resource.languages = languages ?? []\n },\n setCustomType: (\n context: RepositoryContext,\n resource: Writable<Store>,\n { type, fields }: StoreSetCustomTypeAction\n ) => {\n if (type) {\n resource.custom = createCustomFields(\n { type, fields },\n context.projectKey,\n this._storage\n )\n } else {\n resource.custom = undefined\n }\n },\n setCustomField: (\n context: RepositoryContext,\n resource: Writable<Store>,\n { name, value }: StoreSetCustomFieldAction\n ) => {\n if (!resource.custom) {\n return\n }\n if (value === null) {\n delete resource.custom.fields[name]\n } else {\n resource.custom.fields[name] = value\n }\n },\n }\n}\n","import {\n InvalidInputError,\n ReferenceTypeId,\n Subscription,\n SubscriptionDraft,\n} from '@commercetools/platform-sdk'\nimport { CommercetoolsError } from '../exceptions'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class SubscriptionRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'subscription'\n }\n create(context: RepositoryContext, draft: SubscriptionDraft): Subscription {\n // TODO: We could actually test this here by using the aws sdk. For now\n // hardcode a failed check when account id is 0000000000\n if (draft.destination.type === 'SQS') {\n const queueURL = new URL(draft.destination.queueUrl)\n const accountId = queueURL.pathname.split('/')[1]\n if (accountId === '0000000000') {\n const dest = draft.destination\n throw new CommercetoolsError<InvalidInputError>(\n {\n code: 'InvalidInput',\n message:\n 'A test message could not be delivered to this destination: ' +\n `SQS ${dest.queueUrl} in ${dest.region} for ${dest.accessKey}. ` +\n 'Please make sure your destination is correctly configured.',\n },\n 400\n )\n }\n }\n\n const resource: Subscription = {\n ...getBaseResourceProperties(),\n changes: draft.changes || [],\n destination: draft.destination,\n format: draft.format || {\n type: 'Platform',\n },\n key: draft.key,\n messages: draft.messages || [],\n status: 'Healthy',\n }\n this.saveNew(context, resource)\n return resource\n }\n}\n","import {\n ReferenceTypeId,\n TaxCategory,\n TaxCategoryAddTaxRateAction,\n TaxCategoryChangeNameAction,\n TaxCategoryDraft,\n TaxCategoryRemoveTaxRateAction,\n TaxCategoryReplaceTaxRateAction,\n TaxCategorySetDescriptionAction,\n TaxCategorySetKeyAction,\n TaxCategoryUpdateAction,\n TaxRate,\n TaxRateDraft,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { v4 as uuidv4 } from 'uuid'\nimport { Writable } from 'types'\n\nexport class TaxCategoryRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'tax-category'\n }\n\n create(context: RepositoryContext, draft: TaxCategoryDraft): TaxCategory {\n const resource: TaxCategory = {\n ...getBaseResourceProperties(),\n ...draft,\n rates: draft.rates?.map(this.taxRateFromTaxRateDraft) || [],\n }\n this.saveNew(context, resource)\n return resource\n }\n\n private taxRateFromTaxRateDraft = (draft: TaxRateDraft): TaxRate => ({\n ...draft,\n id: uuidv4(),\n amount: draft.amount || 0,\n })\n\n getWithKey(context: RepositoryContext, key: string): TaxCategory | undefined {\n const result = this._storage.query(context.projectKey, this.getTypeId(), {\n where: [`key=\"${key}\"`],\n })\n if (result.count === 1) {\n return result.results[0] as TaxCategory\n }\n\n // Catch this for now, should be checked when creating/updating\n if (result.count > 1) {\n throw new Error('Duplicate tax category key')\n }\n\n return\n }\n\n actions: Partial<\n Record<\n TaxCategoryUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<TaxCategory>,\n action: any\n ) => void\n >\n > = {\n addTaxRate: (\n context: RepositoryContext,\n resource: Writable<TaxCategory>,\n { taxRate }: TaxCategoryAddTaxRateAction\n ) => {\n if (resource.rates === undefined) {\n resource.rates = []\n }\n resource.rates.push(this.taxRateFromTaxRateDraft(taxRate))\n },\n removeTaxRate: (\n context: RepositoryContext,\n resource: Writable<TaxCategory>,\n { taxRateId }: TaxCategoryRemoveTaxRateAction\n ) => {\n if (resource.rates === undefined) {\n resource.rates = []\n }\n resource.rates = resource.rates.filter(\n (taxRate) => taxRate.id !== taxRateId\n )\n },\n replaceTaxRate: (\n context: RepositoryContext,\n resource: Writable<TaxCategory>,\n { taxRateId, taxRate }: TaxCategoryReplaceTaxRateAction\n ) => {\n if (resource.rates === undefined) {\n resource.rates = []\n }\n\n const taxRateObj = this.taxRateFromTaxRateDraft(taxRate)\n for (let i = 0; i < resource.rates.length; i++) {\n const rate = resource.rates[i]\n if (rate.id === taxRateId) {\n resource.rates[i] = taxRateObj\n }\n }\n },\n setDescription: (\n context: RepositoryContext,\n resource: Writable<TaxCategory>,\n { description }: TaxCategorySetDescriptionAction\n ) => {\n resource.description = description\n },\n setKey: (\n context: RepositoryContext,\n resource: Writable<TaxCategory>,\n { key }: TaxCategorySetKeyAction\n ) => {\n resource.key = key\n },\n changeName: (\n context: RepositoryContext,\n resource: Writable<TaxCategory>,\n { name }: TaxCategoryChangeNameAction\n ) => {\n resource.name = name\n },\n }\n}\n","import {\n Type,\n TypeDraft,\n InvalidOperationError,\n ReferenceTypeId,\n TypeUpdateAction,\n FieldDefinition,\n TypeSetDescriptionAction,\n TypeChangeNameAction,\n TypeAddFieldDefinitionAction,\n TypeChangeEnumValueLabelAction,\n TypeAddEnumValueAction,\n TypeChangeFieldDefinitionOrderAction,\n TypeRemoveFieldDefinitionAction,\n} from '@commercetools/platform-sdk'\nimport { CommercetoolsError } from '../exceptions'\nimport { isEqual } from 'lodash'\nimport { Writable } from 'types'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class TypeRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'type'\n }\n\n create(context: RepositoryContext, draft: TypeDraft): Type {\n const resource: Type = {\n ...getBaseResourceProperties(),\n key: draft.key,\n name: draft.name,\n resourceTypeIds: draft.resourceTypeIds,\n fieldDefinitions: draft.fieldDefinitions || [],\n description: draft.description,\n }\n this.saveNew(context, resource)\n return resource\n }\n actions: Partial<\n Record<\n TypeUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<Type>,\n action: any\n ) => void\n >\n > = {\n addFieldDefinition: (\n context: RepositoryContext,\n resource: Writable<Type>,\n { fieldDefinition }: TypeAddFieldDefinitionAction\n ) => {\n resource.fieldDefinitions.push(fieldDefinition)\n },\n removeFieldDefinition: (\n context: RepositoryContext,\n resource: Writable<Type>,\n { fieldName }: TypeRemoveFieldDefinitionAction\n ) => {\n resource.fieldDefinitions = resource.fieldDefinitions.filter(\n (f) => f.name !== fieldName\n )\n },\n setDescription: (\n context: RepositoryContext,\n resource: Writable<Type>,\n { description }: TypeSetDescriptionAction\n ) => {\n resource.description = description\n },\n changeName: (\n context: RepositoryContext,\n resource: Writable<Type>,\n { name }: TypeChangeNameAction\n ) => {\n resource.name = name\n },\n changeFieldDefinitionOrder: (\n context: RepositoryContext,\n resource: Writable<Type>,\n { fieldNames }: TypeChangeFieldDefinitionOrderAction\n ) => {\n const fields = new Map(\n resource.fieldDefinitions.map((item) => [item.name, item])\n )\n const result: FieldDefinition[] = []\n let current = resource.fieldDefinitions\n\n fieldNames.forEach((fieldName) => {\n const field = fields.get(fieldName)\n if (field === undefined) {\n throw new Error('New field')\n }\n result.push(field)\n\n // Remove from current items\n current = current.filter((f) => f.name !== fieldName)\n })\n\n if (\n isEqual(\n fieldNames,\n resource.fieldDefinitions.map((item) => item.name)\n )\n ) {\n throw new CommercetoolsError<InvalidOperationError>({\n code: 'InvalidOperation',\n message: \"'fieldDefinitions' has no changes.\",\n action: {\n action: 'changeFieldDefinitionOrder',\n fieldNames: fieldNames,\n },\n })\n }\n\n resource.fieldDefinitions = result\n // Add fields which were not specified in the order as last items. Not\n // sure if this follows commercetools\n resource.fieldDefinitions.push(...current)\n },\n addEnumValue: (\n context: RepositoryContext,\n resource: Writable<Type>,\n { fieldName, value }: TypeAddEnumValueAction\n ) => {\n resource.fieldDefinitions.forEach((field) => {\n if (field.name === fieldName) {\n // TODO, should be done better i suppose\n if (field.type.name === 'Enum') {\n field.type.values.push(value)\n } else if (\n field.type.name === 'Set' &&\n field.type.elementType.name === 'Enum'\n ) {\n field.type.elementType.values.push(value)\n } else {\n throw new Error('Type is not a Enum (or Set of Enum)')\n }\n }\n })\n },\n changeEnumValueLabel: (\n context: RepositoryContext,\n resource: Writable<Type>,\n { fieldName, value }: TypeChangeEnumValueLabelAction\n ) => {\n resource.fieldDefinitions.forEach((field) => {\n if (field.name === fieldName) {\n // TODO, should be done better i suppose\n if (field.type.name === 'Enum') {\n field.type.values.forEach((v) => {\n if (v.key === value.key) {\n v.label = value.label\n }\n })\n } else if (\n field.type.name === 'Set' &&\n field.type.elementType.name === 'Enum'\n ) {\n field.type.elementType.values.forEach((v) => {\n if (v.key === value.key) {\n v.label = value.label\n }\n })\n } else {\n throw new Error('Type is not a Enum (or Set of Enum)')\n }\n }\n })\n },\n }\n}\n","import {\n ReferenceTypeId,\n Zone,\n ZoneAddLocationAction,\n ZoneChangeNameAction,\n ZoneDraft,\n ZoneRemoveLocationAction,\n ZoneSetDescriptionAction,\n ZoneSetKeyAction,\n ZoneUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { Writable } from 'types'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class ZoneRepository extends AbstractResourceRepository {\n getTypeId(): ReferenceTypeId {\n return 'zone'\n }\n\n create(context: RepositoryContext, draft: ZoneDraft): Zone {\n const resource: Zone = {\n ...getBaseResourceProperties(),\n key: draft.key,\n locations: draft.locations || [],\n name: draft.name,\n description: draft.description,\n }\n this.saveNew(context, resource)\n return resource\n }\n\n actions: Partial<\n Record<\n ZoneUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<Zone>,\n action: any\n ) => void\n >\n > = {\n addLocation: (\n context: RepositoryContext,\n resource: Writable<Zone>,\n { location }: ZoneAddLocationAction\n ) => {\n resource.locations.push(location)\n },\n removeLocation: (\n context: RepositoryContext,\n resource: Writable<Zone>,\n { location }: ZoneRemoveLocationAction\n ) => {\n resource.locations = resource.locations.filter(\n (loc) =>\n !(loc.country === location.country && loc.state === location.state)\n )\n },\n changeName: (\n context: RepositoryContext,\n resource: Writable<Zone>,\n { name }: ZoneChangeNameAction\n ) => {\n resource.name = name\n },\n setDescription: (\n context: RepositoryContext,\n resource: Writable<Zone>,\n { description }: ZoneSetDescriptionAction\n ) => {\n resource.description = description\n },\n setKey: (\n context: RepositoryContext,\n resource: Writable<Zone>,\n { key }: ZoneSetKeyAction\n ) => {\n resource.key = key\n },\n }\n}\n","import { AbstractStorage } from '../storage'\nimport { CartRepository } from './cart'\nimport { CartDiscountRepository } from './cart-discount'\nimport { CategoryRepository } from './category'\nimport { ChannelRepository } from './channel'\nimport { CustomObjectRepository } from './custom-object'\nimport { CustomerRepository } from './customer'\nimport { CustomerGroupRepository } from './customer-group'\nimport { DiscountCodeRepository } from './discount-code'\nimport { ExtensionRepository } from './extension'\nimport { InventoryEntryRepository } from './inventory-entry'\nimport { MyOrderRepository } from './my-order'\nimport { OrderRepository } from './order'\nimport { PaymentRepository } from './payment'\nimport { ProductRepository } from './product'\nimport { ProductDiscountRepository } from './product-discount'\nimport { ProductProjectionRepository } from './product-projection'\nimport { ProductTypeRepository } from './product-type'\nimport { ProjectRepository } from './project'\nimport { ShippingMethodRepository } from './shipping-method'\nimport { ShoppingListRepository } from './shopping-list'\nimport { StateRepository } from './state'\nimport { StoreRepository } from './store'\nimport { SubscriptionRepository } from './subscription'\nimport { TaxCategoryRepository } from './tax-category'\nimport { TypeRepository } from './type'\nimport { ZoneRepository } from './zone'\n\nexport const createRepositories = (storage: AbstractStorage) => ({\n category: new CategoryRepository(storage),\n cart: new CartRepository(storage),\n 'cart-discount': new CartDiscountRepository(storage),\n customer: new CustomerRepository(storage),\n channel: new ChannelRepository(storage),\n 'customer-group': new CustomerGroupRepository(storage),\n 'discount-code': new DiscountCodeRepository(storage),\n extension: new ExtensionRepository(storage),\n 'inventory-entry': new InventoryEntryRepository(storage),\n 'key-value-document': new CustomObjectRepository(storage),\n order: new OrderRepository(storage),\n payment: new PaymentRepository(storage),\n 'my-cart': new CartRepository(storage),\n 'my-order': new MyOrderRepository(storage),\n 'my-customer': new CustomerRepository(storage),\n 'my-payment': new PaymentRepository(storage),\n 'shipping-method': new ShippingMethodRepository(storage),\n 'product-type': new ProductTypeRepository(storage),\n product: new ProductRepository(storage),\n project: new ProjectRepository(storage),\n 'product-discount': new ProductDiscountRepository(storage),\n 'product-projection': new ProductProjectionRepository(storage),\n 'shopping-list': new ShoppingListRepository(storage),\n state: new StateRepository(storage),\n store: new StoreRepository(storage),\n subscription: new SubscriptionRepository(storage),\n 'tax-category': new TaxCategoryRepository(storage),\n type: new TypeRepository(storage),\n zone: new ZoneRepository(storage),\n})\n","import { Update } from '@commercetools/platform-sdk'\nimport { ParsedQs } from 'qs'\nimport { Request, Response, Router } from 'express'\nimport { AbstractResourceRepository } from '../repositories/abstract'\nimport { getRepositoryContext } from '../repositories/helpers'\n\nexport default abstract class AbstractService {\n protected abstract getBasePath(): string\n public abstract repository: AbstractResourceRepository\n\n createStatusCode = 201\n\n constructor(parent: Router) {\n this.registerRoutes(parent)\n }\n\n extraRoutes(router: Router) {\n\n }\n\n registerRoutes(parent: Router) {\n const basePath = this.getBasePath()\n const router = Router({ mergeParams: true })\n\n // Bind this first since the `/:id` routes are currently a bit to greedy\n this.extraRoutes(router)\n\n router.get('/', this.get.bind(this))\n router.get('/key=:key', this.getWithKey.bind(this)) // same thing goes for the key routes\n router.get('/:id', this.getWithId.bind(this))\n\n router.delete('/key=:key', this.deleteWithKey.bind(this))\n router.delete('/:id', this.deleteWithId.bind(this))\n\n router.post('/', this.post.bind(this))\n router.post('/key=:key', this.postWithKey.bind(this))\n router.post('/:id', this.postWithId.bind(this))\n\n parent.use(`/${basePath}`, router)\n }\n\n get(request: Request, response: Response) {\n const limit = this._parseParam(request.query.limit)\n const offset = this._parseParam(request.query.offset)\n\n const result = this.repository.query(getRepositoryContext(request), {\n expand: this._parseParam(request.query.expand),\n where: this._parseParam(request.query.where),\n limit: limit !== undefined ? Number(limit) : undefined,\n offset: offset !== undefined ? Number(offset) : undefined,\n })\n return response.status(200).send(result)\n }\n\n getWithId(request: Request, response: Response) {\n const result = this._expandWithId(request, request.params['id'])\n if (!result) {\n return response.status(404).send()\n }\n return response.status(200).send(result)\n }\n\n getWithKey(request: Request, response: Response) {\n const result = this.repository.getByKey(\n getRepositoryContext(request),\n request.params['key'],\n { expand: this._parseParam(request.query.expand) }\n )\n if (!result) return response.status(404).send()\n return response.status(200).send(result)\n }\n\n deleteWithId(request: Request, response: Response) {\n const result = this.repository.delete(\n getRepositoryContext(request),\n request.params['id'],\n {\n expand: this._parseParam(request.query.expand),\n }\n )\n if (!result) {\n return response.status(404).send('Not found')\n }\n return response.status(200).send(result)\n }\n\n deleteWithKey(request: Request, response: Response) {\n const resource = this.repository.getByKey(\n getRepositoryContext(request),\n request.params['key']\n )\n if (!resource) {\n return response.status(404).send('Not found')\n }\n\n const result = this.repository.delete(\n getRepositoryContext(request),\n resource.id,\n {\n expand: this._parseParam(request.query.expand),\n }\n )\n if (!result) {\n return response.status(404).send('Not found')\n }\n return response.status(200).send(result)\n }\n\n post(request: Request, response: Response) {\n const draft = request.body\n const resource = this.repository.create(\n getRepositoryContext(request),\n draft\n )\n const result = this._expandWithId(request, resource.id)\n return response.status(this.createStatusCode).send(result)\n }\n\n postWithId(request: Request, response: Response) {\n const updateRequest: Update = request.body\n const resource = this.repository.get(\n getRepositoryContext(request),\n request.params['id']\n )\n if (!resource) {\n return response.status(404).send('Not found')\n }\n\n const updatedResource = this.repository.processUpdateActions(\n getRepositoryContext(request),\n resource,\n updateRequest.version,\n updateRequest.actions\n )\n\n const result = this._expandWithId(request, updatedResource.id)\n return response.status(200).send(result)\n }\n\n postWithKey(request: Request, response: Response) {\n const updateRequest: Update = request.body\n const resource = this.repository.getByKey(\n getRepositoryContext(request),\n request.params['key']\n )\n if (!resource) {\n return response.status(404).send('Not found')\n }\n const updatedResource = this.repository.processUpdateActions(\n getRepositoryContext(request),\n resource,\n updateRequest.version,\n updateRequest.actions\n )\n\n const result = this._expandWithId(request, updatedResource.id)\n return response.status(200).send(result)\n }\n\n protected _expandWithId(request: Request, resourceId: string) {\n const result = this.repository.get(\n getRepositoryContext(request),\n resourceId,\n {\n expand: this._parseParam(request.query.expand),\n }\n )\n return result\n }\n\n // No idea what i'm doing\n private _parseParam(\n value: string | ParsedQs | string[] | ParsedQs[] | undefined\n ): string[] | undefined {\n if (Array.isArray(value)) {\n // @ts-ignore\n return value\n } else if (value !== undefined) {\n return [`${value}`]\n }\n return undefined\n }\n}\n","import AbstractService from './abstract'\nimport { Router } from 'express'\nimport { CartRepository } from '../repositories/cart'\nimport { Cart, CartDraft, Order } from '@commercetools/platform-sdk'\nimport { OrderRepository } from '../repositories/order'\nimport { getRepositoryContext } from '../repositories/helpers'\n\nexport class CartService extends AbstractService {\n public repository: CartRepository\n public orderRepository: OrderRepository\n\n constructor(parent: Router, cartRepository: CartRepository, orderRepository: OrderRepository) {\n super(parent)\n this.repository = cartRepository\n this.orderRepository = orderRepository\n }\n\n getBasePath() {\n return 'carts'\n }\n\n extraRoutes(parent: Router) {\n parent.post('/replicate', (request, response) => {\n const context = getRepositoryContext(request)\n\n // @ts-ignore\n const cartOrOrder: Cart | Order | null =\n request.body.reference.typeId === 'order'\n ? this.orderRepository.get(context, request.body.reference.id)\n : this.repository.get(context, request.body.reference.id)\n\n if (!cartOrOrder) {\n return response.status(400).send()\n }\n\n const cartDraft: CartDraft = {\n ...cartOrOrder,\n currency: cartOrOrder.totalPrice.currencyCode,\n discountCodes: [],\n lineItems: cartOrOrder.lineItems.map((lineItem) => ({\n ...lineItem,\n variantId: lineItem.variant.id,\n sku: lineItem.variant.sku,\n })),\n }\n\n const newCart = this.repository.create(context, cartDraft)\n\n return response.status(200).send(newCart)\n })\n }\n}\n","import { Router } from 'express'\nimport AbstractService from './abstract'\nimport { CartDiscountRepository } from '../repositories/cart-discount'\n\nexport class CartDiscountService extends AbstractService {\n public repository: CartDiscountRepository\n\n constructor(parent: Router, repository: CartDiscountRepository) {\n super(parent)\n this.repository = repository\n }\n\n getBasePath() {\n return 'cart-discounts'\n }\n}\n","import AbstractService from './abstract'\nimport { Router } from 'express'\nimport { CategoryRepository } from '../repositories/category'\n\nexport class CategoryServices extends AbstractService {\n public repository: CategoryRepository\n\n constructor(parent: Router, repository: CategoryRepository) {\n super(parent)\n this.repository = repository\n }\n\n getBasePath() {\n return 'categories'\n }\n}\n","import AbstractService from './abstract'\nimport { Router } from 'express'\nimport { ChannelRepository } from '../repositories/channel'\n\nexport class ChannelService extends AbstractService {\n public repository: ChannelRepository\n\n constructor(parent: Router, repository: ChannelRepository) {\n super(parent)\n this.repository = repository\n }\n\n getBasePath() {\n return 'channels'\n }\n}\n","import AbstractService from './abstract'\nimport { Request, Response, Router } from 'express'\nimport { CustomObjectRepository } from '../repositories/custom-object'\nimport { CustomObjectDraft } from '@commercetools/platform-sdk'\nimport { getRepositoryContext } from '../repositories/helpers'\n\nexport class CustomObjectService extends AbstractService {\n public repository: CustomObjectRepository\n\n constructor(parent: Router, repository: CustomObjectRepository) {\n super(parent)\n this.repository = repository\n }\n\n getBasePath() {\n return 'custom-objects'\n }\n\n extraRoutes(router: Router) {\n router.get('/:container/:key', this.getWithContainerAndKey.bind(this))\n router.post('/:container/:key', this.createWithContainerAndKey.bind(this))\n router.delete('/:container/:key', this.deleteWithContainerAndKey.bind(this))\n }\n\n getWithContainerAndKey(request: Request, response: Response) {\n const result = this.repository.getWithContainerAndKey(\n getRepositoryContext(request),\n request.params.container,\n request.params.key\n )\n\n if (!result) {\n return response.status(404).send('Not Found')\n }\n return response.status(200).send(result)\n }\n\n createWithContainerAndKey(request: Request, response: Response) {\n const draft: CustomObjectDraft = {\n ...request.body,\n key: request.params.key,\n container: request.params.container,\n }\n\n const result = this.repository.create(getRepositoryContext(request), draft)\n return response.status(200).send(result)\n }\n\n deleteWithContainerAndKey(request: Request, response: Response) {\n const current = this.repository.getWithContainerAndKey(\n getRepositoryContext(request),\n request.params.container,\n request.params.key\n )\n\n if (!current) {\n return response.status(404).send('Not Found')\n }\n\n const result = this.repository.delete(\n getRepositoryContext(request),\n current.id\n )\n\n return response.status(200).send(result)\n }\n}\n","import AbstractService from './abstract'\nimport { Router } from 'express'\nimport { CustomerRepository } from '../repositories/customer'\nimport { getBaseResourceProperties } from '../helpers'\nimport { v4 as uuidv4 } from 'uuid'\nimport { getRepositoryContext } from '../repositories/helpers'\n\nexport class CustomerService extends AbstractService {\n public repository: CustomerRepository\n\n constructor(parent: Router, repository: CustomerRepository) {\n super(parent)\n this.repository = repository\n }\n\n getBasePath() {\n return 'customers'\n }\n\n extraRoutes(parent: Router) {\n parent.post('/password-token', (request, response) => {\n const customer = this.repository.query(getRepositoryContext(request), {\n where: [`email=\"${request.body.email}\"`],\n })\n // @ts-ignore\n const ttlMinutes: number = request.params.ttlMinutes\n ? // @ts-ignore\n +request.params.ttlMinutes\n : 34560\n const { version, ...rest } = getBaseResourceProperties()\n\n return response.status(200).send({\n ...rest,\n customerId: customer.results[0].id,\n expiresAt: new Date(Date.now() + ttlMinutes * 60).toISOString(),\n value: uuidv4(),\n })\n })\n }\n}\n","import AbstractService from './abstract'\nimport { Router } from 'express'\nimport { CustomerGroupRepository } from '../repositories/customer-group'\n\nexport class CustomerGroupService extends AbstractService {\n public repository: CustomerGroupRepository\n\n constructor(parent: Router, repository: CustomerGroupRepository) {\n super(parent)\n this.repository = repository\n }\n\n getBasePath() {\n return 'customer-groups'\n }\n}\n","import { Router } from 'express'\nimport AbstractService from './abstract'\nimport { DiscountCodeRepository } from '../repositories/discount-code'\n\nexport class DiscountCodeService extends AbstractService {\n public repository: DiscountCodeRepository\n\n constructor(parent: Router, repository: DiscountCodeRepository) {\n super(parent)\n this.repository = repository\n }\n\n getBasePath() {\n return 'discount-codes'\n }\n}\n","import AbstractService from './abstract'\nimport { Router } from 'express'\nimport { ExtensionRepository } from '../repositories/extension'\n\nexport class ExtensionServices extends AbstractService {\n public repository: ExtensionRepository\n\n constructor(parent: Router, repository: ExtensionRepository) {\n super(parent)\n this.repository = repository\n }\n\n getBasePath() {\n return 'extensions'\n }\n}\n","import AbstractService from './abstract'\nimport { Router } from 'express'\nimport { InventoryEntryRepository } from '../repositories/inventory-entry'\n\nexport class InventoryEntryService extends AbstractService {\n public repository: InventoryEntryRepository\n\n constructor(parent: Router, repository: InventoryEntryRepository) {\n super(parent)\n this.repository = repository\n }\n\n getBasePath() {\n return 'inventory'\n }\n}\n","import AbstractService from './abstract'\nimport { Request, Response, Router } from 'express'\nimport { CartRepository } from '../repositories/cart'\n\nexport class MyCartService extends AbstractService {\n public repository: CartRepository\n\n constructor(parent: Router, repository: CartRepository) {\n super(parent)\n this.repository = repository\n }\n\n getBasePath() {\n return 'me'\n }\n\n registerRoutes(parent: Router) {\n // Overwrite this function to be able to handle /me/active-cart path.\n const basePath = this.getBasePath()\n const router = Router({ mergeParams: true })\n\n this.extraRoutes(router)\n\n router.get('/active-cart', this.activeCart.bind(this))\n router.get('/carts/', this.get.bind(this))\n router.get('/carts/:id', this.getWithId.bind(this))\n\n router.delete('/carts/:id', this.deleteWithId.bind(this))\n\n router.post('/carts/', this.post.bind(this))\n router.post('/carts/:id', this.postWithId.bind(this))\n\n parent.use(`/${basePath}`, router)\n }\n\n activeCart(request: Request, response: Response) {\n const resource = this.repository.getActiveCart(request.params.projectKey)\n if (!resource) {\n return response.status(404).send('Not found')\n }\n return response.status(200).send(resource)\n }\n}\n","import AbstractService from './abstract'\nimport { Request, Response, Router } from 'express'\nimport { CustomerRepository } from '../repositories/customer'\nimport { getRepositoryContext } from '../repositories/helpers'\n\nexport class MyCustomerService extends AbstractService {\n public repository: CustomerRepository\n\n constructor(parent: Router, repository: CustomerRepository) {\n super(parent)\n this.repository = repository\n }\n\n getBasePath() {\n return 'me'\n }\n\n registerRoutes(parent: Router) {\n // Overwrite this function to be able to handle /me path.\n const basePath = this.getBasePath()\n const router = Router({ mergeParams: true })\n\n this.extraRoutes(router)\n\n router.get('', this.getMe.bind(this))\n\n router.post('/signup', this.signUp.bind(this))\n\n router.post('/login', this.signIn.bind(this))\n\n parent.use(`/${basePath}`, router)\n }\n\n getMe(request: Request, response: Response) {\n const resource = this.repository.getMe(getRepositoryContext(request))\n if (!resource) {\n return response.status(404).send('Not found')\n }\n return response.status(200).send(resource)\n }\n\n signUp(request: Request, response: Response) {\n const draft = request.body\n const resource = this.repository.create(\n getRepositoryContext(request),\n draft\n )\n const result = this._expandWithId(request, resource.id)\n return response.status(this.createStatusCode).send({ customer: result })\n }\n\n signIn(request: Request, response: Response) {\n const { email, password } = request.body\n const encodedPassword = Buffer.from(password).toString('base64')\n\n const result = this.repository.query(getRepositoryContext(request), {\n where: [`email = \"${email}\"`, `password = \"${encodedPassword}\"`],\n })\n\n if (result.count === 0) {\n return response.status(400).send({\n message: 'Account with the given credentials not found.',\n errors: [\n {\n code: 'InvalidCredentials',\n message: 'Account with the given credentials not found.',\n },\n ],\n })\n }\n\n return response.status(200).send({ customer: result.results[0] })\n }\n}\n","import AbstractService from './abstract'\nimport { Router } from 'express'\nimport { MyOrderRepository } from '../repositories/my-order'\n\nexport class MyOrderService extends AbstractService {\n public repository: MyOrderRepository\n\n constructor(parent: Router, repository: MyOrderRepository) {\n super(parent)\n this.repository = repository\n }\n\n getBasePath() {\n return 'me'\n }\n\n registerRoutes(parent: Router) {\n // Overwrite this function to be able to handle /me/active-cart path.\n const basePath = this.getBasePath()\n const router = Router({ mergeParams: true })\n\n this.extraRoutes(router)\n\n router.get('/orders/', this.get.bind(this))\n router.get('/orders/:id', this.getWithId.bind(this))\n\n router.delete('/orders/:id', this.deleteWithId.bind(this))\n\n router.post('/orders/', this.post.bind(this))\n router.post('/orders/:id', this.postWithId.bind(this))\n\n parent.use(`/${basePath}`, router)\n }\n}\n","import AbstractService from './abstract'\nimport { Router } from 'express'\nimport { PaymentRepository } from '../repositories/payment'\n\nexport class MyPaymentService extends AbstractService {\n public repository: PaymentRepository\n\n constructor(parent: Router, repository: PaymentRepository) {\n super(parent)\n this.repository = repository\n }\n\n getBasePath() {\n return 'me/payments'\n }\n}\n","import AbstractService from './abstract'\nimport { Request, Response, Router } from 'express'\nimport { OrderRepository } from '../repositories/order'\nimport { getRepositoryContext } from '../repositories/helpers'\n\nexport class OrderService extends AbstractService {\n public repository: OrderRepository\n\n constructor(parent: Router, repository: OrderRepository) {\n super(parent)\n this.repository = repository\n }\n\n getBasePath() {\n return 'orders'\n }\n\n extraRoutes(router: Router) {\n router.post('/import', this.import.bind(this))\n router.get('/order-number=:orderNumber', this.getWithOrderNumber.bind(this))\n }\n\n import(request: Request, response: Response) {\n const importDraft = request.body\n const resource = this.repository.import(\n getRepositoryContext(request),\n importDraft\n )\n return response.status(200).send(resource)\n }\n\n getWithOrderNumber(request: Request, response: Response) {\n const resource = this.repository.getWithOrderNumber(\n getRepositoryContext(request),\n request.params.orderNumber,\n request.query\n )\n if (resource) {\n return response.status(200).send(resource)\n }\n return response.status(404).send('Not found')\n }\n}\n","import AbstractService from './abstract'\nimport { Router } from 'express'\nimport { PaymentRepository } from '../repositories/payment'\n\nexport class PaymentService extends AbstractService {\n public repository: PaymentRepository\n\n constructor(parent: Router, repository: PaymentRepository) {\n super(parent)\n this.repository = repository\n }\n\n getBasePath() {\n return 'payments'\n }\n}\n","import AbstractService from './abstract'\nimport { Router } from 'express'\nimport { ProductRepository } from '../repositories/product'\n\nexport class ProductService extends AbstractService {\n public repository: ProductRepository\n\n constructor(parent: Router, repository: ProductRepository) {\n super(parent)\n this.repository = repository\n }\n\n getBasePath() {\n return 'products'\n }\n}\n","import { ProductDiscountRepository } from '../repositories/product-discount'\nimport AbstractService from './abstract'\nimport { Request, Response, Router } from 'express'\nimport { getRepositoryContext } from '../repositories/helpers'\n\nexport class ProductDiscountService extends AbstractService {\n public repository: ProductDiscountRepository\n\n constructor(parent: Router, repository: ProductDiscountRepository) {\n super(parent)\n this.repository = repository\n }\n\n getBasePath() {\n return 'product-discounts'\n }\n\n extraRoutes(router: Router) {\n router.get('/key=:key', this.getWithKey.bind(this))\n }\n\n getWithKey(request: Request, response: Response) {\n const resource = this.repository.getWithKey(\n getRepositoryContext(request),\n request.params.key\n )\n if (resource) {\n return response.status(200).send(resource)\n }\n return response.status(404).send('Not found')\n }\n}\n","import { ProductProjectionRepository } from './../repositories/product-projection'\nimport AbstractService from './abstract'\nimport { Request, Response, Router } from 'express'\nimport { getRepositoryContext } from '../repositories/helpers'\n\nexport class ProductProjectionService extends AbstractService {\n public repository: ProductProjectionRepository\n\n constructor(parent: Router, repository: ProductProjectionRepository) {\n super(parent)\n this.repository = repository\n }\n\n getBasePath() {\n return 'product-projections'\n }\n\n extraRoutes(router: Router) {\n router.get('/search', this.search.bind(this))\n }\n\n search(request: Request, response: Response) {\n const resource = this.repository.search(\n getRepositoryContext(request),\n request.query\n )\n return response.status(200).send(resource)\n }\n}\n","import { ProductTypeRepository } from '../repositories/product-type'\nimport AbstractService from './abstract'\nimport { Request, Response, Router } from 'express'\nimport { getRepositoryContext } from '../repositories/helpers'\n\nexport class ProductTypeService extends AbstractService {\n public repository: ProductTypeRepository\n\n constructor(parent: Router, repository: ProductTypeRepository) {\n super(parent)\n this.repository = repository\n }\n\n getBasePath() {\n return 'product-types'\n }\n\n extraRoutes(router: Router) {\n router.get('/key=:key', this.getWithKey.bind(this))\n }\n\n getWithKey(request: Request, response: Response) {\n const resource = this.repository.getWithKey(\n getRepositoryContext(request),\n request.params.key\n )\n if (resource) {\n return response.status(200).send(resource)\n }\n return response.status(404).send('Not found')\n }\n}\n","import { ShippingMethodRepository } from '../repositories/shipping-method'\nimport AbstractService from './abstract'\nimport { Router } from 'express'\n\nexport class ShippingMethodService extends AbstractService {\n public repository: ShippingMethodRepository\n\n constructor(parent: Router, repository: ShippingMethodRepository) {\n super(parent)\n this.repository = repository\n this.registerRoutes(parent)\n }\n\n getBasePath() {\n return 'shipping-methods'\n }\n\n extraRoutes(parent: Router) {\n parent.get('/matching-cart', this.get.bind(this))\n }\n}\n","import { ShoppingListRepository } from './../repositories/shopping-list'\nimport AbstractService from './abstract'\nimport { Router } from 'express'\n\nexport class ShoppingListService extends AbstractService {\n public repository: ShoppingListRepository\n\n constructor(parent: Router, repository: ShoppingListRepository) {\n super(parent)\n this.repository = repository\n }\n\n getBasePath() {\n return 'shopping-lists'\n }\n}\n","import { StateRepository } from '../repositories/state'\nimport AbstractService from './abstract'\nimport { Router } from 'express'\n\nexport class StateService extends AbstractService {\n public repository: StateRepository\n\n constructor(parent: Router, repository: StateRepository) {\n super(parent)\n this.repository = repository\n }\n\n getBasePath() {\n return 'states'\n }\n}\n","import AbstractService from './abstract'\nimport { Router, Request, Response } from 'express'\nimport { StoreRepository } from '../repositories/store'\nimport { getRepositoryContext } from '../repositories/helpers'\n\nexport class StoreService extends AbstractService {\n public repository: StoreRepository\n\n constructor(parent: Router, repository: StoreRepository) {\n super(parent)\n this.repository = repository\n }\n\n getBasePath() {\n return 'stores'\n }\n\n extraRoutes(router: Router) {\n router.get('/key=:key', this.getWithKey.bind(this))\n }\n\n getWithKey(request: Request, response: Response) {\n const resource = this.repository.getWithKey(\n getRepositoryContext(request),\n request.params.key\n )\n if (resource) {\n return response.status(200).send(resource)\n }\n return response.status(404).send('Not found')\n }\n}\n","import AbstractService from './abstract'\nimport { Router } from 'express'\nimport { SubscriptionRepository } from '../repositories/subscription'\n\nexport class SubscriptionService extends AbstractService {\n public repository: SubscriptionRepository\n\n constructor(parent: Router, repository: SubscriptionRepository) {\n super(parent)\n this.repository = repository\n }\n\n getBasePath() {\n return 'subscriptions'\n }\n}\n","import { TaxCategoryRepository } from '../repositories/tax-category'\nimport AbstractService from './abstract'\nimport { Request, Response, Router } from 'express'\nimport { getRepositoryContext } from '../repositories/helpers'\n\nexport class TaxCategoryService extends AbstractService {\n public repository: TaxCategoryRepository\n\n constructor(parent: Router, repository: TaxCategoryRepository) {\n super(parent)\n this.repository = repository\n }\n\n getBasePath() {\n return 'tax-categories'\n }\n\n extraRoutes(router: Router) {\n router.get('/key=:key', this.getWithKey.bind(this))\n }\n\n getWithKey(request: Request, response: Response) {\n const resource = this.repository.getWithKey(\n getRepositoryContext(request),\n request.params.key\n )\n if (resource) {\n return response.status(200).send(resource)\n }\n return response.status(404).send('Not found')\n }\n}\n","import AbstractService from './abstract'\nimport { Router } from 'express'\nimport { TypeRepository } from '../repositories/type'\n\nexport class TypeService extends AbstractService {\n public repository: TypeRepository\n\n constructor(parent: Router, repository: TypeRepository) {\n super(parent)\n this.repository = repository\n }\n\n getBasePath() {\n return 'types'\n }\n}\n","import { Router } from 'express'\nimport AbstractService from './abstract'\nimport { ZoneRepository } from '../repositories/zone'\n\nexport class ZoneService extends AbstractService {\n public repository: ZoneRepository\n\n constructor(parent: Router, repository: ZoneRepository) {\n super(parent)\n this.repository = repository\n }\n\n getBasePath() {\n return 'zones'\n }\n}\n","import { CartService } from './cart'\nimport { CartDiscountService } from './cart-discount'\nimport { CategoryServices } from './category'\nimport { ChannelService } from './channel'\nimport { CustomObjectService } from './custom-object'\nimport { CustomerService } from './customer'\nimport { CustomerGroupService } from './customer-group'\nimport { DiscountCodeService } from './discount-code'\nimport { ExtensionServices } from './extension'\nimport { InventoryEntryService } from './inventory-entry'\nimport { MyCartService } from './my-cart'\nimport { MyCustomerService } from './my-customer'\nimport { MyOrderService } from './my-order'\nimport { MyPaymentService } from './my-payment'\nimport { OrderService } from './order'\nimport { PaymentService } from './payment'\nimport { ProductService } from './product'\nimport { ProductDiscountService } from './product-discount'\nimport { ProductProjectionService } from './product-projection'\nimport { ProductTypeService } from './product-type'\nimport { ShippingMethodService } from './shipping-method'\nimport { ShoppingListService } from './shopping-list'\nimport { StateService } from './state'\nimport { StoreService } from './store'\nimport { SubscriptionService } from './subscription'\nimport { TaxCategoryService } from './tax-category'\nimport { TypeService } from './type'\nimport { ZoneService } from './zone'\n\nexport const createServices = (router: any, repos: any) => ({\n category: new CategoryServices(router, repos['category']),\n cart: new CartService(router, repos['cart'], repos['order']),\n 'cart-discount': new CartDiscountService(router, repos['cart-discount']),\n customer: new CustomerService(router, repos['customer']),\n channel: new ChannelService(router, repos['channel']),\n 'customer-group': new CustomerGroupService(router, repos['customer-group']),\n 'discount-code': new DiscountCodeService(router, repos['discount-code']),\n extension: new ExtensionServices(router, repos['extension']),\n 'inventory-entry': new InventoryEntryService(\n router,\n repos['inventory-entry']\n ),\n 'key-value-document': new CustomObjectService(\n router,\n repos['key-value-document']\n ),\n order: new OrderService(router, repos['order']),\n payment: new PaymentService(router, repos['payment']),\n 'my-cart': new MyCartService(router, repos['my-cart']),\n 'my-order': new MyOrderService(router, repos['my-order']),\n 'my-customer': new MyCustomerService(router, repos['my-customer']),\n 'my-payment': new MyPaymentService(router, repos['my-payment']),\n 'shipping-method': new ShippingMethodService(\n router,\n repos['shipping-method']\n ),\n 'product-type': new ProductTypeService(router, repos['product-type']),\n product: new ProductService(router, repos['product']),\n 'product-discount': new ProductDiscountService(\n router,\n repos['product-discount']\n ),\n 'product-projection': new ProductProjectionService(\n router,\n repos['product-projection']\n ),\n 'shopping-list': new ShoppingListService(router, repos['shopping-list']),\n state: new StateService(router, repos['state']),\n store: new StoreService(router, repos['store']),\n subscription: new SubscriptionService(router, repos['subscription']),\n 'tax-category': new TaxCategoryService(router, repos['tax-category']),\n type: new TypeService(router, repos['type']),\n zone: new ZoneService(router, repos['zone']),\n})\n"],"mappings":"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","names":["import_express","perplex","uuidv4","assert","express","bodyParser","auth","import_uuid","uuidv4","import_uuid","deepEqual","uuidv4","import_uuid","uuidv4","import_assert","import_assert","assert","assert","import_uuid","uuidv4","import_uuid","import_deep_equal","deepEqual","uuidv4","import_perplex","import_pratt","generateMatchFunc","getLexer","perplex","Parser","import_deep_equal","deepEqual","import_uuid","uuidv4","import_express","import_uuid","uuidv4","import_express","import_express","import_express","express","morgan","nock","supertest"]}