{"version":3,"sources":["../src/index.ts","../src/helpers/create.ts","../src/util/geo.ts","../src/util/coercion.ts","../src/util/params.ts","../src/util/cleanPrefix.ts","../src/util/buildWhereQuery.ts","../src/helpers/delete.ts","../src/helpers/deleteMany.ts","../src/helpers/find.ts","../src/helpers/findOrCreate.ts","../src/helpers/list.ts","../src/helpers/merge.ts","../src/util/object.ts","../src/helpers/update.ts","../src/helpers/updateMany.ts","../src/helpers/count.ts","../src/helpers/node.ts","../src/helpers/rel.ts","../src/helpers/relationships.ts","../src/util/beautify.ts","../src/util/sanitize.ts","../src/logger.ts"],"sourcesContent":["import { URL } from \"url\"\nimport lodash from \"lodash\"\nimport { Graph } from \"redisgraph.js\"\nimport { cypherCreate } from \"./helpers/create.js\"\nimport { cypherDelete } from \"./helpers/delete.js\"\nimport { cypherDeleteMany } from \"./helpers/deleteMany.js\"\nimport { cypherFind } from \"./helpers/find.js\"\nimport { cypherFindOrCreate } from \"./helpers/findOrCreate.js\"\nimport { cypherList } from \"./helpers/list.js\"\nimport { cypherMerge } from \"./helpers/merge.js\"\nimport { cypherUpdate } from \"./helpers/update.js\"\nimport { cypherUpdateMany } from \"./helpers/updateMany.js\"\nimport { cypherCount } from \"./helpers/count.js\"\n\nimport {\n  cypherClearRelation,\n  cypherCreateRelationship,\n  cypherDeleteRelationship,\n  cypherListRelationship,\n} from \"./helpers/relationships.js\"\n\nimport { beautifyCypher } from \"./util/beautify.js\"\nimport { sanitize } from \"./util/sanitize.js\"\n\nimport logger from \"./logger.js\"\n\nexport function ref(node) {\n  const { __typename, id } = node\n  return { __typename, id }\n}\n\nfunction parseConnection(conn: ConnectionOpts) {\n  if (typeof conn === \"string\") {\n    const url = new URL(conn)\n    let auth = null\n    if (!lodash.isEmpty(url.username) && !lodash.isEmpty(url.password)) {\n      auth = {\n        username: url.username,\n        password: url.password,\n      }\n    }\n    return {\n      host: url.hostname,\n      port: url.port,\n      auth,\n    }\n  } else {\n    return conn\n  }\n}\n\ntype Connection = {\n  host: string\n  port: string\n  auth?: {\n    username: string\n    password: string\n  }\n}\n\ntype ConnectionOpts = string | Connection\nexport class Client {\n  connection = null\n\n  find = cypherFind.bind(this)\n  list = cypherList.bind(this)\n  count = cypherCount.bind(this)\n  create = cypherCreate.bind(this)\n  merge = cypherMerge.bind(this)\n  update = cypherUpdate.bind(this)\n  updateMany = cypherUpdateMany.bind(this)\n  findOrCreate = cypherFindOrCreate.bind(this)\n  delete = cypherDelete.bind(this)\n  deleteMany = cypherDeleteMany.bind(this)\n\n  listRelationship = cypherListRelationship.bind(this)\n  createRelationship = cypherCreateRelationship.bind(this)\n  clearRelationship = cypherClearRelation.bind(this)\n  deleteRelationship = cypherDeleteRelationship.bind(this)\n\n  ref = ref\n\n  constructor(conn: ConnectionOpts) {\n    this.connection = parseConnection(conn)\n  }\n\n  async raw(cypher, opts = {}, tries = 0) {\n    const graph = new Graph(\n      \"graph\",\n      this.connection.host,\n      this.connection.port,\n      this.connection.auth\n    )\n\n    const startTime = process.hrtime()\n\n    try {\n      const res = await graph.query(cypher)\n      const time = process.hrtime(startTime)\n      if (logger)\n        logger.debug(\n          \"\\n\" +\n            beautifyCypher(cypher) +\n            \"\\n\" +\n            \"Took [\" +\n            (time[0] * 1000000000 + time[1]) / 1000000 +\n            \"ms]\"\n          // 'CYPHER'\n        )\n\n      return {\n        records: res._results,\n      }\n    } catch (err) {\n      // if (tries < 2) {\n      //   return this.raw(cypher, opts, tries + 1)\n      // }\n\n      const time = process.hrtime(startTime)\n      logger.error(\n        beautifyCypher(cypher) +\n          \"\\n\" +\n          err +\n          \" [\" +\n          (time[0] * 1000000000 + time[1]) / 1000000 +\n          \"ms]\"\n        // 'CYPHER'\n      )\n      return {\n        records: [],\n      }\n    } finally {\n      graph.close()\n    }\n  }\n\n  async exec(query, opts = {}) {\n    const res = await this.raw(query, opts)\n\n    const recordMapper = (rec) => {\n      const res = {}\n\n      rec._header.forEach((varName, i) => {\n        const node = rec._values[i]\n\n        if (node?.constructor.name === \"Node\") {\n          const properties = node?.properties\n          const mapped = { ...properties }\n          if (node.label) mapped.__typename = node.label\n          res[varName] = sanitize(mapped)\n        } else if (node?.constructor.name === \"Array\") {\n          res[varName] = node.map((n) => {\n            const mapped = { ...n.properties }\n            if (n.label) mapped.__typename = n.label\n            return sanitize(mapped)\n          })\n        } else {\n          res[varName] = node\n        }\n      })\n\n      return res\n    }\n\n    return res?.records?.map(recordMapper)\n  }\n\n  async exec1(query, opts) {\n    const res = await this.exec(query, opts)\n    return res && res[0]\n  }\n\n  deleteAll() {\n    const query = \"MATCH (n) DETACH DELETE n\"\n    logger.debug(query, \"CYPHER\")\n    return this.exec(query)\n  }\n}\n\nexport default new Client(\n  process.env.REDIS_URL || {\n    host: process.env.REDIS_HOST,\n    port: process.env.REDIS_PORT,\n    auth: {\n      username: process.env.REDIS_USERNAME,\n      password: process.env.REDIS_PASSWORD,\n    },\n  }\n)\n","import { v4 as uuid } from \"uuid\"\nimport { paramify } from \"../util/params.js\"\nimport cleanPrefix from \"../util/cleanPrefix.js\"\nimport { Node } from \"src/types.js\"\n\nexport async function cypherCreate(\n  label: string,\n  params: Record<string, unknown>,\n  projection = [],\n  opts = {}\n): Promise<Node> {\n  const toParams = {\n    ...params,\n  }\n\n  const paramsCypher = paramify(\n    {\n      id: uuid(),\n      createdAt: new Date().toISOString(),\n      ...toParams,\n    },\n    {\n      ...opts,\n    }\n  )\n\n  let query = \"\"\n\n  if (params.__unique) {\n    query += `OPTIONAL MATCH (unique_node:${label} { __unique: \"${params.__unique}\"}) WITH unique_node WHERE unique_node IS NULL `\n  }\n\n  query += ` \n      CREATE (node:${label} { ${paramsCypher} })\n      RETURN ${\n        projection.length > 0\n          ? projection.reduce(\n              (previous, current, idx, arr) =>\n                previous +\n                `node.${current}${idx === arr.length - 1 ? \"\" : \",\"}`,\n              \"\"\n            )\n          : \"node\"\n      };\n    `\n\n  const res = await this.exec1(query)\n\n  // if (opts.after) await opts.after(node)\n\n  return projection.length > 0 ? cleanPrefix(res, \"node.\") : res?.node\n}\n","export class Geo {\n  lat = null\n  lng = null\n\n  constructor({ lat, lng }) {\n    this.lat = lat\n    this.lng = lng\n  }\n}\n","import { Geo } from './geo.js'\n\nexport function coerce (val) {\n  switch (true) {\n    case val instanceof Geo:\n      return `point({ latitude: ${val.lat}, longitude: ${val.lng} })`\n    case typeof val === 'string':\n      return `\"${val.replace(/\"/g, '\\\\\"')}\"`\n    case val === null:\n    case val === undefined:\n      return 'null'\n    case typeof val === 'object':\n      return Object.keys(val).reduce((acc, key) => {\n        acc[key] = coerce(val[key])\n        return acc\n      }, {})\n    default:\n      return val\n  }\n}\n","import { coerce } from './coercion.js'\n\ntype ParmsBuilderOpts = {\n  except?: any\n  only?: any\n}\n\nexport function paramsBuilder(params, opts: ParmsBuilderOpts = {}) {\n  const { except = null, only = null } = opts\n\n  const res = {}\n\n  // Prune out if requested\n  let fieldKeys = Object.keys(params)\n  if (only) fieldKeys = fieldKeys.filter((k) => only.includes(k))\n  else if (except) fieldKeys = fieldKeys.filter((k) => !except.includes(k))\n\n  for (const key of fieldKeys) {\n    res[key] = params[key]\n  }\n\n  return res\n}\n\ntype ParamsToCypherOpts = {\n  separator?: string\n  join?: string\n  prefix?: string\n}\n\nexport function paramsToCypher(params, opts: ParamsToCypherOpts = {}) {\n  const { separator = ':', join = ' , ', prefix = null } = opts\n\n  function mapper(key) {\n    const field = prefix ? `${prefix}${key}` : key\n    const value = coerce(this[key])\n    return `${field} ${separator} ${value}`\n  }\n\n  return Object.keys(params).map(mapper, params).join(join)\n}\n\n// Converts { id: \"1\", name: \"Ian\" } => `id: 1, name: \"Ian\"`\nexport function paramify(params, opts = {}) {\n  return paramsToCypher(paramsBuilder(params, opts), opts)\n}\n\n// Converts { id: \"1\", name: \"Ian\" } => `id = 1 AND name = \"Ian\"`\nexport function andify(params, opts = {}) {\n  return paramsToCypher(paramsBuilder(params, opts), {\n    separator: '=',\n    join: ' AND ',\n    ...opts,\n  })\n  // return paramsToCypher(params, { separator: '=', join: ' AND ', ...opts })\n}\n\n// Converts { id: \"1\", name: \"Ian\" } => `SET id = 1, SET name = \"Ian\"`\nexport function setify(params, opts = {}) {\n  return paramsToCypher(paramsBuilder(params, opts), {\n    separator: '=',\n    join: ', ',\n    ...opts,\n  })\n  // return paramsToCypher(params, { separator: '=', join: ', ', ...opts })\n}\n","export default (obj, prefix) => {\n  if (Array.isArray(obj) || (typeof obj === 'object' && obj !== null)) {\n    const cleanKeys = (_obj) => {\n      if (typeof _obj === 'object' && _obj !== null) {\n        const newObj = {}\n        Object.keys(_obj).forEach((key) => {\n          const cleanedKey = key\n            .replace(prefix, '')\n            .replace(/\\([a-zA-Z0-9\\s]+\\)/, '')\n          newObj[cleanedKey] = _obj[key]\n        })\n        return newObj\n      } else {\n        return _obj\n      }\n    }\n    if (Array.isArray(obj)) {\n      const result = []\n      for (let i = 0; i < obj.length; i++) {\n        result.push(cleanKeys(obj[i]))\n      }\n      return result\n    } else {\n      return cleanKeys(obj)\n    }\n  } else {\n    return obj\n  }\n}\n","import { coerce } from \"./coercion\"\n\nconst buildWhereQuery = (data = {}, opts = { prefix: \"\" }) => {\n  let result = \"\"\n  return Object.keys(data).reduce((querystring, key, idx, arr) => {\n    if ([\"and\", \"or\", \"not\"].includes(key.toLowerCase())) {\n      result = querystring + (key.toLowerCase() === \"not\" ? \"NOT\" : \"\")\n      if (Array.isArray(data[key])) {\n        result += data[key].reduce((previous, current, idx, _arr) => {\n          return (\n            previous +\n            buildWhereQuery(current, opts) +\n            (idx === _arr.length - 1\n              ? \")\"\n              : key.toLowerCase() === \"AND\"\n              ? \" AND \"\n              : \" OR \")\n          )\n        }, \"(\")\n      } else {\n        result += \"(\" + buildWhereQuery(data[key], opts) + \")\"\n      }\n    } else if (Array.isArray(data[key])) {\n      result = querystring + data[key].join(\" \")\n    } else if (\n      typeof data[key] === \"object\" &&\n      Object.keys(data[key]).length > 0\n    ) {\n      result =\n        querystring + opts.prefix + key + \" \" + buildWhereQuery(data[key], opts)\n    } else {\n      result = querystring + opts.prefix + key + \" = \" + coerce(data[key])\n    }\n    result += idx === arr.length - 1 ? \"\" : \" AND \"\n    return result\n  }, \"\")\n}\n\nexport default buildWhereQuery\n","import buildWhereQuery from \"../util/buildWhereQuery.js\"\n\nexport async function cypherDelete(label, where, projection = []) {\n  const query = []\n  query.push(`MATCH (node:${label})`)\n\n  if (typeof where === \"object\" && Object.keys(where).length > 0) {\n    query.push(`WHERE ${buildWhereQuery(where, { prefix: \"node.\" })}`)\n  }\n\n  query.push(`DETACH DELETE node`)\n  query.push(`RETURN COUNT(node) as count`)\n  query.push(`LIMIT 1`)\n\n  const res = await this.exec1(query.join(\"\\n\"))\n\n  return res?.count\n}\n","import buildWhereQuery from \"../util/buildWhereQuery.js\"\n\nexport async function cypherDeleteMany(label, where, projection = []) {\n  const query = []\n  query.push(`MATCH (node:${label})`)\n\n  if (typeof where === \"object\" && Object.keys(where).length > 0) {\n    query.push(`WHERE ${buildWhereQuery(where, { prefix: \"node.\" })}`)\n  }\n\n  query.push(`DETACH DELETE node`)\n  query.push(`RETURN COUNT(node) as count`)\n\n  const res = await this.exec1(query.join(\"\\n\"))\n\n  return res?.count || 0\n}\n","import { paramify } from '../util/params.js'\nimport cleanPrefix from '../util/cleanPrefix.js'\n\nexport async function cypherFind(label, params, projection = []) {\n  const query = `MATCH (node:${label} { ${paramify(params)} }) \n    RETURN ${\n      projection.length > 0\n        ? projection.reduce(\n            (previous, current, idx, arr) =>\n              previous + `node.${current}${idx === arr.length - 1 ? '' : ','}`,\n            ''\n          )\n        : 'node'\n    };`\n  const res = await this.exec1(query)\n  return projection.length > 0 ? cleanPrefix(res, 'node.') : res?.node\n}\n","import { Node } from 'src/types.js'\n\ntype Params = Record<string, unknown>\ntype CreateOpts = Params | (() => Promise<Params>)\n\nexport async function cypherFindOrCreate(\n  label: string,\n  find: Params,\n  create: CreateOpts = {},\n  opts = {}\n): Promise<Node> {\n  let node = await this.find(label, find)\n  if (!node) {\n    const createOpts = typeof create === 'function' ? await create() : create\n    node = await this.create(label, { ...find, ...createOpts }, opts)\n  }\n\n  return node\n}\n","import buildWhereQuery from '../util/buildWhereQuery.js'\nimport cleanPrefix from '../util/cleanPrefix.js'\n\nexport async function cypherList (label, opts, projection = [], fieldArgs = {}) {\n  const { order , skip, limit, where } = opts || {}\n\n  const cypherQuery = []\n\n  const aggregations = ['sum', 'count', 'max', 'min', 'avg']\n\n  const agg = aggregations.find(agg => !!fieldArgs[agg])\n\n  const aggField = agg ? fieldArgs[agg]?.__arguments.find(a => !!a.of)?.of : null\n\n  const isDistinct = agg ? fieldArgs[agg]?.__arguments.find(a => !!a.distinct)?.distinct?.value : false\n  \n  cypherQuery.push(`MATCH (node:${label})`)\n\n  if (typeof where === 'object' && Object.keys(where).length > 0) {\n    const whereQuery = buildWhereQuery(where, { prefix: 'node.' })\n    cypherQuery.push(`WHERE ${whereQuery}`)\n  }\n\n  const fields = projection.length > 0 ? projection.reduce((previous, current, idx, arr) => previous + `node.${current}${idx === arr.length - 1 ? '' : ','}`, '') : (aggField ? '' : 'node')\n  cypherQuery.push(`RETURN ${fields + (fields !== '' && aggField ? ',' : '') + (aggField ? agg + '(' + (isDistinct ? 'DISTINCT ' : '') + 'node.' + aggField.value + ')' : '')}`)\n\n  // order\n  if (Array.isArray(order) && !aggField) {\n    const orderFields = order.reduce((previous, current, idx, arr) => {\n      return previous + `node.${current.field} ${current.order ?? \"asc\"}${idx === arr.length - 1 ? '' : ','}`\n    }, \"\")\n    cypherQuery.push(`ORDER BY ${orderFields}`)\n  }\n\n  // pagination\n  if (skip && !aggField) cypherQuery.push(`SKIP ${skip}`)\n  if (limit && !aggField) cypherQuery.push(`LIMIT ${limit}`)\n\n  const query = cypherQuery.join(' ') \n\n  const res = await this.exec(query)\n\n  return (projection.length > 0 || aggField ? cleanPrefix(res, 'node.') : res.map(x => x.node))\n}\n","import { v4 as uuid } from \"uuid\"\nimport { paramify, setify } from \"../util/params.js\"\nimport cleanPrefix from \"../util/cleanPrefix.js\"\nimport { Node } from \"src/types.js\"\n\nconst DEFAULT_CREATE_OPTS = {\n  id: true,\n}\n\nconst DEFAULT_UPDATE_OPTS = {\n  id: false,\n}\n\nexport async function cypherMerge(\n  label: string,\n  matchParams: Record<string, unknown>,\n  updateParams: Record<string, unknown>,\n  projection = [],\n  opts = {}\n): Promise<Node> {\n  const matchCypher = paramify(matchParams, opts)\n  const createCypher = setify(\n    {\n      id: uuid(),\n      createdAt: new Date().toISOString(),\n      ...matchParams,\n      ...updateParams,\n    },\n    {\n      ...DEFAULT_CREATE_OPTS,\n      ...opts,\n      prefix: \"node.\",\n    }\n  )\n  const updateCypher = setify(\n    { updatedAt: new Date().toISOString(), ...updateParams },\n    {\n      ...DEFAULT_UPDATE_OPTS,\n      ...opts,\n      prefix: \"node.\",\n    }\n  )\n\n  const res = await this.exec1(\n    ` \n      MERGE (node:${label} { ${matchCypher} })\n      ON CREATE SET ${createCypher}\n      ON MATCH SET ${updateCypher}\n      RETURN ${\n        projection.length > 0\n          ? projection.reduce(\n              (previous, current, idx, arr) =>\n                previous +\n                `node.${current}${idx === arr.length - 1 ? \"\" : \",\"}`,\n              \"\"\n            )\n          : \"node\"\n      }\n      LIMIT 1\n    `\n  )\n\n  // if (opts.after) await opts.after(node)\n\n  return projection.length > 0 ? cleanPrefix(res, \"node.\") : res?.node\n}\n","import _ from 'lodash'\n\n/*!\n * Find the differences between two objects and push to a new object\n * (c) 2019 Chris Ferdinandi & Jascha Brinkmann, MIT License, https://gomakethings.com & https://twitter.com/jaschaio\n * @param  {Object} obj1 The original object\n * @param  {Object} obj2 The object to compare against it\n * @return {Object}      An object of differences between the two\n */\n\nexport const diff = function (obj1, obj2, opts = { ignore: [] }) {\n  const { ignore } = opts\n  const changed = {}\n\n  if (!obj2) return changed\n  if (typeof obj1 !== 'object' || typeof obj2 !== 'object') {\n    throw new Error('diff can only be used on two objects')\n  }\n\n  Object.entries(obj2).forEach(([k, v]) => {\n    if (obj1[k] !== obj2[k] && !ignore.includes(k)) {\n      changed[k] = v\n    }\n  })\n\n  return changed\n}\n\nexport const clean = (obj) => {\n  return _.pickBy(obj, function (value, key) {\n    return !(value === undefined || value === null)\n  })\n}\n","import { diff } from \"../util/object.js\"\nimport { paramify } from \"../util/params.js\"\nimport cleanPrefix from \"../util/cleanPrefix.js\"\nimport { Node } from \"../types.js\"\nimport buildWhereQuery from \"../util/buildWhereQuery.js\"\n\nexport async function cypherUpdate(\n  label: string,\n  where: object,\n  params: Record<string, unknown>,\n  projection = [],\n  opts = {}\n): Promise<Node> {\n  const toParams = diff({}, params, {\n    ignore: [\"id\", \"createdAt\", \"updatedAt\", \"__typename\"],\n  })\n\n  const paramsCypher = paramify(\n    {\n      updatedAt: new Date().toISOString(),\n      ...toParams,\n    },\n    {\n      ...opts,\n      prefix: \"node.\",\n      separator: \"=\",\n    }\n  )\n\n  const query = []\n  query.push(`MATCH (node:${label})`)\n\n  // if (params.__unique) {\n  //   query.push(\n  //     `OPTIONAL MATCH (unique_node:${label} { __unique: \"${params.__unique}\"}) WITH unique_node WHERE unique_node IS NULL `\n  //   )\n  // }\n\n  if (typeof where === \"object\" && Object.keys(where).length > 0) {\n    query.push(`WHERE ${buildWhereQuery(where, { prefix: \"node.\" })}`)\n  }\n\n  query.push(`SET ${paramsCypher}`)\n  query.push(\n    `RETURN ${\n      projection.length > 0\n        ? projection.reduce(\n            (previous, current, idx, arr) =>\n              previous + `node.${current}${idx === arr.length - 1 ? \"\" : \",\"}`,\n            \"\"\n          )\n        : \"node\"\n    }`\n  )\n  query.push(\"LIMIT 1\")\n\n  const res = await this.exec1(query.join(`\\n`))\n\n  if (!res)\n    throw new Error(\n      `${label} not found${\n        params.__unique ? \" or UNIQUE constraint violated\" : \"\"\n      }`\n    )\n\n  return projection.length > 0 ? cleanPrefix(res, \"node.\") : res?.node\n}\n","import { diff } from \"../util/object.js\"\nimport { paramify } from \"../util/params.js\"\nimport cleanPrefix from \"../util/cleanPrefix.js\"\nimport buildWhereQuery from \"../util/buildWhereQuery.js\"\nimport { Node } from \"src/types.js\"\n\nexport async function cypherUpdateMany(\n  label: string,\n  where: object,\n  params: Record<string, unknown>,\n  projection = [],\n  opts = {}\n): Promise<Node[]> {\n  const toParams = diff({}, params, {\n    ignore: [\"id\", \"createdAt\", \"updatedAt\", \"__typename\"],\n  })\n\n  const paramsCypher = paramify(\n    { updatedAt: new Date().toISOString(), ...toParams },\n    {\n      ...opts,\n      prefix: \"node.\",\n      separator: \"=\",\n    }\n  )\n\n  const query = []\n  query.push(`MATCH (node:${label})`)\n\n  if (typeof where === \"object\" && Object.keys(where).length > 0) {\n    query.push(`WHERE ${buildWhereQuery(where, { prefix: \"node.\" })}`)\n  }\n\n  query.push(`SET ${paramsCypher}`)\n  query.push(\n    `RETURN ${\n      projection.length > 0\n        ? projection.reduce(\n            (previous, current, idx, arr) =>\n              previous + `node.${current}${idx === arr.length - 1 ? \"\" : \",\"}`,\n            \"\"\n          )\n        : \"node\"\n    }`\n  )\n\n  const res = await this.exec(query.join(`\\n`))\n\n  return projection.length > 0\n    ? cleanPrefix(res, \"node.\")\n    : res.map((x) => x.node)\n}\n","import buildWhereQuery from '../util/buildWhereQuery.js'\n\nexport async function cypherCount (label, opts) {\n  const { where } = opts || {}\n\n  const cypherQuery = []\n\n  cypherQuery.push(`MATCH (node:${label})`)\n\n  if (where) {\n    cypherQuery.push(`WHERE ${buildWhereQuery(where, { prefix: 'node.' })}`)\n  }\n\n  // @todo support multiple returns\n  cypherQuery.push('RETURN COUNT(node) as count')\n\n  return this.exec1(cypherQuery.join('\\n')).then(res => res?.count || 0)\n}\n","import { paramify } from '../util/params.js'\n\nfunction normalizeNode (node) {\n  if (typeof node === 'string') {\n    return {\n      __typename: node\n    }\n  } else {\n    return node\n  }\n}\n\nexport function cypherNode (name, node) {\n  const _cypher = []\n\n  const { __typename, ...params } = normalizeNode(node)\n\n  _cypher.push(name)\n  if (__typename) _cypher.push(`:${__typename}`)\n  if (params) _cypher.push(` { ${paramify(params)}} `)\n\n  return `(${_cypher.join('')})`\n}\n","import { paramify } from \"../util/params.js\"\n\nfunction normalizeRel(rel) {\n  if (typeof rel === \"string\") {\n    return {\n      __typename: rel,\n    }\n  } else {\n    return rel\n  }\n}\n\nexport function cypherRel(name, rel) {\n  const { __typename, __direction, ...values } = normalizeRel(rel)\n  const inner = [`${name}:${__typename}`]\n  if (values) inner.push(`{ ${paramify(values)} }`)\n\n  switch (__direction) {\n    case \"IN\":\n      return `<-[${inner.join(\" \")}]-`\n    case \"NONE\":\n      return `-[${inner.join(\" \")}]-`\n    case \"OUT\":\n    default:\n      return `-[${inner.join(\" \")}]->`\n  }\n}\n","import { cypherNode } from \"./node.js\"\nimport { cypherRel } from \"./rel.js\"\nimport buildWhereQuery from \"../util/buildWhereQuery.js\"\n\nexport async function cypherListRelationship(from, rel, to, opts) {\n  const fromCypher = cypherNode(\"from\", from)\n  const relCypher = cypherRel(\"rel\", rel)\n  const toCypher = cypherNode(\"to\", to)\n\n  const {\n    singular,\n    order,\n    orderRaw,\n    skip = 0,\n    limit = null,\n    where,\n  } = opts || {}\n\n  const cypherQuery = []\n  cypherQuery.push(`MATCH ${fromCypher}${relCypher}${toCypher}`)\n\n  if (typeof where === \"object\" && Object.keys(where).length > 0) {\n    const whereQuery = buildWhereQuery(where, { prefix: \"to.\" })\n    cypherQuery.push(`WHERE ${whereQuery}`)\n  }\n\n  cypherQuery.push(`RETURN to`)\n  if (skip) cypherQuery.push(`SKIP ${skip}`)\n\n  const orderBy = orderRaw || `to.${order || \"id\"}`\n  cypherQuery.push(`ORDER BY ${orderBy}`)\n\n  if (singular) {\n    cypherQuery.push(`LIMIT 1`)\n  } else {\n    if (limit) {\n      cypherQuery.push(`LIMIT ${limit}`)\n    }\n  }\n\n  if (singular) {\n    return this.exec1(cypherQuery.join(\"\\n\")).then((r) => r?.to)\n  } else {\n    return this.exec(cypherQuery.join(\"\\n\")).then((res) =>\n      res.map((r) => r?.to)\n    )\n  }\n}\n\nexport async function cypherClearRelation(from, rel) {\n  const fromCypher = cypherNode(\"from\", from)\n  const relCypher = cypherRel(\"rel\", rel)\n\n  return this.exec(`\n  MATCH ${fromCypher}\n  OPTIONAL MATCH (from)${relCypher}()\n  DELETE rel\n  RETURN from;\n`)\n}\n\nexport async function cypherCreateRelationship(from, rel, to, opts) {\n  const { singular } = opts || {}\n\n  const fromCypher = cypherNode(\"from\", from)\n  const toCypher = cypherNode(\"to\", to)\n  const relCypher = cypherRel(\"rel\", rel)\n\n  if (singular) {\n    await this.clearRelationship(from, rel)\n  }\n\n  return this.exec1(`\n    MATCH ${fromCypher}, ${toCypher}\n    MERGE (from)${relCypher}(to)\n    RETURN from, rel, to;\n  `)\n}\n\nexport async function cypherDeleteRelationship(\n  from,\n  rel,\n  to\n  // opts?: CypherDeleteAssociationOpts\n) {\n  const fromCypher = cypherNode(\"from\", from)\n  const toCypher = cypherNode(\"to\", to)\n  const relCypher = cypherRel(\"rel\", rel)\n\n  return this.exec1(`\n    MATCH ${fromCypher}, ${toCypher}\n    MATCH (from)${relCypher}(to)\n    DELETE rel\n    RETURN from, rel, to;\n  `)\n}\n","export function beautifyCypher(query) {\n  return query\n    .split('\\n')\n    .map((s) => s.trim())\n    .join('\\n')\n}\n","export function sanitize (maybeObject) {\n  switch (true) {\n    case maybeObject === undefined:\n      return null\n    // case isInt(maybeObject):\n    //   return parseInt(maybeObject.toString())\n    case typeof maybeObject === 'object':\n      if (maybeObject.latitude && maybeObject.latitude) {\n        return {\n          lat: maybeObject.latitude,\n          lng: maybeObject.longitude\n        }\n      }\n      return Object.keys(maybeObject).reduce((acc, key) => {\n        acc[key] = sanitize(maybeObject[key])\n        return acc\n      }, {})\n    default:\n      return maybeObject\n  }\n}\n","import Logger from '@ptkdev/logger'\nconst logger = new Logger({\n  debug: !!process.env.REL_DEBUG,\n})\n\nexport default logger\n"],"mappings":"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","names":[]}