{"version":3,"file":"abstract-DpzFmkNN.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/lib/sortParser.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\t// Consume the closing parenthesis so a following operator (`and`, `or`)\n\t\t\t// is still seen by the caller instead of being silently dropped\n\t\t\tlexer.expect(\")\");\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\t// IN can be a single value or a list of values; the parenthesized list\n\t\t\t// is consumed by the `(` nud\n\t\t\tconst expr = parser.parse({ terminals: [bp - 1] });\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({ terminals: [bp - 1] });\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\t// A predicate we cannot fully consume must not silently match everything\n\tconst remainder = lexer.peek();\n\tif (!remainder.isEof()) {\n\t\tconst { start } = remainder.strpos();\n\t\tthrow new PredicateError(\n\t\t\t`Invalid input '${remainder.match}' (line ${start.line}, column ${start.column})`,\n\t\t);\n\t}\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","export type SortDirection = \"asc\" | \"desc\";\n\nexport type SortClause = {\n\t/** Dot-separated field path, already split. */\n\tpath: string[];\n\tdirection: SortDirection;\n};\n\n/**\n * Parse commercetools `sort` parameters.\n *\n * The syntax is `field` or `field asc` / `field desc`, and the parameter may be\n * repeated for a secondary sort — which the SDK passes as an array. A missing\n * direction means ascending.\n */\nexport const parseSortClauses = (\n\tsort: string | string[] | undefined,\n): SortClause[] => {\n\tif (sort === undefined) {\n\t\treturn [];\n\t}\n\n\tconst clauses = Array.isArray(sort) ? sort : [sort];\n\n\treturn clauses.flatMap((clause) => {\n\t\tconst [field, direction] = clause.trim().split(/\\s+/);\n\t\tif (!field) {\n\t\t\treturn [];\n\t\t}\n\n\t\treturn [\n\t\t\t{\n\t\t\t\tpath: field.split(\".\"),\n\t\t\t\tdirection: direction?.toLowerCase() === \"desc\" ? \"desc\" : \"asc\",\n\t\t\t},\n\t\t];\n\t});\n};\n\nconst resolvePath = (resource: unknown, path: string[]): unknown => {\n\tlet current = resource;\n\n\tfor (const segment of path) {\n\t\tif (current === null || typeof current !== \"object\") {\n\t\t\treturn undefined;\n\t\t}\n\t\tcurrent = (current as Record<string, unknown>)[segment];\n\t}\n\n\treturn current;\n};\n\n/**\n * Compare two field values.\n *\n * Strings use `<` and `>` rather than `localeCompare`, deliberately: the\n * predicate parser compares with the same operators, so a `where id > \"...\"`\n * cursor and a `sort id asc` have to agree on the ordering or paging silently\n * skips resources. It also matches the API for the values that get sorted on in\n * practice — ids, keys and ISO timestamps.\n */\nconst compareValues = (left: unknown, right: unknown): number => {\n\t// A missing value counts as larger than any present one, and the requested\n\t// direction then applies — so it sorts last ascending and first descending,\n\t// the same rule SQL uses. What matters either way is that the order is total\n\t// and deterministic, or a cursor cannot page through it.\n\tif (left === undefined || left === null) {\n\t\treturn right === undefined || right === null ? 0 : 1;\n\t}\n\tif (right === undefined || right === null) {\n\t\treturn -1;\n\t}\n\n\tif (typeof left === \"number\" && typeof right === \"number\") {\n\t\treturn left - right;\n\t}\n\tif (typeof left === \"boolean\" && typeof right === \"boolean\") {\n\t\treturn Number(left) - Number(right);\n\t}\n\n\t// Anything else compares as a string, which covers ISO dates correctly since\n\t// their lexicographic and chronological orders coincide.\n\tconst leftText = String(left);\n\tconst rightText = String(right);\n\tif (leftText < rightText) {\n\t\treturn -1;\n\t}\n\tif (leftText > rightText) {\n\t\treturn 1;\n\t}\n\treturn 0;\n};\n\n/**\n * Sort resources by the given clauses.\n *\n * Returns the input unchanged when there is nothing to sort by. The sort is\n * stable, so resources that compare equal keep their existing order and a\n * secondary clause only breaks ties from the first.\n */\nexport const applySort = <T>(\n\tresources: T[],\n\tsort: string | string[] | undefined,\n): T[] => {\n\tconst clauses = parseSortClauses(sort);\n\tif (clauses.length === 0) {\n\t\treturn resources;\n\t}\n\n\treturn [...resources].sort((left, right) => {\n\t\tfor (const clause of clauses) {\n\t\t\tconst result = compareValues(\n\t\t\t\tresolvePath(left, clause.path),\n\t\t\t\tresolvePath(right, clause.path),\n\t\t\t);\n\t\t\tif (result !== 0) {\n\t\t\t\treturn clause.direction === \"desc\" ? -result : result;\n\t\t\t}\n\t\t}\n\t\treturn 0;\n\t});\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 as ResourceType,\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 as ResourceType,\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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"}