@labdigital/commercetools-mock 2.66.0 → 3.0.0-beta.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/README.md +31 -8
- package/dist/abstract-BKFcva6S.mjs +1044 -0
- package/dist/abstract-BKFcva6S.mjs.map +1 -0
- package/dist/config-BcNSzPZz.d.mts +1718 -0
- package/dist/index.d.mts +50 -1633
- package/dist/index.mjs +3769 -2653
- package/dist/index.mjs.map +1 -1
- package/dist/storage/sqlite.d.mts +59 -0
- package/dist/storage/sqlite.mjs +234 -0
- package/dist/storage/sqlite.mjs.map +1 -0
- package/package.json +26 -29
- package/src/ctMock.ts +125 -136
- package/src/helpers.ts +14 -6
- package/src/index.ts +5 -0
- package/src/lib/masking.ts +4 -5
- package/src/lib/product-review-statistics.test.ts +257 -294
- package/src/lib/review-statistics.ts +17 -4
- package/src/oauth/helpers.ts +7 -4
- package/src/oauth/server.test.ts +102 -62
- package/src/oauth/server.ts +215 -213
- package/src/oauth/store.ts +20 -6
- package/src/orderSearch.ts +3 -3
- package/src/product-projection-search.ts +38 -20
- package/src/product-search-availability.test.ts +31 -52
- package/src/product-search.ts +19 -10
- package/src/projectAPI.ts +6 -22
- package/src/repositories/abstract.ts +182 -48
- package/src/repositories/as-associate.test.ts +19 -19
- package/src/repositories/associate-role.ts +12 -23
- package/src/repositories/attribute-group.test.ts +23 -23
- package/src/repositories/attribute-group.ts +6 -4
- package/src/repositories/business-unit.test.ts +63 -57
- package/src/repositories/business-unit.ts +107 -55
- package/src/repositories/cart/actions.ts +96 -65
- package/src/repositories/cart/helpers.ts +15 -11
- package/src/repositories/cart/index.test.ts +136 -30
- package/src/repositories/cart/index.ts +76 -59
- package/src/repositories/cart-discount/actions.ts +12 -44
- package/src/repositories/cart-discount/index.ts +20 -8
- package/src/repositories/category/actions.ts +27 -27
- package/src/repositories/category/index.test.ts +13 -9
- package/src/repositories/category/index.ts +40 -23
- package/src/repositories/channel.test.ts +53 -51
- package/src/repositories/channel.ts +12 -22
- package/src/repositories/custom-object.ts +34 -25
- package/src/repositories/customer/actions.ts +47 -25
- package/src/repositories/customer/index.test.ts +11 -11
- package/src/repositories/customer/index.ts +65 -35
- package/src/repositories/customer-group.test.ts +44 -42
- package/src/repositories/customer-group.ts +12 -22
- package/src/repositories/discount-code/actions.ts +3 -19
- package/src/repositories/discount-code/index.ts +9 -4
- package/src/repositories/discount-group/index.ts +8 -3
- package/src/repositories/extension.test.ts +27 -27
- package/src/repositories/extension.ts +10 -5
- package/src/repositories/helpers.ts +126 -47
- package/src/repositories/inventory-entry/actions.ts +3 -24
- package/src/repositories/inventory-entry/index.ts +19 -11
- package/src/repositories/my-customer.ts +13 -12
- package/src/repositories/my-order.ts +5 -2
- package/src/repositories/order/actions.ts +84 -56
- package/src/repositories/order/index.test.ts +36 -31
- package/src/repositories/order/index.ts +83 -49
- package/src/repositories/order-edit.ts +8 -3
- package/src/repositories/payment/actions.ts +64 -44
- package/src/repositories/payment/helpers.ts +3 -3
- package/src/repositories/payment/index.ts +28 -12
- package/src/repositories/product/actions.ts +133 -98
- package/src/repositories/product/helpers.ts +29 -16
- package/src/repositories/product/index.ts +42 -25
- package/src/repositories/product-discount.ts +6 -4
- package/src/repositories/product-projection.ts +41 -21
- package/src/repositories/product-selection.ts +8 -15
- package/src/repositories/product-tailoring.ts +22 -3
- package/src/repositories/product-type.ts +45 -4
- package/src/repositories/project.ts +57 -13
- package/src/repositories/quote/actions.ts +5 -28
- package/src/repositories/quote/index.ts +29 -6
- package/src/repositories/quote-request/actions.ts +5 -28
- package/src/repositories/quote-request/index.test.ts +3 -3
- package/src/repositories/quote-request/index.ts +31 -11
- package/src/repositories/quote-staged/actions.ts +5 -28
- package/src/repositories/quote-staged/index.ts +22 -8
- package/src/repositories/recurrence-policy/index.ts +6 -4
- package/src/repositories/recurring-order/actions.ts +7 -32
- package/src/repositories/recurring-order/index.ts +8 -6
- package/src/repositories/review.test.ts +147 -142
- package/src/repositories/review.ts +31 -37
- package/src/repositories/shipping-method/actions.ts +11 -28
- package/src/repositories/shipping-method/index.ts +26 -15
- package/src/repositories/shopping-list/actions.ts +21 -31
- package/src/repositories/shopping-list/index.ts +44 -22
- package/src/repositories/standalone-price.ts +6 -4
- package/src/repositories/state.ts +15 -9
- package/src/repositories/store.ts +21 -32
- package/src/repositories/subscription.test.ts +22 -22
- package/src/repositories/subscription.ts +8 -3
- package/src/repositories/tax-category/index.ts +8 -3
- package/src/repositories/type/actions.ts +21 -3
- package/src/repositories/type/index.ts +5 -3
- package/src/repositories/zone.test.ts +112 -77
- package/src/repositories/zone.ts +5 -3
- package/src/schemas/generated/associate-role.ts +13 -0
- package/src/schemas/generated/attribute-group.ts +12 -0
- package/src/schemas/generated/business-unit.ts +38 -0
- package/src/schemas/generated/cart-discount.ts +33 -0
- package/src/schemas/generated/cart.ts +61 -0
- package/src/schemas/generated/category.ts +25 -0
- package/src/schemas/generated/channel.ts +21 -0
- package/src/schemas/generated/common.ts +1372 -0
- package/src/schemas/generated/custom-object.ts +11 -0
- package/src/schemas/generated/customer-group.ts +11 -0
- package/src/schemas/generated/customer.ts +47 -0
- package/src/schemas/generated/discount-code.ts +25 -0
- package/src/schemas/generated/discount-group.ts +13 -0
- package/src/schemas/generated/extension.ts +15 -0
- package/src/schemas/generated/index.ts +42 -0
- package/src/schemas/generated/inventory-entry.ts +20 -0
- package/src/schemas/generated/my-quote-request.ts +10 -0
- package/src/schemas/generated/order-edit.ts +18 -0
- package/src/schemas/generated/order-from-cart.ts +25 -0
- package/src/schemas/generated/payment.ts +30 -0
- package/src/schemas/generated/product-discount.ts +20 -0
- package/src/schemas/generated/product-selection.ts +18 -0
- package/src/schemas/generated/product-tailoring.ts +26 -0
- package/src/schemas/generated/product-type.ts +12 -0
- package/src/schemas/generated/product.ts +37 -0
- package/src/schemas/generated/quote-request.ts +19 -0
- package/src/schemas/generated/quote.ts +18 -0
- package/src/schemas/generated/recurrence-policy.ts +15 -0
- package/src/schemas/generated/recurring-order.ts +19 -0
- package/src/schemas/generated/review.ts +24 -0
- package/src/schemas/generated/shipping-method.ts +24 -0
- package/src/schemas/generated/shopping-list.ts +28 -0
- package/src/schemas/generated/staged-quote.ts +18 -0
- package/src/schemas/generated/standalone-price.ts +32 -0
- package/src/schemas/generated/state.ts +20 -0
- package/src/schemas/generated/store.ts +23 -0
- package/src/schemas/generated/subscription.ts +20 -0
- package/src/schemas/generated/tax-category.ts +12 -0
- package/src/schemas/generated/type.ts +17 -0
- package/src/schemas/generated/zone.ts +12 -0
- package/src/schemas/update-request.ts +3 -5
- package/src/server.ts +32 -4
- package/src/services/abstract.ts +207 -101
- package/src/services/as-associate-cart.test.ts +28 -36
- package/src/services/as-associate-cart.ts +15 -12
- package/src/services/as-associate-order.test.ts +33 -40
- package/src/services/as-associate-order.ts +15 -12
- package/src/services/as-associate-quote-request.ts +15 -12
- package/src/services/as-associate-shopping-list.test.ts +25 -35
- package/src/services/as-associate-shopping-list.ts +15 -12
- package/src/services/as-associate.test.ts +21 -15
- package/src/services/as-associate.ts +23 -22
- package/src/services/associate-roles.test.ts +16 -22
- package/src/services/associate-roles.ts +2 -2
- package/src/services/attribute-group.test.ts +40 -44
- package/src/services/attribute-group.ts +2 -2
- package/src/services/business-units.test.ts +227 -163
- package/src/services/business-units.ts +2 -2
- package/src/services/cart-discount.test.ts +253 -187
- package/src/services/cart-discount.ts +2 -2
- package/src/services/cart.test.ts +833 -832
- package/src/services/cart.ts +31 -12
- package/src/services/category.test.ts +208 -130
- package/src/services/category.ts +2 -2
- package/src/services/channel.test.ts +39 -44
- package/src/services/channel.ts +2 -2
- package/src/services/custom-object.test.ts +103 -79
- package/src/services/custom-object.ts +106 -38
- package/src/services/customer-group.test.ts +39 -44
- package/src/services/customer-group.ts +2 -2
- package/src/services/customer.test.ts +357 -292
- package/src/services/customer.ts +70 -23
- package/src/services/discount-code.test.ts +57 -68
- package/src/services/discount-code.ts +2 -2
- package/src/services/discount-group.test.ts +111 -134
- package/src/services/discount-group.ts +2 -2
- package/src/services/draft-validation.test.ts +255 -0
- package/src/services/extension.test.ts +39 -44
- package/src/services/extension.ts +2 -2
- package/src/services/inventory-entry.test.ts +106 -87
- package/src/services/inventory-entry.ts +2 -2
- package/src/services/my-business-unit.test.ts +82 -112
- package/src/services/my-business-unit.ts +25 -19
- package/src/services/my-cart.test.ts +46 -41
- package/src/services/my-cart.ts +32 -28
- package/src/services/my-customer.test.ts +153 -88
- package/src/services/my-customer.ts +130 -61
- package/src/services/my-order.ts +15 -12
- package/src/services/my-payment.test.ts +30 -24
- package/src/services/my-payment.ts +2 -2
- package/src/services/my-shopping-list.ts +2 -2
- package/src/services/order.test.ts +332 -276
- package/src/services/order.ts +45 -27
- package/src/services/payment.test.ts +31 -29
- package/src/services/payment.ts +2 -2
- package/src/services/product-discount.test.ts +39 -46
- package/src/services/product-discount.ts +2 -2
- package/src/services/product-projection.test.ts +176 -166
- package/src/services/product-projection.ts +31 -15
- package/src/services/product-selection.test.ts +17 -9
- package/src/services/product-selection.ts +2 -2
- package/src/services/product-type.test.ts +80 -21
- package/src/services/product-type.ts +2 -2
- package/src/services/product.test.ts +569 -534
- package/src/services/product.ts +14 -7
- package/src/services/project.test.ts +22 -12
- package/src/services/project.ts +28 -13
- package/src/services/quote-request.test.ts +36 -39
- package/src/services/quote-request.ts +2 -2
- package/src/services/quote-staged.ts +2 -2
- package/src/services/quote.ts +2 -2
- package/src/services/recurrence-policy.test.ts +114 -139
- package/src/services/recurrence-policy.ts +2 -2
- package/src/services/recurring-order.test.ts +149 -194
- package/src/services/recurring-order.ts +2 -2
- package/src/services/reviews.test.ts +127 -106
- package/src/services/reviews.ts +2 -2
- package/src/services/shipping-method.test.ts +96 -125
- package/src/services/shipping-method.ts +24 -12
- package/src/services/shopping-list.test.ts +183 -141
- package/src/services/shopping-list.ts +2 -2
- package/src/services/standalone-price.test.ts +60 -46
- package/src/services/standalone-price.ts +2 -2
- package/src/services/state.test.ts +20 -25
- package/src/services/state.ts +2 -2
- package/src/services/store.test.ts +26 -45
- package/src/services/store.ts +2 -2
- package/src/services/subscription.test.ts +39 -44
- package/src/services/subscription.ts +2 -2
- package/src/services/tax-category.test.ts +33 -36
- package/src/services/tax-category.ts +2 -2
- package/src/services/type.test.ts +45 -44
- package/src/services/type.ts +2 -2
- package/src/services/zone.test.ts +40 -44
- package/src/services/zone.ts +2 -2
- package/src/shipping.ts +41 -11
- package/src/storage/abstract.ts +248 -17
- package/src/storage/in-memory.ts +147 -290
- package/src/storage/sqlite.ts +429 -0
- package/src/storage/storage-map.ts +75 -0
- package/src/storage/storage.test-helpers.ts +97 -0
- package/src/storage/storage.test.ts +802 -0
- package/src/testing/associate-role.ts +28 -0
- package/src/testing/attribute-group.ts +27 -0
- package/src/testing/business-unit.ts +9 -8
- package/src/testing/cart-discount.ts +34 -0
- package/src/testing/cart.ts +20 -0
- package/src/testing/category.ts +25 -0
- package/src/testing/channel.ts +23 -0
- package/src/testing/custom-object.ts +27 -0
- package/src/testing/customer-group.ts +26 -0
- package/src/testing/customer.ts +36 -33
- package/src/testing/discount-code.ts +29 -0
- package/src/testing/discount-group.ts +27 -0
- package/src/testing/extension.ts +32 -0
- package/src/testing/index.ts +33 -0
- package/src/testing/inventory-entry.ts +26 -0
- package/src/testing/order.ts +27 -0
- package/src/testing/payment.ts +23 -0
- package/src/testing/product-discount.ts +33 -0
- package/src/testing/product-selection.ts +28 -0
- package/src/testing/product-type.ts +27 -0
- package/src/testing/product.ts +38 -0
- package/src/testing/quote-request.ts +29 -0
- package/src/testing/recurrence-policy.ts +33 -0
- package/src/testing/recurring-order.ts +32 -0
- package/src/testing/review.ts +24 -0
- package/src/testing/shipping-method.ts +31 -0
- package/src/testing/shopping-list.ts +25 -0
- package/src/testing/standalone-price.ts +31 -0
- package/src/testing/state.ts +21 -0
- package/src/testing/store.ts +26 -0
- package/src/testing/subscription.ts +38 -0
- package/src/testing/tax-category.ts +27 -0
- package/src/testing/type.ts +9 -6
- package/src/testing/zone.ts +22 -0
- package/src/validate.test.ts +122 -0
- package/src/validate.ts +78 -7
- package/src/.env +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abstract-BKFcva6S.mjs","names":["uuidv4"],"sources":["../src/exceptions.ts","../src/helpers.ts","../src/lib/expandParser.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/haversine.ts","../src/lib/predicateParser.ts","../src/storage/abstract.ts"],"sourcesContent":["export abstract class BaseError {\n\tabstract message: string;\n\n\tabstract errors?: BaseError[];\n}\n\nexport class CommercetoolsError<T extends BaseError> extends Error {\n\tinfo: T;\n\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\nexport interface AuthError {\n\treadonly statusCode: number;\n\treadonly message: string;\n\treadonly error: string;\n\treadonly error_description: string;\n}\n","import type { OutgoingHttpHeaders } from \"node:http\";\nimport type { ParsedQs } from \"qs\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nexport const getBaseResourceProperties = (clientId?: string) => {\n\tconst clientInfo = {\n\t\tclientId: clientId ?? \"\",\n\t\tisPlatformClient: false,\n\t};\n\treturn {\n\t\tid: uuidv4(),\n\t\tcreatedAt: new Date().toISOString(),\n\t\tlastModifiedAt: new Date().toISOString(),\n\t\tversion: 0,\n\t\tcreatedBy: clientInfo,\n\t\tlastModifiedBy: clientInfo,\n\t};\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\nexport const generateRandomString = (length: number) => {\n\tconst characters =\n\t\t\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\tlet result = \"\";\n\tfor (let i = 0; i < length; i++) {\n\t\tconst randomIndex = Math.floor(Math.random() * characters.length);\n\t\tresult += characters[randomIndex];\n\t}\n\treturn result;\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] === \"*\" ? \"*\" : Number.parseInt(match[1], 10);\n\t\tresult.element = result.element.substring(0, match.index);\n\t}\n\treturn result;\n};\n","import TokenTypes from \"./token-types.ts\";\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.ts\";\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\n\tmatch: string;\n\n\tgroups: string[];\n\n\tstart: number;\n\n\tend: number;\n\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 as T, \"(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 } | undefined {\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.ts\";\nimport Token, { EOF } from \"./token.ts\";\nimport TokenTypes from \"./token-types.ts\";\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\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 as any).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): Token<T> | null => {\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\tif (!n || !n.result) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Unexpected input: ${this._state.source.substring(\n\t\t\t\t\t\ti,\n\t\t\t\t\t\ti + 1,\n\t\t\t\t\t)} at (${this.strpos(i).line}:${this.strpos(i).column})`,\n\t\t\t\t);\n\t\t\t}\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\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 as any).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, Lexer, LexerState, Token, TokenTypes };\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","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","/**\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.ts\";\nimport { type ITokenPosition, Lexer, Parser } from \"./parser.ts\";\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}\n\tconst func = generateMatchFunc(predicate);\n\treturn func(target, variables ?? {});\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}\n\treturn generateMatchFunc(predicate);\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\t// variants() includes both masterVariant and variants for predicates\n\tif (\n\t\tval.value === \"variants\" &&\n\t\tobj.masterVariant &&\n\t\tobj.variants !== undefined\n\t) {\n\t\treturn [obj.masterVariant, ...(obj.variants ?? [])];\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\n\t\t// TODO: We don't really validate the shape of the object here. To actually\n\t\t// match commercetools behaviour we should throw an error if the requested\n\t\t// field doesn't exist (unless it's a map)\n\t\t// throw new PredicateError(`The field '${val.value}' does not exist.`)\n\t\treturn undefined;\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// Special case for UUID identifiers,\n\t\t// since they otherwise would get matched as INT, when starting with a digit\n\t\t.token(\n\t\t\t\"IDENTIFIER\",\n\t\t\t/[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}/,\n\t\t)\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\",\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-expect-error\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-expect-error\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: Number.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: Number.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, vars: object) => left(obj, vars) && expr(obj, vars);\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}\n\t\t\treturn [left, expr];\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\tif (Array.isArray(obj)) {\n\t\t\t\t\treturn obj.some((item) => {\n\t\t\t\t\t\tconst value = resolveValue(item, left);\n\t\t\t\t\t\tif (value) {\n\t\t\t\t\t\t\treturn expr(value, vars);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tconst value = resolveValue(obj, left);\n\t\t\t\tif (value) {\n\t\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\t\treturn value.some((item) => expr(item, vars));\n\t\t\t\t\t}\n\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\tif (Array.isArray(obj)) {\n\t\t\t\t\treturn obj.some((item) => {\n\t\t\t\t\t\tconst value = resolveValue(item, left);\n\t\t\t\t\t\tconst other = resolveSymbol(expr, vars);\n\t\t\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\t\t\treturn !!value.some((elem) => elem === other);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn value === other;\n\t\t\t\t\t});\n\t\t\t\t}\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}\n\t\t\t\t\treturn (obj: any, vars: VariableMap) => {\n\t\t\t\t\t\tconst val = resolveValue(obj, left);\n\t\t\t\t\t\treturn val.length !== 0;\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}\n\t\t\t\t\treturn (obj: any, vars: VariableMap) => {\n\t\t\t\t\t\tconst val = resolveValue(obj, left);\n\t\t\t\t\t\treturn val === undefined;\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 firstToken = lexer.peek();\n\t\t\tconst expr = parser.parse({ terminals: [bp - 1] });\n\n\t\t\t// IN can be a single value or a list of values\n\t\t\tif (firstToken.match === \"(\") {\n\t\t\t\tlexer.expect(\")\");\n\t\t\t}\n\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\t// The expression can be a list of variables, like\n\t\t\t\t// :value_1, :value_2, but it can also be one variable\n\t\t\t\t// containing a list, like :values.\n\t\t\t\t// So to support both we just flatten the list.\n\t\t\t\tconst inValues = symbols.flatMap((item: TypeSymbol) =>\n\t\t\t\t\tresolveSymbol(item, vars),\n\t\t\t\t);\n\t\t\t\tconst value = resolveValue(obj, left);\n\n\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\treturn inValues.some((inValue: any) => value.includes(inValue));\n\t\t\t\t}\n\n\t\t\t\treturn inValues.includes(value);\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\t\t\tlexer.expect(\")\");\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}\n\t\t\t\treturn array.some((item: any) => value.includes(item));\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 operator, not, in, contains, is, within or matches (line ${lines.length}, column ${column})`,\n\t\t);\n\t}\n\treturn result;\n};\n","import type {\n\tBaseResource,\n\tCustomObject,\n\tInvalidInputError,\n\tInvalidJsonInputError,\n\tPagedQueryResponse,\n\tProduct,\n\tProject,\n\tQueryParam,\n\tReference,\n\tReferencedResourceNotFoundError,\n\tResourceIdentifier,\n\tShoppingListLineItem,\n} from \"@commercetools/platform-sdk\";\nimport { CommercetoolsError } from \"#src/exceptions.ts\";\nimport { parseExpandClause } from \"../lib/expandParser.ts\";\nimport { parseQueryExpression } from \"../lib/predicateParser.ts\";\nimport type {\n\tPagedQueryResponseMap,\n\tResourceMap,\n\tResourceType,\n\tWritable,\n} from \"../types.ts\";\nimport type { StorageMap } from \"./storage-map.ts\";\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\t/**\n\t * Close the storage backend and release any resources.\n\t * Override this in subclasses that hold external resources (e.g. database connections).\n\t */\n\tclose(): void {}\n\n\tabstract clear(): Promise<void>;\n\n\tabstract all<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT,\n\t): Promise<Array<ResourceMap[RT]>>;\n\n\t/**\n\t * Return the number of resources of the given type.\n\t * This is more efficient than loading all resources and counting them.\n\t */\n\tabstract count(projectKey: string, typeId: ResourceType): Promise<number>;\n\n\tabstract add<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT,\n\t\tobj: ResourceMap[RT],\n\t\tparams?: GetParams,\n\t): Promise<ResourceMap[RT]>;\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): Promise<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): Promise<ResourceMap[RT] | null>;\n\n\tabstract addProject(projectKey: string): Promise<Project>;\n\n\tabstract getProject(projectKey: string): Promise<Project>;\n\n\tabstract saveProject(project: Project): Promise<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): Promise<ResourceMap[RT] | null>;\n\n\tabstract query<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT,\n\t\tparams: QueryParams,\n\t): Promise<PagedQueryResponseMap[RT]>;\n\n\t/**\n\t * Look up a custom object by its container and key.\n\t * This is an O(1) operation for storage backends that maintain\n\t * a secondary index on (container, key).\n\t */\n\tabstract getByContainerAndKey(\n\t\tprojectKey: string,\n\t\tcontainer: string,\n\t\tkey: string,\n\t): Promise<CustomObject | null>;\n\n\t// Expand resolves a nested reference and injects the object in the given obj.\n\t// NOTE: This method mutates the passed object in-place. Callers must ensure\n\t// they pass an object that is safe to mutate (e.g. a clone from StorageMap\n\t// or JSON.parse).\n\tasync expand<T>(\n\t\tprojectKey: string,\n\t\tobj: T,\n\t\tclause: undefined | string | string[],\n\t): Promise<T> {\n\t\tif (!clause) return obj;\n\t\tif (Array.isArray(clause)) {\n\t\t\tfor (const c of clause) {\n\t\t\t\tawait this._resolveResource(projectKey, obj, c);\n\t\t\t}\n\t\t} else {\n\t\t\tawait this._resolveResource(projectKey, obj, clause);\n\t\t}\n\t\treturn obj;\n\t}\n\n\tasync getByResourceIdentifier<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\tidentifier: ResourceIdentifier,\n\t): Promise<ResourceMap[RT]> {\n\t\tif (identifier.id) {\n\t\t\tconst resource = await this.get(\n\t\t\t\tprojectKey,\n\t\t\t\tidentifier.typeId,\n\t\t\t\tidentifier.id,\n\t\t\t);\n\t\t\tif (resource) {\n\t\t\t\treturn resource as ResourceMap[RT];\n\t\t\t}\n\n\t\t\tthrow new CommercetoolsError<ReferencedResourceNotFoundError>({\n\t\t\t\tcode: \"ReferencedResourceNotFound\",\n\t\t\t\tmessage: `The referenced object of type '${identifier.typeId}' with id '${identifier.id}' 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\ttypeId: identifier.typeId,\n\t\t\t\tid: identifier.id,\n\t\t\t});\n\t\t}\n\n\t\tif (identifier.key) {\n\t\t\tconst resource = await this.getByKey(\n\t\t\t\tprojectKey,\n\t\t\t\tidentifier.typeId,\n\t\t\t\tidentifier.key,\n\t\t\t);\n\t\t\tif (resource) {\n\t\t\t\treturn resource as ResourceMap[RT];\n\t\t\t}\n\n\t\t\tthrow new CommercetoolsError<ReferencedResourceNotFoundError>({\n\t\t\t\tcode: \"ReferencedResourceNotFound\",\n\t\t\t\tmessage: `The referenced object of type '${identifier.typeId}' with key '${identifier.key}' 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\ttypeId: identifier.typeId,\n\t\t\t\tkey: identifier.key,\n\t\t\t});\n\t\t}\n\t\tthrow new CommercetoolsError<InvalidJsonInputError>({\n\t\t\tcode: \"InvalidJsonInput\",\n\t\t\tmessage: \"Request body does not contain valid JSON.\",\n\t\t\tdetailedErrorMessage: \"ResourceIdentifier requires an 'id' xor a 'key'\",\n\t\t});\n\t}\n\n\tasync search(\n\t\tprojectKey: string,\n\t\ttypeId: ResourceType,\n\t\tparams: QueryParams,\n\t): Promise<PagedQueryResponse> {\n\t\tlet resources = await 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 = await Promise.all(\n\t\t\t\tresources.map((resource) =>\n\t\t\t\t\tthis.expand(projectKey, resource, params.expand),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\treturn {\n\t\t\tcount: resources.length,\n\t\t\ttotal: totalResources,\n\t\t\toffset: offset,\n\t\t\tlimit: limit,\n\t\t\tresults: resources,\n\t\t};\n\t}\n\n\tprivate async _resolveResource(projectKey: string, obj: any, expand: string) {\n\t\tconst params = parseExpandClause(expand);\n\n\t\t// 'lineItems[*].variant' on ShoppingList is an exception, these variants are not references\n\t\tif (params.index === \"*\") {\n\t\t\tconst reference = obj[params.element];\n\t\t\tif (\n\t\t\t\tparams.element === \"lineItems\" &&\n\t\t\t\tparams.rest?.startsWith(\"variant\") &&\n\t\t\t\treference.every(\n\t\t\t\t\t(item: any) =>\n\t\t\t\t\t\titem.variant === undefined && item.variantId !== undefined,\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tfor (const item of reference as ShoppingListLineItem[]) {\n\t\t\t\t\tawait this._resolveShoppingListLineItemVariant(projectKey, item);\n\t\t\t\t}\n\t\t\t}\n\t\t}\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\tawait this._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\tfor (const itemRef of reference as Writable<Reference>[]) {\n\t\t\t\tawait this._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\tawait this._resolveReference(projectKey, reference, params.rest);\n\t\t}\n\t}\n\n\tprivate async _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// First check if the object is already resolved. This is the case when\n\t\t\t// the complete resource is pushed via the .add() method.\n\t\t\tif (!reference.obj) {\n\t\t\t\treference.obj = await this.getByResourceIdentifier(projectKey, {\n\t\t\t\t\ttypeId: reference.typeId,\n\t\t\t\t\tid: reference.id,\n\t\t\t\t\tkey: reference.key,\n\t\t\t\t} as ResourceIdentifier);\n\t\t\t}\n\t\t\tif (expand) {\n\t\t\t\tawait this._resolveResource(projectKey, reference.obj, expand);\n\t\t\t}\n\t\t} else {\n\t\t\tif (expand) {\n\t\t\t\tawait this._resolveResource(projectKey, reference, expand);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async _resolveShoppingListLineItemVariant(\n\t\tprojectKey: string,\n\t\tlineItem: ShoppingListLineItem,\n\t) {\n\t\tconst product = (await this.getByResourceIdentifier(projectKey, {\n\t\t\ttypeId: \"product\",\n\t\t\tid: lineItem.productId,\n\t\t})) as Product | undefined;\n\n\t\tif (!product) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst variant = [\n\t\t\tproduct.masterData.current.masterVariant,\n\t\t\t...product.masterData.current.variants,\n\t\t].find((e) => e.id === lineItem.variantId);\n\t\t// @ts-expect-error\n\t\tlineItem.variant = variant;\n\t}\n}\n\nexport type ProjectStorage = {\n\t[index in ResourceType]: StorageMap<string, BaseResource>;\n};\n"],"mappings":"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"}
|