@labdigital/commercetools-mock 0.10.1 → 0.11.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ctMock.ts","../src/storage/abstract.ts","../src/storage/in-memory.ts","../src/exceptions.ts","../src/helpers.ts","../src/lib/expandParser.ts","../src/lib/predicateParser.ts","../src/lib/haversine.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/order-edit.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-selection.ts","../src/repositories/product-type.ts","../src/repositories/project.ts","../src/repositories/quote.ts","../src/repositories/quote-request.ts","../src/repositories/review.ts","../src/repositories/shipping-method.ts","../src/repositories/shopping-list.ts","../src/repositories/staged-quote.ts","../src/repositories/standalone-price.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 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 { ProjectService } from './services/project'\nimport { createRepositories, RepositoryMap } 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 | null\n private _repositories: RepositoryMap | null\n private _projectService?: ProjectService\n\n constructor(options: Partial<CommercetoolsMockOptions> = {}) {\n this.options = { ...DEFAULT_OPTIONS, ...options }\n this._services = null\n this._repositories = null\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 if (this._repositories === null) {\n throw new Error('repositories not initialized yet')\n }\n\n return new ProjectAPI(\n projectKey || this.options.defaultProjectKey!,\n this._repositories,\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 this._repositories = createRepositories(this._storage)\n\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 // Register the rest api services in the router\n this._services = createServices(projectRouter, this._repositories)\n this._projectService = new ProjectService(\n projectRouter,\n this._repositories.project as ProjectRepository\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 {\n BaseResource,\n Project,\n QueryParam,\n ResourceIdentifier\n} from '@commercetools/platform-sdk'\nimport { PagedQueryResponseMap, ResourceMap, ResourceType } from '../types'\n\nexport type GetParams = {\n expand?: string[]\n}\n\nexport type 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 ResourceType>(\n projectKey: string,\n typeId: RT\n ): Array<ResourceMap[RT]>\n\n abstract add<RT extends ResourceType>(\n projectKey: string,\n typeId: RT,\n obj: ResourceMap[RT]\n ): void\n\n abstract get<RT extends ResourceType>(\n projectKey: string,\n typeId: RT,\n id: string,\n params?: GetParams\n ): ResourceMap[RT] | null\n\n abstract getByKey<RT extends ResourceType>(\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 ResourceType>(\n projectKey: string,\n typeId: RT,\n id: string,\n params: GetParams\n ): ResourceMap[RT] | null\n\n abstract query<RT extends ResourceType>(\n projectKey: string,\n typeId: RT,\n params: QueryParams\n ): PagedQueryResponseMap[RT]\n\n abstract getByResourceIdentifier<RT extends ResourceType>(\n projectKey: string,\n identifier: ResourceIdentifier\n ): ResourceMap[RT] | null\n\n abstract expand<T>(\n projectKey: string,\n obj: T,\n clause: undefined | string | string[]\n ): T\n}\n\nexport type ProjectStorage = {\n [index in ResourceType]: Map<string, BaseResource>\n}\n","import {\n Cart,\n CartDiscount,\n Category,\n Channel,\n Customer,\n CustomerGroup,\n CustomObject,\n DiscountCode,\n Extension,\n InvalidInputError,\n InventoryEntry,\n Order,\n PagedQueryResponse,\n Payment,\n Product,\n ProductDiscount,\n ProductProjection,\n ProductType,\n Project,\n Quote,\n QuoteRequest,\n Reference,\n ResourceIdentifier,\n ShippingMethod,\n ShoppingList,\n StagedQuote,\n State,\n Store,\n Subscription,\n TaxCategory,\n Type,\n Zone,\n} from '@commercetools/platform-sdk'\nimport assert from 'assert'\nimport { CommercetoolsError } from '../exceptions'\nimport { cloneObject } from '../helpers'\nimport { parseExpandClause } from '../lib/expandParser'\nimport { parseQueryExpression } from '../lib/predicateParser'\nimport {\n PagedQueryResponseMap,\n ResourceMap,\n ResourceType,\n Writable,\n} from '../types'\nimport {\n AbstractStorage,\n GetParams,\n ProjectStorage,\n QueryParams,\n} from './abstract'\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 quote: new Map<string, Quote>(),\n 'quote-request': new Map<string, QuoteRequest>(),\n 'product-discount': new Map<string, ProductDiscount>(),\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 'staged-quote': new Map<string, StagedQuote>(),\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 ResourceType>(\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 ResourceType>(\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 ResourceType>(\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 ResourceType>(\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 ResourceType>(\n projectKey: string,\n typeId: RT,\n id: string,\n params: GetParams = {}\n ): ResourceMap[RT] | 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)\n }\n return resource\n }\n\n query<RT extends ResourceType>(\n projectKey: string,\n typeId: RT,\n params: QueryParams\n ): PagedQueryResponseMap[RT] {\n const store = this.forProjectKey(projectKey)[typeId]\n if (!store) {\n throw new Error('No type')\n }\n\n let resources = this.all<RT>(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.map(cloneObject),\n } as PagedQueryResponseMap[RT]\n }\n\n search(\n projectKey: string,\n typeId: ResourceType,\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 ResourceType>(\n projectKey: string,\n identifier: ResourceIdentifier\n ): ResourceMap[RT] | null {\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 null\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 null\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","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 { ParsedQs } from 'qs'\nimport { v4 as uuidv4 } from 'uuid'\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","/**\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","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 { GetParams } from 'repositories/abstract'\nimport { getBaseResourceProperties } from './helpers'\nimport { AbstractStorage } from './storage'\nimport { RepositoryMap } from './repositories'\nimport { ResourceMap, ResourceType } from './types'\n\nexport class ProjectAPI {\n private projectKey: string\n private _storage: AbstractStorage\n private _repositories: RepositoryMap\n\n constructor(\n projectKey: string,\n repositories: RepositoryMap,\n storage: AbstractStorage\n ) {\n this.projectKey = projectKey\n this._storage = storage\n this._repositories = repositories\n }\n\n add<T extends keyof RepositoryMap & keyof ResourceMap>(\n typeId: T,\n resource: ResourceMap[T]\n ) {\n const repository = this._repositories[typeId]\n if (repository) {\n this._storage.add(this.projectKey, typeId, {\n ...getBaseResourceProperties(),\n ...resource,\n })\n } else {\n throw new Error(`Service for ${typeId} not implemented yet`)\n }\n }\n\n get<RT extends ResourceType>(\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>(typeId: RT): RepositoryMap[RT] {\n const repository = this._repositories[typeId]\n if (repository !== undefined) {\n return 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 {\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 { v4 as uuidv4 } from 'uuid'\nimport { CommercetoolsError } from '../exceptions'\nimport { AbstractStorage } from '../storage'\nimport { RepositoryContext } from './abstract'\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 { Update } from '@commercetools/platform-sdk'\nimport { Request, Response, Router } from 'express'\nimport { getRepositoryContext } from '../repositories/helpers'\nimport { ProjectRepository } from '../repositories/project'\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} from '@commercetools/platform-sdk'\nimport { v4 as uuidv4 } from 'uuid'\nimport { CommercetoolsError } from '../exceptions'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { createCustomFields } from './helpers'\n\nexport class CartRepository extends AbstractResourceRepository<'cart'> {\n getTypeId() {\n return 'cart' as const\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 country: draft.country,\n customLineItems: [],\n lineItems,\n locale: draft.locale,\n taxCalculationMode: draft.taxCalculationMode ?? 'LineItemLevel',\n taxMode: draft.taxMode ?? 'Platform',\n taxRoundingMode: draft.taxRoundingMode ?? 'HalfEven',\n totalPrice: {\n type: 'centPrecision',\n centAmount: 0,\n currencyCode: draft.currency,\n fractionDigits: 0,\n },\n shippingMode: 'Single',\n shipping: [],\n origin: draft.origin ?? 'Customer',\n refusedGifts: [],\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 productSlug: product.masterData.current.slug,\n productType: product.productType,\n name: product.masterData.current.name,\n variant,\n price: price,\n taxedPricePortions: [],\n perMethodTaxRate: [],\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 productSlug: product.masterData.current.slug,\n productType: product.productType,\n name: product.masterData.current.name,\n variant,\n price: price,\n totalPrice: {\n ...price.value,\n centAmount: price.value.centAmount * quant,\n },\n taxedPricePortions: [],\n perMethodTaxRate: [],\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 {\n BaseResource,\n Project,\n ResourceNotFoundError,\n UpdateAction,\n} from '@commercetools/platform-sdk'\nimport deepEqual from 'deep-equal'\nimport { CommercetoolsError } from '../exceptions'\nimport { cloneObject } from '../helpers'\nimport { AbstractStorage } from '../storage'\nimport { ResourceMap, ResourceType, ShallowWritable } from './../types'\nimport { checkConcurrentModification } from './errors'\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}\n\nexport abstract class AbstractRepository<R extends BaseResource | Project> {\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: R): void\n\n abstract saveUpdate(\n { projectKey }: RepositoryContext,\n version: number,\n resource: R\n ): void\n\n processUpdateActions(\n context: RepositoryContext,\n resource: R,\n version: number,\n actions: UpdateAction[]\n ): R {\n // Deep-copy\n const updatedResource = cloneObject(resource) as ShallowWritable<R>\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\n }\n\n abstract postProcessResource(resource: any): any\n}\n\nexport abstract class AbstractResourceRepository<\n T extends ResourceType\n> extends AbstractRepository<ResourceMap[T]> {\n abstract create(context: RepositoryContext, draft: any): ResourceMap[T]\n abstract getTypeId(): T\n\n constructor(storage: AbstractStorage) {\n super(storage)\n }\n\n postProcessResource(resource: ResourceMap[T]): ResourceMap[T] {\n return resource\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 ): ResourceMap[T] | 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 ): ResourceMap[T] | 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 ): ResourceMap[T] | 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(\n context: RepositoryContext,\n resource: ShallowWritable<ResourceMap[T]>\n ) {\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: ShallowWritable<ResourceMap[T]>\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 { ConcurrentModificationError } 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} 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<'cart-discount'> {\n getTypeId() {\n return 'cart-discount' as const\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 {\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} from '@commercetools/platform-sdk'\nimport { v4 as uuidv4 } from 'uuid'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { createCustomFields } from './helpers'\n\nexport class CategoryRepository extends AbstractResourceRepository<'category'> {\n getTypeId() {\n return 'category' as const\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} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { createAddress, createCustomFields } from './helpers'\n\nexport class ChannelRepository extends AbstractResourceRepository<'channel'> {\n getTypeId() {\n return 'channel' as const\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} from '@commercetools/platform-sdk'\nimport { CommercetoolsError } from '../exceptions'\nimport { cloneObject, getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { checkConcurrentModification } from './errors'\n\nexport class CustomObjectRepository extends AbstractResourceRepository<'key-value-document'> {\n getTypeId() {\n return 'key-value-document' as const\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) as Writable<CustomObject>\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(context.projectKey, this.getTypeId())\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} from '@commercetools/platform-sdk'\nimport { Writable } from 'types'\nimport { CommercetoolsError } from '../exceptions'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class CustomerRepository extends AbstractResourceRepository<'customer'> {\n getTypeId() {\n return 'customer' as const\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} 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<'customer-group'> {\n getTypeId() {\n return 'customer-group' as const\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} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { createCustomFields } from './helpers'\n\nexport class DiscountCodeRepository extends AbstractResourceRepository<'discount-code'> {\n getTypeId() {\n return 'discount-code' as const\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} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { maskSecretValue } from '../lib/masking'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class ExtensionRepository extends AbstractResourceRepository<'extension'> {\n getTypeId() {\n return 'extension' as const\n }\n\n postProcessResource(resource: Extension): Extension {\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 )\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} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { createCustomFields } from './helpers'\n\nexport class InventoryEntryRepository extends AbstractResourceRepository<'inventory-entry'> {\n getTypeId() {\n return 'inventory-entry' as const\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 {\n CartReference,\n MyOrderFromCartDraft,\n Order,\n} from '@commercetools/platform-sdk'\nimport assert from 'assert'\nimport { RepositoryContext } from './abstract'\nimport { OrderRepository } from './order'\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 {\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 State,\n Store,\n} from '@commercetools/platform-sdk'\nimport assert from 'assert'\nimport { CommercetoolsError } from '../exceptions'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport {\n AbstractResourceRepository,\n QueryParams,\n RepositoryContext,\n} from './abstract'\nimport {\n createCustomFields,\n createPrice,\n createTypedMoney,\n resolveStoreReference,\n} from './helpers'\n\nexport class OrderRepository extends AbstractResourceRepository<'order'> {\n getTypeId() {\n return 'order' as const\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 shippingMode: cart.shippingMode,\n shipping: cart.shipping,\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 shippingMode: 'Single',\n shipping: [],\n\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 taxedPricePortions: [],\n perMethodTaxRate: [],\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 priceMode: draft.priceMode,\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 OrderEdit,\n OrderEditDraft,\n OrderEditResult,\n OrderEditUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class OrderEditRepository extends AbstractResourceRepository<'order-edit'> {\n getTypeId() {\n return 'order-edit' as const\n }\n\n create(context: RepositoryContext, draft: OrderEditDraft): OrderEdit {\n const resource: OrderEdit = {\n ...getBaseResourceProperties(),\n stagedActions: draft.stagedActions ?? [],\n resource: draft.resource,\n result: {\n type: 'NotProcessed',\n } as OrderEditResult,\n }\n this.saveNew(context, resource)\n return resource\n }\n\n actions: Partial<\n Record<\n OrderEditUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<OrderEdit>,\n action: any\n ) => void\n >\n > = {}\n}\n","import {\n Payment,\n PaymentAddTransactionAction,\n PaymentChangeTransactionStateAction,\n PaymentDraft,\n PaymentSetCustomFieldAction,\n PaymentSetCustomTypeAction,\n PaymentTransitionStateAction,\n State,\n StateReference,\n Transaction,\n TransactionDraft,\n} from '@commercetools/platform-sdk'\nimport { v4 as uuidv4 } from 'uuid'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport {\n createCustomFields,\n createTypedMoney,\n getReferenceFromResourceIdentifier,\n} from './helpers'\n\nexport class PaymentRepository extends AbstractResourceRepository<'payment'> {\n getTypeId() {\n return 'payment' as const\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} from '@commercetools/platform-sdk'\nimport { v4 as uuidv4 } from 'uuid'\nimport { Writable } from '../types'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { getReferenceFromResourceIdentifier } from './helpers'\nimport deepEqual from 'deep-equal'\n\nexport class ProductRepository extends AbstractResourceRepository<'product'> {\n getTypeId() {\n return 'product' as const\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} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { createTypedMoney } from './helpers'\n\nexport class ProductDiscountRepository extends AbstractResourceRepository<'product-discount'> {\n getTypeId() {\n return 'product-discount' as const\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 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 { Writable } from '../types'\nimport { nestedLookup } from '../helpers'\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[] =\n !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) => {\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 {\n const obj = !staged ? product.masterData.current : product.masterData.staged\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 { AbstractStorage } from '../storage'\nimport { ProductProjectionSearch } from '../product-projection-search'\nimport { QueryParamsAsArray } from '../helpers'\n\nexport class ProductProjectionRepository extends AbstractResourceRepository<'product-projection'> {\n protected _searchService: ProductProjectionSearch\n\n constructor(storage: AbstractStorage) {\n super(storage)\n this._searchService = new ProductProjectionSearch(storage)\n }\n\n getTypeId() {\n return 'product-projection' as const\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 const response = 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 return {\n ...response,\n results: response.results.map((r) =>\n this._searchService.transform(r, false)\n ),\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 {\n ProductSelection,\n ProductSelectionDraft,\n Review,\n ReviewUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class ProductSelectionRepository extends AbstractResourceRepository<'product-selection'> {\n getTypeId() {\n return 'product-selection' as const\n }\n\n create(\n context: RepositoryContext,\n draft: ProductSelectionDraft\n ): ProductSelection {\n const resource: ProductSelection = {\n ...getBaseResourceProperties(),\n productCount: 0,\n name: draft.name,\n type: 'individual',\n }\n this.saveNew(context, resource)\n return resource\n }\n\n actions: Partial<\n Record<\n ReviewUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<Review>,\n action: any\n ) => void\n >\n > = {}\n}\n","import {\n AttributeDefinition,\n AttributeDefinitionDraft,\n AttributeType,\n ProductType,\n ProductTypeAddAttributeDefinitionAction,\n ProductTypeChangeAttributeOrderByNameAction,\n ProductTypeChangeLabelAction,\n ProductTypeChangeLocalizedEnumValueLabelAction,\n ProductTypeDraft,\n ProductTypeRemoveAttributeDefinitionAction,\n ProductTypeRemoveEnumValuesAction,\n ProductTypeUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class ProductTypeRepository extends AbstractResourceRepository<'product-type'> {\n getTypeId() {\n return 'product-type' as const\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 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 changeAttributeOrderByName: (\n context: RepositoryContext,\n resource: Writable<ProductType>,\n { attributeNames }: ProductTypeChangeAttributeOrderByNameAction\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 attributeNames.forEach((attrName) => {\n const attr = attrs.get(attrName)\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 !== attrName)\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 ProjectChangeMessagesConfigurationAction,\n ProjectChangeNameAction,\n ProjectChangeOrderSearchStatusAction,\n ProjectChangeProductSearchIndexingEnabledAction,\n ProjectSetExternalOAuthAction,\n ProjectSetShippingRateInputTypeAction,\n ProjectUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { maskSecretValue } from '../lib/masking'\nimport { Writable } from '../types'\nimport { AbstractRepository, RepositoryContext } from './abstract'\n\nexport class ProjectRepository extends AbstractRepository<Project> {\n get(context: RepositoryContext): Project | null {\n const resource = this._storage.getProject(context.projectKey)\n return this.postProcessResource(resource)\n }\n\n postProcessResource(resource: Project): Project {\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 changeMessagesConfiguration: (\n context: RepositoryContext,\n resource: Writable<Project>,\n { messagesConfiguration }: ProjectChangeMessagesConfigurationAction\n ) => {\n resource.messages.enabled = messagesConfiguration.enabled\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 Quote,\n QuoteDraft,\n QuoteUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class QuoteRepository extends AbstractResourceRepository<'quote'> {\n getTypeId() {\n return 'quote' as const\n }\n\n create(context: RepositoryContext, draft: QuoteDraft): Quote {\n throw new Error('not implemented')\n }\n\n actions: Partial<\n Record<\n QuoteUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<Quote>,\n action: any\n ) => void\n >\n > = {}\n}\n","import {\n QuoteRequest,\n QuoteRequestDraft,\n QuoteRequestUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class QuoteRequestRepository extends AbstractResourceRepository<'quote-request'> {\n getTypeId() {\n return 'quote-request' as const\n }\n\n create(context: RepositoryContext, draft: QuoteRequestDraft): QuoteRequest {\n throw new Error('not implemented')\n }\n\n actions: Partial<\n Record<\n QuoteRequestUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<QuoteRequest>,\n action: any\n ) => void\n >\n > = {}\n}\n","import {\n Review,\n ReviewDraft,\n ReviewUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class ReviewRepository extends AbstractResourceRepository<'review'> {\n getTypeId() {\n return 'review' as const\n }\n\n create(context: RepositoryContext, draft: ReviewDraft): Review {\n const resource: Review = {\n ...getBaseResourceProperties(),\n includedInStatistics: false,\n }\n this.saveNew(context, resource)\n return resource\n }\n\n actions: Partial<\n Record<\n ReviewUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<Review>,\n action: any\n ) => void\n >\n > = {}\n}\n","import {\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 deepEqual from 'deep-equal'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport {\n createCustomFields,\n createTypedMoney,\n getReferenceFromResourceIdentifier,\n} from './helpers'\n\nexport class ShippingMethodRepository extends AbstractResourceRepository<'shipping-method'> {\n getTypeId() {\n return 'shipping-method' as const\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 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<'shopping-list'> {\n getTypeId() {\n return 'shopping-list' as const\n }\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 {\n Quote,\n StagedQuote,\n StagedQuoteDraft,\n StagedQuoteUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class StagedQuoteRepository extends AbstractResourceRepository<'staged-quote'> {\n getTypeId() {\n return 'staged-quote' as const\n }\n\n create(context: RepositoryContext, draft: StagedQuoteDraft): StagedQuote {\n throw new Error('not implemented')\n }\n\n actions: Partial<\n Record<\n StagedQuoteUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<Quote>,\n action: any\n ) => void\n >\n > = {}\n}\n","import {\n Review,\n StandalonePrice,\n StandalonePriceUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class StandAlonePriceRepository extends AbstractResourceRepository<'standalone-price'> {\n getTypeId() {\n return 'standalone-price' as const\n }\n\n create(context: RepositoryContext, draft: StandalonePrice): StandalonePrice {\n const resource: StandalonePrice = {\n ...getBaseResourceProperties(),\n active: draft.active,\n sku: draft.sku,\n value: draft.value,\n }\n this.saveNew(context, resource)\n return resource\n }\n\n actions: Partial<\n Record<\n StandalonePriceUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<Review>,\n action: any\n ) => void\n >\n > = {}\n}\n","import {\n State,\n StateChangeKeyAction,\n StateDraft,\n StateReference,\n StateSetDescriptionAction,\n StateSetNameAction,\n StateSetRolesAction,\n StateSetTransitionsAction,\n StateUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { getReferenceFromResourceIdentifier } from './helpers'\n\nexport class StateRepository extends AbstractResourceRepository<'state'> {\n getTypeId() {\n return 'state' as const\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 ChannelReference,\n ChannelResourceIdentifier,\n Store,\n StoreDraft,\n StoreSetCustomFieldAction,\n StoreSetCustomTypeAction,\n StoreSetDistributionChannelsAction,\n StoreSetLanguagesAction,\n StoreSetNameAction,\n StoreUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport {\n createCustomFields,\n getReferenceFromResourceIdentifier,\n} from './helpers'\n\nexport class StoreRepository extends AbstractResourceRepository<'store'> {\n getTypeId() {\n return 'store' as const\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 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 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<'subscription'> {\n getTypeId() {\n return 'subscription' as const\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 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 { v4 as uuidv4 } from 'uuid'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class TaxCategoryRepository extends AbstractResourceRepository<'tax-category'> {\n getTypeId() {\n return 'tax-category' as const\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 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 FieldDefinition,\n InvalidOperationError,\n Type,\n TypeAddEnumValueAction,\n TypeAddFieldDefinitionAction,\n TypeChangeEnumValueLabelAction,\n TypeChangeFieldDefinitionOrderAction,\n TypeChangeNameAction,\n TypeDraft,\n TypeRemoveFieldDefinitionAction,\n TypeSetDescriptionAction,\n TypeUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { isEqual } from 'lodash'\nimport { CommercetoolsError } from '../exceptions'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class TypeRepository extends AbstractResourceRepository<'type'> {\n getTypeId() {\n return 'type' as const\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 Zone,\n ZoneAddLocationAction,\n ZoneChangeNameAction,\n ZoneDraft,\n ZoneRemoveLocationAction,\n ZoneSetDescriptionAction,\n ZoneSetKeyAction,\n ZoneUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class ZoneRepository extends AbstractResourceRepository<'zone'> {\n getTypeId() {\n return 'zone' as const\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 { OrderEditRepository } from './order-edit'\nimport { PaymentRepository } from './payment'\nimport { ProductRepository } from './product'\nimport { ProductDiscountRepository } from './product-discount'\nimport { ProductProjectionRepository } from './product-projection'\nimport { ProductSelectionRepository } from './product-selection'\nimport { ProductTypeRepository } from './product-type'\nimport { ProjectRepository } from './project'\nimport { QuoteRepository } from './quote'\nimport { QuoteRequestRepository } from './quote-request'\nimport { ReviewRepository } from './review'\nimport { ShippingMethodRepository } from './shipping-method'\nimport { ShoppingListRepository } from './shopping-list'\nimport { StagedQuoteRepository } from './staged-quote'\nimport { StandAlonePriceRepository } from './standalone-price'\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 type RepositoryMap = ReturnType<typeof createRepositories>\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 'order-edit': new OrderEditRepository(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 product: new ProductRepository(storage),\n 'product-type': new ProductTypeRepository(storage),\n 'product-discount': new ProductDiscountRepository(storage),\n 'product-projection': new ProductProjectionRepository(storage),\n 'product-selection': new ProductSelectionRepository(storage),\n project: new ProjectRepository(storage),\n review: new ReviewRepository(storage),\n quote: new QuoteRepository(storage),\n 'quote-request': new QuoteRequestRepository(storage),\n 'shipping-method': new ShippingMethodRepository(storage),\n 'shopping-list': new ShoppingListRepository(storage),\n 'staged-quote': new StagedQuoteRepository(storage),\n 'standalone-price': new StandAlonePriceRepository(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 { Request, Response, Router } from 'express'\nimport { ParsedQs } from 'qs'\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<any>\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 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 { Cart, CartDraft, Order } from '@commercetools/platform-sdk'\nimport { Request, Response, Router } from 'express'\nimport { CartRepository } from '../repositories/cart'\nimport { getRepositoryContext } from '../repositories/helpers'\nimport { OrderRepository } from '../repositories/order'\nimport AbstractService from './abstract'\n\nexport class CartService extends AbstractService {\n public repository: CartRepository\n public orderRepository: OrderRepository\n\n constructor(\n parent: Router,\n cartRepository: CartRepository,\n orderRepository: OrderRepository\n ) {\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', this.replicate.bind(this))\n }\n\n replicate(request: Request, response: 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 shipping: [], // TODO: cartOrOrder.shipping,\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","import { Router } from 'express'\nimport { CartDiscountRepository } from '../repositories/cart-discount'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { CategoryRepository } from '../repositories/category'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { ChannelRepository } from '../repositories/channel'\nimport AbstractService from './abstract'\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 { CustomObjectDraft } from '@commercetools/platform-sdk'\nimport { Request, Response, Router } from 'express'\nimport { CustomObjectRepository } from '../repositories/custom-object'\nimport { getRepositoryContext } from '../repositories/helpers'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { v4 as uuidv4 } from 'uuid'\nimport { getBaseResourceProperties } from '../helpers'\nimport { CustomerRepository } from '../repositories/customer'\nimport { getRepositoryContext } from '../repositories/helpers'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { CustomerGroupRepository } from '../repositories/customer-group'\nimport AbstractService from './abstract'\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 { DiscountCodeRepository } from '../repositories/discount-code'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { ExtensionRepository } from '../repositories/extension'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { InventoryEntryRepository } from '../repositories/inventory-entry'\nimport AbstractService from './abstract'\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 { Request, Response, Router } from 'express'\nimport { CartRepository } from '../repositories/cart'\nimport AbstractService from './abstract'\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 { Request, Response, Router } from 'express'\nimport { CustomerRepository } from '../repositories/customer'\nimport { getRepositoryContext } from '../repositories/helpers'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { MyOrderRepository } from '../repositories/my-order'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { PaymentRepository } from '../repositories/payment'\nimport AbstractService from './abstract'\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 { Request, Response, Router } from 'express'\nimport { getRepositoryContext } from '../repositories/helpers'\nimport { OrderRepository } from '../repositories/order'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { PaymentRepository } from '../repositories/payment'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { ProductRepository } from '../repositories/product'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { ProductDiscountRepository } from '../repositories/product-discount'\nimport AbstractService from './abstract'\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","import { Request, Response, Router } from 'express'\nimport { getRepositoryContext } from '../repositories/helpers'\nimport { ProductProjectionRepository } from './../repositories/product-projection'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { ProductTypeRepository } from '../repositories/product-type'\nimport AbstractService from './abstract'\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","import { Router } from 'express'\nimport { ShippingMethodRepository } from '../repositories/shipping-method'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { ShoppingListRepository } from './../repositories/shopping-list'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { StateRepository } from '../repositories/state'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { StoreRepository } from '../repositories/store'\nimport AbstractService from './abstract'\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","import { Router } from 'express'\nimport { SubscriptionRepository } from '../repositories/subscription'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { TaxCategoryRepository } from '../repositories/tax-category'\nimport AbstractService from './abstract'\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","import { Router } from 'express'\nimport { TypeRepository } from '../repositories/type'\nimport AbstractService from './abstract'\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 { ZoneRepository } from '../repositories/zone'\nimport AbstractService from './abstract'\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":["express","uuidv4","uuidv4","uuidv4","uuidv4","uuidv4","uuidv4","assert","assert","assert","assert","uuidv4","uuidv4","uuidv4","deepEqual","uuidv4","perplex","Parser","generateMatchFunc","getLexer","perplex","Parser","deepEqual","deepEqual","uuidv4","uuidv4","uuidv4","uuidv4","Router","Router","Router","Router","Router","Router","express"]}
1
+ {"version":3,"sources":["../src/ctMock.ts","../src/storage/abstract.ts","../src/storage/in-memory.ts","../src/exceptions.ts","../src/helpers.ts","../src/lib/expandParser.ts","../src/lib/predicateParser.ts","../src/lib/haversine.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/order-edit.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-selection.ts","../src/repositories/product-type.ts","../src/repositories/project.ts","../src/repositories/quote.ts","../src/repositories/quote-request.ts","../src/repositories/review.ts","../src/repositories/shipping-method.ts","../src/repositories/shopping-list.ts","../src/repositories/staged-quote.ts","../src/repositories/standalone-price.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 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 { ProjectService } from './services/project'\nimport { createRepositories, RepositoryMap } 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 | null\n private _repositories: RepositoryMap | null\n private _projectService?: ProjectService\n\n constructor(options: Partial<CommercetoolsMockOptions> = {}) {\n this.options = { ...DEFAULT_OPTIONS, ...options }\n this._services = null\n this._repositories = null\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 if (this._repositories === null) {\n throw new Error('repositories not initialized yet')\n }\n\n return new ProjectAPI(\n projectKey || this.options.defaultProjectKey!,\n this._repositories,\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 this._repositories = createRepositories(this._storage)\n\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 // Register the rest api services in the router\n this._services = createServices(projectRouter, this._repositories)\n this._projectService = new ProjectService(\n projectRouter,\n this._repositories.project as ProjectRepository\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 {\n BaseResource,\n Project,\n QueryParam,\n ResourceIdentifier\n} from '@commercetools/platform-sdk'\nimport { PagedQueryResponseMap, ResourceMap, ResourceType } from '../types'\n\nexport type GetParams = {\n expand?: string[]\n}\n\nexport type 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 ResourceType>(\n projectKey: string,\n typeId: RT\n ): Array<ResourceMap[RT]>\n\n abstract add<RT extends ResourceType>(\n projectKey: string,\n typeId: RT,\n obj: ResourceMap[RT]\n ): void\n\n abstract get<RT extends ResourceType>(\n projectKey: string,\n typeId: RT,\n id: string,\n params?: GetParams\n ): ResourceMap[RT] | null\n\n abstract getByKey<RT extends ResourceType>(\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 ResourceType>(\n projectKey: string,\n typeId: RT,\n id: string,\n params: GetParams\n ): ResourceMap[RT] | null\n\n abstract query<RT extends ResourceType>(\n projectKey: string,\n typeId: RT,\n params: QueryParams\n ): PagedQueryResponseMap[RT]\n\n abstract getByResourceIdentifier<RT extends ResourceType>(\n projectKey: string,\n identifier: ResourceIdentifier\n ): ResourceMap[RT] | null\n\n abstract expand<T>(\n projectKey: string,\n obj: T,\n clause: undefined | string | string[]\n ): T\n}\n\nexport type ProjectStorage = {\n [index in ResourceType]: Map<string, BaseResource>\n}\n","import {\n Cart,\n CartDiscount,\n Category,\n Channel,\n Customer,\n CustomerGroup,\n CustomObject,\n DiscountCode,\n Extension,\n InvalidInputError,\n InventoryEntry,\n Order,\n PagedQueryResponse,\n Payment,\n Product,\n ProductDiscount,\n ProductProjection,\n ProductType,\n Project,\n Quote,\n QuoteRequest,\n Reference,\n ResourceIdentifier,\n ShippingMethod,\n ShoppingList,\n StagedQuote,\n State,\n Store,\n Subscription,\n TaxCategory,\n Type,\n Zone,\n} from '@commercetools/platform-sdk'\nimport assert from 'assert'\nimport { CommercetoolsError } from '../exceptions'\nimport { cloneObject } from '../helpers'\nimport { parseExpandClause } from '../lib/expandParser'\nimport { parseQueryExpression } from '../lib/predicateParser'\nimport {\n PagedQueryResponseMap,\n ResourceMap,\n ResourceType,\n Writable,\n} from '../types'\nimport {\n AbstractStorage,\n GetParams,\n ProjectStorage,\n QueryParams,\n} from './abstract'\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 quote: new Map<string, Quote>(),\n 'quote-request': new Map<string, QuoteRequest>(),\n 'product-discount': new Map<string, ProductDiscount>(),\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 'staged-quote': new Map<string, StagedQuote>(),\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 ResourceType>(\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 ResourceType>(\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 ResourceType>(\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 ResourceType>(\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 ResourceType>(\n projectKey: string,\n typeId: RT,\n id: string,\n params: GetParams = {}\n ): ResourceMap[RT] | 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)\n }\n return resource\n }\n\n query<RT extends ResourceType>(\n projectKey: string,\n typeId: RT,\n params: QueryParams\n ): PagedQueryResponseMap[RT] {\n const store = this.forProjectKey(projectKey)[typeId]\n if (!store) {\n throw new Error('No type')\n }\n\n let resources = this.all<RT>(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.map(cloneObject),\n } as PagedQueryResponseMap[RT]\n }\n\n search(\n projectKey: string,\n typeId: ResourceType,\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 ResourceType>(\n projectKey: string,\n identifier: ResourceIdentifier\n ): ResourceMap[RT] | null {\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 null\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 null\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","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 { ParsedQs } from 'qs'\nimport { v4 as uuidv4 } from 'uuid'\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","/**\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","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 { GetParams } from 'repositories/abstract'\nimport { getBaseResourceProperties } from './helpers'\nimport { AbstractStorage } from './storage'\nimport { RepositoryMap } from './repositories'\nimport { ResourceMap, ResourceType } from './types'\n\nexport class ProjectAPI {\n private projectKey: string\n private _storage: AbstractStorage\n private _repositories: RepositoryMap\n\n constructor(\n projectKey: string,\n repositories: RepositoryMap,\n storage: AbstractStorage\n ) {\n this.projectKey = projectKey\n this._storage = storage\n this._repositories = repositories\n }\n\n add<T extends keyof RepositoryMap & keyof ResourceMap>(\n typeId: T,\n resource: ResourceMap[T]\n ) {\n const repository = this._repositories[typeId]\n if (repository) {\n this._storage.add(this.projectKey, typeId, {\n ...getBaseResourceProperties(),\n ...resource,\n })\n } else {\n throw new Error(`Service for ${typeId} not implemented yet`)\n }\n }\n\n get<RT extends ResourceType>(\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>(typeId: RT): RepositoryMap[RT] {\n const repository = this._repositories[typeId]\n if (repository !== undefined) {\n return 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 {\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 { v4 as uuidv4 } from 'uuid'\nimport { CommercetoolsError } from '../exceptions'\nimport { AbstractStorage } from '../storage'\nimport { RepositoryContext } from './abstract'\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 { Update } from '@commercetools/platform-sdk'\nimport { Request, Response, Router } from 'express'\nimport { getRepositoryContext } from '../repositories/helpers'\nimport { ProjectRepository } from '../repositories/project'\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 const updatedResource = this.repository.processUpdateActions(\n getRepositoryContext(request),\n project,\n updateRequest.version,\n updateRequest.actions\n )\n\n return response.status(200).send(updatedResource)\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} from '@commercetools/platform-sdk'\nimport { v4 as uuidv4 } from 'uuid'\nimport { CommercetoolsError } from '../exceptions'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { createCustomFields } from './helpers'\n\nexport class CartRepository extends AbstractResourceRepository<'cart'> {\n getTypeId() {\n return 'cart' as const\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 country: draft.country,\n customLineItems: [],\n lineItems,\n locale: draft.locale,\n taxCalculationMode: draft.taxCalculationMode ?? 'LineItemLevel',\n taxMode: draft.taxMode ?? 'Platform',\n taxRoundingMode: draft.taxRoundingMode ?? 'HalfEven',\n totalPrice: {\n type: 'centPrecision',\n centAmount: 0,\n currencyCode: draft.currency,\n fractionDigits: 0,\n },\n shippingMode: 'Single',\n shipping: [],\n origin: draft.origin ?? 'Customer',\n refusedGifts: [],\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 productSlug: product.masterData.current.slug,\n productType: product.productType,\n name: product.masterData.current.name,\n variant,\n price: price,\n taxedPricePortions: [],\n perMethodTaxRate: [],\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 productSlug: product.masterData.current.slug,\n productType: product.productType,\n name: product.masterData.current.name,\n variant,\n price: price,\n totalPrice: {\n ...price.value,\n centAmount: price.value.centAmount * quant,\n },\n taxedPricePortions: [],\n perMethodTaxRate: [],\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 {\n BaseResource,\n Project,\n ResourceNotFoundError,\n UpdateAction,\n} from '@commercetools/platform-sdk'\nimport deepEqual from 'deep-equal'\nimport { CommercetoolsError } from '../exceptions'\nimport { cloneObject } from '../helpers'\nimport { AbstractStorage } from '../storage'\nimport { ResourceMap, ResourceType, ShallowWritable } from './../types'\nimport { checkConcurrentModification } from './errors'\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}\n\nexport abstract class AbstractRepository<R extends BaseResource | Project> {\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: R): void\n\n abstract saveUpdate(\n { projectKey }: RepositoryContext,\n version: number,\n resource: R\n ): void\n\n processUpdateActions(\n context: RepositoryContext,\n resource: R,\n version: number,\n actions: UpdateAction[]\n ): R {\n // Deep-copy\n const updatedResource = cloneObject(resource) as ShallowWritable<R>\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\n }\n\n abstract postProcessResource(resource: any): any\n}\n\nexport abstract class AbstractResourceRepository<\n T extends ResourceType\n> extends AbstractRepository<ResourceMap[T]> {\n abstract create(context: RepositoryContext, draft: any): ResourceMap[T]\n abstract getTypeId(): T\n\n constructor(storage: AbstractStorage) {\n super(storage)\n }\n\n postProcessResource(resource: ResourceMap[T]): ResourceMap[T] {\n return resource\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 ): ResourceMap[T] | 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 ): ResourceMap[T] | 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 ): ResourceMap[T] | 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(\n context: RepositoryContext,\n resource: ShallowWritable<ResourceMap[T]>\n ) {\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: ShallowWritable<ResourceMap[T]>\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 { ConcurrentModificationError } 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} 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<'cart-discount'> {\n getTypeId() {\n return 'cart-discount' as const\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 {\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} from '@commercetools/platform-sdk'\nimport { v4 as uuidv4 } from 'uuid'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { createCustomFields } from './helpers'\n\nexport class CategoryRepository extends AbstractResourceRepository<'category'> {\n getTypeId() {\n return 'category' as const\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} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { createAddress, createCustomFields } from './helpers'\n\nexport class ChannelRepository extends AbstractResourceRepository<'channel'> {\n getTypeId() {\n return 'channel' as const\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} from '@commercetools/platform-sdk'\nimport { CommercetoolsError } from '../exceptions'\nimport { cloneObject, getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { checkConcurrentModification } from './errors'\n\nexport class CustomObjectRepository extends AbstractResourceRepository<'key-value-document'> {\n getTypeId() {\n return 'key-value-document' as const\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) as Writable<CustomObject>\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(context.projectKey, this.getTypeId())\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} from '@commercetools/platform-sdk'\nimport { Writable } from 'types'\nimport { CommercetoolsError } from '../exceptions'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class CustomerRepository extends AbstractResourceRepository<'customer'> {\n getTypeId() {\n return 'customer' as const\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} 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<'customer-group'> {\n getTypeId() {\n return 'customer-group' as const\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} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { createCustomFields } from './helpers'\n\nexport class DiscountCodeRepository extends AbstractResourceRepository<'discount-code'> {\n getTypeId() {\n return 'discount-code' as const\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} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { maskSecretValue } from '../lib/masking'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class ExtensionRepository extends AbstractResourceRepository<'extension'> {\n getTypeId() {\n return 'extension' as const\n }\n\n postProcessResource(resource: Extension): Extension {\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 )\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} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { createCustomFields } from './helpers'\n\nexport class InventoryEntryRepository extends AbstractResourceRepository<'inventory-entry'> {\n getTypeId() {\n return 'inventory-entry' as const\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 {\n CartReference,\n MyOrderFromCartDraft,\n Order,\n} from '@commercetools/platform-sdk'\nimport assert from 'assert'\nimport { RepositoryContext } from './abstract'\nimport { OrderRepository } from './order'\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 {\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 State,\n Store,\n} from '@commercetools/platform-sdk'\nimport assert from 'assert'\nimport { CommercetoolsError } from '../exceptions'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport {\n AbstractResourceRepository,\n QueryParams,\n RepositoryContext,\n} from './abstract'\nimport {\n createCustomFields,\n createPrice,\n createTypedMoney,\n resolveStoreReference,\n} from './helpers'\n\nexport class OrderRepository extends AbstractResourceRepository<'order'> {\n getTypeId() {\n return 'order' as const\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 shippingMode: cart.shippingMode,\n shipping: cart.shipping,\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 shippingMode: 'Single',\n shipping: [],\n\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 taxedPricePortions: [],\n perMethodTaxRate: [],\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 priceMode: draft.priceMode,\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 OrderEdit,\n OrderEditDraft,\n OrderEditResult,\n OrderEditUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class OrderEditRepository extends AbstractResourceRepository<'order-edit'> {\n getTypeId() {\n return 'order-edit' as const\n }\n\n create(context: RepositoryContext, draft: OrderEditDraft): OrderEdit {\n const resource: OrderEdit = {\n ...getBaseResourceProperties(),\n stagedActions: draft.stagedActions ?? [],\n resource: draft.resource,\n result: {\n type: 'NotProcessed',\n } as OrderEditResult,\n }\n this.saveNew(context, resource)\n return resource\n }\n\n actions: Partial<\n Record<\n OrderEditUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<OrderEdit>,\n action: any\n ) => void\n >\n > = {}\n}\n","import {\n Payment,\n PaymentAddTransactionAction,\n PaymentChangeTransactionStateAction,\n PaymentDraft,\n PaymentSetCustomFieldAction,\n PaymentSetCustomTypeAction,\n PaymentTransitionStateAction,\n State,\n StateReference,\n Transaction,\n TransactionDraft,\n} from '@commercetools/platform-sdk'\nimport { v4 as uuidv4 } from 'uuid'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport {\n createCustomFields,\n createTypedMoney,\n getReferenceFromResourceIdentifier,\n} from './helpers'\n\nexport class PaymentRepository extends AbstractResourceRepository<'payment'> {\n getTypeId() {\n return 'payment' as const\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 ProductAddExternalImageAction,\n ProductRemoveImageAction,\n ProductSetKeyAction,\n ProductTypeReference,\n ProductUpdateAction,\n ProductVariant,\n ProductVariantDraft,\n} from '@commercetools/platform-sdk'\nimport { v4 as uuidv4 } from 'uuid'\nimport { Writable } from '../types'\nimport { getBaseResourceProperties } from '../helpers'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { getReferenceFromResourceIdentifier } from './helpers'\nimport deepEqual from 'deep-equal'\n\nexport class ProductRepository extends AbstractResourceRepository<'product'> {\n getTypeId() {\n return 'product' as const\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 addExternalImage: (\n context: RepositoryContext,\n resource: Writable<Product>,\n { variantId, sku, image, staged }: ProductAddExternalImageAction\n ) => {\n const addImg = (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.images) {\n variant.images = []\n } else {\n const existingImage = variant.images.find((x) => x.url === image.url)\n if (existingImage) {\n throw new Error(\n `Cannot add image '${image.url}' because product '${resource.id}' already has that image.`\n )\n }\n }\n\n // Add image\n variant.images.push(image)\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 addImg(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 addImg(resource.masterData.current)\n }\n checkForStagedChanges(resource)\n\n return resource\n },\n removeImage: (\n context: RepositoryContext,\n resource: Writable<Product>,\n { variantId, sku, imageUrl, staged }: ProductRemoveImageAction\n ) => {\n const removeImg = (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 const variantImages = variant.images ?? []\n const existingImage = variantImages.find((x) => x.url === imageUrl)\n if (!existingImage) {\n throw new Error(\n `Cannot remove image '${imageUrl}' because product '${resource.id}' does not have that image.`\n )\n }\n\n // Remove image\n variant.images = variantImages.filter((image) => image.url !== imageUrl)\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 removeImg(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 removeImg(resource.masterData.current)\n }\n checkForStagedChanges(resource)\n\n return resource\n },\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 // 'moveImageToPosition': () => {},\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} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { createTypedMoney } from './helpers'\n\nexport class ProductDiscountRepository extends AbstractResourceRepository<'product-discount'> {\n getTypeId() {\n return 'product-discount' as const\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 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 { Writable } from '../types'\nimport { nestedLookup } from '../helpers'\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[] =\n !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) => {\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 {\n const obj = !staged ? product.masterData.current : product.masterData.staged\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 { AbstractStorage } from '../storage'\nimport { ProductProjectionSearch } from '../product-projection-search'\nimport { QueryParamsAsArray } from '../helpers'\n\nexport class ProductProjectionRepository extends AbstractResourceRepository<'product-projection'> {\n protected _searchService: ProductProjectionSearch\n\n constructor(storage: AbstractStorage) {\n super(storage)\n this._searchService = new ProductProjectionSearch(storage)\n }\n\n getTypeId() {\n return 'product-projection' as const\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 const response = 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 return {\n ...response,\n results: response.results.map((r) =>\n this._searchService.transform(r, false)\n ),\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 {\n ProductSelection,\n ProductSelectionDraft,\n Review,\n ReviewUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class ProductSelectionRepository extends AbstractResourceRepository<'product-selection'> {\n getTypeId() {\n return 'product-selection' as const\n }\n\n create(\n context: RepositoryContext,\n draft: ProductSelectionDraft\n ): ProductSelection {\n const resource: ProductSelection = {\n ...getBaseResourceProperties(),\n productCount: 0,\n name: draft.name,\n type: 'individual',\n }\n this.saveNew(context, resource)\n return resource\n }\n\n actions: Partial<\n Record<\n ReviewUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<Review>,\n action: any\n ) => void\n >\n > = {}\n}\n","import {\n AttributeDefinition,\n AttributeDefinitionDraft,\n AttributeType,\n ProductType,\n ProductTypeAddAttributeDefinitionAction,\n ProductTypeChangeAttributeOrderByNameAction,\n ProductTypeChangeLabelAction,\n ProductTypeChangeLocalizedEnumValueLabelAction,\n ProductTypeDraft,\n ProductTypeRemoveAttributeDefinitionAction,\n ProductTypeRemoveEnumValuesAction,\n ProductTypeUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class ProductTypeRepository extends AbstractResourceRepository<'product-type'> {\n getTypeId() {\n return 'product-type' as const\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 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 changeAttributeOrderByName: (\n context: RepositoryContext,\n resource: Writable<ProductType>,\n { attributeNames }: ProductTypeChangeAttributeOrderByNameAction\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 attributeNames.forEach((attrName) => {\n const attr = attrs.get(attrName)\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 !== attrName)\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 ProjectChangeMessagesConfigurationAction,\n ProjectChangeNameAction,\n ProjectChangeOrderSearchStatusAction,\n ProjectChangeProductSearchIndexingEnabledAction,\n ProjectSetExternalOAuthAction,\n ProjectSetShippingRateInputTypeAction,\n ProjectUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { maskSecretValue } from '../lib/masking'\nimport { Writable } from '../types'\nimport { AbstractRepository, RepositoryContext } from './abstract'\n\nexport class ProjectRepository extends AbstractRepository<Project> {\n get(context: RepositoryContext): Project | null {\n const resource = this._storage.getProject(context.projectKey)\n return this.postProcessResource(resource)\n }\n\n postProcessResource(resource: Project): Project {\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 changeMessagesConfiguration: (\n context: RepositoryContext,\n resource: Writable<Project>,\n { messagesConfiguration }: ProjectChangeMessagesConfigurationAction\n ) => {\n resource.messages.enabled = messagesConfiguration.enabled\n resource.messages.deleteDaysAfterCreation = messagesConfiguration.deleteDaysAfterCreation\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 Quote,\n QuoteDraft,\n QuoteUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class QuoteRepository extends AbstractResourceRepository<'quote'> {\n getTypeId() {\n return 'quote' as const\n }\n\n create(context: RepositoryContext, draft: QuoteDraft): Quote {\n throw new Error('not implemented')\n }\n\n actions: Partial<\n Record<\n QuoteUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<Quote>,\n action: any\n ) => void\n >\n > = {}\n}\n","import {\n QuoteRequest,\n QuoteRequestDraft,\n QuoteRequestUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class QuoteRequestRepository extends AbstractResourceRepository<'quote-request'> {\n getTypeId() {\n return 'quote-request' as const\n }\n\n create(context: RepositoryContext, draft: QuoteRequestDraft): QuoteRequest {\n throw new Error('not implemented')\n }\n\n actions: Partial<\n Record<\n QuoteRequestUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<QuoteRequest>,\n action: any\n ) => void\n >\n > = {}\n}\n","import {\n Review,\n ReviewDraft,\n ReviewUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class ReviewRepository extends AbstractResourceRepository<'review'> {\n getTypeId() {\n return 'review' as const\n }\n\n create(context: RepositoryContext, draft: ReviewDraft): Review {\n const resource: Review = {\n ...getBaseResourceProperties(),\n includedInStatistics: false,\n }\n this.saveNew(context, resource)\n return resource\n }\n\n actions: Partial<\n Record<\n ReviewUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<Review>,\n action: any\n ) => void\n >\n > = {}\n}\n","import {\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 deepEqual from 'deep-equal'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport {\n createCustomFields,\n createTypedMoney,\n getReferenceFromResourceIdentifier,\n} from './helpers'\n\nexport class ShippingMethodRepository extends AbstractResourceRepository<'shipping-method'> {\n getTypeId() {\n return 'shipping-method' as const\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 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<'shopping-list'> {\n getTypeId() {\n return 'shopping-list' as const\n }\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 {\n Quote,\n StagedQuote,\n StagedQuoteDraft,\n StagedQuoteUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class StagedQuoteRepository extends AbstractResourceRepository<'staged-quote'> {\n getTypeId() {\n return 'staged-quote' as const\n }\n\n create(context: RepositoryContext, draft: StagedQuoteDraft): StagedQuote {\n throw new Error('not implemented')\n }\n\n actions: Partial<\n Record<\n StagedQuoteUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<Quote>,\n action: any\n ) => void\n >\n > = {}\n}\n","import {\n Review,\n StandalonePrice,\n StandalonePriceUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class StandAlonePriceRepository extends AbstractResourceRepository<'standalone-price'> {\n getTypeId() {\n return 'standalone-price' as const\n }\n\n create(context: RepositoryContext, draft: StandalonePrice): StandalonePrice {\n const resource: StandalonePrice = {\n ...getBaseResourceProperties(),\n active: draft.active,\n sku: draft.sku,\n value: draft.value,\n }\n this.saveNew(context, resource)\n return resource\n }\n\n actions: Partial<\n Record<\n StandalonePriceUpdateAction['action'],\n (\n context: RepositoryContext,\n resource: Writable<Review>,\n action: any\n ) => void\n >\n > = {}\n}\n","import {\n State,\n StateChangeInitialAction,\n StateChangeKeyAction,\n StateDraft,\n StateReference,\n StateSetDescriptionAction,\n StateSetNameAction,\n StateSetRolesAction,\n StateSetTransitionsAction,\n StateUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport { getReferenceFromResourceIdentifier } from './helpers'\n\nexport class StateRepository extends AbstractResourceRepository<'state'> {\n getTypeId() {\n return 'state' as const\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 changeInitial: (\n context: RepositoryContext,\n resource: Writable<State>,\n {initial }: StateChangeInitialAction\n ) => {\n resource.initial = initial\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 ChannelReference,\n ChannelResourceIdentifier,\n Store,\n StoreDraft,\n StoreSetCustomFieldAction,\n StoreSetCustomTypeAction,\n StoreSetDistributionChannelsAction,\n StoreSetLanguagesAction,\n StoreSetNameAction,\n StoreUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\nimport {\n createCustomFields,\n getReferenceFromResourceIdentifier,\n} from './helpers'\n\nexport class StoreRepository extends AbstractResourceRepository<'store'> {\n getTypeId() {\n return 'store' as const\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 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 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<'subscription'> {\n getTypeId() {\n return 'subscription' as const\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 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 { v4 as uuidv4 } from 'uuid'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class TaxCategoryRepository extends AbstractResourceRepository<'tax-category'> {\n getTypeId() {\n return 'tax-category' as const\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 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 FieldDefinition,\n InvalidOperationError,\n Type,\n TypeAddEnumValueAction,\n TypeAddFieldDefinitionAction,\n TypeChangeEnumValueLabelAction,\n TypeChangeFieldDefinitionOrderAction,\n TypeChangeNameAction,\n TypeDraft,\n TypeRemoveFieldDefinitionAction,\n TypeSetDescriptionAction,\n TypeUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { isEqual } from 'lodash'\nimport { CommercetoolsError } from '../exceptions'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class TypeRepository extends AbstractResourceRepository<'type'> {\n getTypeId() {\n return 'type' as const\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 Zone,\n ZoneAddLocationAction,\n ZoneChangeNameAction,\n ZoneDraft,\n ZoneRemoveLocationAction,\n ZoneSetDescriptionAction,\n ZoneSetKeyAction,\n ZoneUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers'\nimport { Writable } from '../types'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract'\n\nexport class ZoneRepository extends AbstractResourceRepository<'zone'> {\n getTypeId() {\n return 'zone' as const\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 { OrderEditRepository } from './order-edit'\nimport { PaymentRepository } from './payment'\nimport { ProductRepository } from './product'\nimport { ProductDiscountRepository } from './product-discount'\nimport { ProductProjectionRepository } from './product-projection'\nimport { ProductSelectionRepository } from './product-selection'\nimport { ProductTypeRepository } from './product-type'\nimport { ProjectRepository } from './project'\nimport { QuoteRepository } from './quote'\nimport { QuoteRequestRepository } from './quote-request'\nimport { ReviewRepository } from './review'\nimport { ShippingMethodRepository } from './shipping-method'\nimport { ShoppingListRepository } from './shopping-list'\nimport { StagedQuoteRepository } from './staged-quote'\nimport { StandAlonePriceRepository } from './standalone-price'\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 type RepositoryMap = ReturnType<typeof createRepositories>\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 'order-edit': new OrderEditRepository(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 product: new ProductRepository(storage),\n 'product-type': new ProductTypeRepository(storage),\n 'product-discount': new ProductDiscountRepository(storage),\n 'product-projection': new ProductProjectionRepository(storage),\n 'product-selection': new ProductSelectionRepository(storage),\n project: new ProjectRepository(storage),\n review: new ReviewRepository(storage),\n quote: new QuoteRepository(storage),\n 'quote-request': new QuoteRequestRepository(storage),\n 'shipping-method': new ShippingMethodRepository(storage),\n 'shopping-list': new ShoppingListRepository(storage),\n 'staged-quote': new StagedQuoteRepository(storage),\n 'standalone-price': new StandAlonePriceRepository(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 { Request, Response, Router } from 'express'\nimport { ParsedQs } from 'qs'\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<any>\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 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 { Cart, CartDraft, Order } from '@commercetools/platform-sdk'\nimport { Request, Response, Router } from 'express'\nimport { CartRepository } from '../repositories/cart'\nimport { getRepositoryContext } from '../repositories/helpers'\nimport { OrderRepository } from '../repositories/order'\nimport AbstractService from './abstract'\n\nexport class CartService extends AbstractService {\n public repository: CartRepository\n public orderRepository: OrderRepository\n\n constructor(\n parent: Router,\n cartRepository: CartRepository,\n orderRepository: OrderRepository\n ) {\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', this.replicate.bind(this))\n }\n\n replicate(request: Request, response: 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 shipping: [], // TODO: cartOrOrder.shipping,\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","import { Router } from 'express'\nimport { CartDiscountRepository } from '../repositories/cart-discount'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { CategoryRepository } from '../repositories/category'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { ChannelRepository } from '../repositories/channel'\nimport AbstractService from './abstract'\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 { CustomObjectDraft } from '@commercetools/platform-sdk'\nimport { Request, Response, Router } from 'express'\nimport { CustomObjectRepository } from '../repositories/custom-object'\nimport { getRepositoryContext } from '../repositories/helpers'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { v4 as uuidv4 } from 'uuid'\nimport { getBaseResourceProperties } from '../helpers'\nimport { CustomerRepository } from '../repositories/customer'\nimport { getRepositoryContext } from '../repositories/helpers'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { CustomerGroupRepository } from '../repositories/customer-group'\nimport AbstractService from './abstract'\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 { DiscountCodeRepository } from '../repositories/discount-code'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { ExtensionRepository } from '../repositories/extension'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { InventoryEntryRepository } from '../repositories/inventory-entry'\nimport AbstractService from './abstract'\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 { Request, Response, Router } from 'express'\nimport { CartRepository } from '../repositories/cart'\nimport AbstractService from './abstract'\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 { Request, Response, Router } from 'express'\nimport { CustomerRepository } from '../repositories/customer'\nimport { getRepositoryContext } from '../repositories/helpers'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { MyOrderRepository } from '../repositories/my-order'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { PaymentRepository } from '../repositories/payment'\nimport AbstractService from './abstract'\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 { Request, Response, Router } from 'express'\nimport { getRepositoryContext } from '../repositories/helpers'\nimport { OrderRepository } from '../repositories/order'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { PaymentRepository } from '../repositories/payment'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { ProductRepository } from '../repositories/product'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { ProductDiscountRepository } from '../repositories/product-discount'\nimport AbstractService from './abstract'\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","import { Request, Response, Router } from 'express'\nimport { getRepositoryContext } from '../repositories/helpers'\nimport { ProductProjectionRepository } from './../repositories/product-projection'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { ProductTypeRepository } from '../repositories/product-type'\nimport AbstractService from './abstract'\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","import { Router } from 'express'\nimport { ShippingMethodRepository } from '../repositories/shipping-method'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { ShoppingListRepository } from './../repositories/shopping-list'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { StateRepository } from '../repositories/state'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { StoreRepository } from '../repositories/store'\nimport AbstractService from './abstract'\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","import { Router } from 'express'\nimport { SubscriptionRepository } from '../repositories/subscription'\nimport AbstractService from './abstract'\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 { Router } from 'express'\nimport { TaxCategoryRepository } from '../repositories/tax-category'\nimport AbstractService from './abstract'\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","import { Router } from 'express'\nimport { TypeRepository } from '../repositories/type'\nimport AbstractService from './abstract'\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 { ZoneRepository } from '../repositories/zone'\nimport AbstractService from './abstract'\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":["express","uuidv4","uuidv4","uuidv4","uuidv4","uuidv4","uuidv4","assert","assert","assert","assert","uuidv4","uuidv4","uuidv4","deepEqual","uuidv4","perplex","Parser","generateMatchFunc","getLexer","perplex","Parser","deepEqual","deepEqual","uuidv4","uuidv4","uuidv4","uuidv4","Router","Router","Router","Router","Router","Router","express"]}