@labdigital/commercetools-mock 2.4.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -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/haversine.ts","../vendor/perplex/lexer-state.ts","../vendor/perplex/token.ts","../vendor/perplex/token-types.ts","../vendor/perplex/lexer.ts","../vendor/pratt/index.ts","../src/lib/predicateParser.ts","../src/oauth/server.ts","../src/oauth/store.ts","../src/oauth/helpers.ts","../src/lib/password.ts","../src/projectAPI.ts","../src/lib/proxy.ts","../src/constants.ts","../src/repositories/helpers.ts","../src/services/project.ts","../src/repositories/abstract.ts","../src/repositories/errors.ts","../src/repositories/associate-role.ts","../src/repositories/attribute-group.ts","../src/repositories/business-unit.ts","../src/repositories/cart.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/associate-roles.ts","../src/services/attribute-group.ts","../src/services/business-units.ts","../src/services/cart-discount.ts","../src/services/cart.ts","../src/services/category.ts","../src/services/channel.ts","../src/services/custom-object.ts","../src/services/customer-group.ts","../src/services/customer.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-discount.ts","../src/services/product-projection.ts","../src/services/product-selection.ts","../src/services/product-type.ts","../src/services/product.ts","../src/services/shipping-method.ts","../src/services/shopping-list.ts","../src/services/standalone-price.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 express, { NextFunction, Request, Response } from 'express'\nimport morgan from 'morgan'\nimport inject from 'light-my-request'\nimport { setupServer, SetupServer } from 'msw/node'\nimport { http, HttpResponse } from 'msw'\nimport { AbstractStorage, InMemoryStorage } from './storage/index.js'\nimport { Services } from './types.js'\nimport { CommercetoolsError } from './exceptions.js'\nimport { OAuth2Server } from './oauth/server.js'\nimport { ProjectAPI } from './projectAPI.js'\nimport { copyHeaders } from './lib/proxy.js'\nimport { DEFAULT_API_HOSTNAME, DEFAULT_AUTH_HOSTNAME } from './constants.js'\n\n// Services\nimport { ProjectService } from './services/project.js'\nimport { createRepositories, RepositoryMap } from './repositories/index.js'\nimport { createServices } from './services/index.js'\nimport { ProjectRepository } from './repositories/project.js'\nimport { mapHeaderType } from './helpers.js'\n\nexport type CommercetoolsMockOptions = {\n\tvalidateCredentials: boolean\n\tenableAuthentication: boolean\n\tdefaultProjectKey: string | undefined\n\tapiHost: RegExp | string\n\tauthHost: RegExp | string\n\tsilent: boolean\n}\n\ntype AppOptions = { silent?: boolean }\n\nconst DEFAULT_OPTIONS: CommercetoolsMockOptions = {\n\tenableAuthentication: false,\n\tvalidateCredentials: false,\n\tdefaultProjectKey: undefined,\n\tapiHost: DEFAULT_API_HOSTNAME,\n\tauthHost: DEFAULT_AUTH_HOSTNAME,\n\tsilent: false,\n}\n\nconst _globalListeners: SetupServer[] = []\n\nexport class CommercetoolsMock {\n\tpublic app: express.Express\n\tpublic options: CommercetoolsMockOptions\n\n\tprivate _storage: AbstractStorage\n\tprivate _oauth2: OAuth2Server\n\tprivate _mswServer: SetupServer | undefined = undefined\n\tprivate _services: Services | null\n\tprivate _repositories: RepositoryMap | null\n\tprivate _projectService?: ProjectService\n\n\tconstructor(options: Partial<CommercetoolsMockOptions> = {}) {\n\t\tthis.options = { ...DEFAULT_OPTIONS, ...options }\n\t\tthis._services = null\n\t\tthis._repositories = null\n\t\tthis._projectService = undefined\n\n\t\tthis._storage = new InMemoryStorage()\n\t\tthis._oauth2 = new OAuth2Server({\n\t\t\tenabled: this.options.enableAuthentication,\n\t\t\tvalidate: this.options.validateCredentials,\n\t\t})\n\n\t\tthis.app = this.createApp({ silent: this.options.silent })\n\t}\n\n\tstart() {\n\t\t// Order is important here when the hostnames match\n\t\tthis.clear()\n\t\tthis.startServer()\n\t}\n\n\tstop() {\n\t\tthis._mswServer?.close()\n\t\tthis._mswServer = undefined\n\t}\n\n\tclear() {\n\t\tthis._mswServer?.resetHandlers()\n\t\tthis._storage.clear()\n\t}\n\n\tproject(projectKey?: string) {\n\t\tif (!projectKey && !this.options.defaultProjectKey) {\n\t\t\tthrow new Error('No projectKey passed and no default set')\n\t\t}\n\n\t\tif (this._repositories === null) {\n\t\t\tthrow new Error('repositories not initialized yet')\n\t\t}\n\n\t\treturn new ProjectAPI(\n\t\t\tprojectKey || this.options.defaultProjectKey!,\n\t\t\tthis._repositories,\n\t\t\tthis._storage\n\t\t)\n\t}\n\n\trunServer(port = 3000, options?: AppOptions) {\n\t\tconst server = this.app.listen(port, () => {\n\t\t\tconsole.info(`Mock server listening at http://localhost:${port}`)\n\t\t})\n\t\tserver.keepAliveTimeout = 60 * 1000\n\t}\n\n\tprivate createApp(options?: AppOptions): express.Express {\n\t\tthis._repositories = createRepositories(this._storage)\n\t\tthis._oauth2.setCustomerRepository(this._repositories.customer)\n\n\t\tconst app = express()\n\n\t\tconst projectRouter = express.Router({ mergeParams: true })\n\t\tprojectRouter.use(express.json())\n\n\t\tif (!options?.silent) {\n\t\t\tapp.use(morgan('tiny'))\n\t\t}\n\t\tapp.use('/oauth', this._oauth2.createRouter())\n\n\t\t// Only enable auth middleware if we have enabled this\n\t\tif (this.options.enableAuthentication) {\n\t\t\tapp.use('/:projectKey', this._oauth2.createMiddleware(), projectRouter)\n\t\t\tapp.use(\n\t\t\t\t'/:projectKey/in-store/key=:storeKey',\n\t\t\t\tthis._oauth2.createMiddleware(),\n\t\t\t\tprojectRouter\n\t\t\t)\n\t\t} else {\n\t\t\tapp.use('/:projectKey', projectRouter)\n\t\t\tapp.use('/:projectKey/in-store/key=:storeKey', projectRouter)\n\t\t}\n\n\t\t// Register the rest api services in the router\n\t\tthis._services = createServices(projectRouter, this._repositories)\n\t\tthis._projectService = new ProjectService(\n\t\t\tprojectRouter,\n\t\t\tthis._repositories.project as ProjectRepository\n\t\t)\n\n\t\tapp.use((err: Error, req: Request, resp: Response, next: NextFunction) => {\n\t\t\tif (err instanceof CommercetoolsError) {\n\t\t\t\tif (err.errors?.length > 0) {\n\t\t\t\t\treturn resp.status(err.statusCode).send({\n\t\t\t\t\t\tstatusCode: err.statusCode,\n\t\t\t\t\t\tmessage: err.message,\n\t\t\t\t\t\terrors: err.errors,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\treturn resp.status(err.statusCode).send({\n\t\t\t\t\tstatusCode: err.statusCode,\n\t\t\t\t\tmessage: err.message,\n\t\t\t\t\terrors: [err.info],\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tconsole.error(err)\n\t\t\t\treturn resp.status(500).send({\n\t\t\t\t\terror: err.message,\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\n\t\treturn app\n\t}\n\n\tprivate startServer() {\n\t\t// Check if there are any other servers running\n\t\tif (_globalListeners.length > 0) {\n\t\t\tif (this._mswServer !== undefined) {\n\t\t\t\tthrow new Error('Server already started')\n\t\t\t} else {\n\t\t\t\tconsole.warn(\"Server wasn't stopped properly, clearing\")\n\t\t\t\t_globalListeners.forEach((listener) => listener.close())\n\t\t\t}\n\t\t}\n\n\t\tconst server = this.app\n\t\tthis._mswServer = setupServer(\n\t\t\thttp.post(`${this.options.authHost}/oauth/*`, async ({ request }) => {\n\t\t\t\tconst body = await request.text()\n\t\t\t\tconst url = new URL(request.url)\n\t\t\t\tconst headers = copyHeaders(request.headers)\n\n\t\t\t\tconst res = await inject(server)\n\t\t\t\t\t.post(url.pathname + '?' + url.searchParams.toString())\n\t\t\t\t\t.body(body)\n\t\t\t\t\t.headers(headers)\n\t\t\t\t\t.end()\n\t\t\t\treturn new HttpResponse(res.body, {\n\t\t\t\t\tstatus: res.statusCode,\n\t\t\t\t\theaders: mapHeaderType(res.headers),\n\t\t\t\t})\n\t\t\t}),\n\t\t\thttp.get(`${this.options.apiHost}/*`, async ({ request }) => {\n\t\t\t\tconst body = await request.text()\n\t\t\t\tconst url = new URL(request.url)\n\t\t\t\tconst headers = copyHeaders(request.headers)\n\n\t\t\t\tconst res = await inject(server)\n\t\t\t\t\t.get(url.pathname + '?' + url.searchParams.toString())\n\t\t\t\t\t.body(body)\n\t\t\t\t\t.headers(headers)\n\t\t\t\t\t.end()\n\t\t\t\treturn new HttpResponse(res.body, {\n\t\t\t\t\tstatus: res.statusCode,\n\t\t\t\t\theaders: mapHeaderType(res.headers),\n\t\t\t\t})\n\t\t\t}),\n\t\t\thttp.post(`${this.options.apiHost}/*`, async ({ request }) => {\n\t\t\t\tconst body = await request.text()\n\t\t\t\tconst url = new URL(request.url)\n\t\t\t\tconst headers = copyHeaders(request.headers)\n\n\t\t\t\tconst res = await inject(server)\n\t\t\t\t\t.post(url.pathname + '?' + url.searchParams.toString())\n\t\t\t\t\t.body(body)\n\t\t\t\t\t.headers(headers)\n\t\t\t\t\t.end()\n\t\t\t\treturn new HttpResponse(res.body, {\n\t\t\t\t\tstatus: res.statusCode,\n\t\t\t\t\theaders: mapHeaderType(res.headers),\n\t\t\t\t})\n\t\t\t}),\n\t\t\thttp.delete(`${this.options.apiHost}/*`, async ({ request }) => {\n\t\t\t\tconst body = await request.text()\n\t\t\t\tconst url = new URL(request.url)\n\t\t\t\tconst headers = copyHeaders(request.headers)\n\n\t\t\t\tconst res = await inject(server)\n\t\t\t\t\t.delete(url.pathname + '?' + url.searchParams.toString())\n\t\t\t\t\t.body(body)\n\t\t\t\t\t.headers(headers)\n\t\t\t\t\t.end()\n\t\t\t\treturn new HttpResponse(res.body, {\n\t\t\t\t\tstatus: res.statusCode,\n\t\t\t\t\theaders: mapHeaderType(res.headers),\n\t\t\t\t})\n\t\t\t})\n\t\t)\n\t\tthis._mswServer.listen({\n\t\t\t// We need to allow requests done by supertest\n\t\t\tonUnhandledRequest: (request, print) => {\n\t\t\t\tconst url = new URL(request.url)\n\t\t\t\tif (url.hostname === '127.0.0.1') {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tprint.error()\n\t\t\t},\n\t\t})\n\n\t\t_globalListeners.push(this._mswServer)\n\t}\n}\n","import type {\n\tBaseResource,\n\tProject,\n\tQueryParam,\n\tResourceIdentifier,\n} from '@commercetools/platform-sdk'\nimport { PagedQueryResponseMap, ResourceMap, ResourceType } from '../types.js'\n\nexport type GetParams = {\n\texpand?: string[]\n}\n\nexport type QueryParams = {\n\texpand?: string | string[]\n\tsort?: string | string[]\n\tlimit?: number\n\toffset?: number\n\twithTotal?: boolean\n\twhere?: string | string[]\n\t[key: string]: QueryParam\n}\n\nexport abstract class AbstractStorage {\n\tabstract clear(): void\n\n\tabstract all<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT\n\t): Array<ResourceMap[RT]>\n\n\tabstract add<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT,\n\t\tobj: ResourceMap[RT]\n\t): void\n\n\tabstract get<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT,\n\t\tid: string,\n\t\tparams?: GetParams\n\t): ResourceMap[RT] | null\n\n\tabstract getByKey<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT,\n\t\tkey: string,\n\t\tparams: GetParams\n\t): ResourceMap[RT] | null\n\n\tabstract addProject(projectKey: string): Project\n\tabstract getProject(projectKey: string): Project\n\tabstract saveProject(project: Project): Project\n\n\tabstract delete<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT,\n\t\tid: string,\n\t\tparams: GetParams\n\t): ResourceMap[RT] | null\n\n\tabstract query<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT,\n\t\tparams: QueryParams\n\t): PagedQueryResponseMap[RT]\n\n\tabstract getByResourceIdentifier<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\tidentifier: ResourceIdentifier\n\t): ResourceMap[RT] | null\n\n\tabstract expand<T>(\n\t\tprojectKey: string,\n\t\tobj: T,\n\t\tclause: undefined | string | string[]\n\t): T\n}\n\nexport type ProjectStorage = {\n\t[index in ResourceType]: Map<string, BaseResource>\n}\n","import type {\n\tAssociateRole,\n\tAttributeGroup,\n\tBusinessUnit,\n\tCart,\n\tCartDiscount,\n\tCategory,\n\tChannel,\n\tCustomer,\n\tCustomerGroup,\n\tCustomObject,\n\tDiscountCode,\n\tExtension,\n\tInvalidInputError,\n\tInventoryEntry,\n\tOrder,\n\tPagedQueryResponse,\n\tPayment,\n\tProduct,\n\tProductDiscount,\n\tProductProjection,\n\tProductType,\n\tProject,\n\tQuote,\n\tQuoteRequest,\n\tReference,\n\tResourceIdentifier,\n\tShippingMethod,\n\tShoppingList,\n\tStagedQuote,\n\tState,\n\tStore,\n\tSubscription,\n\tTaxCategory,\n\tType,\n\tZone,\n} from '@commercetools/platform-sdk'\nimport assert from 'assert'\nimport { CommercetoolsError } from '../exceptions.js'\nimport { cloneObject } from '../helpers.js'\nimport { parseExpandClause } from '../lib/expandParser.js'\nimport { parseQueryExpression } from '../lib/predicateParser.js'\nimport {\n\tPagedQueryResponseMap,\n\tResourceMap,\n\tResourceType,\n\tWritable,\n} from '../types.js'\nimport {\n\tAbstractStorage,\n\tGetParams,\n\tProjectStorage,\n\tQueryParams,\n} from './abstract.js'\n\nexport class InMemoryStorage extends AbstractStorage {\n\tprotected resources: {\n\t\t[projectKey: string]: ProjectStorage\n\t} = {}\n\n\tprotected projects: {\n\t\t[projectKey: string]: Project\n\t} = {}\n\n\tprivate forProjectKey(projectKey: string): ProjectStorage {\n\t\tthis.addProject(projectKey)\n\n\t\tlet projectStorage = this.resources[projectKey]\n\t\tif (!projectStorage) {\n\t\t\tprojectStorage = this.resources[projectKey] = {\n\t\t\t\t'associate-role': new Map<string, AssociateRole>(),\n\t\t\t\t'attribute-group': new Map<string, AttributeGroup>(),\n\t\t\t\t'business-unit': new Map<string, BusinessUnit>(),\n\t\t\t\tcart: new Map<string, Cart>(),\n\t\t\t\t'cart-discount': new Map<string, CartDiscount>(),\n\t\t\t\tcategory: new Map<string, Category>(),\n\t\t\t\tchannel: new Map<string, Channel>(),\n\t\t\t\tcustomer: new Map<string, Customer>(),\n\t\t\t\t'customer-group': new Map<string, CustomerGroup>(),\n\t\t\t\t'discount-code': new Map<string, DiscountCode>(),\n\t\t\t\textension: new Map<string, Extension>(),\n\t\t\t\t'inventory-entry': new Map<string, InventoryEntry>(),\n\t\t\t\t'key-value-document': new Map<string, CustomObject>(),\n\t\t\t\torder: new Map<string, Order>(),\n\t\t\t\t'order-edit': new Map<string, any>(),\n\t\t\t\tpayment: new Map<string, Payment>(),\n\t\t\t\tproduct: new Map<string, Product>(),\n\t\t\t\tquote: new Map<string, Quote>(),\n\t\t\t\t'quote-request': new Map<string, QuoteRequest>(),\n\t\t\t\t'product-discount': new Map<string, ProductDiscount>(),\n\t\t\t\t'product-selection': new Map<string, any>(),\n\t\t\t\t'product-type': new Map<string, ProductType>(),\n\t\t\t\t'product-projection': new Map<string, ProductProjection>(),\n\t\t\t\treview: new Map<string, any>(),\n\t\t\t\t'shipping-method': new Map<string, ShippingMethod>(),\n\t\t\t\t'staged-quote': new Map<string, StagedQuote>(),\n\t\t\t\tstate: new Map<string, State>(),\n\t\t\t\tstore: new Map<string, Store>(),\n\t\t\t\t'shopping-list': new Map<string, ShoppingList>(),\n\t\t\t\t'standalone-price': new Map<string, any>(),\n\t\t\t\tsubscription: new Map<string, Subscription>(),\n\t\t\t\t'tax-category': new Map<string, TaxCategory>(),\n\t\t\t\ttype: new Map<string, Type>(),\n\t\t\t\tzone: new Map<string, Zone>(),\n\t\t\t}\n\t\t}\n\t\treturn projectStorage\n\t}\n\n\tclear() {\n\t\tfor (const [, projectStorage] of Object.entries(this.resources)) {\n\t\t\tfor (const [, value] of Object.entries(projectStorage)) {\n\t\t\t\tvalue?.clear()\n\t\t\t}\n\t\t}\n\t}\n\n\tall<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT\n\t): ResourceMap[RT][] {\n\t\tconst store = this.forProjectKey(projectKey)[typeId]\n\t\tif (store) {\n\t\t\treturn Array.from(store.values()).map(cloneObject) as ResourceMap[RT][]\n\t\t}\n\t\treturn []\n\t}\n\n\tadd<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT,\n\t\tobj: ResourceMap[RT],\n\t\tparams: GetParams = {}\n\t): ResourceMap[RT] {\n\t\tconst store = this.forProjectKey(projectKey)\n\t\tstore[typeId]?.set(obj.id, obj)\n\n\t\tconst resource = this.get(projectKey, typeId, obj.id, params)\n\t\tassert(resource, `resource of type ${typeId} with id ${obj.id} not created`)\n\t\treturn cloneObject(resource)\n\t}\n\n\tget<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT,\n\t\tid: string,\n\t\tparams: GetParams = {}\n\t): ResourceMap[RT] | null {\n\t\tconst resource = this.forProjectKey(projectKey)[typeId]?.get(id)\n\t\tif (resource) {\n\t\t\tconst clone = cloneObject(resource)\n\t\t\treturn this.expand(projectKey, clone, params.expand) as ResourceMap[RT]\n\t\t}\n\t\treturn null\n\t}\n\n\tgetByKey<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT,\n\t\tkey: string,\n\t\tparams: GetParams = {}\n\t): ResourceMap[RT] | null {\n\t\tconst store = this.forProjectKey(projectKey)\n\t\tconst resourceStore = store[typeId]\n\t\tif (!store) {\n\t\t\tthrow new Error('No type')\n\t\t}\n\n\t\tconst resources: any[] = Array.from(resourceStore.values())\n\t\tconst resource = resources.find((e) => e.key === key)\n\t\tif (resource) {\n\t\t\tconst clone = cloneObject(resource)\n\t\t\treturn this.expand(projectKey, clone, params.expand) as ResourceMap[RT]\n\t\t}\n\t\treturn null\n\t}\n\n\tdelete<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT,\n\t\tid: string,\n\t\tparams: GetParams = {}\n\t): ResourceMap[RT] | null {\n\t\tconst resource = this.get(projectKey, typeId, id)\n\n\t\tif (resource) {\n\t\t\tthis.forProjectKey(projectKey)[typeId]?.delete(id)\n\t\t\treturn this.expand(projectKey, resource, params.expand)\n\t\t}\n\t\treturn resource\n\t}\n\n\tquery<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT,\n\t\tparams: QueryParams\n\t): PagedQueryResponseMap[RT] {\n\t\tconst store = this.forProjectKey(projectKey)[typeId]\n\t\tif (!store) {\n\t\t\tthrow new Error('No type')\n\t\t}\n\n\t\tlet resources = this.all<RT>(projectKey, typeId)\n\n\t\t// Apply predicates\n\t\tif (params.where) {\n\t\t\ttry {\n\t\t\t\tconst filterFunc = parseQueryExpression(params.where)\n\t\t\t\tresources = resources.filter((resource) => filterFunc(resource, {}))\n\t\t\t} catch (err) {\n\t\t\t\tthrow new CommercetoolsError<InvalidInputError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'InvalidInput',\n\t\t\t\t\t\tmessage: (err as any).message,\n\t\t\t\t\t},\n\t\t\t\t\t400\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\t// Get the total before slicing the array\n\t\tconst totalResources = resources.length\n\n\t\t// Apply offset, limit\n\t\tconst offset = params.offset || 0\n\t\tconst limit = params.limit || 20\n\t\tresources = resources.slice(offset, offset + limit)\n\n\t\t// Expand the resources\n\t\tif (params.expand !== undefined) {\n\t\t\tresources = resources.map((resource) =>\n\t\t\t\tthis.expand(projectKey, resource, params.expand)\n\t\t\t)\n\t\t}\n\n\t\treturn {\n\t\t\tcount: totalResources,\n\t\t\ttotal: resources.length,\n\t\t\toffset: offset,\n\t\t\tlimit: limit,\n\t\t\tresults: resources.map(cloneObject),\n\t\t} as PagedQueryResponseMap[RT]\n\t}\n\n\tsearch(\n\t\tprojectKey: string,\n\t\ttypeId: ResourceType,\n\t\tparams: QueryParams\n\t): PagedQueryResponse {\n\t\tlet resources = this.all(projectKey, typeId)\n\n\t\t// Apply predicates\n\t\tif (params.where) {\n\t\t\ttry {\n\t\t\t\tconst filterFunc = parseQueryExpression(params.where)\n\t\t\t\tresources = resources.filter((resource) => filterFunc(resource, {}))\n\t\t\t} catch (err) {\n\t\t\t\tthrow new CommercetoolsError<InvalidInputError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'InvalidInput',\n\t\t\t\t\t\tmessage: (err as any).message,\n\t\t\t\t\t},\n\t\t\t\t\t400\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\t// Get the total before slicing the array\n\t\tconst totalResources = resources.length\n\n\t\t// Apply offset, limit\n\t\tconst offset = params.offset || 0\n\t\tconst limit = params.limit || 20\n\t\tresources = resources.slice(offset, offset + limit)\n\n\t\t// Expand the resources\n\t\tif (params.expand !== undefined) {\n\t\t\tresources = resources.map((resource) =>\n\t\t\t\tthis.expand(projectKey, resource, params.expand)\n\t\t\t)\n\t\t}\n\n\t\treturn {\n\t\t\tcount: totalResources,\n\t\t\ttotal: resources.length,\n\t\t\toffset: offset,\n\t\t\tlimit: limit,\n\t\t\tresults: resources,\n\t\t}\n\t}\n\n\tgetByResourceIdentifier<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\tidentifier: ResourceIdentifier\n\t): ResourceMap[RT] | null {\n\t\tif (identifier.id) {\n\t\t\tconst resource = this.get(projectKey, identifier.typeId, identifier.id)\n\t\t\tif (resource) {\n\t\t\t\treturn resource as ResourceMap[RT]\n\t\t\t}\n\t\t\tconsole.error(\n\t\t\t\t`No resource found with typeId=${identifier.typeId}, id=${identifier.id}`\n\t\t\t)\n\t\t\treturn null\n\t\t}\n\n\t\tif (identifier.key) {\n\t\t\tconst store = this.forProjectKey(projectKey)[identifier.typeId]\n\n\t\t\tif (store) {\n\t\t\t\t// TODO: BaseResource has no key attribute, but the subclasses should\n\t\t\t\t// have them all.\n\t\t\t\tconst resource = Array.from(store.values()).find(\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t(r) => r.key === identifier.key\n\t\t\t\t)\n\t\t\t\tif (resource) {\n\t\t\t\t\treturn resource as ResourceMap[RT]\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`No storage found for resource type: ${identifier.typeId}`\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n\n\taddProject = (projectKey: string): Project => {\n\t\tif (!this.projects[projectKey]) {\n\t\t\tthis.projects[projectKey] = {\n\t\t\t\tkey: projectKey,\n\t\t\t\tname: '',\n\t\t\t\tcountries: [],\n\t\t\t\tcurrencies: [],\n\t\t\t\tlanguages: [],\n\t\t\t\tcreatedAt: '2018-10-04T11:32:12.603Z',\n\t\t\t\ttrialUntil: '2018-12',\n\t\t\t\tcarts: {\n\t\t\t\t\tcountryTaxRateFallbackEnabled: false,\n\t\t\t\t\tdeleteDaysAfterLastModification: 90,\n\t\t\t\t},\n\t\t\t\tmessages: { enabled: false, deleteDaysAfterCreation: 15 },\n\t\t\t\tshippingRateInputType: undefined,\n\t\t\t\texternalOAuth: undefined,\n\t\t\t\tsearchIndexing: {\n\t\t\t\t\tproducts: {\n\t\t\t\t\t\tstatus: 'Deactivated',\n\t\t\t\t\t},\n\t\t\t\t\torders: {\n\t\t\t\t\t\tstatus: 'Deactivated',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tversion: 1,\n\t\t\t}\n\t\t}\n\t\treturn this.projects[projectKey]\n\t}\n\n\tsaveProject = (project: Project): Project => {\n\t\tthis.projects[project.key] = project\n\t\treturn project\n\t}\n\n\tgetProject = (projectKey: string): Project => this.addProject(projectKey)\n\n\t// Expand resolves a nested reference and injects the object in the given obj\n\tpublic expand = <T>(\n\t\tprojectKey: string,\n\t\tobj: T,\n\t\tclause: undefined | string | string[]\n\t): T => {\n\t\tif (!clause) return obj\n\t\tconst newObj = cloneObject(obj)\n\t\tif (Array.isArray(clause)) {\n\t\t\tclause.forEach((c) => {\n\t\t\t\tthis._resolveResource(projectKey, newObj, c)\n\t\t\t})\n\t\t} else {\n\t\t\tthis._resolveResource(projectKey, newObj, clause)\n\t\t}\n\t\treturn newObj\n\t}\n\n\tprivate _resolveResource = (projectKey: string, obj: any, expand: string) => {\n\t\tconst params = parseExpandClause(expand)\n\n\t\tif (!params.index) {\n\t\t\tconst reference = obj[params.element]\n\t\t\tif (reference === undefined) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis._resolveReference(projectKey, reference, params.rest)\n\t\t} else if (params.index === '*') {\n\t\t\tconst reference = obj[params.element]\n\t\t\tif (reference === undefined || !Array.isArray(reference)) return\n\t\t\treference.forEach((itemRef: Writable<Reference>) => {\n\t\t\t\tthis._resolveReference(projectKey, itemRef, params.rest)\n\t\t\t})\n\t\t} else {\n\t\t\tconst reference = obj[params.element][params.index]\n\t\t\tif (reference === undefined) return\n\t\t\tthis._resolveReference(projectKey, reference, params.rest)\n\t\t}\n\t}\n\n\tprivate _resolveReference(\n\t\tprojectKey: string,\n\t\treference: any,\n\t\texpand: string | undefined\n\t) {\n\t\tif (reference === undefined) return\n\n\t\tif (\n\t\t\treference.typeId !== undefined &&\n\t\t\t(reference.id !== undefined || reference.key !== undefined)\n\t\t) {\n\t\t\t// @ts-ignore\n\t\t\treference.obj = this.getByResourceIdentifier(projectKey, {\n\t\t\t\ttypeId: reference.typeId,\n\t\t\t\tid: reference.id,\n\t\t\t\tkey: reference.key,\n\t\t\t} as ResourceIdentifier)\n\t\t\tif (expand) {\n\t\t\t\tthis._resolveResource(projectKey, reference.obj, expand)\n\t\t\t}\n\t\t} else {\n\t\t\tif (expand) {\n\t\t\t\tthis._resolveResource(projectKey, reference, expand)\n\t\t\t}\n\t\t}\n\t}\n}\n","export abstract class BaseError {\n\tabstract message: string\n\tabstract errors?: BaseError[]\n}\n\nexport class CommercetoolsError<T extends BaseError> extends Error {\n\tinfo: T\n\tstatusCode: number\n\n\terrors: BaseError[]\n\n\tconstructor(info: T, statusCode = 400) {\n\t\tsuper(info.message)\n\t\tthis.info = info\n\t\tthis.statusCode = statusCode || 500\n\t\tthis.errors = info.errors ?? []\n\t}\n}\n\nexport interface InvalidRequestError {\n\treadonly code: 'invalid_request'\n\treadonly message: string\n}\n","import { OutgoingHttpHeaders } from 'node:http'\nimport { ParsedQs } from 'qs'\nimport { v4 as uuidv4 } from 'uuid'\n\nexport const getBaseResourceProperties = () => ({\n\tid: uuidv4(),\n\tcreatedAt: new Date().toISOString(),\n\tlastModifiedAt: new Date().toISOString(),\n\tversion: 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\tif (!path || path === '') {\n\t\treturn obj\n\t}\n\n\tconst parts = path.split('.')\n\tlet val = obj\n\n\tfor (let i = 0; i < parts.length; i++) {\n\t\tconst part = parts[i]\n\t\tif (val == undefined) {\n\t\t\treturn undefined\n\t\t}\n\n\t\tval = val[part]\n\t}\n\n\treturn val\n}\n\nexport const queryParamsArray = (\n\tinput: string | ParsedQs | string[] | ParsedQs[] | undefined\n): string[] | undefined => {\n\tif (input == undefined) {\n\t\treturn undefined\n\t}\n\n\tconst values: string[] = Array.isArray(input)\n\t\t? (input as string[])\n\t\t: ([input] as string[])\n\tif (values.length < 1) {\n\t\treturn undefined\n\t}\n\treturn values\n}\n\nexport const queryParamsValue = (\n\tvalue: string | ParsedQs | string[] | ParsedQs[] | undefined\n): string | undefined => {\n\tconst values = queryParamsArray(value)\n\tif (values && values.length > 0) {\n\t\treturn values[0]\n\t}\n\treturn undefined\n}\n\nexport const cloneObject = <T>(o: T): T => JSON.parse(JSON.stringify(o))\n\nexport const mapHeaderType = (\n\toutgoingHttpHeaders: OutgoingHttpHeaders\n): HeadersInit => {\n\tconst headersInit: HeadersInit = {}\n\tfor (const key in outgoingHttpHeaders) {\n\t\tconst value = outgoingHttpHeaders[key]\n\t\tif (Array.isArray(value)) {\n\t\t\t// Join multiple values for the same header with a comma\n\t\t\theadersInit[key] = value.join(', ')\n\t\t} else if (value !== undefined) {\n\t\t\t// Single value or undefined\n\t\t\theadersInit[key] = value.toString()\n\t\t}\n\t}\n\treturn headersInit\n}\n","/**\n * This module implements the reference expansion as imeplemented by\n * commercetools.\n *\n * See https://docs.commercetools.com/api/general-concepts#reference-expansion\n *\n * TODO: implement support for multi-dimensional array\n */\ntype ExpandResult = {\n\telement: string\n\tindex?: string | number\n\trest?: string\n}\n\nexport const parseExpandClause = (clause: string): ExpandResult => {\n\tconst result: ExpandResult = {\n\t\telement: clause,\n\t\tindex: undefined,\n\t\trest: undefined,\n\t}\n\n\tconst pos = clause.indexOf('.')\n\tif (pos > 0) {\n\t\tresult.element = clause.substring(0, pos)\n\t\tresult.rest = clause.substring(pos + 1)\n\t}\n\n\tconst match = result.element.match(/\\[([^\\]+])]/)\n\tif (match) {\n\t\tresult.index = match[1] === '*' ? '*' : parseInt(match[1], 10)\n\t\tresult.element = result.element.substring(0, match.index)\n\t}\n\treturn result\n}\n","export type Location = {\n\tlatitude: number\n\tlongitude: number\n}\n\n/**\n * Returns the distance between src and dst as meters\n */\nexport const haversineDistance = (src: Location, dst: Location) => {\n\tconst RADIUS_OF_EARTH_IN_KM = 6371\n\tconst toRadian = (deg: number) => deg * (Math.PI / 180)\n\n\tconst dLat = toRadian(dst.latitude - src.latitude)\n\tconst dLon = toRadian(dst.longitude - src.longitude)\n\n\tconst a =\n\t\tMath.sin(dLat / 2) * Math.sin(dLat / 2) +\n\t\tMath.cos(toRadian(src.latitude)) *\n\t\t\tMath.cos(toRadian(dst.latitude)) *\n\t\t\tMath.sin(dLon / 2) *\n\t\t\tMath.sin(dLon / 2)\n\tconst c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))\n\treturn RADIUS_OF_EARTH_IN_KM * c * 1000\n}\n","import TokenTypes from './token-types'\n\n/**\n * @private\n */\nexport default class LexerState<T> {\n\tpublic source: string\n\tpublic position: number\n\tpublic tokenTypes: TokenTypes<T>\n\n\tconstructor(source: string, position: number = 0) {\n\t\tthis.source = source\n\t\tthis.position = position\n\t}\n\n\tcopy() {\n\t\treturn new LexerState<T>(this.source, this.position)\n\t}\n}\n","import Lexer from './lexer'\n\n/**\n * @typedef {{\n * start: Position,\n * end: Position,\n * }} TokenPosition\n */\n\n/**\n * Represents a token instance\n */\nclass Token<T> {\n\ttype: T\n\tmatch: string\n\tgroups: string[]\n\tstart: number\n\tend: number\n\tlexer: Lexer<T>\n\n\t/* tslint:disable:indent */\n\t/**\n\t * Constructs a token\n\t * @param {T} type The token type\n\t * @param {string} match The string that the lexer consumed to create this token\n\t * @param {string[]} groups Any RegExp groups that accrued during the match\n\t * @param {number} start The string position where this match started\n\t * @param {number} end The string position where this match ends\n\t * @param {Lexer<T>} lexer The parent {@link Lexer}\n\t */\n\tconstructor(\n\t\ttype: T,\n\t\tmatch: string,\n\t\tgroups: string[],\n\t\tstart: number,\n\t\tend: number,\n\t\tlexer: Lexer<T>\n\t) {\n\t\t/* tslint:enable */\n\t\t/**\n\t\t * The token type\n\t\t * @type {T}\n\t\t */\n\t\tthis.type = type\n\n\t\t/**\n\t\t * The string that the lexer consumed to create this token\n\t\t * @type {string}\n\t\t */\n\t\tthis.match = match\n\n\t\t/**\n\t\t * Any RegExp groups that accrued during the match\n\t\t * @type {string[]}\n\t\t */\n\t\tthis.groups = groups\n\n\t\t/**\n\t\t * The string position where this match started\n\t\t * @type {number}\n\t\t */\n\t\tthis.start = start\n\n\t\t/**\n\t\t * The string position where this match ends\n\t\t * @type {number}\n\t\t */\n\t\tthis.end = end\n\n\t\t/**\n\t\t * The parent {@link Lexer}\n\t\t * @type {Lexer<T>}\n\t\t */\n\t\tthis.lexer = lexer\n\t}\n\n\t/**\n\t * Returns the bounds of this token, each in `{line, column}` format\n\t * @return {TokenPosition}\n\t */\n\tstrpos() {\n\t\tconst start = this.lexer.strpos(this.start)\n\t\tconst end = this.lexer.strpos(this.end)\n\t\treturn { start, end }\n\t}\n\n\t// tslint:disable-next-line prefer-function-over-method\n\tisEof() {\n\t\treturn false\n\t}\n}\n\nexport default Token\n\nexport class EOFToken<T> extends Token<T> {\n\tconstructor(lexer: Lexer<T>) {\n\t\tconst end = lexer.source.length\n\t\tsuper(null, '(eof)', [], end, end, lexer)\n\t}\n\n\t// tslint:disable-next-line prefer-function-over-method\n\tisEof() {\n\t\treturn true\n\t}\n}\n\n/**\n * @private\n */\nexport const EOF = (lexer: Lexer<any>) => new EOFToken(lexer)\n","// Thank you, http://stackoverflow.com/a/6969486\nfunction toRegExp(str: string): RegExp {\n\treturn new RegExp(str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&'))\n}\n\nfunction normalize(regex: RegExp | string): RegExp {\n\tif (typeof regex === 'string') regex = toRegExp(regex)\n\tif (!regex.source.startsWith('^'))\n\t\treturn new RegExp(`^${regex.source}`, regex.flags)\n\telse return regex\n}\n\nfunction first<T, U>(\n\tarr: T[],\n\tpredicate: (item: T, i: number) => U\n): { item: T; result: U } {\n\tlet i = 0\n\tfor (const item of arr) {\n\t\tconst result = predicate(item, i++)\n\t\tif (result) return { item, result }\n\t}\n}\n\n/**\n * @private\n */\nexport default class TokenTypes<T> {\n\tpublic tokenTypes: {\n\t\ttype: T\n\t\tregex: RegExp\n\t\tenabled: boolean\n\t\tskip: boolean\n\t}[]\n\n\tconstructor() {\n\t\tthis.tokenTypes = []\n\t}\n\n\tdisable(type: T): TokenTypes<T> {\n\t\treturn this.enable(type, false)\n\t}\n\n\tenable(type: T, enabled: boolean = true): TokenTypes<T> {\n\t\tthis.tokenTypes\n\t\t\t.filter((t) => t.type == type)\n\t\t\t.forEach((t) => (t.enabled = enabled))\n\t\treturn this\n\t}\n\n\tisEnabled(type: T) {\n\t\tconst ttypes = this.tokenTypes.filter((tt) => tt.type == type)\n\t\tif (ttypes.length == 0)\n\t\t\tthrow new Error(`Token of type ${type} does not exists`)\n\t\treturn ttypes[0].enabled\n\t}\n\n\tpeek(source: string, position: number) {\n\t\tconst s = source.substr(position)\n\t\treturn first(\n\t\t\tthis.tokenTypes.filter((tt) => tt.enabled),\n\t\t\t(tt) => {\n\t\t\t\ttt.regex.lastIndex = 0\n\t\t\t\treturn tt.regex.exec(s)\n\t\t\t}\n\t\t)\n\t}\n\n\ttoken(\n\t\ttype: T,\n\t\tpattern: RegExp | string,\n\t\tskip: boolean = false\n\t): TokenTypes<T> {\n\t\tthis.tokenTypes.push({\n\t\t\ttype,\n\t\t\tregex: normalize(pattern),\n\t\t\tenabled: true,\n\t\t\tskip,\n\t\t})\n\t\treturn this\n\t}\n}\n","import LexerState from './lexer-state'\nimport Token, { EOF } from './token'\nimport TokenTypes from './token-types'\n\n/**\n * @typedef {{\n * line: number,\n * column: number,\n * }} Position\n */\n\n/**\n * Lexes a source-string into tokens.\n *\n * @example\n * const lex = perplex('...')\n * .token('ID', /my-id-regex/)\n * .token('(', /\\(/)\n * .token(')', /\\)/)\n * .token('WS', /\\s+/, true) // true means 'skip'\n *\n * while ((let t = lex.next()).type != 'EOF') {\n * console.log(t)\n * }\n * // alternatively:\n * console.log(lex.toArray())\n * // or:\n * console.log(...lex)\n */\nclass Lexer<T> implements Iterable<Token<T>> {\n\t/* tslint:disable:variable-name */\n\tprivate _state: LexerState<T>\n\tprivate _tokenTypes: TokenTypes<T>\n\t/* tslint:enable */\n\n\t/**\n\t * Creates a new Lexer instance\n\t * @param {string} [source = ''] The source string to operate on.\n\t */\n\tconstructor(source: string = '') {\n\t\tthis._state = new LexerState<T>(source)\n\t\tthis._tokenTypes = new TokenTypes<T>()\n\t}\n\n\t//\n\t// Getters/Setters\n\t//\n\n\t/**\n\t * Gets the current lexer position\n\t * @return {number} Returns the position\n\t */\n\tget position() {\n\t\treturn this._state.position\n\t}\n\n\t/**\n\t * Sets the current lexer position\n\t * @param {number} i The position to move to\n\t */\n\tset position(i: number) {\n\t\tthis._state.position = i\n\t}\n\n\t/**\n\t * Gets the source the lexer is operating on\n\t * @return {string} Returns the source\n\t */\n\tget source() {\n\t\treturn this._state.source\n\t}\n\n\t/**\n\t * Sets the source the lexer is operating on\n\t * @param {string} s The source to set\n\t */\n\tset source(s: string) {\n\t\tthis._state = new LexerState<T>(s)\n\t}\n\n\t//\n\t// METHODS\n\t//\n\n\t/**\n\t * Attaches this lexer to another lexer's state\n\t * @param {Lexer<T>} other The other lexer to attach to\n\t */\n\tattachTo(other: Lexer<T>) {\n\t\tthis._state = other._state\n\t}\n\n\t/**\n\t * Disables a token type\n\t * @param {T} type The token type to disable\n\t * @return {Lexer<T>}\n\t */\n\tdisable(type: T) {\n\t\tthis._tokenTypes.disable(type)\n\t\treturn this\n\t}\n\n\t/**\n\t * Enables a token type\n\t * @param {T} type The token type to enalbe\n\t * @param {?boolean} [enabled=true] Whether to enable/disable the specified token type\n\t * @return {Lexer<T>}\n\t */\n\tenable(type: T, enabled?: boolean) {\n\t\tthis._tokenTypes.enable(type, enabled)\n\t\treturn this\n\t}\n\n\t/**\n\t * Like {@link next}, but throws an exception if the next token is\n\t * not of the required type.\n\t * @param {T} type The token type expected from {@link next}\n\t * @return {Token<T>} Returns the {@link Token} on success\n\t */\n\texpect(type: T): Token<T> {\n\t\tconst t = this.next()\n\t\tif (t.type != type) {\n\t\t\tconst pos = t.strpos()\n\t\t\tthrow new Error(\n\t\t\t\t'Expected ' +\n\t\t\t\t\ttype +\n\t\t\t\t\t(t ? ', got ' + t.type : '') +\n\t\t\t\t\t' at ' +\n\t\t\t\t\tpos.start.line +\n\t\t\t\t\t':' +\n\t\t\t\t\tpos.start.column\n\t\t\t)\n\t\t}\n\t\treturn t\n\t}\n\n\t/**\n\t * Looks up whether a token is enabled.\n\t * @param tokenType The token type to look up\n\t * @return {boolean} Returns whether the token is enabled\n\t */\n\tisEnabled(tokenType: T) {\n\t\treturn this._tokenTypes.isEnabled(tokenType)\n\t}\n\n\t/**\n\t * Consumes and returns the next {@link Token} in the source string.\n\t * If there are no more tokens, it returns a {@link Token} of type `$EOF`\n\t * @return {Token<T>}\n\t */\n\tnext(): Token<T> {\n\t\ttry {\n\t\t\tconst t = this.peek()\n\t\t\tthis._state.position = t.end\n\t\t\treturn t\n\t\t} catch (e) {\n\t\t\tthis._state.position = e.end\n\t\t\tthrow e\n\t\t}\n\t}\n\n\t/**\n\t * Returns the next {@link Token} in the source string, but does\n\t * not consume it.\n\t * If there are no more tokens, it returns a {@link Token} of type `$EOF`\n\t * @param {number} [position=`this.position`] The position at which to start reading\n\t * @return {Token<T>}\n\t */\n\tpeek(position: number = this._state.position): Token<T> {\n\t\tconst read = (i: number = position) => {\n\t\t\tif (i >= this._state.source.length) return EOF(this)\n\t\t\tconst n = this._tokenTypes.peek(this._state.source, i)\n\t\t\treturn n\n\t\t\t\t? n.item.skip\n\t\t\t\t\t? read(i + n.result[0].length)\n\t\t\t\t\t: new Token(\n\t\t\t\t\t\t\tn.item.type,\n\t\t\t\t\t\t\tn.result[0],\n\t\t\t\t\t\t\tn.result.map((x) => x),\n\t\t\t\t\t\t\ti,\n\t\t\t\t\t\t\ti + n.result[0].length,\n\t\t\t\t\t\t\tthis\n\t\t\t\t\t )\n\t\t\t\t: null\n\t\t}\n\t\tconst t = read()\n\t\tif (t) return t\n\n\t\t// we did not find a match\n\t\tlet unexpected = this._state.source.substring(position, position + 1)\n\t\ttry {\n\t\t\tthis.peek(position + 1)\n\t\t} catch (e) {\n\t\t\tunexpected += e.unexpected\n\t\t}\n\t\tconst { line, column } = this.strpos(position)\n\t\tconst e = new Error(\n\t\t\t`Unexpected input: ${unexpected} at (${line}:${column})`\n\t\t)\n\t\t;(e as any).unexpected = unexpected\n\t\t;(e as any).end = position + unexpected.length\n\t\tthrow e\n\t}\n\n\t/**\n\t * Converts a string-index (relative to the source string) to a line and a column.\n\t * @param {number} i The index to compute\n\t * @return {Position}\n\t */\n\tstrpos(i: number): {\n\t\tline: number\n\t\tcolumn: number\n\t} {\n\t\tlet lines = this._state.source.substring(0, i).split(/\\r?\\n/)\n\t\tif (!Array.isArray(lines)) lines = [lines]\n\n\t\tconst line = lines.length\n\t\tconst column = lines[lines.length - 1].length + 1\n\t\treturn { line, column }\n\t}\n\n\t/**\n\t * Converts the token stream to an array of Tokens\n\t * @return {Token<T>[]} The array of tokens (not including (EOF))\n\t */\n\ttoArray(): Token<T>[] {\n\t\treturn [...this]\n\t}\n\n\t/**\n\t * Implements the Iterable protocol\n\t * Iterates lazily over the entire token stream (not including (EOF))\n\t * @return {Iterator<Token<T>>} Returns an iterator over all remaining tokens\n\t */\n\t*[Symbol.iterator]() {\n\t\tconst oldState = this._state.copy()\n\t\tthis._state.position = 0\n\n\t\tlet t\n\t\twhile (\n\t\t\t!(t = this.next()).isEof() // tslint:disable-line no-conditional-assignment\n\t\t)\n\t\t\tyield t\n\n\t\tthis._state = oldState\n\t}\n\n\t/**\n\t * Creates a new token type\n\t * @param {T} type The token type\n\t * @param {string|RegExp} pattern The pattern to match\n\t * @param {?boolean} skip Whether this type of token should be skipped\n\t * @return {Lexer<T>}\n\t */\n\ttoken(type: T, pattern: string | RegExp, skip?: boolean) {\n\t\tthis._tokenTypes.token(type, pattern, skip)\n\t\treturn this\n\t}\n\n\t/**\n\t * Creates a keyword\n\t * @param kwd The keyword to add as a token\n\t */\n\tkeyword(kwd: T) {\n\t\treturn this.token(kwd, new RegExp(`${kwd}(?=\\\\W|$)`))\n\t}\n\n\t/**\n\t * Creates an operator\n\t * @param op The operator to add as a token\n\t */\n\toperator(op: T) {\n\t\tconst sOp = new String(op).valueOf()\n\t\treturn this.token(op, sOp)\n\t}\n}\n\nexport default Lexer\nexport { EOF, Token, TokenTypes, LexerState, Lexer }\n","// From https://github.com/jrop/pratt/blob/master/src/index.ts\n\nexport interface IPosition {\n\tline: number\n\tcolumn: number\n}\nexport interface ITokenPosition {\n\tstart: IPosition\n\tend: IPosition\n}\nexport interface IToken<T> {\n\ttype: T\n\tmatch: string\n\tstrpos(): ITokenPosition\n\tisEof(): boolean\n}\nexport interface ILexer<T> {\n\tnext(): IToken<T>\n\tpeek(): IToken<T>\n}\n\nexport type BPResolver = () => number\nexport type BP = number | BPResolver\n\nexport type StopFunction = (<T>(x: T) => T) & { isStopped(): boolean }\n\nexport type NudInfo<T> = {\n\ttoken: IToken<T>\n\tbp: number\n\tstop: StopFunction\n\n\t// TODO: with the below addition of `options`\n\t// the `ctx parameter is carried through anyway\n\t// remove in a breaking API change release\n\tctx: any\n\toptions: ParseOpts<T>\n}\nexport type LedInfo<T> = NudInfo<T> & { left: any }\n\nexport type NudFunction<T> = (inf: NudInfo<T>) => any\nexport type LedFunction<T> = (inf: LedInfo<T>) => any\n\nexport type NudMap<T> = Map<T, NudFunction<T>>\nexport type LedMap<T> = Map<T, LedFunction<T>>\n\nexport type ParseOpts<T> = {\n\tctx?: any\n\tstop?: StopFunction\n\tterminals?: (number | T)[]\n}\n\nconst createStop = <T>(): StopFunction => {\n\tlet stopCalled = false\n\treturn Object.assign(\n\t\t(x: T) => {\n\t\t\tstopCalled = true\n\t\t\treturn x\n\t\t},\n\t\t{\n\t\t\tisStopped() {\n\t\t\t\treturn stopCalled\n\t\t\t},\n\t\t}\n\t) as StopFunction\n}\n\n/**\n * A Pratt parser.\n * @example\n * const lex = new perplex.Lexer('1 + -2 * 3^4')\n * .token('NUM', /\\d+/)\n * .token('+', /\\+/)\n * .token('-', /-/)\n * .token('*', new RegExp('*'))\n * .token('/', /\\//)\n * .token('^', /\\^/)\n * .token('(', /\\(/)\n * .token(')', /\\)/)\n * .token('$SKIP_WS', /\\s+/)\n *\n * const parser = new Parser(lex)\n * .builder()\n * .nud('NUM', 100, t => parseInt(t.match))\n * .nud('-', 10, (t, bp) => -parser.parse(bp))\n * .nud('(', 10, (t, bp) => {\n * const expr = parser.parse(bp)\n * lex.expect(')')\n * return expr\n * })\n * .bp(')', 0)\n *\n * .led('^', 20, (left, t, bp) => Math.pow(left, parser.parse(20 - 1)))\n * .led('+', 30, (left, t, bp) => left + parser.parse(bp))\n * .led('-', 30, (left, t, bp) => left - parser.parse(bp))\n * .led('*', 40, (left, t, bp) => left * parser.parse(bp))\n * .led('/', 40, (left, t, bp) => left / parser.parse(bp))\n * .build()\n * parser.parse()\n * // => 161\n */\nexport class Parser<T> {\n\tpublic lexer: ILexer<T>\n\t_nuds: NudMap<T>\n\t_leds: LedMap<T>\n\t_bps: Map<T, BP>\n\n\t/**\n\t * Constructs a Parser instance\n\t * @param {ILexer<T>} lexer The lexer to obtain tokens from\n\t */\n\tconstructor(lexer: ILexer<T>) {\n\t\t/**\n\t\t * The lexer that this parser is operating on.\n\t\t * @type {ILexer<T>}\n\t\t */\n\t\tthis.lexer = lexer\n\t\tthis._nuds = new Map()\n\t\tthis._leds = new Map()\n\t\tthis._bps = new Map()\n\t}\n\n\tprivate _type(tokenOrType: IToken<T> | T): T {\n\t\treturn tokenOrType && typeof (tokenOrType as IToken<T>).isEof == 'function'\n\t\t\t? (tokenOrType as IToken<T>).type\n\t\t\t: (tokenOrType as T)\n\t}\n\n\t/**\n\t * Create a {@link ParserBuilder}\n\t * @return {ParserBuilder<T>} Returns the ParserBuilder\n\t */\n\tbuilder(): ParserBuilder<T> {\n\t\treturn new ParserBuilder(this)\n\t}\n\n\t/**\n\t * Define binding power for a token-type\n\t * @param {IToken<T>|T} tokenOrType The token type to define the binding power for\n\t * @returns {number} The binding power of the specified token type\n\t */\n\tbp(tokenOrType: IToken<T> | T) {\n\t\tif (tokenOrType == null) return Number.NEGATIVE_INFINITY\n\t\tif (\n\t\t\ttokenOrType &&\n\t\t\ttypeof (tokenOrType as IToken<T>).isEof == 'function' &&\n\t\t\t(tokenOrType as IToken<T>).isEof()\n\t\t)\n\t\t\treturn Number.NEGATIVE_INFINITY\n\t\tconst type = this._type(tokenOrType)\n\t\tconst bp = this._bps.has(type)\n\t\t\t? this._bps.get(type)\n\t\t\t: Number.POSITIVE_INFINITY\n\t\treturn typeof bp == 'function' ? bp() : bp\n\t}\n\n\t/**\n\t * Computes the token's `nud` value and returns it\n\t * @param {NudInfo<T>} info The info to compute the `nud` from\n\t * @returns {any} The result of invoking the pertinent `nud` operator\n\t */\n\tnud(info: NudInfo<T>) {\n\t\tconst fn: NudFunction<T> | undefined = this._nuds.get(info.token.type)\n\t\tif (!fn) {\n\t\t\tconst { start } = info.token.strpos()\n\t\t\tthrow new Error(\n\t\t\t\t`Unexpected token: ${info.token.match} (at ${start.line}:${start.column})`\n\t\t\t)\n\t\t}\n\t\treturn fn(info)\n\t}\n\n\t/**\n\t * Computes a token's `led` value and returns it\n\t * @param {LedInfo<T>} info The info to compute the `led` value for\n\t * @returns {any} The result of invoking the pertinent `led` operator\n\t */\n\tled(info: LedInfo<T>) {\n\t\tlet fn = this._leds.get(info.token.type)\n\t\tif (!fn) {\n\t\t\tconst { start } = info.token.strpos()\n\t\t\tthrow new Error(\n\t\t\t\t`Unexpected token: ${info.token.match} (at ${start.line}:${start.column})`\n\t\t\t)\n\t\t}\n\t\treturn fn(info)\n\t}\n\n\t/**\n\t * Kicks off the Pratt parser, and returns the result\n\t * @param {ParseOpts<T>} opts The parse options\n\t * @returns {any}\n\t */\n\tparse(opts: ParseOpts<T> = { terminals: [0] }): any {\n\t\tconst stop = (opts.stop = opts.stop || createStop())\n\t\tconst check = () => {\n\t\t\tif (stop.isStopped()) return false\n\t\t\tconst t = this.lexer.peek()\n\t\t\tconst bp = this.bp(t)\n\n\t\t\t// @ts-ignore\n\t\t\treturn opts.terminals.reduce((canContinue, rbpOrType) => {\n\t\t\t\tif (!canContinue) return false\n\t\t\t\t// @ts-ignore\n\t\t\t\tif (typeof rbpOrType == 'number') return rbpOrType < bp\n\t\t\t\tif (typeof rbpOrType == 'string') return t.type != rbpOrType\n\t\t\t}, true)\n\t\t}\n\t\tconst mkinfo = (token: IToken<T>): NudInfo<T> => {\n\t\t\tconst bp = this.bp(token)\n\t\t\t// @ts-ignore\n\t\t\treturn { token, bp, stop, ctx: opts.ctx, options: opts }\n\t\t}\n\t\tif (!opts.terminals) opts.terminals = [0]\n\t\tif (opts.terminals.length == 0) opts.terminals.push(0)\n\n\t\tlet left = this.nud(mkinfo(this.lexer.next()))\n\t\twhile (check()) {\n\t\t\tconst operator = this.lexer.next()\n\t\t\tleft = this.led(Object.assign(mkinfo(operator), { left }))\n\t\t}\n\t\treturn left\n\t}\n}\n\n/**\n * Builds `led`/`nud` rules for a {@link Parser}\n */\nexport class ParserBuilder<T> {\n\tprivate _parser: Parser<T>\n\n\t/**\n\t * Constructs a ParserBuilder\n\t * See also: {@link Parser.builder}\n\t * @param {Parser<T>} parser The parser\n\t */\n\tconstructor(parser: Parser<T>) {\n\t\tthis._parser = parser\n\t}\n\n\t/**\n\t * Define `nud` for a token type\n\t * @param {T} tokenType The token type\n\t * @param {number} bp The binding power\n\t * @param {NudFunction<T>} fn The function that will parse the token\n\t * @return {ParserBuilder<T>} Returns this ParserBuilder\n\t */\n\tnud(tokenType: T, bp: BP, fn: NudFunction<T>): ParserBuilder<T> {\n\t\tthis._parser._nuds.set(tokenType, fn)\n\t\tthis.bp(tokenType, bp)\n\t\treturn this\n\t}\n\n\t/**\n\t * Define `led` for a token type\n\t * @param {T} tokenType The token type\n\t * @param {number} bp The binding power\n\t * @param {LedFunction<T>} fn The function that will parse the token\n\t * @return {ParserBuilder<T>} Returns this ParserBuilder\n\t */\n\tled(tokenType: T, bp: BP, fn: LedFunction<T>): ParserBuilder<T> {\n\t\tthis._parser._leds.set(tokenType, fn)\n\t\tthis.bp(tokenType, bp)\n\t\treturn this\n\t}\n\n\t/**\n\t * Define both `led` and `nud` for a token type at once.\n\t * The supplied `LedFunction` may be called with a null `left`\n\t * parameter when invoked from a `nud` context.\n\t * @param {strTng} tokenType The token type\n\t * @param {number} bp The binding power\n\t * @param {LedFunction<T>} fn The function that will parse the token\n\t * @return {ParserBuilder<T>} Returns this ParserBuilder\n\t */\n\teither(tokenType: T, bp: BP, fn: LedFunction<T>): ParserBuilder<T> {\n\t\treturn this.nud(tokenType, bp, (inf) =>\n\t\t\tfn(Object.assign(inf, { left: null }))\n\t\t).led(tokenType, bp, fn)\n\t}\n\n\t/**\n\t * Define the binding power for a token type\n\t * @param {T} tokenType The token type\n\t * @param {BP} bp The binding power\n\t * @return {ParserBuilder<T>} Returns this ParserBuilder\n\t */\n\tbp(tokenType: T, bp: BP): ParserBuilder<T> {\n\t\tthis._parser._bps.set(tokenType, bp)\n\t\treturn this\n\t}\n\n\t/**\n\t * Returns the parent {@link Parser} instance\n\t * @returns {Parser<T>}\n\t */\n\tbuild(): Parser<T> {\n\t\treturn this._parser\n\t}\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 { haversineDistance } from './haversine.js'\nimport { Lexer, Parser, type ITokenPosition } from './parser.js'\n\nexport class PredicateError {\n\tmessage: string\n\n\tconstructor(message: string) {\n\t\tthis.message = message\n\t}\n}\n\ntype MatchFunc = (target: any, variables: VariableMap) => boolean\ntype VariableMap = {\n\t[key: string]: any\n}\n\nexport const matchesPredicate = (\n\tpredicate: string | string[] | undefined,\n\ttarget: any,\n\tvariables?: VariableMap\n): boolean => {\n\tif (!predicate) {\n\t\treturn true\n\t}\n\n\tif (Array.isArray(predicate)) {\n\t\treturn predicate.every((item) => {\n\t\t\tconst func = generateMatchFunc(item)\n\t\t\treturn func(target, variables ?? {})\n\t\t})\n\t} else {\n\t\tconst func = generateMatchFunc(predicate)\n\t\treturn func(target, variables ?? {})\n\t}\n}\n\nexport const parseQueryExpression = (\n\tpredicate: string | string[]\n): MatchFunc => {\n\tif (Array.isArray(predicate)) {\n\t\tconst callbacks = predicate.map((item) => generateMatchFunc(item))\n\t\treturn (target: any, variables: VariableMap) =>\n\t\t\tcallbacks.every((callback) => callback(target, variables))\n\t} else {\n\t\treturn generateMatchFunc(predicate)\n\t}\n}\n\ntype TypeSymbol = {\n\ttype: 'var' | 'boolean' | 'string' | 'float' | 'int' | 'identifier'\n\tvalue: any\n\tpos?: ITokenPosition\n}\n\nconst validateSymbol = (val: TypeSymbol) => {\n\tif (!val.type) {\n\t\tthrow new PredicateError('Internal error')\n\t}\n\n\tif (val.type === 'identifier') {\n\t\tconst char = val.value.charAt(0)\n\t\tconst line = val.pos?.start.line\n\t\tconst column = val.pos?.start.column\n\n\t\tthrow new PredicateError(\n\t\t\t`Invalid input '${char}', expected input parameter or primitive value (line ${line}, column ${column})`\n\t\t)\n\t}\n}\n\nconst resolveSymbol = (val: TypeSymbol, vars: VariableMap): any => {\n\tif (val.type === 'var') {\n\t\tif (!(val.value in (vars ?? {}))) {\n\t\t\tthrow new PredicateError(`Missing parameter value for ${val.value}`)\n\t\t}\n\t\treturn vars[val.value]\n\t}\n\n\treturn val.value\n}\n\nconst resolveValue = (obj: any, val: TypeSymbol): any => {\n\tif (val.type !== 'identifier') {\n\t\tthrow new PredicateError('Internal error')\n\t}\n\n\tif (!(val.value in obj)) {\n\t\tif (Array.isArray(obj)) {\n\t\t\treturn Object.values(obj)\n\t\t\t\t.filter((v) => val.value in v)\n\t\t\t\t.map((v) => v[val.value])\n\t\t}\n\t\tthrow new PredicateError(`The field '${val.value}' does not exist.`)\n\t}\n\n\treturn obj[val.value]\n}\n\nconst getLexer = (value: string) =>\n\tnew Lexer(value)\n\n\t\t.token('AND', /and(?![-_a-z0-9]+)/i)\n\t\t.token('OR', /or(?![-_a-z0-9]+)/i)\n\t\t.token('NOT', /not(?![-_a-z0-9]+)/i)\n\n\t\t.token('WITHIN', /within(?![-_a-z0-9]+)/i)\n\t\t.token('IN', /in(?![-_a-z0-9]+)/i)\n\t\t.token('MATCHES_IGNORE_CASE', /matches\\s+ignore\\s+case(?![-_a-z0-9]+)/i)\n\t\t.token('CONTAINS', /contains(?![-_a-z0-9]+)/i)\n\t\t.token('ALL', /all(?![-_a-z0-9]+)/i)\n\t\t.token('ANY', /any(?![-_a-z0-9]+)/i)\n\t\t.token('EMPTY', /empty(?![-_a-z0-9]+)/i)\n\t\t.token('IS', /is(?![-_a-z0-9]+)/i)\n\t\t.token('DEFINED', /defined(?![-_a-z0-9]+)/i)\n\n\t\t.token('FLOAT', /\\d+\\.\\d+/)\n\t\t.token('INT', /\\d+/)\n\t\t.token('VARIABLE', /:([-_A-Za-z0-9]+)/)\n\t\t.token('BOOLEAN', /(true|false)/)\n\t\t.token('IDENTIFIER', /[-_A-Za-z0-9]+/)\n\t\t.token('STRING', /\"((?:\\\\.|[^\"\\\\])*)\"/)\n\t\t.token('STRING', /'((?:\\\\.|[^'\\\\])*)'/)\n\n\t\t.token('COMMA', ',')\n\t\t.token('(', '(')\n\t\t.token(')', ')')\n\t\t.token('>=', '>=')\n\t\t.token('<=', '<=')\n\t\t.token('>', '>')\n\t\t.token('<', '<')\n\t\t.token('!=', '!=')\n\t\t.token('=', '=')\n\t\t.token('\"', '\"')\n\t\t.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\tconst lexer = getLexer(predicate)\n\tconst parser = new Parser(lexer)\n\t\t.builder()\n\t\t.nud(\n\t\t\t'IDENTIFIER',\n\t\t\t100,\n\t\t\t(t) =>\n\t\t\t\t({\n\t\t\t\t\ttype: 'identifier',\n\t\t\t\t\tvalue: t.token.match,\n\t\t\t\t\tpos: t.token.strpos(),\n\t\t\t\t}) as TypeSymbol\n\t\t)\n\t\t.nud(\n\t\t\t'BOOLEAN',\n\t\t\t1,\n\t\t\t(t) =>\n\t\t\t\t({\n\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\tvalue: t.token.match === 'true' ? true : false,\n\t\t\t\t\tpos: t.token.strpos(),\n\t\t\t\t}) as TypeSymbol\n\t\t)\n\t\t.nud(\n\t\t\t'VARIABLE',\n\t\t\t100,\n\t\t\t(t) =>\n\t\t\t\t({\n\t\t\t\t\ttype: 'var',\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tvalue: t.token.groups[1],\n\t\t\t\t\tpos: t.token.strpos(),\n\t\t\t\t}) as TypeSymbol\n\t\t)\n\t\t.nud(\n\t\t\t'STRING',\n\t\t\t100,\n\t\t\t(t) =>\n\t\t\t\t({\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tvalue: t.token.groups[1],\n\t\t\t\t\tpos: t.token.strpos(),\n\t\t\t\t}) as TypeSymbol\n\t\t)\n\t\t.nud(\n\t\t\t'INT',\n\t\t\t1,\n\t\t\t(t) =>\n\t\t\t\t({\n\t\t\t\t\ttype: 'int',\n\t\t\t\t\tvalue: parseInt(t.token.match, 10),\n\t\t\t\t\tpos: t.token.strpos(),\n\t\t\t\t}) as TypeSymbol\n\t\t)\n\t\t.nud(\n\t\t\t'FLOAT',\n\t\t\t1,\n\t\t\t(t) =>\n\t\t\t\t({\n\t\t\t\t\ttype: 'float',\n\t\t\t\t\tvalue: parseFloat(t.token.match),\n\t\t\t\t\tpos: t.token.strpos(),\n\t\t\t\t}) as TypeSymbol\n\t\t)\n\t\t.nud('NOT', 100, ({ bp }) => {\n\t\t\tconst expr = parser.parse({ terminals: [bp - 1] })\n\t\t\treturn (obj: any) => !expr(obj)\n\t\t})\n\t\t.nud('EMPTY', 10, ({ bp }) => 'empty')\n\t\t.nud('DEFINED', 10, ({ bp }) => 'defined')\n\n\t\t.led('AND', 5, ({ left, bp }) => {\n\t\t\tconst expr = parser.parse({ terminals: [bp - 1] })\n\t\t\treturn (obj: any) => left(obj) && expr(obj)\n\t\t})\n\t\t.led('OR', 5, ({ left, token, bp }) => {\n\t\t\tconst expr = parser.parse({ terminals: [bp - 1] })\n\t\t\treturn (obj: any, vars: object) => left(obj, vars) || expr(obj, vars)\n\t\t})\n\t\t.led('COMMA', 1, ({ left, token, bp }) => {\n\t\t\tconst expr: any = parser.parse({ terminals: [bp - 1] })\n\t\t\tif (Array.isArray(expr)) {\n\t\t\t\treturn [left, ...expr]\n\t\t\t} else {\n\t\t\t\treturn [left, expr]\n\t\t\t}\n\t\t})\n\t\t.nud('(', 100, (t) => {\n\t\t\tconst expr: any = parser.parse({ terminals: [')'] })\n\t\t\treturn expr\n\t\t})\n\t\t.led('(', 100, ({ left, bp }) => {\n\t\t\tconst expr = parser.parse()\n\t\t\tlexer.expect(')')\n\t\t\treturn (obj: any, vars: object) => {\n\t\t\t\tconst value = resolveValue(obj, left)\n\t\t\t\tif (value) {\n\t\t\t\t\treturn expr(value, vars)\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t}\n\t\t})\n\t\t.bp(')', 0)\n\t\t.led('=', 20, ({ left, bp }) => {\n\t\t\tconst expr = parser.parse({ terminals: [bp - 1] })\n\t\t\tvalidateSymbol(expr)\n\n\t\t\treturn (obj: any, vars: VariableMap) => {\n\t\t\t\tconst resolvedValue = resolveValue(obj, left)\n\t\t\t\tconst resolvedSymbol = resolveSymbol(expr, vars)\n\t\t\t\tif (Array.isArray(resolvedValue)) {\n\t\t\t\t\treturn !!resolvedValue.some((elem) => elem === resolvedSymbol)\n\t\t\t\t}\n\t\t\t\treturn resolvedValue === resolvedSymbol\n\t\t\t}\n\t\t})\n\t\t.led('!=', 20, ({ left, bp }) => {\n\t\t\tconst expr = parser.parse({ terminals: [bp - 1] })\n\t\t\tvalidateSymbol(expr)\n\t\t\treturn (obj: any, vars: VariableMap) =>\n\t\t\t\tresolveValue(obj, left) !== resolveSymbol(expr, vars)\n\t\t})\n\t\t.led('>', 20, ({ left, bp }) => {\n\t\t\tconst expr = parser.parse({ terminals: [bp - 1] })\n\t\t\tvalidateSymbol(expr)\n\n\t\t\treturn (obj: any, vars: object) =>\n\t\t\t\tresolveValue(obj, left) > resolveSymbol(expr, vars)\n\t\t})\n\t\t.led('>=', 20, ({ left, bp }) => {\n\t\t\tconst expr = parser.parse({ terminals: [bp - 1] })\n\t\t\tvalidateSymbol(expr)\n\n\t\t\treturn (obj: any, vars: object) =>\n\t\t\t\tresolveValue(obj, left) >= resolveSymbol(expr, vars)\n\t\t})\n\t\t.led('<', 20, ({ left, bp }) => {\n\t\t\tconst expr = parser.parse({ terminals: [bp - 1] })\n\t\t\tvalidateSymbol(expr)\n\n\t\t\treturn (obj: any, vars: object) =>\n\t\t\t\tresolveValue(obj, left) < resolveSymbol(expr, vars)\n\t\t})\n\t\t.led('<=', 20, ({ left, bp }) => {\n\t\t\tconst expr = parser.parse({ terminals: [bp - 1] })\n\t\t\tvalidateSymbol(expr)\n\n\t\t\treturn (obj: any, vars: object) =>\n\t\t\t\tresolveValue(obj, left) <= resolveSymbol(expr, vars)\n\t\t})\n\t\t.led('IS', 20, ({ left, bp }) => {\n\t\t\tlet invert = false\n\n\t\t\t// Peek if this is a `is not` statement\n\t\t\tconst next = lexer.peek()\n\t\t\tif (next.type === 'NOT') {\n\t\t\t\tinvert = true\n\t\t\t\tlexer.next()\n\t\t\t}\n\n\t\t\tconst expr: any = parser.parse({ terminals: [bp - 1] })\n\n\t\t\tswitch (expr) {\n\t\t\t\tcase 'empty': {\n\t\t\t\t\tif (!invert) {\n\t\t\t\t\t\treturn (obj: any, vars: VariableMap) => {\n\t\t\t\t\t\t\tconst val = resolveValue(obj, left)\n\t\t\t\t\t\t\treturn val.length === 0\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn (obj: any, vars: VariableMap) => {\n\t\t\t\t\t\t\tconst val = resolveValue(obj, left)\n\t\t\t\t\t\t\treturn val.length !== 0\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcase 'defined': {\n\t\t\t\t\tif (!invert) {\n\t\t\t\t\t\treturn (obj: any, vars: VariableMap) => {\n\t\t\t\t\t\t\tconst val = resolveValue(obj, left)\n\t\t\t\t\t\t\treturn val !== undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn (obj: any, vars: VariableMap) => {\n\t\t\t\t\t\t\tconst val = resolveValue(obj, left)\n\t\t\t\t\t\t\treturn val === undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tthrow new Error('Unexpected')\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t\t.led('IN', 20, ({ left, bp }) => {\n\t\t\tconst expr = parser.parse({ terminals: [bp - 1] })\n\t\t\treturn (obj: any, vars: object) => {\n\t\t\t\tlet symbols = expr\n\t\t\t\tif (!Array.isArray(symbols)) {\n\t\t\t\t\tsymbols = [expr]\n\t\t\t\t}\n\n\t\t\t\tconst inValues = symbols.map((item: TypeSymbol) =>\n\t\t\t\t\tresolveSymbol(item, vars)\n\t\t\t\t)\n\t\t\t\treturn inValues.includes(resolveValue(obj, left))\n\t\t\t}\n\t\t})\n\t\t.led('MATCHES_IGNORE_CASE', 20, ({ left, bp }) => {\n\t\t\tconst expr = parser.parse({ terminals: [bp - 1] })\n\t\t\tvalidateSymbol(expr)\n\n\t\t\treturn (obj: any, vars: VariableMap) => {\n\t\t\t\tconst value = resolveValue(obj, left)\n\t\t\t\tconst other = resolveSymbol(expr, vars)\n\n\t\t\t\tif (typeof value != 'string') {\n\t\t\t\t\tthrow new PredicateError(\n\t\t\t\t\t\t`The field '${left.value}' does not support this expression.`\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\treturn value.toLowerCase() === other.toLowerCase()\n\t\t\t}\n\t\t})\n\t\t.led('WITHIN', 20, ({ left, bp }) => {\n\t\t\tconst type = lexer.next()\n\n\t\t\tif (type.match !== 'circle') {\n\t\t\t\tthrow new PredicateError(\n\t\t\t\t\t`Invalid input '${type.match}', expected circle`\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tlexer.expect('(')\n\t\t\tconst expr = parser.parse({ terminals: [')'] })\n\n\t\t\treturn (obj: any, vars: object) => {\n\t\t\t\tconst value = resolveValue(obj, left)\n\t\t\t\tif (!value) return false\n\n\t\t\t\tconst maxDistance = resolveSymbol(expr[2], vars)\n\t\t\t\tconst distance = haversineDistance(\n\t\t\t\t\t{\n\t\t\t\t\t\tlongitude: value[0],\n\t\t\t\t\t\tlatitude: value[1],\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tlongitude: resolveSymbol(expr[0], vars),\n\t\t\t\t\t\tlatitude: resolveSymbol(expr[1], vars),\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t\treturn distance <= maxDistance\n\t\t\t}\n\t\t})\n\t\t.led('CONTAINS', 20, ({ left, bp }) => {\n\t\t\tconst keyword = lexer.next()\n\n\t\t\tlet expr = parser.parse()\n\t\t\tif (!Array.isArray(expr)) {\n\t\t\t\texpr = [expr]\n\t\t\t}\n\n\t\t\treturn (obj: any, vars: object) => {\n\t\t\t\tconst value = resolveValue(obj, left)\n\n\t\t\t\tif (!Array.isArray(value)) {\n\t\t\t\t\tthrow new PredicateError(\n\t\t\t\t\t\t`The field '${left.value}' does not support this expression.`\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tconst array = expr.map((item: TypeSymbol) => resolveSymbol(item, vars))\n\t\t\t\tif (keyword.type === 'ALL') {\n\t\t\t\t\treturn array.every((item: any) => value.includes(item))\n\t\t\t\t} else {\n\t\t\t\t\treturn array.some((item: any) => value.includes(item))\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\t.build()\n\n\tconst result = parser.parse()\n\n\tif (typeof result !== 'function') {\n\t\tconst lines = predicate.split('\\n')\n\t\tconst column = lines[lines.length - 1].length\n\n\t\tthrow new PredicateError(\n\t\t\t`Unexpected end of input, expected SphereIdentifierChar, comparison ` +\n\t\t\t\t`operator, not, in, contains, is, within or matches` +\n\t\t\t\t` (line ${lines.length}, column ${column})`\n\t\t)\n\t}\n\treturn result\n}\n","import auth from 'basic-auth'\nimport bodyParser from 'body-parser'\nimport express, {\n\ttype NextFunction,\n\ttype Request,\n\ttype Response,\n} from 'express'\nimport { InvalidTokenError } from '@commercetools/platform-sdk'\nimport { CommercetoolsError, InvalidRequestError } from '../exceptions.js'\nimport { InvalidClientError, UnsupportedGrantType } from './errors.js'\nimport { OAuth2Store } from './store.js'\nimport { getBearerToken } from './helpers.js'\nimport { CustomerRepository } from '../repositories/customer.js'\nimport { hashPassword } from '../lib/password.js'\n\ntype AuthRequest = Request & {\n\tcredentials: {\n\t\tclientId: string\n\t\tclientSecret: string\n\t}\n}\n\nexport class OAuth2Server {\n\tstore: OAuth2Store\n\tprivate customerRepository: CustomerRepository\n\n\tconstructor(options: { enabled: boolean; validate: boolean }) {\n\t\tthis.store = new OAuth2Store(options.validate)\n\t}\n\n\tsetCustomerRepository(repository: CustomerRepository) {\n\t\tthis.customerRepository = repository\n\t}\n\n\tcreateRouter() {\n\t\tconst router = express.Router()\n\t\trouter.use(bodyParser.urlencoded({ extended: true }))\n\t\trouter.use(this.validateClientCredentials.bind(this))\n\t\trouter.post('/token', this.tokenHandler.bind(this))\n\t\trouter.post(\n\t\t\t'/:projectKey/customers/token',\n\t\t\tthis.customerTokenHandler.bind(this)\n\t\t)\n\t\trouter.post(\n\t\t\t'/:projectKey/in-store/key=:storeKey/customers/token',\n\t\t\tthis.inStoreCustomerTokenHandler.bind(this)\n\t\t)\n\t\trouter.post(\n\t\t\t'/:projectKey/anonymous/token',\n\t\t\tthis.anonymousTokenHandler.bind(this)\n\t\t)\n\t\treturn router\n\t}\n\n\tcreateMiddleware() {\n\t\treturn async (request: Request, response: Response, next: NextFunction) => {\n\t\t\tconst token = getBearerToken(request)\n\t\t\tif (!token) {\n\t\t\t\tnext(\n\t\t\t\t\tnew CommercetoolsError<InvalidTokenError>(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcode: 'invalid_token',\n\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\t'This endpoint requires an access token. You can get one from the authorization server.',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t401\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tif (!token || !this.store.validateToken(token)) {\n\t\t\t\tnext(\n\t\t\t\t\tnew CommercetoolsError<InvalidTokenError>(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcode: 'invalid_token',\n\t\t\t\t\t\t\tmessage: 'invalid_token',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t401\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tnext()\n\t\t}\n\t}\n\n\tasync validateClientCredentials(\n\t\trequest: AuthRequest,\n\t\tresponse: Response,\n\t\tnext: NextFunction\n\t) {\n\t\tconst authHeader = request.header('Authorization')\n\t\tif (!authHeader) {\n\t\t\treturn next(\n\t\t\t\tnew CommercetoolsError<InvalidClientError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'invalid_client',\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t'Please provide valid client credentials using HTTP Basic Authentication.',\n\t\t\t\t\t},\n\t\t\t\t\t401\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\t\tconst credentials = auth.parse(authHeader)\n\t\tif (!credentials) {\n\t\t\treturn next(\n\t\t\t\tnew CommercetoolsError<InvalidClientError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'invalid_client',\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t'Please provide valid client credentials using HTTP Basic Authentication.',\n\t\t\t\t\t},\n\t\t\t\t\t400\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\n\t\trequest.credentials = {\n\t\t\tclientId: credentials.name,\n\t\t\tclientSecret: credentials.pass,\n\t\t}\n\n\t\tnext()\n\t}\n\n\tasync tokenHandler(\n\t\trequest: AuthRequest,\n\t\tresponse: Response,\n\t\tnext: NextFunction\n\t) {\n\t\tconst grantType = request.query.grant_type || request.body.grant_type\n\t\tif (!grantType) {\n\t\t\treturn next(\n\t\t\t\tnew CommercetoolsError<InvalidRequestError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'invalid_request',\n\t\t\t\t\t\tmessage: 'Missing required parameter: grant_type.',\n\t\t\t\t\t},\n\t\t\t\t\t400\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\n\t\tif (grantType === 'client_credentials') {\n\t\t\tconst token = this.store.getClientToken(\n\t\t\t\trequest.credentials.clientId,\n\t\t\t\trequest.credentials.clientSecret,\n\t\t\t\trequest.query.scope?.toString()\n\t\t\t)\n\t\t\treturn response.status(200).send(token)\n\t\t} else if (grantType === 'refresh_token') {\n\t\t\tconst token = this.store.getClientToken(\n\t\t\t\trequest.credentials.clientId,\n\t\t\t\trequest.credentials.clientSecret,\n\t\t\t\trequest.query.scope?.toString()\n\t\t\t)\n\t\t\treturn response.status(200).send(token)\n\t\t} else {\n\t\t\treturn next(\n\t\t\t\tnew CommercetoolsError<UnsupportedGrantType>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'unsupported_grant_type',\n\t\t\t\t\t\tmessage: `Invalid parameter: grant_type: Invalid grant type: ${grantType}`,\n\t\t\t\t\t},\n\t\t\t\t\t400\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\t}\n\tasync customerTokenHandler(\n\t\trequest: AuthRequest,\n\t\tresponse: Response,\n\t\tnext: NextFunction\n\t) {\n\t\tconst grantType = request.query.grant_type || request.body.grant_type\n\t\tif (!grantType) {\n\t\t\treturn next(\n\t\t\t\tnew CommercetoolsError<InvalidRequestError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'invalid_request',\n\t\t\t\t\t\tmessage: 'Missing required parameter: grant_type.',\n\t\t\t\t\t},\n\t\t\t\t\t400\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\n\t\tif (grantType === 'password') {\n\t\t\tconst username = request.query.username || request.body.username\n\t\t\tconst password = hashPassword(\n\t\t\t\trequest.query.password || request.body.password\n\t\t\t)\n\t\t\tconst scope =\n\t\t\t\trequest.query.scope?.toString() || request.body.scope?.toString()\n\n\t\t\tconst result = this.customerRepository.query(\n\t\t\t\t{ projectKey: request.params.projectKey },\n\t\t\t\t{\n\t\t\t\t\twhere: [`email = \"${username}\"`, `password = \"${password}\"`],\n\t\t\t\t}\n\t\t\t)\n\n\t\t\tif (result.count === 0) {\n\t\t\t\treturn next(\n\t\t\t\t\tnew CommercetoolsError<any>(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcode: 'invalid_customer_account_credentials',\n\t\t\t\t\t\t\tmessage: 'Customer account with the given credentials not found.',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t400\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tconst customer = result.results[0]\n\t\t\tconst token = this.store.getCustomerToken(scope, customer.id)\n\t\t\treturn response.status(200).send(token)\n\t\t}\n\t}\n\n\tasync inStoreCustomerTokenHandler(\n\t\trequest: Request,\n\t\tresponse: Response,\n\t\tnext: NextFunction\n\t) {\n\t\treturn next(\n\t\t\tnew CommercetoolsError<InvalidClientError>(\n\t\t\t\t{\n\t\t\t\t\tcode: 'invalid_client',\n\t\t\t\t\tmessage: 'Not implemented yet in commercetools-mock',\n\t\t\t\t},\n\t\t\t\t401\n\t\t\t)\n\t\t)\n\t}\n\n\tasync anonymousTokenHandler(\n\t\trequest: Request,\n\t\tresponse: Response,\n\t\tnext: NextFunction\n\t) {\n\t\treturn next(\n\t\t\tnew CommercetoolsError<InvalidClientError>(\n\t\t\t\t{\n\t\t\t\t\tcode: 'invalid_client',\n\t\t\t\t\tmessage: 'Not implemented yet in commercetools-mock',\n\t\t\t\t},\n\t\t\t\t401\n\t\t\t)\n\t\t)\n\t}\n}\n","import { randomBytes } from 'crypto'\n\ntype Token = {\n\taccess_token: string\n\ttoken_type: 'Bearer'\n\texpires_in: number\n\tscope: string\n}\n\nexport class OAuth2Store {\n\ttokens: Token[] = []\n\tvalidate = true\n\n\tconstructor(validate = true) {\n\t\tthis.validate = validate\n\t}\n\n\tgetClientToken(clientId: string, clientSecret: string, scope?: string) {\n\t\tconst token: Token = {\n\t\t\taccess_token: randomBytes(16).toString('base64'),\n\t\t\ttoken_type: 'Bearer',\n\t\t\texpires_in: 172800,\n\t\t\tscope: scope || 'todo',\n\t\t}\n\t\tthis.tokens.push(token)\n\t\treturn token\n\t}\n\n\tgetCustomerToken(scope: string, customerId: string) {\n\t\tconst token: Token = {\n\t\t\taccess_token: randomBytes(16).toString('base64'),\n\t\t\ttoken_type: 'Bearer',\n\t\t\texpires_in: 172800,\n\t\t\tscope: scope\n\t\t\t\t? `${scope} custome_id:${customerId}`\n\t\t\t\t: `customer_id: ${customerId}`,\n\t\t}\n\t\tthis.tokens.push(token)\n\t\treturn token\n\t}\n\n\tvalidateToken(token: string) {\n\t\tif (!this.validate) return true\n\n\t\tconst foundToken = this.tokens.find((t) => t.access_token === token)\n\t\tif (foundToken) {\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n}\n","import { Request } from 'express'\n\nexport const getBearerToken = (request: Request): string | undefined => {\n\tconst authHeader = request.header('Authorization')\n\tconst match = authHeader?.match(/^Bearer\\s(?<token>[^\\s]+)$/)\n\tif (match) {\n\t\treturn match.groups?.token\n\t}\n\treturn undefined\n}\n","export const validatePassword = (\n\tclearPassword: string,\n\thashedPassword: string\n) => hashPassword(clearPassword) === hashedPassword\n\nexport const hashPassword = (clearPassword: string) =>\n\tBuffer.from(clearPassword).toString('base64')\n","import { getBaseResourceProperties } from './helpers.js'\nimport { GetParams } from './repositories/abstract.js'\nimport { RepositoryMap } from './repositories/index.js'\nimport { AbstractStorage } from './storage/index.js'\nimport { ResourceMap, ResourceType } from './types.js'\n\nexport class ProjectAPI {\n\tprivate projectKey: string\n\tprivate _storage: AbstractStorage\n\tprivate _repositories: RepositoryMap\n\n\tconstructor(\n\t\tprojectKey: string,\n\t\trepositories: RepositoryMap,\n\t\tstorage: AbstractStorage\n\t) {\n\t\tthis.projectKey = projectKey\n\t\tthis._storage = storage\n\t\tthis._repositories = repositories\n\t}\n\n\tadd<T extends keyof RepositoryMap & keyof ResourceMap>(\n\t\ttypeId: T,\n\t\tresource: ResourceMap[T]\n\t) {\n\t\tconst repository = this._repositories[typeId]\n\t\tif (repository) {\n\t\t\tthis._storage.add(this.projectKey, typeId, {\n\t\t\t\t...getBaseResourceProperties(),\n\t\t\t\t...resource,\n\t\t\t})\n\t\t} else {\n\t\t\tthrow new Error(`Service for ${typeId} not implemented yet`)\n\t\t}\n\t}\n\n\tget<RT extends ResourceType>(\n\t\ttypeId: RT,\n\t\tid: string,\n\t\tparams?: GetParams\n\t): ResourceMap[RT] {\n\t\treturn this._storage.get(\n\t\t\tthis.projectKey,\n\t\t\ttypeId,\n\t\t\tid,\n\t\t\tparams\n\t\t) as ResourceMap[RT]\n\t}\n\n\t// TODO: Not sure if we want to expose this...\n\tgetRepository<RT extends keyof RepositoryMap>(typeId: RT): RepositoryMap[RT] {\n\t\tconst repository = this._repositories[typeId]\n\t\tif (repository !== undefined) {\n\t\t\treturn repository as RepositoryMap[RT]\n\t\t}\n\t\tthrow new Error('No such repository')\n\t}\n}\n","export const copyHeaders = (headers: Headers) => {\n\tconst validHeaders = ['accept', 'host', 'authorization', 'content-type']\n\tconst result: Record<string, string> = {}\n\n\tfor (const [key, value] of headers.entries()) {\n\t\tif (validHeaders.includes(key.toLowerCase())) {\n\t\t\tresult[key] = value\n\t\t}\n\t}\n\n\treturn result\n}\n","export const DEFAULT_API_HOSTNAME = 'https://api.*.commercetools.com'\nexport const DEFAULT_AUTH_HOSTNAME = 'https://auth.*.commercetools.com'\n","import {\n\tAssociateRoleReference,\n\ttype Address,\n\ttype Associate,\n\ttype AssociateDraft,\n\ttype AssociateRoleAssignment,\n\ttype AssociateRoleAssignmentDraft,\n\ttype AssociateRoleKeyReference,\n\ttype AssociateRoleResourceIdentifier,\n\ttype BaseAddress,\n\ttype CentPrecisionMoney,\n\ttype CustomFields,\n\ttype CustomFieldsDraft,\n\ttype HighPrecisionMoney,\n\ttype HighPrecisionMoneyDraft,\n\ttype InvalidJsonInputError,\n\ttype Price,\n\ttype PriceDraft,\n\ttype Reference,\n\ttype ReferencedResourceNotFoundError,\n\ttype ResourceIdentifier,\n\ttype Store,\n\ttype StoreKeyReference,\n\ttype StoreReference,\n\ttype StoreResourceIdentifier,\n\ttype Type,\n\ttype TypedMoney,\n\ttype _Money,\n\tBusinessUnitResourceIdentifier,\n\tBusinessUnitKeyReference,\n\tBusinessUnitReference,\n} from '@commercetools/platform-sdk'\nimport type { Request } from 'express'\nimport { v4 as uuidv4 } from 'uuid'\nimport { CommercetoolsError } from '../exceptions.js'\nimport { AbstractStorage } from '../storage/index.js'\nimport { type RepositoryContext } from './abstract.js'\n\nexport const createAddress = (\n\tbase: BaseAddress | undefined,\n\tprojectKey: string,\n\tstorage: AbstractStorage\n): Address | undefined => {\n\tif (!base) return undefined\n\n\tif (!base?.country) {\n\t\tthrow new Error('Country is required')\n\t}\n\n\treturn {\n\t\t...base,\n\t}\n}\n\nexport const createCustomFields = (\n\tdraft: CustomFieldsDraft | undefined,\n\tprojectKey: string,\n\tstorage: AbstractStorage\n): CustomFields | undefined => {\n\tif (!draft) return undefined\n\tif (!draft.type) return undefined\n\tif (!draft.type.typeId) return undefined\n\tif (!draft.fields) return undefined\n\tconst typeResource = storage.getByResourceIdentifier(\n\t\tprojectKey,\n\t\tdraft.type\n\t) as Type\n\n\tif (!typeResource) {\n\t\tthrow new Error(\n\t\t\t`No type '${draft.type.typeId}' with id=${draft.type.id} or key=${draft.type.key}`\n\t\t)\n\t}\n\n\treturn {\n\t\ttype: {\n\t\t\ttypeId: draft.type.typeId,\n\t\t\tid: typeResource.id,\n\t\t},\n\t\tfields: draft.fields,\n\t}\n}\n\nexport const createPrice = (draft: PriceDraft): Price => ({\n\tid: uuidv4(),\n\tvalue: createTypedMoney(draft.value),\n})\n\nexport const createCentPrecisionMoney = (value: _Money): CentPrecisionMoney => {\n\t// Taken from https://docs.adyen.com/development-resources/currency-codes\n\tlet fractionDigits = 2\n\tswitch (value.currencyCode.toUpperCase()) {\n\t\tcase 'BHD':\n\t\tcase 'IQD':\n\t\tcase 'JOD':\n\t\tcase 'KWD':\n\t\tcase 'LYD':\n\t\tcase 'OMR':\n\t\tcase 'TND':\n\t\t\tfractionDigits = 3\n\t\t\tbreak\n\t\tcase 'CVE':\n\t\tcase 'DJF':\n\t\tcase 'GNF':\n\t\tcase 'IDR':\n\t\tcase 'JPY':\n\t\tcase 'KMF':\n\t\tcase 'KRW':\n\t\tcase 'PYG':\n\t\tcase 'RWF':\n\t\tcase 'UGX':\n\t\tcase 'VND':\n\t\tcase 'VUV':\n\t\tcase 'XAF':\n\t\tcase 'XOF':\n\t\tcase 'XPF':\n\t\t\tfractionDigits = 0\n\t\t\tbreak\n\t\tdefault:\n\t\t\tfractionDigits = 2\n\t}\n\n\tif ((value as HighPrecisionMoney & HighPrecisionMoneyDraft).preciseAmount) {\n\t\tthrow new Error('HighPrecisionMoney not supported')\n\t}\n\n\treturn {\n\t\ttype: 'centPrecision',\n\t\t// centAmont is only optional on HighPrecisionMoney, so this should never\n\t\t// fallback to 0\n\t\tcentAmount: value.centAmount ?? 0,\n\t\tcurrencyCode: value.currencyCode,\n\t\tfractionDigits: fractionDigits,\n\t}\n}\n\nexport const createTypedMoney = (value: _Money): TypedMoney => {\n\tconst result = createCentPrecisionMoney(value)\n\treturn result\n}\n\nexport const resolveStoreReference = (\n\tref: StoreResourceIdentifier | undefined,\n\tprojectKey: string,\n\tstorage: AbstractStorage\n): StoreKeyReference | undefined => {\n\tif (!ref) return undefined\n\tconst resource = storage.getByResourceIdentifier(projectKey, ref)\n\tif (!resource) {\n\t\tthrow new Error('No such store')\n\t}\n\n\tconst store = resource as Store\n\treturn {\n\t\ttypeId: 'store',\n\t\tkey: store.key,\n\t}\n}\n\nexport const getReferenceFromResourceIdentifier = <T extends Reference>(\n\tresourceIdentifier: ResourceIdentifier,\n\tprojectKey: string,\n\tstorage: AbstractStorage\n): T => {\n\tif (!resourceIdentifier.id && !resourceIdentifier.key) {\n\t\tthrow new CommercetoolsError<InvalidJsonInputError>(\n\t\t\t{\n\t\t\t\tcode: 'InvalidJsonInput',\n\t\t\t\tmessage: `${resourceIdentifier.typeId}: ResourceIdentifier requires an 'id' xor a 'key'`,\n\t\t\t\tdetailedErrorMessage: `ResourceIdentifier requires an 'id' xor a 'key'`,\n\t\t\t},\n\t\t\t400\n\t\t)\n\t}\n\n\tconst resource = storage.getByResourceIdentifier(\n\t\tprojectKey,\n\t\tresourceIdentifier\n\t)\n\tif (!resource) {\n\t\tconst errIdentifier = resourceIdentifier.key\n\t\t\t? `key '${resourceIdentifier.key}'`\n\t\t\t: `identifier '${resourceIdentifier.key}'`\n\n\t\tthrow new CommercetoolsError<ReferencedResourceNotFoundError>(\n\t\t\t{\n\t\t\t\tcode: 'ReferencedResourceNotFound',\n\t\t\t\t// @ts-ignore\n\t\t\t\ttypeId: resourceIdentifier.typeId,\n\t\t\t\tmessage: `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\t\t\t},\n\t\t\t400\n\t\t)\n\t}\n\n\treturn {\n\t\ttypeId: resourceIdentifier.typeId,\n\t\tid: resource?.id,\n\t} as unknown as T\n}\n\nexport const getStoreKeyReference = (\n\tid: StoreResourceIdentifier,\n\tprojectKey: string,\n\tstorage: AbstractStorage\n): StoreKeyReference => {\n\tif (id.key) {\n\t\treturn {\n\t\t\ttypeId: 'store',\n\t\t\tkey: id.key,\n\t\t}\n\t}\n\tconst value = getReferenceFromResourceIdentifier<StoreReference>(\n\t\tid,\n\t\tprojectKey,\n\t\tstorage\n\t)\n\n\tif (!value.obj?.key) {\n\t\tthrow new Error('No store found for reference')\n\t}\n\treturn {\n\t\ttypeId: 'store',\n\t\tkey: value.obj?.key,\n\t}\n}\n\nexport const getRepositoryContext = (request: Request): RepositoryContext => ({\n\tprojectKey: request.params.projectKey,\n\tstoreKey: request.params.storeKey,\n})\n\nexport const createAssociate = (\n\ta: AssociateDraft,\n\tprojectKey: string,\n\tstorage: AbstractStorage\n): Associate | undefined => {\n\tif (!a) return undefined\n\n\tif (!a.associateRoleAssignments) {\n\t\tthrow new Error('AssociateRoleAssignments is required')\n\t}\n\n\treturn {\n\t\tcustomer: getReferenceFromResourceIdentifier(\n\t\t\ta.customer,\n\t\t\tprojectKey,\n\t\t\tstorage\n\t\t),\n\t\tassociateRoleAssignments: a.associateRoleAssignments?.map(\n\t\t\t(a: AssociateRoleAssignmentDraft): AssociateRoleAssignment => ({\n\t\t\t\tassociateRole: getAssociateRoleKeyReference(\n\t\t\t\t\ta.associateRole,\n\t\t\t\t\tprojectKey,\n\t\t\t\t\tstorage\n\t\t\t\t),\n\t\t\t\tinheritance: a.inheritance as string,\n\t\t\t})\n\t\t),\n\t\troles: a.roles as string[],\n\t}\n}\n\nexport const getAssociateRoleKeyReference = (\n\tid: AssociateRoleResourceIdentifier,\n\tprojectKey: string,\n\tstorage: AbstractStorage\n): AssociateRoleKeyReference => {\n\tif (id.key) {\n\t\treturn {\n\t\t\ttypeId: 'associate-role',\n\t\t\tkey: id.key,\n\t\t}\n\t}\n\n\tconst value = getReferenceFromResourceIdentifier<AssociateRoleReference>(\n\t\tid,\n\t\tprojectKey,\n\t\tstorage\n\t)\n\n\tif (!value.obj?.key) {\n\t\tthrow new Error('No associate-role found for reference')\n\t}\n\n\treturn {\n\t\ttypeId: 'associate-role',\n\t\tkey: value.obj?.key,\n\t}\n}\n\nexport const getBusinessUnitKeyReference = (\n\tid: BusinessUnitResourceIdentifier,\n\tprojectKey: string,\n\tstorage: AbstractStorage\n): BusinessUnitKeyReference => {\n\tif (id.key) {\n\t\treturn {\n\t\t\ttypeId: 'business-unit',\n\t\t\tkey: id.key,\n\t\t}\n\t}\n\n\tconst value = getReferenceFromResourceIdentifier<BusinessUnitReference>(\n\t\tid,\n\t\tprojectKey,\n\t\tstorage\n\t)\n\n\tif (!value.obj?.key) {\n\t\tthrow new Error('No business-unit found for reference')\n\t}\n\n\treturn {\n\t\ttypeId: 'business-unit',\n\t\tkey: value.obj?.key,\n\t}\n}\n","import type { Update } from '@commercetools/platform-sdk'\nimport { Request, Response, Router } from 'express'\nimport { getRepositoryContext } from '../repositories/helpers.js'\nimport { ProjectRepository } from '../repositories/project.js'\n\nexport class ProjectService {\n\tpublic repository: ProjectRepository\n\n\tconstructor(parent: Router, repository: ProjectRepository) {\n\t\tthis.repository = repository\n\t\tthis.registerRoutes(parent)\n\t}\n\n\tregisterRoutes(parent: Router) {\n\t\tparent.get('', this.get.bind(this))\n\t\tparent.post('', this.post.bind(this))\n\t}\n\n\tget(request: Request, response: Response) {\n\t\tconst project = this.repository.get(getRepositoryContext(request))\n\t\treturn response.status(200).send(project)\n\t}\n\n\tpost(request: Request, response: Response) {\n\t\tconst updateRequest: Update = request.body\n\t\tconst project = this.repository.get(getRepositoryContext(request))\n\n\t\tif (!project) {\n\t\t\treturn response.status(404).send({})\n\t\t}\n\n\t\tconst updatedResource = this.repository.processUpdateActions(\n\t\t\tgetRepositoryContext(request),\n\t\t\tproject,\n\t\t\tupdateRequest.version,\n\t\t\tupdateRequest.actions\n\t\t)\n\n\t\treturn response.status(200).send(updatedResource)\n\t}\n}\n","import type {\n\tBaseResource,\n\tProject,\n\tResourceNotFoundError,\n\tUpdateAction,\n} from '@commercetools/platform-sdk'\nimport deepEqual from 'deep-equal'\nimport { CommercetoolsError } from '../exceptions.js'\nimport { cloneObject } from '../helpers.js'\nimport { AbstractStorage } from '../storage/index.js'\nimport { ResourceMap, ResourceType, ShallowWritable } from './../types.js'\nimport { checkConcurrentModification } from './errors.js'\n\nexport type QueryParams = {\n\texpand?: string[]\n\twhere?: string[]\n\toffset?: number\n\tlimit?: number\n}\n\nexport type GetParams = {\n\texpand?: string[]\n}\n\nexport type RepositoryContext = {\n\tprojectKey: string\n\tstoreKey?: string\n}\n\nexport abstract class AbstractRepository<R extends BaseResource | Project> {\n\tprotected _storage: AbstractStorage\n\tprotected actions: Partial<\n\t\tRecord<\n\t\t\tany,\n\t\t\t(context: RepositoryContext, resource: any, action: any) => void\n\t\t>\n\t> = {}\n\n\tconstructor(storage: AbstractStorage) {\n\t\tthis._storage = storage\n\t}\n\n\tabstract saveNew({ projectKey }: RepositoryContext, resource: R): void\n\n\tabstract saveUpdate(\n\t\t{ projectKey }: RepositoryContext,\n\t\tversion: number,\n\t\tresource: R\n\t): void\n\n\tprocessUpdateActions(\n\t\tcontext: RepositoryContext,\n\t\tresource: R,\n\t\tversion: number,\n\t\tactions: UpdateAction[]\n\t): R {\n\t\t// Deep-copy\n\t\tconst updatedResource = cloneObject(resource) as ShallowWritable<R>\n\t\tconst identifier = (resource as BaseResource).id\n\t\t\t? (resource as BaseResource).id\n\t\t\t: (resource as Project).key\n\n\t\tactions.forEach((action) => {\n\t\t\tconst updateFunc = this.actions[action.action]\n\n\t\t\tif (!updateFunc) {\n\t\t\t\tconsole.error(`No mock implemented for update action ${action.action}`)\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`No mock implemented for update action ${action.action}`\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tconst beforeUpdate = cloneObject(resource)\n\t\t\tupdateFunc(context, updatedResource, action)\n\n\t\t\t// Check if the object is updated. We need to increase the version of\n\t\t\t// an object per action which does an actual modification.\n\t\t\t// This isn't the most performant method to do this (the update action\n\t\t\t// should return a flag) but for now the easiest.\n\t\t\tif (!deepEqual(beforeUpdate, updatedResource)) {\n\t\t\t\t// We only check the version when there is an actual modification to\n\t\t\t\t// be stored.\n\t\t\t\tcheckConcurrentModification(resource.version, version, identifier)\n\n\t\t\t\tupdatedResource.version += 1\n\t\t\t}\n\t\t})\n\n\t\t// If all actions succeeded we write the new version\n\t\t// to the storage.\n\t\tif (resource.version != updatedResource.version) {\n\t\t\tthis.saveUpdate(context, version, updatedResource)\n\t\t}\n\n\t\tconst result = this.postProcessResource(updatedResource)\n\t\tif (!result) {\n\t\t\tthrow new Error('invalid post process action')\n\t\t}\n\t\treturn result\n\t}\n\n\tabstract postProcessResource(resource: any): any\n}\n\nexport abstract class AbstractResourceRepository<\n\tT extends ResourceType,\n> extends AbstractRepository<ResourceMap[T]> {\n\tabstract create(context: RepositoryContext, draft: any): ResourceMap[T]\n\tabstract getTypeId(): T\n\n\tconstructor(storage: AbstractStorage) {\n\t\tsuper(storage)\n\t}\n\n\tpostProcessResource(resource: ResourceMap[T]): ResourceMap[T] {\n\t\treturn resource\n\t}\n\n\tquery(context: RepositoryContext, params: QueryParams = {}) {\n\t\tconst result = this._storage.query(context.projectKey, this.getTypeId(), {\n\t\t\texpand: params.expand,\n\t\t\twhere: params.where,\n\t\t\toffset: params.offset,\n\t\t\tlimit: params.limit,\n\t\t})\n\n\t\t// @ts-ignore\n\t\tresult.results = result.results.map(this.postProcessResource)\n\t\treturn result\n\t}\n\n\tget(\n\t\tcontext: RepositoryContext,\n\t\tid: string,\n\t\tparams: GetParams = {}\n\t): ResourceMap[T] | null {\n\t\tconst resource = this._storage.get(\n\t\t\tcontext.projectKey,\n\t\t\tthis.getTypeId(),\n\t\t\tid,\n\t\t\tparams\n\t\t)\n\t\treturn resource ? this.postProcessResource(resource) : null\n\t}\n\n\tgetByKey(\n\t\tcontext: RepositoryContext,\n\t\tkey: string,\n\t\tparams: GetParams = {}\n\t): ResourceMap[T] | null {\n\t\tconst resource = this._storage.getByKey(\n\t\t\tcontext.projectKey,\n\t\t\tthis.getTypeId(),\n\t\t\tkey,\n\t\t\tparams\n\t\t)\n\t\treturn resource ? this.postProcessResource(resource) : null\n\t}\n\n\tdelete(\n\t\tcontext: RepositoryContext,\n\t\tid: string,\n\t\tparams: GetParams = {}\n\t): ResourceMap[T] | null {\n\t\tconst resource = this._storage.delete(\n\t\t\tcontext.projectKey,\n\t\t\tthis.getTypeId(),\n\t\t\tid,\n\t\t\tparams\n\t\t)\n\t\treturn resource ? this.postProcessResource(resource) : null\n\t}\n\n\tsaveNew(\n\t\tcontext: RepositoryContext,\n\t\tresource: ShallowWritable<ResourceMap[T]>\n\t) {\n\t\tresource.version = 1\n\t\tthis._storage.add(context.projectKey, this.getTypeId(), resource as any)\n\t}\n\n\tsaveUpdate(\n\t\tcontext: RepositoryContext,\n\t\tversion: number,\n\t\tresource: ShallowWritable<ResourceMap[T]>\n\t) {\n\t\t// Check if the resource still exists.\n\t\tconst current = this._storage.get(\n\t\t\tcontext.projectKey,\n\t\t\tthis.getTypeId(),\n\t\t\tresource.id\n\t\t)\n\t\tif (!current) {\n\t\t\tthrow new CommercetoolsError<ResourceNotFoundError>(\n\t\t\t\t{\n\t\t\t\t\tcode: 'ResourceNotFound',\n\t\t\t\t\tmessage: 'Resource not found while updating',\n\t\t\t\t},\n\t\t\t\t400\n\t\t\t)\n\t\t}\n\n\t\tcheckConcurrentModification(current.version, version, resource.id)\n\n\t\tif (current.version === resource.version) {\n\t\t\tthrow new Error('Internal error: no changes to save')\n\t\t}\n\t\tresource.lastModifiedAt = new Date().toISOString()\n\n\t\tthis._storage.add(context.projectKey, this.getTypeId(), resource as any)\n\n\t\treturn resource\n\t}\n}\n","import { type ConcurrentModificationError } from '@commercetools/platform-sdk'\nimport { CommercetoolsError } from '../exceptions.js'\n\nexport const checkConcurrentModification = (\n\tcurrentVersion: number,\n\texpectedVersion: number,\n\tidentifier: string\n) => {\n\tif (currentVersion === expectedVersion) return\n\tconsole.error(\n\t\t`Object ${identifier} has a different version than expected. Expected: ${expectedVersion} - Actual: ${currentVersion}.`\n\t)\n\n\tthrow new CommercetoolsError<ConcurrentModificationError>(\n\t\t{\n\t\t\tmessage: `Object ${identifier} has a different version than expected. Expected: ${expectedVersion} - Actual: ${currentVersion}.`,\n\t\t\tcurrentVersion: currentVersion,\n\t\t\tcode: 'ConcurrentModification',\n\t\t},\n\t\t409\n\t)\n}\n","import type {\n\tAssociateRole,\n\tAssociateRoleAddPermissionAction,\n\tAssociateRoleChangeBuyerAssignableAction,\n\tAssociateRoleDraft,\n\tAssociateRoleRemovePermissionAction,\n\tAssociateRoleSetCustomFieldAction,\n\tAssociateRoleSetNameAction,\n\tAssociateRoleSetPermissionsAction,\n} from '@commercetools/platform-sdk'\nimport {\n\tAbstractResourceRepository,\n\ttype RepositoryContext,\n} from './abstract.js'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport { createCustomFields } from './helpers.js'\nimport { Writable } from '../types.js'\n\nexport class AssociateRoleRepository extends AbstractResourceRepository<'associate-role'> {\n\tgetTypeId() {\n\t\treturn 'associate-role' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: AssociateRoleDraft): AssociateRole {\n\t\tconst resource: AssociateRole = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tkey: draft.key,\n\t\t\tname: draft.name,\n\t\t\tbuyerAssignable: draft.buyerAssignable || false,\n\t\t\tpermissions: draft.permissions || [],\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t}\n\n\t\tthis.saveNew(context, resource)\n\n\t\treturn resource\n\t}\n\n\tactions = {\n\t\tsetName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<AssociateRole>,\n\t\t\t{ name }: AssociateRoleSetNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\t\tsetPermissions: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<AssociateRole>,\n\t\t\t{ permissions }: AssociateRoleSetPermissionsAction\n\t\t) => {\n\t\t\tresource.permissions = permissions || []\n\t\t},\n\t\tsetBuyerAssignable: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<AssociateRole>,\n\t\t\t{ buyerAssignable }: AssociateRoleChangeBuyerAssignableAction\n\t\t) => {\n\t\t\tresource.buyerAssignable = buyerAssignable\n\t\t},\n\t\tchangeBuyerAssignable: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<AssociateRole>,\n\t\t\t{ buyerAssignable }: AssociateRoleChangeBuyerAssignableAction\n\t\t) => {\n\t\t\tresource.buyerAssignable = buyerAssignable\n\t\t},\n\t\tsetCustomFields: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<AssociateRole>,\n\t\t\t{ name, value }: AssociateRoleSetCustomFieldAction\n\t\t) => {\n\t\t\tif (!resource.custom) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (value === null) {\n\t\t\t\tdelete resource.custom.fields[name]\n\t\t\t} else {\n\t\t\t\tresource.custom.fields[name] = value\n\t\t\t}\n\t\t},\n\t\taddPermission: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<AssociateRole>,\n\t\t\t{ permission }: AssociateRoleAddPermissionAction\n\t\t) => {\n\t\t\tif (!resource.permissions) {\n\t\t\t\tresource.permissions = [permission]\n\t\t\t} else {\n\t\t\t\tresource.permissions.push(permission)\n\t\t\t}\n\t\t},\n\t\tremovePermission: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<AssociateRole>,\n\t\t\t{ permission }: AssociateRoleRemovePermissionAction\n\t\t) => {\n\t\t\tif (!resource.permissions) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tresource.permissions = resource.permissions.filter((p) => {\n\t\t\t\tp !== permission\n\t\t\t})\n\t\t},\n\t}\n}\n","import type {\n\tAttributeGroup,\n\tAttributeGroupChangeNameAction,\n\tAttributeGroupDraft,\n\tAttributeGroupSetAttributesAction,\n\tAttributeGroupSetDescriptionAction,\n\tAttributeGroupSetKeyAction,\n} from '@commercetools/platform-sdk'\nimport {\n\tAbstractResourceRepository,\n\ttype RepositoryContext,\n} from './abstract.js'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport { Writable } from '../types.js'\n\nexport class AttributeGroupRepository extends AbstractResourceRepository<'attribute-group'> {\n\tgetTypeId() {\n\t\treturn 'attribute-group' as const\n\t}\n\n\tcreate(\n\t\tcontext: RepositoryContext,\n\t\tdraft: AttributeGroupDraft\n\t): AttributeGroup {\n\t\tconst resource: AttributeGroup = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tname: draft.name,\n\t\t\tdescription: draft.description,\n\t\t\tkey: draft.key,\n\t\t\tattributes: draft.attributes,\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tactions = {\n\t\tsetAttributes: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<AttributeGroup>,\n\t\t\t{ attributes }: AttributeGroupSetAttributesAction\n\t\t) => {\n\t\t\tresource.attributes = attributes\n\t\t},\n\t\tchangeName: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<AttributeGroup>,\n\t\t\t{ name }: AttributeGroupChangeNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\t\tsetDescription: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<AttributeGroup>,\n\t\t\t{ description }: AttributeGroupSetDescriptionAction\n\t\t) => {\n\t\t\tresource.description = description\n\t\t},\n\t\tsetKey: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<AttributeGroup>,\n\t\t\t{ key }: AttributeGroupSetKeyAction\n\t\t) => {\n\t\t\tresource.key = key\n\t\t},\n\t}\n}\n","import {\n\ttype Associate,\n\ttype BusinessUnit,\n\ttype BusinessUnitAddAddressAction,\n\ttype BusinessUnitAddAssociateAction,\n\ttype BusinessUnitAddStoreAction,\n\ttype BusinessUnitChangeAddressAction,\n\ttype BusinessUnitChangeNameAction,\n\ttype BusinessUnitChangeParentUnitAction,\n\ttype BusinessUnitDraft,\n\ttype BusinessUnitSetAssociatesAction,\n\ttype BusinessUnitSetContactEmailAction,\n\ttype BusinessUnitSetStoreModeAction,\n\ttype Company,\n\ttype Division,\n\tBusinessUnitChangeStatusAction,\n\tCompanyDraft,\n\tDivisionDraft,\n} from '@commercetools/platform-sdk'\nimport {\n\tAbstractResourceRepository,\n\ttype RepositoryContext,\n} from './abstract.js'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport {\n\tcreateAddress,\n\tcreateAssociate,\n\tcreateCustomFields,\n\tgetBusinessUnitKeyReference,\n\tgetStoreKeyReference,\n} from './helpers.js'\nimport { Writable } from '../types.js'\n\nexport class BusinessUnitRepository extends AbstractResourceRepository<'business-unit'> {\n\tgetTypeId() {\n\t\treturn 'business-unit' as const\n\t}\n\n\tprivate _isCompanyDraft(draft: BusinessUnitDraft): draft is CompanyDraft {\n\t\treturn draft.unitType === 'Company'\n\t}\n\n\tprivate _isDivisionDraft(draft: BusinessUnitDraft): draft is DivisionDraft {\n\t\treturn draft.unitType === 'Division'\n\t}\n\n\tcreate(context: RepositoryContext, draft: BusinessUnitDraft): BusinessUnit {\n\t\tconst resource = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tkey: draft.key,\n\t\t\tstatus: draft.status,\n\t\t\tstores: draft.stores?.map((s) =>\n\t\t\t\tgetStoreKeyReference(s, context.projectKey, this._storage)\n\t\t\t),\n\t\t\tstoreMode: draft.storeMode,\n\t\t\tname: draft.name,\n\t\t\tcontactEmail: draft.contactEmail,\n\t\t\taddresses: draft.addresses?.map((a) =>\n\t\t\t\tcreateAddress(a, context.projectKey, this._storage)\n\t\t\t),\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t\tshippingAddressIds: draft.shippingAddresses,\n\t\t\tdefaultShippingAddressId: draft.defaultShippingAddress,\n\t\t\tbillingAddressIds: draft.billingAddresses,\n\t\t\tassociateMode: draft.associateMode,\n\t\t\tassociates: draft.associates?.map((a) =>\n\t\t\t\tcreateAssociate(a, context.projectKey, this._storage)\n\t\t\t),\n\t\t}\n\n\t\tif (this._isDivisionDraft(draft)) {\n\t\t\tconst division = {\n\t\t\t\t...resource,\n\t\t\t\tparentUnit: getBusinessUnitKeyReference(\n\t\t\t\t\tdraft.parentUnit,\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\tthis._storage\n\t\t\t\t),\n\t\t\t} as Division\n\n\t\t\tthis.saveNew(context, division)\n\t\t\treturn division\n\t\t} else if (this._isCompanyDraft(draft)) {\n\t\t\tconst company = resource as Company\n\n\t\t\tthis.saveNew(context, company)\n\t\t\treturn company\n\t\t}\n\n\t\tthrow new Error('Invalid business unit type')\n\t}\n\n\tactions = {\n\t\taddAddress: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<BusinessUnit>,\n\t\t\t{ address }: BusinessUnitAddAddressAction\n\t\t) => {\n\t\t\tconst newAddress = createAddress(\n\t\t\t\taddress,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t)\n\t\t\tif (newAddress) {\n\t\t\t\tresource.addresses.push(newAddress)\n\t\t\t}\n\t\t},\n\t\taddAssociate: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<BusinessUnit>,\n\t\t\t{ associate }: BusinessUnitAddAssociateAction\n\t\t) => {\n\t\t\tconst newAssociate = createAssociate(\n\t\t\t\tassociate,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t)\n\t\t\tif (newAssociate) {\n\t\t\t\tresource.associates.push(newAssociate)\n\t\t\t}\n\t\t},\n\t\tsetAssociates: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<BusinessUnit>,\n\t\t\t{ associates }: BusinessUnitSetAssociatesAction\n\t\t) => {\n\t\t\tconst newAssociates = associates\n\t\t\t\t.map((a) => createAssociate(a, context.projectKey, this._storage))\n\t\t\t\t.filter((a): a is Writable<Associate> => a !== undefined)\n\t\t\tresource.associates = newAssociates || undefined\n\t\t},\n\t\tsetContactEmail: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<BusinessUnit>,\n\t\t\t{ contactEmail }: BusinessUnitSetContactEmailAction\n\t\t) => {\n\t\t\tresource.contactEmail = contactEmail\n\t\t},\n\t\tsetStoreMode: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<BusinessUnit>,\n\t\t\t{ storeMode }: BusinessUnitSetStoreModeAction\n\t\t) => {\n\t\t\tresource.storeMode = storeMode\n\t\t},\n\t\tchangeAssociateMode: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<BusinessUnit>,\n\t\t\t{ storeMode }: BusinessUnitSetStoreModeAction\n\t\t) => {\n\t\t\tresource.associateMode = storeMode\n\t\t},\n\t\tchangeName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<BusinessUnit>,\n\t\t\t{ name }: BusinessUnitChangeNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\t\tchangeAddress: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<BusinessUnit>,\n\t\t\t{ address }: BusinessUnitChangeAddressAction\n\t\t) => {\n\t\t\tconst newAddress = createAddress(\n\t\t\t\taddress,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t)\n\t\t\tif (newAddress) {\n\t\t\t\tresource.addresses.push(newAddress)\n\t\t\t}\n\t\t},\n\t\taddStore: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<BusinessUnit>,\n\t\t\t{ store }: BusinessUnitAddStoreAction\n\t\t) => {\n\t\t\tconst newStore = getStoreKeyReference(\n\t\t\t\tstore,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t)\n\t\t\tif (newStore) {\n\t\t\t\tif (!resource.stores) {\n\t\t\t\t\tresource.stores = []\n\t\t\t\t}\n\n\t\t\t\tresource.stores.push(newStore)\n\t\t\t}\n\t\t},\n\t\tchangeParentUnit: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<BusinessUnit>,\n\t\t\t{ parentUnit }: BusinessUnitChangeParentUnitAction\n\t\t) => {\n\t\t\tresource.parentUnit = getBusinessUnitKeyReference(\n\t\t\t\tparentUnit,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t)\n\t\t},\n\t\tchangeStatus: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<BusinessUnit>,\n\t\t\t{ status }: BusinessUnitChangeStatusAction\n\t\t) => {\n\t\t\tresource.status = status\n\t\t},\n\t}\n}\n","import type {\n\tAddress,\n\tAddressDraft,\n\tCart,\n\tCartAddLineItemAction,\n\tCartChangeLineItemQuantityAction,\n\tCartAddItemShippingAddressAction,\n\tCartSetLineItemShippingDetailsAction,\n\tCartDraft,\n\tCartRemoveLineItemAction,\n\tCartSetBillingAddressAction,\n\tCartSetCountryAction,\n\tCartSetCustomerEmailAction,\n\tCartSetCustomFieldAction,\n\tCartSetCustomTypeAction,\n\tCartSetLocaleAction,\n\tCartSetShippingAddressAction,\n\tCartSetShippingMethodAction,\n\tCustomFields,\n\tGeneralError,\n\tLineItem,\n\tLineItemDraft,\n\tItemShippingDetails,\n\tPrice,\n\tProduct,\n\tProductPagedQueryResponse,\n\tCartRemoveDiscountCodeAction,\n\tProductVariant,\n} from '@commercetools/platform-sdk'\nimport { v4 as uuidv4 } from 'uuid'\nimport { CommercetoolsError } from '../exceptions.js'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport {\n\tAbstractResourceRepository,\n\ttype RepositoryContext,\n} from './abstract.js'\nimport { createAddress, createCustomFields } from './helpers.js'\n\nexport class CartRepository extends AbstractResourceRepository<'cart'> {\n\tgetTypeId() {\n\t\treturn 'cart' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: CartDraft): Cart {\n\t\tconst lineItems =\n\t\t\tdraft.lineItems?.map((draftLineItem) =>\n\t\t\t\tthis.draftLineItemtoLineItem(\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\tdraftLineItem,\n\t\t\t\t\tdraft.currency,\n\t\t\t\t\tdraft.country\n\t\t\t\t)\n\t\t\t) ?? []\n\n\t\tconst resource: Writable<Cart> = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tcartState: 'Active',\n\t\t\tcountry: draft.country,\n\t\t\tcustomLineItems: [],\n\t\t\tdirectDiscounts: [],\n\t\t\tdiscountCodes: [],\n\t\t\tinventoryMode: 'None',\n\t\t\titemShippingAddresses: [],\n\t\t\tlineItems,\n\t\t\tlocale: draft.locale,\n\t\t\ttaxCalculationMode: draft.taxCalculationMode ?? 'LineItemLevel',\n\t\t\ttaxMode: draft.taxMode ?? 'Platform',\n\t\t\ttaxRoundingMode: draft.taxRoundingMode ?? 'HalfEven',\n\t\t\ttotalPrice: {\n\t\t\t\ttype: 'centPrecision',\n\t\t\t\tcentAmount: 0,\n\t\t\t\tcurrencyCode: draft.currency,\n\t\t\t\tfractionDigits: 0,\n\t\t\t},\n\t\t\tshippingMode: 'Single',\n\t\t\tshipping: [],\n\t\t\torigin: draft.origin ?? 'Customer',\n\t\t\trefusedGifts: [],\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t}\n\t\tresource.totalPrice.centAmount = calculateCartTotalPrice(resource)\n\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tgetActiveCart(projectKey: string): Cart | undefined {\n\t\t// Get first active cart\n\t\tconst results = this._storage.query(projectKey, this.getTypeId(), {\n\t\t\twhere: [`cartState=\"Active\"`],\n\t\t})\n\t\tif (results.count > 0) {\n\t\t\treturn results.results[0] as Cart\n\t\t}\n\n\t\treturn\n\t}\n\n\tactions = {\n\t\taddLineItem: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Cart>,\n\t\t\t{ productId, variantId, sku, quantity = 1 }: CartAddLineItemAction\n\t\t) => {\n\t\t\tlet product: Product | null = null\n\n\t\t\tif (productId && variantId) {\n\t\t\t\t// Fetch product and variant by ID\n\t\t\t\tproduct = this._storage.get(\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\t'product',\n\t\t\t\t\tproductId,\n\t\t\t\t\t{}\n\t\t\t\t)\n\t\t\t} else if (sku) {\n\t\t\t\t// Fetch product and variant by SKU\n\t\t\t\tconst items = this._storage.query(context.projectKey, 'product', {\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t`masterData(current(masterVariant(sku=\"${sku}\"))) or masterData(current(variants(sku=\"${sku}\")))`,\n\t\t\t\t\t],\n\t\t\t\t}) as ProductPagedQueryResponse\n\n\t\t\t\tif (items.count === 1) {\n\t\t\t\t\tproduct = items.results[0]\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!product) {\n\t\t\t\t// Check if product is found\n\t\t\t\tthrow new CommercetoolsError<GeneralError>({\n\t\t\t\t\tcode: 'General',\n\t\t\t\t\tmessage: sku\n\t\t\t\t\t\t? `A product containing a variant with SKU '${sku}' not found.`\n\t\t\t\t\t\t: `A product with ID '${productId}' not found.`,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// Find matching variant\n\t\t\tconst variant: ProductVariant | undefined = [\n\t\t\t\tproduct.masterData.current.masterVariant,\n\t\t\t\t...product.masterData.current.variants,\n\t\t\t].find((x) => {\n\t\t\t\tif (sku) return x.sku === sku\n\t\t\t\tif (variantId) return x.id === variantId\n\t\t\t\treturn false\n\t\t\t})\n\n\t\t\tif (!variant) {\n\t\t\t\t// Check if variant is found\n\t\t\t\tthrow new CommercetoolsError<GeneralError>({\n\t\t\t\t\tcode: 'General',\n\t\t\t\t\tmessage: sku\n\t\t\t\t\t\t? `A variant with SKU '${sku}' for product '${product.id}' not found.`\n\t\t\t\t\t\t: `A variant with ID '${variantId}' for product '${product.id}' not found.`,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tconst alreadyAdded = resource.lineItems.some(\n\t\t\t\t(x) => x.productId === product?.id && x.variant.id === variant?.id\n\t\t\t)\n\t\t\tif (alreadyAdded) {\n\t\t\t\t// increase quantity and update total price\n\t\t\t\tresource.lineItems.forEach((x) => {\n\t\t\t\t\tif (x.productId === product?.id && x.variant.id === variant?.id) {\n\t\t\t\t\t\tx.quantity += quantity\n\t\t\t\t\t\tx.totalPrice.centAmount = calculateLineItemTotalPrice(x)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\t// add line item\n\t\t\t\tif (!variant.prices?.length) {\n\t\t\t\t\tthrow new CommercetoolsError<GeneralError>({\n\t\t\t\t\t\tcode: 'General',\n\t\t\t\t\t\tmessage: `A product with ID '${productId}' doesn't have any prices.`,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tconst currency = resource.totalPrice.currencyCode\n\n\t\t\t\tconst price = selectPrice({\n\t\t\t\t\tprices: variant.prices,\n\t\t\t\t\tcurrency,\n\t\t\t\t\tcountry: resource.country,\n\t\t\t\t})\n\t\t\t\tif (!price) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`No valid price found for ${productId} for country ${resource.country} and currency ${currency}`\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tresource.lineItems.push({\n\t\t\t\t\tid: uuidv4(),\n\t\t\t\t\tproductId: product.id,\n\t\t\t\t\tproductKey: product.key,\n\t\t\t\t\tproductSlug: product.masterData.current.slug,\n\t\t\t\t\tproductType: product.productType,\n\t\t\t\t\tname: product.masterData.current.name,\n\t\t\t\t\tvariant,\n\t\t\t\t\tprice: price,\n\t\t\t\t\ttaxedPricePortions: [],\n\t\t\t\t\tperMethodTaxRate: [],\n\t\t\t\t\ttotalPrice: {\n\t\t\t\t\t\t...price.value,\n\t\t\t\t\t\ttype: 'centPrecision',\n\t\t\t\t\t\tcentAmount: price.value.centAmount * quantity,\n\t\t\t\t\t},\n\t\t\t\t\tquantity,\n\t\t\t\t\tdiscountedPricePerQuantity: [],\n\t\t\t\t\tlineItemMode: 'Standard',\n\t\t\t\t\tpriceMode: 'Platform',\n\t\t\t\t\tstate: [],\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// Update cart total price\n\t\t\tresource.totalPrice.centAmount = calculateCartTotalPrice(resource)\n\t\t},\n\t\taddItemShippingAddress: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Cart>,\n\t\t\t{ action, address }: CartAddItemShippingAddressAction\n\t\t) => {\n\t\t\tconst newAddress = createAddress(\n\t\t\t\taddress,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t)\n\t\t\tif (newAddress) {\n\t\t\t\tresource.itemShippingAddresses.push(newAddress)\n\t\t\t}\n\t\t},\n\t\tchangeLineItemQuantity: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Cart>,\n\t\t\t{ lineItemId, lineItemKey, quantity }: CartChangeLineItemQuantityAction\n\t\t) => {\n\t\t\tlet lineItem: Writable<LineItem> | undefined\n\n\t\t\tif (lineItemId) {\n\t\t\t\tlineItem = resource.lineItems.find((x) => x.id === lineItemId)\n\t\t\t\tif (!lineItem) {\n\t\t\t\t\tthrow new CommercetoolsError<GeneralError>({\n\t\t\t\t\t\tcode: 'General',\n\t\t\t\t\t\tmessage: `A line item with ID '${lineItemId}' not found.`,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t} else if (lineItemKey) {\n\t\t\t\tlineItem = resource.lineItems.find((x) => x.id === lineItemId)\n\t\t\t\tif (!lineItem) {\n\t\t\t\t\tthrow new CommercetoolsError<GeneralError>({\n\t\t\t\t\t\tcode: 'General',\n\t\t\t\t\t\tmessage: `A line item with Key '${lineItemKey}' not found.`,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthrow new CommercetoolsError<GeneralError>({\n\t\t\t\t\tcode: 'General',\n\t\t\t\t\tmessage: `Either lineItemid or lineItemKey needs to be provided.`,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tif (quantity === 0) {\n\t\t\t\t// delete line item\n\t\t\t\tresource.lineItems = resource.lineItems.filter(\n\t\t\t\t\t(x) => x.id !== lineItemId\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tresource.lineItems.forEach((x) => {\n\t\t\t\t\tif (x.id === lineItemId && quantity) {\n\t\t\t\t\t\tx.quantity = quantity\n\t\t\t\t\t\tx.totalPrice.centAmount = calculateLineItemTotalPrice(x)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// Update cart total price\n\t\t\tresource.totalPrice.centAmount = calculateCartTotalPrice(resource)\n\t\t},\n\t\tremoveLineItem: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Cart>,\n\t\t\t{ lineItemId, quantity }: CartRemoveLineItemAction\n\t\t) => {\n\t\t\tconst lineItem = resource.lineItems.find((x) => x.id === lineItemId)\n\t\t\tif (!lineItem) {\n\t\t\t\t// Check if product is found\n\t\t\t\tthrow new CommercetoolsError<GeneralError>({\n\t\t\t\t\tcode: 'General',\n\t\t\t\t\tmessage: `A line item with ID '${lineItemId}' not found.`,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tconst shouldDelete = !quantity || quantity >= lineItem.quantity\n\t\t\tif (shouldDelete) {\n\t\t\t\t// delete line item\n\t\t\t\tresource.lineItems = resource.lineItems.filter(\n\t\t\t\t\t(x) => x.id !== lineItemId\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\t// decrease quantity and update total price\n\t\t\t\tresource.lineItems.forEach((x) => {\n\t\t\t\t\tif (x.id === lineItemId && quantity) {\n\t\t\t\t\t\tx.quantity -= quantity\n\t\t\t\t\t\tx.totalPrice.centAmount = calculateLineItemTotalPrice(x)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// Update cart total price\n\t\t\tresource.totalPrice.centAmount = calculateCartTotalPrice(resource)\n\t\t},\n\t\tsetBillingAddress: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Cart>,\n\t\t\t{ address }: CartSetBillingAddressAction\n\t\t) => {\n\t\t\tresource.billingAddress = createAddress(\n\t\t\t\taddress,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t)\n\t\t},\n\t\tsetShippingMethod: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Cart>,\n\t\t\t{ shippingMethod }: CartSetShippingMethodAction\n\t\t) => {\n\t\t\tif (shippingMethod) {\n\t\t\t\tconst method = this._storage.getByResourceIdentifier<'shipping-method'>(\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\tshippingMethod\n\t\t\t\t)\n\n\t\t\t\tif (!method) {\n\t\t\t\t\tthrow new Error(`Type ${shippingMethod} not found`)\n\t\t\t\t}\n\n\t\t\t\t// Based on the address we should select a shipping zone and\n\t\t\t\t// use that to define the price.\n\t\t\t\t// @ts-ignore\n\t\t\t\tresource.shippingInfo = {\n\t\t\t\t\tshippingMethod: {\n\t\t\t\t\t\ttypeId: 'shipping-method',\n\t\t\t\t\t\tid: method.id,\n\t\t\t\t\t},\n\t\t\t\t\tshippingMethodName: method.name,\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresource.shippingInfo = undefined\n\t\t\t}\n\t\t},\n\t\tsetCountry: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Cart>,\n\t\t\t{ country }: CartSetCountryAction\n\t\t) => {\n\t\t\tresource.country = country\n\t\t},\n\t\tsetCustomerEmail: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Cart>,\n\t\t\t{ email }: CartSetCustomerEmailAction\n\t\t) => {\n\t\t\tresource.customerEmail = email\n\t\t},\n\t\tsetCustomField: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Cart,\n\t\t\t{ name, value }: CartSetCustomFieldAction\n\t\t) => {\n\t\t\tif (!resource.custom) {\n\t\t\t\tthrow new Error('Resource has no custom field')\n\t\t\t}\n\t\t\tresource.custom.fields[name] = value\n\t\t},\n\t\tsetCustomType: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Cart>,\n\t\t\t{ type, fields }: CartSetCustomTypeAction\n\t\t) => {\n\t\t\tif (!type) {\n\t\t\t\tresource.custom = undefined\n\t\t\t} else {\n\t\t\t\tconst resolvedType = this._storage.getByResourceIdentifier(\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\ttype\n\t\t\t\t)\n\t\t\t\tif (!resolvedType) {\n\t\t\t\t\tthrow new Error(`Type ${type} not found`)\n\t\t\t\t}\n\n\t\t\t\tresource.custom = {\n\t\t\t\t\ttype: {\n\t\t\t\t\t\ttypeId: 'type',\n\t\t\t\t\t\tid: resolvedType.id,\n\t\t\t\t\t},\n\t\t\t\t\tfields: fields || {},\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tsetLocale: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Cart>,\n\t\t\t{ locale }: CartSetLocaleAction\n\t\t) => {\n\t\t\tresource.locale = locale\n\t\t},\n\t\tsetLineItemShippingDetails: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Cart>,\n\t\t\t{\n\t\t\t\taction,\n\t\t\t\tshippingDetails,\n\t\t\t\tlineItemId,\n\t\t\t\tlineItemKey,\n\t\t\t}: CartSetLineItemShippingDetailsAction\n\t\t) => {\n\t\t\tconst lineItem = resource.lineItems.find(\n\t\t\t\t(x) =>\n\t\t\t\t\t(lineItemId && x.id === lineItemId) ||\n\t\t\t\t\t(lineItemKey && x.key === lineItemKey)\n\t\t\t)\n\n\t\t\tif (!lineItem) {\n\t\t\t\t// Check if line item is found\n\t\t\t\tthrow new CommercetoolsError<GeneralError>({\n\t\t\t\t\tcode: 'General',\n\t\t\t\t\tmessage: lineItemKey\n\t\t\t\t\t\t? `A line item with key '${lineItemKey}' not found.`\n\t\t\t\t\t\t: `A line item with ID '${lineItemId}' not found.`,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tlineItem.shippingDetails = {\n\t\t\t\t...shippingDetails,\n\t\t\t\tvalid: true,\n\t\t\t} as ItemShippingDetails\n\t\t},\n\t\tsetShippingAddress: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Cart>,\n\t\t\t{ address }: CartSetShippingAddressAction\n\t\t) => {\n\t\t\tif (!address) {\n\t\t\t\tresource.shippingAddress = undefined\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tlet custom: CustomFields | undefined = undefined\n\t\t\tif ((address as Address & AddressDraft).custom) {\n\t\t\t\tcustom = createCustomFields(\n\t\t\t\t\t(address as Address & AddressDraft).custom,\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\tthis._storage\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tresource.shippingAddress = {\n\t\t\t\t...address,\n\t\t\t\tcustom: custom,\n\t\t\t}\n\t\t},\n\t\tremoveDiscountCode: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Cart>,\n\t\t\t{ discountCode }: CartRemoveDiscountCodeAction\n\t\t) => {\n\t\t\tresource.discountCodes = resource.discountCodes.filter(\n\t\t\t\t(code) => code.discountCode.id !== discountCode.id\n\t\t\t)\n\t\t},\n\t}\n\tdraftLineItemtoLineItem = (\n\t\tprojectKey: string,\n\t\tdraftLineItem: LineItemDraft,\n\t\tcurrency: string,\n\t\tcountry: string | undefined\n\t): LineItem => {\n\t\tconst { productId, quantity, variantId, sku } = draftLineItem\n\n\t\tlet product: Product | null = null\n\n\t\tif (productId && variantId) {\n\t\t\t// Fetch product and variant by ID\n\t\t\tproduct = this._storage.get(projectKey, 'product', productId, {})\n\t\t} else if (sku) {\n\t\t\t// Fetch product and variant by SKU\n\t\t\tconst items = this._storage.query(projectKey, 'product', {\n\t\t\t\twhere: [\n\t\t\t\t\t`masterData(current(masterVariant(sku=\"${sku}\"))) or masterData(current(variants(sku=\"${sku}\")))`,\n\t\t\t\t],\n\t\t\t}) as ProductPagedQueryResponse\n\n\t\t\tif (items.count === 1) {\n\t\t\t\tproduct = items.results[0]\n\t\t\t}\n\t\t}\n\n\t\tif (!product) {\n\t\t\t// Check if product is found\n\t\t\tthrow new CommercetoolsError<GeneralError>({\n\t\t\t\tcode: 'General',\n\t\t\t\tmessage: sku\n\t\t\t\t\t? `A product containing a variant with SKU '${sku}' not found.`\n\t\t\t\t\t: `A product with ID '${productId}' not found.`,\n\t\t\t})\n\t\t}\n\n\t\t// Find matching variant\n\t\tconst variant = [\n\t\t\tproduct.masterData.current.masterVariant,\n\t\t\t...product.masterData.current.variants,\n\t\t].find((x) => {\n\t\t\tif (sku) return x.sku === sku\n\t\t\tif (variantId) return x.id === variantId\n\t\t\treturn false\n\t\t})\n\n\t\tif (!variant) {\n\t\t\t// Check if variant is found\n\t\t\tthrow new Error(\n\t\t\t\tsku\n\t\t\t\t\t? `A variant with SKU '${sku}' for product '${product.id}' not found.`\n\t\t\t\t\t: `A variant with ID '${variantId}' for product '${product.id}' not found.`\n\t\t\t)\n\t\t}\n\n\t\tconst quant = quantity ?? 1\n\n\t\tconst price = selectPrice({ prices: variant.prices, currency, country })\n\t\tif (!price) {\n\t\t\tthrow new Error(\n\t\t\t\t`No valid price found for ${productId} for country ${country} and currency ${currency}`\n\t\t\t)\n\t\t}\n\n\t\treturn {\n\t\t\tid: uuidv4(),\n\t\t\tproductId: product.id,\n\t\t\tproductKey: product.key,\n\t\t\tproductSlug: product.masterData.current.slug,\n\t\t\tproductType: product.productType,\n\t\t\tname: product.masterData.current.name,\n\t\t\tvariant,\n\t\t\tprice: price,\n\t\t\ttotalPrice: {\n\t\t\t\ttype: 'centPrecision',\n\t\t\t\tcurrencyCode: price.value.currencyCode,\n\t\t\t\tfractionDigits: price.value.fractionDigits,\n\t\t\t\tcentAmount: price.value.centAmount * quant,\n\t\t\t},\n\t\t\ttaxedPricePortions: [],\n\t\t\tperMethodTaxRate: [],\n\t\t\tquantity: quant,\n\t\t\tdiscountedPricePerQuantity: [],\n\t\t\tlineItemMode: 'Standard',\n\t\t\tpriceMode: 'Platform',\n\t\t\tstate: [],\n\t\t}\n\t}\n}\n\nconst selectPrice = ({\n\tprices,\n\tcurrency,\n\tcountry,\n}: {\n\tprices: Price[] | undefined\n\tcurrency: string\n\tcountry: string | undefined\n}): Price | undefined => {\n\tif (!prices) {\n\t\treturn undefined\n\t}\n\n\t// Quick-and-dirty way of selecting price based on the given currency and country.\n\t// Can be improved later to give more priority to exact matches over\n\t// 'all country' matches, and include customer groups in the mix as well\n\treturn prices.find((price) => {\n\t\tconst countryMatch = !price.country || price.country === country\n\t\tconst currencyMatch = price.value.currencyCode === currency\n\t\treturn countryMatch && currencyMatch\n\t})\n}\n\nconst calculateLineItemTotalPrice = (lineItem: LineItem): number =>\n\tlineItem.price!.value.centAmount * lineItem.quantity\n\nconst calculateCartTotalPrice = (cart: Cart): number =>\n\tcart.lineItems.reduce((cur, item) => cur + item.totalPrice.centAmount, 0)\n","import type {\n\tCartDiscount,\n\tCartDiscountChangeIsActiveAction,\n\tCartDiscountChangeSortOrderAction,\n\tCartDiscountChangeTargetAction,\n\tCartDiscountDraft,\n\tCartDiscountSetCustomFieldAction,\n\tCartDiscountSetCustomTypeAction,\n\tCartDiscountSetDescriptionAction,\n\tCartDiscountSetKeyAction,\n\tCartDiscountSetValidFromAction,\n\tCartDiscountSetValidFromAndUntilAction,\n\tCartDiscountSetValidUntilAction,\n\tCartDiscountUpdateAction,\n\tCartDiscountValueAbsolute,\n\tCartDiscountValueDraft,\n\tCartDiscountValueFixed,\n\tCartDiscountValueGiftLineItem,\n\tCartDiscountValueRelative,\n\tInvalidOperationError,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport {\n\tAbstractResourceRepository,\n\ttype RepositoryContext,\n} from './abstract.js'\nimport {\n\tcreateCustomFields,\n\tcreateTypedMoney,\n\tgetStoreKeyReference,\n} from './helpers.js'\nimport { CommercetoolsError } from '../exceptions.js'\n\nexport class CartDiscountRepository extends AbstractResourceRepository<'cart-discount'> {\n\tgetTypeId() {\n\t\treturn 'cart-discount' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: CartDiscountDraft): CartDiscount {\n\t\tconst resource: CartDiscount = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tkey: draft.key,\n\t\t\tdescription: draft.description,\n\t\t\tcartPredicate: draft.cartPredicate,\n\t\t\tisActive: draft.isActive || false,\n\t\t\tname: draft.name,\n\t\t\tstores:\n\t\t\t\tdraft.stores?.map((s) =>\n\t\t\t\t\tgetStoreKeyReference(s, context.projectKey, this._storage)\n\t\t\t\t) ?? [],\n\t\t\treferences: [],\n\t\t\ttarget: draft.target,\n\t\t\trequiresDiscountCode: draft.requiresDiscountCode || false,\n\t\t\tsortOrder: draft.sortOrder,\n\t\t\tstackingMode: draft.stackingMode || 'Stacking',\n\t\t\tvalidFrom: draft.validFrom,\n\t\t\tvalidUntil: draft.validUntil,\n\t\t\tvalue: this.transformValueDraft(draft.value),\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tprivate transformValueDraft(value: CartDiscountValueDraft) {\n\t\tswitch (value.type) {\n\t\t\tcase 'absolute': {\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'absolute',\n\t\t\t\t\tmoney: value.money.map(createTypedMoney),\n\t\t\t\t} as CartDiscountValueAbsolute\n\t\t\t}\n\t\t\tcase 'fixed': {\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'fixed',\n\t\t\t\t\tmoney: value.money.map(createTypedMoney),\n\t\t\t\t} as CartDiscountValueFixed\n\t\t\t}\n\t\t\tcase 'giftLineItem': {\n\t\t\t\treturn {\n\t\t\t\t\t...value,\n\t\t\t\t} as CartDiscountValueGiftLineItem\n\t\t\t}\n\t\t\tcase 'relative': {\n\t\t\t\treturn {\n\t\t\t\t\t...value,\n\t\t\t\t} as CartDiscountValueRelative\n\t\t\t}\n\t\t}\n\n\t\treturn value\n\t}\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tCartDiscountUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<CartDiscount>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {\n\t\tsetKey: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<CartDiscount>,\n\t\t\t{ key }: CartDiscountSetKeyAction\n\t\t) => {\n\t\t\tresource.key = key\n\t\t},\n\t\tsetDescription: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<CartDiscount>,\n\t\t\t{ description }: CartDiscountSetDescriptionAction\n\t\t) => {\n\t\t\tresource.description = description\n\t\t},\n\t\tsetValidFrom: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<CartDiscount>,\n\t\t\t{ validFrom }: CartDiscountSetValidFromAction\n\t\t) => {\n\t\t\tresource.validFrom = validFrom\n\t\t},\n\t\tsetValidUntil: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<CartDiscount>,\n\t\t\t{ validUntil }: CartDiscountSetValidUntilAction\n\t\t) => {\n\t\t\tresource.validUntil = validUntil\n\t\t},\n\t\tsetValidFromAndUntil: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<CartDiscount>,\n\t\t\t{ validFrom, validUntil }: CartDiscountSetValidFromAndUntilAction\n\t\t) => {\n\t\t\tresource.validFrom = validFrom\n\t\t\tresource.validUntil = validUntil\n\t\t},\n\t\tchangeSortOrder: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<CartDiscount>,\n\t\t\t{ sortOrder }: CartDiscountChangeSortOrderAction\n\t\t) => {\n\t\t\tresource.sortOrder = sortOrder\n\t\t},\n\t\tchangeIsActive: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<CartDiscount>,\n\t\t\t{ isActive }: CartDiscountChangeIsActiveAction\n\t\t) => {\n\t\t\tresource.isActive = isActive\n\t\t},\n\t\tchangeTarget: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<CartDiscount>,\n\t\t\t{ target }: CartDiscountChangeTargetAction\n\t\t) => {\n\t\t\tresource.target = target\n\t\t},\n\t\tsetCustomField: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<CartDiscount>,\n\t\t\t{ name, value }: CartDiscountSetCustomFieldAction\n\t\t) => {\n\t\t\tif (!resource.custom) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (value === null) {\n\t\t\t\tif (name in resource.custom.fields) {\n\t\t\t\t\tdelete resource.custom.fields[name]\n\t\t\t\t} else {\n\t\t\t\t\tthrow new CommercetoolsError<InvalidOperationError>(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcode: 'InvalidOperation',\n\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\t'Cannot remove custom field ' +\n\t\t\t\t\t\t\t\tname +\n\t\t\t\t\t\t\t\t' because it does not exist.',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t400\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresource.custom.fields[name] = value\n\t\t\t}\n\t\t},\n\t\tsetCustomType: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<CartDiscount>,\n\t\t\t{ type, fields }: CartDiscountSetCustomTypeAction\n\t\t) => {\n\t\t\tif (!type) {\n\t\t\t\tresource.custom = undefined\n\t\t\t} else {\n\t\t\t\tconst resolvedType = this._storage.getByResourceIdentifier(\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\ttype\n\t\t\t\t)\n\t\t\t\tif (!resolvedType) {\n\t\t\t\t\tthrow new Error(`Type ${type} not found`)\n\t\t\t\t}\n\n\t\t\t\tresource.custom = {\n\t\t\t\t\ttype: {\n\t\t\t\t\t\ttypeId: 'type',\n\t\t\t\t\t\tid: resolvedType.id,\n\t\t\t\t\t},\n\t\t\t\t\tfields: fields || {},\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t}\n}\n","import type {\n\tAsset,\n\tAssetDraft,\n\tCategory,\n\tCategoryAddAssetAction,\n\tCategoryChangeAssetNameAction,\n\tCategoryChangeNameAction,\n\tCategoryChangeParentAction,\n\tCategoryChangeSlugAction,\n\tCategoryDraft,\n\tCategoryRemoveAssetAction,\n\tCategorySetAssetDescriptionAction,\n\tCategorySetAssetSourcesAction,\n\tCategorySetCustomFieldAction,\n\tCategorySetCustomTypeAction,\n\tCategorySetDescriptionAction,\n\tCategorySetKeyAction,\n\tCategorySetMetaDescriptionAction,\n\tCategorySetMetaKeywordsAction,\n\tCategorySetMetaTitleAction,\n} from '@commercetools/platform-sdk'\nimport { v4 as uuidv4 } from 'uuid'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport {\n\tAbstractResourceRepository,\n\ttype RepositoryContext,\n} from './abstract.js'\nimport { createCustomFields } from './helpers.js'\n\nexport class CategoryRepository extends AbstractResourceRepository<'category'> {\n\tgetTypeId() {\n\t\treturn 'category' as const\n\t}\n\n\tassetFromAssetDraft = (\n\t\tdraft: AssetDraft,\n\t\tcontext: RepositoryContext\n\t): Asset => ({\n\t\t...draft,\n\t\tid: uuidv4(),\n\t\tcustom: createCustomFields(draft.custom, context.projectKey, this._storage),\n\t})\n\n\tcreate(context: RepositoryContext, draft: CategoryDraft): Category {\n\t\tconst resource: Category = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tkey: draft.key,\n\t\t\tname: draft.name,\n\t\t\tslug: draft.slug,\n\t\t\torderHint: draft.orderHint || '',\n\t\t\texternalId: draft.externalId || '',\n\t\t\tparent: draft.parent\n\t\t\t\t? { typeId: 'category', id: draft.parent.id! }\n\t\t\t\t: undefined,\n\t\t\tancestors: [], // TODO\n\t\t\tassets:\n\t\t\t\tdraft.assets?.map((d) => ({\n\t\t\t\t\tid: uuidv4(),\n\t\t\t\t\tname: d.name,\n\t\t\t\t\tdescription: d.description,\n\t\t\t\t\tsources: d.sources,\n\t\t\t\t\ttags: d.tags,\n\t\t\t\t\tkey: d.key,\n\t\t\t\t\tcustom: createCustomFields(\n\t\t\t\t\t\tdraft.custom,\n\t\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\t\tthis._storage\n\t\t\t\t\t),\n\t\t\t\t})) || [],\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tactions = {\n\t\tchangeAssetName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Category>,\n\t\t\t{ assetId, assetKey, name }: CategoryChangeAssetNameAction\n\t\t) => {\n\t\t\tresource.assets?.forEach((asset) => {\n\t\t\t\tif (assetId && assetId === asset.id) {\n\t\t\t\t\tasset.name = name\n\t\t\t\t}\n\t\t\t\tif (assetKey && assetKey === asset.key) {\n\t\t\t\t\tasset.name = name\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\tchangeSlug: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Category>,\n\t\t\t{ slug }: CategoryChangeSlugAction\n\t\t) => {\n\t\t\tresource.slug = slug\n\t\t},\n\t\tchangeName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Category>,\n\t\t\t{ name }: CategoryChangeNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\t\tchangeParent: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Category>,\n\t\t\t{ parent }: CategoryChangeParentAction\n\t\t) => {\n\t\t\tconst category = this._storage.getByResourceIdentifier(\n\t\t\t\tcontext.projectKey,\n\t\t\t\tparent\n\t\t\t)\n\t\t\tif (!category) {\n\t\t\t\tthrow new Error('No category found for reference')\n\t\t\t}\n\t\t\tresource.parent = {\n\t\t\t\ttypeId: 'category',\n\t\t\t\tid: category.id,\n\t\t\t}\n\t\t},\n\t\tsetKey: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Category>,\n\t\t\t{ key }: CategorySetKeyAction\n\t\t) => {\n\t\t\tresource.key = key\n\t\t},\n\t\tsetAssetDescription: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Category>,\n\t\t\t{ assetId, assetKey, description }: CategorySetAssetDescriptionAction\n\t\t) => {\n\t\t\tresource.assets?.forEach((asset) => {\n\t\t\t\tif (assetId && assetId === asset.id) {\n\t\t\t\t\tasset.description = description\n\t\t\t\t}\n\t\t\t\tif (assetKey && assetKey === asset.key) {\n\t\t\t\t\tasset.description = description\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\tsetAssetSources: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Category>,\n\t\t\t{ assetId, assetKey, sources }: CategorySetAssetSourcesAction\n\t\t) => {\n\t\t\tresource.assets?.forEach((asset) => {\n\t\t\t\tif (assetId && assetId === asset.id) {\n\t\t\t\t\tasset.sources = sources\n\t\t\t\t}\n\t\t\t\tif (assetKey && assetKey === asset.key) {\n\t\t\t\t\tasset.sources = sources\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\tsetDescription: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Category>,\n\t\t\t{ description }: CategorySetDescriptionAction\n\t\t) => {\n\t\t\tresource.description = description\n\t\t},\n\t\tsetMetaDescription: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Category>,\n\t\t\t{ metaDescription }: CategorySetMetaDescriptionAction\n\t\t) => {\n\t\t\tresource.metaDescription = metaDescription\n\t\t},\n\t\tsetMetaKeywords: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Category>,\n\t\t\t{ metaKeywords }: CategorySetMetaKeywordsAction\n\t\t) => {\n\t\t\tresource.metaKeywords = metaKeywords\n\t\t},\n\t\tsetMetaTitle: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Category>,\n\t\t\t{ metaTitle }: CategorySetMetaTitleAction\n\t\t) => {\n\t\t\tresource.metaTitle = metaTitle\n\t\t},\n\t\tsetCustomType: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Category>,\n\t\t\t{ type, fields }: CategorySetCustomTypeAction\n\t\t) => {\n\t\t\tif (type) {\n\t\t\t\tresource.custom = createCustomFields(\n\t\t\t\t\t{ type, fields },\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\tthis._storage\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tresource.custom = undefined\n\t\t\t}\n\t\t},\n\t\tsetCustomField: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Category>,\n\t\t\t{ name, value }: CategorySetCustomFieldAction\n\t\t) => {\n\t\t\tif (!resource.custom) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (value === null) {\n\t\t\t\tdelete resource.custom.fields[name]\n\t\t\t} else {\n\t\t\t\tresource.custom.fields[name] = value\n\t\t\t}\n\t\t},\n\t\tremoveAsset: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Category>,\n\t\t\t{ assetId, assetKey }: CategoryRemoveAssetAction\n\t\t) => {\n\t\t\tif (!resource.assets) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (assetId) {\n\t\t\t\tresource.assets = resource.assets.filter(function (obj) {\n\t\t\t\t\treturn obj.id !== assetId\n\t\t\t\t})\n\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (assetKey) {\n\t\t\t\tresource.assets = resource.assets.filter(function (obj) {\n\t\t\t\t\treturn obj.key !== assetKey\n\t\t\t\t})\n\n\t\t\t\treturn\n\t\t\t}\n\t\t},\n\t\taddAsset: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Category>,\n\t\t\t{ asset }: CategoryAddAssetAction\n\t\t) => {\n\t\t\tif (!resource.assets) {\n\t\t\t\tresource.assets = [this.assetFromAssetDraft(asset, context)]\n\t\t\t} else {\n\t\t\t\tresource.assets.push(this.assetFromAssetDraft(asset, context))\n\t\t\t}\n\t\t},\n\t}\n}\n","import type {\n\tChannel,\n\tChannelChangeDescriptionAction,\n\tChannelChangeKeyAction,\n\tChannelChangeNameAction,\n\tChannelDraft,\n\tChannelSetAddressAction,\n\tChannelSetCustomFieldAction,\n\tChannelSetCustomTypeAction,\n\tChannelSetGeoLocationAction,\n\tChannelUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport {\n\tAbstractResourceRepository,\n\ttype RepositoryContext,\n} from './abstract.js'\nimport { createAddress, createCustomFields } from './helpers.js'\n\nexport class ChannelRepository extends AbstractResourceRepository<'channel'> {\n\tgetTypeId() {\n\t\treturn 'channel' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: ChannelDraft): Channel {\n\t\tconst resource: Channel = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tkey: draft.key,\n\t\t\tname: draft.name,\n\t\t\tdescription: draft.description,\n\t\t\troles: draft.roles || [],\n\t\t\tgeoLocation: draft.geoLocation,\n\t\t\taddress: createAddress(draft.address, context.projectKey, this._storage),\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tChannelUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<Channel>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {\n\t\tchangeKey: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Channel>,\n\t\t\t{ key }: ChannelChangeKeyAction\n\t\t) => {\n\t\t\tresource.key = key\n\t\t},\n\n\t\tchangeName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Channel>,\n\t\t\t{ name }: ChannelChangeNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\n\t\tchangeDescription: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Channel>,\n\t\t\t{ description }: ChannelChangeDescriptionAction\n\t\t) => {\n\t\t\tresource.description = description\n\t\t},\n\n\t\tsetAddress: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Channel>,\n\t\t\t{ address }: ChannelSetAddressAction\n\t\t) => {\n\t\t\tresource.address = createAddress(\n\t\t\t\taddress,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t)\n\t\t},\n\n\t\tsetGeoLocation: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Channel>,\n\t\t\t{ geoLocation }: ChannelSetGeoLocationAction\n\t\t) => {\n\t\t\tresource.geoLocation = geoLocation\n\t\t},\n\n\t\tsetCustomType: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Channel>,\n\t\t\t{ type, fields }: ChannelSetCustomTypeAction\n\t\t) => {\n\t\t\tif (type) {\n\t\t\t\tresource.custom = createCustomFields(\n\t\t\t\t\t{ type, fields },\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\tthis._storage\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tresource.custom = undefined\n\t\t\t}\n\t\t},\n\t\tsetCustomField: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Channel>,\n\t\t\t{ name, value }: ChannelSetCustomFieldAction\n\t\t) => {\n\t\t\tif (!resource.custom) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (value === null) {\n\t\t\t\tdelete resource.custom.fields[name]\n\t\t\t} else {\n\t\t\t\tresource.custom.fields[name] = value\n\t\t\t}\n\t\t},\n\t}\n}\n","import type {\n\tCustomObject,\n\tCustomObjectDraft,\n\tInvalidOperationError,\n} from '@commercetools/platform-sdk'\nimport { CommercetoolsError } from '../exceptions.js'\nimport { cloneObject, getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport {\n\tAbstractResourceRepository,\n\ttype RepositoryContext,\n} from './abstract.js'\nimport { checkConcurrentModification } from './errors.js'\n\nexport class CustomObjectRepository extends AbstractResourceRepository<'key-value-document'> {\n\tgetTypeId() {\n\t\treturn 'key-value-document' as const\n\t}\n\n\tcreate(\n\t\tcontext: RepositoryContext,\n\t\tdraft: Writable<CustomObjectDraft>\n\t): CustomObject {\n\t\tconst current = this.getWithContainerAndKey(\n\t\t\tcontext,\n\t\t\tdraft.container,\n\t\t\tdraft.key\n\t\t) as Writable<CustomObject | undefined>\n\n\t\tif (current) {\n\t\t\t// Only check version if it is passed in the draft\n\t\t\tif (draft.version) {\n\t\t\t\tcheckConcurrentModification(current.version, draft.version, current.id)\n\t\t\t} else {\n\t\t\t\tdraft.version = current.version\n\t\t\t}\n\n\t\t\tif (draft.value !== current.value) {\n\t\t\t\tconst updated = cloneObject(current) as Writable<CustomObject>\n\t\t\t\tupdated.value = draft.value\n\t\t\t\tupdated.version += 1\n\t\t\t\tthis.saveUpdate(context, draft.version, updated)\n\t\t\t\treturn updated\n\t\t\t}\n\t\t\treturn current\n\t\t} else {\n\t\t\t// If the resource is new the only valid version is 0\n\t\t\tif (draft.version) {\n\t\t\t\tthrow new CommercetoolsError<InvalidOperationError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'InvalidOperation',\n\t\t\t\t\t\tmessage: 'version on create must be 0',\n\t\t\t\t\t},\n\t\t\t\t\t400\n\t\t\t\t)\n\t\t\t}\n\t\t\tconst baseProperties = getBaseResourceProperties()\n\t\t\tconst resource: CustomObject = {\n\t\t\t\t...baseProperties,\n\t\t\t\tcontainer: draft.container,\n\t\t\t\tkey: draft.key,\n\t\t\t\tvalue: draft.value,\n\t\t\t}\n\n\t\t\tthis.saveNew(context, resource)\n\t\t\treturn resource\n\t\t}\n\t}\n\n\tgetWithContainerAndKey(\n\t\tcontext: RepositoryContext,\n\t\tcontainer: string,\n\t\tkey: string\n\t) {\n\t\tconst items = this._storage.all(context.projectKey, this.getTypeId())\n\t\treturn items.find(\n\t\t\t(item) => item.container === container && item.key === key\n\t\t)\n\t}\n}\n","import type {\n\tCustomer,\n\tCustomerChangeEmailAction,\n\tCustomerDraft,\n\tCustomerSetAuthenticationModeAction,\n\tCustomerSetCustomFieldAction,\n\tDuplicateFieldError,\n\tInvalidInputError,\n\tInvalidJsonInputError,\n} from '@commercetools/platform-sdk'\nimport { CommercetoolsError } from '../exceptions.js'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport {\n\tAbstractResourceRepository,\n\ttype RepositoryContext,\n} from './abstract.js'\nimport { hashPassword } from '../lib/password.js'\n\nexport class CustomerRepository extends AbstractResourceRepository<'customer'> {\n\tgetTypeId() {\n\t\treturn 'customer' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: CustomerDraft): Customer {\n\t\t// Check uniqueness\n\t\tconst results = this._storage.query(context.projectKey, this.getTypeId(), {\n\t\t\twhere: [`email=\"${draft.email.toLocaleLowerCase()}\"`],\n\t\t})\n\t\tif (results.count > 0) {\n\t\t\tthrow new CommercetoolsError<any>({\n\t\t\t\tcode: 'CustomerAlreadyExists',\n\t\t\t\tstatusCode: 400,\n\t\t\t\tmessage:\n\t\t\t\t\t'There is already an existing customer with the provided email.',\n\t\t\t\terrors: [\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'DuplicateField',\n\t\t\t\t\t\tmessage: `Customer with email '${draft.email}' already exists.`,\n\t\t\t\t\t\tduplicateValue: draft.email,\n\t\t\t\t\t\tfield: 'email',\n\t\t\t\t\t} as DuplicateFieldError,\n\t\t\t\t],\n\t\t\t})\n\t\t}\n\n\t\tconst resource: Customer = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tauthenticationMode: draft.authenticationMode || 'Password',\n\t\t\temail: draft.email.toLowerCase(),\n\t\t\tpassword: draft.password ? hashPassword(draft.password) : undefined,\n\t\t\tisEmailVerified: draft.isEmailVerified || false,\n\t\t\taddresses: [],\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tgetMe(context: RepositoryContext): Customer | undefined {\n\t\t// grab the first customer you can find for now. In the future we should\n\t\t// use the customer id from the scope of the token\n\t\tconst results = this._storage.query(\n\t\t\tcontext.projectKey,\n\t\t\tthis.getTypeId(),\n\t\t\t{}\n\t\t)\n\n\t\tif (results.count > 0) {\n\t\t\treturn results.results[0] as Customer\n\t\t}\n\n\t\treturn\n\t}\n\n\tactions = {\n\t\tchangeEmail: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<Customer>,\n\t\t\t{ email }: CustomerChangeEmailAction\n\t\t) => {\n\t\t\tresource.email = email\n\t\t},\n\t\tsetAuthenticationMode: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<Customer>,\n\t\t\t{ authMode, password }: CustomerSetAuthenticationModeAction\n\t\t) => {\n\t\t\tif (resource.authenticationMode === authMode) {\n\t\t\t\tthrow new CommercetoolsError<InvalidInputError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'InvalidInput',\n\t\t\t\t\t\tmessage: `The customer is already using the '${resource.authenticationMode}' authentication mode.`,\n\t\t\t\t\t},\n\t\t\t\t\t400\n\t\t\t\t)\n\t\t\t}\n\t\t\tresource.authenticationMode = authMode\n\t\t\tif (authMode === 'ExternalAuth') {\n\t\t\t\tdelete resource.password\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (authMode === 'Password') {\n\t\t\t\tresource.password = password ? hashPassword(password) : undefined\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthrow new CommercetoolsError<InvalidJsonInputError>(\n\t\t\t\t{\n\t\t\t\t\tcode: 'InvalidJsonInput',\n\t\t\t\t\tmessage: 'Request body does not contain valid JSON.',\n\t\t\t\t\tdetailedErrorMessage: `actions -> authMode: Invalid enum value: '${authMode}'. Expected one of: 'Password','ExternalAuth'`,\n\t\t\t\t},\n\t\t\t\t400\n\t\t\t)\n\t\t},\n\t\tsetCustomField: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<Customer>,\n\t\t\t{ name, value }: CustomerSetCustomFieldAction\n\t\t) => {\n\t\t\tif (!resource.custom) {\n\t\t\t\tthrow new Error('Resource has no custom field')\n\t\t\t}\n\t\t\tresource.custom.fields[name] = value\n\t\t},\n\t}\n}\n","import type {\n\tCustomerGroup,\n\tCustomerGroupChangeNameAction,\n\tCustomerGroupDraft,\n\tCustomerGroupSetCustomFieldAction,\n\tCustomerGroupSetCustomTypeAction,\n\tCustomerGroupSetKeyAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport {\n\tAbstractResourceRepository,\n\ttype RepositoryContext,\n} from './abstract.js'\nimport { createCustomFields } from './helpers.js'\n\nexport class CustomerGroupRepository extends AbstractResourceRepository<'customer-group'> {\n\tgetTypeId() {\n\t\treturn 'customer-group' as const\n\t}\n\tcreate(context: RepositoryContext, draft: CustomerGroupDraft): CustomerGroup {\n\t\tconst resource: CustomerGroup = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tkey: draft.key,\n\t\t\tname: draft.groupName,\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tactions = {\n\t\tsetKey: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<CustomerGroup>,\n\t\t\t{ key }: CustomerGroupSetKeyAction\n\t\t) => {\n\t\t\tresource.key = key\n\t\t},\n\t\tchangeName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<CustomerGroup>,\n\t\t\t{ name }: CustomerGroupChangeNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\t\tsetCustomType: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<CustomerGroup>,\n\t\t\t{ type, fields }: CustomerGroupSetCustomTypeAction\n\t\t) => {\n\t\t\tif (type) {\n\t\t\t\tresource.custom = createCustomFields(\n\t\t\t\t\t{ type, fields },\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\tthis._storage\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tresource.custom = undefined\n\t\t\t}\n\t\t},\n\t\tsetCustomField: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<CustomerGroup>,\n\t\t\t{ name, value }: CustomerGroupSetCustomFieldAction\n\t\t) => {\n\t\t\tif (!resource.custom) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (value === null) {\n\t\t\t\tdelete resource.custom.fields[name]\n\t\t\t} else {\n\t\t\t\tresource.custom.fields[name] = value\n\t\t\t}\n\t\t},\n\t}\n}\n","import type {\n\tCartDiscountReference,\n\tDiscountCode,\n\tDiscountCodeChangeCartDiscountsAction,\n\tDiscountCodeChangeIsActiveAction,\n\tDiscountCodeDraft,\n\tDiscountCodeSetCartPredicateAction,\n\tDiscountCodeSetCustomFieldAction,\n\tDiscountCodeSetCustomTypeAction,\n\tDiscountCodeSetDescriptionAction,\n\tDiscountCodeSetMaxApplicationsAction,\n\tDiscountCodeSetMaxApplicationsPerCustomerAction,\n\tDiscountCodeSetNameAction,\n\tDiscountCodeSetValidFromAction,\n\tDiscountCodeSetValidFromAndUntilAction,\n\tDiscountCodeSetValidUntilAction,\n\tDiscountCodeUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport {\n\tAbstractResourceRepository,\n\ttype RepositoryContext,\n} from './abstract.js'\nimport { createCustomFields } from './helpers.js'\n\nexport class DiscountCodeRepository extends AbstractResourceRepository<'discount-code'> {\n\tgetTypeId() {\n\t\treturn 'discount-code' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: DiscountCodeDraft): DiscountCode {\n\t\tconst resource: DiscountCode = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tapplicationVersion: 1,\n\t\t\tcartDiscounts: draft.cartDiscounts.map(\n\t\t\t\t(obj): CartDiscountReference => ({\n\t\t\t\t\ttypeId: 'cart-discount',\n\t\t\t\t\tid: obj.id!,\n\t\t\t\t})\n\t\t\t),\n\t\t\tcartPredicate: draft.cartPredicate,\n\t\t\tcode: draft.code,\n\t\t\tdescription: draft.description,\n\t\t\tgroups: draft.groups || [],\n\t\t\tisActive: draft.isActive || true,\n\t\t\tname: draft.name,\n\t\t\treferences: [],\n\t\t\tvalidFrom: draft.validFrom,\n\t\t\tvalidUntil: draft.validUntil,\n\t\t\tmaxApplications: draft.maxApplications,\n\t\t\tmaxApplicationsPerCustomer: draft.maxApplicationsPerCustomer,\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tDiscountCodeUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<DiscountCode>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {\n\t\tchangeIsActive: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<DiscountCode>,\n\t\t\t{ isActive }: DiscountCodeChangeIsActiveAction\n\t\t) => {\n\t\t\tresource.isActive = isActive\n\t\t},\n\t\tchangeCartDiscounts: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<DiscountCode>,\n\t\t\t{ cartDiscounts }: DiscountCodeChangeCartDiscountsAction\n\t\t) => {\n\t\t\tresource.cartDiscounts = cartDiscounts.map(\n\t\t\t\t(obj): CartDiscountReference => ({\n\t\t\t\t\ttypeId: 'cart-discount',\n\t\t\t\t\tid: obj.id!,\n\t\t\t\t})\n\t\t\t)\n\t\t},\n\t\tsetDescription: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<DiscountCode>,\n\t\t\t{ description }: DiscountCodeSetDescriptionAction\n\t\t) => {\n\t\t\tresource.description = description\n\t\t},\n\t\tsetCartPredicate: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<DiscountCode>,\n\t\t\t{ cartPredicate }: DiscountCodeSetCartPredicateAction\n\t\t) => {\n\t\t\tresource.cartPredicate = cartPredicate\n\t\t},\n\t\tsetName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<DiscountCode>,\n\t\t\t{ name }: DiscountCodeSetNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\t\tsetMaxApplications: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<DiscountCode>,\n\t\t\t{ maxApplications }: DiscountCodeSetMaxApplicationsAction\n\t\t) => {\n\t\t\tresource.maxApplications = maxApplications\n\t\t},\n\t\tsetMaxApplicationsPerCustomer: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<DiscountCode>,\n\t\t\t{\n\t\t\t\tmaxApplicationsPerCustomer,\n\t\t\t}: DiscountCodeSetMaxApplicationsPerCustomerAction\n\t\t) => {\n\t\t\tresource.maxApplicationsPerCustomer = maxApplicationsPerCustomer\n\t\t},\n\t\tsetValidFrom: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<DiscountCode>,\n\t\t\t{ validFrom }: DiscountCodeSetValidFromAction\n\t\t) => {\n\t\t\tresource.validFrom = validFrom\n\t\t},\n\t\tsetValidUntil: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<DiscountCode>,\n\t\t\t{ validUntil }: DiscountCodeSetValidUntilAction\n\t\t) => {\n\t\t\tresource.validUntil = validUntil\n\t\t},\n\t\tsetValidFromAndUntil: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<DiscountCode>,\n\t\t\t{ validFrom, validUntil }: DiscountCodeSetValidFromAndUntilAction\n\t\t) => {\n\t\t\tresource.validFrom = validFrom\n\t\t\tresource.validUntil = validUntil\n\t\t},\n\t\tsetCustomType: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<DiscountCode>,\n\t\t\t{ type, fields }: DiscountCodeSetCustomTypeAction\n\t\t) => {\n\t\t\tif (type) {\n\t\t\t\tresource.custom = createCustomFields(\n\t\t\t\t\t{ type, fields },\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\tthis._storage\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tresource.custom = undefined\n\t\t\t}\n\t\t},\n\t\tsetCustomField: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<DiscountCode>,\n\t\t\t{ name, value }: DiscountCodeSetCustomFieldAction\n\t\t) => {\n\t\t\tif (!resource.custom) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (value === null) {\n\t\t\t\tdelete resource.custom.fields[name]\n\t\t\t} else {\n\t\t\t\tresource.custom.fields[name] = value\n\t\t\t}\n\t\t},\n\t}\n}\n","import { cloneObject } from '../helpers.js'\n\nexport const maskSecretValue = <T>(resource: T, path: string): T => {\n\tconst parts = path.split('.')\n\tconst clone = cloneObject(resource) as any\n\tlet val = clone\n\n\tconst target = parts.pop()\n\tfor (let i = 0; i < parts.length; i++) {\n\t\tconst part = parts[i]\n\t\tval = val[part]\n\n\t\tif (val === undefined) {\n\t\t\treturn resource\n\t\t}\n\t}\n\n\tif (val && target && val[target]) {\n\t\tval[target] = '****'\n\t}\n\treturn clone\n}\n","import type {\n\tExtension,\n\tExtensionChangeDestinationAction,\n\tExtensionChangeTriggersAction,\n\tExtensionDraft,\n\tExtensionSetKeyAction,\n\tExtensionSetTimeoutInMsAction,\n\tExtensionUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport { maskSecretValue } from '../lib/masking.js'\nimport type { Writable } from '../types.js'\nimport {\n\tAbstractResourceRepository,\n\ttype RepositoryContext,\n} from './abstract.js'\n\nexport class ExtensionRepository extends AbstractResourceRepository<'extension'> {\n\tgetTypeId() {\n\t\treturn 'extension' as const\n\t}\n\n\tpostProcessResource(resource: Extension): Extension {\n\t\tif (resource) {\n\t\t\tconst extension = resource as Extension\n\t\t\tif (\n\t\t\t\textension.destination.type === 'HTTP' &&\n\t\t\t\textension.destination.authentication?.type === 'AuthorizationHeader'\n\t\t\t) {\n\t\t\t\treturn maskSecretValue(\n\t\t\t\t\textension,\n\t\t\t\t\t'destination.authentication.headerValue'\n\t\t\t\t)\n\t\t\t} else if (extension.destination.type == 'AWSLambda') {\n\t\t\t\treturn maskSecretValue(resource, 'destination.accessSecret')\n\t\t\t}\n\t\t}\n\t\treturn resource\n\t}\n\n\tcreate(context: RepositoryContext, draft: ExtensionDraft): Extension {\n\t\tconst resource: Extension = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tkey: draft.key,\n\t\t\ttimeoutInMs: draft.timeoutInMs,\n\t\t\tdestination: draft.destination,\n\t\t\ttriggers: draft.triggers,\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tactions: Record<\n\t\tExtensionUpdateAction['action'],\n\t\t(\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Extension>,\n\t\t\taction: any\n\t\t) => void\n\t> = {\n\t\tsetKey: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Extension>,\n\t\t\t{ key }: ExtensionSetKeyAction\n\t\t) => {\n\t\t\tresource.key = key\n\t\t},\n\t\tsetTimeoutInMs: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Extension>,\n\t\t\t{ timeoutInMs }: ExtensionSetTimeoutInMsAction\n\t\t) => {\n\t\t\tresource.timeoutInMs = timeoutInMs\n\t\t},\n\t\tchangeTriggers: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Extension>,\n\t\t\t{ triggers }: ExtensionChangeTriggersAction\n\t\t) => {\n\t\t\tresource.triggers = triggers\n\t\t},\n\t\tchangeDestination: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Extension>,\n\t\t\t{ destination }: ExtensionChangeDestinationAction\n\t\t) => {\n\t\t\tresource.destination = destination\n\t\t},\n\t}\n}\n","import type {\n\tInventoryEntry,\n\tInventoryEntryChangeQuantityAction,\n\tInventoryEntryDraft,\n\tInventoryEntrySetCustomFieldAction,\n\tInventoryEntrySetCustomTypeAction,\n\tInventoryEntrySetExpectedDeliveryAction,\n\tInventoryEntrySetRestockableInDaysAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport {\n\tAbstractResourceRepository,\n\ttype RepositoryContext,\n} from './abstract.js'\nimport { createCustomFields } from './helpers.js'\n\nexport class InventoryEntryRepository extends AbstractResourceRepository<'inventory-entry'> {\n\tgetTypeId() {\n\t\treturn 'inventory-entry' as const\n\t}\n\n\tcreate(\n\t\tcontext: RepositoryContext,\n\t\tdraft: InventoryEntryDraft\n\t): InventoryEntry {\n\t\tconst resource: InventoryEntry = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tsku: draft.sku,\n\t\t\tquantityOnStock: draft.quantityOnStock,\n\t\t\tavailableQuantity: draft.quantityOnStock,\n\t\t\texpectedDelivery: draft.expectedDelivery,\n\t\t\trestockableInDays: draft.restockableInDays,\n\t\t\tsupplyChannel: {\n\t\t\t\t...draft.supplyChannel,\n\t\t\t\ttypeId: 'channel',\n\t\t\t\tid: draft.supplyChannel?.id ?? '',\n\t\t\t},\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tactions = {\n\t\tchangeQuantity: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<InventoryEntry>,\n\t\t\t{ quantity }: InventoryEntryChangeQuantityAction\n\t\t) => {\n\t\t\tresource.quantityOnStock = quantity\n\t\t\t// don't know active reservations so just set to same value\n\t\t\tresource.availableQuantity = quantity\n\t\t},\n\t\tsetExpectedDelivery: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<InventoryEntry>,\n\t\t\t{ expectedDelivery }: InventoryEntrySetExpectedDeliveryAction\n\t\t) => {\n\t\t\tresource.expectedDelivery = new Date(expectedDelivery!).toISOString()\n\t\t},\n\t\tsetCustomField: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: InventoryEntry,\n\t\t\t{ name, value }: InventoryEntrySetCustomFieldAction\n\t\t) => {\n\t\t\tif (!resource.custom) {\n\t\t\t\tthrow new Error('Resource has no custom field')\n\t\t\t}\n\t\t\tresource.custom.fields[name] = value\n\t\t},\n\t\tsetCustomType: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<InventoryEntry>,\n\t\t\t{ type, fields }: InventoryEntrySetCustomTypeAction\n\t\t) => {\n\t\t\tif (!type) {\n\t\t\t\tresource.custom = undefined\n\t\t\t} else {\n\t\t\t\tconst resolvedType = this._storage.getByResourceIdentifier(\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\ttype\n\t\t\t\t)\n\t\t\t\tif (!resolvedType) {\n\t\t\t\t\tthrow new Error(`Type ${type} not found`)\n\t\t\t\t}\n\n\t\t\t\tresource.custom = {\n\t\t\t\t\ttype: {\n\t\t\t\t\t\ttypeId: 'type',\n\t\t\t\t\t\tid: resolvedType.id,\n\t\t\t\t\t},\n\t\t\t\t\tfields: fields || {},\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tsetRestockableInDays: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<InventoryEntry>,\n\t\t\t{ restockableInDays }: InventoryEntrySetRestockableInDaysAction\n\t\t) => {\n\t\t\tresource.restockableInDays = restockableInDays\n\t\t},\n\t}\n}\n","import type {\n\tCartReference,\n\tMyOrderFromCartDraft,\n\tOrder,\n} from '@commercetools/platform-sdk'\nimport assert from 'assert'\nimport { type RepositoryContext } from './abstract.js'\nimport { OrderRepository } from './order.js'\n\nexport class MyOrderRepository extends OrderRepository {\n\tcreate(context: RepositoryContext, draft: MyOrderFromCartDraft): Order {\n\t\tassert(draft.id, 'draft.id is missing')\n\t\tconst cartIdentifier = {\n\t\t\tid: draft.id,\n\t\t\ttypeId: 'cart',\n\t\t} as CartReference\n\t\treturn this.createFromCart(context, cartIdentifier)\n\t}\n}\n","import type {\n\tCart,\n\tCartReference,\n\tCustomLineItem,\n\tCustomLineItemDraft,\n\tGeneralError,\n\tLineItem,\n\tLineItemImportDraft,\n\tOrder,\n\tOrderAddPaymentAction,\n\tOrderChangeOrderStateAction,\n\tOrderChangePaymentStateAction,\n\tOrderFromCartDraft,\n\tOrderImportDraft,\n\tOrderSetBillingAddressAction,\n\tOrderSetCustomerEmailAction,\n\tOrderSetCustomFieldAction,\n\tOrderSetCustomTypeAction,\n\tOrderSetLocaleAction,\n\tOrderSetOrderNumberAction,\n\tOrderSetShippingAddressAction,\n\tOrderSetStoreAction,\n\tOrderTransitionStateAction,\n\tProduct,\n\tProductPagedQueryResponse,\n\tProductVariant,\n\tState,\n\tStore,\n} from '@commercetools/platform-sdk'\nimport assert from 'assert'\nimport { CommercetoolsError } from '../exceptions.js'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport {\n\tAbstractResourceRepository,\n\ttype QueryParams,\n\tRepositoryContext,\n} from './abstract.js'\nimport {\n\tcreateAddress,\n\tcreateCentPrecisionMoney,\n\tcreateCustomFields,\n\tcreatePrice,\n\tcreateTypedMoney,\n\tresolveStoreReference,\n} from './helpers.js'\n\nexport class OrderRepository extends AbstractResourceRepository<'order'> {\n\tgetTypeId() {\n\t\treturn 'order' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: OrderFromCartDraft): Order {\n\t\tassert(draft.cart, 'draft.cart is missing')\n\t\treturn this.createFromCart(\n\t\t\tcontext,\n\t\t\t{\n\t\t\t\tid: draft.cart.id!,\n\t\t\t\ttypeId: 'cart',\n\t\t\t},\n\t\t\tdraft.orderNumber\n\t\t)\n\t}\n\n\tcreateFromCart(\n\t\tcontext: RepositoryContext,\n\t\tcartReference: CartReference,\n\t\torderNumber?: string\n\t) {\n\t\tconst cart = this._storage.getByResourceIdentifier(\n\t\t\tcontext.projectKey,\n\t\t\tcartReference\n\t\t) as Cart | null\n\t\tif (!cart) {\n\t\t\tthrow new Error('Cannot find cart')\n\t\t}\n\n\t\tconst resource: Order = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\torderNumber,\n\t\t\tcart: cartReference,\n\t\t\torderState: 'Open',\n\t\t\tlineItems: [],\n\t\t\tcustomLineItems: [],\n\t\t\ttotalPrice: cart.totalPrice,\n\t\t\trefusedGifts: [],\n\t\t\torigin: 'Customer',\n\t\t\tsyncInfo: [],\n\t\t\tshippingMode: cart.shippingMode,\n\t\t\tshipping: cart.shipping,\n\t\t\tstore: context.storeKey\n\t\t\t\t? {\n\t\t\t\t\t\tkey: context.storeKey,\n\t\t\t\t\t\ttypeId: 'store',\n\t\t\t\t }\n\t\t\t\t: undefined,\n\t\t\tlastMessageSequenceNumber: 0,\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\timport(context: RepositoryContext, draft: OrderImportDraft): Order {\n\t\t// TODO: Check if order with given orderNumber already exists\n\t\tassert(this, 'OrderRepository not valid')\n\t\tconst resource: Order = {\n\t\t\t...getBaseResourceProperties(),\n\n\t\t\tbillingAddress: createAddress(\n\t\t\t\tdraft.billingAddress,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t\tshippingAddress: createAddress(\n\t\t\t\tdraft.shippingAddress,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t\tcustomerEmail: draft.customerEmail,\n\t\t\tlastMessageSequenceNumber: 0,\n\t\t\torderNumber: draft.orderNumber,\n\t\t\torderState: draft.orderState || 'Open',\n\t\t\torigin: draft.origin || 'Customer',\n\t\t\tpaymentState: draft.paymentState,\n\t\t\trefusedGifts: [],\n\t\t\tshippingMode: 'Single',\n\t\t\tshipping: [],\n\n\t\t\tstore: resolveStoreReference(\n\t\t\t\tdraft.store,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t\tsyncInfo: [],\n\n\t\t\tlineItems:\n\t\t\t\tdraft.lineItems?.map((item) =>\n\t\t\t\t\tthis.lineItemFromImportDraft.bind(this)(context, item)\n\t\t\t\t) || [],\n\t\t\tcustomLineItems:\n\t\t\t\tdraft.customLineItems?.map((item) =>\n\t\t\t\t\tthis.customLineItemFromImportDraft.bind(this)(context, item)\n\t\t\t\t) || [],\n\n\t\t\ttotalPrice: createCentPrecisionMoney(draft.totalPrice),\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tprivate lineItemFromImportDraft(\n\t\tcontext: RepositoryContext,\n\t\tdraft: LineItemImportDraft\n\t): LineItem {\n\t\tlet product: Product\n\t\tlet variant: ProductVariant | undefined\n\n\t\tif (draft.variant.sku) {\n\t\t\tvariant = {\n\t\t\t\tid: 0,\n\t\t\t\tsku: draft.variant.sku,\n\t\t\t}\n\n\t\t\tconst items = this._storage.query(context.projectKey, 'product', {\n\t\t\t\twhere: [\n\t\t\t\t\t`masterData(current(masterVariant(sku=\"${draft.variant.sku}\"))) or masterData(current(variants(sku=\"${draft.variant.sku}\")))`,\n\t\t\t\t],\n\t\t\t}) as ProductPagedQueryResponse\n\n\t\t\tif (items.count !== 1) {\n\t\t\t\tthrow new CommercetoolsError<GeneralError>({\n\t\t\t\t\tcode: 'General',\n\t\t\t\t\tmessage: `A product containing a variant with SKU '${draft.variant.sku}' not found.`,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tproduct = items.results[0]\n\t\t\tif (product.masterData.current.masterVariant.sku === draft.variant.sku) {\n\t\t\t\tvariant = product.masterData.current.masterVariant\n\t\t\t} else {\n\t\t\t\tvariant = product.masterData.current.variants.find(\n\t\t\t\t\t(v) => v.sku === draft.variant.sku\n\t\t\t\t)\n\t\t\t}\n\t\t\tif (!variant) {\n\t\t\t\tthrow new Error('Internal state error')\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new Error('No product found')\n\t\t}\n\n\t\tconst lineItem: LineItem = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t\tdiscountedPricePerQuantity: [],\n\t\t\tlineItemMode: 'Standard',\n\t\t\tname: draft.name,\n\t\t\tprice: createPrice(draft.price),\n\t\t\tpriceMode: 'Platform',\n\t\t\tproductId: product.id,\n\t\t\tproductType: product.productType,\n\t\t\tquantity: draft.quantity,\n\t\t\tstate: draft.state || [],\n\t\t\ttaxRate: draft.taxRate,\n\t\t\ttaxedPricePortions: [],\n\t\t\tperMethodTaxRate: [],\n\t\t\ttotalPrice: createCentPrecisionMoney(draft.price.value),\n\t\t\tvariant: {\n\t\t\t\tid: variant.id,\n\t\t\t\tsku: variant.sku,\n\t\t\t\tprice: createPrice(draft.price),\n\t\t\t},\n\t\t}\n\n\t\treturn lineItem\n\t}\n\n\tprivate customLineItemFromImportDraft(\n\t\tcontext: RepositoryContext,\n\t\tdraft: CustomLineItemDraft\n\t): CustomLineItem {\n\t\tconst lineItem: CustomLineItem = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t\tdiscountedPricePerQuantity: [],\n\t\t\tmoney: createTypedMoney(draft.money),\n\t\t\tname: draft.name,\n\t\t\tquantity: draft.quantity ?? 0,\n\t\t\tperMethodTaxRate: [],\n\t\t\tpriceMode: draft.priceMode,\n\t\t\tslug: draft.slug,\n\t\t\tstate: [],\n\t\t\ttotalPrice: createCentPrecisionMoney(draft.money),\n\t\t}\n\n\t\treturn lineItem\n\t}\n\n\tgetWithOrderNumber(\n\t\tcontext: RepositoryContext,\n\t\torderNumber: string,\n\t\tparams: QueryParams = {}\n\t): Order | undefined {\n\t\tconst result = this._storage.query(context.projectKey, this.getTypeId(), {\n\t\t\t...params,\n\t\t\twhere: [`orderNumber=\"${orderNumber}\"`],\n\t\t})\n\t\tif (result.count === 1) {\n\t\t\treturn result.results[0] as Order\n\t\t}\n\n\t\t// Catch this for now, should be checked when creating/updating\n\t\tif (result.count > 1) {\n\t\t\tthrow new Error('Duplicate order numbers')\n\t\t}\n\n\t\treturn\n\t}\n\n\tactions = {\n\t\taddPayment: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Order>,\n\t\t\t{ payment }: OrderAddPaymentAction\n\t\t) => {\n\t\t\tconst resolvedPayment = this._storage.getByResourceIdentifier(\n\t\t\t\tcontext.projectKey,\n\t\t\t\tpayment\n\t\t\t)\n\t\t\tif (!resolvedPayment) {\n\t\t\t\tthrow new Error(`Payment ${payment.id} not found`)\n\t\t\t}\n\n\t\t\tif (!resource.paymentInfo) {\n\t\t\t\tresource.paymentInfo = {\n\t\t\t\t\tpayments: [],\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tresource.paymentInfo.payments.push({\n\t\t\t\ttypeId: 'payment',\n\t\t\t\tid: payment.id!,\n\t\t\t})\n\t\t},\n\t\tchangeOrderState: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Order>,\n\t\t\t{ orderState }: OrderChangeOrderStateAction\n\t\t) => {\n\t\t\tresource.orderState = orderState\n\t\t},\n\t\tchangePaymentState: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Order>,\n\t\t\t{ paymentState }: OrderChangePaymentStateAction\n\t\t) => {\n\t\t\tresource.paymentState = paymentState\n\t\t},\n\t\ttransitionState: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Order>,\n\t\t\t{ state }: OrderTransitionStateAction\n\t\t) => {\n\t\t\tconst resolvedType = this._storage.getByResourceIdentifier(\n\t\t\t\tcontext.projectKey,\n\t\t\t\tstate\n\t\t\t) as State | null\n\n\t\t\tif (!resolvedType) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`No state found with key=${state.key} or id=${state.key}`\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tresource.state = {\n\t\t\t\ttypeId: 'state',\n\t\t\t\tid: resolvedType.id,\n\t\t\t\tobj: { ...resolvedType, key: state.key ?? '' },\n\t\t\t}\n\t\t},\n\t\tsetBillingAddress: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Order>,\n\t\t\t{ address }: OrderSetBillingAddressAction\n\t\t) => {\n\t\t\tresource.billingAddress = createAddress(\n\t\t\t\taddress,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t)\n\t\t},\n\t\tsetCustomerEmail: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Order>,\n\t\t\t{ email }: OrderSetCustomerEmailAction\n\t\t) => {\n\t\t\tresource.customerEmail = email\n\t\t},\n\t\tsetCustomField: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Order,\n\t\t\t{ name, value }: OrderSetCustomFieldAction\n\t\t) => {\n\t\t\tif (!resource.custom) {\n\t\t\t\tthrow new Error('Resource has no custom field')\n\t\t\t}\n\t\t\tresource.custom.fields[name] = value\n\t\t},\n\t\tsetCustomType: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Order>,\n\t\t\t{ type, fields }: OrderSetCustomTypeAction\n\t\t) => {\n\t\t\tif (!type) {\n\t\t\t\tresource.custom = undefined\n\t\t\t} else {\n\t\t\t\tconst resolvedType = this._storage.getByResourceIdentifier(\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\ttype\n\t\t\t\t)\n\t\t\t\tif (!resolvedType) {\n\t\t\t\t\tthrow new Error(`Type ${type} not found`)\n\t\t\t\t}\n\n\t\t\t\tresource.custom = {\n\t\t\t\t\ttype: {\n\t\t\t\t\t\ttypeId: 'type',\n\t\t\t\t\t\tid: resolvedType.id,\n\t\t\t\t\t},\n\t\t\t\t\tfields: fields || {},\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tsetLocale: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Order>,\n\t\t\t{ locale }: OrderSetLocaleAction\n\t\t) => {\n\t\t\tresource.locale = locale\n\t\t},\n\t\tsetOrderNumber: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Order>,\n\t\t\t{ orderNumber }: OrderSetOrderNumberAction\n\t\t) => {\n\t\t\tresource.orderNumber = orderNumber\n\t\t},\n\t\tsetShippingAddress: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Order>,\n\t\t\t{ address }: OrderSetShippingAddressAction\n\t\t) => {\n\t\t\tresource.shippingAddress = createAddress(\n\t\t\t\taddress,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t)\n\t\t},\n\t\tsetStore: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Order>,\n\t\t\t{ store }: OrderSetStoreAction\n\t\t) => {\n\t\t\tif (!store) return\n\t\t\tconst resolvedType = this._storage.getByResourceIdentifier(\n\t\t\t\tcontext.projectKey,\n\t\t\t\tstore\n\t\t\t)\n\t\t\tif (!resolvedType) {\n\t\t\t\tthrow new Error(`No store found with key=${store.key}`)\n\t\t\t}\n\n\t\t\tconst storeReference = resolvedType as Store\n\t\t\tresource.store = {\n\t\t\t\ttypeId: 'store',\n\t\t\t\tkey: storeReference.key,\n\t\t\t}\n\t\t},\n\t}\n}\n","import type {\n\tOrderEdit,\n\tOrderEditDraft,\n\tOrderEditResult,\n\tOrderEditUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\n\nexport class OrderEditRepository extends AbstractResourceRepository<'order-edit'> {\n\tgetTypeId() {\n\t\treturn 'order-edit' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: OrderEditDraft): OrderEdit {\n\t\tconst resource: OrderEdit = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tstagedActions: draft.stagedActions ?? [],\n\t\t\tresource: draft.resource,\n\t\t\tresult: {\n\t\t\t\ttype: 'NotProcessed',\n\t\t\t} as OrderEditResult,\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tOrderEditUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<OrderEdit>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {}\n}\n","import type {\n\tPayment,\n\tPaymentAddTransactionAction,\n\tPaymentChangeTransactionStateAction,\n\tPaymentDraft,\n\tPaymentSetCustomFieldAction,\n\tPaymentSetCustomTypeAction,\n\tPaymentTransitionStateAction,\n\tState,\n\tStateReference,\n\tTransaction,\n\tTransactionDraft,\n} from '@commercetools/platform-sdk'\nimport { v4 as uuidv4 } from 'uuid'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\nimport {\n\tcreateCentPrecisionMoney,\n\tcreateCustomFields,\n\tgetReferenceFromResourceIdentifier,\n} from './helpers.js'\n\nexport class PaymentRepository extends AbstractResourceRepository<'payment'> {\n\tgetTypeId() {\n\t\treturn 'payment' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: PaymentDraft): Payment {\n\t\tconst resource: Payment = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tamountPlanned: createCentPrecisionMoney(draft.amountPlanned),\n\t\t\tpaymentMethodInfo: draft.paymentMethodInfo!,\n\t\t\tpaymentStatus: draft.paymentStatus\n\t\t\t\t? {\n\t\t\t\t\t\t...draft.paymentStatus,\n\t\t\t\t\t\tstate: draft.paymentStatus.state\n\t\t\t\t\t\t\t? getReferenceFromResourceIdentifier<StateReference>(\n\t\t\t\t\t\t\t\t\tdraft.paymentStatus.state,\n\t\t\t\t\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\t\t\t\t\tthis._storage\n\t\t\t\t\t\t\t )\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t }\n\t\t\t\t: {},\n\t\t\ttransactions: (draft.transactions || []).map((t) =>\n\t\t\t\tthis.transactionFromTransactionDraft(t, context)\n\t\t\t),\n\t\t\tinterfaceInteractions: (draft.interfaceInteractions || []).map(\n\t\t\t\t(interaction) =>\n\t\t\t\t\tcreateCustomFields(interaction, context.projectKey, this._storage)!\n\t\t\t),\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t}\n\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\ttransactionFromTransactionDraft = (\n\t\tdraft: TransactionDraft,\n\t\tcontext: RepositoryContext\n\t): Transaction => ({\n\t\t...draft,\n\t\tid: uuidv4(),\n\t\tamount: createCentPrecisionMoney(draft.amount),\n\t\tcustom: createCustomFields(draft.custom, context.projectKey, this._storage),\n\t\tstate: draft.state ?? 'Initial', // Documented as default\n\t})\n\n\tactions = {\n\t\tsetCustomField: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Payment,\n\t\t\t{ name, value }: PaymentSetCustomFieldAction\n\t\t) => {\n\t\t\tif (!resource.custom) {\n\t\t\t\tthrow new Error('Resource has no custom field')\n\t\t\t}\n\n\t\t\tresource.custom.fields[name] = value\n\t\t},\n\t\tsetCustomType: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Payment>,\n\t\t\t{ type, fields }: PaymentSetCustomTypeAction\n\t\t) => {\n\t\t\tif (!type) {\n\t\t\t\tresource.custom = undefined\n\t\t\t} else {\n\t\t\t\tconst resolvedType = this._storage.getByResourceIdentifier(\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\ttype\n\t\t\t\t)\n\t\t\t\tif (!resolvedType) {\n\t\t\t\t\tthrow new Error(`Type ${type} not found`)\n\t\t\t\t}\n\n\t\t\t\tresource.custom = {\n\t\t\t\t\ttype: {\n\t\t\t\t\t\ttypeId: 'type',\n\t\t\t\t\t\tid: resolvedType.id,\n\t\t\t\t\t},\n\t\t\t\t\tfields: fields ?? {},\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\taddTransaction: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Payment>,\n\t\t\t{ transaction }: PaymentAddTransactionAction\n\t\t) => {\n\t\t\tresource.transactions = [\n\t\t\t\t...resource.transactions,\n\t\t\t\tthis.transactionFromTransactionDraft(transaction, context),\n\t\t\t]\n\t\t},\n\t\tchangeTransactionState: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<Payment>,\n\t\t\t{ transactionId, state }: PaymentChangeTransactionStateAction\n\t\t) => {\n\t\t\tconst index = resource.transactions.findIndex(\n\t\t\t\t(e: Transaction) => e.id === transactionId\n\t\t\t)\n\t\t\tconst updatedTransaction: Transaction = {\n\t\t\t\t...resource.transactions[index],\n\t\t\t\tstate,\n\t\t\t}\n\t\t\tresource.transactions[index] = updatedTransaction\n\t\t},\n\t\ttransitionState: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Payment>,\n\t\t\t{ state }: PaymentTransitionStateAction\n\t\t) => {\n\t\t\tconst stateObj = this._storage.getByResourceIdentifier(\n\t\t\t\tcontext.projectKey,\n\t\t\t\tstate\n\t\t\t) as State | null\n\n\t\t\tif (!stateObj) {\n\t\t\t\tthrow new Error(`State ${state} not found`)\n\t\t\t}\n\n\t\t\tresource.paymentStatus.state = {\n\t\t\t\ttypeId: 'state',\n\t\t\t\tid: stateObj.id,\n\t\t\t\tobj: stateObj,\n\t\t\t}\n\t\t},\n\t\t// addInterfaceInteraction: () => {},\n\t\t// changeAmountPlanned: () => {},\n\t\t// changeTransactionInteractionId: () => {},\n\t\t// changeTransactionTimestamp: () => {},\n\t\t// setAmountPaid: () => {},\n\t\t// setAmountRefunded: () => {},\n\t\t// setAnonymousId: () => {},\n\t\t// setAuthorization: () => {},\n\t\t// setCustomer: () => {},\n\t\t// setExternalId: () => {},\n\t\t// setInterfaceId: () => {},\n\t\t// setKey: () => {},\n\t\t// setMethodInfoInterface: () => {},\n\t\t// setMethodInfoMethod: () => {},\n\t\t// setMethodInfoName: () => {},\n\t\t// setStatusInterfaceCode: () => {},\n\t\t// setStatusInterfaceText: () => {},\n\t}\n}\n","import type {\n\tPrice,\n\tPriceDraft,\n\tProduct,\n\tProductData,\n\tProductDraft,\n\tProductPublishAction,\n\tProductSetAttributeAction,\n\tProductSetAttributeInAllVariantsAction,\n\tProductSetDescriptionAction,\n\tProductAddExternalImageAction,\n\tProductRemoveImageAction,\n\tProductSetKeyAction,\n\tProductTypeReference,\n\tProductUpdateAction,\n\tProductVariant,\n\tProductVariantDraft,\n\tProductMoveImageToPositionAction,\n\tProductChangePriceAction,\n\tProductAddPriceAction,\n\tProductRemovePriceAction,\n\tCategoryReference,\n\tInvalidJsonInputError,\n\tInvalidOperationError,\n\tTaxCategoryReference,\n\tStateReference,\n\tProductChangeNameAction,\n\tProductChangeSlugAction,\n\tProductSetMetaTitleAction,\n\tProductSetMetaDescriptionAction,\n\tProductSetMetaKeywordsAction,\n\tProductAddVariantAction,\n\tProductRemoveVariantAction,\n\tProductChangeMasterVariantAction,\n\tProductSetTaxCategoryAction,\n\tProductAddToCategoryAction,\n\tProductRemoveFromCategoryAction,\n\tProductTransitionStateAction,\n} from '@commercetools/platform-sdk'\nimport { v4 as uuidv4 } from 'uuid'\nimport type { Writable } from '../types.js'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\nimport {\n\tcreateTypedMoney,\n\tgetReferenceFromResourceIdentifier,\n} from './helpers.js'\nimport deepEqual from 'deep-equal'\nimport { CommercetoolsError } from '../exceptions.js'\n\nexport class ProductRepository extends AbstractResourceRepository<'product'> {\n\tgetTypeId() {\n\t\treturn 'product' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: ProductDraft): Product {\n\t\tif (!draft.masterVariant) {\n\t\t\tthrow new Error('Missing master variant')\n\t\t}\n\n\t\tlet productType: ProductTypeReference | undefined = undefined\n\t\ttry {\n\t\t\tproductType = getReferenceFromResourceIdentifier<ProductTypeReference>(\n\t\t\t\tdraft.productType,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t)\n\t\t} catch (err) {\n\t\t\t// For now accept missing product types (but warn)\n\t\t\tconsole.warn(\n\t\t\t\t`Error resolving product-type '${draft.productType.id}'. This will be throw an error in later releases.`\n\t\t\t)\n\t\t\tproductType = {\n\t\t\t\ttypeId: 'product-type',\n\t\t\t\tid: draft.productType.id || '',\n\t\t\t}\n\t\t}\n\n\t\t// Resolve Product categories\n\t\tconst categoryReferences: CategoryReference[] = []\n\t\tdraft.categories?.forEach((category) => {\n\t\t\tif (category) {\n\t\t\t\tcategoryReferences.push(\n\t\t\t\t\tgetReferenceFromResourceIdentifier<CategoryReference>(\n\t\t\t\t\t\tcategory,\n\t\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\t\tthis._storage\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tthrow new CommercetoolsError<InvalidJsonInputError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'InvalidJsonInput',\n\t\t\t\t\t\tmessage: 'Request body does not contain valid JSON.',\n\t\t\t\t\t\tdetailedErrorMessage: 'categories: JSON object expected.',\n\t\t\t\t\t},\n\t\t\t\t\t400\n\t\t\t\t)\n\t\t\t}\n\t\t})\n\n\t\t// Resolve Tax category\n\t\tlet taxCategoryReference: TaxCategoryReference | undefined = undefined\n\t\tif (draft.taxCategory) {\n\t\t\ttaxCategoryReference =\n\t\t\t\tgetReferenceFromResourceIdentifier<TaxCategoryReference>(\n\t\t\t\t\tdraft.taxCategory,\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\tthis._storage\n\t\t\t\t)\n\t\t}\n\n\t\t// Resolve Product State\n\t\tlet productStateReference: StateReference | undefined = undefined\n\t\tif (draft.state) {\n\t\t\tproductStateReference =\n\t\t\t\tgetReferenceFromResourceIdentifier<StateReference>(\n\t\t\t\t\tdraft.state,\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\tthis._storage\n\t\t\t\t)\n\t\t}\n\n\t\tconst productData: ProductData = {\n\t\t\tname: draft.name,\n\t\t\tslug: draft.slug,\n\t\t\tdescription: draft.description,\n\t\t\tcategories: categoryReferences,\n\t\t\tmasterVariant: variantFromDraft(1, draft.masterVariant),\n\t\t\tvariants:\n\t\t\t\tdraft.variants?.map((variant, index) =>\n\t\t\t\t\tvariantFromDraft(index + 2, variant)\n\t\t\t\t) ?? [],\n\t\t\tmetaTitle: draft.metaTitle,\n\t\t\tmetaDescription: draft.metaDescription,\n\t\t\tmetaKeywords: draft.metaKeywords,\n\t\t\tsearchKeywords: draft.searchKeywords ?? {},\n\t\t}\n\n\t\tconst resource: Product = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tkey: draft.key,\n\t\t\tproductType: productType,\n\t\t\ttaxCategory: taxCategoryReference,\n\t\t\tstate: productStateReference,\n\t\t\tmasterData: {\n\t\t\t\tcurrent: productData,\n\t\t\t\tstaged: productData,\n\t\t\t\thasStagedChanges: false,\n\t\t\t\tpublished: draft.publish ?? false,\n\t\t\t},\n\t\t}\n\n\t\tthis.saveNew(context, resource)\n\n\t\treturn resource\n\t}\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tProductUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<Product>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {\n\t\tpublish: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ scope }: ProductPublishAction\n\t\t) => {\n\t\t\tresource.masterData.current = resource.masterData.staged\n\t\t\tresource.masterData.published = true\n\t\t\tcheckForStagedChanges(resource)\n\t\t},\n\t\tunpublish: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>\n\t\t\t// { action }: ProductUnpublishAction\n\t\t) => {\n\t\t\tresource.masterData.published = false\n\t\t\tcheckForStagedChanges(resource)\n\t\t},\n\t\tsetAttribute: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ variantId, sku, name, value, staged }: ProductSetAttributeAction\n\t\t) => {\n\t\t\tconst setAttr = (data: Writable<ProductData>) => {\n\t\t\t\tconst { variant, isMasterVariant, variantIndex } = getVariant(\n\t\t\t\t\tdata,\n\t\t\t\t\tvariantId,\n\t\t\t\t\tsku\n\t\t\t\t)\n\t\t\t\tif (!variant) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Variant with id ${variantId} or sku ${sku} not found on product ${resource.id}`\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tif (!variant.attributes) {\n\t\t\t\t\tvariant.attributes = []\n\t\t\t\t}\n\n\t\t\t\tconst existingAttr = variant.attributes.find(\n\t\t\t\t\t(attr) => attr.name === name\n\t\t\t\t)\n\t\t\t\tif (existingAttr) {\n\t\t\t\t\texistingAttr.value = value\n\t\t\t\t} else {\n\t\t\t\t\tvariant.attributes.push({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tif (isMasterVariant) {\n\t\t\t\t\tdata.masterVariant = variant\n\t\t\t\t} else {\n\t\t\t\t\tdata.variants[variantIndex] = variant\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If true, only the staged Attribute is set. If false, both current and\n\t\t\t// staged Attribute is set. Default is true\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\n\t\t\t// Write the attribute to the staged data\n\t\t\tsetAttr(resource.masterData.staged)\n\n\t\t\t// Also write to published data is isStaged = false\n\t\t\t// if isStaged is false we set the attribute on both the staged and\n\t\t\t// published data.\n\t\t\tif (!onlyStaged) {\n\t\t\t\tsetAttr(resource.masterData.current)\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\n\t\t\treturn resource\n\t\t},\n\t\tsetAttributeInAllVariants: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ name, value, staged }: ProductSetAttributeInAllVariantsAction\n\t\t) => {\n\t\t\tconst setAttrInAllVariants = (data: Writable<ProductData>) => {\n\t\t\t\tif (!data.masterVariant.attributes) {\n\t\t\t\t\tdata.masterVariant.attributes = []\n\t\t\t\t}\n\n\t\t\t\tconst existingAttr = data.masterVariant.attributes?.find(\n\t\t\t\t\t(attr) => attr.name === name\n\t\t\t\t)\n\n\t\t\t\tif (existingAttr) {\n\t\t\t\t\texistingAttr.value = value\n\t\t\t\t} else {\n\t\t\t\t\tdata.masterVariant.attributes.push({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tdata.variants.forEach((variant) => {\n\t\t\t\t\tif (!variant.attributes) {\n\t\t\t\t\t\tvariant.attributes = []\n\t\t\t\t\t}\n\n\t\t\t\t\tconst existingAttr = variant.attributes.find(\n\t\t\t\t\t\t(attr) => attr.name === name\n\t\t\t\t\t)\n\t\t\t\t\tif (existingAttr) {\n\t\t\t\t\t\texistingAttr.value = value\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvariant.attributes.push({\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// If true, only the staged Attribute is set. If false, both current and\n\t\t\t// staged Attribute is set. Default is true\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\n\t\t\t// Write the attribute to the staged data\n\t\t\tsetAttrInAllVariants(resource.masterData.staged)\n\n\t\t\t// Also write to published data is isStaged = false\n\t\t\t// if isStaged is false we set the attribute on both the staged and\n\t\t\t// published data.\n\t\t\tif (!onlyStaged) {\n\t\t\t\tsetAttrInAllVariants(resource.masterData.current)\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\n\t\t\treturn resource\n\t\t},\n\t\tsetDescription: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ description, staged }: ProductSetDescriptionAction\n\t\t) => {\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\n\t\t\tresource.masterData.staged.description = description\n\t\t\tif (!onlyStaged) {\n\t\t\t\tresource.masterData.current.description = description\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\t\t\treturn resource\n\t\t},\n\t\tsetKey: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ key }: ProductSetKeyAction\n\t\t) => {\n\t\t\tresource.key = key\n\t\t\treturn resource\n\t\t},\n\t\taddExternalImage: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ variantId, sku, image, staged }: ProductAddExternalImageAction\n\t\t) => {\n\t\t\tconst addImg = (data: Writable<ProductData>) => {\n\t\t\t\tconst { variant, isMasterVariant, variantIndex } = getVariant(\n\t\t\t\t\tdata,\n\t\t\t\t\tvariantId,\n\t\t\t\t\tsku\n\t\t\t\t)\n\t\t\t\tif (!variant) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Variant with id ${variantId} or sku ${sku} not found on product ${resource.id}`\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tif (!variant.images) {\n\t\t\t\t\tvariant.images = []\n\t\t\t\t} else {\n\t\t\t\t\tconst existingImage = variant.images.find((x) => x.url === image.url)\n\t\t\t\t\tif (existingImage) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Cannot add image '${image.url}' because product '${resource.id}' already has that image.`\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Add image\n\t\t\t\tvariant.images.push(image)\n\n\t\t\t\tif (isMasterVariant) {\n\t\t\t\t\tdata.masterVariant = variant\n\t\t\t\t} else {\n\t\t\t\t\tdata.variants[variantIndex] = variant\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If true, only the staged Attribute is set. If false, both current and\n\t\t\t// staged Attribute is set. Default is true\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\n\t\t\t// Write the attribute to the staged data\n\t\t\taddImg(resource.masterData.staged)\n\n\t\t\t// Also write to published data is isStaged = false\n\t\t\t// if isStaged is false we set the attribute on both the staged and\n\t\t\t// published data.\n\t\t\tif (!onlyStaged) {\n\t\t\t\taddImg(resource.masterData.current)\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\n\t\t\treturn resource\n\t\t},\n\t\tremoveImage: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ variantId, sku, imageUrl, staged }: ProductRemoveImageAction\n\t\t) => {\n\t\t\tconst removeImg = (data: Writable<ProductData>) => {\n\t\t\t\tconst { variant, isMasterVariant, variantIndex } = getVariant(\n\t\t\t\t\tdata,\n\t\t\t\t\tvariantId,\n\t\t\t\t\tsku\n\t\t\t\t)\n\t\t\t\tif (!variant) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Variant with id ${variantId} or sku ${sku} not found on product ${resource.id}`\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tconst variantImages = variant.images ?? []\n\t\t\t\tconst existingImage = variantImages.find((x) => x.url === imageUrl)\n\t\t\t\tif (!existingImage) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Cannot remove image '${imageUrl}' because product '${resource.id}' does not have that image.`\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\t// Remove image\n\t\t\t\tvariant.images = variantImages.filter((image) => image.url !== imageUrl)\n\n\t\t\t\tif (isMasterVariant) {\n\t\t\t\t\tdata.masterVariant = variant\n\t\t\t\t} else {\n\t\t\t\t\tdata.variants[variantIndex] = variant\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If true, only the staged Attribute is set. If false, both current and\n\t\t\t// staged Attribute is set. Default is true\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\n\t\t\t// Write the attribute to the staged data\n\t\t\tremoveImg(resource.masterData.staged)\n\n\t\t\t// Also write to published data is isStaged = false\n\t\t\t// if isStaged is false we set the attribute on both the staged and\n\t\t\t// published data.\n\t\t\tif (!onlyStaged) {\n\t\t\t\tremoveImg(resource.masterData.current)\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\n\t\t\treturn resource\n\t\t},\n\t\tmoveImageToPosition: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{\n\t\t\t\tvariantId,\n\t\t\t\tsku,\n\t\t\t\timageUrl,\n\t\t\t\tposition,\n\t\t\t\tstaged,\n\t\t\t}: ProductMoveImageToPositionAction\n\t\t) => {\n\t\t\tconst moveImg = (data: Writable<ProductData>) => {\n\t\t\t\tconst { variant, isMasterVariant, variantIndex } = getVariant(\n\t\t\t\t\tdata,\n\t\t\t\t\tvariantId,\n\t\t\t\t\tsku\n\t\t\t\t)\n\t\t\t\tif (!variant) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Variant with id ${variantId} or sku ${sku} not found on product ${resource.id}`\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tconst variantImages = variant.images ?? []\n\t\t\t\tconst existingImage = variantImages.find((x) => x.url === imageUrl)\n\t\t\t\tif (!existingImage) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Cannot move image '${imageUrl}' because product '${resource.id}' does not have that image.`\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tif (position >= variantImages.length) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Invalid position given. Position in images where the image should be moved. Must be between 0 and the total number of images minus 1.`\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\t// Remove image\n\t\t\t\tvariant.images = variantImages.filter((image) => image.url !== imageUrl)\n\n\t\t\t\t// Re-add image to the correct position\n\t\t\t\tvariant.images.splice(position, 0, existingImage)\n\n\t\t\t\tif (isMasterVariant) {\n\t\t\t\t\tdata.masterVariant = variant\n\t\t\t\t} else {\n\t\t\t\t\tdata.variants[variantIndex] = variant\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If true, only the staged Attribute is set. If false, both current and\n\t\t\t// staged Attribute is set. Default is true\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\n\t\t\t// Write the attribute to the staged data\n\t\t\tmoveImg(resource.masterData.staged)\n\n\t\t\t// Also write to published data is isStaged = false\n\t\t\t// if isStaged is false we set the attribute on both the staged and\n\t\t\t// published data.\n\t\t\tif (!onlyStaged) {\n\t\t\t\tmoveImg(resource.masterData.current)\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\n\t\t\treturn resource\n\t\t},\n\t\taddPrice: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ variantId, sku, price, staged }: ProductAddPriceAction\n\t\t) => {\n\t\t\tconst addVariantPrice = (\n\t\t\t\tdata: Writable<ProductData>,\n\t\t\t\tpriceToAdd: Price\n\t\t\t) => {\n\t\t\t\tconst { variant, isMasterVariant, variantIndex } = getVariant(\n\t\t\t\t\tdata,\n\t\t\t\t\tvariantId,\n\t\t\t\t\tsku\n\t\t\t\t)\n\t\t\t\tif (!variant) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Variant with id ${variantId} or sku ${sku} not found on product ${resource.id}`\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tif (variant.prices === undefined) {\n\t\t\t\t\tvariant.prices = [priceToAdd]\n\t\t\t\t} else {\n\t\t\t\t\tvariant.prices.push(priceToAdd)\n\t\t\t\t}\n\n\t\t\t\tif (isMasterVariant) {\n\t\t\t\t\tdata.masterVariant = variant\n\t\t\t\t} else {\n\t\t\t\t\tdata.variants[variantIndex] = variant\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Pre-creating the price object ensures consistency between staged and current versions\n\t\t\tconst priceToAdd = priceFromDraft(price)\n\n\t\t\t// If true, only the staged Attribute is set. If false, both current and\n\t\t\t// staged Attribute is set. Default is true\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\n\t\t\t// Write the attribute to the staged data\n\t\t\taddVariantPrice(resource.masterData.staged, priceToAdd)\n\n\t\t\t// Also write to published data is isStaged = false\n\t\t\t// if isStaged is false we set the attribute on both the staged and\n\t\t\t// published data.\n\t\t\tif (!onlyStaged) {\n\t\t\t\taddVariantPrice(resource.masterData.current, priceToAdd)\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\n\t\t\treturn resource\n\t\t},\n\t\tchangePrice: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ priceId, price, staged }: ProductChangePriceAction\n\t\t) => {\n\t\t\tconst changeVariantPrice = (data: Writable<ProductData>) => {\n\t\t\t\tconst allVariants = [data.masterVariant, ...(data.variants ?? [])]\n\t\t\t\tconst priceVariant = allVariants.find(\n\t\t\t\t\t(variant) => variant.prices?.some((x) => x.id === priceId)\n\t\t\t\t)\n\t\t\t\tif (!priceVariant) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Price with id ${priceId} not found on product ${resource.id}`\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tconst { variant, isMasterVariant, variantIndex } = getVariant(\n\t\t\t\t\tdata,\n\t\t\t\t\tpriceVariant.id,\n\t\t\t\t\tpriceVariant.sku\n\t\t\t\t)\n\t\t\t\tif (!variant) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Variant with id ${priceVariant.id} or sku ${priceVariant.sku} not found on product ${resource.id}`\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tvariant.prices = variant.prices?.map((x) => {\n\t\t\t\t\tif (x.id === priceId) {\n\t\t\t\t\t\treturn { ...x, ...price } as Price\n\t\t\t\t\t}\n\t\t\t\t\treturn x\n\t\t\t\t})\n\n\t\t\t\tif (isMasterVariant) {\n\t\t\t\t\tdata.masterVariant = variant\n\t\t\t\t} else {\n\t\t\t\t\tdata.variants[variantIndex] = variant\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If true, only the staged Attribute is set. If false, both current and\n\t\t\t// staged Attribute is set. Default is true\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\n\t\t\t// Write the attribute to the staged data\n\t\t\tchangeVariantPrice(resource.masterData.staged)\n\n\t\t\t// Also write to published data is isStaged = false\n\t\t\t// if isStaged is false we set the attribute on both the staged and\n\t\t\t// published data.\n\t\t\tif (!onlyStaged) {\n\t\t\t\tchangeVariantPrice(resource.masterData.current)\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\n\t\t\treturn resource\n\t\t},\n\t\tremovePrice: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ priceId, staged }: ProductRemovePriceAction\n\t\t) => {\n\t\t\tconst removeVariantPrice = (data: Writable<ProductData>) => {\n\t\t\t\tconst allVariants = [data.masterVariant, ...(data.variants ?? [])]\n\t\t\t\tconst priceVariant = allVariants.find(\n\t\t\t\t\t(variant) => variant.prices?.some((x) => x.id === priceId)\n\t\t\t\t)\n\t\t\t\tif (!priceVariant) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Price with id ${priceId} not found on product ${resource.id}`\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tconst { variant, isMasterVariant, variantIndex } = getVariant(\n\t\t\t\t\tdata,\n\t\t\t\t\tpriceVariant.id,\n\t\t\t\t\tpriceVariant.sku\n\t\t\t\t)\n\t\t\t\tif (!variant) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Variant with id ${priceVariant.id} or sku ${priceVariant.sku} not found on product ${resource.id}`\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tvariant.prices = variant.prices?.filter((x) => x.id !== priceId)\n\n\t\t\t\tif (isMasterVariant) {\n\t\t\t\t\tdata.masterVariant = variant\n\t\t\t\t} else {\n\t\t\t\t\tdata.variants[variantIndex] = variant\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If true, only the staged Attribute is set. If false, both current and\n\t\t\t// staged Attribute is set. Default is true\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\n\t\t\t// Write the attribute to the staged data\n\t\t\tremoveVariantPrice(resource.masterData.staged)\n\n\t\t\t// Also write to published data is isStaged = false\n\t\t\t// if isStaged is false we set the attribute on both the staged and\n\t\t\t// published data.\n\t\t\tif (!onlyStaged) {\n\t\t\t\tremoveVariantPrice(resource.masterData.current)\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\n\t\t\treturn resource\n\t\t},\n\t\tchangeName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ name, staged }: ProductChangeNameAction\n\t\t) => {\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\t\t\tresource.masterData.staged.name = name\n\t\t\tif (!onlyStaged) {\n\t\t\t\tresource.masterData.current.name = name\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\t\t\treturn resource\n\t\t},\n\t\tchangeSlug: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ slug, staged }: ProductChangeSlugAction\n\t\t) => {\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\t\t\tresource.masterData.staged.slug = slug\n\t\t\tif (!onlyStaged) {\n\t\t\t\tresource.masterData.current.slug = slug\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\t\t\treturn resource\n\t\t},\n\t\tsetMetaTitle: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ metaTitle, staged }: ProductSetMetaTitleAction\n\t\t) => {\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\t\t\tresource.masterData.staged.metaTitle = metaTitle\n\t\t\tif (!onlyStaged) {\n\t\t\t\tresource.masterData.current.metaTitle = metaTitle\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\t\t\treturn resource\n\t\t},\n\t\tsetMetaDescription: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ metaDescription, staged }: ProductSetMetaDescriptionAction\n\t\t) => {\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\t\t\tresource.masterData.staged.metaDescription = metaDescription\n\t\t\tif (!onlyStaged) {\n\t\t\t\tresource.masterData.current.metaDescription = metaDescription\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\t\t\treturn resource\n\t\t},\n\t\tsetMetaKeywords: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ metaKeywords, staged }: ProductSetMetaKeywordsAction\n\t\t) => {\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\t\t\tresource.masterData.staged.metaKeywords = metaKeywords\n\t\t\tif (!onlyStaged) {\n\t\t\t\tresource.masterData.current.metaKeywords = metaKeywords\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\t\t\treturn resource\n\t\t},\n\t\taddVariant: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{\n\t\t\t\tsku,\n\t\t\t\tkey,\n\t\t\t\tprices,\n\t\t\t\timages,\n\t\t\t\tattributes,\n\t\t\t\tstaged,\n\t\t\t\tassets,\n\t\t\t}: ProductAddVariantAction\n\t\t) => {\n\t\t\tconst variantDraft: ProductVariantDraft = {\n\t\t\t\tsku: sku,\n\t\t\t\tkey: key,\n\t\t\t\tprices: prices,\n\t\t\t\timages: images,\n\t\t\t\tattributes: attributes,\n\t\t\t\tassets: assets,\n\t\t\t}\n\n\t\t\tconst dataStaged = resource.masterData.staged\n\t\t\tconst allVariants = [\n\t\t\t\tdataStaged.masterVariant,\n\t\t\t\t...(dataStaged.variants ?? []),\n\t\t\t]\n\t\t\tconst maxId = allVariants.reduce(\n\t\t\t\t(max, element) => (element.id > max ? element.id : max),\n\t\t\t\t0\n\t\t\t)\n\t\t\tconst variant = variantFromDraft(maxId + 1, variantDraft)\n\t\t\tdataStaged.variants.push(variant)\n\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\n\t\t\tif (!onlyStaged) {\n\t\t\t\tresource.masterData.current.variants.push(variant)\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\n\t\t\treturn resource\n\t\t},\n\t\tremoveVariant: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ id, sku, staged }: ProductRemoveVariantAction\n\t\t) => {\n\t\t\tconst removeVariant = (data: Writable<ProductData>) => {\n\t\t\t\tconst { variant, isMasterVariant, variantIndex } = getVariant(\n\t\t\t\t\tdata,\n\t\t\t\t\tid,\n\t\t\t\t\tsku\n\t\t\t\t)\n\t\t\t\tif (!variant) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Variant with id ${id} or sku ${sku} not found on product ${resource.id}`\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tif (isMasterVariant) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Can not remove the variant [ID:${id}] for [Product:${resource.id}] since it's the master variant`\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tdata.variants.splice(variantIndex, 1)\n\t\t\t}\n\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\n\t\t\tremoveVariant(resource.masterData.staged)\n\n\t\t\tif (!onlyStaged) {\n\t\t\t\tremoveVariant(resource.masterData.current)\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\n\t\t\treturn resource\n\t\t},\n\t\tchangeMasterVariant: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ variantId, sku, staged }: ProductChangeMasterVariantAction\n\t\t) => {\n\t\t\tconst setMaster = (data: Writable<ProductData>) => {\n\t\t\t\tconst { variant, isMasterVariant, variantIndex } = getVariant(\n\t\t\t\t\tdata,\n\t\t\t\t\tvariantId,\n\t\t\t\t\tsku\n\t\t\t\t)\n\t\t\t\tif (!variant) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Variant with id ${variantId} or sku ${sku} not found on product ${resource.id}`\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tif (!isMasterVariant) {\n\t\t\t\t\t// Save previous master variant\n\t\t\t\t\tconst masterVariantPrev = data.masterVariant\n\t\t\t\t\tdata.masterVariant = variant\n\t\t\t\t\t// Remove new master from variants\n\t\t\t\t\tdata.variants.splice(variantIndex, 1)\n\t\t\t\t\t// Add previous master to variants\n\t\t\t\t\tdata.variants.push(masterVariantPrev)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\n\t\t\tsetMaster(resource.masterData.staged)\n\n\t\t\tif (!onlyStaged) {\n\t\t\t\tsetMaster(resource.masterData.current)\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\n\t\t\treturn resource\n\t\t},\n\t\tsetTaxCategory: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ taxCategory }: ProductSetTaxCategoryAction\n\t\t) => {\n\t\t\tlet taxCategoryReference: TaxCategoryReference | undefined = undefined\n\t\t\tif (taxCategory) {\n\t\t\t\ttaxCategoryReference =\n\t\t\t\t\tgetReferenceFromResourceIdentifier<TaxCategoryReference>(\n\t\t\t\t\t\ttaxCategory,\n\t\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\t\tthis._storage\n\t\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tthrow new CommercetoolsError<InvalidJsonInputError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'InvalidJsonInput',\n\t\t\t\t\t\tmessage: 'Request body does not contain valid JSON.',\n\t\t\t\t\t\tdetailedErrorMessage:\n\t\t\t\t\t\t\t'actions -> taxCategory: Missing required value',\n\t\t\t\t\t},\n\t\t\t\t\t400\n\t\t\t\t)\n\t\t\t}\n\t\t\tresource.taxCategory = taxCategoryReference\n\t\t\treturn resource\n\t\t},\n\t\taddToCategory: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ category, staged, orderHint }: ProductAddToCategoryAction\n\t\t) => {\n\t\t\tconst addCategory = (data: Writable<ProductData>) => {\n\t\t\t\tif (category) {\n\t\t\t\t\tdata.categories.push(\n\t\t\t\t\t\tgetReferenceFromResourceIdentifier<CategoryReference>(\n\t\t\t\t\t\t\tcategory,\n\t\t\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\t\t\tthis._storage\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t} else {\n\t\t\t\t\tthrow new CommercetoolsError<InvalidJsonInputError>(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcode: 'InvalidJsonInput',\n\t\t\t\t\t\t\tmessage: 'Request body does not contain valid JSON.',\n\t\t\t\t\t\t\tdetailedErrorMessage:\n\t\t\t\t\t\t\t\t'actions -> category: Missing required value',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t400\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\n\t\t\taddCategory(resource.masterData.staged)\n\n\t\t\tif (!onlyStaged) {\n\t\t\t\taddCategory(resource.masterData.current)\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\n\t\t\treturn resource\n\t\t},\n\t\tremoveFromCategory: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ category, staged }: ProductRemoveFromCategoryAction\n\t\t) => {\n\t\t\tconst removeCategory = (data: Writable<ProductData>) => {\n\t\t\t\tif (category) {\n\t\t\t\t\tconst resolvedCategory =\n\t\t\t\t\t\tgetReferenceFromResourceIdentifier<CategoryReference>(\n\t\t\t\t\t\t\tcategory,\n\t\t\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\t\t\tthis._storage\n\t\t\t\t\t\t)\n\n\t\t\t\t\tconst foundCategory = data.categories.find(\n\t\t\t\t\t\t(productCategory: CategoryReference) => {\n\t\t\t\t\t\t\tif (productCategory.id == resolvedCategory.id) {\n\t\t\t\t\t\t\t\treturn productCategory\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn false\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\n\t\t\t\t\tif (!foundCategory) {\n\t\t\t\t\t\tthrow new CommercetoolsError<InvalidOperationError>(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcode: 'InvalidOperation',\n\t\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\t\t`Cannot remove from category '${resolvedCategory.id}' because product ` +\n\t\t\t\t\t\t\t\t\t`'${resource.masterData.current.name}' is not in that category.`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t400\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\n\t\t\t\t\tdata.categories = data.categories.filter(\n\t\t\t\t\t\t(productCategory: CategoryReference) => {\n\t\t\t\t\t\t\tif (productCategory.id == resolvedCategory.id) {\n\t\t\t\t\t\t\t\treturn false\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\t\t\t\t} else {\n\t\t\t\t\tthrow new CommercetoolsError<InvalidJsonInputError>(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcode: 'InvalidJsonInput',\n\t\t\t\t\t\t\tmessage: 'Request body does not contain valid JSON.',\n\t\t\t\t\t\t\tdetailedErrorMessage:\n\t\t\t\t\t\t\t\t'actions -> category: Missing required value',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t400\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\t\t\tremoveCategory(resource.masterData.staged)\n\n\t\t\tif (!onlyStaged) {\n\t\t\t\tremoveCategory(resource.masterData.current)\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\n\t\t\treturn resource\n\t\t},\n\t\ttransitionState: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ state, force }: ProductTransitionStateAction\n\t\t) => {\n\t\t\tlet productStateReference: StateReference | undefined = undefined\n\t\t\tif (state) {\n\t\t\t\tproductStateReference =\n\t\t\t\t\tgetReferenceFromResourceIdentifier<StateReference>(\n\t\t\t\t\t\tstate,\n\t\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\t\tthis._storage\n\t\t\t\t\t)\n\t\t\t\tresource.state = productStateReference\n\t\t\t} else {\n\t\t\t\tthrow new CommercetoolsError<InvalidJsonInputError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'InvalidJsonInput',\n\t\t\t\t\t\tmessage: 'Request body does not contain valid JSON.',\n\t\t\t\t\t\tdetailedErrorMessage: 'actions -> state: Missing required value',\n\t\t\t\t\t},\n\t\t\t\t\t400\n\t\t\t\t)\n\t\t\t}\n\n\t\t\treturn resource\n\t\t},\n\n\t\t// 'setPrices': () => {},\n\t\t// 'setProductPriceCustomType': () => {},\n\t\t// 'setProductPriceCustomField': () => {},\n\t\t// 'setDiscountedPrice': () => {},\n\t\t// 'setAttributeInAllVariants': () => {},\n\t\t// 'setCategoryOrderHint': () => {},\n\t\t// 'setSku': () => {},\n\t\t// 'setProductVariantKey': () => {},\n\t\t// 'setImageLabel': () => {},\n\t\t// 'addAsset': () => {},\n\t\t// 'removeAsset': () => {},\n\t\t// 'setAssetKey': () => {},\n\t\t// 'changeAssetOrder': () => {},\n\t\t// 'changeAssetName': () => {},\n\t\t// 'setAssetDescription': () => {},\n\t\t// 'setAssetTags': () => {},\n\t\t// 'setAssetSources': () => {},\n\t\t// 'setAssetCustomType': () => {},\n\t\t// 'setAssetCustomField': () => {},\n\t\t// 'setSearchKeywords': () => {},\n\t\t// 'revertStagedChanges': () => {},\n\t\t// 'revertStagedVariantChanges': () => {},\n\t}\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\tif (!product.masterData.staged) {\n\t\tproduct.masterData.staged = product.masterData.current\n\t}\n\n\tif (deepEqual(product.masterData.current, product.masterData.staged)) {\n\t\tproduct.masterData.hasStagedChanges = false\n\t} else {\n\t\tproduct.masterData.hasStagedChanges = true\n\t}\n}\n\ninterface VariantResult {\n\tvariant: Writable<ProductVariant> | undefined\n\tisMasterVariant: boolean\n\tvariantIndex: number\n}\n\nconst getVariant = (\n\tproductData: ProductData,\n\tvariantId?: number,\n\tsku?: string\n): VariantResult => {\n\tconst variants = [productData.masterVariant, ...productData.variants]\n\tconst foundVariant = variants.find((variant: ProductVariant) => {\n\t\tif (variantId) {\n\t\t\treturn variant.id === variantId\n\t\t}\n\t\tif (sku) {\n\t\t\treturn variant.sku === sku\n\t\t}\n\t\treturn false\n\t})\n\n\tconst isMasterVariant = foundVariant === productData.masterVariant\n\treturn {\n\t\tvariant: foundVariant,\n\t\tisMasterVariant,\n\t\tvariantIndex:\n\t\t\t!isMasterVariant && foundVariant\n\t\t\t\t? productData.variants.indexOf(foundVariant)\n\t\t\t\t: -1,\n\t}\n}\n\nconst variantFromDraft = (\n\tvariantId: number,\n\tvariant: ProductVariantDraft\n): ProductVariant => ({\n\tid: variantId,\n\tsku: variant?.sku,\n\tkey: variant?.key,\n\tattributes: variant?.attributes ?? [],\n\tprices: variant?.prices?.map(priceFromDraft),\n\tassets: [],\n\timages: [],\n})\n\nconst priceFromDraft = (draft: PriceDraft): Price => ({\n\tid: uuidv4(),\n\tkey: draft.key,\n\tcountry: draft.country,\n\tvalue: createTypedMoney(draft.value),\n})\n","import type {\n\tProductDiscount,\n\tProductDiscountChangeIsActiveAction,\n\tProductDiscountChangeNameAction,\n\tProductDiscountChangePredicateAction,\n\tProductDiscountChangeSortOrderAction,\n\tProductDiscountChangeValueAction,\n\tProductDiscountDraft,\n\tProductDiscountSetDescriptionAction,\n\tProductDiscountSetKeyAction,\n\tProductDiscountSetValidFromAction,\n\tProductDiscountSetValidFromAndUntilAction,\n\tProductDiscountSetValidUntilAction,\n\tProductDiscountUpdateAction,\n\tProductDiscountValue,\n\tProductDiscountValueAbsolute,\n\tProductDiscountValueDraft,\n\tProductDiscountValueExternal,\n\tProductDiscountValueRelative,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\nimport { createTypedMoney } from './helpers.js'\n\nexport class ProductDiscountRepository extends AbstractResourceRepository<'product-discount'> {\n\tgetTypeId() {\n\t\treturn 'product-discount' as const\n\t}\n\n\tcreate(\n\t\tcontext: RepositoryContext,\n\t\tdraft: ProductDiscountDraft\n\t): ProductDiscount {\n\t\tconst resource: ProductDiscount = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tkey: draft.key,\n\t\t\tname: draft.name,\n\t\t\tdescription: draft.description,\n\t\t\tvalue: this.transformValueDraft(draft.value),\n\t\t\tpredicate: draft.predicate,\n\t\t\tsortOrder: draft.sortOrder,\n\t\t\tisActive: draft.isActive || false,\n\t\t\tvalidFrom: draft.validFrom,\n\t\t\tvalidUntil: draft.validUntil,\n\t\t\treferences: [],\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tprivate transformValueDraft(\n\t\tvalue: ProductDiscountValueDraft\n\t): ProductDiscountValue {\n\t\tswitch (value.type) {\n\t\t\tcase 'absolute': {\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'absolute',\n\t\t\t\t\tmoney: value.money.map(createTypedMoney),\n\t\t\t\t} as ProductDiscountValueAbsolute\n\t\t\t}\n\t\t\tcase 'external': {\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'external',\n\t\t\t\t} as ProductDiscountValueExternal\n\t\t\t}\n\t\t\tcase 'relative': {\n\t\t\t\treturn {\n\t\t\t\t\t...value,\n\t\t\t\t} as ProductDiscountValueRelative\n\t\t\t}\n\t\t}\n\t}\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tProductDiscountUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<ProductDiscount>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {\n\t\tsetKey: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductDiscount>,\n\t\t\t{ key }: ProductDiscountSetKeyAction\n\t\t) => {\n\t\t\tresource.key = key\n\t\t},\n\t\tsetDescription: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductDiscount>,\n\t\t\t{ description }: ProductDiscountSetDescriptionAction\n\t\t) => {\n\t\t\tif (description && Object.keys(description).length > 0) {\n\t\t\t\tresource.description = description\n\t\t\t} else {\n\t\t\t\tresource.description = undefined\n\t\t\t}\n\t\t},\n\t\tchangeName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductDiscount>,\n\t\t\t{ name }: ProductDiscountChangeNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\t\tchangeValue: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductDiscount>,\n\t\t\t{ value }: ProductDiscountChangeValueAction\n\t\t) => {\n\t\t\tresource.value = this.transformValueDraft(value)\n\t\t},\n\t\tchangePredicate: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductDiscount>,\n\t\t\t{ predicate }: ProductDiscountChangePredicateAction\n\t\t) => {\n\t\t\tresource.predicate = predicate\n\t\t},\n\t\tchangeSortOrder: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductDiscount>,\n\t\t\t{ sortOrder }: ProductDiscountChangeSortOrderAction\n\t\t) => {\n\t\t\tresource.sortOrder = sortOrder\n\t\t},\n\t\tchangeIsActive: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductDiscount>,\n\t\t\t{ isActive }: ProductDiscountChangeIsActiveAction\n\t\t) => {\n\t\t\tresource.isActive = isActive\n\t\t},\n\t\tsetValidFrom: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductDiscount>,\n\t\t\t{ validFrom }: ProductDiscountSetValidFromAction\n\t\t) => {\n\t\t\tresource.validFrom = validFrom\n\t\t},\n\t\tsetValidUntil: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductDiscount>,\n\t\t\t{ validUntil }: ProductDiscountSetValidUntilAction\n\t\t) => {\n\t\t\tresource.validUntil = validUntil\n\t\t},\n\t\tsetValidFromAndUntil: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductDiscount>,\n\t\t\t{ validFrom, validUntil }: ProductDiscountSetValidFromAndUntilAction\n\t\t) => {\n\t\t\tresource.validFrom = validFrom\n\t\t\tresource.validUntil = validUntil\n\t\t},\n\t}\n}\n","/**\n * This module implements the commercetools product projection filter expression.\n */\n\nimport type {\n\tProductProjection,\n\tProductVariant,\n} from '@commercetools/platform-sdk'\nimport { nestedLookup } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport { Lexer, Parser } from './parser.js'\n\ntype MatchFunc = (target: any) => boolean\n\ntype ProductProjectionFilter = (\n\tp: Writable<ProductProjection>,\n\tmarkMatchingVariants: boolean\n) => boolean\n\ntype TypeSymbol = {\n\ttype: 'Symbol'\n\tkind: 'int' | 'string' | 'any'\n\tvalue: any\n}\n\ntype RangeExpressionSet = {\n\tsource: string\n\ttype: 'RangeExpression'\n\tchildren?: RangeExpression[]\n}\n\ntype FilterExpressionSet = {\n\tsource: string\n\ttype: 'FilterExpression'\n\tchildren?: FilterExpression[]\n}\n\ntype TermExpressionSet = {\n\tsource: string\n\ttype: 'TermExpression'\n}\n\ntype ExpressionSet =\n\t| RangeExpressionSet\n\t| FilterExpressionSet\n\t| TermExpressionSet\n\nexport type RangeExpression = {\n\ttype: 'RangeExpression'\n\tstart?: number\n\tstop?: number\n\tmatch: (obj: any) => boolean\n}\n\nexport type FilterExpression = {\n\ttype: 'FilterExpression'\n\tmatch: (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\tfilter: string\n): ProductProjectionFilter => {\n\tconst exprFunc = generateMatchFunc(filter)\n\tconst [source] = filter.split(':', 1)\n\n\tif (source.startsWith('variants.')) {\n\t\treturn filterVariants(source, exprFunc)\n\t}\n\treturn filterProduct(source, exprFunc)\n}\n\nconst getLexer = (value: string) =>\n\tnew Lexer(value)\n\t\t.token('MISSING', /missing(?![-_a-z0-9]+)/i)\n\t\t.token('EXISTS', /exists(?![-_a-z0-9]+)/i)\n\t\t.token('RANGE', /range(?![-_a-z0-9]+)/i)\n\t\t.token('TO', /to(?![-_a-z0-9]+)/i)\n\t\t.token('IDENTIFIER', /[-_.a-z]+/i)\n\n\t\t.token('FLOAT', /\\d+\\.\\d+/)\n\t\t.token('INT', /\\d+/)\n\t\t.token('STRING', /\"((?:\\\\.|[^\"\\\\])*)\"/)\n\t\t.token('STRING', /'((?:\\\\.|[^'\\\\])*)'/)\n\n\t\t.token('COMMA', ',')\n\t\t.token('STAR', '*')\n\t\t.token('(', '(')\n\t\t.token(':', ':')\n\t\t.token(')', ')')\n\t\t.token('\"', '\"')\n\t\t.token('WS', /\\s+/, true) // skip\n\nconst parseFilter = (filter: string): ExpressionSet => {\n\tconst lexer = getLexer(filter)\n\tconst parser = new Parser(lexer)\n\t\t.builder()\n\t\t.nud('IDENTIFIER', 100, (t) => t.token.match)\n\t\t.led(':', 100, ({ left, bp }) => {\n\t\t\tconst parsed: any = parser.parse({ terminals: [bp - 1] })\n\t\t\tconst expressions: RangeExpression[] | FilterExpression[] | TypeSymbol[] =\n\t\t\t\t!Array.isArray(parsed) ? [parsed] : parsed\n\n\t\t\t// Make sure we only have one type of expression (cannot mix)\n\t\t\tconst unique = new Set(expressions.map((expr) => expr.type))\n\t\t\tif (unique.size > 1) {\n\t\t\t\tthrow new Error('Invalid expression')\n\t\t\t}\n\n\t\t\t// Convert plain symbols to a filter expression. For example\n\t\t\t// variants.attribute.foobar:4 where 4 is a Symbol should result\n\t\t\t// in a comparison\n\t\t\tif (expressions.some((expr) => expr.type == 'Symbol')) {\n\t\t\t\treturn {\n\t\t\t\t\tsource: left as string,\n\t\t\t\t\ttype: 'FilterExpression',\n\t\t\t\t\tchildren: expressions.map((e): FilterExpression => {\n\t\t\t\t\t\tif (e.type != 'Symbol') {\n\t\t\t\t\t\t\tthrow new Error('Invalid expression')\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ttype: 'FilterExpression',\n\t\t\t\t\t\t\tmatch: (obj: any): boolean => obj === e.value,\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tsource: left,\n\t\t\t\ttype: expressions[0].type,\n\t\t\t\tchildren: expressions,\n\t\t\t}\n\t\t})\n\t\t.nud(\n\t\t\t'STRING',\n\t\t\t20,\n\t\t\t(t) =>\n\t\t\t\t({\n\t\t\t\t\ttype: 'Symbol',\n\t\t\t\t\tkind: 'string',\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tvalue: t.token.groups[1],\n\t\t\t\t}) as TypeSymbol\n\t\t)\n\t\t.nud(\n\t\t\t'INT',\n\t\t\t5,\n\t\t\t(t) =>\n\t\t\t\t({\n\t\t\t\t\ttype: 'Symbol',\n\t\t\t\t\tkind: 'int',\n\t\t\t\t\tvalue: parseInt(t.token.match, 10),\n\t\t\t\t}) as TypeSymbol\n\t\t)\n\t\t.nud('STAR', 5, (_) => ({\n\t\t\ttype: 'Symbol',\n\t\t\tkind: 'any',\n\t\t\tvalue: null,\n\t\t}))\n\t\t.nud(\n\t\t\t'EXISTS',\n\t\t\t10,\n\t\t\t({ bp }) =>\n\t\t\t\t({\n\t\t\t\t\ttype: 'FilterExpression',\n\t\t\t\t\tmatch: (obj: any): boolean => obj !== undefined,\n\t\t\t\t}) as FilterExpression\n\t\t)\n\t\t.nud(\n\t\t\t'MISSING',\n\t\t\t10,\n\t\t\t({ bp }) =>\n\t\t\t\t({\n\t\t\t\t\ttype: 'FilterExpression',\n\t\t\t\t\tmatch: (obj: any): boolean => obj === undefined,\n\t\t\t\t}) as FilterExpression\n\t\t)\n\t\t.led('COMMA', 200, ({ left, token, bp }) => {\n\t\t\tconst expr: any = parser.parse({ terminals: [bp - 1] })\n\t\t\tif (Array.isArray(expr)) {\n\t\t\t\treturn [left, ...expr]\n\t\t\t} else {\n\t\t\t\treturn [left, expr]\n\t\t\t}\n\t\t})\n\t\t.nud('(', 100, (t) => {\n\t\t\tconst expr: any = parser.parse({ terminals: [')'] })\n\t\t\tlexer.expect(')')\n\t\t\treturn expr\n\t\t})\n\t\t.bp(')', 0)\n\t\t.led('TO', 20, ({ left, bp }) => {\n\t\t\tconst expr: any = parser.parse({ terminals: [bp - 1] })\n\t\t\treturn {\n\t\t\t\tstart: left.value,\n\t\t\t\tstop: expr.value,\n\t\t\t}\n\t\t})\n\t\t.nud('RANGE', 20, ({ bp }) => {\n\t\t\tlet ranges: any = parser.parse()\n\n\t\t\t// If multiple ranges are defined we receive an array of ranges. So let's\n\t\t\t// make sure we always have an array\n\t\t\tif (!Array.isArray(ranges)) {\n\t\t\t\tranges = [ranges]\n\t\t\t}\n\n\t\t\t// Return a list of functions which matches the ranges. These functions\n\t\t\t// are processed as an OR clause\n\t\t\treturn ranges.map((range: any) => {\n\t\t\t\tlet func: (obj: any) => boolean\n\n\t\t\t\tif (range.start !== null && range.stop !== null) {\n\t\t\t\t\tfunc = (obj: any): boolean => obj >= range.start && obj <= range.stop\n\t\t\t\t} else if (range.start === null && range.stop !== null) {\n\t\t\t\t\tfunc = (obj: any): boolean => obj <= range.stop\n\t\t\t\t} else if (range.start !== null && range.stop === null) {\n\t\t\t\t\tfunc = (obj: any): boolean => obj >= range.start\n\t\t\t\t} else {\n\t\t\t\t\tfunc = (obj: any): boolean => true\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'RangeExpression',\n\t\t\t\t\tstart: range.start,\n\t\t\t\t\tstop: range.stop,\n\t\t\t\t\tmatch: func,\n\t\t\t\t} as RangeExpression\n\t\t\t})\n\t\t})\n\t\t.build()\n\n\treturn parser.parse()\n}\n\nconst generateMatchFunc = (filter: string) => {\n\tconst result = parseFilter(filter)\n\tif (!result) {\n\t\t// const lines = filter.split('\\n')\n\t\t// const column = lines[lines.length - 1].length\n\t\tthrow new Error(`Syntax error while parsing '${filter}'.`)\n\t}\n\tif (result.type == 'TermExpression') {\n\t\tthrow new Error(`Syntax error while parsing '${filter}'.`)\n\t}\n\n\treturn (obj: any) => {\n\t\tif (!result.children) return false\n\t\treturn result.children.some((c) => c.match(obj))\n\t}\n}\n\nexport const generateFacetFunc = (filter: string): ExpressionSet => {\n\tif (!filter.includes(':')) {\n\t\treturn {\n\t\t\tsource: filter,\n\t\t\ttype: 'TermExpression',\n\t\t}\n\t}\n\treturn parseFilter(filter)\n}\n\nconst filterProduct =\n\t(source: string, exprFunc: MatchFunc): ProductProjectionFilter =>\n\t(p: ProductProjection, markMatchingVariants: boolean): boolean => {\n\t\tconst value = nestedLookup(p, source)\n\t\treturn exprFunc(value)\n\t}\n\nconst filterVariants =\n\t(source: string, exprFunc: MatchFunc): ProductProjectionFilter =>\n\t(p: ProductProjection, markMatchingVariants: boolean): boolean => {\n\t\tconst [, ...paths] = source.split('.')\n\t\tconst path = paths.join('.')\n\n\t\tconst variants = getVariants(p) as Writable<ProductVariant>[]\n\t\tfor (const variant of variants) {\n\t\t\tconst value = resolveVariantValue(variant, path)\n\n\t\t\tif (exprFunc(value)) {\n\t\t\t\t// If markMatchingVariants parameter is true those ProductVariants that\n\t\t\t\t// match the search query have the additional field isMatchingVariant\n\t\t\t\t// set to true. For the other variants in the same product projection\n\t\t\t\t// this field is set to false.\n\t\t\t\tif (markMatchingVariants) {\n\t\t\t\t\tvariants.forEach((v) => (v.isMatchingVariant = false))\n\t\t\t\t\tvariant.isMatchingVariant = true\n\t\t\t\t}\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n\nexport const resolveVariantValue = (obj: ProductVariant, path: string): any => {\n\tif (path === undefined) {\n\t\treturn obj\n\t}\n\tif (path.startsWith('variants.')) {\n\t\tpath = path.substring(path.indexOf('.') + 1)\n\t}\n\n\tif (path.startsWith('attributes.')) {\n\t\tconst [, attrName, ...rest] = path.split('.')\n\t\tif (!obj.attributes) {\n\t\t\treturn undefined\n\t\t}\n\n\t\tfor (const attr of obj.attributes) {\n\t\t\tif (attr.name === attrName) {\n\t\t\t\treturn nestedLookup(attr.value, rest.join('.'))\n\t\t\t}\n\t\t}\n\t}\n\n\tif (path === 'price.centAmount') {\n\t\treturn obj.prices && obj.prices.length > 0\n\t\t\t? obj.prices[0].value.centAmount\n\t\t\t: undefined\n\t}\n\n\treturn nestedLookup(obj, path)\n}\n\nexport const getVariants = (p: ProductProjection): ProductVariant[] => [\n\tp.masterVariant,\n\t...(p.variants ?? []),\n]\n","import type {\n\tInvalidInputError,\n\tPrice,\n\tProductProjection,\n\tProductVariant,\n} from '@commercetools/platform-sdk'\nimport { CommercetoolsError } from './exceptions.js'\nimport type { Writable } from './types.js'\n\nexport type PriceSelector = {\n\tcurrency?: string\n\tcountry?: string\n\tcustomerGroup?: string\n\tchannel?: 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\tproducts: ProductProjection[],\n\tselector: PriceSelector\n) => {\n\tvalidatePriceSelector(selector)\n\n\tfor (const product of products) {\n\t\tconst variants: Writable<ProductVariant>[] = [\n\t\t\tproduct.masterVariant,\n\t\t\t...(product.variants ?? []),\n\t\t].filter((x) => x != undefined)\n\n\t\tfor (const variant of variants) {\n\t\t\tconst scopedPrices =\n\t\t\t\tvariant.prices?.filter((p) => priceSelectorFilter(p, selector)) ?? []\n\n\t\t\tif (scopedPrices.length > 0) {\n\t\t\t\tconst price = scopedPrices[0]\n\n\t\t\t\tvariant.scopedPriceDiscounted = false\n\t\t\t\tvariant.scopedPrice = {\n\t\t\t\t\t...price,\n\t\t\t\t\tcurrentValue: price.value,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nconst validatePriceSelector = (selector: PriceSelector) => {\n\tif (\n\t\t(selector.country || selector.channel || selector.customerGroup) &&\n\t\t!selector.currency\n\t) {\n\t\tthrow new CommercetoolsError<InvalidInputError>(\n\t\t\t{\n\t\t\t\tcode: 'InvalidInput',\n\t\t\t\tmessage:\n\t\t\t\t\t'The price selecting parameters country, channel and customerGroup ' +\n\t\t\t\t\t'cannot be used without the currency.',\n\t\t\t},\n\t\t\t400\n\t\t)\n\t}\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\tprice: Price,\n\tselector: PriceSelector\n): boolean => {\n\tif (\n\t\t(selector.country || price.country) &&\n\t\tselector.country !== price.country\n\t) {\n\t\treturn false\n\t}\n\n\tif (\n\t\t(selector.currency || price.value.currencyCode) &&\n\t\tselector.currency !== price.value.currencyCode\n\t) {\n\t\treturn false\n\t}\n\n\tif (\n\t\t(selector.channel || price.channel?.id) &&\n\t\tselector.channel !== price.channel?.id\n\t) {\n\t\treturn false\n\t}\n\n\tif (\n\t\t(selector.customerGroup || price.customerGroup?.id) &&\n\t\tselector.customerGroup !== price.customerGroup?.id\n\t) {\n\t\treturn false\n\t}\n\n\treturn true\n}\n","import type {\n\tFacetResults,\n\tFilteredFacetResult,\n\tInvalidInputError,\n\tProduct,\n\tProductProjection,\n\tProductProjectionPagedSearchResponse,\n\tQueryParam,\n\tRangeFacetResult,\n\tTermFacetResult,\n} from '@commercetools/platform-sdk'\nimport { CommercetoolsError } from './exceptions.js'\nimport { nestedLookup } from './helpers.js'\nimport {\n\tFilterExpression,\n\tRangeExpression,\n\tgenerateFacetFunc,\n\tgetVariants,\n\tparseFilterExpression,\n\tresolveVariantValue,\n} from './lib/projectionSearchFilter.js'\nimport { applyPriceSelector } from './priceSelector.js'\nimport { AbstractStorage } from './storage/index.js'\nimport type { Writable } from './types.js'\n\nexport type ProductProjectionSearchParams = {\n\tfuzzy?: boolean\n\tfuzzyLevel?: number\n\tmarkMatchingVariants?: boolean\n\tstaged?: boolean\n\tfilter?: string[]\n\t'filter.facets'?: string[]\n\t'filter.query'?: string[]\n\tfacet?: string | string[]\n\tsort?: string | string[]\n\tlimit?: number\n\toffset?: number\n\twithTotal?: boolean\n\tpriceCurrency?: string\n\tpriceCountry?: string\n\tpriceCustomerGroup?: string\n\tpriceChannel?: string\n\tlocaleProjection?: string\n\tstoreProjection?: string\n\texpand?: string | string[]\n\t[key: string]: QueryParam\n}\n\nexport class ProductProjectionSearch {\n\tprotected _storage: AbstractStorage\n\n\tconstructor(storage: AbstractStorage) {\n\t\tthis._storage = storage\n\t}\n\n\tsearch(\n\t\tprojectKey: string,\n\t\tparams: ProductProjectionSearchParams\n\t): ProductProjectionPagedSearchResponse {\n\t\tlet resources = this._storage\n\t\t\t.all(projectKey, 'product')\n\t\t\t.map((r) => this.transform(r, params.staged ?? false))\n\t\t\t.filter((p) => {\n\t\t\t\tif (!params.staged ?? false) {\n\t\t\t\t\treturn p.published\n\t\t\t\t}\n\t\t\t\treturn true\n\t\t\t})\n\n\t\tconst markMatchingVariant = params.markMatchingVariants ?? false\n\n\t\t// Apply the priceSelector\n\t\tapplyPriceSelector(resources, {\n\t\t\tcountry: params.priceCountry,\n\t\t\tchannel: params.priceChannel,\n\t\t\tcustomerGroup: params.priceCustomerGroup,\n\t\t\tcurrency: params.priceCurrency,\n\t\t})\n\n\t\t// Apply filters pre facetting\n\t\tif (params.filter) {\n\t\t\ttry {\n\t\t\t\tconst filters = params.filter.map(parseFilterExpression)\n\n\t\t\t\t// Filters can modify the output. So clone the resources first.\n\t\t\t\tresources = resources.filter((resource) =>\n\t\t\t\t\tfilters.every((f) => f(resource, markMatchingVariant))\n\t\t\t\t)\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(err)\n\t\t\t\tthrow new CommercetoolsError<InvalidInputError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'InvalidInput',\n\t\t\t\t\t\tmessage: (err as any).message,\n\t\t\t\t\t},\n\t\t\t\t\t400\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\t// TODO: Calculate facets\n\t\tconst facets = this.getFacets(params, resources)\n\n\t\t// Apply filters post facetting\n\t\tif (params['filter.query']) {\n\t\t\ttry {\n\t\t\t\tconst filters = params['filter.query'].map(parseFilterExpression)\n\t\t\t\tresources = resources.filter((resource) =>\n\t\t\t\t\tfilters.every((f) => f(resource, markMatchingVariant))\n\t\t\t\t)\n\t\t\t} catch (err) {\n\t\t\t\tthrow new CommercetoolsError<InvalidInputError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'InvalidInput',\n\t\t\t\t\t\tmessage: (err as any).message,\n\t\t\t\t\t},\n\t\t\t\t\t400\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\t// Expand the resources\n\t\tif (params.expand !== undefined) {\n\t\t\tresources = resources.map((resource) =>\n\t\t\t\tthis._storage.expand(projectKey, resource, params.expand)\n\t\t\t)\n\t\t}\n\n\t\t// Create a slice for the pagination. If we were working with large datasets\n\t\t// then we should have done this before transforming. But that isn't the\n\t\t// goal of this library. So lets keep it simple.\n\t\tconst totalResults = resources.length\n\t\tconst offset = params.offset || 0\n\t\tconst limit = params.limit || 20\n\t\tconst results = resources.slice(offset, offset + limit)\n\n\t\treturn {\n\t\t\tcount: totalResults,\n\t\t\ttotal: results.length,\n\t\t\toffset: offset,\n\t\t\tlimit: limit,\n\t\t\tresults: results,\n\t\t\tfacets: facets,\n\t\t}\n\t}\n\n\ttransform(product: Product, staged: boolean): ProductProjection {\n\t\tconst obj = !staged ? product.masterData.current : product.masterData.staged\n\n\t\treturn {\n\t\t\tid: product.id,\n\t\t\tcreatedAt: product.createdAt,\n\t\t\tlastModifiedAt: product.lastModifiedAt,\n\t\t\tversion: product.version,\n\t\t\tname: obj.name,\n\t\t\tkey: product.key,\n\t\t\tdescription: obj.description,\n\t\t\tmetaDescription: obj.metaDescription,\n\t\t\tslug: obj.slug,\n\t\t\tcategories: obj.categories,\n\t\t\tmasterVariant: obj.masterVariant,\n\t\t\tvariants: obj.variants,\n\t\t\tproductType: product.productType,\n\t\t\thasStagedChanges: product.masterData.hasStagedChanges,\n\t\t\tpublished: product.masterData.published,\n\t\t}\n\t}\n\n\tgetFacets(\n\t\tparams: ProductProjectionSearchParams,\n\t\tproducts: ProductProjection[]\n\t): FacetResults {\n\t\tif (!params.facet) return {}\n\t\tconst result: FacetResults = {}\n\n\t\tconst regexp = new RegExp(/ counting products$/)\n\t\tfor (let facet of params.facet) {\n\t\t\tlet countProducts = false\n\t\t\tif (facet.endsWith(' counting products')) {\n\t\t\t\tfacet = facet.replace(regexp, '')\n\t\t\t\tcountProducts = true\n\t\t\t}\n\n\t\t\tconst expression = generateFacetFunc(facet)\n\n\t\t\t// Term Facet\n\t\t\tif (expression.type === 'TermExpression') {\n\t\t\t\tresult[facet] = this.termFacet(\n\t\t\t\t\texpression.source,\n\t\t\t\t\tproducts,\n\t\t\t\t\tcountProducts\n\t\t\t\t)\n\t\t\t}\n\n\t\t\t// Range Facet\n\t\t\tif (expression.type === 'RangeExpression') {\n\t\t\t\tresult[expression.source] = this.rangeFacet(\n\t\t\t\t\texpression.source,\n\t\t\t\t\texpression.children,\n\t\t\t\t\tproducts,\n\t\t\t\t\tcountProducts\n\t\t\t\t)\n\t\t\t}\n\n\t\t\t// FilteredFacet\n\t\t\tif (expression.type === 'FilterExpression') {\n\t\t\t\tresult[expression.source] = this.filterFacet(\n\t\t\t\t\texpression.source,\n\t\t\t\t\texpression.children,\n\t\t\t\t\tproducts,\n\t\t\t\t\tcountProducts\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\treturn result\n\t}\n\n\t/**\n\t * TODO: This implemention needs the following additional features:\n\t * - counting products\n\t * - correct dataType\n\t */\n\ttermFacet(\n\t\tfacet: string,\n\t\tproducts: ProductProjection[],\n\t\tcountProducts: boolean\n\t): TermFacetResult {\n\t\tconst result: Writable<TermFacetResult> = {\n\t\t\ttype: 'terms',\n\t\t\tdataType: 'text',\n\t\t\tmissing: 0,\n\t\t\ttotal: 0,\n\t\t\tother: 0,\n\t\t\tterms: [],\n\t\t}\n\t\tconst terms: Record<any, number> = {}\n\n\t\tif (facet.startsWith('variants.')) {\n\t\t\tproducts.forEach((p) => {\n\t\t\t\tconst variants = getVariants(p)\n\t\t\t\tvariants.forEach((v) => {\n\t\t\t\t\tresult.total++\n\n\t\t\t\t\tlet value = resolveVariantValue(v, facet)\n\t\t\t\t\tif (value === undefined) {\n\t\t\t\t\t\tresult.missing++\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (typeof value === 'number') {\n\t\t\t\t\t\t\tvalue = Number(value).toFixed(1)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tterms[value] = value in terms ? terms[value] + 1 : 1\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t} else {\n\t\t\tproducts.forEach((p) => {\n\t\t\t\tconst value = nestedLookup(p, facet)\n\t\t\t\tresult.total++\n\t\t\t\tif (value === undefined) {\n\t\t\t\t\tresult.missing++\n\t\t\t\t} else {\n\t\t\t\t\tterms[value] = value in terms ? terms[value] + 1 : 1\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t\tfor (const term in terms) {\n\t\t\tresult.terms.push({\n\t\t\t\tterm: term as any,\n\t\t\t\tcount: terms[term],\n\t\t\t})\n\t\t}\n\n\t\treturn result\n\t}\n\n\tfilterFacet(\n\t\tsource: string,\n\t\tfilters: FilterExpression[] | undefined,\n\t\tproducts: ProductProjection[],\n\t\tcountProducts: boolean\n\t): FilteredFacetResult {\n\t\tlet count = 0\n\t\tif (source.startsWith('variants.')) {\n\t\t\tfor (const p of products) {\n\t\t\t\tfor (const v of getVariants(p)) {\n\t\t\t\t\tconst val = resolveVariantValue(v, source)\n\t\t\t\t\tif (filters?.some((f) => f.match(val))) {\n\t\t\t\t\t\tcount++\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new Error('not supported')\n\t\t}\n\n\t\treturn {\n\t\t\ttype: 'filter',\n\t\t\tcount: count,\n\t\t}\n\t}\n\n\trangeFacet(\n\t\tsource: string,\n\t\tranges: RangeExpression[] | undefined,\n\t\tproducts: ProductProjection[],\n\t\tcountProducts: boolean\n\t): RangeFacetResult {\n\t\tconst counts =\n\t\t\tranges?.map((range) => {\n\t\t\t\tif (source.startsWith('variants.')) {\n\t\t\t\t\tconst values = []\n\t\t\t\t\tfor (const p of products) {\n\t\t\t\t\t\tfor (const v of getVariants(p)) {\n\t\t\t\t\t\t\tconst val = resolveVariantValue(v, source)\n\t\t\t\t\t\t\tif (val === undefined) {\n\t\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (range.match(val)) {\n\t\t\t\t\t\t\t\tvalues.push(val)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst numValues = values.length\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: 'double',\n\t\t\t\t\t\tfrom: range.start || 0,\n\t\t\t\t\t\tfromStr: range.start !== null ? Number(range.start).toFixed(1) : '',\n\t\t\t\t\t\tto: range.stop || 0,\n\t\t\t\t\t\ttoStr: range.stop !== null ? Number(range.stop).toFixed(1) : '',\n\t\t\t\t\t\tcount: numValues,\n\t\t\t\t\t\t// totalCount: 0,\n\t\t\t\t\t\ttotal: values.reduce((a, b) => a + b, 0),\n\t\t\t\t\t\tmin: numValues > 0 ? Math.min(...values) : 0,\n\t\t\t\t\t\tmax: numValues > 0 ? Math.max(...values) : 0,\n\t\t\t\t\t\tmean: numValues > 0 ? mean(values) : 0,\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('not supported')\n\t\t\t\t}\n\t\t\t}) || []\n\t\tconst data: RangeFacetResult = {\n\t\t\ttype: 'range',\n\t\t\t// @ts-ignore\n\t\t\tdataType: 'number',\n\t\t\tranges: counts,\n\t\t}\n\t\treturn data\n\t}\n}\n\nconst mean = (arr: number[]) => {\n\tlet total = 0\n\tfor (let i = 0; i < arr.length; i++) {\n\t\ttotal += arr[i]\n\t}\n\treturn total / arr.length\n}\n","import type {\n\tInvalidInputError,\n\tProductDraft,\n\tProductProjection,\n\tQueryParam,\n} from '@commercetools/platform-sdk'\nimport { CommercetoolsError } from '../exceptions.js'\nimport { parseQueryExpression } from '../lib/predicateParser.js'\nimport { ProductProjectionSearch } from '../product-projection-search.js'\nimport { type AbstractStorage } from '../storage/index.js'\nimport {\n\tAbstractResourceRepository,\n\tGetParams,\n\tRepositoryContext,\n} from './abstract.js'\n\nexport type ProductProjectionQueryParams = {\n\tstaged?: boolean\n\tpriceCurrency?: string\n\tpriceCountry?: string\n\tpriceCustomerGroup?: string\n\tpriceChannel?: string\n\tlocaleProjection?: string\n\tstoreProjection?: string\n\texpand?: string | string[]\n\tsort?: string | string[]\n\tlimit?: number\n\toffset?: number\n\twithTotal?: boolean\n\twhere?: string | string[]\n\t[key: string]: QueryParam\n}\n\nexport class ProductProjectionRepository extends AbstractResourceRepository<'product-projection'> {\n\tprotected _searchService: ProductProjectionSearch\n\n\tconstructor(storage: AbstractStorage) {\n\t\tsuper(storage)\n\t\tthis._searchService = new ProductProjectionSearch(storage)\n\t}\n\n\tgetTypeId() {\n\t\treturn 'product-projection' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: ProductDraft): ProductProjection {\n\t\tthrow new Error('No valid action')\n\t}\n\n\tget(\n\t\tcontext: RepositoryContext,\n\t\tid: string,\n\t\tparams: GetParams = {}\n\t): ProductProjection | null {\n\t\tconst resource = this._storage.get(\n\t\t\tcontext.projectKey,\n\t\t\t'product',\n\t\t\tid,\n\t\t\tparams\n\t\t)\n\t\tif (resource) {\n\t\t\treturn this._searchService.transform(resource, false)\n\t\t}\n\t\treturn null\n\t}\n\n\tquery(context: RepositoryContext, params: ProductProjectionQueryParams = {}) {\n\t\tlet resources = this._storage\n\t\t\t.all(context.projectKey, 'product')\n\t\t\t.map((r) => this._searchService.transform(r, params.staged ?? false))\n\t\t\t.filter((p) => {\n\t\t\t\tif (!params.staged ?? false) {\n\t\t\t\t\treturn p.published\n\t\t\t\t}\n\t\t\t\treturn true\n\t\t\t})\n\n\t\t// Apply predicates\n\t\tif (params.where) {\n\t\t\tconst variableMap: Record<string, QueryParam> = {}\n\t\t\tfor (const [k, v] of Object.entries(params)) {\n\t\t\t\tif (k.startsWith('var.')) {\n\t\t\t\t\tvariableMap[k.substring(4)] = v\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst filterFunc = parseQueryExpression(params.where)\n\t\t\t\tresources = resources.filter((resource) =>\n\t\t\t\t\tfilterFunc(resource, variableMap)\n\t\t\t\t)\n\t\t\t} catch (err) {\n\t\t\t\tthrow new CommercetoolsError<InvalidInputError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'InvalidInput',\n\t\t\t\t\t\tmessage: (err as any).message,\n\t\t\t\t\t},\n\t\t\t\t\t400\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\t// Expand the resources\n\t\tif (params.expand !== undefined) {\n\t\t\tresources = resources.map((resource) =>\n\t\t\t\tthis._storage.expand(context.projectKey, resource, params.expand)\n\t\t\t)\n\t\t}\n\n\t\t// Create a slice for the pagination. If we were working with large datasets\n\t\t// then we should have done this before transforming. But that isn't the\n\t\t// goal of this library. So lets keep it simple.\n\t\tconst totalResults = resources.length\n\t\tconst offset = params.offset || 0\n\t\tconst limit = params.limit || 20\n\t\tconst results = resources.slice(offset, offset + limit)\n\n\t\treturn {\n\t\t\tcount: totalResults,\n\t\t\ttotal: results.length,\n\t\t\toffset: offset,\n\t\t\tlimit: limit,\n\t\t\tresults: results,\n\t\t}\n\t}\n\n\tsearch(context: RepositoryContext, query: ProductProjectionQueryParams) {\n\t\treturn this._searchService.search(context.projectKey, query)\n\t}\n\n\tactions = {}\n}\n","import type {\n\tProductSelection,\n\tProductSelectionChangeNameAction,\n\tProductSelectionDraft,\n\tProductSelectionUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\n\nexport class ProductSelectionRepository extends AbstractResourceRepository<'product-selection'> {\n\tgetTypeId() {\n\t\treturn 'product-selection' as const\n\t}\n\n\tcreate(\n\t\tcontext: RepositoryContext,\n\t\tdraft: ProductSelectionDraft\n\t): ProductSelection {\n\t\tconst resource: ProductSelection = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tproductCount: 0,\n\t\t\tkey: draft.key,\n\t\t\tname: draft.name,\n\t\t\ttype: 'individual',\n\t\t\tmode: 'Individual',\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tProductSelectionUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<ProductSelection>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {\n\t\tchangeName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductSelection>,\n\t\t\t{ name }: ProductSelectionChangeNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\t}\n}\n","import type {\n\tAttributeDefinition,\n\tAttributeDefinitionDraft,\n\tAttributeType,\n\tProductType,\n\tProductTypeAddAttributeDefinitionAction,\n\tProductTypeChangeAttributeOrderByNameAction,\n\tProductTypeChangeLabelAction,\n\tProductTypeChangeLocalizedEnumValueLabelAction,\n\tProductTypeDraft,\n\tProductTypeRemoveAttributeDefinitionAction,\n\tProductTypeRemoveEnumValuesAction,\n\tProductTypeUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\n\nexport class ProductTypeRepository extends AbstractResourceRepository<'product-type'> {\n\tgetTypeId() {\n\t\treturn 'product-type' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: ProductTypeDraft): ProductType {\n\t\tconst resource: ProductType = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tkey: draft.key,\n\t\t\tname: draft.name,\n\t\t\tdescription: draft.description,\n\t\t\tattributes: (draft.attributes ?? []).map((a) =>\n\t\t\t\tthis.attributeDefinitionFromAttributeDefinitionDraft(context, a)\n\t\t\t),\n\t\t}\n\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tattributeDefinitionFromAttributeDefinitionDraft = (\n\t\t_context: RepositoryContext,\n\t\tdraft: AttributeDefinitionDraft\n\t): AttributeDefinition => ({\n\t\t...draft,\n\t\tattributeConstraint: draft.attributeConstraint ?? 'None',\n\t\tinputHint: draft.inputHint ?? 'SingleLine',\n\t\tinputTip:\n\t\t\tdraft.inputTip && Object.keys(draft.inputTip).length > 0\n\t\t\t\t? draft.inputTip\n\t\t\t\t: undefined,\n\t\tisSearchable: draft.isSearchable ?? true,\n\t})\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tProductTypeUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<ProductType>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {\n\t\tchangeLocalizedEnumValueLabel: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductType>,\n\t\t\t{\n\t\t\t\tattributeName,\n\t\t\t\tnewValue,\n\t\t\t}: ProductTypeChangeLocalizedEnumValueLabelAction\n\t\t) => {\n\t\t\tconst updateAttributeType = (type: Writable<AttributeType>) => {\n\t\t\t\tswitch (type.name) {\n\t\t\t\t\tcase 'lenum':\n\t\t\t\t\t\ttype.values.forEach((v) => {\n\t\t\t\t\t\t\tif (v.key === newValue.key) {\n\t\t\t\t\t\t\t\tv.label = newValue.label\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\treturn\n\t\t\t\t\tcase 'set':\n\t\t\t\t\t\tupdateAttributeType(type.elementType)\n\t\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tresource.attributes?.forEach((value) => {\n\t\t\t\tif (value.name === attributeName) {\n\t\t\t\t\tupdateAttributeType(value.type)\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\tchangeLabel: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductType>,\n\t\t\t{ attributeName, label }: ProductTypeChangeLabelAction\n\t\t) => {\n\t\t\tresource.attributes?.forEach((value) => {\n\t\t\t\tif (value.name === attributeName) {\n\t\t\t\t\tvalue.label = label\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\taddAttributeDefinition: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductType>,\n\t\t\t{ attribute }: ProductTypeAddAttributeDefinitionAction\n\t\t) => {\n\t\t\tresource.attributes?.push(\n\t\t\t\tthis.attributeDefinitionFromAttributeDefinitionDraft(context, attribute)\n\t\t\t)\n\t\t},\n\t\tchangeAttributeOrderByName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductType>,\n\t\t\t{ attributeNames }: ProductTypeChangeAttributeOrderByNameAction\n\t\t) => {\n\t\t\tconst attrs = new Map(\n\t\t\t\tresource.attributes?.map((item) => [item.name, item])\n\t\t\t)\n\t\t\tconst result: AttributeDefinition[] = []\n\t\t\tlet current = resource.attributes\n\n\t\t\tattributeNames.forEach((attrName) => {\n\t\t\t\tconst attr = attrs.get(attrName)\n\t\t\t\tif (attr === undefined) {\n\t\t\t\t\tthrow new Error('New attr')\n\t\t\t\t}\n\t\t\t\tresult.push(attr)\n\n\t\t\t\t// Remove from current items\n\t\t\t\tcurrent = current?.filter((f) => f.name !== attrName)\n\t\t\t})\n\n\t\t\tresource.attributes = result\n\t\t\t// Add attrs which were not specified in the order as last items. Not\n\t\t\t// sure if this follows commercetools\n\t\t\tif (current) {\n\t\t\t\tresource.attributes.push(...current)\n\t\t\t}\n\t\t},\n\t\tremoveAttributeDefinition: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductType>,\n\t\t\t{ name }: ProductTypeRemoveAttributeDefinitionAction\n\t\t) => {\n\t\t\tresource.attributes = resource.attributes?.filter((f) => f.name !== name)\n\t\t},\n\t\tremoveEnumValues: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductType>,\n\t\t\t{ attributeName, keys }: ProductTypeRemoveEnumValuesAction\n\t\t) => {\n\t\t\tresource.attributes?.forEach((attr) => {\n\t\t\t\tif (attr.name == attributeName) {\n\t\t\t\t\tif (attr.type.name == 'enum') {\n\t\t\t\t\t\tattr.type.values = attr.type.values.filter(\n\t\t\t\t\t\t\t(v) => !keys.includes(v.key)\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\n\t\t\t\t\tif (attr.type.name == 'set') {\n\t\t\t\t\t\tif (attr.type.elementType.name == 'enum') {\n\t\t\t\t\t\t\tattr.type.elementType.values =\n\t\t\t\t\t\t\t\tattr.type.elementType.values.filter(\n\t\t\t\t\t\t\t\t\t(v) => !keys.includes(v.key)\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t}\n}\n","import type {\n\tProject,\n\tProjectChangeCartsConfigurationAction,\n\tProjectChangeCountriesAction,\n\tProjectChangeCountryTaxRateFallbackEnabledAction,\n\tProjectChangeCurrenciesAction,\n\tProjectChangeLanguagesAction,\n\tProjectChangeMessagesConfigurationAction,\n\tProjectChangeNameAction,\n\tProjectChangeOrderSearchStatusAction,\n\tProjectChangeProductSearchIndexingEnabledAction,\n\tProjectSetExternalOAuthAction,\n\tProjectSetShippingRateInputTypeAction,\n\tProjectUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { maskSecretValue } from '../lib/masking.js'\nimport type { Writable } from '../types.js'\nimport { AbstractRepository, RepositoryContext } from './abstract.js'\n\nexport class ProjectRepository extends AbstractRepository<Project> {\n\tget(context: RepositoryContext): Project | null {\n\t\tconst resource = this._storage.getProject(context.projectKey)\n\t\treturn this.postProcessResource(resource)\n\t}\n\n\tpostProcessResource(resource: Project): Project {\n\t\tif (resource) {\n\t\t\treturn maskSecretValue(resource, 'externalOAuth.authorizationHeader')\n\t\t}\n\t\treturn resource\n\t}\n\n\tsaveNew(context: RepositoryContext, resource: Writable<Project>) {\n\t\tresource.version = 1\n\t\tthis._storage.saveProject(resource)\n\t}\n\n\tsaveUpdate(context: RepositoryContext, version: number, resource: Project) {\n\t\tthis._storage.saveProject(resource)\n\t}\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tProjectUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<Project>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {\n\t\tchangeName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Project>,\n\t\t\t{ name }: ProjectChangeNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\t\tchangeCurrencies: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Project>,\n\t\t\t{ currencies }: ProjectChangeCurrenciesAction\n\t\t) => {\n\t\t\tresource.currencies = currencies\n\t\t},\n\t\tchangeCountries: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Project>,\n\t\t\t{ countries }: ProjectChangeCountriesAction\n\t\t) => {\n\t\t\tresource.countries = countries\n\t\t},\n\t\tchangeLanguages: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Project>,\n\t\t\t{ languages }: ProjectChangeLanguagesAction\n\t\t) => {\n\t\t\tresource.languages = languages\n\t\t},\n\t\tchangeMessagesConfiguration: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Project>,\n\t\t\t{ messagesConfiguration }: ProjectChangeMessagesConfigurationAction\n\t\t) => {\n\t\t\tresource.messages.enabled = messagesConfiguration.enabled\n\t\t\tresource.messages.deleteDaysAfterCreation =\n\t\t\t\tmessagesConfiguration.deleteDaysAfterCreation\n\t\t},\n\t\tchangeProductSearchIndexingEnabled: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Project>,\n\t\t\t{ enabled }: ProjectChangeProductSearchIndexingEnabledAction\n\t\t) => {\n\t\t\tif (!resource.searchIndexing?.products) {\n\t\t\t\tthrow new Error('Invalid project state')\n\t\t\t}\n\t\t\tresource.searchIndexing.products.status = enabled\n\t\t\t\t? 'Activated'\n\t\t\t\t: 'Deactivated'\n\t\t\tresource.searchIndexing.products.lastModifiedAt = new Date().toISOString()\n\t\t},\n\t\tchangeOrderSearchStatus: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Project>,\n\t\t\t{ status }: ProjectChangeOrderSearchStatusAction\n\t\t) => {\n\t\t\tif (!resource.searchIndexing?.orders) {\n\t\t\t\tthrow new Error('Invalid project state')\n\t\t\t}\n\t\t\tresource.searchIndexing.orders.status = status\n\t\t\tresource.searchIndexing.orders.lastModifiedAt = new Date().toISOString()\n\t\t},\n\t\tsetShippingRateInputType: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Project>,\n\t\t\t{ shippingRateInputType }: ProjectSetShippingRateInputTypeAction\n\t\t) => {\n\t\t\tresource.shippingRateInputType = shippingRateInputType\n\t\t},\n\t\tsetExternalOAuth: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Project>,\n\t\t\t{ externalOAuth }: ProjectSetExternalOAuthAction\n\t\t) => {\n\t\t\tresource.externalOAuth = externalOAuth\n\t\t},\n\t\tchangeCountryTaxRateFallbackEnabled: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Project>,\n\t\t\t{\n\t\t\t\tcountryTaxRateFallbackEnabled,\n\t\t\t}: ProjectChangeCountryTaxRateFallbackEnabledAction\n\t\t) => {\n\t\t\tresource.carts.countryTaxRateFallbackEnabled =\n\t\t\t\tcountryTaxRateFallbackEnabled\n\t\t},\n\t\tchangeCartsConfiguration: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Project>,\n\t\t\t{ cartsConfiguration }: ProjectChangeCartsConfigurationAction\n\t\t) => {\n\t\t\tresource.carts = cartsConfiguration || {\n\t\t\t\tcountryTaxRateFallbackEnabled: false,\n\t\t\t\tdeleteDaysAfterLastModification: 90,\n\t\t\t}\n\t\t},\n\t}\n}\n","import type {\n\tQuote,\n\tQuoteDraft,\n\tQuoteUpdateAction,\n} from '@commercetools/platform-sdk'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\n\nexport class QuoteRepository extends AbstractResourceRepository<'quote'> {\n\tgetTypeId() {\n\t\treturn 'quote' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: QuoteDraft): Quote {\n\t\tthrow new Error('not implemented')\n\t}\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tQuoteUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<Quote>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {}\n}\n","import type {\n\tQuoteRequest,\n\tQuoteRequestDraft,\n\tQuoteRequestUpdateAction,\n} from '@commercetools/platform-sdk'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\n\nexport class QuoteRequestRepository extends AbstractResourceRepository<'quote-request'> {\n\tgetTypeId() {\n\t\treturn 'quote-request' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: QuoteRequestDraft): QuoteRequest {\n\t\tthrow new Error('not implemented')\n\t}\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tQuoteRequestUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<QuoteRequest>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {}\n}\n","import type {\n\tReview,\n\tReviewDraft,\n\tReviewUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\n\nexport class ReviewRepository extends AbstractResourceRepository<'review'> {\n\tgetTypeId() {\n\t\treturn 'review' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: ReviewDraft): Review {\n\t\tconst resource: Review = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tincludedInStatistics: false,\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tReviewUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<Review>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {}\n}\n","import type {\n\tShippingMethod,\n\tShippingMethodAddShippingRateAction,\n\tShippingMethodAddZoneAction,\n\tShippingMethodChangeIsDefaultAction,\n\tShippingMethodChangeNameAction,\n\tShippingMethodDraft,\n\tShippingMethodRemoveZoneAction,\n\tShippingMethodSetCustomFieldAction,\n\tShippingMethodSetCustomTypeAction,\n\tShippingMethodSetDescriptionAction,\n\tShippingMethodSetKeyAction,\n\tShippingMethodSetLocalizedDescriptionAction,\n\tShippingMethodSetLocalizedNameAction,\n\tShippingMethodSetPredicateAction,\n\tShippingMethodUpdateAction,\n\tShippingRate,\n\tShippingRateDraft,\n\tZoneRate,\n\tZoneRateDraft,\n\tZoneReference,\n} from '@commercetools/platform-sdk'\nimport deepEqual from 'deep-equal'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\nimport {\n\tcreateCustomFields,\n\tcreateTypedMoney,\n\tgetReferenceFromResourceIdentifier,\n} from './helpers.js'\n\nexport class ShippingMethodRepository extends AbstractResourceRepository<'shipping-method'> {\n\tgetTypeId() {\n\t\treturn 'shipping-method' as const\n\t}\n\n\tcreate(\n\t\tcontext: RepositoryContext,\n\t\tdraft: ShippingMethodDraft\n\t): ShippingMethod {\n\t\tconst resource: ShippingMethod = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\t...draft,\n\t\t\ttaxCategory: getReferenceFromResourceIdentifier(\n\t\t\t\tdraft.taxCategory,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t\tzoneRates: draft.zoneRates?.map((z) =>\n\t\t\t\tthis._transformZoneRateDraft(context, z)\n\t\t\t),\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tprivate _transformZoneRateDraft = (\n\t\tcontext: RepositoryContext,\n\t\tdraft: ZoneRateDraft\n\t): ZoneRate => ({\n\t\t...draft,\n\t\tzone: getReferenceFromResourceIdentifier<ZoneReference>(\n\t\t\tdraft.zone,\n\t\t\tcontext.projectKey,\n\t\t\tthis._storage\n\t\t),\n\t\tshippingRates: draft.shippingRates?.map(this._transformShippingRate),\n\t})\n\n\tprivate _transformShippingRate = (rate: ShippingRateDraft): ShippingRate => ({\n\t\tprice: createTypedMoney(rate.price),\n\t\tfreeAbove: rate.freeAbove && createTypedMoney(rate.freeAbove),\n\t\ttiers: rate.tiers || [],\n\t})\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tShippingMethodUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<ShippingMethod>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {\n\t\taddShippingRate: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<ShippingMethod>,\n\t\t\t{ shippingRate, zone }: ShippingMethodAddShippingRateAction\n\t\t) => {\n\t\t\tconst rate = this._transformShippingRate(shippingRate)\n\n\t\t\tresource.zoneRates.forEach((zoneRate) => {\n\t\t\t\tif (zoneRate.zone.id === zone.id) {\n\t\t\t\t\tzoneRate.shippingRates.push(rate)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t})\n\t\t\tresource.zoneRates.push({\n\t\t\t\tzone: {\n\t\t\t\t\ttypeId: 'zone',\n\t\t\t\t\tid: zone.id!,\n\t\t\t\t},\n\t\t\t\tshippingRates: [rate],\n\t\t\t})\n\t\t},\n\t\tremoveShippingRate: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<ShippingMethod>,\n\t\t\t{ shippingRate, zone }: ShippingMethodAddShippingRateAction\n\t\t) => {\n\t\t\tconst rate = this._transformShippingRate(shippingRate)\n\n\t\t\tresource.zoneRates.forEach((zoneRate) => {\n\t\t\t\tif (zoneRate.zone.id === zone.id) {\n\t\t\t\t\tzoneRate.shippingRates = zoneRate.shippingRates.filter(\n\t\t\t\t\t\t(otherRate) => !deepEqual(rate, otherRate)\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\taddZone: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ShippingMethod>,\n\t\t\t{ zone }: ShippingMethodAddZoneAction\n\t\t) => {\n\t\t\tconst zoneReference = getReferenceFromResourceIdentifier<ZoneReference>(\n\t\t\t\tzone,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t)\n\n\t\t\tif (resource.zoneRates === undefined) {\n\t\t\t\tresource.zoneRates = []\n\t\t\t}\n\n\t\t\tresource.zoneRates.push({\n\t\t\t\tzone: zoneReference,\n\t\t\t\tshippingRates: [],\n\t\t\t})\n\t\t},\n\t\tremoveZone: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<ShippingMethod>,\n\t\t\t{ zone }: ShippingMethodRemoveZoneAction\n\t\t) => {\n\t\t\tresource.zoneRates = resource.zoneRates.filter(\n\t\t\t\t(zoneRate) => zoneRate.zone.id !== zone.id\n\t\t\t)\n\t\t},\n\t\tsetKey: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<ShippingMethod>,\n\t\t\t{ key }: ShippingMethodSetKeyAction\n\t\t) => {\n\t\t\tresource.key = key\n\t\t},\n\t\tsetDescription: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<ShippingMethod>,\n\t\t\t{ description }: ShippingMethodSetDescriptionAction\n\t\t) => {\n\t\t\tresource.description = description\n\t\t},\n\t\tsetLocalizedDescription: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<ShippingMethod>,\n\t\t\t{ localizedDescription }: ShippingMethodSetLocalizedDescriptionAction\n\t\t) => {\n\t\t\tresource.localizedDescription = localizedDescription\n\t\t},\n\t\tsetLocalizedName: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<ShippingMethod>,\n\t\t\t{ localizedName }: ShippingMethodSetLocalizedNameAction\n\t\t) => {\n\t\t\tresource.localizedName = localizedName\n\t\t},\n\t\tsetPredicate: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<ShippingMethod>,\n\t\t\t{ predicate }: ShippingMethodSetPredicateAction\n\t\t) => {\n\t\t\tresource.predicate = predicate\n\t\t},\n\t\tchangeIsDefault: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<ShippingMethod>,\n\t\t\t{ isDefault }: ShippingMethodChangeIsDefaultAction\n\t\t) => {\n\t\t\tresource.isDefault = isDefault\n\t\t},\n\t\tchangeName: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<ShippingMethod>,\n\t\t\t{ name }: ShippingMethodChangeNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\t\tsetCustomType: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ShippingMethod>,\n\t\t\t{ type, fields }: ShippingMethodSetCustomTypeAction\n\t\t) => {\n\t\t\tif (type) {\n\t\t\t\tresource.custom = createCustomFields(\n\t\t\t\t\t{ type, fields },\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\tthis._storage\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tresource.custom = undefined\n\t\t\t}\n\t\t},\n\t\tsetCustomField: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ShippingMethod>,\n\t\t\t{ name, value }: ShippingMethodSetCustomFieldAction\n\t\t) => {\n\t\t\tif (!resource.custom) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (value === null) {\n\t\t\t\tdelete resource.custom.fields[name]\n\t\t\t} else {\n\t\t\t\tresource.custom.fields[name] = value\n\t\t\t}\n\t\t},\n\t}\n}\n","import type {\n\tCustomerReference,\n\tShoppingList,\n\tShoppingListDraft,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\nimport {\n\tcreateCustomFields,\n\tgetReferenceFromResourceIdentifier,\n\tgetStoreKeyReference,\n} from './helpers.js'\n\nexport class ShoppingListRepository extends AbstractResourceRepository<'shopping-list'> {\n\tgetTypeId() {\n\t\treturn 'shopping-list' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: ShoppingListDraft): ShoppingList {\n\t\t// const product =\n\n\t\tconst resource: ShoppingList = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\t...draft,\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t\ttextLineItems: [],\n\t\t\tlineItems:\n\t\t\t\tdraft.lineItems?.map((e) => ({\n\t\t\t\t\t...getBaseResourceProperties(),\n\t\t\t\t\t...e,\n\t\t\t\t\taddedAt: e.addedAt ?? '',\n\t\t\t\t\tproductId: e.productId ?? '',\n\t\t\t\t\tname: {},\n\t\t\t\t\tquantity: e.quantity ?? 1,\n\t\t\t\t\tproductType: { typeId: 'product-type', id: '' },\n\t\t\t\t\tcustom: createCustomFields(\n\t\t\t\t\t\te.custom,\n\t\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\t\tthis._storage\n\t\t\t\t\t),\n\t\t\t\t})) ?? [],\n\t\t\tcustomer: draft.customer\n\t\t\t\t? getReferenceFromResourceIdentifier<CustomerReference>(\n\t\t\t\t\t\tdraft.customer,\n\t\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\t\tthis._storage\n\t\t\t\t )\n\t\t\t\t: undefined,\n\t\t\tstore: draft.store\n\t\t\t\t? getStoreKeyReference(draft.store, context.projectKey, this._storage)\n\t\t\t\t: undefined,\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n}\n","import type {\n\tQuote,\n\tStagedQuote,\n\tStagedQuoteDraft,\n\tStagedQuoteUpdateAction,\n} from '@commercetools/platform-sdk'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\n\nexport class StagedQuoteRepository extends AbstractResourceRepository<'staged-quote'> {\n\tgetTypeId() {\n\t\treturn 'staged-quote' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: StagedQuoteDraft): StagedQuote {\n\t\tthrow new Error('not implemented')\n\t}\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tStagedQuoteUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<Quote>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {}\n}\n","import type {\n\tChannelReference,\n\tChannelResourceIdentifier,\n\tDiscountedPriceDraft,\n\tStandalonePrice,\n\tStandalonePriceChangeActiveAction,\n\tStandalonePriceChangeValueAction,\n\tStandalonePriceDraft,\n\tStandalonePriceSetDiscountedPriceAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\nimport { createTypedMoney } from './helpers.js'\n\nexport class StandAlonePriceRepository extends AbstractResourceRepository<'standalone-price'> {\n\tgetTypeId() {\n\t\treturn 'standalone-price' as const\n\t}\n\n\tcreate(\n\t\tcontext: RepositoryContext,\n\t\tdraft: StandalonePriceDraft\n\t): StandalonePrice {\n\t\tconst resource: StandalonePrice = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tactive: draft.active ? draft.active : false,\n\t\t\tsku: draft.sku,\n\t\t\tvalue: createTypedMoney(draft.value),\n\t\t\tcountry: draft.country,\n\t\t\tdiscounted: draft.discounted\n\t\t\t\t? this.transformDiscountDraft(draft.discounted)\n\t\t\t\t: undefined,\n\t\t\tchannel: draft.channel?.id\n\t\t\t\t? this.transformChannelReferenceDraft(draft.channel)\n\t\t\t\t: undefined,\n\t\t\tvalidFrom: draft.validFrom,\n\t\t\tvalidUntil: draft.validUntil,\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\ttransformChannelReferenceDraft(\n\t\tchannel: ChannelResourceIdentifier\n\t): ChannelReference {\n\t\treturn {\n\t\t\ttypeId: channel.typeId,\n\t\t\tid: channel.id as string,\n\t\t}\n\t}\n\n\ttransformDiscountDraft(discounted: DiscountedPriceDraft) {\n\t\treturn {\n\t\t\tvalue: createTypedMoney(discounted.value),\n\t\t\tdiscount: discounted.discount,\n\t\t}\n\t}\n\n\tactions = {\n\t\tsetActive: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<StandalonePrice>,\n\t\t\taction: StandalonePriceChangeActiveAction\n\t\t) => {\n\t\t\tresource.active = action.active\n\t\t},\n\t\tchangeValue: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<StandalonePrice>,\n\t\t\taction: StandalonePriceChangeValueAction\n\t\t) => {\n\t\t\tresource.value = createTypedMoney(action.value)\n\t\t},\n\t\tsetDiscountedPrice: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<StandalonePrice>,\n\t\t\taction: StandalonePriceSetDiscountedPriceAction\n\t\t) => {\n\t\t\tresource.discounted = action.discounted\n\t\t\t\t? this.transformDiscountDraft(action.discounted)\n\t\t\t\t: undefined\n\t\t},\n\t}\n}\n","import type {\n\tState,\n\tStateChangeInitialAction,\n\tStateChangeKeyAction,\n\tStateDraft,\n\tStateReference,\n\tStateSetDescriptionAction,\n\tStateSetNameAction,\n\tStateSetRolesAction,\n\tStateSetTransitionsAction,\n\tStateUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\nimport { getReferenceFromResourceIdentifier } from './helpers.js'\n\nexport class StateRepository extends AbstractResourceRepository<'state'> {\n\tgetTypeId() {\n\t\treturn 'state' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: StateDraft): State {\n\t\tconst resource: State = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\t...draft,\n\t\t\tbuiltIn: false,\n\t\t\tinitial: draft.initial || false,\n\t\t\ttransitions: (draft.transitions || []).map((t) =>\n\t\t\t\tgetReferenceFromResourceIdentifier(t, context.projectKey, this._storage)\n\t\t\t),\n\t\t}\n\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tStateUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<State>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {\n\t\tchangeKey: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<State>,\n\t\t\t{ key }: StateChangeKeyAction\n\t\t) => {\n\t\t\tresource.key = key\n\t\t},\n\t\tchangeInitial: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<State>,\n\t\t\t{ initial }: StateChangeInitialAction\n\t\t) => {\n\t\t\tresource.initial = initial\n\t\t},\n\t\tsetDescription: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<State>,\n\t\t\t{ description }: StateSetDescriptionAction\n\t\t) => {\n\t\t\tresource.description = description\n\t\t},\n\t\tsetName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<State>,\n\t\t\t{ name }: StateSetNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\t\tsetRoles: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<State>,\n\t\t\t{ roles }: StateSetRolesAction\n\t\t) => {\n\t\t\tresource.roles = roles\n\t\t},\n\t\tsetTransitions: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<State>,\n\t\t\t{ transitions }: StateSetTransitionsAction\n\t\t) => {\n\t\t\tresource.transitions = transitions?.map(\n\t\t\t\t(resourceId): StateReference => ({\n\t\t\t\t\tid: resourceId.id || '',\n\t\t\t\t\ttypeId: 'state',\n\t\t\t\t})\n\t\t\t)\n\t\t},\n\t}\n}\n","import type {\n\tChannelReference,\n\tChannelResourceIdentifier,\n\tStore,\n\tStoreDraft,\n\tStoreSetCountriesAction,\n\tStoreSetCustomFieldAction,\n\tStoreSetCustomTypeAction,\n\tStoreSetDistributionChannelsAction,\n\tStoreSetLanguagesAction,\n\tStoreSetNameAction,\n\tStoreUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\nimport {\n\tcreateCustomFields,\n\tgetReferenceFromResourceIdentifier,\n} from './helpers.js'\n\nexport class StoreRepository extends AbstractResourceRepository<'store'> {\n\tgetTypeId() {\n\t\treturn 'store' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: StoreDraft): Store {\n\t\tconst resource: Store = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tkey: draft.key,\n\t\t\tname: draft.name,\n\t\t\tlanguages: draft.languages ?? [],\n\t\t\tcountries: draft.countries ?? [],\n\t\t\tdistributionChannels: this.transformChannels(\n\t\t\t\tcontext,\n\t\t\t\tdraft.distributionChannels\n\t\t\t),\n\t\t\tsupplyChannels: this.transformChannels(context, draft.supplyChannels),\n\t\t\tproductSelections: [],\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tprivate transformChannels(\n\t\tcontext: RepositoryContext,\n\t\tchannels?: ChannelResourceIdentifier[]\n\t) {\n\t\tif (!channels) return []\n\n\t\treturn channels.map((ref) =>\n\t\t\tgetReferenceFromResourceIdentifier<ChannelReference>(\n\t\t\t\tref,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t)\n\t\t)\n\t}\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tStoreUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<Store>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {\n\t\tsetName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Store>,\n\t\t\t{ name }: StoreSetNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\t\tsetDistributionChannels: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Store>,\n\t\t\t{ distributionChannels }: StoreSetDistributionChannelsAction\n\t\t) => {\n\t\t\tresource.distributionChannels = this.transformChannels(\n\t\t\t\tcontext,\n\t\t\t\tdistributionChannels\n\t\t\t)\n\t\t},\n\t\tsetLanguages: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Store>,\n\t\t\t{ languages }: StoreSetLanguagesAction\n\t\t) => {\n\t\t\tresource.languages = languages ?? []\n\t\t},\n\t\tsetCustomType: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Store>,\n\t\t\t{ type, fields }: StoreSetCustomTypeAction\n\t\t) => {\n\t\t\tif (type) {\n\t\t\t\tresource.custom = createCustomFields(\n\t\t\t\t\t{ type, fields },\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\tthis._storage\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tresource.custom = undefined\n\t\t\t}\n\t\t},\n\t\tsetCustomField: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Store>,\n\t\t\t{ name, value }: StoreSetCustomFieldAction\n\t\t) => {\n\t\t\tif (!resource.custom) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (value === null) {\n\t\t\t\tdelete resource.custom.fields[name]\n\t\t\t} else {\n\t\t\t\tresource.custom.fields[name] = value\n\t\t\t}\n\t\t},\n\t\tsetCountries: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Store>,\n\t\t\t{ countries }: StoreSetCountriesAction\n\t\t) => {\n\t\t\tresource.countries = countries ?? []\n\t\t},\n\t}\n}\n","import type {\n\tInvalidInputError,\n\tSubscription,\n\tSubscriptionDraft,\n} from '@commercetools/platform-sdk'\nimport { CommercetoolsError } from '../exceptions.js'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\n\nexport class SubscriptionRepository extends AbstractResourceRepository<'subscription'> {\n\tgetTypeId() {\n\t\treturn 'subscription' as const\n\t}\n\tcreate(context: RepositoryContext, draft: SubscriptionDraft): Subscription {\n\t\t// TODO: We could actually test this here by using the aws sdk. For now\n\t\t// hardcode a failed check when account id is 0000000000\n\t\tif (draft.destination.type === 'SQS') {\n\t\t\tconst queueURL = new URL(draft.destination.queueUrl)\n\t\t\tconst accountId = queueURL.pathname.split('/')[1]\n\t\t\tif (accountId === '0000000000') {\n\t\t\t\tconst dest = draft.destination\n\t\t\t\tthrow new CommercetoolsError<InvalidInputError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'InvalidInput',\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t'A test message could not be delivered to this destination: ' +\n\t\t\t\t\t\t\t`SQS ${dest.queueUrl} in ${dest.region} for ${dest.accessKey}. ` +\n\t\t\t\t\t\t\t'Please make sure your destination is correctly configured.',\n\t\t\t\t\t},\n\t\t\t\t\t400\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\tconst resource: Subscription = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tchanges: draft.changes || [],\n\t\t\tdestination: draft.destination,\n\t\t\tformat: draft.format || {\n\t\t\t\ttype: 'Platform',\n\t\t\t},\n\t\t\tkey: draft.key,\n\t\t\tmessages: draft.messages || [],\n\t\t\tstatus: 'Healthy',\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n}\n","import type {\n\tTaxCategory,\n\tTaxCategoryAddTaxRateAction,\n\tTaxCategoryChangeNameAction,\n\tTaxCategoryDraft,\n\tTaxCategoryRemoveTaxRateAction,\n\tTaxCategoryReplaceTaxRateAction,\n\tTaxCategorySetDescriptionAction,\n\tTaxCategorySetKeyAction,\n\tTaxCategoryUpdateAction,\n\tTaxRate,\n\tTaxRateDraft,\n} from '@commercetools/platform-sdk'\nimport { v4 as uuidv4 } from 'uuid'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\n\nexport class TaxCategoryRepository extends AbstractResourceRepository<'tax-category'> {\n\tgetTypeId() {\n\t\treturn 'tax-category' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: TaxCategoryDraft): TaxCategory {\n\t\tconst resource: TaxCategory = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\t...draft,\n\t\t\trates: draft.rates?.map(this.taxRateFromTaxRateDraft) || [],\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tprivate taxRateFromTaxRateDraft = (draft: TaxRateDraft): TaxRate => ({\n\t\t...draft,\n\t\tid: uuidv4(),\n\t\tamount: draft.amount || 0,\n\t})\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tTaxCategoryUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<TaxCategory>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {\n\t\taddTaxRate: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<TaxCategory>,\n\t\t\t{ taxRate }: TaxCategoryAddTaxRateAction\n\t\t) => {\n\t\t\tif (resource.rates === undefined) {\n\t\t\t\tresource.rates = []\n\t\t\t}\n\t\t\tresource.rates.push(this.taxRateFromTaxRateDraft(taxRate))\n\t\t},\n\t\tremoveTaxRate: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<TaxCategory>,\n\t\t\t{ taxRateId }: TaxCategoryRemoveTaxRateAction\n\t\t) => {\n\t\t\tif (resource.rates === undefined) {\n\t\t\t\tresource.rates = []\n\t\t\t}\n\t\t\tresource.rates = resource.rates.filter(\n\t\t\t\t(taxRate) => taxRate.id !== taxRateId\n\t\t\t)\n\t\t},\n\t\treplaceTaxRate: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<TaxCategory>,\n\t\t\t{ taxRateId, taxRate }: TaxCategoryReplaceTaxRateAction\n\t\t) => {\n\t\t\tif (resource.rates === undefined) {\n\t\t\t\tresource.rates = []\n\t\t\t}\n\n\t\t\tconst taxRateObj = this.taxRateFromTaxRateDraft(taxRate)\n\t\t\tfor (let i = 0; i < resource.rates.length; i++) {\n\t\t\t\tconst rate = resource.rates[i]\n\t\t\t\tif (rate.id === taxRateId) {\n\t\t\t\t\tresource.rates[i] = taxRateObj\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tsetDescription: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<TaxCategory>,\n\t\t\t{ description }: TaxCategorySetDescriptionAction\n\t\t) => {\n\t\t\tresource.description = description\n\t\t},\n\t\tsetKey: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<TaxCategory>,\n\t\t\t{ key }: TaxCategorySetKeyAction\n\t\t) => {\n\t\t\tresource.key = key\n\t\t},\n\t\tchangeName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<TaxCategory>,\n\t\t\t{ name }: TaxCategoryChangeNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\t}\n}\n","import type {\n\tFieldDefinition,\n\tInvalidOperationError,\n\tType,\n\tTypeAddEnumValueAction,\n\tTypeAddFieldDefinitionAction,\n\tTypeChangeEnumValueLabelAction,\n\tTypeChangeFieldDefinitionOrderAction,\n\tTypeChangeNameAction,\n\tTypeDraft,\n\tTypeRemoveFieldDefinitionAction,\n\tTypeSetDescriptionAction,\n\tTypeUpdateAction,\n} from '@commercetools/platform-sdk'\nimport isEqual from 'lodash.isequal'\nimport { CommercetoolsError } from '../exceptions.js'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\n\nexport class TypeRepository extends AbstractResourceRepository<'type'> {\n\tgetTypeId() {\n\t\treturn 'type' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: TypeDraft): Type {\n\t\tconst resource: Type = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tkey: draft.key,\n\t\t\tname: draft.name,\n\t\t\tresourceTypeIds: draft.resourceTypeIds,\n\t\t\tfieldDefinitions: draft.fieldDefinitions || [],\n\t\t\tdescription: draft.description,\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\tactions: Partial<\n\t\tRecord<\n\t\t\tTypeUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<Type>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {\n\t\taddFieldDefinition: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Type>,\n\t\t\t{ fieldDefinition }: TypeAddFieldDefinitionAction\n\t\t) => {\n\t\t\tresource.fieldDefinitions.push(fieldDefinition)\n\t\t},\n\t\tremoveFieldDefinition: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Type>,\n\t\t\t{ fieldName }: TypeRemoveFieldDefinitionAction\n\t\t) => {\n\t\t\tresource.fieldDefinitions = resource.fieldDefinitions.filter(\n\t\t\t\t(f) => f.name !== fieldName\n\t\t\t)\n\t\t},\n\t\tsetDescription: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Type>,\n\t\t\t{ description }: TypeSetDescriptionAction\n\t\t) => {\n\t\t\tresource.description = description\n\t\t},\n\t\tchangeName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Type>,\n\t\t\t{ name }: TypeChangeNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\t\tchangeFieldDefinitionOrder: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Type>,\n\t\t\t{ fieldNames }: TypeChangeFieldDefinitionOrderAction\n\t\t) => {\n\t\t\tconst fields = new Map(\n\t\t\t\tresource.fieldDefinitions.map((item) => [item.name, item])\n\t\t\t)\n\t\t\tconst result: FieldDefinition[] = []\n\t\t\tlet current = resource.fieldDefinitions\n\n\t\t\tfieldNames.forEach((fieldName) => {\n\t\t\t\tconst field = fields.get(fieldName)\n\t\t\t\tif (field === undefined) {\n\t\t\t\t\tthrow new Error('New field')\n\t\t\t\t}\n\t\t\t\tresult.push(field)\n\n\t\t\t\t// Remove from current items\n\t\t\t\tcurrent = current.filter((f) => f.name !== fieldName)\n\t\t\t})\n\n\t\t\tif (\n\t\t\t\tisEqual(\n\t\t\t\t\tfieldNames,\n\t\t\t\t\tresource.fieldDefinitions.map((item) => item.name)\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tthrow new CommercetoolsError<InvalidOperationError>({\n\t\t\t\t\tcode: 'InvalidOperation',\n\t\t\t\t\tmessage: \"'fieldDefinitions' has no changes.\",\n\t\t\t\t\taction: {\n\t\t\t\t\t\taction: 'changeFieldDefinitionOrder',\n\t\t\t\t\t\tfieldNames: fieldNames,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tresource.fieldDefinitions = result\n\t\t\t// Add fields which were not specified in the order as last items. Not\n\t\t\t// sure if this follows commercetools\n\t\t\tresource.fieldDefinitions.push(...current)\n\t\t},\n\t\taddEnumValue: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Type>,\n\t\t\t{ fieldName, value }: TypeAddEnumValueAction\n\t\t) => {\n\t\t\tresource.fieldDefinitions.forEach((field) => {\n\t\t\t\tif (field.name === fieldName) {\n\t\t\t\t\t// TODO, should be done better i suppose\n\t\t\t\t\tif (field.type.name === 'Enum') {\n\t\t\t\t\t\tfield.type.values.push(value)\n\t\t\t\t\t} else if (\n\t\t\t\t\t\tfield.type.name === 'Set' &&\n\t\t\t\t\t\tfield.type.elementType.name === 'Enum'\n\t\t\t\t\t) {\n\t\t\t\t\t\tfield.type.elementType.values.push(value)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new Error('Type is not a Enum (or Set of Enum)')\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\tchangeEnumValueLabel: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Type>,\n\t\t\t{ fieldName, value }: TypeChangeEnumValueLabelAction\n\t\t) => {\n\t\t\tresource.fieldDefinitions.forEach((field) => {\n\t\t\t\tif (field.name === fieldName) {\n\t\t\t\t\t// TODO, should be done better i suppose\n\t\t\t\t\tif (field.type.name === 'Enum') {\n\t\t\t\t\t\tfield.type.values.forEach((v) => {\n\t\t\t\t\t\t\tif (v.key === value.key) {\n\t\t\t\t\t\t\t\tv.label = value.label\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t} else if (\n\t\t\t\t\t\tfield.type.name === 'Set' &&\n\t\t\t\t\t\tfield.type.elementType.name === 'Enum'\n\t\t\t\t\t) {\n\t\t\t\t\t\tfield.type.elementType.values.forEach((v) => {\n\t\t\t\t\t\t\tif (v.key === value.key) {\n\t\t\t\t\t\t\t\tv.label = value.label\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new Error('Type is not a Enum (or Set of Enum)')\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t}\n}\n","import type {\n\tZone,\n\tZoneAddLocationAction,\n\tZoneChangeNameAction,\n\tZoneDraft,\n\tZoneRemoveLocationAction,\n\tZoneSetDescriptionAction,\n\tZoneSetKeyAction,\n\tZoneUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\n\nexport class ZoneRepository extends AbstractResourceRepository<'zone'> {\n\tgetTypeId() {\n\t\treturn 'zone' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: ZoneDraft): Zone {\n\t\tconst resource: Zone = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tkey: draft.key,\n\t\t\tlocations: draft.locations || [],\n\t\t\tname: draft.name,\n\t\t\tdescription: draft.description,\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tZoneUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<Zone>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {\n\t\taddLocation: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Zone>,\n\t\t\t{ location }: ZoneAddLocationAction\n\t\t) => {\n\t\t\tresource.locations.push(location)\n\t\t},\n\t\tremoveLocation: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Zone>,\n\t\t\t{ location }: ZoneRemoveLocationAction\n\t\t) => {\n\t\t\tresource.locations = resource.locations.filter(\n\t\t\t\t(loc) =>\n\t\t\t\t\t!(loc.country === location.country && loc.state === location.state)\n\t\t\t)\n\t\t},\n\t\tchangeName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Zone>,\n\t\t\t{ name }: ZoneChangeNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\t\tsetDescription: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Zone>,\n\t\t\t{ description }: ZoneSetDescriptionAction\n\t\t) => {\n\t\t\tresource.description = description\n\t\t},\n\t\tsetKey: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Zone>,\n\t\t\t{ key }: ZoneSetKeyAction\n\t\t) => {\n\t\t\tresource.key = key\n\t\t},\n\t}\n}\n","import { AbstractStorage } from '../storage/index.js'\nimport { AssociateRoleRepository } from './associate-role.js'\nimport { AttributeGroupRepository } from './attribute-group.js'\nimport { BusinessUnitRepository } from './business-unit.js'\nimport { CartRepository } from './cart.js'\nimport { CartDiscountRepository } from './cart-discount.js'\nimport { CategoryRepository } from './category.js'\nimport { ChannelRepository } from './channel.js'\nimport { CustomObjectRepository } from './custom-object.js'\nimport { CustomerRepository } from './customer.js'\nimport { CustomerGroupRepository } from './customer-group.js'\nimport { DiscountCodeRepository } from './discount-code.js'\nimport { ExtensionRepository } from './extension.js'\nimport { InventoryEntryRepository } from './inventory-entry.js'\nimport { MyOrderRepository } from './my-order.js'\nimport { OrderRepository } from './order.js'\nimport { OrderEditRepository } from './order-edit.js'\nimport { PaymentRepository } from './payment.js'\nimport { ProductRepository } from './product.js'\nimport { ProductDiscountRepository } from './product-discount.js'\nimport { ProductProjectionRepository } from './product-projection.js'\nimport { ProductSelectionRepository } from './product-selection.js'\nimport { ProductTypeRepository } from './product-type.js'\nimport { ProjectRepository } from './project.js'\nimport { QuoteRepository } from './quote.js'\nimport { QuoteRequestRepository } from './quote-request.js'\nimport { ReviewRepository } from './review.js'\nimport { ShippingMethodRepository } from './shipping-method.js'\nimport { ShoppingListRepository } from './shopping-list.js'\nimport { StagedQuoteRepository } from './staged-quote.js'\nimport { StandAlonePriceRepository } from './standalone-price.js'\nimport { StateRepository } from './state.js'\nimport { StoreRepository } from './store.js'\nimport { SubscriptionRepository } from './subscription.js'\nimport { TaxCategoryRepository } from './tax-category.js'\nimport { TypeRepository } from './type.js'\nimport { ZoneRepository } from './zone.js'\n\nexport type RepositoryMap = ReturnType<typeof createRepositories>\n\nexport const createRepositories = (storage: AbstractStorage) => ({\n\t'associate-role': new AssociateRoleRepository(storage),\n\t'attribute-group': new AttributeGroupRepository(storage),\n\t'business-unit': new BusinessUnitRepository(storage),\n\tcategory: new CategoryRepository(storage),\n\tcart: new CartRepository(storage),\n\t'cart-discount': new CartDiscountRepository(storage),\n\tcustomer: new CustomerRepository(storage),\n\tchannel: new ChannelRepository(storage),\n\t'customer-group': new CustomerGroupRepository(storage),\n\t'discount-code': new DiscountCodeRepository(storage),\n\textension: new ExtensionRepository(storage),\n\t'inventory-entry': new InventoryEntryRepository(storage),\n\t'key-value-document': new CustomObjectRepository(storage),\n\torder: new OrderRepository(storage),\n\t'order-edit': new OrderEditRepository(storage),\n\tpayment: new PaymentRepository(storage),\n\t'my-cart': new CartRepository(storage),\n\t'my-order': new MyOrderRepository(storage),\n\t'my-customer': new CustomerRepository(storage),\n\t'my-payment': new PaymentRepository(storage),\n\tproduct: new ProductRepository(storage),\n\t'product-type': new ProductTypeRepository(storage),\n\t'product-discount': new ProductDiscountRepository(storage),\n\t'product-projection': new ProductProjectionRepository(storage),\n\t'product-selection': new ProductSelectionRepository(storage),\n\tproject: new ProjectRepository(storage),\n\treview: new ReviewRepository(storage),\n\tquote: new QuoteRepository(storage),\n\t'quote-request': new QuoteRequestRepository(storage),\n\t'shipping-method': new ShippingMethodRepository(storage),\n\t'shopping-list': new ShoppingListRepository(storage),\n\t'staged-quote': new StagedQuoteRepository(storage),\n\t'standalone-price': new StandAlonePriceRepository(storage),\n\tstate: new StateRepository(storage),\n\tstore: new StoreRepository(storage),\n\tsubscription: new SubscriptionRepository(storage),\n\t'tax-category': new TaxCategoryRepository(storage),\n\ttype: new TypeRepository(storage),\n\tzone: new ZoneRepository(storage),\n})\n","import type { Update } from '@commercetools/platform-sdk'\nimport { type Request, type Response, Router } from 'express'\nimport { ParsedQs } from 'qs'\nimport { AbstractResourceRepository } from '../repositories/abstract.js'\nimport { getRepositoryContext } from '../repositories/helpers.js'\nimport { queryParamsArray } from '../helpers.js'\n\nexport default abstract class AbstractService {\n\tprotected abstract getBasePath(): string\n\tpublic abstract repository: AbstractResourceRepository<any>\n\n\tcreateStatusCode = 201\n\n\tconstructor(parent: Router) {\n\t\tthis.registerRoutes(parent)\n\t}\n\n\textraRoutes(router: Router) {}\n\n\tregisterRoutes(parent: Router) {\n\t\tconst basePath = this.getBasePath()\n\t\tconst router = Router({ mergeParams: true })\n\n\t\t// Bind this first since the `/:id` routes are currently a bit to greedy\n\t\tthis.extraRoutes(router)\n\n\t\trouter.get('/', this.get.bind(this))\n\t\trouter.get('/key=:key', this.getWithKey.bind(this)) // same thing goes for the key routes\n\t\trouter.get('/:id', this.getWithId.bind(this))\n\n\t\trouter.delete('/key=:key', this.deleteWithKey.bind(this))\n\t\trouter.delete('/:id', this.deleteWithId.bind(this))\n\n\t\trouter.post('/', this.post.bind(this))\n\t\trouter.post('/key=:key', this.postWithKey.bind(this))\n\t\trouter.post('/:id', this.postWithId.bind(this))\n\n\t\tparent.use(`/${basePath}`, router)\n\t}\n\n\tget(request: Request, response: Response) {\n\t\tconst limit = this._parseParam(request.query.limit)\n\t\tconst offset = this._parseParam(request.query.offset)\n\n\t\tconst result = this.repository.query(getRepositoryContext(request), {\n\t\t\texpand: this._parseParam(request.query.expand),\n\t\t\twhere: this._parseParam(request.query.where),\n\t\t\tlimit: limit !== undefined ? Number(limit) : undefined,\n\t\t\toffset: offset !== undefined ? Number(offset) : undefined,\n\t\t})\n\t\treturn response.status(200).send(result)\n\t}\n\n\tgetWithId(request: Request, response: Response) {\n\t\tconst result = this._expandWithId(request, request.params['id'])\n\t\tif (!result) {\n\t\t\treturn response.status(404).send()\n\t\t}\n\t\treturn response.status(200).send(result)\n\t}\n\n\tgetWithKey(request: Request, response: Response) {\n\t\tconst result = this.repository.getByKey(\n\t\t\tgetRepositoryContext(request),\n\t\t\trequest.params['key'],\n\t\t\t{ expand: this._parseParam(request.query.expand) }\n\t\t)\n\t\tif (!result) return response.status(404).send()\n\t\treturn response.status(200).send(result)\n\t}\n\n\tdeleteWithId(request: Request, response: Response) {\n\t\tconst result = this.repository.delete(\n\t\t\tgetRepositoryContext(request),\n\t\t\trequest.params['id'],\n\t\t\t{\n\t\t\t\texpand: this._parseParam(request.query.expand),\n\t\t\t}\n\t\t)\n\t\tif (!result) {\n\t\t\treturn response.status(404).send('Not found')\n\t\t}\n\t\treturn response.status(200).send(result)\n\t}\n\n\tdeleteWithKey(request: Request, response: Response) {\n\t\tconst resource = this.repository.getByKey(\n\t\t\tgetRepositoryContext(request),\n\t\t\trequest.params['key']\n\t\t)\n\t\tif (!resource) {\n\t\t\treturn response.status(404).send('Not found')\n\t\t}\n\n\t\tconst result = this.repository.delete(\n\t\t\tgetRepositoryContext(request),\n\t\t\tresource.id,\n\t\t\t{\n\t\t\t\texpand: this._parseParam(request.query.expand),\n\t\t\t}\n\t\t)\n\t\tif (!result) {\n\t\t\treturn response.status(404).send('Not found')\n\t\t}\n\t\treturn response.status(200).send(result)\n\t}\n\n\tpost(request: Request, response: Response) {\n\t\tconst draft = request.body\n\t\tconst resource = this.repository.create(\n\t\t\tgetRepositoryContext(request),\n\t\t\tdraft\n\t\t)\n\t\tconst result = this._expandWithId(request, resource.id)\n\t\treturn response.status(this.createStatusCode).send(result)\n\t}\n\n\tpostWithId(request: Request, response: Response) {\n\t\tconst updateRequest: Update = request.body\n\t\tconst resource = this.repository.get(\n\t\t\tgetRepositoryContext(request),\n\t\t\trequest.params['id']\n\t\t)\n\t\tif (!resource) {\n\t\t\treturn response.status(404).send('Not found')\n\t\t}\n\n\t\tconst updatedResource = this.repository.processUpdateActions(\n\t\t\tgetRepositoryContext(request),\n\t\t\tresource,\n\t\t\tupdateRequest.version,\n\t\t\tupdateRequest.actions\n\t\t)\n\n\t\tconst result = this._expandWithId(request, updatedResource.id)\n\t\treturn response.status(200).send(result)\n\t}\n\n\tpostWithKey(request: Request, response: Response) {\n\t\tconst updateRequest: Update = request.body\n\t\tconst resource = this.repository.getByKey(\n\t\t\tgetRepositoryContext(request),\n\t\t\trequest.params['key']\n\t\t)\n\t\tif (!resource) {\n\t\t\treturn response.status(404).send('Not found')\n\t\t}\n\t\tconst updatedResource = this.repository.processUpdateActions(\n\t\t\tgetRepositoryContext(request),\n\t\t\tresource,\n\t\t\tupdateRequest.version,\n\t\t\tupdateRequest.actions\n\t\t)\n\n\t\tconst result = this._expandWithId(request, updatedResource.id)\n\t\treturn response.status(200).send(result)\n\t}\n\n\tprotected _expandWithId(request: Request, resourceId: string) {\n\t\tconst result = this.repository.get(\n\t\t\tgetRepositoryContext(request),\n\t\t\tresourceId,\n\t\t\t{\n\t\t\t\texpand: this._parseParam(request.query.expand),\n\t\t\t}\n\t\t)\n\t\treturn result\n\t}\n\n\t// No idea what i'm doing\n\tprotected _parseParam(\n\t\tvalue: string | ParsedQs | string[] | ParsedQs[] | undefined\n\t): string[] | undefined {\n\t\treturn queryParamsArray(value)\n\t}\n}\n","import { Router } from 'express'\nimport { AssociateRoleRepository } from '../repositories/associate-role.js'\nimport AbstractService from './abstract.js'\n\nexport class AssociateRoleServices extends AbstractService {\n\tpublic repository: AssociateRoleRepository\n\n\tconstructor(parent: Router, repository: AssociateRoleRepository) {\n\t\tsuper(parent)\n\n\t\tthis.repository = repository\n\t}\n\n\tprotected getBasePath(): string {\n\t\treturn 'associate-roles'\n\t}\n}\n","import { Router } from 'express'\nimport AbstractService from './abstract.js'\nimport { AttributeGroupRepository } from '../repositories/attribute-group.js'\n\nexport class AttributeGroupService extends AbstractService {\n\tpublic repository: AttributeGroupRepository\n\n\tconstructor(parent: Router, repository: AttributeGroupRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'attribute-groups'\n\t}\n}\n","import { Router } from 'express'\nimport { BusinessUnitRepository } from '../repositories/business-unit.js'\nimport AbstractService from './abstract.js'\n\nexport class BusinessUnitServices extends AbstractService {\n\tpublic repository: BusinessUnitRepository\n\n\tconstructor(parent: Router, repository: BusinessUnitRepository) {\n\t\tsuper(parent)\n\n\t\tthis.repository = repository\n\t}\n\n\tprotected getBasePath(): string {\n\t\treturn 'business-units'\n\t}\n}\n","import { Router } from 'express'\nimport { CartDiscountRepository } from '../repositories/cart-discount.js'\nimport AbstractService from './abstract.js'\n\nexport class CartDiscountService extends AbstractService {\n\tpublic repository: CartDiscountRepository\n\n\tconstructor(parent: Router, repository: CartDiscountRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'cart-discounts'\n\t}\n}\n","import type { Cart, CartDraft, Order } from '@commercetools/platform-sdk'\nimport type { Request, Response, Router } from 'express'\nimport type { CartRepository } from '../repositories/cart.js'\nimport { getRepositoryContext } from '../repositories/helpers.js'\nimport type { OrderRepository } from '../repositories/order.js'\nimport AbstractService from './abstract.js'\n\nexport class CartService extends AbstractService {\n\tpublic repository: CartRepository\n\tpublic orderRepository: OrderRepository\n\n\tconstructor(\n\t\tparent: Router,\n\t\tcartRepository: CartRepository,\n\t\torderRepository: OrderRepository\n\t) {\n\t\tsuper(parent)\n\t\tthis.repository = cartRepository\n\t\tthis.orderRepository = orderRepository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'carts'\n\t}\n\n\textraRoutes(parent: Router) {\n\t\tparent.post('/replicate', this.replicate.bind(this))\n\t}\n\n\treplicate(request: Request, response: Response) {\n\t\tconst context = getRepositoryContext(request)\n\n\t\t// @ts-ignore\n\t\tconst cartOrOrder: Cart | Order | null =\n\t\t\trequest.body.reference.typeId === 'order'\n\t\t\t\t? this.orderRepository.get(context, request.body.reference.id)\n\t\t\t\t: this.repository.get(context, request.body.reference.id)\n\n\t\tif (!cartOrOrder) {\n\t\t\treturn response.status(400).send()\n\t\t}\n\n\t\tconst cartDraft: CartDraft = {\n\t\t\t...cartOrOrder,\n\t\t\tcurrency: cartOrOrder.totalPrice.currencyCode,\n\t\t\tdiscountCodes: [],\n\t\t\tshipping: [], // TODO: cartOrOrder.shipping,\n\t\t\tlineItems: cartOrOrder.lineItems.map((lineItem) => ({\n\t\t\t\t...lineItem,\n\t\t\t\tvariantId: lineItem.variant.id,\n\t\t\t\tsku: lineItem.variant.sku,\n\t\t\t})),\n\t\t}\n\n\t\tconst newCart = this.repository.create(context, cartDraft)\n\n\t\treturn response.status(200).send(newCart)\n\t}\n}\n","import { Router } from 'express'\nimport { CategoryRepository } from '../repositories/category.js'\nimport AbstractService from './abstract.js'\n\nexport class CategoryServices extends AbstractService {\n\tpublic repository: CategoryRepository\n\n\tconstructor(parent: Router, repository: CategoryRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'categories'\n\t}\n}\n","import { Router } from 'express'\nimport { ChannelRepository } from '../repositories/channel.js'\nimport AbstractService from './abstract.js'\n\nexport class ChannelService extends AbstractService {\n\tpublic repository: ChannelRepository\n\n\tconstructor(parent: Router, repository: ChannelRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'channels'\n\t}\n}\n","import type { CustomObjectDraft } from '@commercetools/platform-sdk'\nimport type { Request, Response, Router } from 'express'\nimport type { CustomObjectRepository } from '../repositories/custom-object.js'\nimport { getRepositoryContext } from '../repositories/helpers.js'\nimport AbstractService from './abstract.js'\n\nexport class CustomObjectService extends AbstractService {\n\tpublic repository: CustomObjectRepository\n\n\tconstructor(parent: Router, repository: CustomObjectRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'custom-objects'\n\t}\n\n\textraRoutes(router: Router) {\n\t\trouter.get('/:container/:key', this.getWithContainerAndKey.bind(this))\n\t\trouter.post('/:container/:key', this.createWithContainerAndKey.bind(this))\n\t\trouter.delete('/:container/:key', this.deleteWithContainerAndKey.bind(this))\n\t}\n\n\tgetWithContainerAndKey(request: Request, response: Response) {\n\t\tconst result = this.repository.getWithContainerAndKey(\n\t\t\tgetRepositoryContext(request),\n\t\t\trequest.params.container,\n\t\t\trequest.params.key\n\t\t)\n\n\t\tif (!result) {\n\t\t\treturn response.status(404).send('Not Found')\n\t\t}\n\t\treturn response.status(200).send(result)\n\t}\n\n\tcreateWithContainerAndKey(request: Request, response: Response) {\n\t\tconst draft: CustomObjectDraft = {\n\t\t\t...request.body,\n\t\t\tkey: request.params.key,\n\t\t\tcontainer: request.params.container,\n\t\t}\n\n\t\tconst result = this.repository.create(getRepositoryContext(request), draft)\n\t\treturn response.status(200).send(result)\n\t}\n\n\tdeleteWithContainerAndKey(request: Request, response: Response) {\n\t\tconst current = this.repository.getWithContainerAndKey(\n\t\t\tgetRepositoryContext(request),\n\t\t\trequest.params.container,\n\t\t\trequest.params.key\n\t\t)\n\n\t\tif (!current) {\n\t\t\treturn response.status(404).send('Not Found')\n\t\t}\n\n\t\tconst result = this.repository.delete(\n\t\t\tgetRepositoryContext(request),\n\t\t\tcurrent.id\n\t\t)\n\n\t\treturn response.status(200).send(result)\n\t}\n}\n","import { Router } from 'express'\nimport { CustomerGroupRepository } from '../repositories/customer-group.js'\nimport AbstractService from './abstract.js'\n\nexport class CustomerGroupService extends AbstractService {\n\tpublic repository: CustomerGroupRepository\n\n\tconstructor(parent: Router, repository: CustomerGroupRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'customer-groups'\n\t}\n}\n","import { Router } from 'express'\nimport { v4 as uuidv4 } from 'uuid'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport { CustomerRepository } from '../repositories/customer.js'\nimport { getRepositoryContext } from '../repositories/helpers.js'\nimport AbstractService from './abstract.js'\n\nexport class CustomerService extends AbstractService {\n\tpublic repository: CustomerRepository\n\n\tconstructor(parent: Router, repository: CustomerRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'customers'\n\t}\n\n\textraRoutes(parent: Router) {\n\t\tparent.post('/password-token', (request, response) => {\n\t\t\tconst customer = this.repository.query(getRepositoryContext(request), {\n\t\t\t\twhere: [`email=\"${request.body.email}\"`],\n\t\t\t})\n\t\t\t// @ts-ignore\n\t\t\tconst ttlMinutes: number = request.params.ttlMinutes\n\t\t\t\t? // @ts-ignore\n\t\t\t\t +request.params.ttlMinutes\n\t\t\t\t: 34560\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\t\tconst { version, ...rest } = getBaseResourceProperties()\n\n\t\t\treturn response.status(200).send({\n\t\t\t\t...rest,\n\t\t\t\tcustomerId: customer.results[0].id,\n\t\t\t\texpiresAt: new Date(Date.now() + ttlMinutes * 60).toISOString(),\n\t\t\t\tvalue: uuidv4(),\n\t\t\t})\n\t\t})\n\t}\n}\n","import { Router } from 'express'\nimport { DiscountCodeRepository } from '../repositories/discount-code.js'\nimport AbstractService from './abstract.js'\n\nexport class DiscountCodeService extends AbstractService {\n\tpublic repository: DiscountCodeRepository\n\n\tconstructor(parent: Router, repository: DiscountCodeRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'discount-codes'\n\t}\n}\n","import { Router } from 'express'\nimport { ExtensionRepository } from '../repositories/extension.js'\nimport AbstractService from './abstract.js'\n\nexport class ExtensionServices extends AbstractService {\n\tpublic repository: ExtensionRepository\n\n\tconstructor(parent: Router, repository: ExtensionRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'extensions'\n\t}\n}\n","import { Router } from 'express'\nimport { InventoryEntryRepository } from '../repositories/inventory-entry.js'\nimport AbstractService from './abstract.js'\n\nexport class InventoryEntryService extends AbstractService {\n\tpublic repository: InventoryEntryRepository\n\n\tconstructor(parent: Router, repository: InventoryEntryRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'inventory'\n\t}\n}\n","import { Request, Response, Router } from 'express'\nimport { CartRepository } from '../repositories/cart.js'\nimport AbstractService from './abstract.js'\n\nexport class MyCartService extends AbstractService {\n\tpublic repository: CartRepository\n\n\tconstructor(parent: Router, repository: CartRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'me'\n\t}\n\n\tregisterRoutes(parent: Router) {\n\t\t// Overwrite this function to be able to handle /me/active-cart path.\n\t\tconst basePath = this.getBasePath()\n\t\tconst router = Router({ mergeParams: true })\n\n\t\tthis.extraRoutes(router)\n\n\t\trouter.get('/active-cart', this.activeCart.bind(this))\n\t\trouter.get('/carts/', this.get.bind(this))\n\t\trouter.get('/carts/:id', this.getWithId.bind(this))\n\n\t\trouter.delete('/carts/:id', this.deleteWithId.bind(this))\n\n\t\trouter.post('/carts/', this.post.bind(this))\n\t\trouter.post('/carts/:id', this.postWithId.bind(this))\n\n\t\tparent.use(`/${basePath}`, router)\n\t}\n\n\tactiveCart(request: Request, response: Response) {\n\t\tconst resource = this.repository.getActiveCart(request.params.projectKey)\n\t\tif (!resource) {\n\t\t\treturn response.status(404).send('Not found')\n\t\t}\n\t\treturn response.status(200).send(resource)\n\t}\n}\n","import { Request, Response, Router } from 'express'\nimport { CustomerRepository } from '../repositories/customer.js'\nimport { getRepositoryContext } from '../repositories/helpers.js'\nimport AbstractService from './abstract.js'\nimport { hashPassword } from '../lib/password.js'\n\nexport class MyCustomerService extends AbstractService {\n\tpublic repository: CustomerRepository\n\n\tconstructor(parent: Router, repository: CustomerRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'me'\n\t}\n\n\tregisterRoutes(parent: Router) {\n\t\t// Overwrite this function to be able to handle /me path.\n\t\tconst basePath = this.getBasePath()\n\t\tconst router = Router({ mergeParams: true })\n\n\t\tthis.extraRoutes(router)\n\n\t\trouter.get('', this.getMe.bind(this))\n\n\t\trouter.post('/signup', this.signUp.bind(this))\n\n\t\trouter.post('/login', this.signIn.bind(this))\n\n\t\tparent.use(`/${basePath}`, router)\n\t}\n\n\tgetMe(request: Request, response: Response) {\n\t\tconst resource = this.repository.getMe(getRepositoryContext(request))\n\t\tif (!resource) {\n\t\t\treturn response.status(404).send('Not found')\n\t\t}\n\t\treturn response.status(200).send(resource)\n\t}\n\n\tsignUp(request: Request, response: Response) {\n\t\tconst draft = request.body\n\t\tconst resource = this.repository.create(\n\t\t\tgetRepositoryContext(request),\n\t\t\tdraft\n\t\t)\n\t\tconst result = this._expandWithId(request, resource.id)\n\t\treturn response.status(this.createStatusCode).send({ customer: result })\n\t}\n\n\tsignIn(request: Request, response: Response) {\n\t\tconst { email, password } = request.body\n\t\tconst encodedPassword = hashPassword(password)\n\n\t\tconst result = this.repository.query(getRepositoryContext(request), {\n\t\t\twhere: [`email = \"${email}\"`, `password = \"${encodedPassword}\"`],\n\t\t})\n\n\t\tif (result.count === 0) {\n\t\t\treturn response.status(400).send({\n\t\t\t\tmessage: 'Account with the given credentials not found.',\n\t\t\t\terrors: [\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'InvalidCredentials',\n\t\t\t\t\t\tmessage: 'Account with the given credentials not found.',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t})\n\t\t}\n\n\t\treturn response.status(200).send({ customer: result.results[0] })\n\t}\n}\n","import { Router } from 'express'\nimport { MyOrderRepository } from '../repositories/my-order.js'\nimport AbstractService from './abstract.js'\n\nexport class MyOrderService extends AbstractService {\n\tpublic repository: MyOrderRepository\n\n\tconstructor(parent: Router, repository: MyOrderRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'me'\n\t}\n\n\tregisterRoutes(parent: Router) {\n\t\t// Overwrite this function to be able to handle /me/active-cart path.\n\t\tconst basePath = this.getBasePath()\n\t\tconst router = Router({ mergeParams: true })\n\n\t\tthis.extraRoutes(router)\n\n\t\trouter.get('/orders/', this.get.bind(this))\n\t\trouter.get('/orders/:id', this.getWithId.bind(this))\n\n\t\trouter.delete('/orders/:id', this.deleteWithId.bind(this))\n\n\t\trouter.post('/orders/', this.post.bind(this))\n\t\trouter.post('/orders/:id', this.postWithId.bind(this))\n\n\t\tparent.use(`/${basePath}`, router)\n\t}\n}\n","import { Router } from 'express'\nimport { PaymentRepository } from '../repositories/payment.js'\nimport AbstractService from './abstract.js'\n\nexport class MyPaymentService extends AbstractService {\n\tpublic repository: PaymentRepository\n\n\tconstructor(parent: Router, repository: PaymentRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'me/payments'\n\t}\n}\n","import { Request, Response, Router } from 'express'\nimport { getRepositoryContext } from '../repositories/helpers.js'\nimport { OrderRepository } from '../repositories/order.js'\nimport AbstractService from './abstract.js'\n\nexport class OrderService extends AbstractService {\n\tpublic repository: OrderRepository\n\n\tconstructor(parent: Router, repository: OrderRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'orders'\n\t}\n\n\textraRoutes(router: Router) {\n\t\trouter.post('/import', this.import.bind(this))\n\t\trouter.get('/order-number=:orderNumber', this.getWithOrderNumber.bind(this))\n\t}\n\n\timport(request: Request, response: Response) {\n\t\tconst importDraft = request.body\n\t\tconst resource = this.repository.import(\n\t\t\tgetRepositoryContext(request),\n\t\t\timportDraft\n\t\t)\n\t\treturn response.status(200).send(resource)\n\t}\n\n\tgetWithOrderNumber(request: Request, response: Response) {\n\t\tconst resource = this.repository.getWithOrderNumber(\n\t\t\tgetRepositoryContext(request),\n\t\t\trequest.params.orderNumber,\n\t\t\trequest.query\n\t\t)\n\t\tif (resource) {\n\t\t\treturn response.status(200).send(resource)\n\t\t}\n\t\treturn response.status(404).send('Not found')\n\t}\n}\n","import { Router } from 'express'\nimport { PaymentRepository } from '../repositories/payment.js'\nimport AbstractService from './abstract.js'\n\nexport class PaymentService extends AbstractService {\n\tpublic repository: PaymentRepository\n\n\tconstructor(parent: Router, repository: PaymentRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'payments'\n\t}\n}\n","import { Router } from 'express'\nimport { ProductDiscountRepository } from '../repositories/product-discount.js'\nimport AbstractService from './abstract.js'\n\nexport class ProductDiscountService extends AbstractService {\n\tpublic repository: ProductDiscountRepository\n\n\tconstructor(parent: Router, repository: ProductDiscountRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'product-discounts'\n\t}\n}\n","import { Request, Response, Router } from 'express'\nimport { getRepositoryContext } from '../repositories/helpers.js'\nimport {\n\tProductProjectionQueryParams,\n\tProductProjectionRepository,\n} from './../repositories/product-projection.js'\nimport AbstractService from './abstract.js'\nimport { queryParamsArray, queryParamsValue } from '../helpers.js'\n\nexport class ProductProjectionService extends AbstractService {\n\tpublic repository: ProductProjectionRepository\n\n\tconstructor(parent: Router, repository: ProductProjectionRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'product-projections'\n\t}\n\n\textraRoutes(router: Router) {\n\t\trouter.get('/search', this.search.bind(this))\n\t}\n\n\tget(request: Request, response: Response) {\n\t\tconst limit = this._parseParam(request.query.limit)\n\t\tconst offset = this._parseParam(request.query.offset)\n\n\t\tconst result = this.repository.query(getRepositoryContext(request), {\n\t\t\t...request.query,\n\t\t\texpand: this._parseParam(request.query.expand),\n\t\t\twhere: this._parseParam(request.query.where),\n\t\t\tlimit: limit !== undefined ? Number(limit) : undefined,\n\t\t\toffset: offset !== undefined ? Number(offset) : undefined,\n\t\t})\n\t\treturn response.status(200).send(result)\n\t}\n\n\tsearch(request: Request, response: Response) {\n\t\tconst query = request.query\n\t\tconst searchParams: ProductProjectionQueryParams = {\n\t\t\tfilter: queryParamsArray(query.filter),\n\t\t\t'filter.query': queryParamsArray(query['filter.query']),\n\t\t\tfacet: queryParamsArray(query.facet),\n\t\t\texpand: queryParamsArray(query.expand),\n\t\t\tstaged: queryParamsValue(query.staged) === 'true',\n\t\t\tlocaleProjection: queryParamsValue(query.localeProjection),\n\t\t\tstoreProjection: queryParamsValue(query.storeProjection),\n\t\t\tpriceChannel: queryParamsValue(query.priceChannel),\n\t\t\tpriceCountry: queryParamsValue(query.priceCountry),\n\t\t\tpriceCurrency: queryParamsValue(query.priceCurrency),\n\t\t\tpriceCustomerGroup: queryParamsValue(query.priceCustomerGroup),\n\t\t\toffset: query.offset ? Number(queryParamsValue(query.offset)) : undefined,\n\t\t\tlimit: query.limit ? Number(queryParamsValue(query.limit)) : undefined,\n\t\t}\n\t\tconst resource = this.repository.search(\n\t\t\tgetRepositoryContext(request),\n\t\t\tsearchParams\n\t\t)\n\t\treturn response.status(200).send(resource)\n\t}\n}\n","import { Router } from 'express'\nimport AbstractService from './abstract.js'\nimport { ProductSelectionRepository } from '../repositories/product-selection.js'\n\nexport class ProductSelectionService extends AbstractService {\n\tpublic repository: ProductSelectionRepository\n\n\tconstructor(parent: Router, repository: ProductSelectionRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'product-selections'\n\t}\n}\n","import { Router } from 'express'\nimport { ProductTypeRepository } from '../repositories/product-type.js'\nimport AbstractService from './abstract.js'\n\nexport class ProductTypeService extends AbstractService {\n\tpublic repository: ProductTypeRepository\n\n\tconstructor(parent: Router, repository: ProductTypeRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'product-types'\n\t}\n}\n","import { Router } from 'express'\nimport { ProductRepository } from '../repositories/product.js'\nimport AbstractService from './abstract.js'\n\nexport class ProductService extends AbstractService {\n\tpublic repository: ProductRepository\n\n\tconstructor(parent: Router, repository: ProductRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'products'\n\t}\n}\n","import { Router } from 'express'\nimport { ShippingMethodRepository } from '../repositories/shipping-method.js'\nimport AbstractService from './abstract.js'\n\nexport class ShippingMethodService extends AbstractService {\n\tpublic repository: ShippingMethodRepository\n\n\tconstructor(parent: Router, repository: ShippingMethodRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t\tthis.registerRoutes(parent)\n\t}\n\n\tgetBasePath() {\n\t\treturn 'shipping-methods'\n\t}\n\n\textraRoutes(parent: Router) {\n\t\tparent.get('/matching-cart', this.get.bind(this))\n\t}\n}\n","import { Router } from 'express'\nimport { ShoppingListRepository } from './../repositories/shopping-list.js'\nimport AbstractService from './abstract.js'\n\nexport class ShoppingListService extends AbstractService {\n\tpublic repository: ShoppingListRepository\n\n\tconstructor(parent: Router, repository: ShoppingListRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'shopping-lists'\n\t}\n}\n","import { Router } from 'express'\nimport { StandAlonePriceRepository } from '../repositories/standalone-price.js'\nimport AbstractService from './abstract.js'\n\nexport class StandAlonePriceService extends AbstractService {\n\tpublic repository: StandAlonePriceRepository\n\n\tconstructor(parent: Router, repository: StandAlonePriceRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'standalone-prices'\n\t}\n}\n","import { Router } from 'express'\nimport { StateRepository } from '../repositories/state.js'\nimport AbstractService from './abstract.js'\n\nexport class StateService extends AbstractService {\n\tpublic repository: StateRepository\n\n\tconstructor(parent: Router, repository: StateRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'states'\n\t}\n}\n","import { Router } from 'express'\nimport { StoreRepository } from '../repositories/store.js'\nimport AbstractService from './abstract.js'\n\nexport class StoreService extends AbstractService {\n\tpublic repository: StoreRepository\n\n\tconstructor(parent: Router, repository: StoreRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'stores'\n\t}\n}\n","import { Router } from 'express'\nimport { SubscriptionRepository } from '../repositories/subscription.js'\nimport AbstractService from './abstract.js'\n\nexport class SubscriptionService extends AbstractService {\n\tpublic repository: SubscriptionRepository\n\n\tconstructor(parent: Router, repository: SubscriptionRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'subscriptions'\n\t}\n}\n","import { Router } from 'express'\nimport { TaxCategoryRepository } from '../repositories/tax-category.js'\nimport AbstractService from './abstract.js'\n\nexport class TaxCategoryService extends AbstractService {\n\tpublic repository: TaxCategoryRepository\n\n\tconstructor(parent: Router, repository: TaxCategoryRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'tax-categories'\n\t}\n}\n","import { Router } from 'express'\nimport { TypeRepository } from '../repositories/type.js'\nimport AbstractService from './abstract.js'\n\nexport class TypeService extends AbstractService {\n\tpublic repository: TypeRepository\n\n\tconstructor(parent: Router, repository: TypeRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'types'\n\t}\n}\n","import { Router } from 'express'\nimport { ZoneRepository } from '../repositories/zone.js'\nimport AbstractService from './abstract.js'\n\nexport class ZoneService extends AbstractService {\n\tpublic repository: ZoneRepository\n\n\tconstructor(parent: Router, repository: ZoneRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'zones'\n\t}\n}\n","import { AssociateRoleServices } from './associate-roles.js'\nimport { AttributeGroupService } from './attribute-group.js'\nimport { BusinessUnitServices } from './business-units.js'\nimport { CartDiscountService } from './cart-discount.js'\nimport { CartService } from './cart.js'\nimport { CategoryServices } from './category.js'\nimport { ChannelService } from './channel.js'\nimport { CustomObjectService } from './custom-object.js'\nimport { CustomerGroupService } from './customer-group.js'\nimport { CustomerService } from './customer.js'\nimport { DiscountCodeService } from './discount-code.js'\nimport { ExtensionServices } from './extension.js'\nimport { InventoryEntryService } from './inventory-entry.js'\nimport { MyCartService } from './my-cart.js'\nimport { MyCustomerService } from './my-customer.js'\nimport { MyOrderService } from './my-order.js'\nimport { MyPaymentService } from './my-payment.js'\nimport { OrderService } from './order.js'\nimport { PaymentService } from './payment.js'\nimport { ProductDiscountService } from './product-discount.js'\nimport { ProductProjectionService } from './product-projection.js'\nimport { ProductSelectionService } from './product-selection.js'\nimport { ProductTypeService } from './product-type.js'\nimport { ProductService } from './product.js'\nimport { ShippingMethodService } from './shipping-method.js'\nimport { ShoppingListService } from './shopping-list.js'\nimport { StandAlonePriceService } from './standalone-price.js'\nimport { StateService } from './state.js'\nimport { StoreService } from './store.js'\nimport { SubscriptionService } from './subscription.js'\nimport { TaxCategoryService } from './tax-category.js'\nimport { TypeService } from './type.js'\nimport { ZoneService } from './zone.js'\n\nexport const createServices = (router: any, repos: any) => ({\n\t'associate-role': new AssociateRoleServices(router, repos['associate-role']),\n\t'business-unit': new BusinessUnitServices(router, repos['business-unit']),\n\tcategory: new CategoryServices(router, repos['category']),\n\tcart: new CartService(router, repos['cart'], repos['order']),\n\t'cart-discount': new CartDiscountService(router, repos['cart-discount']),\n\tcustomer: new CustomerService(router, repos['customer']),\n\tchannel: new ChannelService(router, repos['channel']),\n\t'customer-group': new CustomerGroupService(router, repos['customer-group']),\n\t'discount-code': new DiscountCodeService(router, repos['discount-code']),\n\textension: new ExtensionServices(router, repos['extension']),\n\t'inventory-entry': new InventoryEntryService(\n\t\trouter,\n\t\trepos['inventory-entry']\n\t),\n\t'key-value-document': new CustomObjectService(\n\t\trouter,\n\t\trepos['key-value-document']\n\t),\n\torder: new OrderService(router, repos['order']),\n\tpayment: new PaymentService(router, repos['payment']),\n\t'standalone-price': new StandAlonePriceService(\n\t\trouter,\n\t\trepos['standalone-price']\n\t),\n\t'my-cart': new MyCartService(router, repos['my-cart']),\n\t'my-order': new MyOrderService(router, repos['my-order']),\n\t'my-customer': new MyCustomerService(router, repos['my-customer']),\n\t'my-payment': new MyPaymentService(router, repos['my-payment']),\n\t'shipping-method': new ShippingMethodService(\n\t\trouter,\n\t\trepos['shipping-method']\n\t),\n\t'product-type': new ProductTypeService(router, repos['product-type']),\n\tproduct: new ProductService(router, repos['product']),\n\t'product-discount': new ProductDiscountService(\n\t\trouter,\n\t\trepos['product-discount']\n\t),\n\t'product-projection': new ProductProjectionService(\n\t\trouter,\n\t\trepos['product-projection']\n\t),\n\t'product-selection': new ProductSelectionService(\n\t\trouter,\n\t\trepos['product-selection']\n\t),\n\t'shopping-list': new ShoppingListService(router, repos['shopping-list']),\n\tstate: new StateService(router, repos['state']),\n\tstore: new StoreService(router, repos['store']),\n\tsubscription: new SubscriptionService(router, repos['subscription']),\n\t'tax-category': new TaxCategoryService(router, repos['tax-category']),\n\t'attribute-group': new AttributeGroupService(\n\t\trouter,\n\t\trepos['attribute-group']\n\t),\n\ttype: new TypeService(router, repos['type']),\n\tzone: new ZoneService(router, repos['zone']),\n})\n"],"mappings":"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","names":["express","e","uuidv4","uuidv4","a","uuidv4","uuidv4","uuidv4","uuidv4","assert","assert","assert","assert","uuidv4","uuidv4","uuidv4","deepEqual","existingAttr","priceToAdd","variant","deepEqual","uuidv4","generateMatchFunc","getLexer","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/haversine.ts","../vendor/perplex/lexer-state.ts","../vendor/perplex/token.ts","../vendor/perplex/token-types.ts","../vendor/perplex/lexer.ts","../vendor/pratt/index.ts","../src/lib/predicateParser.ts","../src/oauth/server.ts","../src/oauth/store.ts","../src/oauth/helpers.ts","../src/lib/password.ts","../src/projectAPI.ts","../src/lib/proxy.ts","../src/constants.ts","../src/repositories/helpers.ts","../src/services/project.ts","../src/repositories/abstract.ts","../src/repositories/errors.ts","../src/repositories/associate-role.ts","../src/repositories/attribute-group.ts","../src/repositories/business-unit.ts","../src/repositories/cart.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/associate-roles.ts","../src/services/attribute-group.ts","../src/services/business-units.ts","../src/services/cart-discount.ts","../src/services/cart.ts","../src/services/category.ts","../src/services/channel.ts","../src/services/custom-object.ts","../src/services/customer-group.ts","../src/services/customer.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-discount.ts","../src/services/product-projection.ts","../src/services/product-selection.ts","../src/services/product-type.ts","../src/services/product.ts","../src/services/shipping-method.ts","../src/services/shopping-list.ts","../src/services/standalone-price.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 express, { NextFunction, Request, Response } from 'express'\nimport morgan from 'morgan'\nimport inject from 'light-my-request'\nimport { setupServer, SetupServer } from 'msw/node'\nimport { http, HttpResponse } from 'msw'\nimport { AbstractStorage, InMemoryStorage } from './storage/index.js'\nimport { Services } from './types.js'\nimport { CommercetoolsError } from './exceptions.js'\nimport { OAuth2Server } from './oauth/server.js'\nimport { ProjectAPI } from './projectAPI.js'\nimport { copyHeaders } from './lib/proxy.js'\nimport { DEFAULT_API_HOSTNAME, DEFAULT_AUTH_HOSTNAME } from './constants.js'\n\n// Services\nimport { ProjectService } from './services/project.js'\nimport { createRepositories, RepositoryMap } from './repositories/index.js'\nimport { createServices } from './services/index.js'\nimport { ProjectRepository } from './repositories/project.js'\nimport { mapHeaderType } from './helpers.js'\n\nexport type CommercetoolsMockOptions = {\n\tvalidateCredentials: boolean\n\tenableAuthentication: boolean\n\tdefaultProjectKey: string | undefined\n\tapiHost: RegExp | string\n\tauthHost: RegExp | string\n\tsilent: boolean\n}\n\ntype AppOptions = { silent?: boolean }\n\nconst DEFAULT_OPTIONS: CommercetoolsMockOptions = {\n\tenableAuthentication: false,\n\tvalidateCredentials: false,\n\tdefaultProjectKey: undefined,\n\tapiHost: DEFAULT_API_HOSTNAME,\n\tauthHost: DEFAULT_AUTH_HOSTNAME,\n\tsilent: false,\n}\n\nconst _globalListeners: SetupServer[] = []\n\nexport class CommercetoolsMock {\n\tpublic app: express.Express\n\tpublic options: CommercetoolsMockOptions\n\n\tprivate _storage: AbstractStorage\n\tprivate _oauth2: OAuth2Server\n\tprivate _mswServer: SetupServer | undefined = undefined\n\tprivate _services: Services | null\n\tprivate _repositories: RepositoryMap | null\n\tprivate _projectService?: ProjectService\n\n\tconstructor(options: Partial<CommercetoolsMockOptions> = {}) {\n\t\tthis.options = { ...DEFAULT_OPTIONS, ...options }\n\t\tthis._services = null\n\t\tthis._repositories = null\n\t\tthis._projectService = undefined\n\n\t\tthis._storage = new InMemoryStorage()\n\t\tthis._oauth2 = new OAuth2Server({\n\t\t\tenabled: this.options.enableAuthentication,\n\t\t\tvalidate: this.options.validateCredentials,\n\t\t})\n\n\t\tthis.app = this.createApp({ silent: this.options.silent })\n\t}\n\n\tstart() {\n\t\t// Order is important here when the hostnames match\n\t\tthis.clear()\n\t\tthis.startServer()\n\t}\n\n\tstop() {\n\t\tthis._mswServer?.close()\n\t\tthis._mswServer = undefined\n\t}\n\n\tclear() {\n\t\tthis._mswServer?.resetHandlers()\n\t\tthis._storage.clear()\n\t}\n\n\tproject(projectKey?: string) {\n\t\tif (!projectKey && !this.options.defaultProjectKey) {\n\t\t\tthrow new Error('No projectKey passed and no default set')\n\t\t}\n\n\t\tif (this._repositories === null) {\n\t\t\tthrow new Error('repositories not initialized yet')\n\t\t}\n\n\t\treturn new ProjectAPI(\n\t\t\tprojectKey || this.options.defaultProjectKey!,\n\t\t\tthis._repositories,\n\t\t\tthis._storage\n\t\t)\n\t}\n\n\trunServer(port = 3000, options?: AppOptions) {\n\t\tconst server = this.app.listen(port, () => {\n\t\t\tconsole.info(`Mock server listening at http://localhost:${port}`)\n\t\t})\n\t\tserver.keepAliveTimeout = 60 * 1000\n\t}\n\n\tprivate createApp(options?: AppOptions): express.Express {\n\t\tthis._repositories = createRepositories(this._storage)\n\t\tthis._oauth2.setCustomerRepository(this._repositories.customer)\n\n\t\tconst app = express()\n\n\t\tconst projectRouter = express.Router({ mergeParams: true })\n\t\tprojectRouter.use(express.json())\n\n\t\tif (!options?.silent) {\n\t\t\tapp.use(morgan('tiny'))\n\t\t}\n\t\tapp.use('/oauth', this._oauth2.createRouter())\n\n\t\t// Only enable auth middleware if we have enabled this\n\t\tif (this.options.enableAuthentication) {\n\t\t\tapp.use('/:projectKey', this._oauth2.createMiddleware(), projectRouter)\n\t\t\tapp.use(\n\t\t\t\t'/:projectKey/in-store/key=:storeKey',\n\t\t\t\tthis._oauth2.createMiddleware(),\n\t\t\t\tprojectRouter\n\t\t\t)\n\t\t} else {\n\t\t\tapp.use('/:projectKey', projectRouter)\n\t\t\tapp.use('/:projectKey/in-store/key=:storeKey', projectRouter)\n\t\t}\n\n\t\t// Register the rest api services in the router\n\t\tthis._services = createServices(projectRouter, this._repositories)\n\t\tthis._projectService = new ProjectService(\n\t\t\tprojectRouter,\n\t\t\tthis._repositories.project as ProjectRepository\n\t\t)\n\n\t\tapp.use((err: Error, req: Request, resp: Response, next: NextFunction) => {\n\t\t\tif (err instanceof CommercetoolsError) {\n\t\t\t\tif (err.errors?.length > 0) {\n\t\t\t\t\treturn resp.status(err.statusCode).send({\n\t\t\t\t\t\tstatusCode: err.statusCode,\n\t\t\t\t\t\tmessage: err.message,\n\t\t\t\t\t\terrors: err.errors,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\treturn resp.status(err.statusCode).send({\n\t\t\t\t\tstatusCode: err.statusCode,\n\t\t\t\t\tmessage: err.message,\n\t\t\t\t\terrors: [err.info],\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tconsole.error(err)\n\t\t\t\treturn resp.status(500).send({\n\t\t\t\t\terror: err.message,\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\n\t\treturn app\n\t}\n\n\tprivate startServer() {\n\t\t// Check if there are any other servers running\n\t\tif (_globalListeners.length > 0) {\n\t\t\tif (this._mswServer !== undefined) {\n\t\t\t\tthrow new Error('Server already started')\n\t\t\t} else {\n\t\t\t\tconsole.warn(\"Server wasn't stopped properly, clearing\")\n\t\t\t\t_globalListeners.forEach((listener) => listener.close())\n\t\t\t}\n\t\t}\n\n\t\tconst server = this.app\n\t\tthis._mswServer = setupServer(\n\t\t\thttp.post(`${this.options.authHost}/oauth/*`, async ({ request }) => {\n\t\t\t\tconst body = await request.text()\n\t\t\t\tconst url = new URL(request.url)\n\t\t\t\tconst headers = copyHeaders(request.headers)\n\n\t\t\t\tconst res = await inject(server)\n\t\t\t\t\t.post(url.pathname + '?' + url.searchParams.toString())\n\t\t\t\t\t.body(body)\n\t\t\t\t\t.headers(headers)\n\t\t\t\t\t.end()\n\t\t\t\treturn new HttpResponse(res.body, {\n\t\t\t\t\tstatus: res.statusCode,\n\t\t\t\t\theaders: mapHeaderType(res.headers),\n\t\t\t\t})\n\t\t\t}),\n\t\t\thttp.head(`${this.options.apiHost}/*`, async ({ request }) => {\n\t\t\t\tconst body = await request.text()\n\t\t\t\tconst url = new URL(request.url)\n\t\t\t\tconst headers = copyHeaders(request.headers)\n\n\t\t\t\tconst res = await inject(server)\n\t\t\t\t\t.get(url.pathname + '?' + url.searchParams.toString())\n\t\t\t\t\t.body(body)\n\t\t\t\t\t.headers(headers)\n\t\t\t\t\t.end()\n\n\t\t\t\tif (res.statusCode === 200) {\n\t\t\t\t\tconst parsedBody = JSON.parse(res.body)\n\t\t\t\t\t// Check if we have a count property (e.g. for query-lookups)\n\t\t\t\t\t// or if we have a result object (e.g. for single lookups)\n\t\t\t\t\tconst resultCount =\n\t\t\t\t\t\t'count' in parsedBody\n\t\t\t\t\t\t\t? parsedBody.count\n\t\t\t\t\t\t\t: Object.keys(parsedBody).length\n\n\t\t\t\t\treturn new HttpResponse(null, {\n\t\t\t\t\t\tstatus: resultCount > 0 ? 200 : 404,\n\t\t\t\t\t\theaders: mapHeaderType(res.headers),\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\treturn new HttpResponse(null, {\n\t\t\t\t\tstatus: res.statusCode,\n\t\t\t\t\theaders: mapHeaderType(res.headers),\n\t\t\t\t})\n\t\t\t}),\n\t\t\thttp.get(`${this.options.apiHost}/*`, async ({ request }) => {\n\t\t\t\tconst body = await request.text()\n\t\t\t\tconst url = new URL(request.url)\n\t\t\t\tconst headers = copyHeaders(request.headers)\n\n\t\t\t\tconst res = await inject(server)\n\t\t\t\t\t.get(url.pathname + '?' + url.searchParams.toString())\n\t\t\t\t\t.body(body)\n\t\t\t\t\t.headers(headers)\n\t\t\t\t\t.end()\n\t\t\t\treturn new HttpResponse(res.body, {\n\t\t\t\t\tstatus: res.statusCode,\n\t\t\t\t\theaders: mapHeaderType(res.headers),\n\t\t\t\t})\n\t\t\t}),\n\t\t\thttp.post(`${this.options.apiHost}/*`, async ({ request }) => {\n\t\t\t\tconst body = await request.text()\n\t\t\t\tconst url = new URL(request.url)\n\t\t\t\tconst headers = copyHeaders(request.headers)\n\n\t\t\t\tconst res = await inject(server)\n\t\t\t\t\t.post(url.pathname + '?' + url.searchParams.toString())\n\t\t\t\t\t.body(body)\n\t\t\t\t\t.headers(headers)\n\t\t\t\t\t.end()\n\t\t\t\treturn new HttpResponse(res.body, {\n\t\t\t\t\tstatus: res.statusCode,\n\t\t\t\t\theaders: mapHeaderType(res.headers),\n\t\t\t\t})\n\t\t\t}),\n\t\t\thttp.delete(`${this.options.apiHost}/*`, async ({ request }) => {\n\t\t\t\tconst body = await request.text()\n\t\t\t\tconst url = new URL(request.url)\n\t\t\t\tconst headers = copyHeaders(request.headers)\n\n\t\t\t\tconst res = await inject(server)\n\t\t\t\t\t.delete(url.pathname + '?' + url.searchParams.toString())\n\t\t\t\t\t.body(body)\n\t\t\t\t\t.headers(headers)\n\t\t\t\t\t.end()\n\t\t\t\treturn new HttpResponse(res.body, {\n\t\t\t\t\tstatus: res.statusCode,\n\t\t\t\t\theaders: mapHeaderType(res.headers),\n\t\t\t\t})\n\t\t\t})\n\t\t)\n\t\tthis._mswServer.listen({\n\t\t\t// We need to allow requests done by supertest\n\t\t\tonUnhandledRequest: (request, print) => {\n\t\t\t\tconst url = new URL(request.url)\n\t\t\t\tif (url.hostname === '127.0.0.1') {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tprint.error()\n\t\t\t},\n\t\t})\n\n\t\t_globalListeners.push(this._mswServer)\n\t}\n}\n","import type {\n\tBaseResource,\n\tProject,\n\tQueryParam,\n\tResourceIdentifier,\n} from '@commercetools/platform-sdk'\nimport { PagedQueryResponseMap, ResourceMap, ResourceType } from '../types.js'\n\nexport type GetParams = {\n\texpand?: string[]\n}\n\nexport type QueryParams = {\n\texpand?: string | string[]\n\tsort?: string | string[]\n\tlimit?: number\n\toffset?: number\n\twithTotal?: boolean\n\twhere?: string | string[]\n\t[key: string]: QueryParam\n}\n\nexport abstract class AbstractStorage {\n\tabstract clear(): void\n\n\tabstract all<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT\n\t): Array<ResourceMap[RT]>\n\n\tabstract add<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT,\n\t\tobj: ResourceMap[RT]\n\t): void\n\n\tabstract get<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT,\n\t\tid: string,\n\t\tparams?: GetParams\n\t): ResourceMap[RT] | null\n\n\tabstract getByKey<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT,\n\t\tkey: string,\n\t\tparams: GetParams\n\t): ResourceMap[RT] | null\n\n\tabstract addProject(projectKey: string): Project\n\tabstract getProject(projectKey: string): Project\n\tabstract saveProject(project: Project): Project\n\n\tabstract delete<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT,\n\t\tid: string,\n\t\tparams: GetParams\n\t): ResourceMap[RT] | null\n\n\tabstract query<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT,\n\t\tparams: QueryParams\n\t): PagedQueryResponseMap[RT]\n\n\tabstract getByResourceIdentifier<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\tidentifier: ResourceIdentifier\n\t): ResourceMap[RT] | null\n\n\tabstract expand<T>(\n\t\tprojectKey: string,\n\t\tobj: T,\n\t\tclause: undefined | string | string[]\n\t): T\n}\n\nexport type ProjectStorage = {\n\t[index in ResourceType]: Map<string, BaseResource>\n}\n","import type {\n\tAssociateRole,\n\tAttributeGroup,\n\tBusinessUnit,\n\tCart,\n\tCartDiscount,\n\tCategory,\n\tChannel,\n\tCustomer,\n\tCustomerGroup,\n\tCustomObject,\n\tDiscountCode,\n\tExtension,\n\tInvalidInputError,\n\tInventoryEntry,\n\tOrder,\n\tPagedQueryResponse,\n\tPayment,\n\tProduct,\n\tProductDiscount,\n\tProductProjection,\n\tProductType,\n\tProject,\n\tQuote,\n\tQuoteRequest,\n\tReference,\n\tResourceIdentifier,\n\tShippingMethod,\n\tShoppingList,\n\tStagedQuote,\n\tState,\n\tStore,\n\tSubscription,\n\tTaxCategory,\n\tType,\n\tZone,\n} from '@commercetools/platform-sdk'\nimport assert from 'assert'\nimport { CommercetoolsError } from '../exceptions.js'\nimport { cloneObject } from '../helpers.js'\nimport { parseExpandClause } from '../lib/expandParser.js'\nimport { parseQueryExpression } from '../lib/predicateParser.js'\nimport {\n\tPagedQueryResponseMap,\n\tResourceMap,\n\tResourceType,\n\tWritable,\n} from '../types.js'\nimport {\n\tAbstractStorage,\n\tGetParams,\n\tProjectStorage,\n\tQueryParams,\n} from './abstract.js'\n\nexport class InMemoryStorage extends AbstractStorage {\n\tprotected resources: {\n\t\t[projectKey: string]: ProjectStorage\n\t} = {}\n\n\tprotected projects: {\n\t\t[projectKey: string]: Project\n\t} = {}\n\n\tprivate forProjectKey(projectKey: string): ProjectStorage {\n\t\tthis.addProject(projectKey)\n\n\t\tlet projectStorage = this.resources[projectKey]\n\t\tif (!projectStorage) {\n\t\t\tprojectStorage = this.resources[projectKey] = {\n\t\t\t\t'associate-role': new Map<string, AssociateRole>(),\n\t\t\t\t'attribute-group': new Map<string, AttributeGroup>(),\n\t\t\t\t'business-unit': new Map<string, BusinessUnit>(),\n\t\t\t\tcart: new Map<string, Cart>(),\n\t\t\t\t'cart-discount': new Map<string, CartDiscount>(),\n\t\t\t\tcategory: new Map<string, Category>(),\n\t\t\t\tchannel: new Map<string, Channel>(),\n\t\t\t\tcustomer: new Map<string, Customer>(),\n\t\t\t\t'customer-group': new Map<string, CustomerGroup>(),\n\t\t\t\t'discount-code': new Map<string, DiscountCode>(),\n\t\t\t\textension: new Map<string, Extension>(),\n\t\t\t\t'inventory-entry': new Map<string, InventoryEntry>(),\n\t\t\t\t'key-value-document': new Map<string, CustomObject>(),\n\t\t\t\torder: new Map<string, Order>(),\n\t\t\t\t'order-edit': new Map<string, any>(),\n\t\t\t\tpayment: new Map<string, Payment>(),\n\t\t\t\tproduct: new Map<string, Product>(),\n\t\t\t\tquote: new Map<string, Quote>(),\n\t\t\t\t'quote-request': new Map<string, QuoteRequest>(),\n\t\t\t\t'product-discount': new Map<string, ProductDiscount>(),\n\t\t\t\t'product-selection': new Map<string, any>(),\n\t\t\t\t'product-type': new Map<string, ProductType>(),\n\t\t\t\t'product-projection': new Map<string, ProductProjection>(),\n\t\t\t\treview: new Map<string, any>(),\n\t\t\t\t'shipping-method': new Map<string, ShippingMethod>(),\n\t\t\t\t'staged-quote': new Map<string, StagedQuote>(),\n\t\t\t\tstate: new Map<string, State>(),\n\t\t\t\tstore: new Map<string, Store>(),\n\t\t\t\t'shopping-list': new Map<string, ShoppingList>(),\n\t\t\t\t'standalone-price': new Map<string, any>(),\n\t\t\t\tsubscription: new Map<string, Subscription>(),\n\t\t\t\t'tax-category': new Map<string, TaxCategory>(),\n\t\t\t\ttype: new Map<string, Type>(),\n\t\t\t\tzone: new Map<string, Zone>(),\n\t\t\t}\n\t\t}\n\t\treturn projectStorage\n\t}\n\n\tclear() {\n\t\tfor (const [, projectStorage] of Object.entries(this.resources)) {\n\t\t\tfor (const [, value] of Object.entries(projectStorage)) {\n\t\t\t\tvalue?.clear()\n\t\t\t}\n\t\t}\n\t}\n\n\tall<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT\n\t): ResourceMap[RT][] {\n\t\tconst store = this.forProjectKey(projectKey)[typeId]\n\t\tif (store) {\n\t\t\treturn Array.from(store.values()).map(cloneObject) as ResourceMap[RT][]\n\t\t}\n\t\treturn []\n\t}\n\n\tadd<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT,\n\t\tobj: ResourceMap[RT],\n\t\tparams: GetParams = {}\n\t): ResourceMap[RT] {\n\t\tconst store = this.forProjectKey(projectKey)\n\t\tstore[typeId]?.set(obj.id, obj)\n\n\t\tconst resource = this.get(projectKey, typeId, obj.id, params)\n\t\tassert(resource, `resource of type ${typeId} with id ${obj.id} not created`)\n\t\treturn cloneObject(resource)\n\t}\n\n\tget<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT,\n\t\tid: string,\n\t\tparams: GetParams = {}\n\t): ResourceMap[RT] | null {\n\t\tconst resource = this.forProjectKey(projectKey)[typeId]?.get(id)\n\t\tif (resource) {\n\t\t\tconst clone = cloneObject(resource)\n\t\t\treturn this.expand(projectKey, clone, params.expand) as ResourceMap[RT]\n\t\t}\n\t\treturn null\n\t}\n\n\tgetByKey<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT,\n\t\tkey: string,\n\t\tparams: GetParams = {}\n\t): ResourceMap[RT] | null {\n\t\tconst store = this.forProjectKey(projectKey)\n\t\tconst resourceStore = store[typeId]\n\t\tif (!store) {\n\t\t\tthrow new Error('No type')\n\t\t}\n\n\t\tconst resources: any[] = Array.from(resourceStore.values())\n\t\tconst resource = resources.find((e) => e.key === key)\n\t\tif (resource) {\n\t\t\tconst clone = cloneObject(resource)\n\t\t\treturn this.expand(projectKey, clone, params.expand) as ResourceMap[RT]\n\t\t}\n\t\treturn null\n\t}\n\n\tdelete<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT,\n\t\tid: string,\n\t\tparams: GetParams = {}\n\t): ResourceMap[RT] | null {\n\t\tconst resource = this.get(projectKey, typeId, id)\n\n\t\tif (resource) {\n\t\t\tthis.forProjectKey(projectKey)[typeId]?.delete(id)\n\t\t\treturn this.expand(projectKey, resource, params.expand)\n\t\t}\n\t\treturn resource\n\t}\n\n\tquery<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT,\n\t\tparams: QueryParams\n\t): PagedQueryResponseMap[RT] {\n\t\tconst store = this.forProjectKey(projectKey)[typeId]\n\t\tif (!store) {\n\t\t\tthrow new Error('No type')\n\t\t}\n\n\t\tlet resources = this.all<RT>(projectKey, typeId)\n\n\t\t// Apply predicates\n\t\tif (params.where) {\n\t\t\ttry {\n\t\t\t\tconst filterFunc = parseQueryExpression(params.where)\n\t\t\t\tresources = resources.filter((resource) => filterFunc(resource, {}))\n\t\t\t} catch (err) {\n\t\t\t\tthrow new CommercetoolsError<InvalidInputError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'InvalidInput',\n\t\t\t\t\t\tmessage: (err as any).message,\n\t\t\t\t\t},\n\t\t\t\t\t400\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\t// Get the total before slicing the array\n\t\tconst totalResources = resources.length\n\n\t\t// Apply offset, limit\n\t\tconst offset = params.offset || 0\n\t\tconst limit = params.limit || 20\n\t\tresources = resources.slice(offset, offset + limit)\n\n\t\t// Expand the resources\n\t\tif (params.expand !== undefined) {\n\t\t\tresources = resources.map((resource) =>\n\t\t\t\tthis.expand(projectKey, resource, params.expand)\n\t\t\t)\n\t\t}\n\n\t\treturn {\n\t\t\tcount: totalResources,\n\t\t\ttotal: resources.length,\n\t\t\toffset: offset,\n\t\t\tlimit: limit,\n\t\t\tresults: resources.map(cloneObject),\n\t\t} as PagedQueryResponseMap[RT]\n\t}\n\n\tsearch(\n\t\tprojectKey: string,\n\t\ttypeId: ResourceType,\n\t\tparams: QueryParams\n\t): PagedQueryResponse {\n\t\tlet resources = this.all(projectKey, typeId)\n\n\t\t// Apply predicates\n\t\tif (params.where) {\n\t\t\ttry {\n\t\t\t\tconst filterFunc = parseQueryExpression(params.where)\n\t\t\t\tresources = resources.filter((resource) => filterFunc(resource, {}))\n\t\t\t} catch (err) {\n\t\t\t\tthrow new CommercetoolsError<InvalidInputError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'InvalidInput',\n\t\t\t\t\t\tmessage: (err as any).message,\n\t\t\t\t\t},\n\t\t\t\t\t400\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\t// Get the total before slicing the array\n\t\tconst totalResources = resources.length\n\n\t\t// Apply offset, limit\n\t\tconst offset = params.offset || 0\n\t\tconst limit = params.limit || 20\n\t\tresources = resources.slice(offset, offset + limit)\n\n\t\t// Expand the resources\n\t\tif (params.expand !== undefined) {\n\t\t\tresources = resources.map((resource) =>\n\t\t\t\tthis.expand(projectKey, resource, params.expand)\n\t\t\t)\n\t\t}\n\n\t\treturn {\n\t\t\tcount: totalResources,\n\t\t\ttotal: resources.length,\n\t\t\toffset: offset,\n\t\t\tlimit: limit,\n\t\t\tresults: resources,\n\t\t}\n\t}\n\n\tgetByResourceIdentifier<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\tidentifier: ResourceIdentifier\n\t): ResourceMap[RT] | null {\n\t\tif (identifier.id) {\n\t\t\tconst resource = this.get(projectKey, identifier.typeId, identifier.id)\n\t\t\tif (resource) {\n\t\t\t\treturn resource as ResourceMap[RT]\n\t\t\t}\n\t\t\tconsole.error(\n\t\t\t\t`No resource found with typeId=${identifier.typeId}, id=${identifier.id}`\n\t\t\t)\n\t\t\treturn null\n\t\t}\n\n\t\tif (identifier.key) {\n\t\t\tconst store = this.forProjectKey(projectKey)[identifier.typeId]\n\n\t\t\tif (store) {\n\t\t\t\t// TODO: BaseResource has no key attribute, but the subclasses should\n\t\t\t\t// have them all.\n\t\t\t\tconst resource = Array.from(store.values()).find(\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t(r) => r.key === identifier.key\n\t\t\t\t)\n\t\t\t\tif (resource) {\n\t\t\t\t\treturn resource as ResourceMap[RT]\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`No storage found for resource type: ${identifier.typeId}`\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n\n\taddProject = (projectKey: string): Project => {\n\t\tif (!this.projects[projectKey]) {\n\t\t\tthis.projects[projectKey] = {\n\t\t\t\tkey: projectKey,\n\t\t\t\tname: '',\n\t\t\t\tcountries: [],\n\t\t\t\tcurrencies: [],\n\t\t\t\tlanguages: [],\n\t\t\t\tcreatedAt: '2018-10-04T11:32:12.603Z',\n\t\t\t\ttrialUntil: '2018-12',\n\t\t\t\tcarts: {\n\t\t\t\t\tcountryTaxRateFallbackEnabled: false,\n\t\t\t\t\tdeleteDaysAfterLastModification: 90,\n\t\t\t\t},\n\t\t\t\tmessages: { enabled: false, deleteDaysAfterCreation: 15 },\n\t\t\t\tshippingRateInputType: undefined,\n\t\t\t\texternalOAuth: undefined,\n\t\t\t\tsearchIndexing: {\n\t\t\t\t\tproducts: {\n\t\t\t\t\t\tstatus: 'Deactivated',\n\t\t\t\t\t},\n\t\t\t\t\torders: {\n\t\t\t\t\t\tstatus: 'Deactivated',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tversion: 1,\n\t\t\t}\n\t\t}\n\t\treturn this.projects[projectKey]\n\t}\n\n\tsaveProject = (project: Project): Project => {\n\t\tthis.projects[project.key] = project\n\t\treturn project\n\t}\n\n\tgetProject = (projectKey: string): Project => this.addProject(projectKey)\n\n\t// Expand resolves a nested reference and injects the object in the given obj\n\tpublic expand = <T>(\n\t\tprojectKey: string,\n\t\tobj: T,\n\t\tclause: undefined | string | string[]\n\t): T => {\n\t\tif (!clause) return obj\n\t\tconst newObj = cloneObject(obj)\n\t\tif (Array.isArray(clause)) {\n\t\t\tclause.forEach((c) => {\n\t\t\t\tthis._resolveResource(projectKey, newObj, c)\n\t\t\t})\n\t\t} else {\n\t\t\tthis._resolveResource(projectKey, newObj, clause)\n\t\t}\n\t\treturn newObj\n\t}\n\n\tprivate _resolveResource = (projectKey: string, obj: any, expand: string) => {\n\t\tconst params = parseExpandClause(expand)\n\n\t\tif (!params.index) {\n\t\t\tconst reference = obj[params.element]\n\t\t\tif (reference === undefined) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis._resolveReference(projectKey, reference, params.rest)\n\t\t} else if (params.index === '*') {\n\t\t\tconst reference = obj[params.element]\n\t\t\tif (reference === undefined || !Array.isArray(reference)) return\n\t\t\treference.forEach((itemRef: Writable<Reference>) => {\n\t\t\t\tthis._resolveReference(projectKey, itemRef, params.rest)\n\t\t\t})\n\t\t} else {\n\t\t\tconst reference = obj[params.element][params.index]\n\t\t\tif (reference === undefined) return\n\t\t\tthis._resolveReference(projectKey, reference, params.rest)\n\t\t}\n\t}\n\n\tprivate _resolveReference(\n\t\tprojectKey: string,\n\t\treference: any,\n\t\texpand: string | undefined\n\t) {\n\t\tif (reference === undefined) return\n\n\t\tif (\n\t\t\treference.typeId !== undefined &&\n\t\t\t(reference.id !== undefined || reference.key !== undefined)\n\t\t) {\n\t\t\t// @ts-ignore\n\t\t\treference.obj = this.getByResourceIdentifier(projectKey, {\n\t\t\t\ttypeId: reference.typeId,\n\t\t\t\tid: reference.id,\n\t\t\t\tkey: reference.key,\n\t\t\t} as ResourceIdentifier)\n\t\t\tif (expand) {\n\t\t\t\tthis._resolveResource(projectKey, reference.obj, expand)\n\t\t\t}\n\t\t} else {\n\t\t\tif (expand) {\n\t\t\t\tthis._resolveResource(projectKey, reference, expand)\n\t\t\t}\n\t\t}\n\t}\n}\n","export abstract class BaseError {\n\tabstract message: string\n\tabstract errors?: BaseError[]\n}\n\nexport class CommercetoolsError<T extends BaseError> extends Error {\n\tinfo: T\n\tstatusCode: number\n\n\terrors: BaseError[]\n\n\tconstructor(info: T, statusCode = 400) {\n\t\tsuper(info.message)\n\t\tthis.info = info\n\t\tthis.statusCode = statusCode || 500\n\t\tthis.errors = info.errors ?? []\n\t}\n}\n\nexport interface InvalidRequestError {\n\treadonly code: 'invalid_request'\n\treadonly message: string\n}\n","import { OutgoingHttpHeaders } from 'node:http'\nimport { ParsedQs } from 'qs'\nimport { v4 as uuidv4 } from 'uuid'\n\nexport const getBaseResourceProperties = () => ({\n\tid: uuidv4(),\n\tcreatedAt: new Date().toISOString(),\n\tlastModifiedAt: new Date().toISOString(),\n\tversion: 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\tif (!path || path === '') {\n\t\treturn obj\n\t}\n\n\tconst parts = path.split('.')\n\tlet val = obj\n\n\tfor (let i = 0; i < parts.length; i++) {\n\t\tconst part = parts[i]\n\t\tif (val == undefined) {\n\t\t\treturn undefined\n\t\t}\n\n\t\tval = val[part]\n\t}\n\n\treturn val\n}\n\nexport const queryParamsArray = (\n\tinput: string | ParsedQs | string[] | ParsedQs[] | undefined\n): string[] | undefined => {\n\tif (input == undefined) {\n\t\treturn undefined\n\t}\n\n\tconst values: string[] = Array.isArray(input)\n\t\t? (input as string[])\n\t\t: ([input] as string[])\n\tif (values.length < 1) {\n\t\treturn undefined\n\t}\n\treturn values\n}\n\nexport const queryParamsValue = (\n\tvalue: string | ParsedQs | string[] | ParsedQs[] | undefined\n): string | undefined => {\n\tconst values = queryParamsArray(value)\n\tif (values && values.length > 0) {\n\t\treturn values[0]\n\t}\n\treturn undefined\n}\n\nexport const cloneObject = <T>(o: T): T => JSON.parse(JSON.stringify(o))\n\nexport const mapHeaderType = (\n\toutgoingHttpHeaders: OutgoingHttpHeaders\n): HeadersInit => {\n\tconst headersInit: HeadersInit = {}\n\tfor (const key in outgoingHttpHeaders) {\n\t\tconst value = outgoingHttpHeaders[key]\n\t\tif (Array.isArray(value)) {\n\t\t\t// Join multiple values for the same header with a comma\n\t\t\theadersInit[key] = value.join(', ')\n\t\t} else if (value !== undefined) {\n\t\t\t// Single value or undefined\n\t\t\theadersInit[key] = value.toString()\n\t\t}\n\t}\n\treturn headersInit\n}\n","/**\n * This module implements the reference expansion as imeplemented by\n * commercetools.\n *\n * See https://docs.commercetools.com/api/general-concepts#reference-expansion\n *\n * TODO: implement support for multi-dimensional array\n */\ntype ExpandResult = {\n\telement: string\n\tindex?: string | number\n\trest?: string\n}\n\nexport const parseExpandClause = (clause: string): ExpandResult => {\n\tconst result: ExpandResult = {\n\t\telement: clause,\n\t\tindex: undefined,\n\t\trest: undefined,\n\t}\n\n\tconst pos = clause.indexOf('.')\n\tif (pos > 0) {\n\t\tresult.element = clause.substring(0, pos)\n\t\tresult.rest = clause.substring(pos + 1)\n\t}\n\n\tconst match = result.element.match(/\\[([^\\]+])]/)\n\tif (match) {\n\t\tresult.index = match[1] === '*' ? '*' : parseInt(match[1], 10)\n\t\tresult.element = result.element.substring(0, match.index)\n\t}\n\treturn result\n}\n","export type Location = {\n\tlatitude: number\n\tlongitude: number\n}\n\n/**\n * Returns the distance between src and dst as meters\n */\nexport const haversineDistance = (src: Location, dst: Location) => {\n\tconst RADIUS_OF_EARTH_IN_KM = 6371\n\tconst toRadian = (deg: number) => deg * (Math.PI / 180)\n\n\tconst dLat = toRadian(dst.latitude - src.latitude)\n\tconst dLon = toRadian(dst.longitude - src.longitude)\n\n\tconst a =\n\t\tMath.sin(dLat / 2) * Math.sin(dLat / 2) +\n\t\tMath.cos(toRadian(src.latitude)) *\n\t\t\tMath.cos(toRadian(dst.latitude)) *\n\t\t\tMath.sin(dLon / 2) *\n\t\t\tMath.sin(dLon / 2)\n\tconst c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))\n\treturn RADIUS_OF_EARTH_IN_KM * c * 1000\n}\n","import TokenTypes from './token-types'\n\n/**\n * @private\n */\nexport default class LexerState<T> {\n\tpublic source: string\n\tpublic position: number\n\tpublic tokenTypes: TokenTypes<T>\n\n\tconstructor(source: string, position: number = 0) {\n\t\tthis.source = source\n\t\tthis.position = position\n\t}\n\n\tcopy() {\n\t\treturn new LexerState<T>(this.source, this.position)\n\t}\n}\n","import Lexer from './lexer'\n\n/**\n * @typedef {{\n * start: Position,\n * end: Position,\n * }} TokenPosition\n */\n\n/**\n * Represents a token instance\n */\nclass Token<T> {\n\ttype: T\n\tmatch: string\n\tgroups: string[]\n\tstart: number\n\tend: number\n\tlexer: Lexer<T>\n\n\t/* tslint:disable:indent */\n\t/**\n\t * Constructs a token\n\t * @param {T} type The token type\n\t * @param {string} match The string that the lexer consumed to create this token\n\t * @param {string[]} groups Any RegExp groups that accrued during the match\n\t * @param {number} start The string position where this match started\n\t * @param {number} end The string position where this match ends\n\t * @param {Lexer<T>} lexer The parent {@link Lexer}\n\t */\n\tconstructor(\n\t\ttype: T,\n\t\tmatch: string,\n\t\tgroups: string[],\n\t\tstart: number,\n\t\tend: number,\n\t\tlexer: Lexer<T>\n\t) {\n\t\t/* tslint:enable */\n\t\t/**\n\t\t * The token type\n\t\t * @type {T}\n\t\t */\n\t\tthis.type = type\n\n\t\t/**\n\t\t * The string that the lexer consumed to create this token\n\t\t * @type {string}\n\t\t */\n\t\tthis.match = match\n\n\t\t/**\n\t\t * Any RegExp groups that accrued during the match\n\t\t * @type {string[]}\n\t\t */\n\t\tthis.groups = groups\n\n\t\t/**\n\t\t * The string position where this match started\n\t\t * @type {number}\n\t\t */\n\t\tthis.start = start\n\n\t\t/**\n\t\t * The string position where this match ends\n\t\t * @type {number}\n\t\t */\n\t\tthis.end = end\n\n\t\t/**\n\t\t * The parent {@link Lexer}\n\t\t * @type {Lexer<T>}\n\t\t */\n\t\tthis.lexer = lexer\n\t}\n\n\t/**\n\t * Returns the bounds of this token, each in `{line, column}` format\n\t * @return {TokenPosition}\n\t */\n\tstrpos() {\n\t\tconst start = this.lexer.strpos(this.start)\n\t\tconst end = this.lexer.strpos(this.end)\n\t\treturn { start, end }\n\t}\n\n\t// tslint:disable-next-line prefer-function-over-method\n\tisEof() {\n\t\treturn false\n\t}\n}\n\nexport default Token\n\nexport class EOFToken<T> extends Token<T> {\n\tconstructor(lexer: Lexer<T>) {\n\t\tconst end = lexer.source.length\n\t\tsuper(null, '(eof)', [], end, end, lexer)\n\t}\n\n\t// tslint:disable-next-line prefer-function-over-method\n\tisEof() {\n\t\treturn true\n\t}\n}\n\n/**\n * @private\n */\nexport const EOF = (lexer: Lexer<any>) => new EOFToken(lexer)\n","// Thank you, http://stackoverflow.com/a/6969486\nfunction toRegExp(str: string): RegExp {\n\treturn new RegExp(str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&'))\n}\n\nfunction normalize(regex: RegExp | string): RegExp {\n\tif (typeof regex === 'string') regex = toRegExp(regex)\n\tif (!regex.source.startsWith('^'))\n\t\treturn new RegExp(`^${regex.source}`, regex.flags)\n\telse return regex\n}\n\nfunction first<T, U>(\n\tarr: T[],\n\tpredicate: (item: T, i: number) => U\n): { item: T; result: U } {\n\tlet i = 0\n\tfor (const item of arr) {\n\t\tconst result = predicate(item, i++)\n\t\tif (result) return { item, result }\n\t}\n}\n\n/**\n * @private\n */\nexport default class TokenTypes<T> {\n\tpublic tokenTypes: {\n\t\ttype: T\n\t\tregex: RegExp\n\t\tenabled: boolean\n\t\tskip: boolean\n\t}[]\n\n\tconstructor() {\n\t\tthis.tokenTypes = []\n\t}\n\n\tdisable(type: T): TokenTypes<T> {\n\t\treturn this.enable(type, false)\n\t}\n\n\tenable(type: T, enabled: boolean = true): TokenTypes<T> {\n\t\tthis.tokenTypes\n\t\t\t.filter((t) => t.type == type)\n\t\t\t.forEach((t) => (t.enabled = enabled))\n\t\treturn this\n\t}\n\n\tisEnabled(type: T) {\n\t\tconst ttypes = this.tokenTypes.filter((tt) => tt.type == type)\n\t\tif (ttypes.length == 0)\n\t\t\tthrow new Error(`Token of type ${type} does not exists`)\n\t\treturn ttypes[0].enabled\n\t}\n\n\tpeek(source: string, position: number) {\n\t\tconst s = source.substr(position)\n\t\treturn first(\n\t\t\tthis.tokenTypes.filter((tt) => tt.enabled),\n\t\t\t(tt) => {\n\t\t\t\ttt.regex.lastIndex = 0\n\t\t\t\treturn tt.regex.exec(s)\n\t\t\t}\n\t\t)\n\t}\n\n\ttoken(\n\t\ttype: T,\n\t\tpattern: RegExp | string,\n\t\tskip: boolean = false\n\t): TokenTypes<T> {\n\t\tthis.tokenTypes.push({\n\t\t\ttype,\n\t\t\tregex: normalize(pattern),\n\t\t\tenabled: true,\n\t\t\tskip,\n\t\t})\n\t\treturn this\n\t}\n}\n","import LexerState from './lexer-state'\nimport Token, { EOF } from './token'\nimport TokenTypes from './token-types'\n\n/**\n * @typedef {{\n * line: number,\n * column: number,\n * }} Position\n */\n\n/**\n * Lexes a source-string into tokens.\n *\n * @example\n * const lex = perplex('...')\n * .token('ID', /my-id-regex/)\n * .token('(', /\\(/)\n * .token(')', /\\)/)\n * .token('WS', /\\s+/, true) // true means 'skip'\n *\n * while ((let t = lex.next()).type != 'EOF') {\n * console.log(t)\n * }\n * // alternatively:\n * console.log(lex.toArray())\n * // or:\n * console.log(...lex)\n */\nclass Lexer<T> implements Iterable<Token<T>> {\n\t/* tslint:disable:variable-name */\n\tprivate _state: LexerState<T>\n\tprivate _tokenTypes: TokenTypes<T>\n\t/* tslint:enable */\n\n\t/**\n\t * Creates a new Lexer instance\n\t * @param {string} [source = ''] The source string to operate on.\n\t */\n\tconstructor(source: string = '') {\n\t\tthis._state = new LexerState<T>(source)\n\t\tthis._tokenTypes = new TokenTypes<T>()\n\t}\n\n\t//\n\t// Getters/Setters\n\t//\n\n\t/**\n\t * Gets the current lexer position\n\t * @return {number} Returns the position\n\t */\n\tget position() {\n\t\treturn this._state.position\n\t}\n\n\t/**\n\t * Sets the current lexer position\n\t * @param {number} i The position to move to\n\t */\n\tset position(i: number) {\n\t\tthis._state.position = i\n\t}\n\n\t/**\n\t * Gets the source the lexer is operating on\n\t * @return {string} Returns the source\n\t */\n\tget source() {\n\t\treturn this._state.source\n\t}\n\n\t/**\n\t * Sets the source the lexer is operating on\n\t * @param {string} s The source to set\n\t */\n\tset source(s: string) {\n\t\tthis._state = new LexerState<T>(s)\n\t}\n\n\t//\n\t// METHODS\n\t//\n\n\t/**\n\t * Attaches this lexer to another lexer's state\n\t * @param {Lexer<T>} other The other lexer to attach to\n\t */\n\tattachTo(other: Lexer<T>) {\n\t\tthis._state = other._state\n\t}\n\n\t/**\n\t * Disables a token type\n\t * @param {T} type The token type to disable\n\t * @return {Lexer<T>}\n\t */\n\tdisable(type: T) {\n\t\tthis._tokenTypes.disable(type)\n\t\treturn this\n\t}\n\n\t/**\n\t * Enables a token type\n\t * @param {T} type The token type to enalbe\n\t * @param {?boolean} [enabled=true] Whether to enable/disable the specified token type\n\t * @return {Lexer<T>}\n\t */\n\tenable(type: T, enabled?: boolean) {\n\t\tthis._tokenTypes.enable(type, enabled)\n\t\treturn this\n\t}\n\n\t/**\n\t * Like {@link next}, but throws an exception if the next token is\n\t * not of the required type.\n\t * @param {T} type The token type expected from {@link next}\n\t * @return {Token<T>} Returns the {@link Token} on success\n\t */\n\texpect(type: T): Token<T> {\n\t\tconst t = this.next()\n\t\tif (t.type != type) {\n\t\t\tconst pos = t.strpos()\n\t\t\tthrow new Error(\n\t\t\t\t'Expected ' +\n\t\t\t\t\ttype +\n\t\t\t\t\t(t ? ', got ' + t.type : '') +\n\t\t\t\t\t' at ' +\n\t\t\t\t\tpos.start.line +\n\t\t\t\t\t':' +\n\t\t\t\t\tpos.start.column\n\t\t\t)\n\t\t}\n\t\treturn t\n\t}\n\n\t/**\n\t * Looks up whether a token is enabled.\n\t * @param tokenType The token type to look up\n\t * @return {boolean} Returns whether the token is enabled\n\t */\n\tisEnabled(tokenType: T) {\n\t\treturn this._tokenTypes.isEnabled(tokenType)\n\t}\n\n\t/**\n\t * Consumes and returns the next {@link Token} in the source string.\n\t * If there are no more tokens, it returns a {@link Token} of type `$EOF`\n\t * @return {Token<T>}\n\t */\n\tnext(): Token<T> {\n\t\ttry {\n\t\t\tconst t = this.peek()\n\t\t\tthis._state.position = t.end\n\t\t\treturn t\n\t\t} catch (e) {\n\t\t\tthis._state.position = e.end\n\t\t\tthrow e\n\t\t}\n\t}\n\n\t/**\n\t * Returns the next {@link Token} in the source string, but does\n\t * not consume it.\n\t * If there are no more tokens, it returns a {@link Token} of type `$EOF`\n\t * @param {number} [position=`this.position`] The position at which to start reading\n\t * @return {Token<T>}\n\t */\n\tpeek(position: number = this._state.position): Token<T> {\n\t\tconst read = (i: number = position) => {\n\t\t\tif (i >= this._state.source.length) return EOF(this)\n\t\t\tconst n = this._tokenTypes.peek(this._state.source, i)\n\t\t\treturn n\n\t\t\t\t? n.item.skip\n\t\t\t\t\t? read(i + n.result[0].length)\n\t\t\t\t\t: new Token(\n\t\t\t\t\t\t\tn.item.type,\n\t\t\t\t\t\t\tn.result[0],\n\t\t\t\t\t\t\tn.result.map((x) => x),\n\t\t\t\t\t\t\ti,\n\t\t\t\t\t\t\ti + n.result[0].length,\n\t\t\t\t\t\t\tthis\n\t\t\t\t\t )\n\t\t\t\t: null\n\t\t}\n\t\tconst t = read()\n\t\tif (t) return t\n\n\t\t// we did not find a match\n\t\tlet unexpected = this._state.source.substring(position, position + 1)\n\t\ttry {\n\t\t\tthis.peek(position + 1)\n\t\t} catch (e) {\n\t\t\tunexpected += e.unexpected\n\t\t}\n\t\tconst { line, column } = this.strpos(position)\n\t\tconst e = new Error(\n\t\t\t`Unexpected input: ${unexpected} at (${line}:${column})`\n\t\t)\n\t\t;(e as any).unexpected = unexpected\n\t\t;(e as any).end = position + unexpected.length\n\t\tthrow e\n\t}\n\n\t/**\n\t * Converts a string-index (relative to the source string) to a line and a column.\n\t * @param {number} i The index to compute\n\t * @return {Position}\n\t */\n\tstrpos(i: number): {\n\t\tline: number\n\t\tcolumn: number\n\t} {\n\t\tlet lines = this._state.source.substring(0, i).split(/\\r?\\n/)\n\t\tif (!Array.isArray(lines)) lines = [lines]\n\n\t\tconst line = lines.length\n\t\tconst column = lines[lines.length - 1].length + 1\n\t\treturn { line, column }\n\t}\n\n\t/**\n\t * Converts the token stream to an array of Tokens\n\t * @return {Token<T>[]} The array of tokens (not including (EOF))\n\t */\n\ttoArray(): Token<T>[] {\n\t\treturn [...this]\n\t}\n\n\t/**\n\t * Implements the Iterable protocol\n\t * Iterates lazily over the entire token stream (not including (EOF))\n\t * @return {Iterator<Token<T>>} Returns an iterator over all remaining tokens\n\t */\n\t*[Symbol.iterator]() {\n\t\tconst oldState = this._state.copy()\n\t\tthis._state.position = 0\n\n\t\tlet t\n\t\twhile (\n\t\t\t!(t = this.next()).isEof() // tslint:disable-line no-conditional-assignment\n\t\t)\n\t\t\tyield t\n\n\t\tthis._state = oldState\n\t}\n\n\t/**\n\t * Creates a new token type\n\t * @param {T} type The token type\n\t * @param {string|RegExp} pattern The pattern to match\n\t * @param {?boolean} skip Whether this type of token should be skipped\n\t * @return {Lexer<T>}\n\t */\n\ttoken(type: T, pattern: string | RegExp, skip?: boolean) {\n\t\tthis._tokenTypes.token(type, pattern, skip)\n\t\treturn this\n\t}\n\n\t/**\n\t * Creates a keyword\n\t * @param kwd The keyword to add as a token\n\t */\n\tkeyword(kwd: T) {\n\t\treturn this.token(kwd, new RegExp(`${kwd}(?=\\\\W|$)`))\n\t}\n\n\t/**\n\t * Creates an operator\n\t * @param op The operator to add as a token\n\t */\n\toperator(op: T) {\n\t\tconst sOp = new String(op).valueOf()\n\t\treturn this.token(op, sOp)\n\t}\n}\n\nexport default Lexer\nexport { EOF, Token, TokenTypes, LexerState, Lexer }\n","// From https://github.com/jrop/pratt/blob/master/src/index.ts\n\nexport interface IPosition {\n\tline: number\n\tcolumn: number\n}\nexport interface ITokenPosition {\n\tstart: IPosition\n\tend: IPosition\n}\nexport interface IToken<T> {\n\ttype: T\n\tmatch: string\n\tstrpos(): ITokenPosition\n\tisEof(): boolean\n}\nexport interface ILexer<T> {\n\tnext(): IToken<T>\n\tpeek(): IToken<T>\n}\n\nexport type BPResolver = () => number\nexport type BP = number | BPResolver\n\nexport type StopFunction = (<T>(x: T) => T) & { isStopped(): boolean }\n\nexport type NudInfo<T> = {\n\ttoken: IToken<T>\n\tbp: number\n\tstop: StopFunction\n\n\t// TODO: with the below addition of `options`\n\t// the `ctx parameter is carried through anyway\n\t// remove in a breaking API change release\n\tctx: any\n\toptions: ParseOpts<T>\n}\nexport type LedInfo<T> = NudInfo<T> & { left: any }\n\nexport type NudFunction<T> = (inf: NudInfo<T>) => any\nexport type LedFunction<T> = (inf: LedInfo<T>) => any\n\nexport type NudMap<T> = Map<T, NudFunction<T>>\nexport type LedMap<T> = Map<T, LedFunction<T>>\n\nexport type ParseOpts<T> = {\n\tctx?: any\n\tstop?: StopFunction\n\tterminals?: (number | T)[]\n}\n\nconst createStop = <T>(): StopFunction => {\n\tlet stopCalled = false\n\treturn Object.assign(\n\t\t(x: T) => {\n\t\t\tstopCalled = true\n\t\t\treturn x\n\t\t},\n\t\t{\n\t\t\tisStopped() {\n\t\t\t\treturn stopCalled\n\t\t\t},\n\t\t}\n\t) as StopFunction\n}\n\n/**\n * A Pratt parser.\n * @example\n * const lex = new perplex.Lexer('1 + -2 * 3^4')\n * .token('NUM', /\\d+/)\n * .token('+', /\\+/)\n * .token('-', /-/)\n * .token('*', new RegExp('*'))\n * .token('/', /\\//)\n * .token('^', /\\^/)\n * .token('(', /\\(/)\n * .token(')', /\\)/)\n * .token('$SKIP_WS', /\\s+/)\n *\n * const parser = new Parser(lex)\n * .builder()\n * .nud('NUM', 100, t => parseInt(t.match))\n * .nud('-', 10, (t, bp) => -parser.parse(bp))\n * .nud('(', 10, (t, bp) => {\n * const expr = parser.parse(bp)\n * lex.expect(')')\n * return expr\n * })\n * .bp(')', 0)\n *\n * .led('^', 20, (left, t, bp) => Math.pow(left, parser.parse(20 - 1)))\n * .led('+', 30, (left, t, bp) => left + parser.parse(bp))\n * .led('-', 30, (left, t, bp) => left - parser.parse(bp))\n * .led('*', 40, (left, t, bp) => left * parser.parse(bp))\n * .led('/', 40, (left, t, bp) => left / parser.parse(bp))\n * .build()\n * parser.parse()\n * // => 161\n */\nexport class Parser<T> {\n\tpublic lexer: ILexer<T>\n\t_nuds: NudMap<T>\n\t_leds: LedMap<T>\n\t_bps: Map<T, BP>\n\n\t/**\n\t * Constructs a Parser instance\n\t * @param {ILexer<T>} lexer The lexer to obtain tokens from\n\t */\n\tconstructor(lexer: ILexer<T>) {\n\t\t/**\n\t\t * The lexer that this parser is operating on.\n\t\t * @type {ILexer<T>}\n\t\t */\n\t\tthis.lexer = lexer\n\t\tthis._nuds = new Map()\n\t\tthis._leds = new Map()\n\t\tthis._bps = new Map()\n\t}\n\n\tprivate _type(tokenOrType: IToken<T> | T): T {\n\t\treturn tokenOrType && typeof (tokenOrType as IToken<T>).isEof == 'function'\n\t\t\t? (tokenOrType as IToken<T>).type\n\t\t\t: (tokenOrType as T)\n\t}\n\n\t/**\n\t * Create a {@link ParserBuilder}\n\t * @return {ParserBuilder<T>} Returns the ParserBuilder\n\t */\n\tbuilder(): ParserBuilder<T> {\n\t\treturn new ParserBuilder(this)\n\t}\n\n\t/**\n\t * Define binding power for a token-type\n\t * @param {IToken<T>|T} tokenOrType The token type to define the binding power for\n\t * @returns {number} The binding power of the specified token type\n\t */\n\tbp(tokenOrType: IToken<T> | T) {\n\t\tif (tokenOrType == null) return Number.NEGATIVE_INFINITY\n\t\tif (\n\t\t\ttokenOrType &&\n\t\t\ttypeof (tokenOrType as IToken<T>).isEof == 'function' &&\n\t\t\t(tokenOrType as IToken<T>).isEof()\n\t\t)\n\t\t\treturn Number.NEGATIVE_INFINITY\n\t\tconst type = this._type(tokenOrType)\n\t\tconst bp = this._bps.has(type)\n\t\t\t? this._bps.get(type)\n\t\t\t: Number.POSITIVE_INFINITY\n\t\treturn typeof bp == 'function' ? bp() : bp\n\t}\n\n\t/**\n\t * Computes the token's `nud` value and returns it\n\t * @param {NudInfo<T>} info The info to compute the `nud` from\n\t * @returns {any} The result of invoking the pertinent `nud` operator\n\t */\n\tnud(info: NudInfo<T>) {\n\t\tconst fn: NudFunction<T> | undefined = this._nuds.get(info.token.type)\n\t\tif (!fn) {\n\t\t\tconst { start } = info.token.strpos()\n\t\t\tthrow new Error(\n\t\t\t\t`Unexpected token: ${info.token.match} (at ${start.line}:${start.column})`\n\t\t\t)\n\t\t}\n\t\treturn fn(info)\n\t}\n\n\t/**\n\t * Computes a token's `led` value and returns it\n\t * @param {LedInfo<T>} info The info to compute the `led` value for\n\t * @returns {any} The result of invoking the pertinent `led` operator\n\t */\n\tled(info: LedInfo<T>) {\n\t\tlet fn = this._leds.get(info.token.type)\n\t\tif (!fn) {\n\t\t\tconst { start } = info.token.strpos()\n\t\t\tthrow new Error(\n\t\t\t\t`Unexpected token: ${info.token.match} (at ${start.line}:${start.column})`\n\t\t\t)\n\t\t}\n\t\treturn fn(info)\n\t}\n\n\t/**\n\t * Kicks off the Pratt parser, and returns the result\n\t * @param {ParseOpts<T>} opts The parse options\n\t * @returns {any}\n\t */\n\tparse(opts: ParseOpts<T> = { terminals: [0] }): any {\n\t\tconst stop = (opts.stop = opts.stop || createStop())\n\t\tconst check = () => {\n\t\t\tif (stop.isStopped()) return false\n\t\t\tconst t = this.lexer.peek()\n\t\t\tconst bp = this.bp(t)\n\n\t\t\t// @ts-ignore\n\t\t\treturn opts.terminals.reduce((canContinue, rbpOrType) => {\n\t\t\t\tif (!canContinue) return false\n\t\t\t\t// @ts-ignore\n\t\t\t\tif (typeof rbpOrType == 'number') return rbpOrType < bp\n\t\t\t\tif (typeof rbpOrType == 'string') return t.type != rbpOrType\n\t\t\t}, true)\n\t\t}\n\t\tconst mkinfo = (token: IToken<T>): NudInfo<T> => {\n\t\t\tconst bp = this.bp(token)\n\t\t\t// @ts-ignore\n\t\t\treturn { token, bp, stop, ctx: opts.ctx, options: opts }\n\t\t}\n\t\tif (!opts.terminals) opts.terminals = [0]\n\t\tif (opts.terminals.length == 0) opts.terminals.push(0)\n\n\t\tlet left = this.nud(mkinfo(this.lexer.next()))\n\t\twhile (check()) {\n\t\t\tconst operator = this.lexer.next()\n\t\t\tleft = this.led(Object.assign(mkinfo(operator), { left }))\n\t\t}\n\t\treturn left\n\t}\n}\n\n/**\n * Builds `led`/`nud` rules for a {@link Parser}\n */\nexport class ParserBuilder<T> {\n\tprivate _parser: Parser<T>\n\n\t/**\n\t * Constructs a ParserBuilder\n\t * See also: {@link Parser.builder}\n\t * @param {Parser<T>} parser The parser\n\t */\n\tconstructor(parser: Parser<T>) {\n\t\tthis._parser = parser\n\t}\n\n\t/**\n\t * Define `nud` for a token type\n\t * @param {T} tokenType The token type\n\t * @param {number} bp The binding power\n\t * @param {NudFunction<T>} fn The function that will parse the token\n\t * @return {ParserBuilder<T>} Returns this ParserBuilder\n\t */\n\tnud(tokenType: T, bp: BP, fn: NudFunction<T>): ParserBuilder<T> {\n\t\tthis._parser._nuds.set(tokenType, fn)\n\t\tthis.bp(tokenType, bp)\n\t\treturn this\n\t}\n\n\t/**\n\t * Define `led` for a token type\n\t * @param {T} tokenType The token type\n\t * @param {number} bp The binding power\n\t * @param {LedFunction<T>} fn The function that will parse the token\n\t * @return {ParserBuilder<T>} Returns this ParserBuilder\n\t */\n\tled(tokenType: T, bp: BP, fn: LedFunction<T>): ParserBuilder<T> {\n\t\tthis._parser._leds.set(tokenType, fn)\n\t\tthis.bp(tokenType, bp)\n\t\treturn this\n\t}\n\n\t/**\n\t * Define both `led` and `nud` for a token type at once.\n\t * The supplied `LedFunction` may be called with a null `left`\n\t * parameter when invoked from a `nud` context.\n\t * @param {strTng} tokenType The token type\n\t * @param {number} bp The binding power\n\t * @param {LedFunction<T>} fn The function that will parse the token\n\t * @return {ParserBuilder<T>} Returns this ParserBuilder\n\t */\n\teither(tokenType: T, bp: BP, fn: LedFunction<T>): ParserBuilder<T> {\n\t\treturn this.nud(tokenType, bp, (inf) =>\n\t\t\tfn(Object.assign(inf, { left: null }))\n\t\t).led(tokenType, bp, fn)\n\t}\n\n\t/**\n\t * Define the binding power for a token type\n\t * @param {T} tokenType The token type\n\t * @param {BP} bp The binding power\n\t * @return {ParserBuilder<T>} Returns this ParserBuilder\n\t */\n\tbp(tokenType: T, bp: BP): ParserBuilder<T> {\n\t\tthis._parser._bps.set(tokenType, bp)\n\t\treturn this\n\t}\n\n\t/**\n\t * Returns the parent {@link Parser} instance\n\t * @returns {Parser<T>}\n\t */\n\tbuild(): Parser<T> {\n\t\treturn this._parser\n\t}\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 { haversineDistance } from './haversine.js'\nimport { Lexer, Parser, type ITokenPosition } from './parser.js'\n\nexport class PredicateError {\n\tmessage: string\n\n\tconstructor(message: string) {\n\t\tthis.message = message\n\t}\n}\n\ntype MatchFunc = (target: any, variables: VariableMap) => boolean\ntype VariableMap = {\n\t[key: string]: any\n}\n\nexport const matchesPredicate = (\n\tpredicate: string | string[] | undefined,\n\ttarget: any,\n\tvariables?: VariableMap\n): boolean => {\n\tif (!predicate) {\n\t\treturn true\n\t}\n\n\tif (Array.isArray(predicate)) {\n\t\treturn predicate.every((item) => {\n\t\t\tconst func = generateMatchFunc(item)\n\t\t\treturn func(target, variables ?? {})\n\t\t})\n\t} else {\n\t\tconst func = generateMatchFunc(predicate)\n\t\treturn func(target, variables ?? {})\n\t}\n}\n\nexport const parseQueryExpression = (\n\tpredicate: string | string[]\n): MatchFunc => {\n\tif (Array.isArray(predicate)) {\n\t\tconst callbacks = predicate.map((item) => generateMatchFunc(item))\n\t\treturn (target: any, variables: VariableMap) =>\n\t\t\tcallbacks.every((callback) => callback(target, variables))\n\t} else {\n\t\treturn generateMatchFunc(predicate)\n\t}\n}\n\ntype TypeSymbol = {\n\ttype: 'var' | 'boolean' | 'string' | 'float' | 'int' | 'identifier'\n\tvalue: any\n\tpos?: ITokenPosition\n}\n\nconst validateSymbol = (val: TypeSymbol) => {\n\tif (!val.type) {\n\t\tthrow new PredicateError('Internal error')\n\t}\n\n\tif (val.type === 'identifier') {\n\t\tconst char = val.value.charAt(0)\n\t\tconst line = val.pos?.start.line\n\t\tconst column = val.pos?.start.column\n\n\t\tthrow new PredicateError(\n\t\t\t`Invalid input '${char}', expected input parameter or primitive value (line ${line}, column ${column})`\n\t\t)\n\t}\n}\n\nconst resolveSymbol = (val: TypeSymbol, vars: VariableMap): any => {\n\tif (val.type === 'var') {\n\t\tif (!(val.value in (vars ?? {}))) {\n\t\t\tthrow new PredicateError(`Missing parameter value for ${val.value}`)\n\t\t}\n\t\treturn vars[val.value]\n\t}\n\n\treturn val.value\n}\n\nconst resolveValue = (obj: any, val: TypeSymbol): any => {\n\tif (val.type !== 'identifier') {\n\t\tthrow new PredicateError('Internal error')\n\t}\n\n\tif (!(val.value in obj)) {\n\t\tif (Array.isArray(obj)) {\n\t\t\treturn Object.values(obj)\n\t\t\t\t.filter((v) => val.value in v)\n\t\t\t\t.map((v) => v[val.value])\n\t\t}\n\t\tthrow new PredicateError(`The field '${val.value}' does not exist.`)\n\t}\n\n\treturn obj[val.value]\n}\n\nconst getLexer = (value: string) =>\n\tnew Lexer(value)\n\n\t\t.token('AND', /and(?![-_a-z0-9]+)/i)\n\t\t.token('OR', /or(?![-_a-z0-9]+)/i)\n\t\t.token('NOT', /not(?![-_a-z0-9]+)/i)\n\n\t\t.token('WITHIN', /within(?![-_a-z0-9]+)/i)\n\t\t.token('IN', /in(?![-_a-z0-9]+)/i)\n\t\t.token('MATCHES_IGNORE_CASE', /matches\\s+ignore\\s+case(?![-_a-z0-9]+)/i)\n\t\t.token('CONTAINS', /contains(?![-_a-z0-9]+)/i)\n\t\t.token('ALL', /all(?![-_a-z0-9]+)/i)\n\t\t.token('ANY', /any(?![-_a-z0-9]+)/i)\n\t\t.token('EMPTY', /empty(?![-_a-z0-9]+)/i)\n\t\t.token('IS', /is(?![-_a-z0-9]+)/i)\n\t\t.token('DEFINED', /defined(?![-_a-z0-9]+)/i)\n\n\t\t.token('FLOAT', /\\d+\\.\\d+/)\n\t\t.token('INT', /\\d+/)\n\t\t.token('VARIABLE', /:([-_A-Za-z0-9]+)/)\n\t\t.token('BOOLEAN', /(true|false)/)\n\t\t.token('IDENTIFIER', /[-_A-Za-z0-9]+/)\n\t\t.token('STRING', /\"((?:\\\\.|[^\"\\\\])*)\"/)\n\t\t.token('STRING', /'((?:\\\\.|[^'\\\\])*)'/)\n\n\t\t.token('COMMA', ',')\n\t\t.token('(', '(')\n\t\t.token(')', ')')\n\t\t.token('>=', '>=')\n\t\t.token('<=', '<=')\n\t\t.token('>', '>')\n\t\t.token('<', '<')\n\t\t.token('!=', '!=')\n\t\t.token('=', '=')\n\t\t.token('\"', '\"')\n\t\t.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\tconst lexer = getLexer(predicate)\n\tconst parser = new Parser(lexer)\n\t\t.builder()\n\t\t.nud(\n\t\t\t'IDENTIFIER',\n\t\t\t100,\n\t\t\t(t) =>\n\t\t\t\t({\n\t\t\t\t\ttype: 'identifier',\n\t\t\t\t\tvalue: t.token.match,\n\t\t\t\t\tpos: t.token.strpos(),\n\t\t\t\t}) as TypeSymbol\n\t\t)\n\t\t.nud(\n\t\t\t'BOOLEAN',\n\t\t\t1,\n\t\t\t(t) =>\n\t\t\t\t({\n\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\tvalue: t.token.match === 'true' ? true : false,\n\t\t\t\t\tpos: t.token.strpos(),\n\t\t\t\t}) as TypeSymbol\n\t\t)\n\t\t.nud(\n\t\t\t'VARIABLE',\n\t\t\t100,\n\t\t\t(t) =>\n\t\t\t\t({\n\t\t\t\t\ttype: 'var',\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tvalue: t.token.groups[1],\n\t\t\t\t\tpos: t.token.strpos(),\n\t\t\t\t}) as TypeSymbol\n\t\t)\n\t\t.nud(\n\t\t\t'STRING',\n\t\t\t100,\n\t\t\t(t) =>\n\t\t\t\t({\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tvalue: t.token.groups[1],\n\t\t\t\t\tpos: t.token.strpos(),\n\t\t\t\t}) as TypeSymbol\n\t\t)\n\t\t.nud(\n\t\t\t'INT',\n\t\t\t1,\n\t\t\t(t) =>\n\t\t\t\t({\n\t\t\t\t\ttype: 'int',\n\t\t\t\t\tvalue: parseInt(t.token.match, 10),\n\t\t\t\t\tpos: t.token.strpos(),\n\t\t\t\t}) as TypeSymbol\n\t\t)\n\t\t.nud(\n\t\t\t'FLOAT',\n\t\t\t1,\n\t\t\t(t) =>\n\t\t\t\t({\n\t\t\t\t\ttype: 'float',\n\t\t\t\t\tvalue: parseFloat(t.token.match),\n\t\t\t\t\tpos: t.token.strpos(),\n\t\t\t\t}) as TypeSymbol\n\t\t)\n\t\t.nud('NOT', 100, ({ bp }) => {\n\t\t\tconst expr = parser.parse({ terminals: [bp - 1] })\n\t\t\treturn (obj: any) => !expr(obj)\n\t\t})\n\t\t.nud('EMPTY', 10, ({ bp }) => 'empty')\n\t\t.nud('DEFINED', 10, ({ bp }) => 'defined')\n\n\t\t.led('AND', 5, ({ left, bp }) => {\n\t\t\tconst expr = parser.parse({ terminals: [bp - 1] })\n\t\t\treturn (obj: any) => left(obj) && expr(obj)\n\t\t})\n\t\t.led('OR', 5, ({ left, token, bp }) => {\n\t\t\tconst expr = parser.parse({ terminals: [bp - 1] })\n\t\t\treturn (obj: any, vars: object) => left(obj, vars) || expr(obj, vars)\n\t\t})\n\t\t.led('COMMA', 1, ({ left, token, bp }) => {\n\t\t\tconst expr: any = parser.parse({ terminals: [bp - 1] })\n\t\t\tif (Array.isArray(expr)) {\n\t\t\t\treturn [left, ...expr]\n\t\t\t} else {\n\t\t\t\treturn [left, expr]\n\t\t\t}\n\t\t})\n\t\t.nud('(', 100, (t) => {\n\t\t\tconst expr: any = parser.parse({ terminals: [')'] })\n\t\t\treturn expr\n\t\t})\n\t\t.led('(', 100, ({ left, bp }) => {\n\t\t\tconst expr = parser.parse()\n\t\t\tlexer.expect(')')\n\t\t\treturn (obj: any, vars: object) => {\n\t\t\t\tconst value = resolveValue(obj, left)\n\t\t\t\tif (value) {\n\t\t\t\t\treturn expr(value, vars)\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t}\n\t\t})\n\t\t.bp(')', 0)\n\t\t.led('=', 20, ({ left, bp }) => {\n\t\t\tconst expr = parser.parse({ terminals: [bp - 1] })\n\t\t\tvalidateSymbol(expr)\n\n\t\t\treturn (obj: any, vars: VariableMap) => {\n\t\t\t\tconst resolvedValue = resolveValue(obj, left)\n\t\t\t\tconst resolvedSymbol = resolveSymbol(expr, vars)\n\t\t\t\tif (Array.isArray(resolvedValue)) {\n\t\t\t\t\treturn !!resolvedValue.some((elem) => elem === resolvedSymbol)\n\t\t\t\t}\n\t\t\t\treturn resolvedValue === resolvedSymbol\n\t\t\t}\n\t\t})\n\t\t.led('!=', 20, ({ left, bp }) => {\n\t\t\tconst expr = parser.parse({ terminals: [bp - 1] })\n\t\t\tvalidateSymbol(expr)\n\t\t\treturn (obj: any, vars: VariableMap) =>\n\t\t\t\tresolveValue(obj, left) !== resolveSymbol(expr, vars)\n\t\t})\n\t\t.led('>', 20, ({ left, bp }) => {\n\t\t\tconst expr = parser.parse({ terminals: [bp - 1] })\n\t\t\tvalidateSymbol(expr)\n\n\t\t\treturn (obj: any, vars: object) =>\n\t\t\t\tresolveValue(obj, left) > resolveSymbol(expr, vars)\n\t\t})\n\t\t.led('>=', 20, ({ left, bp }) => {\n\t\t\tconst expr = parser.parse({ terminals: [bp - 1] })\n\t\t\tvalidateSymbol(expr)\n\n\t\t\treturn (obj: any, vars: object) =>\n\t\t\t\tresolveValue(obj, left) >= resolveSymbol(expr, vars)\n\t\t})\n\t\t.led('<', 20, ({ left, bp }) => {\n\t\t\tconst expr = parser.parse({ terminals: [bp - 1] })\n\t\t\tvalidateSymbol(expr)\n\n\t\t\treturn (obj: any, vars: object) =>\n\t\t\t\tresolveValue(obj, left) < resolveSymbol(expr, vars)\n\t\t})\n\t\t.led('<=', 20, ({ left, bp }) => {\n\t\t\tconst expr = parser.parse({ terminals: [bp - 1] })\n\t\t\tvalidateSymbol(expr)\n\n\t\t\treturn (obj: any, vars: object) =>\n\t\t\t\tresolveValue(obj, left) <= resolveSymbol(expr, vars)\n\t\t})\n\t\t.led('IS', 20, ({ left, bp }) => {\n\t\t\tlet invert = false\n\n\t\t\t// Peek if this is a `is not` statement\n\t\t\tconst next = lexer.peek()\n\t\t\tif (next.type === 'NOT') {\n\t\t\t\tinvert = true\n\t\t\t\tlexer.next()\n\t\t\t}\n\n\t\t\tconst expr: any = parser.parse({ terminals: [bp - 1] })\n\n\t\t\tswitch (expr) {\n\t\t\t\tcase 'empty': {\n\t\t\t\t\tif (!invert) {\n\t\t\t\t\t\treturn (obj: any, vars: VariableMap) => {\n\t\t\t\t\t\t\tconst val = resolveValue(obj, left)\n\t\t\t\t\t\t\treturn val.length === 0\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn (obj: any, vars: VariableMap) => {\n\t\t\t\t\t\t\tconst val = resolveValue(obj, left)\n\t\t\t\t\t\t\treturn val.length !== 0\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcase 'defined': {\n\t\t\t\t\tif (!invert) {\n\t\t\t\t\t\treturn (obj: any, vars: VariableMap) => {\n\t\t\t\t\t\t\tconst val = resolveValue(obj, left)\n\t\t\t\t\t\t\treturn val !== undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn (obj: any, vars: VariableMap) => {\n\t\t\t\t\t\t\tconst val = resolveValue(obj, left)\n\t\t\t\t\t\t\treturn val === undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tthrow new Error('Unexpected')\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t\t.led('IN', 20, ({ left, bp }) => {\n\t\t\tconst expr = parser.parse({ terminals: [bp - 1] })\n\t\t\treturn (obj: any, vars: object) => {\n\t\t\t\tlet symbols = expr\n\t\t\t\tif (!Array.isArray(symbols)) {\n\t\t\t\t\tsymbols = [expr]\n\t\t\t\t}\n\n\t\t\t\tconst inValues = symbols.map((item: TypeSymbol) =>\n\t\t\t\t\tresolveSymbol(item, vars)\n\t\t\t\t)\n\t\t\t\treturn inValues.includes(resolveValue(obj, left))\n\t\t\t}\n\t\t})\n\t\t.led('MATCHES_IGNORE_CASE', 20, ({ left, bp }) => {\n\t\t\tconst expr = parser.parse({ terminals: [bp - 1] })\n\t\t\tvalidateSymbol(expr)\n\n\t\t\treturn (obj: any, vars: VariableMap) => {\n\t\t\t\tconst value = resolveValue(obj, left)\n\t\t\t\tconst other = resolveSymbol(expr, vars)\n\n\t\t\t\tif (typeof value != 'string') {\n\t\t\t\t\tthrow new PredicateError(\n\t\t\t\t\t\t`The field '${left.value}' does not support this expression.`\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\treturn value.toLowerCase() === other.toLowerCase()\n\t\t\t}\n\t\t})\n\t\t.led('WITHIN', 20, ({ left, bp }) => {\n\t\t\tconst type = lexer.next()\n\n\t\t\tif (type.match !== 'circle') {\n\t\t\t\tthrow new PredicateError(\n\t\t\t\t\t`Invalid input '${type.match}', expected circle`\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tlexer.expect('(')\n\t\t\tconst expr = parser.parse({ terminals: [')'] })\n\n\t\t\treturn (obj: any, vars: object) => {\n\t\t\t\tconst value = resolveValue(obj, left)\n\t\t\t\tif (!value) return false\n\n\t\t\t\tconst maxDistance = resolveSymbol(expr[2], vars)\n\t\t\t\tconst distance = haversineDistance(\n\t\t\t\t\t{\n\t\t\t\t\t\tlongitude: value[0],\n\t\t\t\t\t\tlatitude: value[1],\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tlongitude: resolveSymbol(expr[0], vars),\n\t\t\t\t\t\tlatitude: resolveSymbol(expr[1], vars),\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t\treturn distance <= maxDistance\n\t\t\t}\n\t\t})\n\t\t.led('CONTAINS', 20, ({ left, bp }) => {\n\t\t\tconst keyword = lexer.next()\n\n\t\t\tlet expr = parser.parse()\n\t\t\tif (!Array.isArray(expr)) {\n\t\t\t\texpr = [expr]\n\t\t\t}\n\n\t\t\treturn (obj: any, vars: object) => {\n\t\t\t\tconst value = resolveValue(obj, left)\n\n\t\t\t\tif (!Array.isArray(value)) {\n\t\t\t\t\tthrow new PredicateError(\n\t\t\t\t\t\t`The field '${left.value}' does not support this expression.`\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tconst array = expr.map((item: TypeSymbol) => resolveSymbol(item, vars))\n\t\t\t\tif (keyword.type === 'ALL') {\n\t\t\t\t\treturn array.every((item: any) => value.includes(item))\n\t\t\t\t} else {\n\t\t\t\t\treturn array.some((item: any) => value.includes(item))\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\t.build()\n\n\tconst result = parser.parse()\n\n\tif (typeof result !== 'function') {\n\t\tconst lines = predicate.split('\\n')\n\t\tconst column = lines[lines.length - 1].length\n\n\t\tthrow new PredicateError(\n\t\t\t`Unexpected end of input, expected SphereIdentifierChar, comparison ` +\n\t\t\t\t`operator, not, in, contains, is, within or matches` +\n\t\t\t\t` (line ${lines.length}, column ${column})`\n\t\t)\n\t}\n\treturn result\n}\n","import auth from 'basic-auth'\nimport bodyParser from 'body-parser'\nimport express, {\n\ttype NextFunction,\n\ttype Request,\n\ttype Response,\n} from 'express'\nimport { InvalidTokenError } from '@commercetools/platform-sdk'\nimport { CommercetoolsError, InvalidRequestError } from '../exceptions.js'\nimport { InvalidClientError, UnsupportedGrantType } from './errors.js'\nimport { OAuth2Store } from './store.js'\nimport { getBearerToken } from './helpers.js'\nimport { CustomerRepository } from '../repositories/customer.js'\nimport { hashPassword } from '../lib/password.js'\n\ntype AuthRequest = Request & {\n\tcredentials: {\n\t\tclientId: string\n\t\tclientSecret: string\n\t}\n}\n\nexport class OAuth2Server {\n\tstore: OAuth2Store\n\tprivate customerRepository: CustomerRepository\n\n\tconstructor(options: { enabled: boolean; validate: boolean }) {\n\t\tthis.store = new OAuth2Store(options.validate)\n\t}\n\n\tsetCustomerRepository(repository: CustomerRepository) {\n\t\tthis.customerRepository = repository\n\t}\n\n\tcreateRouter() {\n\t\tconst router = express.Router()\n\t\trouter.use(bodyParser.urlencoded({ extended: true }))\n\t\trouter.use(this.validateClientCredentials.bind(this))\n\t\trouter.post('/token', this.tokenHandler.bind(this))\n\t\trouter.post(\n\t\t\t'/:projectKey/customers/token',\n\t\t\tthis.customerTokenHandler.bind(this)\n\t\t)\n\t\trouter.post(\n\t\t\t'/:projectKey/in-store/key=:storeKey/customers/token',\n\t\t\tthis.inStoreCustomerTokenHandler.bind(this)\n\t\t)\n\t\trouter.post(\n\t\t\t'/:projectKey/anonymous/token',\n\t\t\tthis.anonymousTokenHandler.bind(this)\n\t\t)\n\t\treturn router\n\t}\n\n\tcreateMiddleware() {\n\t\treturn async (request: Request, response: Response, next: NextFunction) => {\n\t\t\tconst token = getBearerToken(request)\n\t\t\tif (!token) {\n\t\t\t\tnext(\n\t\t\t\t\tnew CommercetoolsError<InvalidTokenError>(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcode: 'invalid_token',\n\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\t'This endpoint requires an access token. You can get one from the authorization server.',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t401\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tif (!token || !this.store.validateToken(token)) {\n\t\t\t\tnext(\n\t\t\t\t\tnew CommercetoolsError<InvalidTokenError>(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcode: 'invalid_token',\n\t\t\t\t\t\t\tmessage: 'invalid_token',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t401\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tnext()\n\t\t}\n\t}\n\n\tasync validateClientCredentials(\n\t\trequest: AuthRequest,\n\t\tresponse: Response,\n\t\tnext: NextFunction\n\t) {\n\t\tconst authHeader = request.header('Authorization')\n\t\tif (!authHeader) {\n\t\t\treturn next(\n\t\t\t\tnew CommercetoolsError<InvalidClientError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'invalid_client',\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t'Please provide valid client credentials using HTTP Basic Authentication.',\n\t\t\t\t\t},\n\t\t\t\t\t401\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\t\tconst credentials = auth.parse(authHeader)\n\t\tif (!credentials) {\n\t\t\treturn next(\n\t\t\t\tnew CommercetoolsError<InvalidClientError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'invalid_client',\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t'Please provide valid client credentials using HTTP Basic Authentication.',\n\t\t\t\t\t},\n\t\t\t\t\t400\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\n\t\trequest.credentials = {\n\t\t\tclientId: credentials.name,\n\t\t\tclientSecret: credentials.pass,\n\t\t}\n\n\t\tnext()\n\t}\n\n\tasync tokenHandler(\n\t\trequest: AuthRequest,\n\t\tresponse: Response,\n\t\tnext: NextFunction\n\t) {\n\t\tconst grantType = request.query.grant_type || request.body.grant_type\n\t\tif (!grantType) {\n\t\t\treturn next(\n\t\t\t\tnew CommercetoolsError<InvalidRequestError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'invalid_request',\n\t\t\t\t\t\tmessage: 'Missing required parameter: grant_type.',\n\t\t\t\t\t},\n\t\t\t\t\t400\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\n\t\tif (grantType === 'client_credentials') {\n\t\t\tconst token = this.store.getClientToken(\n\t\t\t\trequest.credentials.clientId,\n\t\t\t\trequest.credentials.clientSecret,\n\t\t\t\trequest.query.scope?.toString()\n\t\t\t)\n\t\t\treturn response.status(200).send(token)\n\t\t} else if (grantType === 'refresh_token') {\n\t\t\tconst token = this.store.getClientToken(\n\t\t\t\trequest.credentials.clientId,\n\t\t\t\trequest.credentials.clientSecret,\n\t\t\t\trequest.query.scope?.toString()\n\t\t\t)\n\t\t\treturn response.status(200).send(token)\n\t\t} else {\n\t\t\treturn next(\n\t\t\t\tnew CommercetoolsError<UnsupportedGrantType>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'unsupported_grant_type',\n\t\t\t\t\t\tmessage: `Invalid parameter: grant_type: Invalid grant type: ${grantType}`,\n\t\t\t\t\t},\n\t\t\t\t\t400\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\t}\n\tasync customerTokenHandler(\n\t\trequest: AuthRequest,\n\t\tresponse: Response,\n\t\tnext: NextFunction\n\t) {\n\t\tconst grantType = request.query.grant_type || request.body.grant_type\n\t\tif (!grantType) {\n\t\t\treturn next(\n\t\t\t\tnew CommercetoolsError<InvalidRequestError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'invalid_request',\n\t\t\t\t\t\tmessage: 'Missing required parameter: grant_type.',\n\t\t\t\t\t},\n\t\t\t\t\t400\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\n\t\tif (grantType === 'password') {\n\t\t\tconst username = request.query.username || request.body.username\n\t\t\tconst password = hashPassword(\n\t\t\t\trequest.query.password || request.body.password\n\t\t\t)\n\t\t\tconst scope =\n\t\t\t\trequest.query.scope?.toString() || request.body.scope?.toString()\n\n\t\t\tconst result = this.customerRepository.query(\n\t\t\t\t{ projectKey: request.params.projectKey },\n\t\t\t\t{\n\t\t\t\t\twhere: [`email = \"${username}\"`, `password = \"${password}\"`],\n\t\t\t\t}\n\t\t\t)\n\n\t\t\tif (result.count === 0) {\n\t\t\t\treturn next(\n\t\t\t\t\tnew CommercetoolsError<any>(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcode: 'invalid_customer_account_credentials',\n\t\t\t\t\t\t\tmessage: 'Customer account with the given credentials not found.',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t400\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tconst customer = result.results[0]\n\t\t\tconst token = this.store.getCustomerToken(scope, customer.id)\n\t\t\treturn response.status(200).send(token)\n\t\t}\n\t}\n\n\tasync inStoreCustomerTokenHandler(\n\t\trequest: Request,\n\t\tresponse: Response,\n\t\tnext: NextFunction\n\t) {\n\t\treturn next(\n\t\t\tnew CommercetoolsError<InvalidClientError>(\n\t\t\t\t{\n\t\t\t\t\tcode: 'invalid_client',\n\t\t\t\t\tmessage: 'Not implemented yet in commercetools-mock',\n\t\t\t\t},\n\t\t\t\t401\n\t\t\t)\n\t\t)\n\t}\n\n\tasync anonymousTokenHandler(\n\t\trequest: Request,\n\t\tresponse: Response,\n\t\tnext: NextFunction\n\t) {\n\t\treturn next(\n\t\t\tnew CommercetoolsError<InvalidClientError>(\n\t\t\t\t{\n\t\t\t\t\tcode: 'invalid_client',\n\t\t\t\t\tmessage: 'Not implemented yet in commercetools-mock',\n\t\t\t\t},\n\t\t\t\t401\n\t\t\t)\n\t\t)\n\t}\n}\n","import { randomBytes } from 'crypto'\n\ntype Token = {\n\taccess_token: string\n\ttoken_type: 'Bearer'\n\texpires_in: number\n\tscope: string\n}\n\nexport class OAuth2Store {\n\ttokens: Token[] = []\n\tvalidate = true\n\n\tconstructor(validate = true) {\n\t\tthis.validate = validate\n\t}\n\n\tgetClientToken(clientId: string, clientSecret: string, scope?: string) {\n\t\tconst token: Token = {\n\t\t\taccess_token: randomBytes(16).toString('base64'),\n\t\t\ttoken_type: 'Bearer',\n\t\t\texpires_in: 172800,\n\t\t\tscope: scope || 'todo',\n\t\t}\n\t\tthis.tokens.push(token)\n\t\treturn token\n\t}\n\n\tgetCustomerToken(scope: string, customerId: string) {\n\t\tconst token: Token = {\n\t\t\taccess_token: randomBytes(16).toString('base64'),\n\t\t\ttoken_type: 'Bearer',\n\t\t\texpires_in: 172800,\n\t\t\tscope: scope\n\t\t\t\t? `${scope} custome_id:${customerId}`\n\t\t\t\t: `customer_id: ${customerId}`,\n\t\t}\n\t\tthis.tokens.push(token)\n\t\treturn token\n\t}\n\n\tvalidateToken(token: string) {\n\t\tif (!this.validate) return true\n\n\t\tconst foundToken = this.tokens.find((t) => t.access_token === token)\n\t\tif (foundToken) {\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n}\n","import { Request } from 'express'\n\nexport const getBearerToken = (request: Request): string | undefined => {\n\tconst authHeader = request.header('Authorization')\n\tconst match = authHeader?.match(/^Bearer\\s(?<token>[^\\s]+)$/)\n\tif (match) {\n\t\treturn match.groups?.token\n\t}\n\treturn undefined\n}\n","export const validatePassword = (\n\tclearPassword: string,\n\thashedPassword: string\n) => hashPassword(clearPassword) === hashedPassword\n\nexport const hashPassword = (clearPassword: string) =>\n\tBuffer.from(clearPassword).toString('base64')\n","import { getBaseResourceProperties } from './helpers.js'\nimport { GetParams } from './repositories/abstract.js'\nimport { RepositoryMap } from './repositories/index.js'\nimport { AbstractStorage } from './storage/index.js'\nimport { ResourceMap, ResourceType } from './types.js'\n\nexport class ProjectAPI {\n\tprivate projectKey: string\n\tprivate _storage: AbstractStorage\n\tprivate _repositories: RepositoryMap\n\n\tconstructor(\n\t\tprojectKey: string,\n\t\trepositories: RepositoryMap,\n\t\tstorage: AbstractStorage\n\t) {\n\t\tthis.projectKey = projectKey\n\t\tthis._storage = storage\n\t\tthis._repositories = repositories\n\t}\n\n\tadd<T extends keyof RepositoryMap & keyof ResourceMap>(\n\t\ttypeId: T,\n\t\tresource: ResourceMap[T]\n\t) {\n\t\tconst repository = this._repositories[typeId]\n\t\tif (repository) {\n\t\t\tthis._storage.add(this.projectKey, typeId, {\n\t\t\t\t...getBaseResourceProperties(),\n\t\t\t\t...resource,\n\t\t\t})\n\t\t} else {\n\t\t\tthrow new Error(`Service for ${typeId} not implemented yet`)\n\t\t}\n\t}\n\n\tget<RT extends ResourceType>(\n\t\ttypeId: RT,\n\t\tid: string,\n\t\tparams?: GetParams\n\t): ResourceMap[RT] {\n\t\treturn this._storage.get(\n\t\t\tthis.projectKey,\n\t\t\ttypeId,\n\t\t\tid,\n\t\t\tparams\n\t\t) as ResourceMap[RT]\n\t}\n\n\t// TODO: Not sure if we want to expose this...\n\tgetRepository<RT extends keyof RepositoryMap>(typeId: RT): RepositoryMap[RT] {\n\t\tconst repository = this._repositories[typeId]\n\t\tif (repository !== undefined) {\n\t\t\treturn repository as RepositoryMap[RT]\n\t\t}\n\t\tthrow new Error('No such repository')\n\t}\n}\n","export const copyHeaders = (headers: Headers) => {\n\tconst validHeaders = ['accept', 'host', 'authorization', 'content-type']\n\tconst result: Record<string, string> = {}\n\n\tfor (const [key, value] of headers.entries()) {\n\t\tif (validHeaders.includes(key.toLowerCase())) {\n\t\t\tresult[key] = value\n\t\t}\n\t}\n\n\treturn result\n}\n","export const DEFAULT_API_HOSTNAME = 'https://api.*.commercetools.com'\nexport const DEFAULT_AUTH_HOSTNAME = 'https://auth.*.commercetools.com'\n","import {\n\tAssociateRoleReference,\n\ttype Address,\n\ttype Associate,\n\ttype AssociateDraft,\n\ttype AssociateRoleAssignment,\n\ttype AssociateRoleAssignmentDraft,\n\ttype AssociateRoleKeyReference,\n\ttype AssociateRoleResourceIdentifier,\n\ttype BaseAddress,\n\ttype CentPrecisionMoney,\n\ttype CustomFields,\n\ttype CustomFieldsDraft,\n\ttype HighPrecisionMoney,\n\ttype HighPrecisionMoneyDraft,\n\ttype InvalidJsonInputError,\n\ttype Price,\n\ttype PriceDraft,\n\ttype Reference,\n\ttype ReferencedResourceNotFoundError,\n\ttype ResourceIdentifier,\n\ttype Store,\n\ttype StoreKeyReference,\n\ttype StoreReference,\n\ttype StoreResourceIdentifier,\n\ttype Type,\n\ttype TypedMoney,\n\ttype _Money,\n\tBusinessUnitResourceIdentifier,\n\tBusinessUnitKeyReference,\n\tBusinessUnitReference,\n} from '@commercetools/platform-sdk'\nimport type { Request } from 'express'\nimport { v4 as uuidv4 } from 'uuid'\nimport { CommercetoolsError } from '../exceptions.js'\nimport { AbstractStorage } from '../storage/index.js'\nimport { type RepositoryContext } from './abstract.js'\n\nexport const createAddress = (\n\tbase: BaseAddress | undefined,\n\tprojectKey: string,\n\tstorage: AbstractStorage\n): Address | undefined => {\n\tif (!base) return undefined\n\n\tif (!base?.country) {\n\t\tthrow new Error('Country is required')\n\t}\n\n\treturn {\n\t\t...base,\n\t}\n}\n\nexport const createCustomFields = (\n\tdraft: CustomFieldsDraft | undefined,\n\tprojectKey: string,\n\tstorage: AbstractStorage\n): CustomFields | undefined => {\n\tif (!draft) return undefined\n\tif (!draft.type) return undefined\n\tif (!draft.type.typeId) return undefined\n\tif (!draft.fields) return undefined\n\tconst typeResource = storage.getByResourceIdentifier(\n\t\tprojectKey,\n\t\tdraft.type\n\t) as Type\n\n\tif (!typeResource) {\n\t\tthrow new Error(\n\t\t\t`No type '${draft.type.typeId}' with id=${draft.type.id} or key=${draft.type.key}`\n\t\t)\n\t}\n\n\treturn {\n\t\ttype: {\n\t\t\ttypeId: draft.type.typeId,\n\t\t\tid: typeResource.id,\n\t\t},\n\t\tfields: draft.fields,\n\t}\n}\n\nexport const createPrice = (draft: PriceDraft): Price => ({\n\tid: uuidv4(),\n\tvalue: createTypedMoney(draft.value),\n})\n\nexport const createCentPrecisionMoney = (value: _Money): CentPrecisionMoney => {\n\t// Taken from https://docs.adyen.com/development-resources/currency-codes\n\tlet fractionDigits = 2\n\tswitch (value.currencyCode.toUpperCase()) {\n\t\tcase 'BHD':\n\t\tcase 'IQD':\n\t\tcase 'JOD':\n\t\tcase 'KWD':\n\t\tcase 'LYD':\n\t\tcase 'OMR':\n\t\tcase 'TND':\n\t\t\tfractionDigits = 3\n\t\t\tbreak\n\t\tcase 'CVE':\n\t\tcase 'DJF':\n\t\tcase 'GNF':\n\t\tcase 'IDR':\n\t\tcase 'JPY':\n\t\tcase 'KMF':\n\t\tcase 'KRW':\n\t\tcase 'PYG':\n\t\tcase 'RWF':\n\t\tcase 'UGX':\n\t\tcase 'VND':\n\t\tcase 'VUV':\n\t\tcase 'XAF':\n\t\tcase 'XOF':\n\t\tcase 'XPF':\n\t\t\tfractionDigits = 0\n\t\t\tbreak\n\t\tdefault:\n\t\t\tfractionDigits = 2\n\t}\n\n\tif ((value as HighPrecisionMoney & HighPrecisionMoneyDraft).preciseAmount) {\n\t\tthrow new Error('HighPrecisionMoney not supported')\n\t}\n\n\treturn {\n\t\ttype: 'centPrecision',\n\t\t// centAmont is only optional on HighPrecisionMoney, so this should never\n\t\t// fallback to 0\n\t\tcentAmount: value.centAmount ?? 0,\n\t\tcurrencyCode: value.currencyCode,\n\t\tfractionDigits: fractionDigits,\n\t}\n}\n\nexport const createTypedMoney = (value: _Money): TypedMoney => {\n\tconst result = createCentPrecisionMoney(value)\n\treturn result\n}\n\nexport const resolveStoreReference = (\n\tref: StoreResourceIdentifier | undefined,\n\tprojectKey: string,\n\tstorage: AbstractStorage\n): StoreKeyReference | undefined => {\n\tif (!ref) return undefined\n\tconst resource = storage.getByResourceIdentifier(projectKey, ref)\n\tif (!resource) {\n\t\tthrow new Error('No such store')\n\t}\n\n\tconst store = resource as Store\n\treturn {\n\t\ttypeId: 'store',\n\t\tkey: store.key,\n\t}\n}\n\nexport const getReferenceFromResourceIdentifier = <T extends Reference>(\n\tresourceIdentifier: ResourceIdentifier,\n\tprojectKey: string,\n\tstorage: AbstractStorage\n): T => {\n\tif (!resourceIdentifier.id && !resourceIdentifier.key) {\n\t\tthrow new CommercetoolsError<InvalidJsonInputError>(\n\t\t\t{\n\t\t\t\tcode: 'InvalidJsonInput',\n\t\t\t\tmessage: `${resourceIdentifier.typeId}: ResourceIdentifier requires an 'id' xor a 'key'`,\n\t\t\t\tdetailedErrorMessage: `ResourceIdentifier requires an 'id' xor a 'key'`,\n\t\t\t},\n\t\t\t400\n\t\t)\n\t}\n\n\tconst resource = storage.getByResourceIdentifier(\n\t\tprojectKey,\n\t\tresourceIdentifier\n\t)\n\tif (!resource) {\n\t\tconst errIdentifier = resourceIdentifier.key\n\t\t\t? `key '${resourceIdentifier.key}'`\n\t\t\t: `identifier '${resourceIdentifier.key}'`\n\n\t\tthrow new CommercetoolsError<ReferencedResourceNotFoundError>(\n\t\t\t{\n\t\t\t\tcode: 'ReferencedResourceNotFound',\n\t\t\t\t// @ts-ignore\n\t\t\t\ttypeId: resourceIdentifier.typeId,\n\t\t\t\tmessage: `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\t\t\t},\n\t\t\t400\n\t\t)\n\t}\n\n\treturn {\n\t\ttypeId: resourceIdentifier.typeId,\n\t\tid: resource?.id,\n\t} as unknown as T\n}\n\nexport const getStoreKeyReference = (\n\tid: StoreResourceIdentifier,\n\tprojectKey: string,\n\tstorage: AbstractStorage\n): StoreKeyReference => {\n\tif (id.key) {\n\t\treturn {\n\t\t\ttypeId: 'store',\n\t\t\tkey: id.key,\n\t\t}\n\t}\n\tconst value = getReferenceFromResourceIdentifier<StoreReference>(\n\t\tid,\n\t\tprojectKey,\n\t\tstorage\n\t)\n\n\tif (!value.obj?.key) {\n\t\tthrow new Error('No store found for reference')\n\t}\n\treturn {\n\t\ttypeId: 'store',\n\t\tkey: value.obj?.key,\n\t}\n}\n\nexport const getRepositoryContext = (request: Request): RepositoryContext => ({\n\tprojectKey: request.params.projectKey,\n\tstoreKey: request.params.storeKey,\n})\n\nexport const createAssociate = (\n\ta: AssociateDraft,\n\tprojectKey: string,\n\tstorage: AbstractStorage\n): Associate | undefined => {\n\tif (!a) return undefined\n\n\tif (!a.associateRoleAssignments) {\n\t\tthrow new Error('AssociateRoleAssignments is required')\n\t}\n\n\treturn {\n\t\tcustomer: getReferenceFromResourceIdentifier(\n\t\t\ta.customer,\n\t\t\tprojectKey,\n\t\t\tstorage\n\t\t),\n\t\tassociateRoleAssignments: a.associateRoleAssignments?.map(\n\t\t\t(a: AssociateRoleAssignmentDraft): AssociateRoleAssignment => ({\n\t\t\t\tassociateRole: getAssociateRoleKeyReference(\n\t\t\t\t\ta.associateRole,\n\t\t\t\t\tprojectKey,\n\t\t\t\t\tstorage\n\t\t\t\t),\n\t\t\t\tinheritance: a.inheritance as string,\n\t\t\t})\n\t\t),\n\t\troles: a.roles as string[],\n\t}\n}\n\nexport const getAssociateRoleKeyReference = (\n\tid: AssociateRoleResourceIdentifier,\n\tprojectKey: string,\n\tstorage: AbstractStorage\n): AssociateRoleKeyReference => {\n\tif (id.key) {\n\t\treturn {\n\t\t\ttypeId: 'associate-role',\n\t\t\tkey: id.key,\n\t\t}\n\t}\n\n\tconst value = getReferenceFromResourceIdentifier<AssociateRoleReference>(\n\t\tid,\n\t\tprojectKey,\n\t\tstorage\n\t)\n\n\tif (!value.obj?.key) {\n\t\tthrow new Error('No associate-role found for reference')\n\t}\n\n\treturn {\n\t\ttypeId: 'associate-role',\n\t\tkey: value.obj?.key,\n\t}\n}\n\nexport const getBusinessUnitKeyReference = (\n\tid: BusinessUnitResourceIdentifier,\n\tprojectKey: string,\n\tstorage: AbstractStorage\n): BusinessUnitKeyReference => {\n\tif (id.key) {\n\t\treturn {\n\t\t\ttypeId: 'business-unit',\n\t\t\tkey: id.key,\n\t\t}\n\t}\n\n\tconst value = getReferenceFromResourceIdentifier<BusinessUnitReference>(\n\t\tid,\n\t\tprojectKey,\n\t\tstorage\n\t)\n\n\tif (!value.obj?.key) {\n\t\tthrow new Error('No business-unit found for reference')\n\t}\n\n\treturn {\n\t\ttypeId: 'business-unit',\n\t\tkey: value.obj?.key,\n\t}\n}\n","import type { Update } from '@commercetools/platform-sdk'\nimport { Request, Response, Router } from 'express'\nimport { getRepositoryContext } from '../repositories/helpers.js'\nimport { ProjectRepository } from '../repositories/project.js'\n\nexport class ProjectService {\n\tpublic repository: ProjectRepository\n\n\tconstructor(parent: Router, repository: ProjectRepository) {\n\t\tthis.repository = repository\n\t\tthis.registerRoutes(parent)\n\t}\n\n\tregisterRoutes(parent: Router) {\n\t\tparent.get('', this.get.bind(this))\n\t\tparent.post('', this.post.bind(this))\n\t}\n\n\tget(request: Request, response: Response) {\n\t\tconst project = this.repository.get(getRepositoryContext(request))\n\t\treturn response.status(200).send(project)\n\t}\n\n\tpost(request: Request, response: Response) {\n\t\tconst updateRequest: Update = request.body\n\t\tconst project = this.repository.get(getRepositoryContext(request))\n\n\t\tif (!project) {\n\t\t\treturn response.status(404).send({})\n\t\t}\n\n\t\tconst updatedResource = this.repository.processUpdateActions(\n\t\t\tgetRepositoryContext(request),\n\t\t\tproject,\n\t\t\tupdateRequest.version,\n\t\t\tupdateRequest.actions\n\t\t)\n\n\t\treturn response.status(200).send(updatedResource)\n\t}\n}\n","import type {\n\tBaseResource,\n\tProject,\n\tResourceNotFoundError,\n\tUpdateAction,\n} from '@commercetools/platform-sdk'\nimport deepEqual from 'deep-equal'\nimport { CommercetoolsError } from '../exceptions.js'\nimport { cloneObject } from '../helpers.js'\nimport { AbstractStorage } from '../storage/index.js'\nimport { ResourceMap, ResourceType, ShallowWritable } from './../types.js'\nimport { checkConcurrentModification } from './errors.js'\n\nexport type QueryParams = {\n\texpand?: string[]\n\twhere?: string[]\n\toffset?: number\n\tlimit?: number\n}\n\nexport type GetParams = {\n\texpand?: string[]\n}\n\nexport type RepositoryContext = {\n\tprojectKey: string\n\tstoreKey?: string\n}\n\nexport abstract class AbstractRepository<R extends BaseResource | Project> {\n\tprotected _storage: AbstractStorage\n\tprotected actions: Partial<\n\t\tRecord<\n\t\t\tany,\n\t\t\t(context: RepositoryContext, resource: any, action: any) => void\n\t\t>\n\t> = {}\n\n\tconstructor(storage: AbstractStorage) {\n\t\tthis._storage = storage\n\t}\n\n\tabstract saveNew({ projectKey }: RepositoryContext, resource: R): void\n\n\tabstract saveUpdate(\n\t\t{ projectKey }: RepositoryContext,\n\t\tversion: number,\n\t\tresource: R\n\t): void\n\n\tprocessUpdateActions(\n\t\tcontext: RepositoryContext,\n\t\tresource: R,\n\t\tversion: number,\n\t\tactions: UpdateAction[]\n\t): R {\n\t\t// Deep-copy\n\t\tconst updatedResource = cloneObject(resource) as ShallowWritable<R>\n\t\tconst identifier = (resource as BaseResource).id\n\t\t\t? (resource as BaseResource).id\n\t\t\t: (resource as Project).key\n\n\t\tactions.forEach((action) => {\n\t\t\tconst updateFunc = this.actions[action.action]\n\n\t\t\tif (!updateFunc) {\n\t\t\t\tconsole.error(`No mock implemented for update action ${action.action}`)\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`No mock implemented for update action ${action.action}`\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tconst beforeUpdate = cloneObject(resource)\n\t\t\tupdateFunc(context, updatedResource, action)\n\n\t\t\t// Check if the object is updated. We need to increase the version of\n\t\t\t// an object per action which does an actual modification.\n\t\t\t// This isn't the most performant method to do this (the update action\n\t\t\t// should return a flag) but for now the easiest.\n\t\t\tif (!deepEqual(beforeUpdate, updatedResource)) {\n\t\t\t\t// We only check the version when there is an actual modification to\n\t\t\t\t// be stored.\n\t\t\t\tcheckConcurrentModification(resource.version, version, identifier)\n\n\t\t\t\tupdatedResource.version += 1\n\t\t\t}\n\t\t})\n\n\t\t// If all actions succeeded we write the new version\n\t\t// to the storage.\n\t\tif (resource.version != updatedResource.version) {\n\t\t\tthis.saveUpdate(context, version, updatedResource)\n\t\t}\n\n\t\tconst result = this.postProcessResource(updatedResource)\n\t\tif (!result) {\n\t\t\tthrow new Error('invalid post process action')\n\t\t}\n\t\treturn result\n\t}\n\n\tabstract postProcessResource(resource: any): any\n}\n\nexport abstract class AbstractResourceRepository<\n\tT extends ResourceType,\n> extends AbstractRepository<ResourceMap[T]> {\n\tabstract create(context: RepositoryContext, draft: any): ResourceMap[T]\n\tabstract getTypeId(): T\n\n\tconstructor(storage: AbstractStorage) {\n\t\tsuper(storage)\n\t}\n\n\tpostProcessResource(resource: ResourceMap[T]): ResourceMap[T] {\n\t\treturn resource\n\t}\n\n\tquery(context: RepositoryContext, params: QueryParams = {}) {\n\t\tconst result = this._storage.query(context.projectKey, this.getTypeId(), {\n\t\t\texpand: params.expand,\n\t\t\twhere: params.where,\n\t\t\toffset: params.offset,\n\t\t\tlimit: params.limit,\n\t\t})\n\n\t\t// @ts-ignore\n\t\tresult.results = result.results.map(this.postProcessResource)\n\t\treturn result\n\t}\n\n\tget(\n\t\tcontext: RepositoryContext,\n\t\tid: string,\n\t\tparams: GetParams = {}\n\t): ResourceMap[T] | null {\n\t\tconst resource = this._storage.get(\n\t\t\tcontext.projectKey,\n\t\t\tthis.getTypeId(),\n\t\t\tid,\n\t\t\tparams\n\t\t)\n\t\treturn resource ? this.postProcessResource(resource) : null\n\t}\n\n\tgetByKey(\n\t\tcontext: RepositoryContext,\n\t\tkey: string,\n\t\tparams: GetParams = {}\n\t): ResourceMap[T] | null {\n\t\tconst resource = this._storage.getByKey(\n\t\t\tcontext.projectKey,\n\t\t\tthis.getTypeId(),\n\t\t\tkey,\n\t\t\tparams\n\t\t)\n\t\treturn resource ? this.postProcessResource(resource) : null\n\t}\n\n\tdelete(\n\t\tcontext: RepositoryContext,\n\t\tid: string,\n\t\tparams: GetParams = {}\n\t): ResourceMap[T] | null {\n\t\tconst resource = this._storage.delete(\n\t\t\tcontext.projectKey,\n\t\t\tthis.getTypeId(),\n\t\t\tid,\n\t\t\tparams\n\t\t)\n\t\treturn resource ? this.postProcessResource(resource) : null\n\t}\n\n\tsaveNew(\n\t\tcontext: RepositoryContext,\n\t\tresource: ShallowWritable<ResourceMap[T]>\n\t) {\n\t\tresource.version = 1\n\t\tthis._storage.add(context.projectKey, this.getTypeId(), resource as any)\n\t}\n\n\tsaveUpdate(\n\t\tcontext: RepositoryContext,\n\t\tversion: number,\n\t\tresource: ShallowWritable<ResourceMap[T]>\n\t) {\n\t\t// Check if the resource still exists.\n\t\tconst current = this._storage.get(\n\t\t\tcontext.projectKey,\n\t\t\tthis.getTypeId(),\n\t\t\tresource.id\n\t\t)\n\t\tif (!current) {\n\t\t\tthrow new CommercetoolsError<ResourceNotFoundError>(\n\t\t\t\t{\n\t\t\t\t\tcode: 'ResourceNotFound',\n\t\t\t\t\tmessage: 'Resource not found while updating',\n\t\t\t\t},\n\t\t\t\t400\n\t\t\t)\n\t\t}\n\n\t\tcheckConcurrentModification(current.version, version, resource.id)\n\n\t\tif (current.version === resource.version) {\n\t\t\tthrow new Error('Internal error: no changes to save')\n\t\t}\n\t\tresource.lastModifiedAt = new Date().toISOString()\n\n\t\tthis._storage.add(context.projectKey, this.getTypeId(), resource as any)\n\n\t\treturn resource\n\t}\n}\n","import { type ConcurrentModificationError } from '@commercetools/platform-sdk'\nimport { CommercetoolsError } from '../exceptions.js'\n\nexport const checkConcurrentModification = (\n\tcurrentVersion: number,\n\texpectedVersion: number,\n\tidentifier: string\n) => {\n\tif (currentVersion === expectedVersion) return\n\tconsole.error(\n\t\t`Object ${identifier} has a different version than expected. Expected: ${expectedVersion} - Actual: ${currentVersion}.`\n\t)\n\n\tthrow new CommercetoolsError<ConcurrentModificationError>(\n\t\t{\n\t\t\tmessage: `Object ${identifier} has a different version than expected. Expected: ${expectedVersion} - Actual: ${currentVersion}.`,\n\t\t\tcurrentVersion: currentVersion,\n\t\t\tcode: 'ConcurrentModification',\n\t\t},\n\t\t409\n\t)\n}\n","import type {\n\tAssociateRole,\n\tAssociateRoleAddPermissionAction,\n\tAssociateRoleChangeBuyerAssignableAction,\n\tAssociateRoleDraft,\n\tAssociateRoleRemovePermissionAction,\n\tAssociateRoleSetCustomFieldAction,\n\tAssociateRoleSetNameAction,\n\tAssociateRoleSetPermissionsAction,\n} from '@commercetools/platform-sdk'\nimport {\n\tAbstractResourceRepository,\n\ttype RepositoryContext,\n} from './abstract.js'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport { createCustomFields } from './helpers.js'\nimport { Writable } from '../types.js'\n\nexport class AssociateRoleRepository extends AbstractResourceRepository<'associate-role'> {\n\tgetTypeId() {\n\t\treturn 'associate-role' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: AssociateRoleDraft): AssociateRole {\n\t\tconst resource: AssociateRole = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tkey: draft.key,\n\t\t\tname: draft.name,\n\t\t\tbuyerAssignable: draft.buyerAssignable || false,\n\t\t\tpermissions: draft.permissions || [],\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t}\n\n\t\tthis.saveNew(context, resource)\n\n\t\treturn resource\n\t}\n\n\tactions = {\n\t\tsetName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<AssociateRole>,\n\t\t\t{ name }: AssociateRoleSetNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\t\tsetPermissions: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<AssociateRole>,\n\t\t\t{ permissions }: AssociateRoleSetPermissionsAction\n\t\t) => {\n\t\t\tresource.permissions = permissions || []\n\t\t},\n\t\tsetBuyerAssignable: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<AssociateRole>,\n\t\t\t{ buyerAssignable }: AssociateRoleChangeBuyerAssignableAction\n\t\t) => {\n\t\t\tresource.buyerAssignable = buyerAssignable\n\t\t},\n\t\tchangeBuyerAssignable: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<AssociateRole>,\n\t\t\t{ buyerAssignable }: AssociateRoleChangeBuyerAssignableAction\n\t\t) => {\n\t\t\tresource.buyerAssignable = buyerAssignable\n\t\t},\n\t\tsetCustomFields: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<AssociateRole>,\n\t\t\t{ name, value }: AssociateRoleSetCustomFieldAction\n\t\t) => {\n\t\t\tif (!resource.custom) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (value === null) {\n\t\t\t\tdelete resource.custom.fields[name]\n\t\t\t} else {\n\t\t\t\tresource.custom.fields[name] = value\n\t\t\t}\n\t\t},\n\t\taddPermission: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<AssociateRole>,\n\t\t\t{ permission }: AssociateRoleAddPermissionAction\n\t\t) => {\n\t\t\tif (!resource.permissions) {\n\t\t\t\tresource.permissions = [permission]\n\t\t\t} else {\n\t\t\t\tresource.permissions.push(permission)\n\t\t\t}\n\t\t},\n\t\tremovePermission: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<AssociateRole>,\n\t\t\t{ permission }: AssociateRoleRemovePermissionAction\n\t\t) => {\n\t\t\tif (!resource.permissions) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tresource.permissions = resource.permissions.filter((p) => {\n\t\t\t\tp !== permission\n\t\t\t})\n\t\t},\n\t}\n}\n","import type {\n\tAttributeGroup,\n\tAttributeGroupChangeNameAction,\n\tAttributeGroupDraft,\n\tAttributeGroupSetAttributesAction,\n\tAttributeGroupSetDescriptionAction,\n\tAttributeGroupSetKeyAction,\n} from '@commercetools/platform-sdk'\nimport {\n\tAbstractResourceRepository,\n\ttype RepositoryContext,\n} from './abstract.js'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport { Writable } from '../types.js'\n\nexport class AttributeGroupRepository extends AbstractResourceRepository<'attribute-group'> {\n\tgetTypeId() {\n\t\treturn 'attribute-group' as const\n\t}\n\n\tcreate(\n\t\tcontext: RepositoryContext,\n\t\tdraft: AttributeGroupDraft\n\t): AttributeGroup {\n\t\tconst resource: AttributeGroup = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tname: draft.name,\n\t\t\tdescription: draft.description,\n\t\t\tkey: draft.key,\n\t\t\tattributes: draft.attributes,\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tactions = {\n\t\tsetAttributes: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<AttributeGroup>,\n\t\t\t{ attributes }: AttributeGroupSetAttributesAction\n\t\t) => {\n\t\t\tresource.attributes = attributes\n\t\t},\n\t\tchangeName: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<AttributeGroup>,\n\t\t\t{ name }: AttributeGroupChangeNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\t\tsetDescription: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<AttributeGroup>,\n\t\t\t{ description }: AttributeGroupSetDescriptionAction\n\t\t) => {\n\t\t\tresource.description = description\n\t\t},\n\t\tsetKey: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<AttributeGroup>,\n\t\t\t{ key }: AttributeGroupSetKeyAction\n\t\t) => {\n\t\t\tresource.key = key\n\t\t},\n\t}\n}\n","import {\n\ttype Associate,\n\ttype BusinessUnit,\n\ttype BusinessUnitAddAddressAction,\n\ttype BusinessUnitAddAssociateAction,\n\ttype BusinessUnitAddStoreAction,\n\ttype BusinessUnitChangeAddressAction,\n\ttype BusinessUnitChangeNameAction,\n\ttype BusinessUnitChangeParentUnitAction,\n\ttype BusinessUnitDraft,\n\ttype BusinessUnitSetAssociatesAction,\n\ttype BusinessUnitSetContactEmailAction,\n\ttype BusinessUnitSetStoreModeAction,\n\ttype Company,\n\ttype Division,\n\tBusinessUnitChangeStatusAction,\n\tCompanyDraft,\n\tDivisionDraft,\n} from '@commercetools/platform-sdk'\nimport {\n\tAbstractResourceRepository,\n\ttype RepositoryContext,\n} from './abstract.js'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport {\n\tcreateAddress,\n\tcreateAssociate,\n\tcreateCustomFields,\n\tgetBusinessUnitKeyReference,\n\tgetStoreKeyReference,\n} from './helpers.js'\nimport { Writable } from '../types.js'\n\nexport class BusinessUnitRepository extends AbstractResourceRepository<'business-unit'> {\n\tgetTypeId() {\n\t\treturn 'business-unit' as const\n\t}\n\n\tprivate _isCompanyDraft(draft: BusinessUnitDraft): draft is CompanyDraft {\n\t\treturn draft.unitType === 'Company'\n\t}\n\n\tprivate _isDivisionDraft(draft: BusinessUnitDraft): draft is DivisionDraft {\n\t\treturn draft.unitType === 'Division'\n\t}\n\n\tcreate(context: RepositoryContext, draft: BusinessUnitDraft): BusinessUnit {\n\t\tconst resource = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tkey: draft.key,\n\t\t\tstatus: draft.status,\n\t\t\tstores: draft.stores?.map((s) =>\n\t\t\t\tgetStoreKeyReference(s, context.projectKey, this._storage)\n\t\t\t),\n\t\t\tstoreMode: draft.storeMode,\n\t\t\tname: draft.name,\n\t\t\tcontactEmail: draft.contactEmail,\n\t\t\taddresses: draft.addresses?.map((a) =>\n\t\t\t\tcreateAddress(a, context.projectKey, this._storage)\n\t\t\t),\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t\tshippingAddressIds: draft.shippingAddresses,\n\t\t\tdefaultShippingAddressId: draft.defaultShippingAddress,\n\t\t\tbillingAddressIds: draft.billingAddresses,\n\t\t\tassociateMode: draft.associateMode,\n\t\t\tassociates: draft.associates?.map((a) =>\n\t\t\t\tcreateAssociate(a, context.projectKey, this._storage)\n\t\t\t),\n\t\t}\n\n\t\tif (this._isDivisionDraft(draft)) {\n\t\t\tconst division = {\n\t\t\t\t...resource,\n\t\t\t\tparentUnit: getBusinessUnitKeyReference(\n\t\t\t\t\tdraft.parentUnit,\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\tthis._storage\n\t\t\t\t),\n\t\t\t} as Division\n\n\t\t\tthis.saveNew(context, division)\n\t\t\treturn division\n\t\t} else if (this._isCompanyDraft(draft)) {\n\t\t\tconst company = resource as Company\n\n\t\t\tthis.saveNew(context, company)\n\t\t\treturn company\n\t\t}\n\n\t\tthrow new Error('Invalid business unit type')\n\t}\n\n\tactions = {\n\t\taddAddress: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<BusinessUnit>,\n\t\t\t{ address }: BusinessUnitAddAddressAction\n\t\t) => {\n\t\t\tconst newAddress = createAddress(\n\t\t\t\taddress,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t)\n\t\t\tif (newAddress) {\n\t\t\t\tresource.addresses.push(newAddress)\n\t\t\t}\n\t\t},\n\t\taddAssociate: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<BusinessUnit>,\n\t\t\t{ associate }: BusinessUnitAddAssociateAction\n\t\t) => {\n\t\t\tconst newAssociate = createAssociate(\n\t\t\t\tassociate,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t)\n\t\t\tif (newAssociate) {\n\t\t\t\tresource.associates.push(newAssociate)\n\t\t\t}\n\t\t},\n\t\tsetAssociates: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<BusinessUnit>,\n\t\t\t{ associates }: BusinessUnitSetAssociatesAction\n\t\t) => {\n\t\t\tconst newAssociates = associates\n\t\t\t\t.map((a) => createAssociate(a, context.projectKey, this._storage))\n\t\t\t\t.filter((a): a is Writable<Associate> => a !== undefined)\n\t\t\tresource.associates = newAssociates || undefined\n\t\t},\n\t\tsetContactEmail: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<BusinessUnit>,\n\t\t\t{ contactEmail }: BusinessUnitSetContactEmailAction\n\t\t) => {\n\t\t\tresource.contactEmail = contactEmail\n\t\t},\n\t\tsetStoreMode: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<BusinessUnit>,\n\t\t\t{ storeMode }: BusinessUnitSetStoreModeAction\n\t\t) => {\n\t\t\tresource.storeMode = storeMode\n\t\t},\n\t\tchangeAssociateMode: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<BusinessUnit>,\n\t\t\t{ storeMode }: BusinessUnitSetStoreModeAction\n\t\t) => {\n\t\t\tresource.associateMode = storeMode\n\t\t},\n\t\tchangeName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<BusinessUnit>,\n\t\t\t{ name }: BusinessUnitChangeNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\t\tchangeAddress: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<BusinessUnit>,\n\t\t\t{ address }: BusinessUnitChangeAddressAction\n\t\t) => {\n\t\t\tconst newAddress = createAddress(\n\t\t\t\taddress,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t)\n\t\t\tif (newAddress) {\n\t\t\t\tresource.addresses.push(newAddress)\n\t\t\t}\n\t\t},\n\t\taddStore: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<BusinessUnit>,\n\t\t\t{ store }: BusinessUnitAddStoreAction\n\t\t) => {\n\t\t\tconst newStore = getStoreKeyReference(\n\t\t\t\tstore,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t)\n\t\t\tif (newStore) {\n\t\t\t\tif (!resource.stores) {\n\t\t\t\t\tresource.stores = []\n\t\t\t\t}\n\n\t\t\t\tresource.stores.push(newStore)\n\t\t\t}\n\t\t},\n\t\tchangeParentUnit: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<BusinessUnit>,\n\t\t\t{ parentUnit }: BusinessUnitChangeParentUnitAction\n\t\t) => {\n\t\t\tresource.parentUnit = getBusinessUnitKeyReference(\n\t\t\t\tparentUnit,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t)\n\t\t},\n\t\tchangeStatus: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<BusinessUnit>,\n\t\t\t{ status }: BusinessUnitChangeStatusAction\n\t\t) => {\n\t\t\tresource.status = status\n\t\t},\n\t}\n}\n","import type {\n\tAddress,\n\tAddressDraft,\n\tCart,\n\tCartAddLineItemAction,\n\tCartChangeLineItemQuantityAction,\n\tCartAddItemShippingAddressAction,\n\tCartSetLineItemShippingDetailsAction,\n\tCartDraft,\n\tCartRemoveLineItemAction,\n\tCartSetBillingAddressAction,\n\tCartSetCountryAction,\n\tCartSetCustomerEmailAction,\n\tCartSetCustomFieldAction,\n\tCartSetCustomTypeAction,\n\tCartSetLocaleAction,\n\tCartSetShippingAddressAction,\n\tCartSetShippingMethodAction,\n\tCustomFields,\n\tGeneralError,\n\tLineItem,\n\tLineItemDraft,\n\tItemShippingDetails,\n\tPrice,\n\tProduct,\n\tProductPagedQueryResponse,\n\tCartRemoveDiscountCodeAction,\n\tProductVariant,\n} from '@commercetools/platform-sdk'\nimport { v4 as uuidv4 } from 'uuid'\nimport { CommercetoolsError } from '../exceptions.js'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport {\n\tAbstractResourceRepository,\n\ttype RepositoryContext,\n} from './abstract.js'\nimport { createAddress, createCustomFields } from './helpers.js'\n\nexport class CartRepository extends AbstractResourceRepository<'cart'> {\n\tgetTypeId() {\n\t\treturn 'cart' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: CartDraft): Cart {\n\t\tconst lineItems =\n\t\t\tdraft.lineItems?.map((draftLineItem) =>\n\t\t\t\tthis.draftLineItemtoLineItem(\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\tdraftLineItem,\n\t\t\t\t\tdraft.currency,\n\t\t\t\t\tdraft.country\n\t\t\t\t)\n\t\t\t) ?? []\n\n\t\tconst resource: Writable<Cart> = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tcartState: 'Active',\n\t\t\tcountry: draft.country,\n\t\t\tcustomLineItems: [],\n\t\t\tdirectDiscounts: [],\n\t\t\tdiscountCodes: [],\n\t\t\tinventoryMode: 'None',\n\t\t\titemShippingAddresses: [],\n\t\t\tlineItems,\n\t\t\tlocale: draft.locale,\n\t\t\ttaxCalculationMode: draft.taxCalculationMode ?? 'LineItemLevel',\n\t\t\ttaxMode: draft.taxMode ?? 'Platform',\n\t\t\ttaxRoundingMode: draft.taxRoundingMode ?? 'HalfEven',\n\t\t\ttotalPrice: {\n\t\t\t\ttype: 'centPrecision',\n\t\t\t\tcentAmount: 0,\n\t\t\t\tcurrencyCode: draft.currency,\n\t\t\t\tfractionDigits: 0,\n\t\t\t},\n\t\t\tshippingMode: 'Single',\n\t\t\tshipping: [],\n\t\t\torigin: draft.origin ?? 'Customer',\n\t\t\trefusedGifts: [],\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t}\n\t\tresource.totalPrice.centAmount = calculateCartTotalPrice(resource)\n\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tgetActiveCart(projectKey: string): Cart | undefined {\n\t\t// Get first active cart\n\t\tconst results = this._storage.query(projectKey, this.getTypeId(), {\n\t\t\twhere: [`cartState=\"Active\"`],\n\t\t})\n\t\tif (results.count > 0) {\n\t\t\treturn results.results[0] as Cart\n\t\t}\n\n\t\treturn\n\t}\n\n\tactions = {\n\t\taddLineItem: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Cart>,\n\t\t\t{ productId, variantId, sku, quantity = 1 }: CartAddLineItemAction\n\t\t) => {\n\t\t\tlet product: Product | null = null\n\n\t\t\tif (productId && variantId) {\n\t\t\t\t// Fetch product and variant by ID\n\t\t\t\tproduct = this._storage.get(\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\t'product',\n\t\t\t\t\tproductId,\n\t\t\t\t\t{}\n\t\t\t\t)\n\t\t\t} else if (sku) {\n\t\t\t\t// Fetch product and variant by SKU\n\t\t\t\tconst items = this._storage.query(context.projectKey, 'product', {\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t`masterData(current(masterVariant(sku=\"${sku}\"))) or masterData(current(variants(sku=\"${sku}\")))`,\n\t\t\t\t\t],\n\t\t\t\t}) as ProductPagedQueryResponse\n\n\t\t\t\tif (items.count === 1) {\n\t\t\t\t\tproduct = items.results[0]\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!product) {\n\t\t\t\t// Check if product is found\n\t\t\t\tthrow new CommercetoolsError<GeneralError>({\n\t\t\t\t\tcode: 'General',\n\t\t\t\t\tmessage: sku\n\t\t\t\t\t\t? `A product containing a variant with SKU '${sku}' not found.`\n\t\t\t\t\t\t: `A product with ID '${productId}' not found.`,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// Find matching variant\n\t\t\tconst variant: ProductVariant | undefined = [\n\t\t\t\tproduct.masterData.current.masterVariant,\n\t\t\t\t...product.masterData.current.variants,\n\t\t\t].find((x) => {\n\t\t\t\tif (sku) return x.sku === sku\n\t\t\t\tif (variantId) return x.id === variantId\n\t\t\t\treturn false\n\t\t\t})\n\n\t\t\tif (!variant) {\n\t\t\t\t// Check if variant is found\n\t\t\t\tthrow new CommercetoolsError<GeneralError>({\n\t\t\t\t\tcode: 'General',\n\t\t\t\t\tmessage: sku\n\t\t\t\t\t\t? `A variant with SKU '${sku}' for product '${product.id}' not found.`\n\t\t\t\t\t\t: `A variant with ID '${variantId}' for product '${product.id}' not found.`,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tconst alreadyAdded = resource.lineItems.some(\n\t\t\t\t(x) => x.productId === product?.id && x.variant.id === variant?.id\n\t\t\t)\n\t\t\tif (alreadyAdded) {\n\t\t\t\t// increase quantity and update total price\n\t\t\t\tresource.lineItems.forEach((x) => {\n\t\t\t\t\tif (x.productId === product?.id && x.variant.id === variant?.id) {\n\t\t\t\t\t\tx.quantity += quantity\n\t\t\t\t\t\tx.totalPrice.centAmount = calculateLineItemTotalPrice(x)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\t// add line item\n\t\t\t\tif (!variant.prices?.length) {\n\t\t\t\t\tthrow new CommercetoolsError<GeneralError>({\n\t\t\t\t\t\tcode: 'General',\n\t\t\t\t\t\tmessage: `A product with ID '${productId}' doesn't have any prices.`,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tconst currency = resource.totalPrice.currencyCode\n\n\t\t\t\tconst price = selectPrice({\n\t\t\t\t\tprices: variant.prices,\n\t\t\t\t\tcurrency,\n\t\t\t\t\tcountry: resource.country,\n\t\t\t\t})\n\t\t\t\tif (!price) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`No valid price found for ${productId} for country ${resource.country} and currency ${currency}`\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tresource.lineItems.push({\n\t\t\t\t\tid: uuidv4(),\n\t\t\t\t\tproductId: product.id,\n\t\t\t\t\tproductKey: product.key,\n\t\t\t\t\tproductSlug: product.masterData.current.slug,\n\t\t\t\t\tproductType: product.productType,\n\t\t\t\t\tname: product.masterData.current.name,\n\t\t\t\t\tvariant,\n\t\t\t\t\tprice: price,\n\t\t\t\t\ttaxedPricePortions: [],\n\t\t\t\t\tperMethodTaxRate: [],\n\t\t\t\t\ttotalPrice: {\n\t\t\t\t\t\t...price.value,\n\t\t\t\t\t\ttype: 'centPrecision',\n\t\t\t\t\t\tcentAmount: price.value.centAmount * quantity,\n\t\t\t\t\t},\n\t\t\t\t\tquantity,\n\t\t\t\t\tdiscountedPricePerQuantity: [],\n\t\t\t\t\tlineItemMode: 'Standard',\n\t\t\t\t\tpriceMode: 'Platform',\n\t\t\t\t\tstate: [],\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// Update cart total price\n\t\t\tresource.totalPrice.centAmount = calculateCartTotalPrice(resource)\n\t\t},\n\t\taddItemShippingAddress: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Cart>,\n\t\t\t{ action, address }: CartAddItemShippingAddressAction\n\t\t) => {\n\t\t\tconst newAddress = createAddress(\n\t\t\t\taddress,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t)\n\t\t\tif (newAddress) {\n\t\t\t\tresource.itemShippingAddresses.push(newAddress)\n\t\t\t}\n\t\t},\n\t\tchangeLineItemQuantity: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Cart>,\n\t\t\t{ lineItemId, lineItemKey, quantity }: CartChangeLineItemQuantityAction\n\t\t) => {\n\t\t\tlet lineItem: Writable<LineItem> | undefined\n\n\t\t\tif (lineItemId) {\n\t\t\t\tlineItem = resource.lineItems.find((x) => x.id === lineItemId)\n\t\t\t\tif (!lineItem) {\n\t\t\t\t\tthrow new CommercetoolsError<GeneralError>({\n\t\t\t\t\t\tcode: 'General',\n\t\t\t\t\t\tmessage: `A line item with ID '${lineItemId}' not found.`,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t} else if (lineItemKey) {\n\t\t\t\tlineItem = resource.lineItems.find((x) => x.id === lineItemId)\n\t\t\t\tif (!lineItem) {\n\t\t\t\t\tthrow new CommercetoolsError<GeneralError>({\n\t\t\t\t\t\tcode: 'General',\n\t\t\t\t\t\tmessage: `A line item with Key '${lineItemKey}' not found.`,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthrow new CommercetoolsError<GeneralError>({\n\t\t\t\t\tcode: 'General',\n\t\t\t\t\tmessage: `Either lineItemid or lineItemKey needs to be provided.`,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tif (quantity === 0) {\n\t\t\t\t// delete line item\n\t\t\t\tresource.lineItems = resource.lineItems.filter(\n\t\t\t\t\t(x) => x.id !== lineItemId\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tresource.lineItems.forEach((x) => {\n\t\t\t\t\tif (x.id === lineItemId && quantity) {\n\t\t\t\t\t\tx.quantity = quantity\n\t\t\t\t\t\tx.totalPrice.centAmount = calculateLineItemTotalPrice(x)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// Update cart total price\n\t\t\tresource.totalPrice.centAmount = calculateCartTotalPrice(resource)\n\t\t},\n\t\tremoveLineItem: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Cart>,\n\t\t\t{ lineItemId, quantity }: CartRemoveLineItemAction\n\t\t) => {\n\t\t\tconst lineItem = resource.lineItems.find((x) => x.id === lineItemId)\n\t\t\tif (!lineItem) {\n\t\t\t\t// Check if product is found\n\t\t\t\tthrow new CommercetoolsError<GeneralError>({\n\t\t\t\t\tcode: 'General',\n\t\t\t\t\tmessage: `A line item with ID '${lineItemId}' not found.`,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tconst shouldDelete = !quantity || quantity >= lineItem.quantity\n\t\t\tif (shouldDelete) {\n\t\t\t\t// delete line item\n\t\t\t\tresource.lineItems = resource.lineItems.filter(\n\t\t\t\t\t(x) => x.id !== lineItemId\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\t// decrease quantity and update total price\n\t\t\t\tresource.lineItems.forEach((x) => {\n\t\t\t\t\tif (x.id === lineItemId && quantity) {\n\t\t\t\t\t\tx.quantity -= quantity\n\t\t\t\t\t\tx.totalPrice.centAmount = calculateLineItemTotalPrice(x)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// Update cart total price\n\t\t\tresource.totalPrice.centAmount = calculateCartTotalPrice(resource)\n\t\t},\n\t\tsetBillingAddress: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Cart>,\n\t\t\t{ address }: CartSetBillingAddressAction\n\t\t) => {\n\t\t\tresource.billingAddress = createAddress(\n\t\t\t\taddress,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t)\n\t\t},\n\t\tsetShippingMethod: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Cart>,\n\t\t\t{ shippingMethod }: CartSetShippingMethodAction\n\t\t) => {\n\t\t\tif (shippingMethod) {\n\t\t\t\tconst method = this._storage.getByResourceIdentifier<'shipping-method'>(\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\tshippingMethod\n\t\t\t\t)\n\n\t\t\t\tif (!method) {\n\t\t\t\t\tthrow new Error(`Type ${shippingMethod} not found`)\n\t\t\t\t}\n\n\t\t\t\t// Based on the address we should select a shipping zone and\n\t\t\t\t// use that to define the price.\n\t\t\t\t// @ts-ignore\n\t\t\t\tresource.shippingInfo = {\n\t\t\t\t\tshippingMethod: {\n\t\t\t\t\t\ttypeId: 'shipping-method',\n\t\t\t\t\t\tid: method.id,\n\t\t\t\t\t},\n\t\t\t\t\tshippingMethodName: method.name,\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresource.shippingInfo = undefined\n\t\t\t}\n\t\t},\n\t\tsetCountry: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Cart>,\n\t\t\t{ country }: CartSetCountryAction\n\t\t) => {\n\t\t\tresource.country = country\n\t\t},\n\t\tsetCustomerEmail: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Cart>,\n\t\t\t{ email }: CartSetCustomerEmailAction\n\t\t) => {\n\t\t\tresource.customerEmail = email\n\t\t},\n\t\tsetCustomField: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Cart,\n\t\t\t{ name, value }: CartSetCustomFieldAction\n\t\t) => {\n\t\t\tif (!resource.custom) {\n\t\t\t\tthrow new Error('Resource has no custom field')\n\t\t\t}\n\t\t\tresource.custom.fields[name] = value\n\t\t},\n\t\tsetCustomType: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Cart>,\n\t\t\t{ type, fields }: CartSetCustomTypeAction\n\t\t) => {\n\t\t\tif (!type) {\n\t\t\t\tresource.custom = undefined\n\t\t\t} else {\n\t\t\t\tconst resolvedType = this._storage.getByResourceIdentifier(\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\ttype\n\t\t\t\t)\n\t\t\t\tif (!resolvedType) {\n\t\t\t\t\tthrow new Error(`Type ${type} not found`)\n\t\t\t\t}\n\n\t\t\t\tresource.custom = {\n\t\t\t\t\ttype: {\n\t\t\t\t\t\ttypeId: 'type',\n\t\t\t\t\t\tid: resolvedType.id,\n\t\t\t\t\t},\n\t\t\t\t\tfields: fields || {},\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tsetLocale: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Cart>,\n\t\t\t{ locale }: CartSetLocaleAction\n\t\t) => {\n\t\t\tresource.locale = locale\n\t\t},\n\t\tsetLineItemShippingDetails: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Cart>,\n\t\t\t{\n\t\t\t\taction,\n\t\t\t\tshippingDetails,\n\t\t\t\tlineItemId,\n\t\t\t\tlineItemKey,\n\t\t\t}: CartSetLineItemShippingDetailsAction\n\t\t) => {\n\t\t\tconst lineItem = resource.lineItems.find(\n\t\t\t\t(x) =>\n\t\t\t\t\t(lineItemId && x.id === lineItemId) ||\n\t\t\t\t\t(lineItemKey && x.key === lineItemKey)\n\t\t\t)\n\n\t\t\tif (!lineItem) {\n\t\t\t\t// Check if line item is found\n\t\t\t\tthrow new CommercetoolsError<GeneralError>({\n\t\t\t\t\tcode: 'General',\n\t\t\t\t\tmessage: lineItemKey\n\t\t\t\t\t\t? `A line item with key '${lineItemKey}' not found.`\n\t\t\t\t\t\t: `A line item with ID '${lineItemId}' not found.`,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tlineItem.shippingDetails = {\n\t\t\t\t...shippingDetails,\n\t\t\t\tvalid: true,\n\t\t\t} as ItemShippingDetails\n\t\t},\n\t\tsetShippingAddress: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Cart>,\n\t\t\t{ address }: CartSetShippingAddressAction\n\t\t) => {\n\t\t\tif (!address) {\n\t\t\t\tresource.shippingAddress = undefined\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tlet custom: CustomFields | undefined = undefined\n\t\t\tif ((address as Address & AddressDraft).custom) {\n\t\t\t\tcustom = createCustomFields(\n\t\t\t\t\t(address as Address & AddressDraft).custom,\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\tthis._storage\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tresource.shippingAddress = {\n\t\t\t\t...address,\n\t\t\t\tcustom: custom,\n\t\t\t}\n\t\t},\n\t\tremoveDiscountCode: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Cart>,\n\t\t\t{ discountCode }: CartRemoveDiscountCodeAction\n\t\t) => {\n\t\t\tresource.discountCodes = resource.discountCodes.filter(\n\t\t\t\t(code) => code.discountCode.id !== discountCode.id\n\t\t\t)\n\t\t},\n\t}\n\tdraftLineItemtoLineItem = (\n\t\tprojectKey: string,\n\t\tdraftLineItem: LineItemDraft,\n\t\tcurrency: string,\n\t\tcountry: string | undefined\n\t): LineItem => {\n\t\tconst { productId, quantity, variantId, sku } = draftLineItem\n\n\t\tlet product: Product | null = null\n\n\t\tif (productId && variantId) {\n\t\t\t// Fetch product and variant by ID\n\t\t\tproduct = this._storage.get(projectKey, 'product', productId, {})\n\t\t} else if (sku) {\n\t\t\t// Fetch product and variant by SKU\n\t\t\tconst items = this._storage.query(projectKey, 'product', {\n\t\t\t\twhere: [\n\t\t\t\t\t`masterData(current(masterVariant(sku=\"${sku}\"))) or masterData(current(variants(sku=\"${sku}\")))`,\n\t\t\t\t],\n\t\t\t}) as ProductPagedQueryResponse\n\n\t\t\tif (items.count === 1) {\n\t\t\t\tproduct = items.results[0]\n\t\t\t}\n\t\t}\n\n\t\tif (!product) {\n\t\t\t// Check if product is found\n\t\t\tthrow new CommercetoolsError<GeneralError>({\n\t\t\t\tcode: 'General',\n\t\t\t\tmessage: sku\n\t\t\t\t\t? `A product containing a variant with SKU '${sku}' not found.`\n\t\t\t\t\t: `A product with ID '${productId}' not found.`,\n\t\t\t})\n\t\t}\n\n\t\t// Find matching variant\n\t\tconst variant = [\n\t\t\tproduct.masterData.current.masterVariant,\n\t\t\t...product.masterData.current.variants,\n\t\t].find((x) => {\n\t\t\tif (sku) return x.sku === sku\n\t\t\tif (variantId) return x.id === variantId\n\t\t\treturn false\n\t\t})\n\n\t\tif (!variant) {\n\t\t\t// Check if variant is found\n\t\t\tthrow new Error(\n\t\t\t\tsku\n\t\t\t\t\t? `A variant with SKU '${sku}' for product '${product.id}' not found.`\n\t\t\t\t\t: `A variant with ID '${variantId}' for product '${product.id}' not found.`\n\t\t\t)\n\t\t}\n\n\t\tconst quant = quantity ?? 1\n\n\t\tconst price = selectPrice({ prices: variant.prices, currency, country })\n\t\tif (!price) {\n\t\t\tthrow new Error(\n\t\t\t\t`No valid price found for ${productId} for country ${country} and currency ${currency}`\n\t\t\t)\n\t\t}\n\n\t\treturn {\n\t\t\tid: uuidv4(),\n\t\t\tproductId: product.id,\n\t\t\tproductKey: product.key,\n\t\t\tproductSlug: product.masterData.current.slug,\n\t\t\tproductType: product.productType,\n\t\t\tname: product.masterData.current.name,\n\t\t\tvariant,\n\t\t\tprice: price,\n\t\t\ttotalPrice: {\n\t\t\t\ttype: 'centPrecision',\n\t\t\t\tcurrencyCode: price.value.currencyCode,\n\t\t\t\tfractionDigits: price.value.fractionDigits,\n\t\t\t\tcentAmount: price.value.centAmount * quant,\n\t\t\t},\n\t\t\ttaxedPricePortions: [],\n\t\t\tperMethodTaxRate: [],\n\t\t\tquantity: quant,\n\t\t\tdiscountedPricePerQuantity: [],\n\t\t\tlineItemMode: 'Standard',\n\t\t\tpriceMode: 'Platform',\n\t\t\tstate: [],\n\t\t}\n\t}\n}\n\nconst selectPrice = ({\n\tprices,\n\tcurrency,\n\tcountry,\n}: {\n\tprices: Price[] | undefined\n\tcurrency: string\n\tcountry: string | undefined\n}): Price | undefined => {\n\tif (!prices) {\n\t\treturn undefined\n\t}\n\n\t// Quick-and-dirty way of selecting price based on the given currency and country.\n\t// Can be improved later to give more priority to exact matches over\n\t// 'all country' matches, and include customer groups in the mix as well\n\treturn prices.find((price) => {\n\t\tconst countryMatch = !price.country || price.country === country\n\t\tconst currencyMatch = price.value.currencyCode === currency\n\t\treturn countryMatch && currencyMatch\n\t})\n}\n\nconst calculateLineItemTotalPrice = (lineItem: LineItem): number =>\n\tlineItem.price!.value.centAmount * lineItem.quantity\n\nconst calculateCartTotalPrice = (cart: Cart): number =>\n\tcart.lineItems.reduce((cur, item) => cur + item.totalPrice.centAmount, 0)\n","import type {\n\tCartDiscount,\n\tCartDiscountChangeIsActiveAction,\n\tCartDiscountChangeSortOrderAction,\n\tCartDiscountChangeTargetAction,\n\tCartDiscountDraft,\n\tCartDiscountSetCustomFieldAction,\n\tCartDiscountSetCustomTypeAction,\n\tCartDiscountSetDescriptionAction,\n\tCartDiscountSetKeyAction,\n\tCartDiscountSetValidFromAction,\n\tCartDiscountSetValidFromAndUntilAction,\n\tCartDiscountSetValidUntilAction,\n\tCartDiscountUpdateAction,\n\tCartDiscountValueAbsolute,\n\tCartDiscountValueDraft,\n\tCartDiscountValueFixed,\n\tCartDiscountValueGiftLineItem,\n\tCartDiscountValueRelative,\n\tInvalidOperationError,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport {\n\tAbstractResourceRepository,\n\ttype RepositoryContext,\n} from './abstract.js'\nimport {\n\tcreateCustomFields,\n\tcreateTypedMoney,\n\tgetStoreKeyReference,\n} from './helpers.js'\nimport { CommercetoolsError } from '../exceptions.js'\n\nexport class CartDiscountRepository extends AbstractResourceRepository<'cart-discount'> {\n\tgetTypeId() {\n\t\treturn 'cart-discount' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: CartDiscountDraft): CartDiscount {\n\t\tconst resource: CartDiscount = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tkey: draft.key,\n\t\t\tdescription: draft.description,\n\t\t\tcartPredicate: draft.cartPredicate,\n\t\t\tisActive: draft.isActive || false,\n\t\t\tname: draft.name,\n\t\t\tstores:\n\t\t\t\tdraft.stores?.map((s) =>\n\t\t\t\t\tgetStoreKeyReference(s, context.projectKey, this._storage)\n\t\t\t\t) ?? [],\n\t\t\treferences: [],\n\t\t\ttarget: draft.target,\n\t\t\trequiresDiscountCode: draft.requiresDiscountCode || false,\n\t\t\tsortOrder: draft.sortOrder,\n\t\t\tstackingMode: draft.stackingMode || 'Stacking',\n\t\t\tvalidFrom: draft.validFrom,\n\t\t\tvalidUntil: draft.validUntil,\n\t\t\tvalue: this.transformValueDraft(draft.value),\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tprivate transformValueDraft(value: CartDiscountValueDraft) {\n\t\tswitch (value.type) {\n\t\t\tcase 'absolute': {\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'absolute',\n\t\t\t\t\tmoney: value.money.map(createTypedMoney),\n\t\t\t\t} as CartDiscountValueAbsolute\n\t\t\t}\n\t\t\tcase 'fixed': {\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'fixed',\n\t\t\t\t\tmoney: value.money.map(createTypedMoney),\n\t\t\t\t} as CartDiscountValueFixed\n\t\t\t}\n\t\t\tcase 'giftLineItem': {\n\t\t\t\treturn {\n\t\t\t\t\t...value,\n\t\t\t\t} as CartDiscountValueGiftLineItem\n\t\t\t}\n\t\t\tcase 'relative': {\n\t\t\t\treturn {\n\t\t\t\t\t...value,\n\t\t\t\t} as CartDiscountValueRelative\n\t\t\t}\n\t\t}\n\n\t\treturn value\n\t}\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tCartDiscountUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<CartDiscount>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {\n\t\tsetKey: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<CartDiscount>,\n\t\t\t{ key }: CartDiscountSetKeyAction\n\t\t) => {\n\t\t\tresource.key = key\n\t\t},\n\t\tsetDescription: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<CartDiscount>,\n\t\t\t{ description }: CartDiscountSetDescriptionAction\n\t\t) => {\n\t\t\tresource.description = description\n\t\t},\n\t\tsetValidFrom: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<CartDiscount>,\n\t\t\t{ validFrom }: CartDiscountSetValidFromAction\n\t\t) => {\n\t\t\tresource.validFrom = validFrom\n\t\t},\n\t\tsetValidUntil: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<CartDiscount>,\n\t\t\t{ validUntil }: CartDiscountSetValidUntilAction\n\t\t) => {\n\t\t\tresource.validUntil = validUntil\n\t\t},\n\t\tsetValidFromAndUntil: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<CartDiscount>,\n\t\t\t{ validFrom, validUntil }: CartDiscountSetValidFromAndUntilAction\n\t\t) => {\n\t\t\tresource.validFrom = validFrom\n\t\t\tresource.validUntil = validUntil\n\t\t},\n\t\tchangeSortOrder: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<CartDiscount>,\n\t\t\t{ sortOrder }: CartDiscountChangeSortOrderAction\n\t\t) => {\n\t\t\tresource.sortOrder = sortOrder\n\t\t},\n\t\tchangeIsActive: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<CartDiscount>,\n\t\t\t{ isActive }: CartDiscountChangeIsActiveAction\n\t\t) => {\n\t\t\tresource.isActive = isActive\n\t\t},\n\t\tchangeTarget: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<CartDiscount>,\n\t\t\t{ target }: CartDiscountChangeTargetAction\n\t\t) => {\n\t\t\tresource.target = target\n\t\t},\n\t\tsetCustomField: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<CartDiscount>,\n\t\t\t{ name, value }: CartDiscountSetCustomFieldAction\n\t\t) => {\n\t\t\tif (!resource.custom) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (value === null) {\n\t\t\t\tif (name in resource.custom.fields) {\n\t\t\t\t\tdelete resource.custom.fields[name]\n\t\t\t\t} else {\n\t\t\t\t\tthrow new CommercetoolsError<InvalidOperationError>(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcode: 'InvalidOperation',\n\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\t'Cannot remove custom field ' +\n\t\t\t\t\t\t\t\tname +\n\t\t\t\t\t\t\t\t' because it does not exist.',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t400\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresource.custom.fields[name] = value\n\t\t\t}\n\t\t},\n\t\tsetCustomType: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<CartDiscount>,\n\t\t\t{ type, fields }: CartDiscountSetCustomTypeAction\n\t\t) => {\n\t\t\tif (!type) {\n\t\t\t\tresource.custom = undefined\n\t\t\t} else {\n\t\t\t\tconst resolvedType = this._storage.getByResourceIdentifier(\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\ttype\n\t\t\t\t)\n\t\t\t\tif (!resolvedType) {\n\t\t\t\t\tthrow new Error(`Type ${type} not found`)\n\t\t\t\t}\n\n\t\t\t\tresource.custom = {\n\t\t\t\t\ttype: {\n\t\t\t\t\t\ttypeId: 'type',\n\t\t\t\t\t\tid: resolvedType.id,\n\t\t\t\t\t},\n\t\t\t\t\tfields: fields || {},\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t}\n}\n","import type {\n\tAsset,\n\tAssetDraft,\n\tCategory,\n\tCategoryAddAssetAction,\n\tCategoryChangeAssetNameAction,\n\tCategoryChangeNameAction,\n\tCategoryChangeParentAction,\n\tCategoryChangeSlugAction,\n\tCategoryDraft,\n\tCategoryRemoveAssetAction,\n\tCategorySetAssetDescriptionAction,\n\tCategorySetAssetSourcesAction,\n\tCategorySetCustomFieldAction,\n\tCategorySetCustomTypeAction,\n\tCategorySetDescriptionAction,\n\tCategorySetKeyAction,\n\tCategorySetMetaDescriptionAction,\n\tCategorySetMetaKeywordsAction,\n\tCategorySetMetaTitleAction,\n} from '@commercetools/platform-sdk'\nimport { v4 as uuidv4 } from 'uuid'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport {\n\tAbstractResourceRepository,\n\ttype RepositoryContext,\n} from './abstract.js'\nimport { createCustomFields } from './helpers.js'\n\nexport class CategoryRepository extends AbstractResourceRepository<'category'> {\n\tgetTypeId() {\n\t\treturn 'category' as const\n\t}\n\n\tassetFromAssetDraft = (\n\t\tdraft: AssetDraft,\n\t\tcontext: RepositoryContext\n\t): Asset => ({\n\t\t...draft,\n\t\tid: uuidv4(),\n\t\tcustom: createCustomFields(draft.custom, context.projectKey, this._storage),\n\t})\n\n\tcreate(context: RepositoryContext, draft: CategoryDraft): Category {\n\t\tconst resource: Category = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tkey: draft.key,\n\t\t\tname: draft.name,\n\t\t\tslug: draft.slug,\n\t\t\torderHint: draft.orderHint || '',\n\t\t\texternalId: draft.externalId || '',\n\t\t\tparent: draft.parent\n\t\t\t\t? { typeId: 'category', id: draft.parent.id! }\n\t\t\t\t: undefined,\n\t\t\tancestors: [], // TODO\n\t\t\tassets:\n\t\t\t\tdraft.assets?.map((d) => ({\n\t\t\t\t\tid: uuidv4(),\n\t\t\t\t\tname: d.name,\n\t\t\t\t\tdescription: d.description,\n\t\t\t\t\tsources: d.sources,\n\t\t\t\t\ttags: d.tags,\n\t\t\t\t\tkey: d.key,\n\t\t\t\t\tcustom: createCustomFields(\n\t\t\t\t\t\tdraft.custom,\n\t\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\t\tthis._storage\n\t\t\t\t\t),\n\t\t\t\t})) || [],\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tactions = {\n\t\tchangeAssetName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Category>,\n\t\t\t{ assetId, assetKey, name }: CategoryChangeAssetNameAction\n\t\t) => {\n\t\t\tresource.assets?.forEach((asset) => {\n\t\t\t\tif (assetId && assetId === asset.id) {\n\t\t\t\t\tasset.name = name\n\t\t\t\t}\n\t\t\t\tif (assetKey && assetKey === asset.key) {\n\t\t\t\t\tasset.name = name\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\tchangeSlug: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Category>,\n\t\t\t{ slug }: CategoryChangeSlugAction\n\t\t) => {\n\t\t\tresource.slug = slug\n\t\t},\n\t\tchangeName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Category>,\n\t\t\t{ name }: CategoryChangeNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\t\tchangeParent: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Category>,\n\t\t\t{ parent }: CategoryChangeParentAction\n\t\t) => {\n\t\t\tconst category = this._storage.getByResourceIdentifier(\n\t\t\t\tcontext.projectKey,\n\t\t\t\tparent\n\t\t\t)\n\t\t\tif (!category) {\n\t\t\t\tthrow new Error('No category found for reference')\n\t\t\t}\n\t\t\tresource.parent = {\n\t\t\t\ttypeId: 'category',\n\t\t\t\tid: category.id,\n\t\t\t}\n\t\t},\n\t\tsetKey: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Category>,\n\t\t\t{ key }: CategorySetKeyAction\n\t\t) => {\n\t\t\tresource.key = key\n\t\t},\n\t\tsetAssetDescription: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Category>,\n\t\t\t{ assetId, assetKey, description }: CategorySetAssetDescriptionAction\n\t\t) => {\n\t\t\tresource.assets?.forEach((asset) => {\n\t\t\t\tif (assetId && assetId === asset.id) {\n\t\t\t\t\tasset.description = description\n\t\t\t\t}\n\t\t\t\tif (assetKey && assetKey === asset.key) {\n\t\t\t\t\tasset.description = description\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\tsetAssetSources: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Category>,\n\t\t\t{ assetId, assetKey, sources }: CategorySetAssetSourcesAction\n\t\t) => {\n\t\t\tresource.assets?.forEach((asset) => {\n\t\t\t\tif (assetId && assetId === asset.id) {\n\t\t\t\t\tasset.sources = sources\n\t\t\t\t}\n\t\t\t\tif (assetKey && assetKey === asset.key) {\n\t\t\t\t\tasset.sources = sources\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\tsetDescription: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Category>,\n\t\t\t{ description }: CategorySetDescriptionAction\n\t\t) => {\n\t\t\tresource.description = description\n\t\t},\n\t\tsetMetaDescription: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Category>,\n\t\t\t{ metaDescription }: CategorySetMetaDescriptionAction\n\t\t) => {\n\t\t\tresource.metaDescription = metaDescription\n\t\t},\n\t\tsetMetaKeywords: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Category>,\n\t\t\t{ metaKeywords }: CategorySetMetaKeywordsAction\n\t\t) => {\n\t\t\tresource.metaKeywords = metaKeywords\n\t\t},\n\t\tsetMetaTitle: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Category>,\n\t\t\t{ metaTitle }: CategorySetMetaTitleAction\n\t\t) => {\n\t\t\tresource.metaTitle = metaTitle\n\t\t},\n\t\tsetCustomType: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Category>,\n\t\t\t{ type, fields }: CategorySetCustomTypeAction\n\t\t) => {\n\t\t\tif (type) {\n\t\t\t\tresource.custom = createCustomFields(\n\t\t\t\t\t{ type, fields },\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\tthis._storage\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tresource.custom = undefined\n\t\t\t}\n\t\t},\n\t\tsetCustomField: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Category>,\n\t\t\t{ name, value }: CategorySetCustomFieldAction\n\t\t) => {\n\t\t\tif (!resource.custom) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (value === null) {\n\t\t\t\tdelete resource.custom.fields[name]\n\t\t\t} else {\n\t\t\t\tresource.custom.fields[name] = value\n\t\t\t}\n\t\t},\n\t\tremoveAsset: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Category>,\n\t\t\t{ assetId, assetKey }: CategoryRemoveAssetAction\n\t\t) => {\n\t\t\tif (!resource.assets) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (assetId) {\n\t\t\t\tresource.assets = resource.assets.filter(function (obj) {\n\t\t\t\t\treturn obj.id !== assetId\n\t\t\t\t})\n\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (assetKey) {\n\t\t\t\tresource.assets = resource.assets.filter(function (obj) {\n\t\t\t\t\treturn obj.key !== assetKey\n\t\t\t\t})\n\n\t\t\t\treturn\n\t\t\t}\n\t\t},\n\t\taddAsset: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Category>,\n\t\t\t{ asset }: CategoryAddAssetAction\n\t\t) => {\n\t\t\tif (!resource.assets) {\n\t\t\t\tresource.assets = [this.assetFromAssetDraft(asset, context)]\n\t\t\t} else {\n\t\t\t\tresource.assets.push(this.assetFromAssetDraft(asset, context))\n\t\t\t}\n\t\t},\n\t}\n}\n","import type {\n\tChannel,\n\tChannelChangeDescriptionAction,\n\tChannelChangeKeyAction,\n\tChannelChangeNameAction,\n\tChannelDraft,\n\tChannelSetAddressAction,\n\tChannelSetCustomFieldAction,\n\tChannelSetCustomTypeAction,\n\tChannelSetGeoLocationAction,\n\tChannelUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport {\n\tAbstractResourceRepository,\n\ttype RepositoryContext,\n} from './abstract.js'\nimport { createAddress, createCustomFields } from './helpers.js'\n\nexport class ChannelRepository extends AbstractResourceRepository<'channel'> {\n\tgetTypeId() {\n\t\treturn 'channel' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: ChannelDraft): Channel {\n\t\tconst resource: Channel = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tkey: draft.key,\n\t\t\tname: draft.name,\n\t\t\tdescription: draft.description,\n\t\t\troles: draft.roles || [],\n\t\t\tgeoLocation: draft.geoLocation,\n\t\t\taddress: createAddress(draft.address, context.projectKey, this._storage),\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tChannelUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<Channel>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {\n\t\tchangeKey: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Channel>,\n\t\t\t{ key }: ChannelChangeKeyAction\n\t\t) => {\n\t\t\tresource.key = key\n\t\t},\n\n\t\tchangeName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Channel>,\n\t\t\t{ name }: ChannelChangeNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\n\t\tchangeDescription: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Channel>,\n\t\t\t{ description }: ChannelChangeDescriptionAction\n\t\t) => {\n\t\t\tresource.description = description\n\t\t},\n\n\t\tsetAddress: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Channel>,\n\t\t\t{ address }: ChannelSetAddressAction\n\t\t) => {\n\t\t\tresource.address = createAddress(\n\t\t\t\taddress,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t)\n\t\t},\n\n\t\tsetGeoLocation: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Channel>,\n\t\t\t{ geoLocation }: ChannelSetGeoLocationAction\n\t\t) => {\n\t\t\tresource.geoLocation = geoLocation\n\t\t},\n\n\t\tsetCustomType: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Channel>,\n\t\t\t{ type, fields }: ChannelSetCustomTypeAction\n\t\t) => {\n\t\t\tif (type) {\n\t\t\t\tresource.custom = createCustomFields(\n\t\t\t\t\t{ type, fields },\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\tthis._storage\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tresource.custom = undefined\n\t\t\t}\n\t\t},\n\t\tsetCustomField: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Channel>,\n\t\t\t{ name, value }: ChannelSetCustomFieldAction\n\t\t) => {\n\t\t\tif (!resource.custom) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (value === null) {\n\t\t\t\tdelete resource.custom.fields[name]\n\t\t\t} else {\n\t\t\t\tresource.custom.fields[name] = value\n\t\t\t}\n\t\t},\n\t}\n}\n","import type {\n\tCustomObject,\n\tCustomObjectDraft,\n\tInvalidOperationError,\n} from '@commercetools/platform-sdk'\nimport { CommercetoolsError } from '../exceptions.js'\nimport { cloneObject, getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport {\n\tAbstractResourceRepository,\n\ttype RepositoryContext,\n} from './abstract.js'\nimport { checkConcurrentModification } from './errors.js'\n\nexport class CustomObjectRepository extends AbstractResourceRepository<'key-value-document'> {\n\tgetTypeId() {\n\t\treturn 'key-value-document' as const\n\t}\n\n\tcreate(\n\t\tcontext: RepositoryContext,\n\t\tdraft: Writable<CustomObjectDraft>\n\t): CustomObject {\n\t\tconst current = this.getWithContainerAndKey(\n\t\t\tcontext,\n\t\t\tdraft.container,\n\t\t\tdraft.key\n\t\t) as Writable<CustomObject | undefined>\n\n\t\tif (current) {\n\t\t\t// Only check version if it is passed in the draft\n\t\t\tif (draft.version) {\n\t\t\t\tcheckConcurrentModification(current.version, draft.version, current.id)\n\t\t\t} else {\n\t\t\t\tdraft.version = current.version\n\t\t\t}\n\n\t\t\tif (draft.value !== current.value) {\n\t\t\t\tconst updated = cloneObject(current) as Writable<CustomObject>\n\t\t\t\tupdated.value = draft.value\n\t\t\t\tupdated.version += 1\n\t\t\t\tthis.saveUpdate(context, draft.version, updated)\n\t\t\t\treturn updated\n\t\t\t}\n\t\t\treturn current\n\t\t} else {\n\t\t\t// If the resource is new the only valid version is 0\n\t\t\tif (draft.version) {\n\t\t\t\tthrow new CommercetoolsError<InvalidOperationError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'InvalidOperation',\n\t\t\t\t\t\tmessage: 'version on create must be 0',\n\t\t\t\t\t},\n\t\t\t\t\t400\n\t\t\t\t)\n\t\t\t}\n\t\t\tconst baseProperties = getBaseResourceProperties()\n\t\t\tconst resource: CustomObject = {\n\t\t\t\t...baseProperties,\n\t\t\t\tcontainer: draft.container,\n\t\t\t\tkey: draft.key,\n\t\t\t\tvalue: draft.value,\n\t\t\t}\n\n\t\t\tthis.saveNew(context, resource)\n\t\t\treturn resource\n\t\t}\n\t}\n\n\tgetWithContainerAndKey(\n\t\tcontext: RepositoryContext,\n\t\tcontainer: string,\n\t\tkey: string\n\t) {\n\t\tconst items = this._storage.all(context.projectKey, this.getTypeId())\n\t\treturn items.find(\n\t\t\t(item) => item.container === container && item.key === key\n\t\t)\n\t}\n}\n","import type {\n\tCustomer,\n\tCustomerChangeEmailAction,\n\tCustomerDraft,\n\tCustomerSetAuthenticationModeAction,\n\tCustomerSetCustomFieldAction,\n\tDuplicateFieldError,\n\tInvalidInputError,\n\tInvalidJsonInputError,\n} from '@commercetools/platform-sdk'\nimport { CommercetoolsError } from '../exceptions.js'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport {\n\tAbstractResourceRepository,\n\ttype RepositoryContext,\n} from './abstract.js'\nimport { hashPassword } from '../lib/password.js'\n\nexport class CustomerRepository extends AbstractResourceRepository<'customer'> {\n\tgetTypeId() {\n\t\treturn 'customer' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: CustomerDraft): Customer {\n\t\t// Check uniqueness\n\t\tconst results = this._storage.query(context.projectKey, this.getTypeId(), {\n\t\t\twhere: [`email=\"${draft.email.toLocaleLowerCase()}\"`],\n\t\t})\n\t\tif (results.count > 0) {\n\t\t\tthrow new CommercetoolsError<any>({\n\t\t\t\tcode: 'CustomerAlreadyExists',\n\t\t\t\tstatusCode: 400,\n\t\t\t\tmessage:\n\t\t\t\t\t'There is already an existing customer with the provided email.',\n\t\t\t\terrors: [\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'DuplicateField',\n\t\t\t\t\t\tmessage: `Customer with email '${draft.email}' already exists.`,\n\t\t\t\t\t\tduplicateValue: draft.email,\n\t\t\t\t\t\tfield: 'email',\n\t\t\t\t\t} as DuplicateFieldError,\n\t\t\t\t],\n\t\t\t})\n\t\t}\n\n\t\tconst resource: Customer = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tauthenticationMode: draft.authenticationMode || 'Password',\n\t\t\temail: draft.email.toLowerCase(),\n\t\t\tpassword: draft.password ? hashPassword(draft.password) : undefined,\n\t\t\tisEmailVerified: draft.isEmailVerified || false,\n\t\t\taddresses: [],\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tgetMe(context: RepositoryContext): Customer | undefined {\n\t\t// grab the first customer you can find for now. In the future we should\n\t\t// use the customer id from the scope of the token\n\t\tconst results = this._storage.query(\n\t\t\tcontext.projectKey,\n\t\t\tthis.getTypeId(),\n\t\t\t{}\n\t\t)\n\n\t\tif (results.count > 0) {\n\t\t\treturn results.results[0] as Customer\n\t\t}\n\n\t\treturn\n\t}\n\n\tactions = {\n\t\tchangeEmail: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<Customer>,\n\t\t\t{ email }: CustomerChangeEmailAction\n\t\t) => {\n\t\t\tresource.email = email\n\t\t},\n\t\tsetAuthenticationMode: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<Customer>,\n\t\t\t{ authMode, password }: CustomerSetAuthenticationModeAction\n\t\t) => {\n\t\t\tif (resource.authenticationMode === authMode) {\n\t\t\t\tthrow new CommercetoolsError<InvalidInputError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'InvalidInput',\n\t\t\t\t\t\tmessage: `The customer is already using the '${resource.authenticationMode}' authentication mode.`,\n\t\t\t\t\t},\n\t\t\t\t\t400\n\t\t\t\t)\n\t\t\t}\n\t\t\tresource.authenticationMode = authMode\n\t\t\tif (authMode === 'ExternalAuth') {\n\t\t\t\tdelete resource.password\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (authMode === 'Password') {\n\t\t\t\tresource.password = password ? hashPassword(password) : undefined\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthrow new CommercetoolsError<InvalidJsonInputError>(\n\t\t\t\t{\n\t\t\t\t\tcode: 'InvalidJsonInput',\n\t\t\t\t\tmessage: 'Request body does not contain valid JSON.',\n\t\t\t\t\tdetailedErrorMessage: `actions -> authMode: Invalid enum value: '${authMode}'. Expected one of: 'Password','ExternalAuth'`,\n\t\t\t\t},\n\t\t\t\t400\n\t\t\t)\n\t\t},\n\t\tsetCustomField: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<Customer>,\n\t\t\t{ name, value }: CustomerSetCustomFieldAction\n\t\t) => {\n\t\t\tif (!resource.custom) {\n\t\t\t\tthrow new Error('Resource has no custom field')\n\t\t\t}\n\t\t\tresource.custom.fields[name] = value\n\t\t},\n\t}\n}\n","import type {\n\tCustomerGroup,\n\tCustomerGroupChangeNameAction,\n\tCustomerGroupDraft,\n\tCustomerGroupSetCustomFieldAction,\n\tCustomerGroupSetCustomTypeAction,\n\tCustomerGroupSetKeyAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport {\n\tAbstractResourceRepository,\n\ttype RepositoryContext,\n} from './abstract.js'\nimport { createCustomFields } from './helpers.js'\n\nexport class CustomerGroupRepository extends AbstractResourceRepository<'customer-group'> {\n\tgetTypeId() {\n\t\treturn 'customer-group' as const\n\t}\n\tcreate(context: RepositoryContext, draft: CustomerGroupDraft): CustomerGroup {\n\t\tconst resource: CustomerGroup = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tkey: draft.key,\n\t\t\tname: draft.groupName,\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tactions = {\n\t\tsetKey: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<CustomerGroup>,\n\t\t\t{ key }: CustomerGroupSetKeyAction\n\t\t) => {\n\t\t\tresource.key = key\n\t\t},\n\t\tchangeName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<CustomerGroup>,\n\t\t\t{ name }: CustomerGroupChangeNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\t\tsetCustomType: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<CustomerGroup>,\n\t\t\t{ type, fields }: CustomerGroupSetCustomTypeAction\n\t\t) => {\n\t\t\tif (type) {\n\t\t\t\tresource.custom = createCustomFields(\n\t\t\t\t\t{ type, fields },\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\tthis._storage\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tresource.custom = undefined\n\t\t\t}\n\t\t},\n\t\tsetCustomField: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<CustomerGroup>,\n\t\t\t{ name, value }: CustomerGroupSetCustomFieldAction\n\t\t) => {\n\t\t\tif (!resource.custom) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (value === null) {\n\t\t\t\tdelete resource.custom.fields[name]\n\t\t\t} else {\n\t\t\t\tresource.custom.fields[name] = value\n\t\t\t}\n\t\t},\n\t}\n}\n","import type {\n\tCartDiscountReference,\n\tDiscountCode,\n\tDiscountCodeChangeCartDiscountsAction,\n\tDiscountCodeChangeIsActiveAction,\n\tDiscountCodeDraft,\n\tDiscountCodeSetCartPredicateAction,\n\tDiscountCodeSetCustomFieldAction,\n\tDiscountCodeSetCustomTypeAction,\n\tDiscountCodeSetDescriptionAction,\n\tDiscountCodeSetMaxApplicationsAction,\n\tDiscountCodeSetMaxApplicationsPerCustomerAction,\n\tDiscountCodeSetNameAction,\n\tDiscountCodeSetValidFromAction,\n\tDiscountCodeSetValidFromAndUntilAction,\n\tDiscountCodeSetValidUntilAction,\n\tDiscountCodeUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport {\n\tAbstractResourceRepository,\n\ttype RepositoryContext,\n} from './abstract.js'\nimport { createCustomFields } from './helpers.js'\n\nexport class DiscountCodeRepository extends AbstractResourceRepository<'discount-code'> {\n\tgetTypeId() {\n\t\treturn 'discount-code' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: DiscountCodeDraft): DiscountCode {\n\t\tconst resource: DiscountCode = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tapplicationVersion: 1,\n\t\t\tcartDiscounts: draft.cartDiscounts.map(\n\t\t\t\t(obj): CartDiscountReference => ({\n\t\t\t\t\ttypeId: 'cart-discount',\n\t\t\t\t\tid: obj.id!,\n\t\t\t\t})\n\t\t\t),\n\t\t\tcartPredicate: draft.cartPredicate,\n\t\t\tcode: draft.code,\n\t\t\tdescription: draft.description,\n\t\t\tgroups: draft.groups || [],\n\t\t\tisActive: draft.isActive || true,\n\t\t\tname: draft.name,\n\t\t\treferences: [],\n\t\t\tvalidFrom: draft.validFrom,\n\t\t\tvalidUntil: draft.validUntil,\n\t\t\tmaxApplications: draft.maxApplications,\n\t\t\tmaxApplicationsPerCustomer: draft.maxApplicationsPerCustomer,\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tDiscountCodeUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<DiscountCode>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {\n\t\tchangeIsActive: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<DiscountCode>,\n\t\t\t{ isActive }: DiscountCodeChangeIsActiveAction\n\t\t) => {\n\t\t\tresource.isActive = isActive\n\t\t},\n\t\tchangeCartDiscounts: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<DiscountCode>,\n\t\t\t{ cartDiscounts }: DiscountCodeChangeCartDiscountsAction\n\t\t) => {\n\t\t\tresource.cartDiscounts = cartDiscounts.map(\n\t\t\t\t(obj): CartDiscountReference => ({\n\t\t\t\t\ttypeId: 'cart-discount',\n\t\t\t\t\tid: obj.id!,\n\t\t\t\t})\n\t\t\t)\n\t\t},\n\t\tsetDescription: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<DiscountCode>,\n\t\t\t{ description }: DiscountCodeSetDescriptionAction\n\t\t) => {\n\t\t\tresource.description = description\n\t\t},\n\t\tsetCartPredicate: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<DiscountCode>,\n\t\t\t{ cartPredicate }: DiscountCodeSetCartPredicateAction\n\t\t) => {\n\t\t\tresource.cartPredicate = cartPredicate\n\t\t},\n\t\tsetName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<DiscountCode>,\n\t\t\t{ name }: DiscountCodeSetNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\t\tsetMaxApplications: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<DiscountCode>,\n\t\t\t{ maxApplications }: DiscountCodeSetMaxApplicationsAction\n\t\t) => {\n\t\t\tresource.maxApplications = maxApplications\n\t\t},\n\t\tsetMaxApplicationsPerCustomer: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<DiscountCode>,\n\t\t\t{\n\t\t\t\tmaxApplicationsPerCustomer,\n\t\t\t}: DiscountCodeSetMaxApplicationsPerCustomerAction\n\t\t) => {\n\t\t\tresource.maxApplicationsPerCustomer = maxApplicationsPerCustomer\n\t\t},\n\t\tsetValidFrom: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<DiscountCode>,\n\t\t\t{ validFrom }: DiscountCodeSetValidFromAction\n\t\t) => {\n\t\t\tresource.validFrom = validFrom\n\t\t},\n\t\tsetValidUntil: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<DiscountCode>,\n\t\t\t{ validUntil }: DiscountCodeSetValidUntilAction\n\t\t) => {\n\t\t\tresource.validUntil = validUntil\n\t\t},\n\t\tsetValidFromAndUntil: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<DiscountCode>,\n\t\t\t{ validFrom, validUntil }: DiscountCodeSetValidFromAndUntilAction\n\t\t) => {\n\t\t\tresource.validFrom = validFrom\n\t\t\tresource.validUntil = validUntil\n\t\t},\n\t\tsetCustomType: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<DiscountCode>,\n\t\t\t{ type, fields }: DiscountCodeSetCustomTypeAction\n\t\t) => {\n\t\t\tif (type) {\n\t\t\t\tresource.custom = createCustomFields(\n\t\t\t\t\t{ type, fields },\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\tthis._storage\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tresource.custom = undefined\n\t\t\t}\n\t\t},\n\t\tsetCustomField: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<DiscountCode>,\n\t\t\t{ name, value }: DiscountCodeSetCustomFieldAction\n\t\t) => {\n\t\t\tif (!resource.custom) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (value === null) {\n\t\t\t\tdelete resource.custom.fields[name]\n\t\t\t} else {\n\t\t\t\tresource.custom.fields[name] = value\n\t\t\t}\n\t\t},\n\t}\n}\n","import { cloneObject } from '../helpers.js'\n\nexport const maskSecretValue = <T>(resource: T, path: string): T => {\n\tconst parts = path.split('.')\n\tconst clone = cloneObject(resource) as any\n\tlet val = clone\n\n\tconst target = parts.pop()\n\tfor (let i = 0; i < parts.length; i++) {\n\t\tconst part = parts[i]\n\t\tval = val[part]\n\n\t\tif (val === undefined) {\n\t\t\treturn resource\n\t\t}\n\t}\n\n\tif (val && target && val[target]) {\n\t\tval[target] = '****'\n\t}\n\treturn clone\n}\n","import type {\n\tExtension,\n\tExtensionChangeDestinationAction,\n\tExtensionChangeTriggersAction,\n\tExtensionDraft,\n\tExtensionSetKeyAction,\n\tExtensionSetTimeoutInMsAction,\n\tExtensionUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport { maskSecretValue } from '../lib/masking.js'\nimport type { Writable } from '../types.js'\nimport {\n\tAbstractResourceRepository,\n\ttype RepositoryContext,\n} from './abstract.js'\n\nexport class ExtensionRepository extends AbstractResourceRepository<'extension'> {\n\tgetTypeId() {\n\t\treturn 'extension' as const\n\t}\n\n\tpostProcessResource(resource: Extension): Extension {\n\t\tif (resource) {\n\t\t\tconst extension = resource as Extension\n\t\t\tif (\n\t\t\t\textension.destination.type === 'HTTP' &&\n\t\t\t\textension.destination.authentication?.type === 'AuthorizationHeader'\n\t\t\t) {\n\t\t\t\treturn maskSecretValue(\n\t\t\t\t\textension,\n\t\t\t\t\t'destination.authentication.headerValue'\n\t\t\t\t)\n\t\t\t} else if (extension.destination.type == 'AWSLambda') {\n\t\t\t\treturn maskSecretValue(resource, 'destination.accessSecret')\n\t\t\t}\n\t\t}\n\t\treturn resource\n\t}\n\n\tcreate(context: RepositoryContext, draft: ExtensionDraft): Extension {\n\t\tconst resource: Extension = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tkey: draft.key,\n\t\t\ttimeoutInMs: draft.timeoutInMs,\n\t\t\tdestination: draft.destination,\n\t\t\ttriggers: draft.triggers,\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tactions: Record<\n\t\tExtensionUpdateAction['action'],\n\t\t(\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Extension>,\n\t\t\taction: any\n\t\t) => void\n\t> = {\n\t\tsetKey: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Extension>,\n\t\t\t{ key }: ExtensionSetKeyAction\n\t\t) => {\n\t\t\tresource.key = key\n\t\t},\n\t\tsetTimeoutInMs: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Extension>,\n\t\t\t{ timeoutInMs }: ExtensionSetTimeoutInMsAction\n\t\t) => {\n\t\t\tresource.timeoutInMs = timeoutInMs\n\t\t},\n\t\tchangeTriggers: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Extension>,\n\t\t\t{ triggers }: ExtensionChangeTriggersAction\n\t\t) => {\n\t\t\tresource.triggers = triggers\n\t\t},\n\t\tchangeDestination: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Extension>,\n\t\t\t{ destination }: ExtensionChangeDestinationAction\n\t\t) => {\n\t\t\tresource.destination = destination\n\t\t},\n\t}\n}\n","import type {\n\tInventoryEntry,\n\tInventoryEntryChangeQuantityAction,\n\tInventoryEntryDraft,\n\tInventoryEntrySetCustomFieldAction,\n\tInventoryEntrySetCustomTypeAction,\n\tInventoryEntrySetExpectedDeliveryAction,\n\tInventoryEntrySetRestockableInDaysAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport {\n\tAbstractResourceRepository,\n\ttype RepositoryContext,\n} from './abstract.js'\nimport { createCustomFields } from './helpers.js'\n\nexport class InventoryEntryRepository extends AbstractResourceRepository<'inventory-entry'> {\n\tgetTypeId() {\n\t\treturn 'inventory-entry' as const\n\t}\n\n\tcreate(\n\t\tcontext: RepositoryContext,\n\t\tdraft: InventoryEntryDraft\n\t): InventoryEntry {\n\t\tconst resource: InventoryEntry = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tsku: draft.sku,\n\t\t\tquantityOnStock: draft.quantityOnStock,\n\t\t\tavailableQuantity: draft.quantityOnStock,\n\t\t\texpectedDelivery: draft.expectedDelivery,\n\t\t\trestockableInDays: draft.restockableInDays,\n\t\t\tsupplyChannel: {\n\t\t\t\t...draft.supplyChannel,\n\t\t\t\ttypeId: 'channel',\n\t\t\t\tid: draft.supplyChannel?.id ?? '',\n\t\t\t},\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tactions = {\n\t\tchangeQuantity: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<InventoryEntry>,\n\t\t\t{ quantity }: InventoryEntryChangeQuantityAction\n\t\t) => {\n\t\t\tresource.quantityOnStock = quantity\n\t\t\t// don't know active reservations so just set to same value\n\t\t\tresource.availableQuantity = quantity\n\t\t},\n\t\tsetExpectedDelivery: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<InventoryEntry>,\n\t\t\t{ expectedDelivery }: InventoryEntrySetExpectedDeliveryAction\n\t\t) => {\n\t\t\tresource.expectedDelivery = new Date(expectedDelivery!).toISOString()\n\t\t},\n\t\tsetCustomField: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: InventoryEntry,\n\t\t\t{ name, value }: InventoryEntrySetCustomFieldAction\n\t\t) => {\n\t\t\tif (!resource.custom) {\n\t\t\t\tthrow new Error('Resource has no custom field')\n\t\t\t}\n\t\t\tresource.custom.fields[name] = value\n\t\t},\n\t\tsetCustomType: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<InventoryEntry>,\n\t\t\t{ type, fields }: InventoryEntrySetCustomTypeAction\n\t\t) => {\n\t\t\tif (!type) {\n\t\t\t\tresource.custom = undefined\n\t\t\t} else {\n\t\t\t\tconst resolvedType = this._storage.getByResourceIdentifier(\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\ttype\n\t\t\t\t)\n\t\t\t\tif (!resolvedType) {\n\t\t\t\t\tthrow new Error(`Type ${type} not found`)\n\t\t\t\t}\n\n\t\t\t\tresource.custom = {\n\t\t\t\t\ttype: {\n\t\t\t\t\t\ttypeId: 'type',\n\t\t\t\t\t\tid: resolvedType.id,\n\t\t\t\t\t},\n\t\t\t\t\tfields: fields || {},\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tsetRestockableInDays: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<InventoryEntry>,\n\t\t\t{ restockableInDays }: InventoryEntrySetRestockableInDaysAction\n\t\t) => {\n\t\t\tresource.restockableInDays = restockableInDays\n\t\t},\n\t}\n}\n","import type {\n\tCartReference,\n\tMyOrderFromCartDraft,\n\tOrder,\n} from '@commercetools/platform-sdk'\nimport assert from 'assert'\nimport { type RepositoryContext } from './abstract.js'\nimport { OrderRepository } from './order.js'\n\nexport class MyOrderRepository extends OrderRepository {\n\tcreate(context: RepositoryContext, draft: MyOrderFromCartDraft): Order {\n\t\tassert(draft.id, 'draft.id is missing')\n\t\tconst cartIdentifier = {\n\t\t\tid: draft.id,\n\t\t\ttypeId: 'cart',\n\t\t} as CartReference\n\t\treturn this.createFromCart(context, cartIdentifier)\n\t}\n}\n","import type {\n\tCart,\n\tCartReference,\n\tCustomLineItem,\n\tCustomLineItemDraft,\n\tGeneralError,\n\tLineItem,\n\tLineItemImportDraft,\n\tOrder,\n\tOrderAddPaymentAction,\n\tOrderChangeOrderStateAction,\n\tOrderChangePaymentStateAction,\n\tOrderFromCartDraft,\n\tOrderImportDraft,\n\tOrderSetBillingAddressAction,\n\tOrderSetCustomerEmailAction,\n\tOrderSetCustomFieldAction,\n\tOrderSetCustomTypeAction,\n\tOrderSetLocaleAction,\n\tOrderSetOrderNumberAction,\n\tOrderSetShippingAddressAction,\n\tOrderSetStoreAction,\n\tOrderTransitionStateAction,\n\tProduct,\n\tProductPagedQueryResponse,\n\tProductVariant,\n\tState,\n\tStore,\n} from '@commercetools/platform-sdk'\nimport assert from 'assert'\nimport { CommercetoolsError } from '../exceptions.js'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport {\n\tAbstractResourceRepository,\n\ttype QueryParams,\n\tRepositoryContext,\n} from './abstract.js'\nimport {\n\tcreateAddress,\n\tcreateCentPrecisionMoney,\n\tcreateCustomFields,\n\tcreatePrice,\n\tcreateTypedMoney,\n\tresolveStoreReference,\n} from './helpers.js'\n\nexport class OrderRepository extends AbstractResourceRepository<'order'> {\n\tgetTypeId() {\n\t\treturn 'order' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: OrderFromCartDraft): Order {\n\t\tassert(draft.cart, 'draft.cart is missing')\n\t\treturn this.createFromCart(\n\t\t\tcontext,\n\t\t\t{\n\t\t\t\tid: draft.cart.id!,\n\t\t\t\ttypeId: 'cart',\n\t\t\t},\n\t\t\tdraft.orderNumber\n\t\t)\n\t}\n\n\tcreateFromCart(\n\t\tcontext: RepositoryContext,\n\t\tcartReference: CartReference,\n\t\torderNumber?: string\n\t) {\n\t\tconst cart = this._storage.getByResourceIdentifier(\n\t\t\tcontext.projectKey,\n\t\t\tcartReference\n\t\t) as Cart | null\n\t\tif (!cart) {\n\t\t\tthrow new Error('Cannot find cart')\n\t\t}\n\n\t\tconst resource: Order = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\torderNumber,\n\t\t\tcart: cartReference,\n\t\t\torderState: 'Open',\n\t\t\tlineItems: [],\n\t\t\tcustomLineItems: [],\n\t\t\ttotalPrice: cart.totalPrice,\n\t\t\trefusedGifts: [],\n\t\t\torigin: 'Customer',\n\t\t\tsyncInfo: [],\n\t\t\tshippingMode: cart.shippingMode,\n\t\t\tshipping: cart.shipping,\n\t\t\tstore: context.storeKey\n\t\t\t\t? {\n\t\t\t\t\t\tkey: context.storeKey,\n\t\t\t\t\t\ttypeId: 'store',\n\t\t\t\t }\n\t\t\t\t: undefined,\n\t\t\tlastMessageSequenceNumber: 0,\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\timport(context: RepositoryContext, draft: OrderImportDraft): Order {\n\t\t// TODO: Check if order with given orderNumber already exists\n\t\tassert(this, 'OrderRepository not valid')\n\t\tconst resource: Order = {\n\t\t\t...getBaseResourceProperties(),\n\n\t\t\tbillingAddress: createAddress(\n\t\t\t\tdraft.billingAddress,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t\tshippingAddress: createAddress(\n\t\t\t\tdraft.shippingAddress,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t\tcustomerEmail: draft.customerEmail,\n\t\t\tlastMessageSequenceNumber: 0,\n\t\t\torderNumber: draft.orderNumber,\n\t\t\torderState: draft.orderState || 'Open',\n\t\t\torigin: draft.origin || 'Customer',\n\t\t\tpaymentState: draft.paymentState,\n\t\t\trefusedGifts: [],\n\t\t\tshippingMode: 'Single',\n\t\t\tshipping: [],\n\n\t\t\tstore: resolveStoreReference(\n\t\t\t\tdraft.store,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t\tsyncInfo: [],\n\n\t\t\tlineItems:\n\t\t\t\tdraft.lineItems?.map((item) =>\n\t\t\t\t\tthis.lineItemFromImportDraft.bind(this)(context, item)\n\t\t\t\t) || [],\n\t\t\tcustomLineItems:\n\t\t\t\tdraft.customLineItems?.map((item) =>\n\t\t\t\t\tthis.customLineItemFromImportDraft.bind(this)(context, item)\n\t\t\t\t) || [],\n\n\t\t\ttotalPrice: createCentPrecisionMoney(draft.totalPrice),\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tprivate lineItemFromImportDraft(\n\t\tcontext: RepositoryContext,\n\t\tdraft: LineItemImportDraft\n\t): LineItem {\n\t\tlet product: Product\n\t\tlet variant: ProductVariant | undefined\n\n\t\tif (draft.variant.sku) {\n\t\t\tvariant = {\n\t\t\t\tid: 0,\n\t\t\t\tsku: draft.variant.sku,\n\t\t\t}\n\n\t\t\tconst items = this._storage.query(context.projectKey, 'product', {\n\t\t\t\twhere: [\n\t\t\t\t\t`masterData(current(masterVariant(sku=\"${draft.variant.sku}\"))) or masterData(current(variants(sku=\"${draft.variant.sku}\")))`,\n\t\t\t\t],\n\t\t\t}) as ProductPagedQueryResponse\n\n\t\t\tif (items.count !== 1) {\n\t\t\t\tthrow new CommercetoolsError<GeneralError>({\n\t\t\t\t\tcode: 'General',\n\t\t\t\t\tmessage: `A product containing a variant with SKU '${draft.variant.sku}' not found.`,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tproduct = items.results[0]\n\t\t\tif (product.masterData.current.masterVariant.sku === draft.variant.sku) {\n\t\t\t\tvariant = product.masterData.current.masterVariant\n\t\t\t} else {\n\t\t\t\tvariant = product.masterData.current.variants.find(\n\t\t\t\t\t(v) => v.sku === draft.variant.sku\n\t\t\t\t)\n\t\t\t}\n\t\t\tif (!variant) {\n\t\t\t\tthrow new Error('Internal state error')\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new Error('No product found')\n\t\t}\n\n\t\tconst lineItem: LineItem = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t\tdiscountedPricePerQuantity: [],\n\t\t\tlineItemMode: 'Standard',\n\t\t\tname: draft.name,\n\t\t\tprice: createPrice(draft.price),\n\t\t\tpriceMode: 'Platform',\n\t\t\tproductId: product.id,\n\t\t\tproductType: product.productType,\n\t\t\tquantity: draft.quantity,\n\t\t\tstate: draft.state || [],\n\t\t\ttaxRate: draft.taxRate,\n\t\t\ttaxedPricePortions: [],\n\t\t\tperMethodTaxRate: [],\n\t\t\ttotalPrice: createCentPrecisionMoney(draft.price.value),\n\t\t\tvariant: {\n\t\t\t\tid: variant.id,\n\t\t\t\tsku: variant.sku,\n\t\t\t\tprice: createPrice(draft.price),\n\t\t\t},\n\t\t}\n\n\t\treturn lineItem\n\t}\n\n\tprivate customLineItemFromImportDraft(\n\t\tcontext: RepositoryContext,\n\t\tdraft: CustomLineItemDraft\n\t): CustomLineItem {\n\t\tconst lineItem: CustomLineItem = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t\tdiscountedPricePerQuantity: [],\n\t\t\tmoney: createTypedMoney(draft.money),\n\t\t\tname: draft.name,\n\t\t\tquantity: draft.quantity ?? 0,\n\t\t\tperMethodTaxRate: [],\n\t\t\tpriceMode: draft.priceMode,\n\t\t\tslug: draft.slug,\n\t\t\tstate: [],\n\t\t\ttotalPrice: createCentPrecisionMoney(draft.money),\n\t\t}\n\n\t\treturn lineItem\n\t}\n\n\tgetWithOrderNumber(\n\t\tcontext: RepositoryContext,\n\t\torderNumber: string,\n\t\tparams: QueryParams = {}\n\t): Order | undefined {\n\t\tconst result = this._storage.query(context.projectKey, this.getTypeId(), {\n\t\t\t...params,\n\t\t\twhere: [`orderNumber=\"${orderNumber}\"`],\n\t\t})\n\t\tif (result.count === 1) {\n\t\t\treturn result.results[0] as Order\n\t\t}\n\n\t\t// Catch this for now, should be checked when creating/updating\n\t\tif (result.count > 1) {\n\t\t\tthrow new Error('Duplicate order numbers')\n\t\t}\n\n\t\treturn\n\t}\n\n\tactions = {\n\t\taddPayment: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Order>,\n\t\t\t{ payment }: OrderAddPaymentAction\n\t\t) => {\n\t\t\tconst resolvedPayment = this._storage.getByResourceIdentifier(\n\t\t\t\tcontext.projectKey,\n\t\t\t\tpayment\n\t\t\t)\n\t\t\tif (!resolvedPayment) {\n\t\t\t\tthrow new Error(`Payment ${payment.id} not found`)\n\t\t\t}\n\n\t\t\tif (!resource.paymentInfo) {\n\t\t\t\tresource.paymentInfo = {\n\t\t\t\t\tpayments: [],\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tresource.paymentInfo.payments.push({\n\t\t\t\ttypeId: 'payment',\n\t\t\t\tid: payment.id!,\n\t\t\t})\n\t\t},\n\t\tchangeOrderState: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Order>,\n\t\t\t{ orderState }: OrderChangeOrderStateAction\n\t\t) => {\n\t\t\tresource.orderState = orderState\n\t\t},\n\t\tchangePaymentState: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Order>,\n\t\t\t{ paymentState }: OrderChangePaymentStateAction\n\t\t) => {\n\t\t\tresource.paymentState = paymentState\n\t\t},\n\t\ttransitionState: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Order>,\n\t\t\t{ state }: OrderTransitionStateAction\n\t\t) => {\n\t\t\tconst resolvedType = this._storage.getByResourceIdentifier(\n\t\t\t\tcontext.projectKey,\n\t\t\t\tstate\n\t\t\t) as State | null\n\n\t\t\tif (!resolvedType) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`No state found with key=${state.key} or id=${state.key}`\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tresource.state = {\n\t\t\t\ttypeId: 'state',\n\t\t\t\tid: resolvedType.id,\n\t\t\t\tobj: { ...resolvedType, key: state.key ?? '' },\n\t\t\t}\n\t\t},\n\t\tsetBillingAddress: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Order>,\n\t\t\t{ address }: OrderSetBillingAddressAction\n\t\t) => {\n\t\t\tresource.billingAddress = createAddress(\n\t\t\t\taddress,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t)\n\t\t},\n\t\tsetCustomerEmail: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Order>,\n\t\t\t{ email }: OrderSetCustomerEmailAction\n\t\t) => {\n\t\t\tresource.customerEmail = email\n\t\t},\n\t\tsetCustomField: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Order,\n\t\t\t{ name, value }: OrderSetCustomFieldAction\n\t\t) => {\n\t\t\tif (!resource.custom) {\n\t\t\t\tthrow new Error('Resource has no custom field')\n\t\t\t}\n\t\t\tresource.custom.fields[name] = value\n\t\t},\n\t\tsetCustomType: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Order>,\n\t\t\t{ type, fields }: OrderSetCustomTypeAction\n\t\t) => {\n\t\t\tif (!type) {\n\t\t\t\tresource.custom = undefined\n\t\t\t} else {\n\t\t\t\tconst resolvedType = this._storage.getByResourceIdentifier(\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\ttype\n\t\t\t\t)\n\t\t\t\tif (!resolvedType) {\n\t\t\t\t\tthrow new Error(`Type ${type} not found`)\n\t\t\t\t}\n\n\t\t\t\tresource.custom = {\n\t\t\t\t\ttype: {\n\t\t\t\t\t\ttypeId: 'type',\n\t\t\t\t\t\tid: resolvedType.id,\n\t\t\t\t\t},\n\t\t\t\t\tfields: fields || {},\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tsetLocale: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Order>,\n\t\t\t{ locale }: OrderSetLocaleAction\n\t\t) => {\n\t\t\tresource.locale = locale\n\t\t},\n\t\tsetOrderNumber: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Order>,\n\t\t\t{ orderNumber }: OrderSetOrderNumberAction\n\t\t) => {\n\t\t\tresource.orderNumber = orderNumber\n\t\t},\n\t\tsetShippingAddress: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Order>,\n\t\t\t{ address }: OrderSetShippingAddressAction\n\t\t) => {\n\t\t\tresource.shippingAddress = createAddress(\n\t\t\t\taddress,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t)\n\t\t},\n\t\tsetStore: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Order>,\n\t\t\t{ store }: OrderSetStoreAction\n\t\t) => {\n\t\t\tif (!store) return\n\t\t\tconst resolvedType = this._storage.getByResourceIdentifier(\n\t\t\t\tcontext.projectKey,\n\t\t\t\tstore\n\t\t\t)\n\t\t\tif (!resolvedType) {\n\t\t\t\tthrow new Error(`No store found with key=${store.key}`)\n\t\t\t}\n\n\t\t\tconst storeReference = resolvedType as Store\n\t\t\tresource.store = {\n\t\t\t\ttypeId: 'store',\n\t\t\t\tkey: storeReference.key,\n\t\t\t}\n\t\t},\n\t}\n}\n","import type {\n\tOrderEdit,\n\tOrderEditDraft,\n\tOrderEditResult,\n\tOrderEditUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\n\nexport class OrderEditRepository extends AbstractResourceRepository<'order-edit'> {\n\tgetTypeId() {\n\t\treturn 'order-edit' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: OrderEditDraft): OrderEdit {\n\t\tconst resource: OrderEdit = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tstagedActions: draft.stagedActions ?? [],\n\t\t\tresource: draft.resource,\n\t\t\tresult: {\n\t\t\t\ttype: 'NotProcessed',\n\t\t\t} as OrderEditResult,\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tOrderEditUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<OrderEdit>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {}\n}\n","import type {\n\tPayment,\n\tPaymentAddTransactionAction,\n\tPaymentChangeTransactionStateAction,\n\tPaymentDraft,\n\tPaymentSetCustomFieldAction,\n\tPaymentSetCustomTypeAction,\n\tPaymentTransitionStateAction,\n\tState,\n\tStateReference,\n\tTransaction,\n\tTransactionDraft,\n} from '@commercetools/platform-sdk'\nimport { v4 as uuidv4 } from 'uuid'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\nimport {\n\tcreateCentPrecisionMoney,\n\tcreateCustomFields,\n\tgetReferenceFromResourceIdentifier,\n} from './helpers.js'\n\nexport class PaymentRepository extends AbstractResourceRepository<'payment'> {\n\tgetTypeId() {\n\t\treturn 'payment' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: PaymentDraft): Payment {\n\t\tconst resource: Payment = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tamountPlanned: createCentPrecisionMoney(draft.amountPlanned),\n\t\t\tpaymentMethodInfo: draft.paymentMethodInfo!,\n\t\t\tpaymentStatus: draft.paymentStatus\n\t\t\t\t? {\n\t\t\t\t\t\t...draft.paymentStatus,\n\t\t\t\t\t\tstate: draft.paymentStatus.state\n\t\t\t\t\t\t\t? getReferenceFromResourceIdentifier<StateReference>(\n\t\t\t\t\t\t\t\t\tdraft.paymentStatus.state,\n\t\t\t\t\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\t\t\t\t\tthis._storage\n\t\t\t\t\t\t\t )\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t }\n\t\t\t\t: {},\n\t\t\ttransactions: (draft.transactions || []).map((t) =>\n\t\t\t\tthis.transactionFromTransactionDraft(t, context)\n\t\t\t),\n\t\t\tinterfaceInteractions: (draft.interfaceInteractions || []).map(\n\t\t\t\t(interaction) =>\n\t\t\t\t\tcreateCustomFields(interaction, context.projectKey, this._storage)!\n\t\t\t),\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t}\n\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\ttransactionFromTransactionDraft = (\n\t\tdraft: TransactionDraft,\n\t\tcontext: RepositoryContext\n\t): Transaction => ({\n\t\t...draft,\n\t\tid: uuidv4(),\n\t\tamount: createCentPrecisionMoney(draft.amount),\n\t\tcustom: createCustomFields(draft.custom, context.projectKey, this._storage),\n\t\tstate: draft.state ?? 'Initial', // Documented as default\n\t})\n\n\tactions = {\n\t\tsetCustomField: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Payment,\n\t\t\t{ name, value }: PaymentSetCustomFieldAction\n\t\t) => {\n\t\t\tif (!resource.custom) {\n\t\t\t\tthrow new Error('Resource has no custom field')\n\t\t\t}\n\n\t\t\tresource.custom.fields[name] = value\n\t\t},\n\t\tsetCustomType: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Payment>,\n\t\t\t{ type, fields }: PaymentSetCustomTypeAction\n\t\t) => {\n\t\t\tif (!type) {\n\t\t\t\tresource.custom = undefined\n\t\t\t} else {\n\t\t\t\tconst resolvedType = this._storage.getByResourceIdentifier(\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\ttype\n\t\t\t\t)\n\t\t\t\tif (!resolvedType) {\n\t\t\t\t\tthrow new Error(`Type ${type} not found`)\n\t\t\t\t}\n\n\t\t\t\tresource.custom = {\n\t\t\t\t\ttype: {\n\t\t\t\t\t\ttypeId: 'type',\n\t\t\t\t\t\tid: resolvedType.id,\n\t\t\t\t\t},\n\t\t\t\t\tfields: fields ?? {},\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\taddTransaction: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Payment>,\n\t\t\t{ transaction }: PaymentAddTransactionAction\n\t\t) => {\n\t\t\tresource.transactions = [\n\t\t\t\t...resource.transactions,\n\t\t\t\tthis.transactionFromTransactionDraft(transaction, context),\n\t\t\t]\n\t\t},\n\t\tchangeTransactionState: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<Payment>,\n\t\t\t{ transactionId, state }: PaymentChangeTransactionStateAction\n\t\t) => {\n\t\t\tconst index = resource.transactions.findIndex(\n\t\t\t\t(e: Transaction) => e.id === transactionId\n\t\t\t)\n\t\t\tconst updatedTransaction: Transaction = {\n\t\t\t\t...resource.transactions[index],\n\t\t\t\tstate,\n\t\t\t}\n\t\t\tresource.transactions[index] = updatedTransaction\n\t\t},\n\t\ttransitionState: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Payment>,\n\t\t\t{ state }: PaymentTransitionStateAction\n\t\t) => {\n\t\t\tconst stateObj = this._storage.getByResourceIdentifier(\n\t\t\t\tcontext.projectKey,\n\t\t\t\tstate\n\t\t\t) as State | null\n\n\t\t\tif (!stateObj) {\n\t\t\t\tthrow new Error(`State ${state} not found`)\n\t\t\t}\n\n\t\t\tresource.paymentStatus.state = {\n\t\t\t\ttypeId: 'state',\n\t\t\t\tid: stateObj.id,\n\t\t\t\tobj: stateObj,\n\t\t\t}\n\t\t},\n\t\t// addInterfaceInteraction: () => {},\n\t\t// changeAmountPlanned: () => {},\n\t\t// changeTransactionInteractionId: () => {},\n\t\t// changeTransactionTimestamp: () => {},\n\t\t// setAmountPaid: () => {},\n\t\t// setAmountRefunded: () => {},\n\t\t// setAnonymousId: () => {},\n\t\t// setAuthorization: () => {},\n\t\t// setCustomer: () => {},\n\t\t// setExternalId: () => {},\n\t\t// setInterfaceId: () => {},\n\t\t// setKey: () => {},\n\t\t// setMethodInfoInterface: () => {},\n\t\t// setMethodInfoMethod: () => {},\n\t\t// setMethodInfoName: () => {},\n\t\t// setStatusInterfaceCode: () => {},\n\t\t// setStatusInterfaceText: () => {},\n\t}\n}\n","import type {\n\tPrice,\n\tPriceDraft,\n\tProduct,\n\tProductData,\n\tProductDraft,\n\tProductPublishAction,\n\tProductSetAttributeAction,\n\tProductSetAttributeInAllVariantsAction,\n\tProductSetDescriptionAction,\n\tProductAddExternalImageAction,\n\tProductRemoveImageAction,\n\tProductSetKeyAction,\n\tProductTypeReference,\n\tProductUpdateAction,\n\tProductVariant,\n\tProductVariantDraft,\n\tProductMoveImageToPositionAction,\n\tProductChangePriceAction,\n\tProductAddPriceAction,\n\tProductRemovePriceAction,\n\tCategoryReference,\n\tInvalidJsonInputError,\n\tInvalidOperationError,\n\tTaxCategoryReference,\n\tStateReference,\n\tProductChangeNameAction,\n\tProductChangeSlugAction,\n\tProductSetMetaTitleAction,\n\tProductSetMetaDescriptionAction,\n\tProductSetMetaKeywordsAction,\n\tProductAddVariantAction,\n\tProductRemoveVariantAction,\n\tProductChangeMasterVariantAction,\n\tProductSetTaxCategoryAction,\n\tProductAddToCategoryAction,\n\tProductRemoveFromCategoryAction,\n\tProductTransitionStateAction,\n} from '@commercetools/platform-sdk'\nimport { v4 as uuidv4 } from 'uuid'\nimport type { Writable } from '../types.js'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\nimport {\n\tcreateTypedMoney,\n\tgetReferenceFromResourceIdentifier,\n} from './helpers.js'\nimport deepEqual from 'deep-equal'\nimport { CommercetoolsError } from '../exceptions.js'\n\nexport class ProductRepository extends AbstractResourceRepository<'product'> {\n\tgetTypeId() {\n\t\treturn 'product' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: ProductDraft): Product {\n\t\tif (!draft.masterVariant) {\n\t\t\tthrow new Error('Missing master variant')\n\t\t}\n\n\t\tlet productType: ProductTypeReference | undefined = undefined\n\t\ttry {\n\t\t\tproductType = getReferenceFromResourceIdentifier<ProductTypeReference>(\n\t\t\t\tdraft.productType,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t)\n\t\t} catch (err) {\n\t\t\t// For now accept missing product types (but warn)\n\t\t\tconsole.warn(\n\t\t\t\t`Error resolving product-type '${draft.productType.id}'. This will be throw an error in later releases.`\n\t\t\t)\n\t\t\tproductType = {\n\t\t\t\ttypeId: 'product-type',\n\t\t\t\tid: draft.productType.id || '',\n\t\t\t}\n\t\t}\n\n\t\t// Resolve Product categories\n\t\tconst categoryReferences: CategoryReference[] = []\n\t\tdraft.categories?.forEach((category) => {\n\t\t\tif (category) {\n\t\t\t\tcategoryReferences.push(\n\t\t\t\t\tgetReferenceFromResourceIdentifier<CategoryReference>(\n\t\t\t\t\t\tcategory,\n\t\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\t\tthis._storage\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tthrow new CommercetoolsError<InvalidJsonInputError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'InvalidJsonInput',\n\t\t\t\t\t\tmessage: 'Request body does not contain valid JSON.',\n\t\t\t\t\t\tdetailedErrorMessage: 'categories: JSON object expected.',\n\t\t\t\t\t},\n\t\t\t\t\t400\n\t\t\t\t)\n\t\t\t}\n\t\t})\n\n\t\t// Resolve Tax category\n\t\tlet taxCategoryReference: TaxCategoryReference | undefined = undefined\n\t\tif (draft.taxCategory) {\n\t\t\ttaxCategoryReference =\n\t\t\t\tgetReferenceFromResourceIdentifier<TaxCategoryReference>(\n\t\t\t\t\tdraft.taxCategory,\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\tthis._storage\n\t\t\t\t)\n\t\t}\n\n\t\t// Resolve Product State\n\t\tlet productStateReference: StateReference | undefined = undefined\n\t\tif (draft.state) {\n\t\t\tproductStateReference =\n\t\t\t\tgetReferenceFromResourceIdentifier<StateReference>(\n\t\t\t\t\tdraft.state,\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\tthis._storage\n\t\t\t\t)\n\t\t}\n\n\t\tconst productData: ProductData = {\n\t\t\tname: draft.name,\n\t\t\tslug: draft.slug,\n\t\t\tdescription: draft.description,\n\t\t\tcategories: categoryReferences,\n\t\t\tmasterVariant: variantFromDraft(1, draft.masterVariant),\n\t\t\tvariants:\n\t\t\t\tdraft.variants?.map((variant, index) =>\n\t\t\t\t\tvariantFromDraft(index + 2, variant)\n\t\t\t\t) ?? [],\n\t\t\tmetaTitle: draft.metaTitle,\n\t\t\tmetaDescription: draft.metaDescription,\n\t\t\tmetaKeywords: draft.metaKeywords,\n\t\t\tsearchKeywords: draft.searchKeywords ?? {},\n\t\t}\n\n\t\tconst resource: Product = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tkey: draft.key,\n\t\t\tproductType: productType,\n\t\t\ttaxCategory: taxCategoryReference,\n\t\t\tstate: productStateReference,\n\t\t\tmasterData: {\n\t\t\t\tcurrent: productData,\n\t\t\t\tstaged: productData,\n\t\t\t\thasStagedChanges: false,\n\t\t\t\tpublished: draft.publish ?? false,\n\t\t\t},\n\t\t}\n\n\t\tthis.saveNew(context, resource)\n\n\t\treturn resource\n\t}\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tProductUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<Product>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {\n\t\tpublish: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ scope }: ProductPublishAction\n\t\t) => {\n\t\t\tresource.masterData.current = resource.masterData.staged\n\t\t\tresource.masterData.published = true\n\t\t\tcheckForStagedChanges(resource)\n\t\t},\n\t\tunpublish: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>\n\t\t\t// { action }: ProductUnpublishAction\n\t\t) => {\n\t\t\tresource.masterData.published = false\n\t\t\tcheckForStagedChanges(resource)\n\t\t},\n\t\tsetAttribute: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ variantId, sku, name, value, staged }: ProductSetAttributeAction\n\t\t) => {\n\t\t\tconst setAttr = (data: Writable<ProductData>) => {\n\t\t\t\tconst { variant, isMasterVariant, variantIndex } = getVariant(\n\t\t\t\t\tdata,\n\t\t\t\t\tvariantId,\n\t\t\t\t\tsku\n\t\t\t\t)\n\t\t\t\tif (!variant) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Variant with id ${variantId} or sku ${sku} not found on product ${resource.id}`\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tif (!variant.attributes) {\n\t\t\t\t\tvariant.attributes = []\n\t\t\t\t}\n\n\t\t\t\tconst existingAttr = variant.attributes.find(\n\t\t\t\t\t(attr) => attr.name === name\n\t\t\t\t)\n\t\t\t\tif (existingAttr) {\n\t\t\t\t\texistingAttr.value = value\n\t\t\t\t} else {\n\t\t\t\t\tvariant.attributes.push({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tif (isMasterVariant) {\n\t\t\t\t\tdata.masterVariant = variant\n\t\t\t\t} else {\n\t\t\t\t\tdata.variants[variantIndex] = variant\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If true, only the staged Attribute is set. If false, both current and\n\t\t\t// staged Attribute is set. Default is true\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\n\t\t\t// Write the attribute to the staged data\n\t\t\tsetAttr(resource.masterData.staged)\n\n\t\t\t// Also write to published data is isStaged = false\n\t\t\t// if isStaged is false we set the attribute on both the staged and\n\t\t\t// published data.\n\t\t\tif (!onlyStaged) {\n\t\t\t\tsetAttr(resource.masterData.current)\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\n\t\t\treturn resource\n\t\t},\n\t\tsetAttributeInAllVariants: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ name, value, staged }: ProductSetAttributeInAllVariantsAction\n\t\t) => {\n\t\t\tconst setAttrInAllVariants = (data: Writable<ProductData>) => {\n\t\t\t\tif (!data.masterVariant.attributes) {\n\t\t\t\t\tdata.masterVariant.attributes = []\n\t\t\t\t}\n\n\t\t\t\tconst existingAttr = data.masterVariant.attributes?.find(\n\t\t\t\t\t(attr) => attr.name === name\n\t\t\t\t)\n\n\t\t\t\tif (existingAttr) {\n\t\t\t\t\texistingAttr.value = value\n\t\t\t\t} else {\n\t\t\t\t\tdata.masterVariant.attributes.push({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tdata.variants.forEach((variant) => {\n\t\t\t\t\tif (!variant.attributes) {\n\t\t\t\t\t\tvariant.attributes = []\n\t\t\t\t\t}\n\n\t\t\t\t\tconst existingAttr = variant.attributes.find(\n\t\t\t\t\t\t(attr) => attr.name === name\n\t\t\t\t\t)\n\t\t\t\t\tif (existingAttr) {\n\t\t\t\t\t\texistingAttr.value = value\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvariant.attributes.push({\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// If true, only the staged Attribute is set. If false, both current and\n\t\t\t// staged Attribute is set. Default is true\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\n\t\t\t// Write the attribute to the staged data\n\t\t\tsetAttrInAllVariants(resource.masterData.staged)\n\n\t\t\t// Also write to published data is isStaged = false\n\t\t\t// if isStaged is false we set the attribute on both the staged and\n\t\t\t// published data.\n\t\t\tif (!onlyStaged) {\n\t\t\t\tsetAttrInAllVariants(resource.masterData.current)\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\n\t\t\treturn resource\n\t\t},\n\t\tsetDescription: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ description, staged }: ProductSetDescriptionAction\n\t\t) => {\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\n\t\t\tresource.masterData.staged.description = description\n\t\t\tif (!onlyStaged) {\n\t\t\t\tresource.masterData.current.description = description\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\t\t\treturn resource\n\t\t},\n\t\tsetKey: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ key }: ProductSetKeyAction\n\t\t) => {\n\t\t\tresource.key = key\n\t\t\treturn resource\n\t\t},\n\t\taddExternalImage: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ variantId, sku, image, staged }: ProductAddExternalImageAction\n\t\t) => {\n\t\t\tconst addImg = (data: Writable<ProductData>) => {\n\t\t\t\tconst { variant, isMasterVariant, variantIndex } = getVariant(\n\t\t\t\t\tdata,\n\t\t\t\t\tvariantId,\n\t\t\t\t\tsku\n\t\t\t\t)\n\t\t\t\tif (!variant) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Variant with id ${variantId} or sku ${sku} not found on product ${resource.id}`\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tif (!variant.images) {\n\t\t\t\t\tvariant.images = []\n\t\t\t\t} else {\n\t\t\t\t\tconst existingImage = variant.images.find((x) => x.url === image.url)\n\t\t\t\t\tif (existingImage) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Cannot add image '${image.url}' because product '${resource.id}' already has that image.`\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Add image\n\t\t\t\tvariant.images.push(image)\n\n\t\t\t\tif (isMasterVariant) {\n\t\t\t\t\tdata.masterVariant = variant\n\t\t\t\t} else {\n\t\t\t\t\tdata.variants[variantIndex] = variant\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If true, only the staged Attribute is set. If false, both current and\n\t\t\t// staged Attribute is set. Default is true\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\n\t\t\t// Write the attribute to the staged data\n\t\t\taddImg(resource.masterData.staged)\n\n\t\t\t// Also write to published data is isStaged = false\n\t\t\t// if isStaged is false we set the attribute on both the staged and\n\t\t\t// published data.\n\t\t\tif (!onlyStaged) {\n\t\t\t\taddImg(resource.masterData.current)\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\n\t\t\treturn resource\n\t\t},\n\t\tremoveImage: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ variantId, sku, imageUrl, staged }: ProductRemoveImageAction\n\t\t) => {\n\t\t\tconst removeImg = (data: Writable<ProductData>) => {\n\t\t\t\tconst { variant, isMasterVariant, variantIndex } = getVariant(\n\t\t\t\t\tdata,\n\t\t\t\t\tvariantId,\n\t\t\t\t\tsku\n\t\t\t\t)\n\t\t\t\tif (!variant) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Variant with id ${variantId} or sku ${sku} not found on product ${resource.id}`\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tconst variantImages = variant.images ?? []\n\t\t\t\tconst existingImage = variantImages.find((x) => x.url === imageUrl)\n\t\t\t\tif (!existingImage) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Cannot remove image '${imageUrl}' because product '${resource.id}' does not have that image.`\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\t// Remove image\n\t\t\t\tvariant.images = variantImages.filter((image) => image.url !== imageUrl)\n\n\t\t\t\tif (isMasterVariant) {\n\t\t\t\t\tdata.masterVariant = variant\n\t\t\t\t} else {\n\t\t\t\t\tdata.variants[variantIndex] = variant\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If true, only the staged Attribute is set. If false, both current and\n\t\t\t// staged Attribute is set. Default is true\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\n\t\t\t// Write the attribute to the staged data\n\t\t\tremoveImg(resource.masterData.staged)\n\n\t\t\t// Also write to published data is isStaged = false\n\t\t\t// if isStaged is false we set the attribute on both the staged and\n\t\t\t// published data.\n\t\t\tif (!onlyStaged) {\n\t\t\t\tremoveImg(resource.masterData.current)\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\n\t\t\treturn resource\n\t\t},\n\t\tmoveImageToPosition: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{\n\t\t\t\tvariantId,\n\t\t\t\tsku,\n\t\t\t\timageUrl,\n\t\t\t\tposition,\n\t\t\t\tstaged,\n\t\t\t}: ProductMoveImageToPositionAction\n\t\t) => {\n\t\t\tconst moveImg = (data: Writable<ProductData>) => {\n\t\t\t\tconst { variant, isMasterVariant, variantIndex } = getVariant(\n\t\t\t\t\tdata,\n\t\t\t\t\tvariantId,\n\t\t\t\t\tsku\n\t\t\t\t)\n\t\t\t\tif (!variant) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Variant with id ${variantId} or sku ${sku} not found on product ${resource.id}`\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tconst variantImages = variant.images ?? []\n\t\t\t\tconst existingImage = variantImages.find((x) => x.url === imageUrl)\n\t\t\t\tif (!existingImage) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Cannot move image '${imageUrl}' because product '${resource.id}' does not have that image.`\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tif (position >= variantImages.length) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Invalid position given. Position in images where the image should be moved. Must be between 0 and the total number of images minus 1.`\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\t// Remove image\n\t\t\t\tvariant.images = variantImages.filter((image) => image.url !== imageUrl)\n\n\t\t\t\t// Re-add image to the correct position\n\t\t\t\tvariant.images.splice(position, 0, existingImage)\n\n\t\t\t\tif (isMasterVariant) {\n\t\t\t\t\tdata.masterVariant = variant\n\t\t\t\t} else {\n\t\t\t\t\tdata.variants[variantIndex] = variant\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If true, only the staged Attribute is set. If false, both current and\n\t\t\t// staged Attribute is set. Default is true\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\n\t\t\t// Write the attribute to the staged data\n\t\t\tmoveImg(resource.masterData.staged)\n\n\t\t\t// Also write to published data is isStaged = false\n\t\t\t// if isStaged is false we set the attribute on both the staged and\n\t\t\t// published data.\n\t\t\tif (!onlyStaged) {\n\t\t\t\tmoveImg(resource.masterData.current)\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\n\t\t\treturn resource\n\t\t},\n\t\taddPrice: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ variantId, sku, price, staged }: ProductAddPriceAction\n\t\t) => {\n\t\t\tconst addVariantPrice = (\n\t\t\t\tdata: Writable<ProductData>,\n\t\t\t\tpriceToAdd: Price\n\t\t\t) => {\n\t\t\t\tconst { variant, isMasterVariant, variantIndex } = getVariant(\n\t\t\t\t\tdata,\n\t\t\t\t\tvariantId,\n\t\t\t\t\tsku\n\t\t\t\t)\n\t\t\t\tif (!variant) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Variant with id ${variantId} or sku ${sku} not found on product ${resource.id}`\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tif (variant.prices === undefined) {\n\t\t\t\t\tvariant.prices = [priceToAdd]\n\t\t\t\t} else {\n\t\t\t\t\tvariant.prices.push(priceToAdd)\n\t\t\t\t}\n\n\t\t\t\tif (isMasterVariant) {\n\t\t\t\t\tdata.masterVariant = variant\n\t\t\t\t} else {\n\t\t\t\t\tdata.variants[variantIndex] = variant\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Pre-creating the price object ensures consistency between staged and current versions\n\t\t\tconst priceToAdd = priceFromDraft(price)\n\n\t\t\t// If true, only the staged Attribute is set. If false, both current and\n\t\t\t// staged Attribute is set. Default is true\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\n\t\t\t// Write the attribute to the staged data\n\t\t\taddVariantPrice(resource.masterData.staged, priceToAdd)\n\n\t\t\t// Also write to published data is isStaged = false\n\t\t\t// if isStaged is false we set the attribute on both the staged and\n\t\t\t// published data.\n\t\t\tif (!onlyStaged) {\n\t\t\t\taddVariantPrice(resource.masterData.current, priceToAdd)\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\n\t\t\treturn resource\n\t\t},\n\t\tchangePrice: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ priceId, price, staged }: ProductChangePriceAction\n\t\t) => {\n\t\t\tconst changeVariantPrice = (data: Writable<ProductData>) => {\n\t\t\t\tconst allVariants = [data.masterVariant, ...(data.variants ?? [])]\n\t\t\t\tconst priceVariant = allVariants.find(\n\t\t\t\t\t(variant) => variant.prices?.some((x) => x.id === priceId)\n\t\t\t\t)\n\t\t\t\tif (!priceVariant) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Price with id ${priceId} not found on product ${resource.id}`\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tconst { variant, isMasterVariant, variantIndex } = getVariant(\n\t\t\t\t\tdata,\n\t\t\t\t\tpriceVariant.id,\n\t\t\t\t\tpriceVariant.sku\n\t\t\t\t)\n\t\t\t\tif (!variant) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Variant with id ${priceVariant.id} or sku ${priceVariant.sku} not found on product ${resource.id}`\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tvariant.prices = variant.prices?.map((x) => {\n\t\t\t\t\tif (x.id === priceId) {\n\t\t\t\t\t\treturn { ...x, ...price } as Price\n\t\t\t\t\t}\n\t\t\t\t\treturn x\n\t\t\t\t})\n\n\t\t\t\tif (isMasterVariant) {\n\t\t\t\t\tdata.masterVariant = variant\n\t\t\t\t} else {\n\t\t\t\t\tdata.variants[variantIndex] = variant\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If true, only the staged Attribute is set. If false, both current and\n\t\t\t// staged Attribute is set. Default is true\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\n\t\t\t// Write the attribute to the staged data\n\t\t\tchangeVariantPrice(resource.masterData.staged)\n\n\t\t\t// Also write to published data is isStaged = false\n\t\t\t// if isStaged is false we set the attribute on both the staged and\n\t\t\t// published data.\n\t\t\tif (!onlyStaged) {\n\t\t\t\tchangeVariantPrice(resource.masterData.current)\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\n\t\t\treturn resource\n\t\t},\n\t\tremovePrice: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ priceId, staged }: ProductRemovePriceAction\n\t\t) => {\n\t\t\tconst removeVariantPrice = (data: Writable<ProductData>) => {\n\t\t\t\tconst allVariants = [data.masterVariant, ...(data.variants ?? [])]\n\t\t\t\tconst priceVariant = allVariants.find(\n\t\t\t\t\t(variant) => variant.prices?.some((x) => x.id === priceId)\n\t\t\t\t)\n\t\t\t\tif (!priceVariant) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Price with id ${priceId} not found on product ${resource.id}`\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tconst { variant, isMasterVariant, variantIndex } = getVariant(\n\t\t\t\t\tdata,\n\t\t\t\t\tpriceVariant.id,\n\t\t\t\t\tpriceVariant.sku\n\t\t\t\t)\n\t\t\t\tif (!variant) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Variant with id ${priceVariant.id} or sku ${priceVariant.sku} not found on product ${resource.id}`\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tvariant.prices = variant.prices?.filter((x) => x.id !== priceId)\n\n\t\t\t\tif (isMasterVariant) {\n\t\t\t\t\tdata.masterVariant = variant\n\t\t\t\t} else {\n\t\t\t\t\tdata.variants[variantIndex] = variant\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If true, only the staged Attribute is set. If false, both current and\n\t\t\t// staged Attribute is set. Default is true\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\n\t\t\t// Write the attribute to the staged data\n\t\t\tremoveVariantPrice(resource.masterData.staged)\n\n\t\t\t// Also write to published data is isStaged = false\n\t\t\t// if isStaged is false we set the attribute on both the staged and\n\t\t\t// published data.\n\t\t\tif (!onlyStaged) {\n\t\t\t\tremoveVariantPrice(resource.masterData.current)\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\n\t\t\treturn resource\n\t\t},\n\t\tchangeName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ name, staged }: ProductChangeNameAction\n\t\t) => {\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\t\t\tresource.masterData.staged.name = name\n\t\t\tif (!onlyStaged) {\n\t\t\t\tresource.masterData.current.name = name\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\t\t\treturn resource\n\t\t},\n\t\tchangeSlug: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ slug, staged }: ProductChangeSlugAction\n\t\t) => {\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\t\t\tresource.masterData.staged.slug = slug\n\t\t\tif (!onlyStaged) {\n\t\t\t\tresource.masterData.current.slug = slug\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\t\t\treturn resource\n\t\t},\n\t\tsetMetaTitle: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ metaTitle, staged }: ProductSetMetaTitleAction\n\t\t) => {\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\t\t\tresource.masterData.staged.metaTitle = metaTitle\n\t\t\tif (!onlyStaged) {\n\t\t\t\tresource.masterData.current.metaTitle = metaTitle\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\t\t\treturn resource\n\t\t},\n\t\tsetMetaDescription: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ metaDescription, staged }: ProductSetMetaDescriptionAction\n\t\t) => {\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\t\t\tresource.masterData.staged.metaDescription = metaDescription\n\t\t\tif (!onlyStaged) {\n\t\t\t\tresource.masterData.current.metaDescription = metaDescription\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\t\t\treturn resource\n\t\t},\n\t\tsetMetaKeywords: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ metaKeywords, staged }: ProductSetMetaKeywordsAction\n\t\t) => {\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\t\t\tresource.masterData.staged.metaKeywords = metaKeywords\n\t\t\tif (!onlyStaged) {\n\t\t\t\tresource.masterData.current.metaKeywords = metaKeywords\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\t\t\treturn resource\n\t\t},\n\t\taddVariant: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{\n\t\t\t\tsku,\n\t\t\t\tkey,\n\t\t\t\tprices,\n\t\t\t\timages,\n\t\t\t\tattributes,\n\t\t\t\tstaged,\n\t\t\t\tassets,\n\t\t\t}: ProductAddVariantAction\n\t\t) => {\n\t\t\tconst variantDraft: ProductVariantDraft = {\n\t\t\t\tsku: sku,\n\t\t\t\tkey: key,\n\t\t\t\tprices: prices,\n\t\t\t\timages: images,\n\t\t\t\tattributes: attributes,\n\t\t\t\tassets: assets,\n\t\t\t}\n\n\t\t\tconst dataStaged = resource.masterData.staged\n\t\t\tconst allVariants = [\n\t\t\t\tdataStaged.masterVariant,\n\t\t\t\t...(dataStaged.variants ?? []),\n\t\t\t]\n\t\t\tconst maxId = allVariants.reduce(\n\t\t\t\t(max, element) => (element.id > max ? element.id : max),\n\t\t\t\t0\n\t\t\t)\n\t\t\tconst variant = variantFromDraft(maxId + 1, variantDraft)\n\t\t\tdataStaged.variants.push(variant)\n\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\n\t\t\tif (!onlyStaged) {\n\t\t\t\tresource.masterData.current.variants.push(variant)\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\n\t\t\treturn resource\n\t\t},\n\t\tremoveVariant: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ id, sku, staged }: ProductRemoveVariantAction\n\t\t) => {\n\t\t\tconst removeVariant = (data: Writable<ProductData>) => {\n\t\t\t\tconst { variant, isMasterVariant, variantIndex } = getVariant(\n\t\t\t\t\tdata,\n\t\t\t\t\tid,\n\t\t\t\t\tsku\n\t\t\t\t)\n\t\t\t\tif (!variant) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Variant with id ${id} or sku ${sku} not found on product ${resource.id}`\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tif (isMasterVariant) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Can not remove the variant [ID:${id}] for [Product:${resource.id}] since it's the master variant`\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tdata.variants.splice(variantIndex, 1)\n\t\t\t}\n\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\n\t\t\tremoveVariant(resource.masterData.staged)\n\n\t\t\tif (!onlyStaged) {\n\t\t\t\tremoveVariant(resource.masterData.current)\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\n\t\t\treturn resource\n\t\t},\n\t\tchangeMasterVariant: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ variantId, sku, staged }: ProductChangeMasterVariantAction\n\t\t) => {\n\t\t\tconst setMaster = (data: Writable<ProductData>) => {\n\t\t\t\tconst { variant, isMasterVariant, variantIndex } = getVariant(\n\t\t\t\t\tdata,\n\t\t\t\t\tvariantId,\n\t\t\t\t\tsku\n\t\t\t\t)\n\t\t\t\tif (!variant) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Variant with id ${variantId} or sku ${sku} not found on product ${resource.id}`\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tif (!isMasterVariant) {\n\t\t\t\t\t// Save previous master variant\n\t\t\t\t\tconst masterVariantPrev = data.masterVariant\n\t\t\t\t\tdata.masterVariant = variant\n\t\t\t\t\t// Remove new master from variants\n\t\t\t\t\tdata.variants.splice(variantIndex, 1)\n\t\t\t\t\t// Add previous master to variants\n\t\t\t\t\tdata.variants.push(masterVariantPrev)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\n\t\t\tsetMaster(resource.masterData.staged)\n\n\t\t\tif (!onlyStaged) {\n\t\t\t\tsetMaster(resource.masterData.current)\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\n\t\t\treturn resource\n\t\t},\n\t\tsetTaxCategory: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ taxCategory }: ProductSetTaxCategoryAction\n\t\t) => {\n\t\t\tlet taxCategoryReference: TaxCategoryReference | undefined = undefined\n\t\t\tif (taxCategory) {\n\t\t\t\ttaxCategoryReference =\n\t\t\t\t\tgetReferenceFromResourceIdentifier<TaxCategoryReference>(\n\t\t\t\t\t\ttaxCategory,\n\t\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\t\tthis._storage\n\t\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tthrow new CommercetoolsError<InvalidJsonInputError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'InvalidJsonInput',\n\t\t\t\t\t\tmessage: 'Request body does not contain valid JSON.',\n\t\t\t\t\t\tdetailedErrorMessage:\n\t\t\t\t\t\t\t'actions -> taxCategory: Missing required value',\n\t\t\t\t\t},\n\t\t\t\t\t400\n\t\t\t\t)\n\t\t\t}\n\t\t\tresource.taxCategory = taxCategoryReference\n\t\t\treturn resource\n\t\t},\n\t\taddToCategory: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ category, staged, orderHint }: ProductAddToCategoryAction\n\t\t) => {\n\t\t\tconst addCategory = (data: Writable<ProductData>) => {\n\t\t\t\tif (category) {\n\t\t\t\t\tdata.categories.push(\n\t\t\t\t\t\tgetReferenceFromResourceIdentifier<CategoryReference>(\n\t\t\t\t\t\t\tcategory,\n\t\t\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\t\t\tthis._storage\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t} else {\n\t\t\t\t\tthrow new CommercetoolsError<InvalidJsonInputError>(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcode: 'InvalidJsonInput',\n\t\t\t\t\t\t\tmessage: 'Request body does not contain valid JSON.',\n\t\t\t\t\t\t\tdetailedErrorMessage:\n\t\t\t\t\t\t\t\t'actions -> category: Missing required value',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t400\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\n\t\t\taddCategory(resource.masterData.staged)\n\n\t\t\tif (!onlyStaged) {\n\t\t\t\taddCategory(resource.masterData.current)\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\n\t\t\treturn resource\n\t\t},\n\t\tremoveFromCategory: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ category, staged }: ProductRemoveFromCategoryAction\n\t\t) => {\n\t\t\tconst removeCategory = (data: Writable<ProductData>) => {\n\t\t\t\tif (category) {\n\t\t\t\t\tconst resolvedCategory =\n\t\t\t\t\t\tgetReferenceFromResourceIdentifier<CategoryReference>(\n\t\t\t\t\t\t\tcategory,\n\t\t\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\t\t\tthis._storage\n\t\t\t\t\t\t)\n\n\t\t\t\t\tconst foundCategory = data.categories.find(\n\t\t\t\t\t\t(productCategory: CategoryReference) => {\n\t\t\t\t\t\t\tif (productCategory.id == resolvedCategory.id) {\n\t\t\t\t\t\t\t\treturn productCategory\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn false\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\n\t\t\t\t\tif (!foundCategory) {\n\t\t\t\t\t\tthrow new CommercetoolsError<InvalidOperationError>(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcode: 'InvalidOperation',\n\t\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\t\t`Cannot remove from category '${resolvedCategory.id}' because product ` +\n\t\t\t\t\t\t\t\t\t`'${resource.masterData.current.name}' is not in that category.`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t400\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\n\t\t\t\t\tdata.categories = data.categories.filter(\n\t\t\t\t\t\t(productCategory: CategoryReference) => {\n\t\t\t\t\t\t\tif (productCategory.id == resolvedCategory.id) {\n\t\t\t\t\t\t\t\treturn false\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\t\t\t\t} else {\n\t\t\t\t\tthrow new CommercetoolsError<InvalidJsonInputError>(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcode: 'InvalidJsonInput',\n\t\t\t\t\t\t\tmessage: 'Request body does not contain valid JSON.',\n\t\t\t\t\t\t\tdetailedErrorMessage:\n\t\t\t\t\t\t\t\t'actions -> category: Missing required value',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t400\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst onlyStaged = staged !== undefined ? staged : true\n\t\t\tremoveCategory(resource.masterData.staged)\n\n\t\t\tif (!onlyStaged) {\n\t\t\t\tremoveCategory(resource.masterData.current)\n\t\t\t}\n\t\t\tcheckForStagedChanges(resource)\n\n\t\t\treturn resource\n\t\t},\n\t\ttransitionState: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Product>,\n\t\t\t{ state, force }: ProductTransitionStateAction\n\t\t) => {\n\t\t\tlet productStateReference: StateReference | undefined = undefined\n\t\t\tif (state) {\n\t\t\t\tproductStateReference =\n\t\t\t\t\tgetReferenceFromResourceIdentifier<StateReference>(\n\t\t\t\t\t\tstate,\n\t\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\t\tthis._storage\n\t\t\t\t\t)\n\t\t\t\tresource.state = productStateReference\n\t\t\t} else {\n\t\t\t\tthrow new CommercetoolsError<InvalidJsonInputError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'InvalidJsonInput',\n\t\t\t\t\t\tmessage: 'Request body does not contain valid JSON.',\n\t\t\t\t\t\tdetailedErrorMessage: 'actions -> state: Missing required value',\n\t\t\t\t\t},\n\t\t\t\t\t400\n\t\t\t\t)\n\t\t\t}\n\n\t\t\treturn resource\n\t\t},\n\n\t\t// 'setPrices': () => {},\n\t\t// 'setProductPriceCustomType': () => {},\n\t\t// 'setProductPriceCustomField': () => {},\n\t\t// 'setDiscountedPrice': () => {},\n\t\t// 'setAttributeInAllVariants': () => {},\n\t\t// 'setCategoryOrderHint': () => {},\n\t\t// 'setSku': () => {},\n\t\t// 'setProductVariantKey': () => {},\n\t\t// 'setImageLabel': () => {},\n\t\t// 'addAsset': () => {},\n\t\t// 'removeAsset': () => {},\n\t\t// 'setAssetKey': () => {},\n\t\t// 'changeAssetOrder': () => {},\n\t\t// 'changeAssetName': () => {},\n\t\t// 'setAssetDescription': () => {},\n\t\t// 'setAssetTags': () => {},\n\t\t// 'setAssetSources': () => {},\n\t\t// 'setAssetCustomType': () => {},\n\t\t// 'setAssetCustomField': () => {},\n\t\t// 'setSearchKeywords': () => {},\n\t\t// 'revertStagedChanges': () => {},\n\t\t// 'revertStagedVariantChanges': () => {},\n\t}\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\tif (!product.masterData.staged) {\n\t\tproduct.masterData.staged = product.masterData.current\n\t}\n\n\tif (deepEqual(product.masterData.current, product.masterData.staged)) {\n\t\tproduct.masterData.hasStagedChanges = false\n\t} else {\n\t\tproduct.masterData.hasStagedChanges = true\n\t}\n}\n\ninterface VariantResult {\n\tvariant: Writable<ProductVariant> | undefined\n\tisMasterVariant: boolean\n\tvariantIndex: number\n}\n\nconst getVariant = (\n\tproductData: ProductData,\n\tvariantId?: number,\n\tsku?: string\n): VariantResult => {\n\tconst variants = [productData.masterVariant, ...productData.variants]\n\tconst foundVariant = variants.find((variant: ProductVariant) => {\n\t\tif (variantId) {\n\t\t\treturn variant.id === variantId\n\t\t}\n\t\tif (sku) {\n\t\t\treturn variant.sku === sku\n\t\t}\n\t\treturn false\n\t})\n\n\tconst isMasterVariant = foundVariant === productData.masterVariant\n\treturn {\n\t\tvariant: foundVariant,\n\t\tisMasterVariant,\n\t\tvariantIndex:\n\t\t\t!isMasterVariant && foundVariant\n\t\t\t\t? productData.variants.indexOf(foundVariant)\n\t\t\t\t: -1,\n\t}\n}\n\nconst variantFromDraft = (\n\tvariantId: number,\n\tvariant: ProductVariantDraft\n): ProductVariant => ({\n\tid: variantId,\n\tsku: variant?.sku,\n\tkey: variant?.key,\n\tattributes: variant?.attributes ?? [],\n\tprices: variant?.prices?.map(priceFromDraft),\n\tassets: [],\n\timages: [],\n})\n\nconst priceFromDraft = (draft: PriceDraft): Price => ({\n\tid: uuidv4(),\n\tkey: draft.key,\n\tcountry: draft.country,\n\tvalue: createTypedMoney(draft.value),\n})\n","import type {\n\tProductDiscount,\n\tProductDiscountChangeIsActiveAction,\n\tProductDiscountChangeNameAction,\n\tProductDiscountChangePredicateAction,\n\tProductDiscountChangeSortOrderAction,\n\tProductDiscountChangeValueAction,\n\tProductDiscountDraft,\n\tProductDiscountSetDescriptionAction,\n\tProductDiscountSetKeyAction,\n\tProductDiscountSetValidFromAction,\n\tProductDiscountSetValidFromAndUntilAction,\n\tProductDiscountSetValidUntilAction,\n\tProductDiscountUpdateAction,\n\tProductDiscountValue,\n\tProductDiscountValueAbsolute,\n\tProductDiscountValueDraft,\n\tProductDiscountValueExternal,\n\tProductDiscountValueRelative,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\nimport { createTypedMoney } from './helpers.js'\n\nexport class ProductDiscountRepository extends AbstractResourceRepository<'product-discount'> {\n\tgetTypeId() {\n\t\treturn 'product-discount' as const\n\t}\n\n\tcreate(\n\t\tcontext: RepositoryContext,\n\t\tdraft: ProductDiscountDraft\n\t): ProductDiscount {\n\t\tconst resource: ProductDiscount = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tkey: draft.key,\n\t\t\tname: draft.name,\n\t\t\tdescription: draft.description,\n\t\t\tvalue: this.transformValueDraft(draft.value),\n\t\t\tpredicate: draft.predicate,\n\t\t\tsortOrder: draft.sortOrder,\n\t\t\tisActive: draft.isActive || false,\n\t\t\tvalidFrom: draft.validFrom,\n\t\t\tvalidUntil: draft.validUntil,\n\t\t\treferences: [],\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tprivate transformValueDraft(\n\t\tvalue: ProductDiscountValueDraft\n\t): ProductDiscountValue {\n\t\tswitch (value.type) {\n\t\t\tcase 'absolute': {\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'absolute',\n\t\t\t\t\tmoney: value.money.map(createTypedMoney),\n\t\t\t\t} as ProductDiscountValueAbsolute\n\t\t\t}\n\t\t\tcase 'external': {\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'external',\n\t\t\t\t} as ProductDiscountValueExternal\n\t\t\t}\n\t\t\tcase 'relative': {\n\t\t\t\treturn {\n\t\t\t\t\t...value,\n\t\t\t\t} as ProductDiscountValueRelative\n\t\t\t}\n\t\t}\n\t}\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tProductDiscountUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<ProductDiscount>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {\n\t\tsetKey: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductDiscount>,\n\t\t\t{ key }: ProductDiscountSetKeyAction\n\t\t) => {\n\t\t\tresource.key = key\n\t\t},\n\t\tsetDescription: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductDiscount>,\n\t\t\t{ description }: ProductDiscountSetDescriptionAction\n\t\t) => {\n\t\t\tif (description && Object.keys(description).length > 0) {\n\t\t\t\tresource.description = description\n\t\t\t} else {\n\t\t\t\tresource.description = undefined\n\t\t\t}\n\t\t},\n\t\tchangeName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductDiscount>,\n\t\t\t{ name }: ProductDiscountChangeNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\t\tchangeValue: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductDiscount>,\n\t\t\t{ value }: ProductDiscountChangeValueAction\n\t\t) => {\n\t\t\tresource.value = this.transformValueDraft(value)\n\t\t},\n\t\tchangePredicate: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductDiscount>,\n\t\t\t{ predicate }: ProductDiscountChangePredicateAction\n\t\t) => {\n\t\t\tresource.predicate = predicate\n\t\t},\n\t\tchangeSortOrder: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductDiscount>,\n\t\t\t{ sortOrder }: ProductDiscountChangeSortOrderAction\n\t\t) => {\n\t\t\tresource.sortOrder = sortOrder\n\t\t},\n\t\tchangeIsActive: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductDiscount>,\n\t\t\t{ isActive }: ProductDiscountChangeIsActiveAction\n\t\t) => {\n\t\t\tresource.isActive = isActive\n\t\t},\n\t\tsetValidFrom: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductDiscount>,\n\t\t\t{ validFrom }: ProductDiscountSetValidFromAction\n\t\t) => {\n\t\t\tresource.validFrom = validFrom\n\t\t},\n\t\tsetValidUntil: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductDiscount>,\n\t\t\t{ validUntil }: ProductDiscountSetValidUntilAction\n\t\t) => {\n\t\t\tresource.validUntil = validUntil\n\t\t},\n\t\tsetValidFromAndUntil: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductDiscount>,\n\t\t\t{ validFrom, validUntil }: ProductDiscountSetValidFromAndUntilAction\n\t\t) => {\n\t\t\tresource.validFrom = validFrom\n\t\t\tresource.validUntil = validUntil\n\t\t},\n\t}\n}\n","/**\n * This module implements the commercetools product projection filter expression.\n */\n\nimport type {\n\tProductProjection,\n\tProductVariant,\n} from '@commercetools/platform-sdk'\nimport { nestedLookup } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport { Lexer, Parser } from './parser.js'\n\ntype MatchFunc = (target: any) => boolean\n\ntype ProductProjectionFilter = (\n\tp: Writable<ProductProjection>,\n\tmarkMatchingVariants: boolean\n) => boolean\n\ntype TypeSymbol = {\n\ttype: 'Symbol'\n\tkind: 'int' | 'string' | 'any'\n\tvalue: any\n}\n\ntype RangeExpressionSet = {\n\tsource: string\n\ttype: 'RangeExpression'\n\tchildren?: RangeExpression[]\n}\n\ntype FilterExpressionSet = {\n\tsource: string\n\ttype: 'FilterExpression'\n\tchildren?: FilterExpression[]\n}\n\ntype TermExpressionSet = {\n\tsource: string\n\ttype: 'TermExpression'\n}\n\ntype ExpressionSet =\n\t| RangeExpressionSet\n\t| FilterExpressionSet\n\t| TermExpressionSet\n\nexport type RangeExpression = {\n\ttype: 'RangeExpression'\n\tstart?: number\n\tstop?: number\n\tmatch: (obj: any) => boolean\n}\n\nexport type FilterExpression = {\n\ttype: 'FilterExpression'\n\tmatch: (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\tfilter: string\n): ProductProjectionFilter => {\n\tconst exprFunc = generateMatchFunc(filter)\n\tconst [source] = filter.split(':', 1)\n\n\tif (source.startsWith('variants.')) {\n\t\treturn filterVariants(source, exprFunc)\n\t}\n\treturn filterProduct(source, exprFunc)\n}\n\nconst getLexer = (value: string) =>\n\tnew Lexer(value)\n\t\t.token('MISSING', /missing(?![-_a-z0-9]+)/i)\n\t\t.token('EXISTS', /exists(?![-_a-z0-9]+)/i)\n\t\t.token('RANGE', /range(?![-_a-z0-9]+)/i)\n\t\t.token('TO', /to(?![-_a-z0-9]+)/i)\n\t\t.token('IDENTIFIER', /[-_.a-z]+/i)\n\n\t\t.token('FLOAT', /\\d+\\.\\d+/)\n\t\t.token('INT', /\\d+/)\n\t\t.token('STRING', /\"((?:\\\\.|[^\"\\\\])*)\"/)\n\t\t.token('STRING', /'((?:\\\\.|[^'\\\\])*)'/)\n\n\t\t.token('COMMA', ',')\n\t\t.token('STAR', '*')\n\t\t.token('(', '(')\n\t\t.token(':', ':')\n\t\t.token(')', ')')\n\t\t.token('\"', '\"')\n\t\t.token('WS', /\\s+/, true) // skip\n\nconst parseFilter = (filter: string): ExpressionSet => {\n\tconst lexer = getLexer(filter)\n\tconst parser = new Parser(lexer)\n\t\t.builder()\n\t\t.nud('IDENTIFIER', 100, (t) => t.token.match)\n\t\t.led(':', 100, ({ left, bp }) => {\n\t\t\tconst parsed: any = parser.parse({ terminals: [bp - 1] })\n\t\t\tconst expressions: RangeExpression[] | FilterExpression[] | TypeSymbol[] =\n\t\t\t\t!Array.isArray(parsed) ? [parsed] : parsed\n\n\t\t\t// Make sure we only have one type of expression (cannot mix)\n\t\t\tconst unique = new Set(expressions.map((expr) => expr.type))\n\t\t\tif (unique.size > 1) {\n\t\t\t\tthrow new Error('Invalid expression')\n\t\t\t}\n\n\t\t\t// Convert plain symbols to a filter expression. For example\n\t\t\t// variants.attribute.foobar:4 where 4 is a Symbol should result\n\t\t\t// in a comparison\n\t\t\tif (expressions.some((expr) => expr.type == 'Symbol')) {\n\t\t\t\treturn {\n\t\t\t\t\tsource: left as string,\n\t\t\t\t\ttype: 'FilterExpression',\n\t\t\t\t\tchildren: expressions.map((e): FilterExpression => {\n\t\t\t\t\t\tif (e.type != 'Symbol') {\n\t\t\t\t\t\t\tthrow new Error('Invalid expression')\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ttype: 'FilterExpression',\n\t\t\t\t\t\t\tmatch: (obj: any): boolean => obj === e.value,\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tsource: left,\n\t\t\t\ttype: expressions[0].type,\n\t\t\t\tchildren: expressions,\n\t\t\t}\n\t\t})\n\t\t.nud(\n\t\t\t'STRING',\n\t\t\t20,\n\t\t\t(t) =>\n\t\t\t\t({\n\t\t\t\t\ttype: 'Symbol',\n\t\t\t\t\tkind: 'string',\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tvalue: t.token.groups[1],\n\t\t\t\t}) as TypeSymbol\n\t\t)\n\t\t.nud(\n\t\t\t'INT',\n\t\t\t5,\n\t\t\t(t) =>\n\t\t\t\t({\n\t\t\t\t\ttype: 'Symbol',\n\t\t\t\t\tkind: 'int',\n\t\t\t\t\tvalue: parseInt(t.token.match, 10),\n\t\t\t\t}) as TypeSymbol\n\t\t)\n\t\t.nud('STAR', 5, (_) => ({\n\t\t\ttype: 'Symbol',\n\t\t\tkind: 'any',\n\t\t\tvalue: null,\n\t\t}))\n\t\t.nud(\n\t\t\t'EXISTS',\n\t\t\t10,\n\t\t\t({ bp }) =>\n\t\t\t\t({\n\t\t\t\t\ttype: 'FilterExpression',\n\t\t\t\t\tmatch: (obj: any): boolean => obj !== undefined,\n\t\t\t\t}) as FilterExpression\n\t\t)\n\t\t.nud(\n\t\t\t'MISSING',\n\t\t\t10,\n\t\t\t({ bp }) =>\n\t\t\t\t({\n\t\t\t\t\ttype: 'FilterExpression',\n\t\t\t\t\tmatch: (obj: any): boolean => obj === undefined,\n\t\t\t\t}) as FilterExpression\n\t\t)\n\t\t.led('COMMA', 200, ({ left, token, bp }) => {\n\t\t\tconst expr: any = parser.parse({ terminals: [bp - 1] })\n\t\t\tif (Array.isArray(expr)) {\n\t\t\t\treturn [left, ...expr]\n\t\t\t} else {\n\t\t\t\treturn [left, expr]\n\t\t\t}\n\t\t})\n\t\t.nud('(', 100, (t) => {\n\t\t\tconst expr: any = parser.parse({ terminals: [')'] })\n\t\t\tlexer.expect(')')\n\t\t\treturn expr\n\t\t})\n\t\t.bp(')', 0)\n\t\t.led('TO', 20, ({ left, bp }) => {\n\t\t\tconst expr: any = parser.parse({ terminals: [bp - 1] })\n\t\t\treturn {\n\t\t\t\tstart: left.value,\n\t\t\t\tstop: expr.value,\n\t\t\t}\n\t\t})\n\t\t.nud('RANGE', 20, ({ bp }) => {\n\t\t\tlet ranges: any = parser.parse()\n\n\t\t\t// If multiple ranges are defined we receive an array of ranges. So let's\n\t\t\t// make sure we always have an array\n\t\t\tif (!Array.isArray(ranges)) {\n\t\t\t\tranges = [ranges]\n\t\t\t}\n\n\t\t\t// Return a list of functions which matches the ranges. These functions\n\t\t\t// are processed as an OR clause\n\t\t\treturn ranges.map((range: any) => {\n\t\t\t\tlet func: (obj: any) => boolean\n\n\t\t\t\tif (range.start !== null && range.stop !== null) {\n\t\t\t\t\tfunc = (obj: any): boolean => obj >= range.start && obj <= range.stop\n\t\t\t\t} else if (range.start === null && range.stop !== null) {\n\t\t\t\t\tfunc = (obj: any): boolean => obj <= range.stop\n\t\t\t\t} else if (range.start !== null && range.stop === null) {\n\t\t\t\t\tfunc = (obj: any): boolean => obj >= range.start\n\t\t\t\t} else {\n\t\t\t\t\tfunc = (obj: any): boolean => true\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'RangeExpression',\n\t\t\t\t\tstart: range.start,\n\t\t\t\t\tstop: range.stop,\n\t\t\t\t\tmatch: func,\n\t\t\t\t} as RangeExpression\n\t\t\t})\n\t\t})\n\t\t.build()\n\n\treturn parser.parse()\n}\n\nconst generateMatchFunc = (filter: string) => {\n\tconst result = parseFilter(filter)\n\tif (!result) {\n\t\t// const lines = filter.split('\\n')\n\t\t// const column = lines[lines.length - 1].length\n\t\tthrow new Error(`Syntax error while parsing '${filter}'.`)\n\t}\n\tif (result.type == 'TermExpression') {\n\t\tthrow new Error(`Syntax error while parsing '${filter}'.`)\n\t}\n\n\treturn (obj: any) => {\n\t\tif (!result.children) return false\n\t\treturn result.children.some((c) => c.match(obj))\n\t}\n}\n\nexport const generateFacetFunc = (filter: string): ExpressionSet => {\n\tif (!filter.includes(':')) {\n\t\treturn {\n\t\t\tsource: filter,\n\t\t\ttype: 'TermExpression',\n\t\t}\n\t}\n\treturn parseFilter(filter)\n}\n\nconst filterProduct =\n\t(source: string, exprFunc: MatchFunc): ProductProjectionFilter =>\n\t(p: ProductProjection, markMatchingVariants: boolean): boolean => {\n\t\tconst value = nestedLookup(p, source)\n\t\treturn exprFunc(value)\n\t}\n\nconst filterVariants =\n\t(source: string, exprFunc: MatchFunc): ProductProjectionFilter =>\n\t(p: ProductProjection, markMatchingVariants: boolean): boolean => {\n\t\tconst [, ...paths] = source.split('.')\n\t\tconst path = paths.join('.')\n\n\t\tconst variants = getVariants(p) as Writable<ProductVariant>[]\n\t\tfor (const variant of variants) {\n\t\t\tconst value = resolveVariantValue(variant, path)\n\n\t\t\tif (exprFunc(value)) {\n\t\t\t\t// If markMatchingVariants parameter is true those ProductVariants that\n\t\t\t\t// match the search query have the additional field isMatchingVariant\n\t\t\t\t// set to true. For the other variants in the same product projection\n\t\t\t\t// this field is set to false.\n\t\t\t\tif (markMatchingVariants) {\n\t\t\t\t\tvariants.forEach((v) => (v.isMatchingVariant = false))\n\t\t\t\t\tvariant.isMatchingVariant = true\n\t\t\t\t}\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n\nexport const resolveVariantValue = (obj: ProductVariant, path: string): any => {\n\tif (path === undefined) {\n\t\treturn obj\n\t}\n\tif (path.startsWith('variants.')) {\n\t\tpath = path.substring(path.indexOf('.') + 1)\n\t}\n\n\tif (path.startsWith('attributes.')) {\n\t\tconst [, attrName, ...rest] = path.split('.')\n\t\tif (!obj.attributes) {\n\t\t\treturn undefined\n\t\t}\n\n\t\tfor (const attr of obj.attributes) {\n\t\t\tif (attr.name === attrName) {\n\t\t\t\treturn nestedLookup(attr.value, rest.join('.'))\n\t\t\t}\n\t\t}\n\t}\n\n\tif (path === 'price.centAmount') {\n\t\treturn obj.prices && obj.prices.length > 0\n\t\t\t? obj.prices[0].value.centAmount\n\t\t\t: undefined\n\t}\n\n\treturn nestedLookup(obj, path)\n}\n\nexport const getVariants = (p: ProductProjection): ProductVariant[] => [\n\tp.masterVariant,\n\t...(p.variants ?? []),\n]\n","import type {\n\tInvalidInputError,\n\tPrice,\n\tProductProjection,\n\tProductVariant,\n} from '@commercetools/platform-sdk'\nimport { CommercetoolsError } from './exceptions.js'\nimport type { Writable } from './types.js'\n\nexport type PriceSelector = {\n\tcurrency?: string\n\tcountry?: string\n\tcustomerGroup?: string\n\tchannel?: 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\tproducts: ProductProjection[],\n\tselector: PriceSelector\n) => {\n\tvalidatePriceSelector(selector)\n\n\tfor (const product of products) {\n\t\tconst variants: Writable<ProductVariant>[] = [\n\t\t\tproduct.masterVariant,\n\t\t\t...(product.variants ?? []),\n\t\t].filter((x) => x != undefined)\n\n\t\tfor (const variant of variants) {\n\t\t\tconst scopedPrices =\n\t\t\t\tvariant.prices?.filter((p) => priceSelectorFilter(p, selector)) ?? []\n\n\t\t\tif (scopedPrices.length > 0) {\n\t\t\t\tconst price = scopedPrices[0]\n\n\t\t\t\tvariant.scopedPriceDiscounted = false\n\t\t\t\tvariant.scopedPrice = {\n\t\t\t\t\t...price,\n\t\t\t\t\tcurrentValue: price.value,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nconst validatePriceSelector = (selector: PriceSelector) => {\n\tif (\n\t\t(selector.country || selector.channel || selector.customerGroup) &&\n\t\t!selector.currency\n\t) {\n\t\tthrow new CommercetoolsError<InvalidInputError>(\n\t\t\t{\n\t\t\t\tcode: 'InvalidInput',\n\t\t\t\tmessage:\n\t\t\t\t\t'The price selecting parameters country, channel and customerGroup ' +\n\t\t\t\t\t'cannot be used without the currency.',\n\t\t\t},\n\t\t\t400\n\t\t)\n\t}\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\tprice: Price,\n\tselector: PriceSelector\n): boolean => {\n\tif (\n\t\t(selector.country || price.country) &&\n\t\tselector.country !== price.country\n\t) {\n\t\treturn false\n\t}\n\n\tif (\n\t\t(selector.currency || price.value.currencyCode) &&\n\t\tselector.currency !== price.value.currencyCode\n\t) {\n\t\treturn false\n\t}\n\n\tif (\n\t\t(selector.channel || price.channel?.id) &&\n\t\tselector.channel !== price.channel?.id\n\t) {\n\t\treturn false\n\t}\n\n\tif (\n\t\t(selector.customerGroup || price.customerGroup?.id) &&\n\t\tselector.customerGroup !== price.customerGroup?.id\n\t) {\n\t\treturn false\n\t}\n\n\treturn true\n}\n","import type {\n\tFacetResults,\n\tFilteredFacetResult,\n\tInvalidInputError,\n\tProduct,\n\tProductProjection,\n\tProductProjectionPagedSearchResponse,\n\tQueryParam,\n\tRangeFacetResult,\n\tTermFacetResult,\n} from '@commercetools/platform-sdk'\nimport { CommercetoolsError } from './exceptions.js'\nimport { nestedLookup } from './helpers.js'\nimport {\n\tFilterExpression,\n\tRangeExpression,\n\tgenerateFacetFunc,\n\tgetVariants,\n\tparseFilterExpression,\n\tresolveVariantValue,\n} from './lib/projectionSearchFilter.js'\nimport { applyPriceSelector } from './priceSelector.js'\nimport { AbstractStorage } from './storage/index.js'\nimport type { Writable } from './types.js'\n\nexport type ProductProjectionSearchParams = {\n\tfuzzy?: boolean\n\tfuzzyLevel?: number\n\tmarkMatchingVariants?: boolean\n\tstaged?: boolean\n\tfilter?: string[]\n\t'filter.facets'?: string[]\n\t'filter.query'?: string[]\n\tfacet?: string | string[]\n\tsort?: string | string[]\n\tlimit?: number\n\toffset?: number\n\twithTotal?: boolean\n\tpriceCurrency?: string\n\tpriceCountry?: string\n\tpriceCustomerGroup?: string\n\tpriceChannel?: string\n\tlocaleProjection?: string\n\tstoreProjection?: string\n\texpand?: string | string[]\n\t[key: string]: QueryParam\n}\n\nexport class ProductProjectionSearch {\n\tprotected _storage: AbstractStorage\n\n\tconstructor(storage: AbstractStorage) {\n\t\tthis._storage = storage\n\t}\n\n\tsearch(\n\t\tprojectKey: string,\n\t\tparams: ProductProjectionSearchParams\n\t): ProductProjectionPagedSearchResponse {\n\t\tlet resources = this._storage\n\t\t\t.all(projectKey, 'product')\n\t\t\t.map((r) => this.transform(r, params.staged ?? false))\n\t\t\t.filter((p) => {\n\t\t\t\tif (!params.staged ?? false) {\n\t\t\t\t\treturn p.published\n\t\t\t\t}\n\t\t\t\treturn true\n\t\t\t})\n\n\t\tconst markMatchingVariant = params.markMatchingVariants ?? false\n\n\t\t// Apply the priceSelector\n\t\tapplyPriceSelector(resources, {\n\t\t\tcountry: params.priceCountry,\n\t\t\tchannel: params.priceChannel,\n\t\t\tcustomerGroup: params.priceCustomerGroup,\n\t\t\tcurrency: params.priceCurrency,\n\t\t})\n\n\t\t// Apply filters pre facetting\n\t\tif (params.filter) {\n\t\t\ttry {\n\t\t\t\tconst filters = params.filter.map(parseFilterExpression)\n\n\t\t\t\t// Filters can modify the output. So clone the resources first.\n\t\t\t\tresources = resources.filter((resource) =>\n\t\t\t\t\tfilters.every((f) => f(resource, markMatchingVariant))\n\t\t\t\t)\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(err)\n\t\t\t\tthrow new CommercetoolsError<InvalidInputError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'InvalidInput',\n\t\t\t\t\t\tmessage: (err as any).message,\n\t\t\t\t\t},\n\t\t\t\t\t400\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\t// TODO: Calculate facets\n\t\tconst facets = this.getFacets(params, resources)\n\n\t\t// Apply filters post facetting\n\t\tif (params['filter.query']) {\n\t\t\ttry {\n\t\t\t\tconst filters = params['filter.query'].map(parseFilterExpression)\n\t\t\t\tresources = resources.filter((resource) =>\n\t\t\t\t\tfilters.every((f) => f(resource, markMatchingVariant))\n\t\t\t\t)\n\t\t\t} catch (err) {\n\t\t\t\tthrow new CommercetoolsError<InvalidInputError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'InvalidInput',\n\t\t\t\t\t\tmessage: (err as any).message,\n\t\t\t\t\t},\n\t\t\t\t\t400\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\t// Expand the resources\n\t\tif (params.expand !== undefined) {\n\t\t\tresources = resources.map((resource) =>\n\t\t\t\tthis._storage.expand(projectKey, resource, params.expand)\n\t\t\t)\n\t\t}\n\n\t\t// Create a slice for the pagination. If we were working with large datasets\n\t\t// then we should have done this before transforming. But that isn't the\n\t\t// goal of this library. So lets keep it simple.\n\t\tconst totalResults = resources.length\n\t\tconst offset = params.offset || 0\n\t\tconst limit = params.limit || 20\n\t\tconst results = resources.slice(offset, offset + limit)\n\n\t\treturn {\n\t\t\tcount: totalResults,\n\t\t\ttotal: results.length,\n\t\t\toffset: offset,\n\t\t\tlimit: limit,\n\t\t\tresults: results,\n\t\t\tfacets: facets,\n\t\t}\n\t}\n\n\ttransform(product: Product, staged: boolean): ProductProjection {\n\t\tconst obj = !staged ? product.masterData.current : product.masterData.staged\n\n\t\treturn {\n\t\t\tid: product.id,\n\t\t\tcreatedAt: product.createdAt,\n\t\t\tlastModifiedAt: product.lastModifiedAt,\n\t\t\tversion: product.version,\n\t\t\tname: obj.name,\n\t\t\tkey: product.key,\n\t\t\tdescription: obj.description,\n\t\t\tmetaDescription: obj.metaDescription,\n\t\t\tslug: obj.slug,\n\t\t\tcategories: obj.categories,\n\t\t\tmasterVariant: obj.masterVariant,\n\t\t\tvariants: obj.variants,\n\t\t\tproductType: product.productType,\n\t\t\thasStagedChanges: product.masterData.hasStagedChanges,\n\t\t\tpublished: product.masterData.published,\n\t\t}\n\t}\n\n\tgetFacets(\n\t\tparams: ProductProjectionSearchParams,\n\t\tproducts: ProductProjection[]\n\t): FacetResults {\n\t\tif (!params.facet) return {}\n\t\tconst result: FacetResults = {}\n\n\t\tconst regexp = new RegExp(/ counting products$/)\n\t\tfor (let facet of params.facet) {\n\t\t\tlet countProducts = false\n\t\t\tif (facet.endsWith(' counting products')) {\n\t\t\t\tfacet = facet.replace(regexp, '')\n\t\t\t\tcountProducts = true\n\t\t\t}\n\n\t\t\tconst expression = generateFacetFunc(facet)\n\n\t\t\t// Term Facet\n\t\t\tif (expression.type === 'TermExpression') {\n\t\t\t\tresult[facet] = this.termFacet(\n\t\t\t\t\texpression.source,\n\t\t\t\t\tproducts,\n\t\t\t\t\tcountProducts\n\t\t\t\t)\n\t\t\t}\n\n\t\t\t// Range Facet\n\t\t\tif (expression.type === 'RangeExpression') {\n\t\t\t\tresult[expression.source] = this.rangeFacet(\n\t\t\t\t\texpression.source,\n\t\t\t\t\texpression.children,\n\t\t\t\t\tproducts,\n\t\t\t\t\tcountProducts\n\t\t\t\t)\n\t\t\t}\n\n\t\t\t// FilteredFacet\n\t\t\tif (expression.type === 'FilterExpression') {\n\t\t\t\tresult[expression.source] = this.filterFacet(\n\t\t\t\t\texpression.source,\n\t\t\t\t\texpression.children,\n\t\t\t\t\tproducts,\n\t\t\t\t\tcountProducts\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\treturn result\n\t}\n\n\t/**\n\t * TODO: This implemention needs the following additional features:\n\t * - counting products\n\t * - correct dataType\n\t */\n\ttermFacet(\n\t\tfacet: string,\n\t\tproducts: ProductProjection[],\n\t\tcountProducts: boolean\n\t): TermFacetResult {\n\t\tconst result: Writable<TermFacetResult> = {\n\t\t\ttype: 'terms',\n\t\t\tdataType: 'text',\n\t\t\tmissing: 0,\n\t\t\ttotal: 0,\n\t\t\tother: 0,\n\t\t\tterms: [],\n\t\t}\n\t\tconst terms: Record<any, number> = {}\n\n\t\tif (facet.startsWith('variants.')) {\n\t\t\tproducts.forEach((p) => {\n\t\t\t\tconst variants = getVariants(p)\n\t\t\t\tvariants.forEach((v) => {\n\t\t\t\t\tresult.total++\n\n\t\t\t\t\tlet value = resolveVariantValue(v, facet)\n\t\t\t\t\tif (value === undefined) {\n\t\t\t\t\t\tresult.missing++\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (typeof value === 'number') {\n\t\t\t\t\t\t\tvalue = Number(value).toFixed(1)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tterms[value] = value in terms ? terms[value] + 1 : 1\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t} else {\n\t\t\tproducts.forEach((p) => {\n\t\t\t\tconst value = nestedLookup(p, facet)\n\t\t\t\tresult.total++\n\t\t\t\tif (value === undefined) {\n\t\t\t\t\tresult.missing++\n\t\t\t\t} else {\n\t\t\t\t\tterms[value] = value in terms ? terms[value] + 1 : 1\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t\tfor (const term in terms) {\n\t\t\tresult.terms.push({\n\t\t\t\tterm: term as any,\n\t\t\t\tcount: terms[term],\n\t\t\t})\n\t\t}\n\n\t\treturn result\n\t}\n\n\tfilterFacet(\n\t\tsource: string,\n\t\tfilters: FilterExpression[] | undefined,\n\t\tproducts: ProductProjection[],\n\t\tcountProducts: boolean\n\t): FilteredFacetResult {\n\t\tlet count = 0\n\t\tif (source.startsWith('variants.')) {\n\t\t\tfor (const p of products) {\n\t\t\t\tfor (const v of getVariants(p)) {\n\t\t\t\t\tconst val = resolveVariantValue(v, source)\n\t\t\t\t\tif (filters?.some((f) => f.match(val))) {\n\t\t\t\t\t\tcount++\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new Error('not supported')\n\t\t}\n\n\t\treturn {\n\t\t\ttype: 'filter',\n\t\t\tcount: count,\n\t\t}\n\t}\n\n\trangeFacet(\n\t\tsource: string,\n\t\tranges: RangeExpression[] | undefined,\n\t\tproducts: ProductProjection[],\n\t\tcountProducts: boolean\n\t): RangeFacetResult {\n\t\tconst counts =\n\t\t\tranges?.map((range) => {\n\t\t\t\tif (source.startsWith('variants.')) {\n\t\t\t\t\tconst values = []\n\t\t\t\t\tfor (const p of products) {\n\t\t\t\t\t\tfor (const v of getVariants(p)) {\n\t\t\t\t\t\t\tconst val = resolveVariantValue(v, source)\n\t\t\t\t\t\t\tif (val === undefined) {\n\t\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (range.match(val)) {\n\t\t\t\t\t\t\t\tvalues.push(val)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst numValues = values.length\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: 'double',\n\t\t\t\t\t\tfrom: range.start || 0,\n\t\t\t\t\t\tfromStr: range.start !== null ? Number(range.start).toFixed(1) : '',\n\t\t\t\t\t\tto: range.stop || 0,\n\t\t\t\t\t\ttoStr: range.stop !== null ? Number(range.stop).toFixed(1) : '',\n\t\t\t\t\t\tcount: numValues,\n\t\t\t\t\t\t// totalCount: 0,\n\t\t\t\t\t\ttotal: values.reduce((a, b) => a + b, 0),\n\t\t\t\t\t\tmin: numValues > 0 ? Math.min(...values) : 0,\n\t\t\t\t\t\tmax: numValues > 0 ? Math.max(...values) : 0,\n\t\t\t\t\t\tmean: numValues > 0 ? mean(values) : 0,\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('not supported')\n\t\t\t\t}\n\t\t\t}) || []\n\t\tconst data: RangeFacetResult = {\n\t\t\ttype: 'range',\n\t\t\t// @ts-ignore\n\t\t\tdataType: 'number',\n\t\t\tranges: counts,\n\t\t}\n\t\treturn data\n\t}\n}\n\nconst mean = (arr: number[]) => {\n\tlet total = 0\n\tfor (let i = 0; i < arr.length; i++) {\n\t\ttotal += arr[i]\n\t}\n\treturn total / arr.length\n}\n","import type {\n\tInvalidInputError,\n\tProductDraft,\n\tProductProjection,\n\tQueryParam,\n} from '@commercetools/platform-sdk'\nimport { CommercetoolsError } from '../exceptions.js'\nimport { parseQueryExpression } from '../lib/predicateParser.js'\nimport { ProductProjectionSearch } from '../product-projection-search.js'\nimport { type AbstractStorage } from '../storage/index.js'\nimport {\n\tAbstractResourceRepository,\n\tGetParams,\n\tRepositoryContext,\n} from './abstract.js'\n\nexport type ProductProjectionQueryParams = {\n\tstaged?: boolean\n\tpriceCurrency?: string\n\tpriceCountry?: string\n\tpriceCustomerGroup?: string\n\tpriceChannel?: string\n\tlocaleProjection?: string\n\tstoreProjection?: string\n\texpand?: string | string[]\n\tsort?: string | string[]\n\tlimit?: number\n\toffset?: number\n\twithTotal?: boolean\n\twhere?: string | string[]\n\t[key: string]: QueryParam\n}\n\nexport class ProductProjectionRepository extends AbstractResourceRepository<'product-projection'> {\n\tprotected _searchService: ProductProjectionSearch\n\n\tconstructor(storage: AbstractStorage) {\n\t\tsuper(storage)\n\t\tthis._searchService = new ProductProjectionSearch(storage)\n\t}\n\n\tgetTypeId() {\n\t\treturn 'product-projection' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: ProductDraft): ProductProjection {\n\t\tthrow new Error('No valid action')\n\t}\n\n\tget(\n\t\tcontext: RepositoryContext,\n\t\tid: string,\n\t\tparams: GetParams = {}\n\t): ProductProjection | null {\n\t\tconst resource = this._storage.get(\n\t\t\tcontext.projectKey,\n\t\t\t'product',\n\t\t\tid,\n\t\t\tparams\n\t\t)\n\t\tif (resource) {\n\t\t\treturn this._searchService.transform(resource, false)\n\t\t}\n\t\treturn null\n\t}\n\n\tquery(context: RepositoryContext, params: ProductProjectionQueryParams = {}) {\n\t\tlet resources = this._storage\n\t\t\t.all(context.projectKey, 'product')\n\t\t\t.map((r) => this._searchService.transform(r, params.staged ?? false))\n\t\t\t.filter((p) => {\n\t\t\t\tif (!params.staged ?? false) {\n\t\t\t\t\treturn p.published\n\t\t\t\t}\n\t\t\t\treturn true\n\t\t\t})\n\n\t\t// Apply predicates\n\t\tif (params.where) {\n\t\t\tconst variableMap: Record<string, QueryParam> = {}\n\t\t\tfor (const [k, v] of Object.entries(params)) {\n\t\t\t\tif (k.startsWith('var.')) {\n\t\t\t\t\tvariableMap[k.substring(4)] = v\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst filterFunc = parseQueryExpression(params.where)\n\t\t\t\tresources = resources.filter((resource) =>\n\t\t\t\t\tfilterFunc(resource, variableMap)\n\t\t\t\t)\n\t\t\t} catch (err) {\n\t\t\t\tthrow new CommercetoolsError<InvalidInputError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'InvalidInput',\n\t\t\t\t\t\tmessage: (err as any).message,\n\t\t\t\t\t},\n\t\t\t\t\t400\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\t// Expand the resources\n\t\tif (params.expand !== undefined) {\n\t\t\tresources = resources.map((resource) =>\n\t\t\t\tthis._storage.expand(context.projectKey, resource, params.expand)\n\t\t\t)\n\t\t}\n\n\t\t// Create a slice for the pagination. If we were working with large datasets\n\t\t// then we should have done this before transforming. But that isn't the\n\t\t// goal of this library. So lets keep it simple.\n\t\tconst totalResults = resources.length\n\t\tconst offset = params.offset || 0\n\t\tconst limit = params.limit || 20\n\t\tconst results = resources.slice(offset, offset + limit)\n\n\t\treturn {\n\t\t\tcount: totalResults,\n\t\t\ttotal: results.length,\n\t\t\toffset: offset,\n\t\t\tlimit: limit,\n\t\t\tresults: results,\n\t\t}\n\t}\n\n\tsearch(context: RepositoryContext, query: ProductProjectionQueryParams) {\n\t\treturn this._searchService.search(context.projectKey, query)\n\t}\n\n\tactions = {}\n}\n","import type {\n\tProductSelection,\n\tProductSelectionChangeNameAction,\n\tProductSelectionDraft,\n\tProductSelectionUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\n\nexport class ProductSelectionRepository extends AbstractResourceRepository<'product-selection'> {\n\tgetTypeId() {\n\t\treturn 'product-selection' as const\n\t}\n\n\tcreate(\n\t\tcontext: RepositoryContext,\n\t\tdraft: ProductSelectionDraft\n\t): ProductSelection {\n\t\tconst resource: ProductSelection = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tproductCount: 0,\n\t\t\tkey: draft.key,\n\t\t\tname: draft.name,\n\t\t\ttype: 'individual',\n\t\t\tmode: 'Individual',\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tProductSelectionUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<ProductSelection>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {\n\t\tchangeName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductSelection>,\n\t\t\t{ name }: ProductSelectionChangeNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\t}\n}\n","import type {\n\tAttributeDefinition,\n\tAttributeDefinitionDraft,\n\tAttributeType,\n\tProductType,\n\tProductTypeAddAttributeDefinitionAction,\n\tProductTypeChangeAttributeOrderByNameAction,\n\tProductTypeChangeLabelAction,\n\tProductTypeChangeLocalizedEnumValueLabelAction,\n\tProductTypeDraft,\n\tProductTypeRemoveAttributeDefinitionAction,\n\tProductTypeRemoveEnumValuesAction,\n\tProductTypeUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\n\nexport class ProductTypeRepository extends AbstractResourceRepository<'product-type'> {\n\tgetTypeId() {\n\t\treturn 'product-type' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: ProductTypeDraft): ProductType {\n\t\tconst resource: ProductType = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tkey: draft.key,\n\t\t\tname: draft.name,\n\t\t\tdescription: draft.description,\n\t\t\tattributes: (draft.attributes ?? []).map((a) =>\n\t\t\t\tthis.attributeDefinitionFromAttributeDefinitionDraft(context, a)\n\t\t\t),\n\t\t}\n\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tattributeDefinitionFromAttributeDefinitionDraft = (\n\t\t_context: RepositoryContext,\n\t\tdraft: AttributeDefinitionDraft\n\t): AttributeDefinition => ({\n\t\t...draft,\n\t\tattributeConstraint: draft.attributeConstraint ?? 'None',\n\t\tinputHint: draft.inputHint ?? 'SingleLine',\n\t\tinputTip:\n\t\t\tdraft.inputTip && Object.keys(draft.inputTip).length > 0\n\t\t\t\t? draft.inputTip\n\t\t\t\t: undefined,\n\t\tisSearchable: draft.isSearchable ?? true,\n\t})\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tProductTypeUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<ProductType>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {\n\t\tchangeLocalizedEnumValueLabel: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductType>,\n\t\t\t{\n\t\t\t\tattributeName,\n\t\t\t\tnewValue,\n\t\t\t}: ProductTypeChangeLocalizedEnumValueLabelAction\n\t\t) => {\n\t\t\tconst updateAttributeType = (type: Writable<AttributeType>) => {\n\t\t\t\tswitch (type.name) {\n\t\t\t\t\tcase 'lenum':\n\t\t\t\t\t\ttype.values.forEach((v) => {\n\t\t\t\t\t\t\tif (v.key === newValue.key) {\n\t\t\t\t\t\t\t\tv.label = newValue.label\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\treturn\n\t\t\t\t\tcase 'set':\n\t\t\t\t\t\tupdateAttributeType(type.elementType)\n\t\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tresource.attributes?.forEach((value) => {\n\t\t\t\tif (value.name === attributeName) {\n\t\t\t\t\tupdateAttributeType(value.type)\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\tchangeLabel: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductType>,\n\t\t\t{ attributeName, label }: ProductTypeChangeLabelAction\n\t\t) => {\n\t\t\tresource.attributes?.forEach((value) => {\n\t\t\t\tif (value.name === attributeName) {\n\t\t\t\t\tvalue.label = label\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\taddAttributeDefinition: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductType>,\n\t\t\t{ attribute }: ProductTypeAddAttributeDefinitionAction\n\t\t) => {\n\t\t\tresource.attributes?.push(\n\t\t\t\tthis.attributeDefinitionFromAttributeDefinitionDraft(context, attribute)\n\t\t\t)\n\t\t},\n\t\tchangeAttributeOrderByName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductType>,\n\t\t\t{ attributeNames }: ProductTypeChangeAttributeOrderByNameAction\n\t\t) => {\n\t\t\tconst attrs = new Map(\n\t\t\t\tresource.attributes?.map((item) => [item.name, item])\n\t\t\t)\n\t\t\tconst result: AttributeDefinition[] = []\n\t\t\tlet current = resource.attributes\n\n\t\t\tattributeNames.forEach((attrName) => {\n\t\t\t\tconst attr = attrs.get(attrName)\n\t\t\t\tif (attr === undefined) {\n\t\t\t\t\tthrow new Error('New attr')\n\t\t\t\t}\n\t\t\t\tresult.push(attr)\n\n\t\t\t\t// Remove from current items\n\t\t\t\tcurrent = current?.filter((f) => f.name !== attrName)\n\t\t\t})\n\n\t\t\tresource.attributes = result\n\t\t\t// Add attrs which were not specified in the order as last items. Not\n\t\t\t// sure if this follows commercetools\n\t\t\tif (current) {\n\t\t\t\tresource.attributes.push(...current)\n\t\t\t}\n\t\t},\n\t\tremoveAttributeDefinition: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductType>,\n\t\t\t{ name }: ProductTypeRemoveAttributeDefinitionAction\n\t\t) => {\n\t\t\tresource.attributes = resource.attributes?.filter((f) => f.name !== name)\n\t\t},\n\t\tremoveEnumValues: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ProductType>,\n\t\t\t{ attributeName, keys }: ProductTypeRemoveEnumValuesAction\n\t\t) => {\n\t\t\tresource.attributes?.forEach((attr) => {\n\t\t\t\tif (attr.name == attributeName) {\n\t\t\t\t\tif (attr.type.name == 'enum') {\n\t\t\t\t\t\tattr.type.values = attr.type.values.filter(\n\t\t\t\t\t\t\t(v) => !keys.includes(v.key)\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\n\t\t\t\t\tif (attr.type.name == 'set') {\n\t\t\t\t\t\tif (attr.type.elementType.name == 'enum') {\n\t\t\t\t\t\t\tattr.type.elementType.values =\n\t\t\t\t\t\t\t\tattr.type.elementType.values.filter(\n\t\t\t\t\t\t\t\t\t(v) => !keys.includes(v.key)\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t}\n}\n","import type {\n\tProject,\n\tProjectChangeCartsConfigurationAction,\n\tProjectChangeCountriesAction,\n\tProjectChangeCountryTaxRateFallbackEnabledAction,\n\tProjectChangeCurrenciesAction,\n\tProjectChangeLanguagesAction,\n\tProjectChangeMessagesConfigurationAction,\n\tProjectChangeNameAction,\n\tProjectChangeOrderSearchStatusAction,\n\tProjectChangeProductSearchIndexingEnabledAction,\n\tProjectSetExternalOAuthAction,\n\tProjectSetShippingRateInputTypeAction,\n\tProjectUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { maskSecretValue } from '../lib/masking.js'\nimport type { Writable } from '../types.js'\nimport { AbstractRepository, RepositoryContext } from './abstract.js'\n\nexport class ProjectRepository extends AbstractRepository<Project> {\n\tget(context: RepositoryContext): Project | null {\n\t\tconst resource = this._storage.getProject(context.projectKey)\n\t\treturn this.postProcessResource(resource)\n\t}\n\n\tpostProcessResource(resource: Project): Project {\n\t\tif (resource) {\n\t\t\treturn maskSecretValue(resource, 'externalOAuth.authorizationHeader')\n\t\t}\n\t\treturn resource\n\t}\n\n\tsaveNew(context: RepositoryContext, resource: Writable<Project>) {\n\t\tresource.version = 1\n\t\tthis._storage.saveProject(resource)\n\t}\n\n\tsaveUpdate(context: RepositoryContext, version: number, resource: Project) {\n\t\tthis._storage.saveProject(resource)\n\t}\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tProjectUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<Project>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {\n\t\tchangeName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Project>,\n\t\t\t{ name }: ProjectChangeNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\t\tchangeCurrencies: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Project>,\n\t\t\t{ currencies }: ProjectChangeCurrenciesAction\n\t\t) => {\n\t\t\tresource.currencies = currencies\n\t\t},\n\t\tchangeCountries: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Project>,\n\t\t\t{ countries }: ProjectChangeCountriesAction\n\t\t) => {\n\t\t\tresource.countries = countries\n\t\t},\n\t\tchangeLanguages: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Project>,\n\t\t\t{ languages }: ProjectChangeLanguagesAction\n\t\t) => {\n\t\t\tresource.languages = languages\n\t\t},\n\t\tchangeMessagesConfiguration: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Project>,\n\t\t\t{ messagesConfiguration }: ProjectChangeMessagesConfigurationAction\n\t\t) => {\n\t\t\tresource.messages.enabled = messagesConfiguration.enabled\n\t\t\tresource.messages.deleteDaysAfterCreation =\n\t\t\t\tmessagesConfiguration.deleteDaysAfterCreation\n\t\t},\n\t\tchangeProductSearchIndexingEnabled: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Project>,\n\t\t\t{ enabled }: ProjectChangeProductSearchIndexingEnabledAction\n\t\t) => {\n\t\t\tif (!resource.searchIndexing?.products) {\n\t\t\t\tthrow new Error('Invalid project state')\n\t\t\t}\n\t\t\tresource.searchIndexing.products.status = enabled\n\t\t\t\t? 'Activated'\n\t\t\t\t: 'Deactivated'\n\t\t\tresource.searchIndexing.products.lastModifiedAt = new Date().toISOString()\n\t\t},\n\t\tchangeOrderSearchStatus: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Project>,\n\t\t\t{ status }: ProjectChangeOrderSearchStatusAction\n\t\t) => {\n\t\t\tif (!resource.searchIndexing?.orders) {\n\t\t\t\tthrow new Error('Invalid project state')\n\t\t\t}\n\t\t\tresource.searchIndexing.orders.status = status\n\t\t\tresource.searchIndexing.orders.lastModifiedAt = new Date().toISOString()\n\t\t},\n\t\tsetShippingRateInputType: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Project>,\n\t\t\t{ shippingRateInputType }: ProjectSetShippingRateInputTypeAction\n\t\t) => {\n\t\t\tresource.shippingRateInputType = shippingRateInputType\n\t\t},\n\t\tsetExternalOAuth: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Project>,\n\t\t\t{ externalOAuth }: ProjectSetExternalOAuthAction\n\t\t) => {\n\t\t\tresource.externalOAuth = externalOAuth\n\t\t},\n\t\tchangeCountryTaxRateFallbackEnabled: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Project>,\n\t\t\t{\n\t\t\t\tcountryTaxRateFallbackEnabled,\n\t\t\t}: ProjectChangeCountryTaxRateFallbackEnabledAction\n\t\t) => {\n\t\t\tresource.carts.countryTaxRateFallbackEnabled =\n\t\t\t\tcountryTaxRateFallbackEnabled\n\t\t},\n\t\tchangeCartsConfiguration: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Project>,\n\t\t\t{ cartsConfiguration }: ProjectChangeCartsConfigurationAction\n\t\t) => {\n\t\t\tresource.carts = cartsConfiguration || {\n\t\t\t\tcountryTaxRateFallbackEnabled: false,\n\t\t\t\tdeleteDaysAfterLastModification: 90,\n\t\t\t}\n\t\t},\n\t}\n}\n","import type {\n\tQuote,\n\tQuoteDraft,\n\tQuoteUpdateAction,\n} from '@commercetools/platform-sdk'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\n\nexport class QuoteRepository extends AbstractResourceRepository<'quote'> {\n\tgetTypeId() {\n\t\treturn 'quote' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: QuoteDraft): Quote {\n\t\tthrow new Error('not implemented')\n\t}\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tQuoteUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<Quote>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {}\n}\n","import type {\n\tQuoteRequest,\n\tQuoteRequestDraft,\n\tQuoteRequestUpdateAction,\n} from '@commercetools/platform-sdk'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\n\nexport class QuoteRequestRepository extends AbstractResourceRepository<'quote-request'> {\n\tgetTypeId() {\n\t\treturn 'quote-request' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: QuoteRequestDraft): QuoteRequest {\n\t\tthrow new Error('not implemented')\n\t}\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tQuoteRequestUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<QuoteRequest>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {}\n}\n","import type {\n\tReview,\n\tReviewDraft,\n\tReviewUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\n\nexport class ReviewRepository extends AbstractResourceRepository<'review'> {\n\tgetTypeId() {\n\t\treturn 'review' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: ReviewDraft): Review {\n\t\tconst resource: Review = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tincludedInStatistics: false,\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tReviewUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<Review>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {}\n}\n","import type {\n\tShippingMethod,\n\tShippingMethodAddShippingRateAction,\n\tShippingMethodAddZoneAction,\n\tShippingMethodChangeIsDefaultAction,\n\tShippingMethodChangeNameAction,\n\tShippingMethodDraft,\n\tShippingMethodRemoveZoneAction,\n\tShippingMethodSetCustomFieldAction,\n\tShippingMethodSetCustomTypeAction,\n\tShippingMethodSetDescriptionAction,\n\tShippingMethodSetKeyAction,\n\tShippingMethodSetLocalizedDescriptionAction,\n\tShippingMethodSetLocalizedNameAction,\n\tShippingMethodSetPredicateAction,\n\tShippingMethodUpdateAction,\n\tShippingRate,\n\tShippingRateDraft,\n\tZoneRate,\n\tZoneRateDraft,\n\tZoneReference,\n} from '@commercetools/platform-sdk'\nimport deepEqual from 'deep-equal'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\nimport {\n\tcreateCustomFields,\n\tcreateTypedMoney,\n\tgetReferenceFromResourceIdentifier,\n} from './helpers.js'\n\nexport class ShippingMethodRepository extends AbstractResourceRepository<'shipping-method'> {\n\tgetTypeId() {\n\t\treturn 'shipping-method' as const\n\t}\n\n\tcreate(\n\t\tcontext: RepositoryContext,\n\t\tdraft: ShippingMethodDraft\n\t): ShippingMethod {\n\t\tconst resource: ShippingMethod = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\t...draft,\n\t\t\ttaxCategory: getReferenceFromResourceIdentifier(\n\t\t\t\tdraft.taxCategory,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t\tzoneRates: draft.zoneRates?.map((z) =>\n\t\t\t\tthis._transformZoneRateDraft(context, z)\n\t\t\t),\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tprivate _transformZoneRateDraft = (\n\t\tcontext: RepositoryContext,\n\t\tdraft: ZoneRateDraft\n\t): ZoneRate => ({\n\t\t...draft,\n\t\tzone: getReferenceFromResourceIdentifier<ZoneReference>(\n\t\t\tdraft.zone,\n\t\t\tcontext.projectKey,\n\t\t\tthis._storage\n\t\t),\n\t\tshippingRates: draft.shippingRates?.map(this._transformShippingRate),\n\t})\n\n\tprivate _transformShippingRate = (rate: ShippingRateDraft): ShippingRate => ({\n\t\tprice: createTypedMoney(rate.price),\n\t\tfreeAbove: rate.freeAbove && createTypedMoney(rate.freeAbove),\n\t\ttiers: rate.tiers || [],\n\t})\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tShippingMethodUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<ShippingMethod>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {\n\t\taddShippingRate: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<ShippingMethod>,\n\t\t\t{ shippingRate, zone }: ShippingMethodAddShippingRateAction\n\t\t) => {\n\t\t\tconst rate = this._transformShippingRate(shippingRate)\n\n\t\t\tresource.zoneRates.forEach((zoneRate) => {\n\t\t\t\tif (zoneRate.zone.id === zone.id) {\n\t\t\t\t\tzoneRate.shippingRates.push(rate)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t})\n\t\t\tresource.zoneRates.push({\n\t\t\t\tzone: {\n\t\t\t\t\ttypeId: 'zone',\n\t\t\t\t\tid: zone.id!,\n\t\t\t\t},\n\t\t\t\tshippingRates: [rate],\n\t\t\t})\n\t\t},\n\t\tremoveShippingRate: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<ShippingMethod>,\n\t\t\t{ shippingRate, zone }: ShippingMethodAddShippingRateAction\n\t\t) => {\n\t\t\tconst rate = this._transformShippingRate(shippingRate)\n\n\t\t\tresource.zoneRates.forEach((zoneRate) => {\n\t\t\t\tif (zoneRate.zone.id === zone.id) {\n\t\t\t\t\tzoneRate.shippingRates = zoneRate.shippingRates.filter(\n\t\t\t\t\t\t(otherRate) => !deepEqual(rate, otherRate)\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\taddZone: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ShippingMethod>,\n\t\t\t{ zone }: ShippingMethodAddZoneAction\n\t\t) => {\n\t\t\tconst zoneReference = getReferenceFromResourceIdentifier<ZoneReference>(\n\t\t\t\tzone,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t)\n\n\t\t\tif (resource.zoneRates === undefined) {\n\t\t\t\tresource.zoneRates = []\n\t\t\t}\n\n\t\t\tresource.zoneRates.push({\n\t\t\t\tzone: zoneReference,\n\t\t\t\tshippingRates: [],\n\t\t\t})\n\t\t},\n\t\tremoveZone: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<ShippingMethod>,\n\t\t\t{ zone }: ShippingMethodRemoveZoneAction\n\t\t) => {\n\t\t\tresource.zoneRates = resource.zoneRates.filter(\n\t\t\t\t(zoneRate) => zoneRate.zone.id !== zone.id\n\t\t\t)\n\t\t},\n\t\tsetKey: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<ShippingMethod>,\n\t\t\t{ key }: ShippingMethodSetKeyAction\n\t\t) => {\n\t\t\tresource.key = key\n\t\t},\n\t\tsetDescription: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<ShippingMethod>,\n\t\t\t{ description }: ShippingMethodSetDescriptionAction\n\t\t) => {\n\t\t\tresource.description = description\n\t\t},\n\t\tsetLocalizedDescription: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<ShippingMethod>,\n\t\t\t{ localizedDescription }: ShippingMethodSetLocalizedDescriptionAction\n\t\t) => {\n\t\t\tresource.localizedDescription = localizedDescription\n\t\t},\n\t\tsetLocalizedName: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<ShippingMethod>,\n\t\t\t{ localizedName }: ShippingMethodSetLocalizedNameAction\n\t\t) => {\n\t\t\tresource.localizedName = localizedName\n\t\t},\n\t\tsetPredicate: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<ShippingMethod>,\n\t\t\t{ predicate }: ShippingMethodSetPredicateAction\n\t\t) => {\n\t\t\tresource.predicate = predicate\n\t\t},\n\t\tchangeIsDefault: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<ShippingMethod>,\n\t\t\t{ isDefault }: ShippingMethodChangeIsDefaultAction\n\t\t) => {\n\t\t\tresource.isDefault = isDefault\n\t\t},\n\t\tchangeName: (\n\t\t\t_context: RepositoryContext,\n\t\t\tresource: Writable<ShippingMethod>,\n\t\t\t{ name }: ShippingMethodChangeNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\t\tsetCustomType: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ShippingMethod>,\n\t\t\t{ type, fields }: ShippingMethodSetCustomTypeAction\n\t\t) => {\n\t\t\tif (type) {\n\t\t\t\tresource.custom = createCustomFields(\n\t\t\t\t\t{ type, fields },\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\tthis._storage\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tresource.custom = undefined\n\t\t\t}\n\t\t},\n\t\tsetCustomField: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<ShippingMethod>,\n\t\t\t{ name, value }: ShippingMethodSetCustomFieldAction\n\t\t) => {\n\t\t\tif (!resource.custom) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (value === null) {\n\t\t\t\tdelete resource.custom.fields[name]\n\t\t\t} else {\n\t\t\t\tresource.custom.fields[name] = value\n\t\t\t}\n\t\t},\n\t}\n}\n","import type {\n\tCustomerReference,\n\tShoppingList,\n\tShoppingListDraft,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\nimport {\n\tcreateCustomFields,\n\tgetReferenceFromResourceIdentifier,\n\tgetStoreKeyReference,\n} from './helpers.js'\n\nexport class ShoppingListRepository extends AbstractResourceRepository<'shopping-list'> {\n\tgetTypeId() {\n\t\treturn 'shopping-list' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: ShoppingListDraft): ShoppingList {\n\t\t// const product =\n\n\t\tconst resource: ShoppingList = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\t...draft,\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t\ttextLineItems: [],\n\t\t\tlineItems:\n\t\t\t\tdraft.lineItems?.map((e) => ({\n\t\t\t\t\t...getBaseResourceProperties(),\n\t\t\t\t\t...e,\n\t\t\t\t\taddedAt: e.addedAt ?? '',\n\t\t\t\t\tproductId: e.productId ?? '',\n\t\t\t\t\tname: {},\n\t\t\t\t\tquantity: e.quantity ?? 1,\n\t\t\t\t\tproductType: { typeId: 'product-type', id: '' },\n\t\t\t\t\tcustom: createCustomFields(\n\t\t\t\t\t\te.custom,\n\t\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\t\tthis._storage\n\t\t\t\t\t),\n\t\t\t\t})) ?? [],\n\t\t\tcustomer: draft.customer\n\t\t\t\t? getReferenceFromResourceIdentifier<CustomerReference>(\n\t\t\t\t\t\tdraft.customer,\n\t\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\t\tthis._storage\n\t\t\t\t )\n\t\t\t\t: undefined,\n\t\t\tstore: draft.store\n\t\t\t\t? getStoreKeyReference(draft.store, context.projectKey, this._storage)\n\t\t\t\t: undefined,\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n}\n","import type {\n\tQuote,\n\tStagedQuote,\n\tStagedQuoteDraft,\n\tStagedQuoteUpdateAction,\n} from '@commercetools/platform-sdk'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\n\nexport class StagedQuoteRepository extends AbstractResourceRepository<'staged-quote'> {\n\tgetTypeId() {\n\t\treturn 'staged-quote' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: StagedQuoteDraft): StagedQuote {\n\t\tthrow new Error('not implemented')\n\t}\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tStagedQuoteUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<Quote>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {}\n}\n","import type {\n\tChannelReference,\n\tChannelResourceIdentifier,\n\tDiscountedPriceDraft,\n\tStandalonePrice,\n\tStandalonePriceChangeActiveAction,\n\tStandalonePriceChangeValueAction,\n\tStandalonePriceDraft,\n\tStandalonePriceSetDiscountedPriceAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\nimport { createTypedMoney } from './helpers.js'\n\nexport class StandAlonePriceRepository extends AbstractResourceRepository<'standalone-price'> {\n\tgetTypeId() {\n\t\treturn 'standalone-price' as const\n\t}\n\n\tcreate(\n\t\tcontext: RepositoryContext,\n\t\tdraft: StandalonePriceDraft\n\t): StandalonePrice {\n\t\tconst resource: StandalonePrice = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tactive: draft.active ? draft.active : false,\n\t\t\tsku: draft.sku,\n\t\t\tvalue: createTypedMoney(draft.value),\n\t\t\tcountry: draft.country,\n\t\t\tdiscounted: draft.discounted\n\t\t\t\t? this.transformDiscountDraft(draft.discounted)\n\t\t\t\t: undefined,\n\t\t\tchannel: draft.channel?.id\n\t\t\t\t? this.transformChannelReferenceDraft(draft.channel)\n\t\t\t\t: undefined,\n\t\t\tvalidFrom: draft.validFrom,\n\t\t\tvalidUntil: draft.validUntil,\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\ttransformChannelReferenceDraft(\n\t\tchannel: ChannelResourceIdentifier\n\t): ChannelReference {\n\t\treturn {\n\t\t\ttypeId: channel.typeId,\n\t\t\tid: channel.id as string,\n\t\t}\n\t}\n\n\ttransformDiscountDraft(discounted: DiscountedPriceDraft) {\n\t\treturn {\n\t\t\tvalue: createTypedMoney(discounted.value),\n\t\t\tdiscount: discounted.discount,\n\t\t}\n\t}\n\n\tactions = {\n\t\tsetActive: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<StandalonePrice>,\n\t\t\taction: StandalonePriceChangeActiveAction\n\t\t) => {\n\t\t\tresource.active = action.active\n\t\t},\n\t\tchangeValue: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<StandalonePrice>,\n\t\t\taction: StandalonePriceChangeValueAction\n\t\t) => {\n\t\t\tresource.value = createTypedMoney(action.value)\n\t\t},\n\t\tsetDiscountedPrice: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<StandalonePrice>,\n\t\t\taction: StandalonePriceSetDiscountedPriceAction\n\t\t) => {\n\t\t\tresource.discounted = action.discounted\n\t\t\t\t? this.transformDiscountDraft(action.discounted)\n\t\t\t\t: undefined\n\t\t},\n\t}\n}\n","import type {\n\tState,\n\tStateChangeInitialAction,\n\tStateChangeKeyAction,\n\tStateDraft,\n\tStateReference,\n\tStateSetDescriptionAction,\n\tStateSetNameAction,\n\tStateSetRolesAction,\n\tStateSetTransitionsAction,\n\tStateUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\nimport { getReferenceFromResourceIdentifier } from './helpers.js'\n\nexport class StateRepository extends AbstractResourceRepository<'state'> {\n\tgetTypeId() {\n\t\treturn 'state' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: StateDraft): State {\n\t\tconst resource: State = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\t...draft,\n\t\t\tbuiltIn: false,\n\t\t\tinitial: draft.initial || false,\n\t\t\ttransitions: (draft.transitions || []).map((t) =>\n\t\t\t\tgetReferenceFromResourceIdentifier(t, context.projectKey, this._storage)\n\t\t\t),\n\t\t}\n\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tStateUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<State>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {\n\t\tchangeKey: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<State>,\n\t\t\t{ key }: StateChangeKeyAction\n\t\t) => {\n\t\t\tresource.key = key\n\t\t},\n\t\tchangeInitial: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<State>,\n\t\t\t{ initial }: StateChangeInitialAction\n\t\t) => {\n\t\t\tresource.initial = initial\n\t\t},\n\t\tsetDescription: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<State>,\n\t\t\t{ description }: StateSetDescriptionAction\n\t\t) => {\n\t\t\tresource.description = description\n\t\t},\n\t\tsetName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<State>,\n\t\t\t{ name }: StateSetNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\t\tsetRoles: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<State>,\n\t\t\t{ roles }: StateSetRolesAction\n\t\t) => {\n\t\t\tresource.roles = roles\n\t\t},\n\t\tsetTransitions: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<State>,\n\t\t\t{ transitions }: StateSetTransitionsAction\n\t\t) => {\n\t\t\tresource.transitions = transitions?.map(\n\t\t\t\t(resourceId): StateReference => ({\n\t\t\t\t\tid: resourceId.id || '',\n\t\t\t\t\ttypeId: 'state',\n\t\t\t\t})\n\t\t\t)\n\t\t},\n\t}\n}\n","import type {\n\tChannelReference,\n\tChannelResourceIdentifier,\n\tStore,\n\tStoreDraft,\n\tStoreSetCountriesAction,\n\tStoreSetCustomFieldAction,\n\tStoreSetCustomTypeAction,\n\tStoreSetDistributionChannelsAction,\n\tStoreSetLanguagesAction,\n\tStoreSetNameAction,\n\tStoreUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\nimport {\n\tcreateCustomFields,\n\tgetReferenceFromResourceIdentifier,\n} from './helpers.js'\n\nexport class StoreRepository extends AbstractResourceRepository<'store'> {\n\tgetTypeId() {\n\t\treturn 'store' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: StoreDraft): Store {\n\t\tconst resource: Store = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tkey: draft.key,\n\t\t\tname: draft.name,\n\t\t\tlanguages: draft.languages ?? [],\n\t\t\tcountries: draft.countries ?? [],\n\t\t\tdistributionChannels: this.transformChannels(\n\t\t\t\tcontext,\n\t\t\t\tdraft.distributionChannels\n\t\t\t),\n\t\t\tsupplyChannels: this.transformChannels(context, draft.supplyChannels),\n\t\t\tproductSelections: [],\n\t\t\tcustom: createCustomFields(\n\t\t\t\tdraft.custom,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t),\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tprivate transformChannels(\n\t\tcontext: RepositoryContext,\n\t\tchannels?: ChannelResourceIdentifier[]\n\t) {\n\t\tif (!channels) return []\n\n\t\treturn channels.map((ref) =>\n\t\t\tgetReferenceFromResourceIdentifier<ChannelReference>(\n\t\t\t\tref,\n\t\t\t\tcontext.projectKey,\n\t\t\t\tthis._storage\n\t\t\t)\n\t\t)\n\t}\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tStoreUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<Store>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {\n\t\tsetName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Store>,\n\t\t\t{ name }: StoreSetNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\t\tsetDistributionChannels: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Store>,\n\t\t\t{ distributionChannels }: StoreSetDistributionChannelsAction\n\t\t) => {\n\t\t\tresource.distributionChannels = this.transformChannels(\n\t\t\t\tcontext,\n\t\t\t\tdistributionChannels\n\t\t\t)\n\t\t},\n\t\tsetLanguages: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Store>,\n\t\t\t{ languages }: StoreSetLanguagesAction\n\t\t) => {\n\t\t\tresource.languages = languages ?? []\n\t\t},\n\t\tsetCustomType: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Store>,\n\t\t\t{ type, fields }: StoreSetCustomTypeAction\n\t\t) => {\n\t\t\tif (type) {\n\t\t\t\tresource.custom = createCustomFields(\n\t\t\t\t\t{ type, fields },\n\t\t\t\t\tcontext.projectKey,\n\t\t\t\t\tthis._storage\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tresource.custom = undefined\n\t\t\t}\n\t\t},\n\t\tsetCustomField: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Store>,\n\t\t\t{ name, value }: StoreSetCustomFieldAction\n\t\t) => {\n\t\t\tif (!resource.custom) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (value === null) {\n\t\t\t\tdelete resource.custom.fields[name]\n\t\t\t} else {\n\t\t\t\tresource.custom.fields[name] = value\n\t\t\t}\n\t\t},\n\t\tsetCountries: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Store>,\n\t\t\t{ countries }: StoreSetCountriesAction\n\t\t) => {\n\t\t\tresource.countries = countries ?? []\n\t\t},\n\t}\n}\n","import type {\n\tInvalidInputError,\n\tSubscription,\n\tSubscriptionDraft,\n} from '@commercetools/platform-sdk'\nimport { CommercetoolsError } from '../exceptions.js'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\n\nexport class SubscriptionRepository extends AbstractResourceRepository<'subscription'> {\n\tgetTypeId() {\n\t\treturn 'subscription' as const\n\t}\n\tcreate(context: RepositoryContext, draft: SubscriptionDraft): Subscription {\n\t\t// TODO: We could actually test this here by using the aws sdk. For now\n\t\t// hardcode a failed check when account id is 0000000000\n\t\tif (draft.destination.type === 'SQS') {\n\t\t\tconst queueURL = new URL(draft.destination.queueUrl)\n\t\t\tconst accountId = queueURL.pathname.split('/')[1]\n\t\t\tif (accountId === '0000000000') {\n\t\t\t\tconst dest = draft.destination\n\t\t\t\tthrow new CommercetoolsError<InvalidInputError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'InvalidInput',\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t'A test message could not be delivered to this destination: ' +\n\t\t\t\t\t\t\t`SQS ${dest.queueUrl} in ${dest.region} for ${dest.accessKey}. ` +\n\t\t\t\t\t\t\t'Please make sure your destination is correctly configured.',\n\t\t\t\t\t},\n\t\t\t\t\t400\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\tconst resource: Subscription = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tchanges: draft.changes || [],\n\t\t\tdestination: draft.destination,\n\t\t\tformat: draft.format || {\n\t\t\t\ttype: 'Platform',\n\t\t\t},\n\t\t\tkey: draft.key,\n\t\t\tmessages: draft.messages || [],\n\t\t\tstatus: 'Healthy',\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n}\n","import type {\n\tTaxCategory,\n\tTaxCategoryAddTaxRateAction,\n\tTaxCategoryChangeNameAction,\n\tTaxCategoryDraft,\n\tTaxCategoryRemoveTaxRateAction,\n\tTaxCategoryReplaceTaxRateAction,\n\tTaxCategorySetDescriptionAction,\n\tTaxCategorySetKeyAction,\n\tTaxCategoryUpdateAction,\n\tTaxRate,\n\tTaxRateDraft,\n} from '@commercetools/platform-sdk'\nimport { v4 as uuidv4 } from 'uuid'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\n\nexport class TaxCategoryRepository extends AbstractResourceRepository<'tax-category'> {\n\tgetTypeId() {\n\t\treturn 'tax-category' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: TaxCategoryDraft): TaxCategory {\n\t\tconst resource: TaxCategory = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\t...draft,\n\t\t\trates: draft.rates?.map(this.taxRateFromTaxRateDraft) || [],\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tprivate taxRateFromTaxRateDraft = (draft: TaxRateDraft): TaxRate => ({\n\t\t...draft,\n\t\tid: uuidv4(),\n\t\tamount: draft.amount || 0,\n\t})\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tTaxCategoryUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<TaxCategory>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {\n\t\taddTaxRate: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<TaxCategory>,\n\t\t\t{ taxRate }: TaxCategoryAddTaxRateAction\n\t\t) => {\n\t\t\tif (resource.rates === undefined) {\n\t\t\t\tresource.rates = []\n\t\t\t}\n\t\t\tresource.rates.push(this.taxRateFromTaxRateDraft(taxRate))\n\t\t},\n\t\tremoveTaxRate: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<TaxCategory>,\n\t\t\t{ taxRateId }: TaxCategoryRemoveTaxRateAction\n\t\t) => {\n\t\t\tif (resource.rates === undefined) {\n\t\t\t\tresource.rates = []\n\t\t\t}\n\t\t\tresource.rates = resource.rates.filter(\n\t\t\t\t(taxRate) => taxRate.id !== taxRateId\n\t\t\t)\n\t\t},\n\t\treplaceTaxRate: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<TaxCategory>,\n\t\t\t{ taxRateId, taxRate }: TaxCategoryReplaceTaxRateAction\n\t\t) => {\n\t\t\tif (resource.rates === undefined) {\n\t\t\t\tresource.rates = []\n\t\t\t}\n\n\t\t\tconst taxRateObj = this.taxRateFromTaxRateDraft(taxRate)\n\t\t\tfor (let i = 0; i < resource.rates.length; i++) {\n\t\t\t\tconst rate = resource.rates[i]\n\t\t\t\tif (rate.id === taxRateId) {\n\t\t\t\t\tresource.rates[i] = taxRateObj\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tsetDescription: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<TaxCategory>,\n\t\t\t{ description }: TaxCategorySetDescriptionAction\n\t\t) => {\n\t\t\tresource.description = description\n\t\t},\n\t\tsetKey: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<TaxCategory>,\n\t\t\t{ key }: TaxCategorySetKeyAction\n\t\t) => {\n\t\t\tresource.key = key\n\t\t},\n\t\tchangeName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<TaxCategory>,\n\t\t\t{ name }: TaxCategoryChangeNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\t}\n}\n","import type {\n\tFieldDefinition,\n\tInvalidOperationError,\n\tType,\n\tTypeAddEnumValueAction,\n\tTypeAddFieldDefinitionAction,\n\tTypeChangeEnumValueLabelAction,\n\tTypeChangeFieldDefinitionOrderAction,\n\tTypeChangeNameAction,\n\tTypeDraft,\n\tTypeRemoveFieldDefinitionAction,\n\tTypeSetDescriptionAction,\n\tTypeUpdateAction,\n} from '@commercetools/platform-sdk'\nimport isEqual from 'lodash.isequal'\nimport { CommercetoolsError } from '../exceptions.js'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\n\nexport class TypeRepository extends AbstractResourceRepository<'type'> {\n\tgetTypeId() {\n\t\treturn 'type' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: TypeDraft): Type {\n\t\tconst resource: Type = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tkey: draft.key,\n\t\t\tname: draft.name,\n\t\t\tresourceTypeIds: draft.resourceTypeIds,\n\t\t\tfieldDefinitions: draft.fieldDefinitions || [],\n\t\t\tdescription: draft.description,\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\tactions: Partial<\n\t\tRecord<\n\t\t\tTypeUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<Type>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {\n\t\taddFieldDefinition: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Type>,\n\t\t\t{ fieldDefinition }: TypeAddFieldDefinitionAction\n\t\t) => {\n\t\t\tresource.fieldDefinitions.push(fieldDefinition)\n\t\t},\n\t\tremoveFieldDefinition: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Type>,\n\t\t\t{ fieldName }: TypeRemoveFieldDefinitionAction\n\t\t) => {\n\t\t\tresource.fieldDefinitions = resource.fieldDefinitions.filter(\n\t\t\t\t(f) => f.name !== fieldName\n\t\t\t)\n\t\t},\n\t\tsetDescription: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Type>,\n\t\t\t{ description }: TypeSetDescriptionAction\n\t\t) => {\n\t\t\tresource.description = description\n\t\t},\n\t\tchangeName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Type>,\n\t\t\t{ name }: TypeChangeNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\t\tchangeFieldDefinitionOrder: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Type>,\n\t\t\t{ fieldNames }: TypeChangeFieldDefinitionOrderAction\n\t\t) => {\n\t\t\tconst fields = new Map(\n\t\t\t\tresource.fieldDefinitions.map((item) => [item.name, item])\n\t\t\t)\n\t\t\tconst result: FieldDefinition[] = []\n\t\t\tlet current = resource.fieldDefinitions\n\n\t\t\tfieldNames.forEach((fieldName) => {\n\t\t\t\tconst field = fields.get(fieldName)\n\t\t\t\tif (field === undefined) {\n\t\t\t\t\tthrow new Error('New field')\n\t\t\t\t}\n\t\t\t\tresult.push(field)\n\n\t\t\t\t// Remove from current items\n\t\t\t\tcurrent = current.filter((f) => f.name !== fieldName)\n\t\t\t})\n\n\t\t\tif (\n\t\t\t\tisEqual(\n\t\t\t\t\tfieldNames,\n\t\t\t\t\tresource.fieldDefinitions.map((item) => item.name)\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tthrow new CommercetoolsError<InvalidOperationError>({\n\t\t\t\t\tcode: 'InvalidOperation',\n\t\t\t\t\tmessage: \"'fieldDefinitions' has no changes.\",\n\t\t\t\t\taction: {\n\t\t\t\t\t\taction: 'changeFieldDefinitionOrder',\n\t\t\t\t\t\tfieldNames: fieldNames,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tresource.fieldDefinitions = result\n\t\t\t// Add fields which were not specified in the order as last items. Not\n\t\t\t// sure if this follows commercetools\n\t\t\tresource.fieldDefinitions.push(...current)\n\t\t},\n\t\taddEnumValue: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Type>,\n\t\t\t{ fieldName, value }: TypeAddEnumValueAction\n\t\t) => {\n\t\t\tresource.fieldDefinitions.forEach((field) => {\n\t\t\t\tif (field.name === fieldName) {\n\t\t\t\t\t// TODO, should be done better i suppose\n\t\t\t\t\tif (field.type.name === 'Enum') {\n\t\t\t\t\t\tfield.type.values.push(value)\n\t\t\t\t\t} else if (\n\t\t\t\t\t\tfield.type.name === 'Set' &&\n\t\t\t\t\t\tfield.type.elementType.name === 'Enum'\n\t\t\t\t\t) {\n\t\t\t\t\t\tfield.type.elementType.values.push(value)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new Error('Type is not a Enum (or Set of Enum)')\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\tchangeEnumValueLabel: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Type>,\n\t\t\t{ fieldName, value }: TypeChangeEnumValueLabelAction\n\t\t) => {\n\t\t\tresource.fieldDefinitions.forEach((field) => {\n\t\t\t\tif (field.name === fieldName) {\n\t\t\t\t\t// TODO, should be done better i suppose\n\t\t\t\t\tif (field.type.name === 'Enum') {\n\t\t\t\t\t\tfield.type.values.forEach((v) => {\n\t\t\t\t\t\t\tif (v.key === value.key) {\n\t\t\t\t\t\t\t\tv.label = value.label\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t} else if (\n\t\t\t\t\t\tfield.type.name === 'Set' &&\n\t\t\t\t\t\tfield.type.elementType.name === 'Enum'\n\t\t\t\t\t) {\n\t\t\t\t\t\tfield.type.elementType.values.forEach((v) => {\n\t\t\t\t\t\t\tif (v.key === value.key) {\n\t\t\t\t\t\t\t\tv.label = value.label\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new Error('Type is not a Enum (or Set of Enum)')\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t}\n}\n","import type {\n\tZone,\n\tZoneAddLocationAction,\n\tZoneChangeNameAction,\n\tZoneDraft,\n\tZoneRemoveLocationAction,\n\tZoneSetDescriptionAction,\n\tZoneSetKeyAction,\n\tZoneUpdateAction,\n} from '@commercetools/platform-sdk'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport type { Writable } from '../types.js'\nimport { AbstractResourceRepository, RepositoryContext } from './abstract.js'\n\nexport class ZoneRepository extends AbstractResourceRepository<'zone'> {\n\tgetTypeId() {\n\t\treturn 'zone' as const\n\t}\n\n\tcreate(context: RepositoryContext, draft: ZoneDraft): Zone {\n\t\tconst resource: Zone = {\n\t\t\t...getBaseResourceProperties(),\n\t\t\tkey: draft.key,\n\t\t\tlocations: draft.locations || [],\n\t\t\tname: draft.name,\n\t\t\tdescription: draft.description,\n\t\t}\n\t\tthis.saveNew(context, resource)\n\t\treturn resource\n\t}\n\n\tactions: Partial<\n\t\tRecord<\n\t\t\tZoneUpdateAction['action'],\n\t\t\t(\n\t\t\t\tcontext: RepositoryContext,\n\t\t\t\tresource: Writable<Zone>,\n\t\t\t\taction: any\n\t\t\t) => void\n\t\t>\n\t> = {\n\t\taddLocation: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Zone>,\n\t\t\t{ location }: ZoneAddLocationAction\n\t\t) => {\n\t\t\tresource.locations.push(location)\n\t\t},\n\t\tremoveLocation: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Zone>,\n\t\t\t{ location }: ZoneRemoveLocationAction\n\t\t) => {\n\t\t\tresource.locations = resource.locations.filter(\n\t\t\t\t(loc) =>\n\t\t\t\t\t!(loc.country === location.country && loc.state === location.state)\n\t\t\t)\n\t\t},\n\t\tchangeName: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Zone>,\n\t\t\t{ name }: ZoneChangeNameAction\n\t\t) => {\n\t\t\tresource.name = name\n\t\t},\n\t\tsetDescription: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Zone>,\n\t\t\t{ description }: ZoneSetDescriptionAction\n\t\t) => {\n\t\t\tresource.description = description\n\t\t},\n\t\tsetKey: (\n\t\t\tcontext: RepositoryContext,\n\t\t\tresource: Writable<Zone>,\n\t\t\t{ key }: ZoneSetKeyAction\n\t\t) => {\n\t\t\tresource.key = key\n\t\t},\n\t}\n}\n","import { AbstractStorage } from '../storage/index.js'\nimport { AssociateRoleRepository } from './associate-role.js'\nimport { AttributeGroupRepository } from './attribute-group.js'\nimport { BusinessUnitRepository } from './business-unit.js'\nimport { CartRepository } from './cart.js'\nimport { CartDiscountRepository } from './cart-discount.js'\nimport { CategoryRepository } from './category.js'\nimport { ChannelRepository } from './channel.js'\nimport { CustomObjectRepository } from './custom-object.js'\nimport { CustomerRepository } from './customer.js'\nimport { CustomerGroupRepository } from './customer-group.js'\nimport { DiscountCodeRepository } from './discount-code.js'\nimport { ExtensionRepository } from './extension.js'\nimport { InventoryEntryRepository } from './inventory-entry.js'\nimport { MyOrderRepository } from './my-order.js'\nimport { OrderRepository } from './order.js'\nimport { OrderEditRepository } from './order-edit.js'\nimport { PaymentRepository } from './payment.js'\nimport { ProductRepository } from './product.js'\nimport { ProductDiscountRepository } from './product-discount.js'\nimport { ProductProjectionRepository } from './product-projection.js'\nimport { ProductSelectionRepository } from './product-selection.js'\nimport { ProductTypeRepository } from './product-type.js'\nimport { ProjectRepository } from './project.js'\nimport { QuoteRepository } from './quote.js'\nimport { QuoteRequestRepository } from './quote-request.js'\nimport { ReviewRepository } from './review.js'\nimport { ShippingMethodRepository } from './shipping-method.js'\nimport { ShoppingListRepository } from './shopping-list.js'\nimport { StagedQuoteRepository } from './staged-quote.js'\nimport { StandAlonePriceRepository } from './standalone-price.js'\nimport { StateRepository } from './state.js'\nimport { StoreRepository } from './store.js'\nimport { SubscriptionRepository } from './subscription.js'\nimport { TaxCategoryRepository } from './tax-category.js'\nimport { TypeRepository } from './type.js'\nimport { ZoneRepository } from './zone.js'\n\nexport type RepositoryMap = ReturnType<typeof createRepositories>\n\nexport const createRepositories = (storage: AbstractStorage) => ({\n\t'associate-role': new AssociateRoleRepository(storage),\n\t'attribute-group': new AttributeGroupRepository(storage),\n\t'business-unit': new BusinessUnitRepository(storage),\n\tcategory: new CategoryRepository(storage),\n\tcart: new CartRepository(storage),\n\t'cart-discount': new CartDiscountRepository(storage),\n\tcustomer: new CustomerRepository(storage),\n\tchannel: new ChannelRepository(storage),\n\t'customer-group': new CustomerGroupRepository(storage),\n\t'discount-code': new DiscountCodeRepository(storage),\n\textension: new ExtensionRepository(storage),\n\t'inventory-entry': new InventoryEntryRepository(storage),\n\t'key-value-document': new CustomObjectRepository(storage),\n\torder: new OrderRepository(storage),\n\t'order-edit': new OrderEditRepository(storage),\n\tpayment: new PaymentRepository(storage),\n\t'my-cart': new CartRepository(storage),\n\t'my-order': new MyOrderRepository(storage),\n\t'my-customer': new CustomerRepository(storage),\n\t'my-payment': new PaymentRepository(storage),\n\tproduct: new ProductRepository(storage),\n\t'product-type': new ProductTypeRepository(storage),\n\t'product-discount': new ProductDiscountRepository(storage),\n\t'product-projection': new ProductProjectionRepository(storage),\n\t'product-selection': new ProductSelectionRepository(storage),\n\tproject: new ProjectRepository(storage),\n\treview: new ReviewRepository(storage),\n\tquote: new QuoteRepository(storage),\n\t'quote-request': new QuoteRequestRepository(storage),\n\t'shipping-method': new ShippingMethodRepository(storage),\n\t'shopping-list': new ShoppingListRepository(storage),\n\t'staged-quote': new StagedQuoteRepository(storage),\n\t'standalone-price': new StandAlonePriceRepository(storage),\n\tstate: new StateRepository(storage),\n\tstore: new StoreRepository(storage),\n\tsubscription: new SubscriptionRepository(storage),\n\t'tax-category': new TaxCategoryRepository(storage),\n\ttype: new TypeRepository(storage),\n\tzone: new ZoneRepository(storage),\n})\n","import type { Update } from '@commercetools/platform-sdk'\nimport { type Request, type Response, Router } from 'express'\nimport { ParsedQs } from 'qs'\nimport { AbstractResourceRepository } from '../repositories/abstract.js'\nimport { getRepositoryContext } from '../repositories/helpers.js'\nimport { queryParamsArray } from '../helpers.js'\n\nexport default abstract class AbstractService {\n\tprotected abstract getBasePath(): string\n\tpublic abstract repository: AbstractResourceRepository<any>\n\n\tcreateStatusCode = 201\n\n\tconstructor(parent: Router) {\n\t\tthis.registerRoutes(parent)\n\t}\n\n\textraRoutes(router: Router) {}\n\n\tregisterRoutes(parent: Router) {\n\t\tconst basePath = this.getBasePath()\n\t\tconst router = Router({ mergeParams: true })\n\n\t\t// Bind this first since the `/:id` routes are currently a bit to greedy\n\t\tthis.extraRoutes(router)\n\n\t\trouter.get('/', this.get.bind(this))\n\t\trouter.get('/key=:key', this.getWithKey.bind(this)) // same thing goes for the key routes\n\t\trouter.get('/:id', this.getWithId.bind(this))\n\n\t\trouter.delete('/key=:key', this.deleteWithKey.bind(this))\n\t\trouter.delete('/:id', this.deleteWithId.bind(this))\n\n\t\trouter.post('/', this.post.bind(this))\n\t\trouter.post('/key=:key', this.postWithKey.bind(this))\n\t\trouter.post('/:id', this.postWithId.bind(this))\n\n\t\tparent.use(`/${basePath}`, router)\n\t}\n\n\tget(request: Request, response: Response) {\n\t\tconst limit = this._parseParam(request.query.limit)\n\t\tconst offset = this._parseParam(request.query.offset)\n\n\t\tconst result = this.repository.query(getRepositoryContext(request), {\n\t\t\texpand: this._parseParam(request.query.expand),\n\t\t\twhere: this._parseParam(request.query.where),\n\t\t\tlimit: limit !== undefined ? Number(limit) : undefined,\n\t\t\toffset: offset !== undefined ? Number(offset) : undefined,\n\t\t})\n\t\treturn response.status(200).send(result)\n\t}\n\n\tgetWithId(request: Request, response: Response) {\n\t\tconst result = this._expandWithId(request, request.params['id'])\n\t\tif (!result) {\n\t\t\treturn response.status(404).send()\n\t\t}\n\t\treturn response.status(200).send(result)\n\t}\n\n\tgetWithKey(request: Request, response: Response) {\n\t\tconst result = this.repository.getByKey(\n\t\t\tgetRepositoryContext(request),\n\t\t\trequest.params['key'],\n\t\t\t{ expand: this._parseParam(request.query.expand) }\n\t\t)\n\t\tif (!result) return response.status(404).send()\n\t\treturn response.status(200).send(result)\n\t}\n\n\tdeleteWithId(request: Request, response: Response) {\n\t\tconst result = this.repository.delete(\n\t\t\tgetRepositoryContext(request),\n\t\t\trequest.params['id'],\n\t\t\t{\n\t\t\t\texpand: this._parseParam(request.query.expand),\n\t\t\t}\n\t\t)\n\t\tif (!result) {\n\t\t\treturn response.status(404).send('Not found')\n\t\t}\n\t\treturn response.status(200).send(result)\n\t}\n\n\tdeleteWithKey(request: Request, response: Response) {\n\t\tconst resource = this.repository.getByKey(\n\t\t\tgetRepositoryContext(request),\n\t\t\trequest.params['key']\n\t\t)\n\t\tif (!resource) {\n\t\t\treturn response.status(404).send('Not found')\n\t\t}\n\n\t\tconst result = this.repository.delete(\n\t\t\tgetRepositoryContext(request),\n\t\t\tresource.id,\n\t\t\t{\n\t\t\t\texpand: this._parseParam(request.query.expand),\n\t\t\t}\n\t\t)\n\t\tif (!result) {\n\t\t\treturn response.status(404).send('Not found')\n\t\t}\n\t\treturn response.status(200).send(result)\n\t}\n\n\tpost(request: Request, response: Response) {\n\t\tconst draft = request.body\n\t\tconst resource = this.repository.create(\n\t\t\tgetRepositoryContext(request),\n\t\t\tdraft\n\t\t)\n\t\tconst result = this._expandWithId(request, resource.id)\n\t\treturn response.status(this.createStatusCode).send(result)\n\t}\n\n\tpostWithId(request: Request, response: Response) {\n\t\tconst updateRequest: Update = request.body\n\t\tconst resource = this.repository.get(\n\t\t\tgetRepositoryContext(request),\n\t\t\trequest.params['id']\n\t\t)\n\t\tif (!resource) {\n\t\t\treturn response.status(404).send('Not found')\n\t\t}\n\n\t\tconst updatedResource = this.repository.processUpdateActions(\n\t\t\tgetRepositoryContext(request),\n\t\t\tresource,\n\t\t\tupdateRequest.version,\n\t\t\tupdateRequest.actions\n\t\t)\n\n\t\tconst result = this._expandWithId(request, updatedResource.id)\n\t\treturn response.status(200).send(result)\n\t}\n\n\tpostWithKey(request: Request, response: Response) {\n\t\tconst updateRequest: Update = request.body\n\t\tconst resource = this.repository.getByKey(\n\t\t\tgetRepositoryContext(request),\n\t\t\trequest.params['key']\n\t\t)\n\t\tif (!resource) {\n\t\t\treturn response.status(404).send('Not found')\n\t\t}\n\t\tconst updatedResource = this.repository.processUpdateActions(\n\t\t\tgetRepositoryContext(request),\n\t\t\tresource,\n\t\t\tupdateRequest.version,\n\t\t\tupdateRequest.actions\n\t\t)\n\n\t\tconst result = this._expandWithId(request, updatedResource.id)\n\t\treturn response.status(200).send(result)\n\t}\n\n\tprotected _expandWithId(request: Request, resourceId: string) {\n\t\tconst result = this.repository.get(\n\t\t\tgetRepositoryContext(request),\n\t\t\tresourceId,\n\t\t\t{\n\t\t\t\texpand: this._parseParam(request.query.expand),\n\t\t\t}\n\t\t)\n\t\treturn result\n\t}\n\n\t// No idea what i'm doing\n\tprotected _parseParam(\n\t\tvalue: string | ParsedQs | string[] | ParsedQs[] | undefined\n\t): string[] | undefined {\n\t\treturn queryParamsArray(value)\n\t}\n}\n","import { Router } from 'express'\nimport { AssociateRoleRepository } from '../repositories/associate-role.js'\nimport AbstractService from './abstract.js'\n\nexport class AssociateRoleServices extends AbstractService {\n\tpublic repository: AssociateRoleRepository\n\n\tconstructor(parent: Router, repository: AssociateRoleRepository) {\n\t\tsuper(parent)\n\n\t\tthis.repository = repository\n\t}\n\n\tprotected getBasePath(): string {\n\t\treturn 'associate-roles'\n\t}\n}\n","import { Router } from 'express'\nimport AbstractService from './abstract.js'\nimport { AttributeGroupRepository } from '../repositories/attribute-group.js'\n\nexport class AttributeGroupService extends AbstractService {\n\tpublic repository: AttributeGroupRepository\n\n\tconstructor(parent: Router, repository: AttributeGroupRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'attribute-groups'\n\t}\n}\n","import { Router } from 'express'\nimport { BusinessUnitRepository } from '../repositories/business-unit.js'\nimport AbstractService from './abstract.js'\n\nexport class BusinessUnitServices extends AbstractService {\n\tpublic repository: BusinessUnitRepository\n\n\tconstructor(parent: Router, repository: BusinessUnitRepository) {\n\t\tsuper(parent)\n\n\t\tthis.repository = repository\n\t}\n\n\tprotected getBasePath(): string {\n\t\treturn 'business-units'\n\t}\n}\n","import { Router } from 'express'\nimport { CartDiscountRepository } from '../repositories/cart-discount.js'\nimport AbstractService from './abstract.js'\n\nexport class CartDiscountService extends AbstractService {\n\tpublic repository: CartDiscountRepository\n\n\tconstructor(parent: Router, repository: CartDiscountRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'cart-discounts'\n\t}\n}\n","import type { Cart, CartDraft, Order } from '@commercetools/platform-sdk'\nimport type { Request, Response, Router } from 'express'\nimport type { CartRepository } from '../repositories/cart.js'\nimport { getRepositoryContext } from '../repositories/helpers.js'\nimport type { OrderRepository } from '../repositories/order.js'\nimport AbstractService from './abstract.js'\n\nexport class CartService extends AbstractService {\n\tpublic repository: CartRepository\n\tpublic orderRepository: OrderRepository\n\n\tconstructor(\n\t\tparent: Router,\n\t\tcartRepository: CartRepository,\n\t\torderRepository: OrderRepository\n\t) {\n\t\tsuper(parent)\n\t\tthis.repository = cartRepository\n\t\tthis.orderRepository = orderRepository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'carts'\n\t}\n\n\textraRoutes(parent: Router) {\n\t\tparent.post('/replicate', this.replicate.bind(this))\n\t}\n\n\treplicate(request: Request, response: Response) {\n\t\tconst context = getRepositoryContext(request)\n\n\t\t// @ts-ignore\n\t\tconst cartOrOrder: Cart | Order | null =\n\t\t\trequest.body.reference.typeId === 'order'\n\t\t\t\t? this.orderRepository.get(context, request.body.reference.id)\n\t\t\t\t: this.repository.get(context, request.body.reference.id)\n\n\t\tif (!cartOrOrder) {\n\t\t\treturn response.status(400).send()\n\t\t}\n\n\t\tconst cartDraft: CartDraft = {\n\t\t\t...cartOrOrder,\n\t\t\tcurrency: cartOrOrder.totalPrice.currencyCode,\n\t\t\tdiscountCodes: [],\n\t\t\tshipping: [], // TODO: cartOrOrder.shipping,\n\t\t\tlineItems: cartOrOrder.lineItems.map((lineItem) => ({\n\t\t\t\t...lineItem,\n\t\t\t\tvariantId: lineItem.variant.id,\n\t\t\t\tsku: lineItem.variant.sku,\n\t\t\t})),\n\t\t}\n\n\t\tconst newCart = this.repository.create(context, cartDraft)\n\n\t\treturn response.status(200).send(newCart)\n\t}\n}\n","import { Router } from 'express'\nimport { CategoryRepository } from '../repositories/category.js'\nimport AbstractService from './abstract.js'\n\nexport class CategoryServices extends AbstractService {\n\tpublic repository: CategoryRepository\n\n\tconstructor(parent: Router, repository: CategoryRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'categories'\n\t}\n}\n","import { Router } from 'express'\nimport { ChannelRepository } from '../repositories/channel.js'\nimport AbstractService from './abstract.js'\n\nexport class ChannelService extends AbstractService {\n\tpublic repository: ChannelRepository\n\n\tconstructor(parent: Router, repository: ChannelRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'channels'\n\t}\n}\n","import type { CustomObjectDraft } from '@commercetools/platform-sdk'\nimport type { Request, Response, Router } from 'express'\nimport type { CustomObjectRepository } from '../repositories/custom-object.js'\nimport { getRepositoryContext } from '../repositories/helpers.js'\nimport AbstractService from './abstract.js'\n\nexport class CustomObjectService extends AbstractService {\n\tpublic repository: CustomObjectRepository\n\n\tconstructor(parent: Router, repository: CustomObjectRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'custom-objects'\n\t}\n\n\textraRoutes(router: Router) {\n\t\trouter.get('/:container/:key', this.getWithContainerAndKey.bind(this))\n\t\trouter.post('/:container/:key', this.createWithContainerAndKey.bind(this))\n\t\trouter.delete('/:container/:key', this.deleteWithContainerAndKey.bind(this))\n\t}\n\n\tgetWithContainerAndKey(request: Request, response: Response) {\n\t\tconst result = this.repository.getWithContainerAndKey(\n\t\t\tgetRepositoryContext(request),\n\t\t\trequest.params.container,\n\t\t\trequest.params.key\n\t\t)\n\n\t\tif (!result) {\n\t\t\treturn response.status(404).send('Not Found')\n\t\t}\n\t\treturn response.status(200).send(result)\n\t}\n\n\tcreateWithContainerAndKey(request: Request, response: Response) {\n\t\tconst draft: CustomObjectDraft = {\n\t\t\t...request.body,\n\t\t\tkey: request.params.key,\n\t\t\tcontainer: request.params.container,\n\t\t}\n\n\t\tconst result = this.repository.create(getRepositoryContext(request), draft)\n\t\treturn response.status(200).send(result)\n\t}\n\n\tdeleteWithContainerAndKey(request: Request, response: Response) {\n\t\tconst current = this.repository.getWithContainerAndKey(\n\t\t\tgetRepositoryContext(request),\n\t\t\trequest.params.container,\n\t\t\trequest.params.key\n\t\t)\n\n\t\tif (!current) {\n\t\t\treturn response.status(404).send('Not Found')\n\t\t}\n\n\t\tconst result = this.repository.delete(\n\t\t\tgetRepositoryContext(request),\n\t\t\tcurrent.id\n\t\t)\n\n\t\treturn response.status(200).send(result)\n\t}\n}\n","import { Router } from 'express'\nimport { CustomerGroupRepository } from '../repositories/customer-group.js'\nimport AbstractService from './abstract.js'\n\nexport class CustomerGroupService extends AbstractService {\n\tpublic repository: CustomerGroupRepository\n\n\tconstructor(parent: Router, repository: CustomerGroupRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'customer-groups'\n\t}\n}\n","import { Router } from 'express'\nimport { v4 as uuidv4 } from 'uuid'\nimport { getBaseResourceProperties } from '../helpers.js'\nimport { CustomerRepository } from '../repositories/customer.js'\nimport { getRepositoryContext } from '../repositories/helpers.js'\nimport AbstractService from './abstract.js'\n\nexport class CustomerService extends AbstractService {\n\tpublic repository: CustomerRepository\n\n\tconstructor(parent: Router, repository: CustomerRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'customers'\n\t}\n\n\textraRoutes(parent: Router) {\n\t\tparent.post('/password-token', (request, response) => {\n\t\t\tconst customer = this.repository.query(getRepositoryContext(request), {\n\t\t\t\twhere: [`email=\"${request.body.email}\"`],\n\t\t\t})\n\t\t\t// @ts-ignore\n\t\t\tconst ttlMinutes: number = request.params.ttlMinutes\n\t\t\t\t? // @ts-ignore\n\t\t\t\t +request.params.ttlMinutes\n\t\t\t\t: 34560\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\t\tconst { version, ...rest } = getBaseResourceProperties()\n\n\t\t\treturn response.status(200).send({\n\t\t\t\t...rest,\n\t\t\t\tcustomerId: customer.results[0].id,\n\t\t\t\texpiresAt: new Date(Date.now() + ttlMinutes * 60).toISOString(),\n\t\t\t\tvalue: uuidv4(),\n\t\t\t})\n\t\t})\n\t}\n}\n","import { Router } from 'express'\nimport { DiscountCodeRepository } from '../repositories/discount-code.js'\nimport AbstractService from './abstract.js'\n\nexport class DiscountCodeService extends AbstractService {\n\tpublic repository: DiscountCodeRepository\n\n\tconstructor(parent: Router, repository: DiscountCodeRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'discount-codes'\n\t}\n}\n","import { Router } from 'express'\nimport { ExtensionRepository } from '../repositories/extension.js'\nimport AbstractService from './abstract.js'\n\nexport class ExtensionServices extends AbstractService {\n\tpublic repository: ExtensionRepository\n\n\tconstructor(parent: Router, repository: ExtensionRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'extensions'\n\t}\n}\n","import { Router } from 'express'\nimport { InventoryEntryRepository } from '../repositories/inventory-entry.js'\nimport AbstractService from './abstract.js'\n\nexport class InventoryEntryService extends AbstractService {\n\tpublic repository: InventoryEntryRepository\n\n\tconstructor(parent: Router, repository: InventoryEntryRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'inventory'\n\t}\n}\n","import { Request, Response, Router } from 'express'\nimport { CartRepository } from '../repositories/cart.js'\nimport AbstractService from './abstract.js'\n\nexport class MyCartService extends AbstractService {\n\tpublic repository: CartRepository\n\n\tconstructor(parent: Router, repository: CartRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'me'\n\t}\n\n\tregisterRoutes(parent: Router) {\n\t\t// Overwrite this function to be able to handle /me/active-cart path.\n\t\tconst basePath = this.getBasePath()\n\t\tconst router = Router({ mergeParams: true })\n\n\t\tthis.extraRoutes(router)\n\n\t\trouter.get('/active-cart', this.activeCart.bind(this))\n\t\trouter.get('/carts/', this.get.bind(this))\n\t\trouter.get('/carts/:id', this.getWithId.bind(this))\n\n\t\trouter.delete('/carts/:id', this.deleteWithId.bind(this))\n\n\t\trouter.post('/carts/', this.post.bind(this))\n\t\trouter.post('/carts/:id', this.postWithId.bind(this))\n\n\t\tparent.use(`/${basePath}`, router)\n\t}\n\n\tactiveCart(request: Request, response: Response) {\n\t\tconst resource = this.repository.getActiveCart(request.params.projectKey)\n\t\tif (!resource) {\n\t\t\treturn response.status(404).send('Not found')\n\t\t}\n\t\treturn response.status(200).send(resource)\n\t}\n}\n","import { Request, Response, Router } from 'express'\nimport { CustomerRepository } from '../repositories/customer.js'\nimport { getRepositoryContext } from '../repositories/helpers.js'\nimport AbstractService from './abstract.js'\nimport { hashPassword } from '../lib/password.js'\n\nexport class MyCustomerService extends AbstractService {\n\tpublic repository: CustomerRepository\n\n\tconstructor(parent: Router, repository: CustomerRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'me'\n\t}\n\n\tregisterRoutes(parent: Router) {\n\t\t// Overwrite this function to be able to handle /me path.\n\t\tconst basePath = this.getBasePath()\n\t\tconst router = Router({ mergeParams: true })\n\n\t\tthis.extraRoutes(router)\n\n\t\trouter.get('', this.getMe.bind(this))\n\n\t\trouter.post('/signup', this.signUp.bind(this))\n\n\t\trouter.post('/login', this.signIn.bind(this))\n\n\t\tparent.use(`/${basePath}`, router)\n\t}\n\n\tgetMe(request: Request, response: Response) {\n\t\tconst resource = this.repository.getMe(getRepositoryContext(request))\n\t\tif (!resource) {\n\t\t\treturn response.status(404).send('Not found')\n\t\t}\n\t\treturn response.status(200).send(resource)\n\t}\n\n\tsignUp(request: Request, response: Response) {\n\t\tconst draft = request.body\n\t\tconst resource = this.repository.create(\n\t\t\tgetRepositoryContext(request),\n\t\t\tdraft\n\t\t)\n\t\tconst result = this._expandWithId(request, resource.id)\n\t\treturn response.status(this.createStatusCode).send({ customer: result })\n\t}\n\n\tsignIn(request: Request, response: Response) {\n\t\tconst { email, password } = request.body\n\t\tconst encodedPassword = hashPassword(password)\n\n\t\tconst result = this.repository.query(getRepositoryContext(request), {\n\t\t\twhere: [`email = \"${email}\"`, `password = \"${encodedPassword}\"`],\n\t\t})\n\n\t\tif (result.count === 0) {\n\t\t\treturn response.status(400).send({\n\t\t\t\tmessage: 'Account with the given credentials not found.',\n\t\t\t\terrors: [\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: 'InvalidCredentials',\n\t\t\t\t\t\tmessage: 'Account with the given credentials not found.',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t})\n\t\t}\n\n\t\treturn response.status(200).send({ customer: result.results[0] })\n\t}\n}\n","import { Router } from 'express'\nimport { MyOrderRepository } from '../repositories/my-order.js'\nimport AbstractService from './abstract.js'\n\nexport class MyOrderService extends AbstractService {\n\tpublic repository: MyOrderRepository\n\n\tconstructor(parent: Router, repository: MyOrderRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'me'\n\t}\n\n\tregisterRoutes(parent: Router) {\n\t\t// Overwrite this function to be able to handle /me/active-cart path.\n\t\tconst basePath = this.getBasePath()\n\t\tconst router = Router({ mergeParams: true })\n\n\t\tthis.extraRoutes(router)\n\n\t\trouter.get('/orders/', this.get.bind(this))\n\t\trouter.get('/orders/:id', this.getWithId.bind(this))\n\n\t\trouter.delete('/orders/:id', this.deleteWithId.bind(this))\n\n\t\trouter.post('/orders/', this.post.bind(this))\n\t\trouter.post('/orders/:id', this.postWithId.bind(this))\n\n\t\tparent.use(`/${basePath}`, router)\n\t}\n}\n","import { Router } from 'express'\nimport { PaymentRepository } from '../repositories/payment.js'\nimport AbstractService from './abstract.js'\n\nexport class MyPaymentService extends AbstractService {\n\tpublic repository: PaymentRepository\n\n\tconstructor(parent: Router, repository: PaymentRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'me/payments'\n\t}\n}\n","import { Request, Response, Router } from 'express'\nimport { getRepositoryContext } from '../repositories/helpers.js'\nimport { OrderRepository } from '../repositories/order.js'\nimport AbstractService from './abstract.js'\n\nexport class OrderService extends AbstractService {\n\tpublic repository: OrderRepository\n\n\tconstructor(parent: Router, repository: OrderRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'orders'\n\t}\n\n\textraRoutes(router: Router) {\n\t\trouter.post('/import', this.import.bind(this))\n\t\trouter.get('/order-number=:orderNumber', this.getWithOrderNumber.bind(this))\n\t}\n\n\timport(request: Request, response: Response) {\n\t\tconst importDraft = request.body\n\t\tconst resource = this.repository.import(\n\t\t\tgetRepositoryContext(request),\n\t\t\timportDraft\n\t\t)\n\t\treturn response.status(200).send(resource)\n\t}\n\n\tgetWithOrderNumber(request: Request, response: Response) {\n\t\tconst resource = this.repository.getWithOrderNumber(\n\t\t\tgetRepositoryContext(request),\n\t\t\trequest.params.orderNumber,\n\t\t\trequest.query\n\t\t)\n\t\tif (resource) {\n\t\t\treturn response.status(200).send(resource)\n\t\t}\n\t\treturn response.status(404).send('Not found')\n\t}\n}\n","import { Router } from 'express'\nimport { PaymentRepository } from '../repositories/payment.js'\nimport AbstractService from './abstract.js'\n\nexport class PaymentService extends AbstractService {\n\tpublic repository: PaymentRepository\n\n\tconstructor(parent: Router, repository: PaymentRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'payments'\n\t}\n}\n","import { Router } from 'express'\nimport { ProductDiscountRepository } from '../repositories/product-discount.js'\nimport AbstractService from './abstract.js'\n\nexport class ProductDiscountService extends AbstractService {\n\tpublic repository: ProductDiscountRepository\n\n\tconstructor(parent: Router, repository: ProductDiscountRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'product-discounts'\n\t}\n}\n","import { Request, Response, Router } from 'express'\nimport { getRepositoryContext } from '../repositories/helpers.js'\nimport {\n\tProductProjectionQueryParams,\n\tProductProjectionRepository,\n} from './../repositories/product-projection.js'\nimport AbstractService from './abstract.js'\nimport { queryParamsArray, queryParamsValue } from '../helpers.js'\n\nexport class ProductProjectionService extends AbstractService {\n\tpublic repository: ProductProjectionRepository\n\n\tconstructor(parent: Router, repository: ProductProjectionRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'product-projections'\n\t}\n\n\textraRoutes(router: Router) {\n\t\trouter.get('/search', this.search.bind(this))\n\t}\n\n\tget(request: Request, response: Response) {\n\t\tconst limit = this._parseParam(request.query.limit)\n\t\tconst offset = this._parseParam(request.query.offset)\n\n\t\tconst result = this.repository.query(getRepositoryContext(request), {\n\t\t\t...request.query,\n\t\t\texpand: this._parseParam(request.query.expand),\n\t\t\twhere: this._parseParam(request.query.where),\n\t\t\tlimit: limit !== undefined ? Number(limit) : undefined,\n\t\t\toffset: offset !== undefined ? Number(offset) : undefined,\n\t\t})\n\t\treturn response.status(200).send(result)\n\t}\n\n\tsearch(request: Request, response: Response) {\n\t\tconst query = request.query\n\t\tconst searchParams: ProductProjectionQueryParams = {\n\t\t\tfilter: queryParamsArray(query.filter),\n\t\t\t'filter.query': queryParamsArray(query['filter.query']),\n\t\t\tfacet: queryParamsArray(query.facet),\n\t\t\texpand: queryParamsArray(query.expand),\n\t\t\tstaged: queryParamsValue(query.staged) === 'true',\n\t\t\tlocaleProjection: queryParamsValue(query.localeProjection),\n\t\t\tstoreProjection: queryParamsValue(query.storeProjection),\n\t\t\tpriceChannel: queryParamsValue(query.priceChannel),\n\t\t\tpriceCountry: queryParamsValue(query.priceCountry),\n\t\t\tpriceCurrency: queryParamsValue(query.priceCurrency),\n\t\t\tpriceCustomerGroup: queryParamsValue(query.priceCustomerGroup),\n\t\t\toffset: query.offset ? Number(queryParamsValue(query.offset)) : undefined,\n\t\t\tlimit: query.limit ? Number(queryParamsValue(query.limit)) : undefined,\n\t\t}\n\t\tconst resource = this.repository.search(\n\t\t\tgetRepositoryContext(request),\n\t\t\tsearchParams\n\t\t)\n\t\treturn response.status(200).send(resource)\n\t}\n}\n","import { Router } from 'express'\nimport AbstractService from './abstract.js'\nimport { ProductSelectionRepository } from '../repositories/product-selection.js'\n\nexport class ProductSelectionService extends AbstractService {\n\tpublic repository: ProductSelectionRepository\n\n\tconstructor(parent: Router, repository: ProductSelectionRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'product-selections'\n\t}\n}\n","import { Router } from 'express'\nimport { ProductTypeRepository } from '../repositories/product-type.js'\nimport AbstractService from './abstract.js'\n\nexport class ProductTypeService extends AbstractService {\n\tpublic repository: ProductTypeRepository\n\n\tconstructor(parent: Router, repository: ProductTypeRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'product-types'\n\t}\n}\n","import { Router } from 'express'\nimport { ProductRepository } from '../repositories/product.js'\nimport AbstractService from './abstract.js'\n\nexport class ProductService extends AbstractService {\n\tpublic repository: ProductRepository\n\n\tconstructor(parent: Router, repository: ProductRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'products'\n\t}\n}\n","import { Router } from 'express'\nimport { ShippingMethodRepository } from '../repositories/shipping-method.js'\nimport AbstractService from './abstract.js'\n\nexport class ShippingMethodService extends AbstractService {\n\tpublic repository: ShippingMethodRepository\n\n\tconstructor(parent: Router, repository: ShippingMethodRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t\tthis.registerRoutes(parent)\n\t}\n\n\tgetBasePath() {\n\t\treturn 'shipping-methods'\n\t}\n\n\textraRoutes(parent: Router) {\n\t\tparent.get('/matching-cart', this.get.bind(this))\n\t}\n}\n","import { Router } from 'express'\nimport { ShoppingListRepository } from './../repositories/shopping-list.js'\nimport AbstractService from './abstract.js'\n\nexport class ShoppingListService extends AbstractService {\n\tpublic repository: ShoppingListRepository\n\n\tconstructor(parent: Router, repository: ShoppingListRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'shopping-lists'\n\t}\n}\n","import { Router } from 'express'\nimport { StandAlonePriceRepository } from '../repositories/standalone-price.js'\nimport AbstractService from './abstract.js'\n\nexport class StandAlonePriceService extends AbstractService {\n\tpublic repository: StandAlonePriceRepository\n\n\tconstructor(parent: Router, repository: StandAlonePriceRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'standalone-prices'\n\t}\n}\n","import { Router } from 'express'\nimport { StateRepository } from '../repositories/state.js'\nimport AbstractService from './abstract.js'\n\nexport class StateService extends AbstractService {\n\tpublic repository: StateRepository\n\n\tconstructor(parent: Router, repository: StateRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'states'\n\t}\n}\n","import { Router } from 'express'\nimport { StoreRepository } from '../repositories/store.js'\nimport AbstractService from './abstract.js'\n\nexport class StoreService extends AbstractService {\n\tpublic repository: StoreRepository\n\n\tconstructor(parent: Router, repository: StoreRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'stores'\n\t}\n}\n","import { Router } from 'express'\nimport { SubscriptionRepository } from '../repositories/subscription.js'\nimport AbstractService from './abstract.js'\n\nexport class SubscriptionService extends AbstractService {\n\tpublic repository: SubscriptionRepository\n\n\tconstructor(parent: Router, repository: SubscriptionRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'subscriptions'\n\t}\n}\n","import { Router } from 'express'\nimport { TaxCategoryRepository } from '../repositories/tax-category.js'\nimport AbstractService from './abstract.js'\n\nexport class TaxCategoryService extends AbstractService {\n\tpublic repository: TaxCategoryRepository\n\n\tconstructor(parent: Router, repository: TaxCategoryRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'tax-categories'\n\t}\n}\n","import { Router } from 'express'\nimport { TypeRepository } from '../repositories/type.js'\nimport AbstractService from './abstract.js'\n\nexport class TypeService extends AbstractService {\n\tpublic repository: TypeRepository\n\n\tconstructor(parent: Router, repository: TypeRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'types'\n\t}\n}\n","import { Router } from 'express'\nimport { ZoneRepository } from '../repositories/zone.js'\nimport AbstractService from './abstract.js'\n\nexport class ZoneService extends AbstractService {\n\tpublic repository: ZoneRepository\n\n\tconstructor(parent: Router, repository: ZoneRepository) {\n\t\tsuper(parent)\n\t\tthis.repository = repository\n\t}\n\n\tgetBasePath() {\n\t\treturn 'zones'\n\t}\n}\n","import { AssociateRoleServices } from './associate-roles.js'\nimport { AttributeGroupService } from './attribute-group.js'\nimport { BusinessUnitServices } from './business-units.js'\nimport { CartDiscountService } from './cart-discount.js'\nimport { CartService } from './cart.js'\nimport { CategoryServices } from './category.js'\nimport { ChannelService } from './channel.js'\nimport { CustomObjectService } from './custom-object.js'\nimport { CustomerGroupService } from './customer-group.js'\nimport { CustomerService } from './customer.js'\nimport { DiscountCodeService } from './discount-code.js'\nimport { ExtensionServices } from './extension.js'\nimport { InventoryEntryService } from './inventory-entry.js'\nimport { MyCartService } from './my-cart.js'\nimport { MyCustomerService } from './my-customer.js'\nimport { MyOrderService } from './my-order.js'\nimport { MyPaymentService } from './my-payment.js'\nimport { OrderService } from './order.js'\nimport { PaymentService } from './payment.js'\nimport { ProductDiscountService } from './product-discount.js'\nimport { ProductProjectionService } from './product-projection.js'\nimport { ProductSelectionService } from './product-selection.js'\nimport { ProductTypeService } from './product-type.js'\nimport { ProductService } from './product.js'\nimport { ShippingMethodService } from './shipping-method.js'\nimport { ShoppingListService } from './shopping-list.js'\nimport { StandAlonePriceService } from './standalone-price.js'\nimport { StateService } from './state.js'\nimport { StoreService } from './store.js'\nimport { SubscriptionService } from './subscription.js'\nimport { TaxCategoryService } from './tax-category.js'\nimport { TypeService } from './type.js'\nimport { ZoneService } from './zone.js'\n\nexport const createServices = (router: any, repos: any) => ({\n\t'associate-role': new AssociateRoleServices(router, repos['associate-role']),\n\t'business-unit': new BusinessUnitServices(router, repos['business-unit']),\n\tcategory: new CategoryServices(router, repos['category']),\n\tcart: new CartService(router, repos['cart'], repos['order']),\n\t'cart-discount': new CartDiscountService(router, repos['cart-discount']),\n\tcustomer: new CustomerService(router, repos['customer']),\n\tchannel: new ChannelService(router, repos['channel']),\n\t'customer-group': new CustomerGroupService(router, repos['customer-group']),\n\t'discount-code': new DiscountCodeService(router, repos['discount-code']),\n\textension: new ExtensionServices(router, repos['extension']),\n\t'inventory-entry': new InventoryEntryService(\n\t\trouter,\n\t\trepos['inventory-entry']\n\t),\n\t'key-value-document': new CustomObjectService(\n\t\trouter,\n\t\trepos['key-value-document']\n\t),\n\torder: new OrderService(router, repos['order']),\n\tpayment: new PaymentService(router, repos['payment']),\n\t'standalone-price': new StandAlonePriceService(\n\t\trouter,\n\t\trepos['standalone-price']\n\t),\n\t'my-cart': new MyCartService(router, repos['my-cart']),\n\t'my-order': new MyOrderService(router, repos['my-order']),\n\t'my-customer': new MyCustomerService(router, repos['my-customer']),\n\t'my-payment': new MyPaymentService(router, repos['my-payment']),\n\t'shipping-method': new ShippingMethodService(\n\t\trouter,\n\t\trepos['shipping-method']\n\t),\n\t'product-type': new ProductTypeService(router, repos['product-type']),\n\tproduct: new ProductService(router, repos['product']),\n\t'product-discount': new ProductDiscountService(\n\t\trouter,\n\t\trepos['product-discount']\n\t),\n\t'product-projection': new ProductProjectionService(\n\t\trouter,\n\t\trepos['product-projection']\n\t),\n\t'product-selection': new ProductSelectionService(\n\t\trouter,\n\t\trepos['product-selection']\n\t),\n\t'shopping-list': new ShoppingListService(router, repos['shopping-list']),\n\tstate: new StateService(router, repos['state']),\n\tstore: new StoreService(router, repos['store']),\n\tsubscription: new SubscriptionService(router, repos['subscription']),\n\t'tax-category': new TaxCategoryService(router, repos['tax-category']),\n\t'attribute-group': new AttributeGroupService(\n\t\trouter,\n\t\trepos['attribute-group']\n\t),\n\ttype: new TypeService(router, repos['type']),\n\tzone: new ZoneService(router, repos['zone']),\n})\n"],"mappings":"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","names":["express","e","uuidv4","uuidv4","a","uuidv4","uuidv4","uuidv4","uuidv4","assert","assert","assert","assert","uuidv4","uuidv4","uuidv4","deepEqual","existingAttr","priceToAdd","variant","deepEqual","uuidv4","generateMatchFunc","getLexer","deepEqual","deepEqual","uuidv4","uuidv4","uuidv4","uuidv4","Router","Router","Router","Router","Router","Router","express"]}