@instantdb/core 0.22.96-experimental.drewh-ts-target.20761590091.1 → 0.22.96-experimental.surgical.20765817844.1

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.
Files changed (126) hide show
  1. package/dist/commonjs/Connection.js +51 -50
  2. package/dist/commonjs/Connection.js.map +1 -1
  3. package/dist/commonjs/InMemoryStorage.js +32 -13
  4. package/dist/commonjs/InMemoryStorage.js.map +1 -1
  5. package/dist/commonjs/IndexedDBStorage.js +217 -193
  6. package/dist/commonjs/IndexedDBStorage.js.map +1 -1
  7. package/dist/commonjs/InstantError.js +0 -1
  8. package/dist/commonjs/InstantError.js.map +1 -1
  9. package/dist/commonjs/Reactor.js +610 -566
  10. package/dist/commonjs/Reactor.js.map +1 -1
  11. package/dist/commonjs/StorageAPI.js +70 -51
  12. package/dist/commonjs/StorageAPI.js.map +1 -1
  13. package/dist/commonjs/SyncTable.js +81 -68
  14. package/dist/commonjs/SyncTable.js.map +1 -1
  15. package/dist/commonjs/WindowNetworkListener.js +13 -2
  16. package/dist/commonjs/WindowNetworkListener.js.map +1 -1
  17. package/dist/commonjs/__types__/fieldsTypeTest.js +16 -8
  18. package/dist/commonjs/__types__/fieldsTypeTest.js.map +1 -1
  19. package/dist/commonjs/__types__/useDatesTypeTest.js +6 -3
  20. package/dist/commonjs/__types__/useDatesTypeTest.js.map +1 -1
  21. package/dist/commonjs/authAPI.js +79 -62
  22. package/dist/commonjs/authAPI.js.map +1 -1
  23. package/dist/commonjs/createRouteHandler.js +15 -5
  24. package/dist/commonjs/createRouteHandler.js.map +1 -1
  25. package/dist/commonjs/datalog.js +1 -1
  26. package/dist/commonjs/datalog.js.map +1 -1
  27. package/dist/commonjs/devtool.js +8 -26
  28. package/dist/commonjs/devtool.js.map +1 -1
  29. package/dist/commonjs/framework.d.ts.map +1 -1
  30. package/dist/commonjs/framework.js +152 -142
  31. package/dist/commonjs/framework.js.map +1 -1
  32. package/dist/commonjs/index.js +190 -204
  33. package/dist/commonjs/index.js.map +1 -1
  34. package/dist/commonjs/instaml.js +30 -44
  35. package/dist/commonjs/instaml.js.map +1 -1
  36. package/dist/commonjs/instaql.js +33 -25
  37. package/dist/commonjs/instaql.js.map +1 -1
  38. package/dist/commonjs/parseSchemaFromJSON.js +7 -6
  39. package/dist/commonjs/parseSchemaFromJSON.js.map +1 -1
  40. package/dist/commonjs/presence.js +8 -7
  41. package/dist/commonjs/presence.js.map +1 -1
  42. package/dist/commonjs/queryValidation.js +2 -1
  43. package/dist/commonjs/queryValidation.js.map +1 -1
  44. package/dist/commonjs/schema.js +6 -8
  45. package/dist/commonjs/schema.js.map +1 -1
  46. package/dist/commonjs/schemaTypes.js +3 -22
  47. package/dist/commonjs/schemaTypes.js.map +1 -1
  48. package/dist/commonjs/store.js +38 -29
  49. package/dist/commonjs/store.js.map +1 -1
  50. package/dist/commonjs/transactionValidation.js +2 -1
  51. package/dist/commonjs/transactionValidation.js.map +1 -1
  52. package/dist/commonjs/utils/Deferred.js +0 -3
  53. package/dist/commonjs/utils/Deferred.js.map +1 -1
  54. package/dist/commonjs/utils/PersistedObject.js +233 -216
  55. package/dist/commonjs/utils/PersistedObject.js.map +1 -1
  56. package/dist/commonjs/utils/fetch.js +19 -9
  57. package/dist/commonjs/utils/fetch.js.map +1 -1
  58. package/dist/commonjs/utils/linkIndex.js +4 -2
  59. package/dist/commonjs/utils/linkIndex.js.map +1 -1
  60. package/dist/commonjs/utils/object.js +1 -1
  61. package/dist/commonjs/utils/object.js.map +1 -1
  62. package/dist/esm/Connection.js +51 -50
  63. package/dist/esm/Connection.js.map +1 -1
  64. package/dist/esm/InMemoryStorage.js +32 -13
  65. package/dist/esm/InMemoryStorage.js.map +1 -1
  66. package/dist/esm/IndexedDBStorage.js +217 -193
  67. package/dist/esm/IndexedDBStorage.js.map +1 -1
  68. package/dist/esm/InstantError.js +0 -1
  69. package/dist/esm/InstantError.js.map +1 -1
  70. package/dist/esm/Reactor.js +610 -566
  71. package/dist/esm/Reactor.js.map +1 -1
  72. package/dist/esm/StorageAPI.js +70 -51
  73. package/dist/esm/StorageAPI.js.map +1 -1
  74. package/dist/esm/SyncTable.js +81 -68
  75. package/dist/esm/SyncTable.js.map +1 -1
  76. package/dist/esm/WindowNetworkListener.js +13 -2
  77. package/dist/esm/WindowNetworkListener.js.map +1 -1
  78. package/dist/esm/__types__/fieldsTypeTest.js +16 -8
  79. package/dist/esm/__types__/fieldsTypeTest.js.map +1 -1
  80. package/dist/esm/__types__/useDatesTypeTest.js +6 -3
  81. package/dist/esm/__types__/useDatesTypeTest.js.map +1 -1
  82. package/dist/esm/authAPI.js +79 -62
  83. package/dist/esm/authAPI.js.map +1 -1
  84. package/dist/esm/createRouteHandler.js +15 -5
  85. package/dist/esm/createRouteHandler.js.map +1 -1
  86. package/dist/esm/datalog.js +1 -1
  87. package/dist/esm/datalog.js.map +1 -1
  88. package/dist/esm/devtool.js +8 -26
  89. package/dist/esm/devtool.js.map +1 -1
  90. package/dist/esm/framework.d.ts.map +1 -1
  91. package/dist/esm/framework.js +152 -142
  92. package/dist/esm/framework.js.map +1 -1
  93. package/dist/esm/index.js +190 -204
  94. package/dist/esm/index.js.map +1 -1
  95. package/dist/esm/instaml.js +30 -44
  96. package/dist/esm/instaml.js.map +1 -1
  97. package/dist/esm/instaql.js +33 -25
  98. package/dist/esm/instaql.js.map +1 -1
  99. package/dist/esm/parseSchemaFromJSON.js +7 -6
  100. package/dist/esm/parseSchemaFromJSON.js.map +1 -1
  101. package/dist/esm/presence.js +8 -7
  102. package/dist/esm/presence.js.map +1 -1
  103. package/dist/esm/queryValidation.js +2 -1
  104. package/dist/esm/queryValidation.js.map +1 -1
  105. package/dist/esm/schema.js +6 -8
  106. package/dist/esm/schema.js.map +1 -1
  107. package/dist/esm/schemaTypes.js +3 -22
  108. package/dist/esm/schemaTypes.js.map +1 -1
  109. package/dist/esm/store.js +38 -29
  110. package/dist/esm/store.js.map +1 -1
  111. package/dist/esm/transactionValidation.js +2 -1
  112. package/dist/esm/transactionValidation.js.map +1 -1
  113. package/dist/esm/utils/Deferred.js +0 -3
  114. package/dist/esm/utils/Deferred.js.map +1 -1
  115. package/dist/esm/utils/PersistedObject.js +233 -216
  116. package/dist/esm/utils/PersistedObject.js.map +1 -1
  117. package/dist/esm/utils/fetch.js +19 -9
  118. package/dist/esm/utils/fetch.js.map +1 -1
  119. package/dist/esm/utils/linkIndex.js +4 -2
  120. package/dist/esm/utils/linkIndex.js.map +1 -1
  121. package/dist/esm/utils/object.js +1 -1
  122. package/dist/esm/utils/object.js.map +1 -1
  123. package/dist/standalone/index.js +2367 -2610
  124. package/dist/standalone/index.umd.cjs +3 -3
  125. package/package.json +2 -2
  126. package/src/framework.ts +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"instaql.js","sourceRoot":"","sources":["../../src/instaql.ts"],"names":[],"mappings":"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","sourcesContent":["import { query as datalogQuery } from './datalog.js';\nimport { uuidCompare } from './utils/id.ts';\nimport { stringCompare } from './utils/strings.ts';\nimport * as s from './store.ts';\nimport { InstantDBAttr } from './attrTypes.ts';\nimport { Cursor } from './queryTypes.ts';\n\ntype Pat = [string | any, string, string | any, string | number];\ntype Pats = Array<Pat>;\ntype OrPat = {\n or: {\n patterns: FullPats;\n joinSym: string;\n };\n};\ntype AndPat = {\n and: {\n patterns: FullPats;\n joinSym: string;\n };\n};\ntype FullPat = Pat | OrPat | AndPat;\ntype FullPats = Array<FullPat>;\n\n// Pattern variables\n// -----------------\n\ntype MakeVar = (x: string, level: number) => string;\n\nlet _seed = 0;\n\nfunction wildcard(friendlyName: string) {\n return makeVarImpl(`_${friendlyName}`, _seed++);\n}\n\nfunction makeVarImpl(x: string, level: number): string {\n return `?${x}-${level}`;\n}\n\n// Where\n// -----------------\n\nclass AttrNotFoundError extends Error {\n constructor(message) {\n super(message);\n this.name = 'AttrNotFoundError';\n }\n}\n\nfunction idAttr(attrsStore: s.AttrsStore, ns: string): InstantDBAttr {\n const attr = s.getPrimaryKeyAttr(attrsStore, ns);\n\n if (!attr) {\n throw new AttrNotFoundError(`Could not find id attr for ${ns}`);\n }\n return attr;\n}\n\nfunction defaultWhere(\n makeVar: MakeVar,\n attrsStore: s.AttrsStore,\n etype: string,\n level: number,\n): Pats {\n return [eidWhere(makeVar, attrsStore, etype, level)];\n}\n\nfunction eidWhere(\n makeVar: MakeVar,\n attrsStore: s.AttrsStore,\n etype: string,\n level: number,\n): Pat {\n return [\n makeVar(etype, level),\n idAttr(attrsStore, etype).id,\n makeVar(etype, level),\n makeVar('time', level),\n ];\n}\n\nfunction replaceInAttrPat(attrPat: Pat, needle: string, v: any): Pat {\n return attrPat.map((x) => (x === needle ? v : x)) as Pat;\n}\n\nfunction refAttrPat(\n makeVar: MakeVar,\n attrsStore: s.AttrsStore,\n etype: string,\n level: number,\n label: string,\n): [string, number, Pat, InstantDBAttr, boolean] {\n const fwdAttr = s.getAttrByFwdIdentName(attrsStore, etype, label);\n const revAttr = s.getAttrByReverseIdentName(attrsStore, etype, label);\n const attr = fwdAttr || revAttr;\n\n if (!attr) {\n throw new AttrNotFoundError(`Could not find attr for ${[etype, label]}`);\n }\n\n if (attr['value-type'] !== 'ref') {\n throw new Error(`Attr ${attr.id} is not a ref`);\n }\n\n const [_f, fwdEtype] = attr['forward-identity'];\n const [_r, revEtype] = attr['reverse-identity']!;\n const nextLevel = level + 1;\n const attrPat: Pat = fwdAttr\n ? [\n makeVar(fwdEtype, level),\n attr.id,\n makeVar(revEtype, nextLevel),\n wildcard('time'),\n ]\n : [\n makeVar(fwdEtype, nextLevel),\n attr.id,\n makeVar(revEtype, level),\n wildcard('time'),\n ];\n\n const nextEtype = fwdAttr ? revEtype : fwdEtype;\n\n const isForward = Boolean(fwdAttr);\n\n return [nextEtype, nextLevel, attrPat, attr, isForward];\n}\n\nfunction makeLikeMatcher(caseSensitive: boolean, pattern: string) {\n if (typeof pattern !== 'string') {\n return function likeMatcher(_value) {\n return false;\n };\n }\n\n const escapedPattern = pattern.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const regexPattern = escapedPattern.replace(/%/g, '.*').replace(/_/g, '.');\n\n const regex = new RegExp(\n `^${regexPattern}$`,\n caseSensitive ? undefined : 'i',\n );\n\n return function likeMatcher(value) {\n if (typeof value !== 'string') {\n return false;\n }\n return regex.test(value);\n };\n}\n\nfunction parseValue(attr: InstantDBAttr, v: any) {\n if (\n typeof v !== 'object' ||\n v.hasOwnProperty('$in') ||\n v.hasOwnProperty('in')\n ) {\n return v;\n }\n\n const isDate = attr['checked-data-type'] === 'date';\n\n if (v.hasOwnProperty('$gt')) {\n return {\n $comparator: true,\n $op: isDate\n ? function gtDate(triple) {\n return new Date(triple[2]) > new Date(v.$gt);\n }\n : function gt(triple) {\n return triple[2] > v.$gt;\n },\n };\n }\n if (v.hasOwnProperty('$gte')) {\n return {\n $comparator: true,\n $op: isDate\n ? function gteDate(triple) {\n return new Date(triple[2]) >= new Date(v.$gte);\n }\n : function gte(triple) {\n return triple[2] >= v.$gte;\n },\n };\n }\n\n if (v.hasOwnProperty('$lt')) {\n return {\n $comparator: true,\n $op: isDate\n ? function ltDate(triple) {\n return new Date(triple[2]) < new Date(v.$lt);\n }\n : function lt(triple) {\n return triple[2] < v.$lt;\n },\n };\n }\n if (v.hasOwnProperty('$lte')) {\n return {\n $comparator: true,\n $op: isDate\n ? function lteDate(triple) {\n return new Date(triple[2]) <= new Date(v.$lte);\n }\n : function lte(triple) {\n return triple[2] <= v.$lte;\n },\n };\n }\n\n if (v.hasOwnProperty('$like')) {\n const matcher = makeLikeMatcher(true, v.$like);\n return {\n $comparator: true,\n $op: function like(triple) {\n return matcher(triple[2]);\n },\n };\n }\n\n if (v.hasOwnProperty('$ilike')) {\n const matcher = makeLikeMatcher(false, v.$ilike);\n return {\n $comparator: true,\n $op: function ilike(triple) {\n return matcher(triple[2]);\n },\n };\n }\n\n return v;\n}\n\nfunction valueAttrPat(\n makeVar: MakeVar,\n attrsStore: s.AttrsStore,\n valueEtype: string,\n valueLevel: number,\n valueLabel: string,\n v: any,\n): Pat {\n const fwdAttr = s.getAttrByFwdIdentName(attrsStore, valueEtype, valueLabel);\n const revAttr = s.getAttrByReverseIdentName(\n attrsStore,\n valueEtype,\n valueLabel,\n );\n const attr = fwdAttr || revAttr;\n\n if (!attr) {\n throw new AttrNotFoundError(\n `No attr for etype = ${valueEtype} label = ${valueLabel}`,\n );\n }\n\n if (v?.hasOwnProperty('$isNull')) {\n const idAttr = s.getAttrByFwdIdentName(attrsStore, valueEtype, 'id');\n if (!idAttr) {\n throw new AttrNotFoundError(\n `No attr for etype = ${valueEtype} label = id`,\n );\n }\n\n return [\n makeVar(valueEtype, valueLevel),\n idAttr.id,\n { $isNull: { attrId: attr.id, isNull: v.$isNull, reverse: !fwdAttr } },\n wildcard('time'),\n ];\n }\n\n if (fwdAttr) {\n return [\n makeVar(valueEtype, valueLevel),\n attr.id,\n parseValue(attr, v),\n wildcard('time'),\n ];\n }\n return [v, attr.id, makeVar(valueEtype, valueLevel), wildcard('time')];\n}\n\nfunction refAttrPats(\n makeVar: MakeVar,\n attrsStore: s.AttrsStore,\n etype: string,\n level: number,\n refsPath: string[],\n): [string, number, Pats] {\n const [lastEtype, lastLevel, attrPats] = refsPath.reduce(\n (acc, label) => {\n const [etype, level, attrPats] = acc;\n const [nextEtype, nextLevel, attrPat] = refAttrPat(\n makeVar,\n attrsStore,\n etype,\n level,\n label,\n );\n return [nextEtype, nextLevel, [...attrPats, attrPat]];\n },\n [etype, level, []],\n );\n\n return [lastEtype, lastLevel, attrPats];\n}\n\nfunction whereCondAttrPats(\n makeVar: MakeVar,\n attrsStore: s.AttrsStore,\n etype: string,\n level: number,\n path: string[],\n v: any,\n): Pats {\n const refsPath = path.slice(0, path.length - 1);\n const valueLabel = path[path.length - 1];\n const [lastEtype, lastLevel, refPats] = refAttrPats(\n makeVar,\n attrsStore,\n etype,\n level,\n refsPath,\n );\n const valuePat = valueAttrPat(\n makeVar,\n attrsStore,\n lastEtype,\n lastLevel,\n valueLabel,\n v,\n );\n\n return refPats.concat([valuePat]);\n}\n\nfunction withJoin(where, join) {\n return join ? [join].concat(where) : where;\n}\n\nfunction isOrClauses([k, v]): boolean {\n return k === 'or' && Array.isArray(v);\n}\n\nfunction isAndClauses([k, v]): boolean {\n return k === 'and' && Array.isArray(v);\n}\n\n// Creates a makeVar that will namespace symbols for or clauses\n// to prevent conflicts, except for the base etype\nfunction genMakeVar(baseMakeVar: MakeVar, joinSym: string, orIdx: number) {\n return (x, lvl) => {\n const base = baseMakeVar(x, lvl);\n if (joinSym == base) {\n return base;\n }\n return `${base}-${orIdx}`;\n };\n}\n\nfunction parseWhereClauses(\n makeVar: MakeVar,\n clauseType: 'or' | 'and' /* 'or' | 'and' */,\n attrsStore: s.AttrsStore,\n etype: string,\n level: number,\n whereValue: any,\n): FullPat {\n const joinSym = makeVar(etype, level);\n const patterns: FullPats = whereValue.map((w, i) => {\n const makeNamespacedVar = genMakeVar(makeVar, joinSym, i);\n return parseWhere(makeNamespacedVar, attrsStore, etype, level, w);\n });\n return { [clauseType]: { patterns, joinSym } } as AndPat | OrPat;\n}\n\n// Given a path, returns a list of paths leading up to this path:\n// growPath([1, 2, 3]) -> [[1], [1, 2], [1, 2, 3]]\nfunction growPath<T>(path: T[]) {\n const ret: Array<T[]> = [];\n for (let i = 1; i <= path.length; i++) {\n ret.push(path.slice(0, i));\n }\n return ret;\n}\n\n// Returns array of pattern arrays that should be grouped in OR\n// to capture any intermediate nulls\nfunction whereCondAttrPatsForNullIsTrue(\n makeVar: MakeVar,\n attrsStore: s.AttrsStore,\n etype: string,\n level: number,\n path: string[],\n): Pats[] {\n return growPath(path).map((path) =>\n whereCondAttrPats(makeVar, attrsStore, etype, level, path, {\n $isNull: true,\n }),\n );\n}\n\nfunction parseWhere(\n makeVar: MakeVar,\n attrsStore: s.AttrsStore,\n etype: string,\n level: number,\n where: Record<string, any>,\n): FullPats {\n return Object.entries(where).flatMap(([k, v]) => {\n if (isOrClauses([k, v])) {\n return parseWhereClauses(makeVar, 'or', attrsStore, etype, level, v);\n }\n if (isAndClauses([k, v])) {\n return parseWhereClauses(makeVar, 'and', attrsStore, etype, level, v);\n }\n\n // Temporary hack until we have support for a uuid index on `id`\n if (k === '$entityIdStartsWith') {\n return [];\n }\n\n const path = k.split('.');\n\n // Normalize $ne to $not\n if (v?.hasOwnProperty('$ne')) {\n v = { ...v, $not: v.$ne };\n delete v.$ne;\n }\n\n if (v?.hasOwnProperty('$not')) {\n // `$not` won't pick up entities that are missing the attr, so we\n // add in a `$isNull` to catch those too.\n const notPats = whereCondAttrPats(\n makeVar,\n attrsStore,\n etype,\n level,\n path,\n v,\n );\n const nilPats = whereCondAttrPatsForNullIsTrue(\n makeVar,\n attrsStore,\n etype,\n level,\n path,\n );\n return [\n {\n or: {\n patterns: [notPats, ...nilPats],\n joinSym: makeVar(etype, level),\n },\n },\n ];\n }\n\n if (v?.hasOwnProperty('$isNull') && v.$isNull === true && path.length > 1) {\n // Make sure we're capturing all of the intermediate paths that might be null\n // by checking for null at each step along the path\n return [\n {\n or: {\n patterns: whereCondAttrPatsForNullIsTrue(\n makeVar,\n attrsStore,\n etype,\n level,\n path,\n ),\n joinSym: makeVar(etype, level),\n },\n },\n ];\n }\n\n return whereCondAttrPats(makeVar, attrsStore, etype, level, path, v);\n });\n}\n\nfunction makeWhere(\n attrsStore: s.AttrsStore,\n etype: string,\n level: number,\n where: Record<string, any> | null,\n): FullPats {\n const makeVar = makeVarImpl;\n if (!where) {\n return defaultWhere(makeVar, attrsStore, etype, level);\n }\n const parsedWhere = parseWhere(makeVar, attrsStore, etype, level, where);\n return parsedWhere.concat(defaultWhere(makeVar, attrsStore, etype, level));\n}\n\n// Find\n// -----------------\n\nfunction makeFind(makeVar: MakeVar, etype: string, level: number) {\n return [makeVar(etype, level), makeVar('time', level)];\n}\n\n// extendObjects\n// -----------------\n\nfunction makeJoin(\n makeVar: MakeVar,\n attrsStore: s.AttrsStore,\n etype: string,\n level: number,\n label: string,\n eid: string,\n) {\n const [nextEtype, nextLevel, pat, attr, isForward] = refAttrPat(\n makeVar,\n attrsStore,\n etype,\n level,\n label,\n );\n const actualized = replaceInAttrPat(pat, makeVar(etype, level), eid);\n return [nextEtype, nextLevel, actualized, attr, isForward];\n}\n\nfunction extendObjects(\n makeVar: MakeVar,\n store: s.Store,\n attrsStore: s.AttrsStore,\n { etype, level, form },\n objects,\n) {\n const childQueries = Object.keys(form).filter((c) => c !== '$');\n if (!childQueries.length) {\n return Object.values(objects);\n }\n return Object.entries(objects).map(function extendChildren([eid, parent]) {\n const childResults = childQueries.map(function getChildResult(label) {\n const isSingular = Boolean(\n store.cardinalityInference &&\n attrsStore.linkIndex?.[etype]?.[label]?.isSingular,\n );\n\n try {\n const [nextEtype, nextLevel, join] = makeJoin(\n makeVar,\n attrsStore,\n etype,\n level,\n label,\n eid,\n );\n\n const childrenArray = queryOne(store, attrsStore, {\n etype: nextEtype,\n level: nextLevel,\n form: form[label],\n join,\n });\n\n const childOrChildren = isSingular ? childrenArray[0] : childrenArray;\n\n return { [label]: childOrChildren };\n } catch (e) {\n if (e instanceof AttrNotFoundError) {\n return { [label]: isSingular ? undefined : [] };\n }\n throw e;\n }\n });\n\n return childResults.reduce(function reduceChildren(parent, child) {\n return { ...parent, ...child };\n }, parent);\n });\n}\n\n// resolveObjects\n// -----------------\n\nfunction shouldIgnoreAttr(attrs, id) {\n const attr = attrs[id];\n return attr['value-type'] === 'ref' && attr['forward-identity'][2] !== 'id';\n}\n\n// Compares values where we already know that the two values are distinct\n// and not null.\n// Takes into account the data type.\nfunction compareDisparateValues(a, b, dataType) {\n if (dataType === 'string') {\n return stringCompare(a, b);\n }\n if (a > b) {\n return 1;\n }\n return -1;\n}\n\nexport function compareOrder(id_a: string, v_a, id_b: string, v_b, dataType) {\n if (v_a === v_b || (v_a == null && v_b == null)) {\n return uuidCompare(id_a, id_b);\n }\n\n if (v_b == null) {\n return 1;\n }\n if (v_a == null) {\n return -1;\n }\n\n return compareDisparateValues(v_a, v_b, dataType);\n}\n\nfunction compareOrderTriples(\n [id_a, v_a]: [string, any],\n [id_b, v_b]: [string, any],\n dataType,\n) {\n return compareOrder(id_a, v_a, id_b, v_b, dataType);\n}\n\nfunction comparableDate(x) {\n if (x == null) {\n return x;\n }\n return new Date(x).getTime();\n}\n\nfunction isBefore(startCursor, orderAttr, direction, idVec) {\n const [c_e, _c_a, c_v, c_t] = startCursor;\n const compareVal = direction === 'desc' ? 1 : -1;\n if (orderAttr['forward-identity']?.[2] === 'id') {\n return compareOrderTriples(idVec, [c_e, c_t], null) === compareVal;\n }\n const [e, v] = idVec;\n const dataType = orderAttr['checked-data-type'];\n const v_new = dataType === 'date' ? comparableDate(v) : v;\n const c_v_new = dataType === 'date' ? comparableDate(c_v) : c_v;\n\n return (\n compareOrderTriples([e, v_new], [c_e, c_v_new], dataType) === compareVal\n );\n}\n\nfunction orderAttrFromCursor(attrsStore: s.AttrsStore, cursor) {\n const cursorAttrId = cursor[1];\n return attrsStore.getAttr(cursorAttrId);\n}\n\nfunction orderAttrFromOrder(attrsStore: s.AttrsStore, etype, order) {\n const label = Object.keys(order)[0];\n return s.getAttrByFwdIdentName(attrsStore, etype, label);\n}\n\nfunction getOrderAttr(attrsStore: s.AttrsStore, etype, cursor, order) {\n if (cursor) {\n return orderAttrFromCursor(attrsStore, cursor);\n }\n if (order) {\n return orderAttrFromOrder(attrsStore, etype, order);\n }\n}\n\nfunction objectAttrs(\n attrsStore: s.AttrsStore,\n etype,\n dq,\n): Map<string, InstantDBAttr> | undefined {\n if (!Array.isArray(dq.fields)) {\n return s.getBlobAttrs(attrsStore, etype);\n }\n\n const attrs = new Map();\n\n for (const field of dq.fields) {\n const attr = s.getAttrByFwdIdentName(attrsStore, etype, field);\n const label = attr?.['forward-identity']?.[2];\n if (label && s.isBlob(attr)) {\n attrs.set(label, attr);\n }\n }\n // Ensure we add the id field to avoid empty objects\n if (!attrs.has('id')) {\n const attr = s.getAttrByFwdIdentName(attrsStore, etype, 'id');\n const label = attr?.['forward-identity']?.[2];\n if (label) {\n attrs.set(label, attr);\n }\n }\n\n return attrs;\n}\n\nfunction runDataloadAndReturnObjects(\n store: s.Store,\n attrsStore: s.AttrsStore,\n { etype, pageInfo, dq, form },\n) {\n const order = form?.$?.order;\n const isLeadingQuery = isLeading(form);\n const direction = determineDirection(form);\n\n let idVecs = datalogQuery(store, dq);\n\n const startCursor = pageInfo?.['start-cursor'];\n const orderAttr = getOrderAttr(attrsStore, etype, startCursor, order);\n\n if (orderAttr && orderAttr?.['forward-identity']?.[2] !== 'id') {\n const isDate = orderAttr['checked-data-type'] === 'date';\n const a = orderAttr.id;\n idVecs = idVecs.map(([id]) => {\n // order attr is required to be cardinality one, so there will\n // be at most one value here\n let v = store.eav.get(id)?.get(a)?.values()?.next()?.value?.[2];\n if (isDate) {\n v = comparableDate(v);\n }\n return [id, v];\n });\n }\n\n idVecs.sort(\n direction === 'asc'\n ? function compareIdVecs(a, b) {\n return compareOrderTriples(a, b, orderAttr?.['checked-data-type']);\n }\n : function compareIdVecs(a, b) {\n return compareOrderTriples(b, a, orderAttr?.['checked-data-type']);\n },\n );\n\n let objects = {};\n const attrs = objectAttrs(attrsStore, etype, dq);\n\n for (const idVec of idVecs) {\n const [id] = idVec;\n if (objects[id]) {\n continue;\n }\n if (\n !isLeadingQuery &&\n startCursor &&\n orderAttr &&\n isBefore(startCursor, orderAttr, direction, idVec)\n ) {\n continue;\n }\n\n const obj = s.getAsObject(store, attrs, id);\n if (obj) {\n objects[id] = obj;\n }\n }\n return objects;\n}\n\nfunction determineDirection(form) {\n const orderOpts = form.$?.order;\n if (!orderOpts) {\n return 'asc';\n }\n\n return orderOpts[Object.keys(orderOpts)[0]] || 'asc';\n}\n\n/**\n * A \"leading\" query has no `offset`, `before`, or `after`\n *\n * It is at the 'beginning' of the order\n */\nfunction isLeading(form) {\n const offset = form.$?.offset;\n const before = form.$?.before;\n const after = form.$?.after;\n return !offset && !before && !after;\n}\n\n/**\n * Given a query like:\n *\n * {\n * users: {\n * $: { where: { name: \"Joe\" } },\n * },\n * };\n *\n * `resolveObjects`, turns where clause: `{ name: \"Joe\" }`\n * into a datalog query. We then run the datalog query,\n * and reduce all the triples into objects.\n */\nfunction resolveObjects(\n store: s.Store,\n attrsStore: s.AttrsStore,\n { etype, level, form, join, pageInfo },\n) {\n // Wait for server to tell us where we start if we don't start from the beginning\n if (!isLeading(form) && (!pageInfo || !pageInfo['start-cursor'])) {\n return [];\n }\n\n const where = withJoin(\n makeWhere(attrsStore, etype, level, form.$?.where),\n join,\n );\n const find = makeFind(makeVarImpl, etype, level);\n const fields = form.$?.fields;\n\n const objs = runDataloadAndReturnObjects(store, attrsStore, {\n etype,\n pageInfo,\n form,\n dq: { where, find, fields },\n });\n\n const limit = form.$?.limit || form.$?.first || form.$?.last;\n if (limit != null) {\n if (level > 0) {\n console.warn(\n 'WARNING: Limits in child queries are only run client-side. Data returned from the server will not have a limit.',\n );\n }\n\n const entries = Object.entries(objs);\n if (entries.length <= limit) {\n return objs;\n }\n return Object.fromEntries(entries.slice(0, limit));\n }\n\n return objs;\n}\n\n/**\n * It's possible that we query\n * for an attribute that doesn't exist yet.\n *\n * { users: { $: { where: { nonExistentProperty: \"foo\" } } } }\n *\n * This swallows the missing attr error and returns\n * an empty result instead\n */\nfunction guardedResolveObjects(store: s.Store, attrsStore: s.AttrsStore, opts) {\n try {\n return resolveObjects(store, attrsStore, opts);\n } catch (e) {\n if (e instanceof AttrNotFoundError) {\n return {};\n }\n throw e;\n }\n}\n/**\n * Given a query like:\n *\n * {\n * users: {\n * $: { where: { name: \"Joe\" } },\n * posts: {},\n * },\n * };\n *\n * `guardResolveObjects` will return the relevant `users` objects\n * `extendObjects` will then extend each `user` object with relevant `posts`.\n */\nfunction queryOne(store: s.Store, attrsStore: s.AttrsStore, opts) {\n const objects = guardedResolveObjects(store, attrsStore, opts);\n return extendObjects(makeVarImpl, store, attrsStore, opts, objects);\n}\n\nfunction formatPageInfo(\n pageInfo: Record<\n string,\n {\n 'start-cursor'?: Cursor | null;\n 'end-cursor'?: Cursor | null;\n 'has-next-page?'?: boolean | null;\n 'has-previous-page?'?: boolean | null;\n }\n >,\n) {\n const res = {};\n for (const [k, v] of Object.entries(pageInfo)) {\n res[k] = {\n startCursor: v['start-cursor'],\n endCursor: v['end-cursor'],\n hasNextPage: v['has-next-page?'],\n hasPreviousPage: v['has-previous-page?'],\n };\n }\n return res;\n}\n\nexport default function query(\n {\n store,\n attrsStore,\n pageInfo,\n aggregate,\n }: {\n store: s.Store;\n attrsStore: s.AttrsStore;\n pageInfo?: any;\n aggregate?: any;\n },\n q,\n) {\n const data = Object.keys(q).reduce(function reduceResult(res, k) {\n if (aggregate?.[k] || '$$ruleParams' === k) {\n // Aggregate doesn't return any join rows and has no children,\n // so don't bother querying further\n return res;\n }\n res[k] = queryOne(store, attrsStore, {\n etype: k,\n form: q[k],\n level: 0,\n pageInfo: pageInfo?.[k],\n });\n return res;\n }, {});\n\n const result: { data: any; pageInfo?: any; aggregate?: any } = { data };\n if (pageInfo) {\n result.pageInfo = formatPageInfo(pageInfo);\n }\n\n if (aggregate) {\n result.aggregate = aggregate;\n }\n\n return result;\n}\n"]}
1
+ {"version":3,"file":"instaql.js","sourceRoot":"","sources":["../../src/instaql.ts"],"names":[],"mappings":"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","sourcesContent":["import { query as datalogQuery } from './datalog.js';\nimport { uuidCompare } from './utils/id.ts';\nimport { stringCompare } from './utils/strings.ts';\nimport * as s from './store.ts';\nimport { InstantDBAttr } from './attrTypes.ts';\nimport { Cursor } from './queryTypes.ts';\n\ntype Pat = [string | any, string, string | any, string | number];\ntype Pats = Array<Pat>;\ntype OrPat = {\n or: {\n patterns: FullPats;\n joinSym: string;\n };\n};\ntype AndPat = {\n and: {\n patterns: FullPats;\n joinSym: string;\n };\n};\ntype FullPat = Pat | OrPat | AndPat;\ntype FullPats = Array<FullPat>;\n\n// Pattern variables\n// -----------------\n\ntype MakeVar = (x: string, level: number) => string;\n\nlet _seed = 0;\n\nfunction wildcard(friendlyName: string) {\n return makeVarImpl(`_${friendlyName}`, _seed++);\n}\n\nfunction makeVarImpl(x: string, level: number): string {\n return `?${x}-${level}`;\n}\n\n// Where\n// -----------------\n\nclass AttrNotFoundError extends Error {\n constructor(message) {\n super(message);\n this.name = 'AttrNotFoundError';\n }\n}\n\nfunction idAttr(attrsStore: s.AttrsStore, ns: string): InstantDBAttr {\n const attr = s.getPrimaryKeyAttr(attrsStore, ns);\n\n if (!attr) {\n throw new AttrNotFoundError(`Could not find id attr for ${ns}`);\n }\n return attr;\n}\n\nfunction defaultWhere(\n makeVar: MakeVar,\n attrsStore: s.AttrsStore,\n etype: string,\n level: number,\n): Pats {\n return [eidWhere(makeVar, attrsStore, etype, level)];\n}\n\nfunction eidWhere(\n makeVar: MakeVar,\n attrsStore: s.AttrsStore,\n etype: string,\n level: number,\n): Pat {\n return [\n makeVar(etype, level),\n idAttr(attrsStore, etype).id,\n makeVar(etype, level),\n makeVar('time', level),\n ];\n}\n\nfunction replaceInAttrPat(attrPat: Pat, needle: string, v: any): Pat {\n return attrPat.map((x) => (x === needle ? v : x)) as Pat;\n}\n\nfunction refAttrPat(\n makeVar: MakeVar,\n attrsStore: s.AttrsStore,\n etype: string,\n level: number,\n label: string,\n): [string, number, Pat, InstantDBAttr, boolean] {\n const fwdAttr = s.getAttrByFwdIdentName(attrsStore, etype, label);\n const revAttr = s.getAttrByReverseIdentName(attrsStore, etype, label);\n const attr = fwdAttr || revAttr;\n\n if (!attr) {\n throw new AttrNotFoundError(`Could not find attr for ${[etype, label]}`);\n }\n\n if (attr['value-type'] !== 'ref') {\n throw new Error(`Attr ${attr.id} is not a ref`);\n }\n\n const [_f, fwdEtype] = attr['forward-identity'];\n const [_r, revEtype] = attr['reverse-identity']!;\n const nextLevel = level + 1;\n const attrPat: Pat = fwdAttr\n ? [\n makeVar(fwdEtype, level),\n attr.id,\n makeVar(revEtype, nextLevel),\n wildcard('time'),\n ]\n : [\n makeVar(fwdEtype, nextLevel),\n attr.id,\n makeVar(revEtype, level),\n wildcard('time'),\n ];\n\n const nextEtype = fwdAttr ? revEtype : fwdEtype;\n\n const isForward = Boolean(fwdAttr);\n\n return [nextEtype, nextLevel, attrPat, attr, isForward];\n}\n\nfunction makeLikeMatcher(caseSensitive: boolean, pattern: string) {\n if (typeof pattern !== 'string') {\n return function likeMatcher(_value) {\n return false;\n };\n }\n\n const escapedPattern = pattern.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const regexPattern = escapedPattern.replace(/%/g, '.*').replace(/_/g, '.');\n\n const regex = new RegExp(\n `^${regexPattern}$`,\n caseSensitive ? undefined : 'i',\n );\n\n return function likeMatcher(value) {\n if (typeof value !== 'string') {\n return false;\n }\n return regex.test(value);\n };\n}\n\nfunction parseValue(attr: InstantDBAttr, v: any) {\n if (\n typeof v !== 'object' ||\n v.hasOwnProperty('$in') ||\n v.hasOwnProperty('in')\n ) {\n return v;\n }\n\n const isDate = attr['checked-data-type'] === 'date';\n\n if (v.hasOwnProperty('$gt')) {\n return {\n $comparator: true,\n $op: isDate\n ? function gtDate(triple) {\n return new Date(triple[2]) > new Date(v.$gt);\n }\n : function gt(triple) {\n return triple[2] > v.$gt;\n },\n };\n }\n if (v.hasOwnProperty('$gte')) {\n return {\n $comparator: true,\n $op: isDate\n ? function gteDate(triple) {\n return new Date(triple[2]) >= new Date(v.$gte);\n }\n : function gte(triple) {\n return triple[2] >= v.$gte;\n },\n };\n }\n\n if (v.hasOwnProperty('$lt')) {\n return {\n $comparator: true,\n $op: isDate\n ? function ltDate(triple) {\n return new Date(triple[2]) < new Date(v.$lt);\n }\n : function lt(triple) {\n return triple[2] < v.$lt;\n },\n };\n }\n if (v.hasOwnProperty('$lte')) {\n return {\n $comparator: true,\n $op: isDate\n ? function lteDate(triple) {\n return new Date(triple[2]) <= new Date(v.$lte);\n }\n : function lte(triple) {\n return triple[2] <= v.$lte;\n },\n };\n }\n\n if (v.hasOwnProperty('$like')) {\n const matcher = makeLikeMatcher(true, v.$like);\n return {\n $comparator: true,\n $op: function like(triple) {\n return matcher(triple[2]);\n },\n };\n }\n\n if (v.hasOwnProperty('$ilike')) {\n const matcher = makeLikeMatcher(false, v.$ilike);\n return {\n $comparator: true,\n $op: function ilike(triple) {\n return matcher(triple[2]);\n },\n };\n }\n\n return v;\n}\n\nfunction valueAttrPat(\n makeVar: MakeVar,\n attrsStore: s.AttrsStore,\n valueEtype: string,\n valueLevel: number,\n valueLabel: string,\n v: any,\n): Pat {\n const fwdAttr = s.getAttrByFwdIdentName(attrsStore, valueEtype, valueLabel);\n const revAttr = s.getAttrByReverseIdentName(\n attrsStore,\n valueEtype,\n valueLabel,\n );\n const attr = fwdAttr || revAttr;\n\n if (!attr) {\n throw new AttrNotFoundError(\n `No attr for etype = ${valueEtype} label = ${valueLabel}`,\n );\n }\n\n if (v?.hasOwnProperty('$isNull')) {\n const idAttr = s.getAttrByFwdIdentName(attrsStore, valueEtype, 'id');\n if (!idAttr) {\n throw new AttrNotFoundError(\n `No attr for etype = ${valueEtype} label = id`,\n );\n }\n\n return [\n makeVar(valueEtype, valueLevel),\n idAttr.id,\n { $isNull: { attrId: attr.id, isNull: v.$isNull, reverse: !fwdAttr } },\n wildcard('time'),\n ];\n }\n\n if (fwdAttr) {\n return [\n makeVar(valueEtype, valueLevel),\n attr.id,\n parseValue(attr, v),\n wildcard('time'),\n ];\n }\n return [v, attr.id, makeVar(valueEtype, valueLevel), wildcard('time')];\n}\n\nfunction refAttrPats(\n makeVar: MakeVar,\n attrsStore: s.AttrsStore,\n etype: string,\n level: number,\n refsPath: string[],\n): [string, number, Pats] {\n const [lastEtype, lastLevel, attrPats] = refsPath.reduce(\n (acc, label) => {\n const [etype, level, attrPats] = acc;\n const [nextEtype, nextLevel, attrPat] = refAttrPat(\n makeVar,\n attrsStore,\n etype,\n level,\n label,\n );\n return [nextEtype, nextLevel, [...attrPats, attrPat]];\n },\n [etype, level, []],\n );\n\n return [lastEtype, lastLevel, attrPats];\n}\n\nfunction whereCondAttrPats(\n makeVar: MakeVar,\n attrsStore: s.AttrsStore,\n etype: string,\n level: number,\n path: string[],\n v: any,\n): Pats {\n const refsPath = path.slice(0, path.length - 1);\n const valueLabel = path[path.length - 1];\n const [lastEtype, lastLevel, refPats] = refAttrPats(\n makeVar,\n attrsStore,\n etype,\n level,\n refsPath,\n );\n const valuePat = valueAttrPat(\n makeVar,\n attrsStore,\n lastEtype,\n lastLevel,\n valueLabel,\n v,\n );\n\n return refPats.concat([valuePat]);\n}\n\nfunction withJoin(where, join) {\n return join ? [join].concat(where) : where;\n}\n\nfunction isOrClauses([k, v]): boolean {\n return k === 'or' && Array.isArray(v);\n}\n\nfunction isAndClauses([k, v]): boolean {\n return k === 'and' && Array.isArray(v);\n}\n\n// Creates a makeVar that will namespace symbols for or clauses\n// to prevent conflicts, except for the base etype\nfunction genMakeVar(baseMakeVar: MakeVar, joinSym: string, orIdx: number) {\n return (x, lvl) => {\n const base = baseMakeVar(x, lvl);\n if (joinSym == base) {\n return base;\n }\n return `${base}-${orIdx}`;\n };\n}\n\nfunction parseWhereClauses(\n makeVar: MakeVar,\n clauseType: 'or' | 'and' /* 'or' | 'and' */,\n attrsStore: s.AttrsStore,\n etype: string,\n level: number,\n whereValue: any,\n): FullPat {\n const joinSym = makeVar(etype, level);\n const patterns: FullPats = whereValue.map((w, i) => {\n const makeNamespacedVar = genMakeVar(makeVar, joinSym, i);\n return parseWhere(makeNamespacedVar, attrsStore, etype, level, w);\n });\n return { [clauseType]: { patterns, joinSym } } as AndPat | OrPat;\n}\n\n// Given a path, returns a list of paths leading up to this path:\n// growPath([1, 2, 3]) -> [[1], [1, 2], [1, 2, 3]]\nfunction growPath<T>(path: T[]) {\n const ret: Array<T[]> = [];\n for (let i = 1; i <= path.length; i++) {\n ret.push(path.slice(0, i));\n }\n return ret;\n}\n\n// Returns array of pattern arrays that should be grouped in OR\n// to capture any intermediate nulls\nfunction whereCondAttrPatsForNullIsTrue(\n makeVar: MakeVar,\n attrsStore: s.AttrsStore,\n etype: string,\n level: number,\n path: string[],\n): Pats[] {\n return growPath(path).map((path) =>\n whereCondAttrPats(makeVar, attrsStore, etype, level, path, {\n $isNull: true,\n }),\n );\n}\n\nfunction parseWhere(\n makeVar: MakeVar,\n attrsStore: s.AttrsStore,\n etype: string,\n level: number,\n where: Record<string, any>,\n): FullPats {\n return Object.entries(where).flatMap(([k, v]) => {\n if (isOrClauses([k, v])) {\n return parseWhereClauses(makeVar, 'or', attrsStore, etype, level, v);\n }\n if (isAndClauses([k, v])) {\n return parseWhereClauses(makeVar, 'and', attrsStore, etype, level, v);\n }\n\n // Temporary hack until we have support for a uuid index on `id`\n if (k === '$entityIdStartsWith') {\n return [];\n }\n\n const path = k.split('.');\n\n // Normalize $ne to $not\n if (v?.hasOwnProperty('$ne')) {\n v = { ...v, $not: v.$ne };\n delete v.$ne;\n }\n\n if (v?.hasOwnProperty('$not')) {\n // `$not` won't pick up entities that are missing the attr, so we\n // add in a `$isNull` to catch those too.\n const notPats = whereCondAttrPats(\n makeVar,\n attrsStore,\n etype,\n level,\n path,\n v,\n );\n const nilPats = whereCondAttrPatsForNullIsTrue(\n makeVar,\n attrsStore,\n etype,\n level,\n path,\n );\n return [\n {\n or: {\n patterns: [notPats, ...nilPats],\n joinSym: makeVar(etype, level),\n },\n },\n ];\n }\n\n if (v?.hasOwnProperty('$isNull') && v.$isNull === true && path.length > 1) {\n // Make sure we're capturing all of the intermediate paths that might be null\n // by checking for null at each step along the path\n return [\n {\n or: {\n patterns: whereCondAttrPatsForNullIsTrue(\n makeVar,\n attrsStore,\n etype,\n level,\n path,\n ),\n joinSym: makeVar(etype, level),\n },\n },\n ];\n }\n\n return whereCondAttrPats(makeVar, attrsStore, etype, level, path, v);\n });\n}\n\nfunction makeWhere(\n attrsStore: s.AttrsStore,\n etype: string,\n level: number,\n where: Record<string, any> | null,\n): FullPats {\n const makeVar = makeVarImpl;\n if (!where) {\n return defaultWhere(makeVar, attrsStore, etype, level);\n }\n const parsedWhere = parseWhere(makeVar, attrsStore, etype, level, where);\n return parsedWhere.concat(defaultWhere(makeVar, attrsStore, etype, level));\n}\n\n// Find\n// -----------------\n\nfunction makeFind(makeVar: MakeVar, etype: string, level: number) {\n return [makeVar(etype, level), makeVar('time', level)];\n}\n\n// extendObjects\n// -----------------\n\nfunction makeJoin(\n makeVar: MakeVar,\n attrsStore: s.AttrsStore,\n etype: string,\n level: number,\n label: string,\n eid: string,\n) {\n const [nextEtype, nextLevel, pat, attr, isForward] = refAttrPat(\n makeVar,\n attrsStore,\n etype,\n level,\n label,\n );\n const actualized = replaceInAttrPat(pat, makeVar(etype, level), eid);\n return [nextEtype, nextLevel, actualized, attr, isForward];\n}\n\nfunction extendObjects(\n makeVar: MakeVar,\n store: s.Store,\n attrsStore: s.AttrsStore,\n { etype, level, form },\n objects,\n) {\n const childQueries = Object.keys(form).filter((c) => c !== '$');\n if (!childQueries.length) {\n return Object.values(objects);\n }\n return Object.entries(objects).map(function extendChildren([eid, parent]) {\n const childResults = childQueries.map(function getChildResult(label) {\n const isSingular = Boolean(\n store.cardinalityInference &&\n attrsStore.linkIndex?.[etype]?.[label]?.isSingular,\n );\n\n try {\n const [nextEtype, nextLevel, join] = makeJoin(\n makeVar,\n attrsStore,\n etype,\n level,\n label,\n eid,\n );\n\n const childrenArray = queryOne(store, attrsStore, {\n etype: nextEtype,\n level: nextLevel,\n form: form[label],\n join,\n });\n\n const childOrChildren = isSingular ? childrenArray[0] : childrenArray;\n\n return { [label]: childOrChildren };\n } catch (e) {\n if (e instanceof AttrNotFoundError) {\n return { [label]: isSingular ? undefined : [] };\n }\n throw e;\n }\n });\n\n return childResults.reduce(function reduceChildren(parent, child) {\n return { ...parent, ...child };\n }, parent);\n });\n}\n\n// resolveObjects\n// -----------------\n\nfunction shouldIgnoreAttr(attrs, id) {\n const attr = attrs[id];\n return attr['value-type'] === 'ref' && attr['forward-identity'][2] !== 'id';\n}\n\n// Compares values where we already know that the two values are distinct\n// and not null.\n// Takes into account the data type.\nfunction compareDisparateValues(a, b, dataType) {\n if (dataType === 'string') {\n return stringCompare(a, b);\n }\n if (a > b) {\n return 1;\n }\n return -1;\n}\n\nexport function compareOrder(id_a: string, v_a, id_b: string, v_b, dataType) {\n if (v_a === v_b || (v_a == null && v_b == null)) {\n return uuidCompare(id_a, id_b);\n }\n\n if (v_b == null) {\n return 1;\n }\n if (v_a == null) {\n return -1;\n }\n\n return compareDisparateValues(v_a, v_b, dataType);\n}\n\nfunction compareOrderTriples(\n [id_a, v_a]: [string, any],\n [id_b, v_b]: [string, any],\n dataType,\n) {\n return compareOrder(id_a, v_a, id_b, v_b, dataType);\n}\n\nfunction comparableDate(x) {\n if (x == null) {\n return x;\n }\n return new Date(x).getTime();\n}\n\nfunction isBefore(startCursor, orderAttr, direction, idVec) {\n const [c_e, _c_a, c_v, c_t] = startCursor;\n const compareVal = direction === 'desc' ? 1 : -1;\n if (orderAttr['forward-identity']?.[2] === 'id') {\n return compareOrderTriples(idVec, [c_e, c_t], null) === compareVal;\n }\n const [e, v] = idVec;\n const dataType = orderAttr['checked-data-type'];\n const v_new = dataType === 'date' ? comparableDate(v) : v;\n const c_v_new = dataType === 'date' ? comparableDate(c_v) : c_v;\n\n return (\n compareOrderTriples([e, v_new], [c_e, c_v_new], dataType) === compareVal\n );\n}\n\nfunction orderAttrFromCursor(attrsStore: s.AttrsStore, cursor) {\n const cursorAttrId = cursor[1];\n return attrsStore.getAttr(cursorAttrId);\n}\n\nfunction orderAttrFromOrder(attrsStore: s.AttrsStore, etype, order) {\n const label = Object.keys(order)[0];\n return s.getAttrByFwdIdentName(attrsStore, etype, label);\n}\n\nfunction getOrderAttr(attrsStore: s.AttrsStore, etype, cursor, order) {\n if (cursor) {\n return orderAttrFromCursor(attrsStore, cursor);\n }\n if (order) {\n return orderAttrFromOrder(attrsStore, etype, order);\n }\n}\n\nfunction objectAttrs(\n attrsStore: s.AttrsStore,\n etype,\n dq,\n): Map<string, InstantDBAttr> | undefined {\n if (!Array.isArray(dq.fields)) {\n return s.getBlobAttrs(attrsStore, etype);\n }\n\n const attrs = new Map();\n\n for (const field of dq.fields) {\n const attr = s.getAttrByFwdIdentName(attrsStore, etype, field);\n const label = attr?.['forward-identity']?.[2];\n if (label && s.isBlob(attr)) {\n attrs.set(label, attr);\n }\n }\n // Ensure we add the id field to avoid empty objects\n if (!attrs.has('id')) {\n const attr = s.getAttrByFwdIdentName(attrsStore, etype, 'id');\n const label = attr?.['forward-identity']?.[2];\n if (label) {\n attrs.set(label, attr);\n }\n }\n\n return attrs;\n}\n\nfunction runDataloadAndReturnObjects(\n store: s.Store,\n attrsStore: s.AttrsStore,\n { etype, pageInfo, dq, form },\n) {\n const order = form?.$?.order;\n const isLeadingQuery = isLeading(form);\n const direction = determineDirection(form);\n\n let idVecs = datalogQuery(store, dq);\n\n const startCursor = pageInfo?.['start-cursor'];\n const orderAttr = getOrderAttr(attrsStore, etype, startCursor, order);\n\n if (orderAttr && orderAttr?.['forward-identity']?.[2] !== 'id') {\n const isDate = orderAttr['checked-data-type'] === 'date';\n const a = orderAttr.id;\n idVecs = idVecs.map(([id]) => {\n // order attr is required to be cardinality one, so there will\n // be at most one value here\n let v = store.eav.get(id)?.get(a)?.values()?.next()?.value?.[2];\n if (isDate) {\n v = comparableDate(v);\n }\n return [id, v];\n });\n }\n\n idVecs.sort(\n direction === 'asc'\n ? function compareIdVecs(a, b) {\n return compareOrderTriples(a, b, orderAttr?.['checked-data-type']);\n }\n : function compareIdVecs(a, b) {\n return compareOrderTriples(b, a, orderAttr?.['checked-data-type']);\n },\n );\n\n let objects = {};\n const attrs = objectAttrs(attrsStore, etype, dq);\n\n for (const idVec of idVecs) {\n const [id] = idVec;\n if (objects[id]) {\n continue;\n }\n if (\n !isLeadingQuery &&\n startCursor &&\n orderAttr &&\n isBefore(startCursor, orderAttr, direction, idVec)\n ) {\n continue;\n }\n\n const obj = s.getAsObject(store, attrs, id);\n if (obj) {\n objects[id] = obj;\n }\n }\n return objects;\n}\n\nfunction determineDirection(form) {\n const orderOpts = form.$?.order;\n if (!orderOpts) {\n return 'asc';\n }\n\n return orderOpts[Object.keys(orderOpts)[0]] || 'asc';\n}\n\n/**\n * A \"leading\" query has no `offset`, `before`, or `after`\n *\n * It is at the 'beginning' of the order\n */\nfunction isLeading(form) {\n const offset = form.$?.offset;\n const before = form.$?.before;\n const after = form.$?.after;\n return !offset && !before && !after;\n}\n\n/**\n * Given a query like:\n *\n * {\n * users: {\n * $: { where: { name: \"Joe\" } },\n * },\n * };\n *\n * `resolveObjects`, turns where clause: `{ name: \"Joe\" }`\n * into a datalog query. We then run the datalog query,\n * and reduce all the triples into objects.\n */\nfunction resolveObjects(\n store: s.Store,\n attrsStore: s.AttrsStore,\n { etype, level, form, join, pageInfo },\n) {\n // Wait for server to tell us where we start if we don't start from the beginning\n if (!isLeading(form) && (!pageInfo || !pageInfo['start-cursor'])) {\n return [];\n }\n\n const where = withJoin(\n makeWhere(attrsStore, etype, level, form.$?.where),\n join,\n );\n const find = makeFind(makeVarImpl, etype, level);\n const fields = form.$?.fields;\n\n const objs = runDataloadAndReturnObjects(store, attrsStore, {\n etype,\n pageInfo,\n form,\n dq: { where, find, fields },\n });\n\n const limit = form.$?.limit || form.$?.first || form.$?.last;\n if (limit != null) {\n if (level > 0) {\n console.warn(\n 'WARNING: Limits in child queries are only run client-side. Data returned from the server will not have a limit.',\n );\n }\n\n const entries = Object.entries(objs);\n if (entries.length <= limit) {\n return objs;\n }\n return Object.fromEntries(entries.slice(0, limit));\n }\n\n return objs;\n}\n\n/**\n * It's possible that we query\n * for an attribute that doesn't exist yet.\n *\n * { users: { $: { where: { nonExistentProperty: \"foo\" } } } }\n *\n * This swallows the missing attr error and returns\n * an empty result instead\n */\nfunction guardedResolveObjects(store: s.Store, attrsStore: s.AttrsStore, opts) {\n try {\n return resolveObjects(store, attrsStore, opts);\n } catch (e) {\n if (e instanceof AttrNotFoundError) {\n return {};\n }\n throw e;\n }\n}\n/**\n * Given a query like:\n *\n * {\n * users: {\n * $: { where: { name: \"Joe\" } },\n * posts: {},\n * },\n * };\n *\n * `guardResolveObjects` will return the relevant `users` objects\n * `extendObjects` will then extend each `user` object with relevant `posts`.\n */\nfunction queryOne(store: s.Store, attrsStore: s.AttrsStore, opts) {\n const objects = guardedResolveObjects(store, attrsStore, opts);\n return extendObjects(makeVarImpl, store, attrsStore, opts, objects);\n}\n\nfunction formatPageInfo(\n pageInfo: Record<\n string,\n {\n 'start-cursor'?: Cursor | null;\n 'end-cursor'?: Cursor | null;\n 'has-next-page?'?: boolean | null;\n 'has-previous-page?'?: boolean | null;\n }\n >,\n) {\n const res = {};\n for (const [k, v] of Object.entries(pageInfo)) {\n res[k] = {\n startCursor: v['start-cursor'],\n endCursor: v['end-cursor'],\n hasNextPage: v['has-next-page?'],\n hasPreviousPage: v['has-previous-page?'],\n };\n }\n return res;\n}\n\nexport default function query(\n {\n store,\n attrsStore,\n pageInfo,\n aggregate,\n }: {\n store: s.Store;\n attrsStore: s.AttrsStore;\n pageInfo?: any;\n aggregate?: any;\n },\n q,\n) {\n const data = Object.keys(q).reduce(function reduceResult(res, k) {\n if (aggregate?.[k] || '$$ruleParams' === k) {\n // Aggregate doesn't return any join rows and has no children,\n // so don't bother querying further\n return res;\n }\n res[k] = queryOne(store, attrsStore, {\n etype: k,\n form: q[k],\n level: 0,\n pageInfo: pageInfo?.[k],\n });\n return res;\n }, {});\n\n const result: { data: any; pageInfo?: any; aggregate?: any } = { data };\n if (pageInfo) {\n result.pageInfo = formatPageInfo(pageInfo);\n }\n\n if (aggregate) {\n result.aggregate = aggregate;\n }\n\n return result;\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import { i } from "./schema.js";
2
2
  export const parseSchemaFromJSON = (s) => {
3
+ var _a, _b, _c, _d, _e, _f;
3
4
  // Parse entities
4
5
  const entities = {};
5
6
  for (const [entityName, entityInfo] of Object.entries(s.entities)) {
@@ -33,10 +34,10 @@ export const parseSchemaFromJSON = (s) => {
33
34
  if (!attrDef.required) {
34
35
  attr = attr.optional();
35
36
  }
36
- if (attrDef.config?.indexed) {
37
+ if ((_a = attrDef.config) === null || _a === void 0 ? void 0 : _a.indexed) {
37
38
  attr = attr.indexed();
38
39
  }
39
- if (attrDef.config?.unique) {
40
+ if ((_b = attrDef.config) === null || _b === void 0 ? void 0 : _b.unique) {
40
41
  attr = attr.unique();
41
42
  }
42
43
  attrs[attrName] = attr;
@@ -77,10 +78,10 @@ export const parseSchemaFromJSON = (s) => {
77
78
  if (!attrDef.required) {
78
79
  attr = attr.optional();
79
80
  }
80
- if (attrDef.config?.indexed) {
81
+ if ((_c = attrDef.config) === null || _c === void 0 ? void 0 : _c.indexed) {
81
82
  attr = attr.indexed();
82
83
  }
83
- if (attrDef.config?.unique) {
84
+ if ((_d = attrDef.config) === null || _d === void 0 ? void 0 : _d.unique) {
84
85
  attr = attr.unique();
85
86
  }
86
87
  presenceAttrs[attrName] = attr;
@@ -116,10 +117,10 @@ export const parseSchemaFromJSON = (s) => {
116
117
  if (!attrDef.required) {
117
118
  attr = attr.optional();
118
119
  }
119
- if (attrDef.config?.indexed) {
120
+ if ((_e = attrDef.config) === null || _e === void 0 ? void 0 : _e.indexed) {
120
121
  attr = attr.indexed();
121
122
  }
122
- if (attrDef.config?.unique) {
123
+ if ((_f = attrDef.config) === null || _f === void 0 ? void 0 : _f.unique) {
123
124
  attr = attr.unique();
124
125
  }
125
126
  topicAttrs[attrName] = attr;
@@ -1 +1 @@
1
- {"version":3,"file":"parseSchemaFromJSON.js","sourceRoot":"","sources":["../../src/parseSchemaFromJSON.ts"],"names":[],"mappings":"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","sourcesContent":["import { i } from './schema.ts';\nimport { DataAttrDef, InstantSchemaDef } from './schemaTypes.ts';\n\nexport const parseSchemaFromJSON = (\n s: any,\n): InstantSchemaDef<any, any, any> => {\n // Parse entities\n const entities: Record<string, any> = {};\n\n for (const [entityName, entityInfo] of Object.entries(s.entities)) {\n const entityDef = entityInfo as any;\n const attrs: Record<string, any> = {};\n\n // Parse attributes\n for (const [attrName, attrInfo] of Object.entries(entityDef.attrs)) {\n const attrDef = attrInfo as any;\n let attr: DataAttrDef<any, any, any>;\n\n // Create the appropriate attribute type\n switch (attrDef.valueType) {\n case 'string':\n attr = i.string();\n break;\n case 'number':\n attr = i.number();\n break;\n case 'boolean':\n attr = i.boolean();\n break;\n case 'date':\n attr = i.date();\n break;\n case 'json':\n attr = i.json();\n break;\n default:\n attr = i.json();\n }\n\n // Apply modifiers\n if (!attrDef.required) {\n attr = attr.optional();\n }\n\n if (attrDef.config?.indexed) {\n attr = attr.indexed();\n }\n\n if (attrDef.config?.unique) {\n attr = attr.unique();\n }\n\n attrs[attrName] = attr;\n }\n\n entities[entityName] = i.entity(attrs);\n }\n\n // Parse links\n const links: Record<string, any> = s.links || {};\n\n // Parse rooms\n const rooms: Record<string, any> = {};\n\n if (s.rooms) {\n for (const [roomName, roomInfo] of Object.entries(s.rooms)) {\n const roomDef = roomInfo as any;\n\n // Parse presence\n const presenceAttrs: Record<string, any> = {};\n for (const [attrName, attrInfo] of Object.entries(\n roomDef.presence.attrs,\n )) {\n const attrDef = attrInfo as any;\n let attr: DataAttrDef<any, any, any>;\n\n switch (attrDef.valueType) {\n case 'string':\n attr = i.string();\n break;\n case 'number':\n attr = i.number();\n break;\n case 'boolean':\n attr = i.boolean();\n break;\n case 'date':\n attr = i.date();\n break;\n case 'json':\n attr = i.json();\n break;\n default:\n attr = i.json();\n }\n\n if (!attrDef.required) {\n attr = attr.optional();\n }\n\n if (attrDef.config?.indexed) {\n attr = attr.indexed();\n }\n\n if (attrDef.config?.unique) {\n attr = attr.unique();\n }\n\n presenceAttrs[attrName] = attr;\n }\n\n // Parse topics\n const topics: Record<string, any> = {};\n if (roomDef.topics) {\n for (const [topicName, topicInfo] of Object.entries(roomDef.topics)) {\n const topicDef = topicInfo as any;\n const topicAttrs: Record<string, any> = {};\n\n for (const [attrName, attrInfo] of Object.entries(topicDef.attrs)) {\n const attrDef = attrInfo as any;\n let attr: DataAttrDef<any, any, any>;\n\n switch (attrDef.valueType) {\n case 'string':\n attr = i.string();\n break;\n case 'number':\n attr = i.number();\n break;\n case 'boolean':\n attr = i.boolean();\n break;\n case 'date':\n attr = i.date();\n break;\n case 'json':\n attr = i.json();\n break;\n default:\n attr = i.json();\n }\n\n if (!attrDef.required) {\n attr = attr.optional();\n }\n\n if (attrDef.config?.indexed) {\n attr = attr.indexed();\n }\n\n if (attrDef.config?.unique) {\n attr = attr.unique();\n }\n\n topicAttrs[attrName] = attr;\n }\n\n topics[topicName] = i.entity(topicAttrs);\n }\n }\n\n rooms[roomName] = {\n presence: i.entity(presenceAttrs),\n topics,\n };\n }\n }\n\n const resultingSchema = i.schema({\n entities,\n links,\n rooms,\n });\n\n return resultingSchema;\n};\n"]}
1
+ {"version":3,"file":"parseSchemaFromJSON.js","sourceRoot":"","sources":["../../src/parseSchemaFromJSON.ts"],"names":[],"mappings":"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","sourcesContent":["import { i } from './schema.ts';\nimport { DataAttrDef, InstantSchemaDef } from './schemaTypes.ts';\n\nexport const parseSchemaFromJSON = (\n s: any,\n): InstantSchemaDef<any, any, any> => {\n // Parse entities\n const entities: Record<string, any> = {};\n\n for (const [entityName, entityInfo] of Object.entries(s.entities)) {\n const entityDef = entityInfo as any;\n const attrs: Record<string, any> = {};\n\n // Parse attributes\n for (const [attrName, attrInfo] of Object.entries(entityDef.attrs)) {\n const attrDef = attrInfo as any;\n let attr: DataAttrDef<any, any, any>;\n\n // Create the appropriate attribute type\n switch (attrDef.valueType) {\n case 'string':\n attr = i.string();\n break;\n case 'number':\n attr = i.number();\n break;\n case 'boolean':\n attr = i.boolean();\n break;\n case 'date':\n attr = i.date();\n break;\n case 'json':\n attr = i.json();\n break;\n default:\n attr = i.json();\n }\n\n // Apply modifiers\n if (!attrDef.required) {\n attr = attr.optional();\n }\n\n if (attrDef.config?.indexed) {\n attr = attr.indexed();\n }\n\n if (attrDef.config?.unique) {\n attr = attr.unique();\n }\n\n attrs[attrName] = attr;\n }\n\n entities[entityName] = i.entity(attrs);\n }\n\n // Parse links\n const links: Record<string, any> = s.links || {};\n\n // Parse rooms\n const rooms: Record<string, any> = {};\n\n if (s.rooms) {\n for (const [roomName, roomInfo] of Object.entries(s.rooms)) {\n const roomDef = roomInfo as any;\n\n // Parse presence\n const presenceAttrs: Record<string, any> = {};\n for (const [attrName, attrInfo] of Object.entries(\n roomDef.presence.attrs,\n )) {\n const attrDef = attrInfo as any;\n let attr: DataAttrDef<any, any, any>;\n\n switch (attrDef.valueType) {\n case 'string':\n attr = i.string();\n break;\n case 'number':\n attr = i.number();\n break;\n case 'boolean':\n attr = i.boolean();\n break;\n case 'date':\n attr = i.date();\n break;\n case 'json':\n attr = i.json();\n break;\n default:\n attr = i.json();\n }\n\n if (!attrDef.required) {\n attr = attr.optional();\n }\n\n if (attrDef.config?.indexed) {\n attr = attr.indexed();\n }\n\n if (attrDef.config?.unique) {\n attr = attr.unique();\n }\n\n presenceAttrs[attrName] = attr;\n }\n\n // Parse topics\n const topics: Record<string, any> = {};\n if (roomDef.topics) {\n for (const [topicName, topicInfo] of Object.entries(roomDef.topics)) {\n const topicDef = topicInfo as any;\n const topicAttrs: Record<string, any> = {};\n\n for (const [attrName, attrInfo] of Object.entries(topicDef.attrs)) {\n const attrDef = attrInfo as any;\n let attr: DataAttrDef<any, any, any>;\n\n switch (attrDef.valueType) {\n case 'string':\n attr = i.string();\n break;\n case 'number':\n attr = i.number();\n break;\n case 'boolean':\n attr = i.boolean();\n break;\n case 'date':\n attr = i.date();\n break;\n case 'json':\n attr = i.json();\n break;\n default:\n attr = i.json();\n }\n\n if (!attrDef.required) {\n attr = attr.optional();\n }\n\n if (attrDef.config?.indexed) {\n attr = attr.indexed();\n }\n\n if (attrDef.config?.unique) {\n attr = attr.unique();\n }\n\n topicAttrs[attrName] = attr;\n }\n\n topics[topicName] = i.entity(topicAttrs);\n }\n }\n\n rooms[roomName] = {\n presence: i.entity(presenceAttrs),\n topics,\n };\n }\n }\n\n const resultingSchema = i.schema({\n entities,\n links,\n rooms,\n });\n\n return resultingSchema;\n};\n"]}
@@ -1,20 +1,21 @@
1
1
  import { pick } from './utils/pick.js';
2
2
  import { areObjectsShallowEqual, areObjectKeysEqual } from './utils/object.js';
3
3
  export function buildPresenceSlice(data, opts, userPeerId) {
4
+ var _a, _b;
4
5
  const slice = {
5
6
  peers: {},
6
7
  };
7
8
  const includeUser = opts && 'user' in opts ? opts.user : true;
8
9
  if (includeUser) {
9
- const user = pick(data.user ?? {}, opts?.keys);
10
- slice.user = { ...user, peerId: userPeerId };
10
+ const user = pick((_a = data.user) !== null && _a !== void 0 ? _a : {}, opts === null || opts === void 0 ? void 0 : opts.keys);
11
+ slice.user = Object.assign(Object.assign({}, user), { peerId: userPeerId });
11
12
  }
12
- for (const id of Object.keys(data.peers ?? {})) {
13
- const shouldIncludeAllPeers = opts?.peers === undefined;
14
- const isPeerIncluded = Array.isArray(opts?.peers) && opts?.peers.includes(id);
13
+ for (const id of Object.keys((_b = data.peers) !== null && _b !== void 0 ? _b : {})) {
14
+ const shouldIncludeAllPeers = (opts === null || opts === void 0 ? void 0 : opts.peers) === undefined;
15
+ const isPeerIncluded = Array.isArray(opts === null || opts === void 0 ? void 0 : opts.peers) && (opts === null || opts === void 0 ? void 0 : opts.peers.includes(id));
15
16
  if (shouldIncludeAllPeers || isPeerIncluded) {
16
- const peer = pick(data.peers[id], opts?.keys);
17
- slice.peers[id] = { ...peer, peerId: id };
17
+ const peer = pick(data.peers[id], opts === null || opts === void 0 ? void 0 : opts.keys);
18
+ slice.peers[id] = Object.assign(Object.assign({}, peer), { peerId: id });
18
19
  }
19
20
  }
20
21
  return slice;
@@ -1 +1 @@
1
- {"version":3,"file":"presence.js","sourceRoot":"","sources":["../../src/presence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAiD/E,MAAM,UAAU,kBAAkB,CAIhC,IAGC,EACD,IAAuC,EACvC,UAAkB;IAElB,MAAM,KAAK,GAAuC;QAChD,KAAK,EAAE,EAAE;KACV,CAAC;IAEF,MAAM,WAAW,GAAG,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAE9D,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC/C,KAAK,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAC/C,CAAC;IAED,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/C,MAAM,qBAAqB,GAAG,IAAI,EAAE,KAAK,KAAK,SAAS,CAAC;QACxD,MAAM,cAAc,GAClB,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAEzD,IAAI,qBAAqB,IAAI,cAAc,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAC9C,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B,CAIxC,CAAwC,EACxC,CAAwC;IAExC,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAErC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QAEpC,MAAM,IAAI,GAAG,sBAAsB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAEpD,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;IACzB,CAAC;IAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IAEtD,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,sBAAsB,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QAE9D,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;IACzB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import { pick } from './utils/pick.js';\nimport { areObjectsShallowEqual, areObjectKeysEqual } from './utils/object.js';\n\nexport type RoomSchemaShape = {\n [k: string]: {\n presence?: { [k: string]: any };\n topics?: {\n [k: string]: {\n [k: string]: any;\n };\n };\n };\n};\n\nexport type PresenceOpts<PresenceShape, Keys extends keyof PresenceShape> = {\n user?: boolean;\n peers?: string[];\n keys?: Keys[];\n /**\n * If you haven't joined this room yet, initialPresence lets you set\n * the very first presence state for the user.\n */\n initialPresence?: Partial<PresenceShape>;\n\n /** @deprecated use `initialPresence` */\n initialData?: Partial<PresenceShape>;\n};\n\ntype PresencePeer<PresenceShape, Keys extends keyof PresenceShape> = Pick<\n PresenceShape,\n Keys\n> & {\n peerId: string;\n};\n\nexport type PresenceSlice<PresenceShape, Keys extends keyof PresenceShape> = {\n user?: PresencePeer<PresenceShape, Keys>;\n peers: {\n [peerId: string]: PresencePeer<PresenceShape, Keys>;\n };\n};\n\nexport type PresenceResponse<\n PresenceShape,\n Keys extends keyof PresenceShape,\n> = PresenceSlice<PresenceShape, Keys> & {\n isLoading: boolean;\n error?: string;\n};\n\nexport function buildPresenceSlice<\n PresenceShape,\n Keys extends keyof PresenceShape,\n>(\n data: {\n user?: PresenceShape;\n peers: Record<string, PresenceShape>;\n },\n opts: PresenceOpts<PresenceShape, Keys>,\n userPeerId: string,\n): PresenceSlice<PresenceShape, Keys> {\n const slice: PresenceSlice<PresenceShape, Keys> = {\n peers: {},\n };\n\n const includeUser = opts && 'user' in opts ? opts.user : true;\n\n if (includeUser) {\n const user = pick(data.user ?? {}, opts?.keys);\n slice.user = { ...user, peerId: userPeerId };\n }\n\n for (const id of Object.keys(data.peers ?? {})) {\n const shouldIncludeAllPeers = opts?.peers === undefined;\n const isPeerIncluded =\n Array.isArray(opts?.peers) && opts?.peers.includes(id);\n\n if (shouldIncludeAllPeers || isPeerIncluded) {\n const peer = pick(data.peers[id], opts?.keys);\n slice.peers[id] = { ...peer, peerId: id };\n }\n }\n\n return slice;\n}\n\n/**\n * Compare two presence slices\n * 0. compare isLoading and error\n * 1. shallow compare user\n * 2. compare peers keys\n * 3. shallow compare each peer\n */\nexport function hasPresenceResponseChanged<\n PresenceShape,\n Keys extends keyof PresenceShape,\n>(\n a: PresenceResponse<PresenceShape, Keys>,\n b: PresenceResponse<PresenceShape, Keys>,\n) {\n if (a.isLoading !== b.isLoading) return true;\n if (a.error !== b.error) return true;\n\n if (a.user || b.user) {\n if (!a.user || !b.user) return true;\n\n const same = areObjectsShallowEqual(a.user, b.user);\n\n if (!same) return true;\n }\n\n const sameKeys = areObjectKeysEqual(a.peers, b.peers);\n\n if (!sameKeys) return true;\n\n for (const id of Object.keys(a.peers)) {\n const same = areObjectsShallowEqual(a.peers[id], b.peers[id]);\n\n if (!same) return true;\n }\n\n return false;\n}\n"]}
1
+ {"version":3,"file":"presence.js","sourceRoot":"","sources":["../../src/presence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAiD/E,MAAM,UAAU,kBAAkB,CAIhC,IAGC,EACD,IAAuC,EACvC,UAAkB;;IAElB,MAAM,KAAK,GAAuC;QAChD,KAAK,EAAE,EAAE;KACV,CAAC;IAEF,MAAM,WAAW,GAAG,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAE9D,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAA,IAAI,CAAC,IAAI,mCAAI,EAAE,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,CAAC,CAAC;QAC/C,KAAK,CAAC,IAAI,mCAAQ,IAAI,KAAE,MAAM,EAAE,UAAU,GAAE,CAAC;IAC/C,CAAC;IAED,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,MAAA,IAAI,CAAC,KAAK,mCAAI,EAAE,CAAC,EAAE,CAAC;QAC/C,MAAM,qBAAqB,GAAG,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,MAAK,SAAS,CAAC;QACxD,MAAM,cAAc,GAClB,KAAK,CAAC,OAAO,CAAC,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,CAAC,KAAI,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA,CAAC;QAEzD,IAAI,qBAAqB,IAAI,cAAc,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,CAAC,CAAC;YAC9C,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,mCAAQ,IAAI,KAAE,MAAM,EAAE,EAAE,GAAE,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B,CAIxC,CAAwC,EACxC,CAAwC;IAExC,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAErC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QAEpC,MAAM,IAAI,GAAG,sBAAsB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAEpD,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;IACzB,CAAC;IAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IAEtD,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,sBAAsB,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QAE9D,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;IACzB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import { pick } from './utils/pick.js';\nimport { areObjectsShallowEqual, areObjectKeysEqual } from './utils/object.js';\n\nexport type RoomSchemaShape = {\n [k: string]: {\n presence?: { [k: string]: any };\n topics?: {\n [k: string]: {\n [k: string]: any;\n };\n };\n };\n};\n\nexport type PresenceOpts<PresenceShape, Keys extends keyof PresenceShape> = {\n user?: boolean;\n peers?: string[];\n keys?: Keys[];\n /**\n * If you haven't joined this room yet, initialPresence lets you set\n * the very first presence state for the user.\n */\n initialPresence?: Partial<PresenceShape>;\n\n /** @deprecated use `initialPresence` */\n initialData?: Partial<PresenceShape>;\n};\n\ntype PresencePeer<PresenceShape, Keys extends keyof PresenceShape> = Pick<\n PresenceShape,\n Keys\n> & {\n peerId: string;\n};\n\nexport type PresenceSlice<PresenceShape, Keys extends keyof PresenceShape> = {\n user?: PresencePeer<PresenceShape, Keys>;\n peers: {\n [peerId: string]: PresencePeer<PresenceShape, Keys>;\n };\n};\n\nexport type PresenceResponse<\n PresenceShape,\n Keys extends keyof PresenceShape,\n> = PresenceSlice<PresenceShape, Keys> & {\n isLoading: boolean;\n error?: string;\n};\n\nexport function buildPresenceSlice<\n PresenceShape,\n Keys extends keyof PresenceShape,\n>(\n data: {\n user?: PresenceShape;\n peers: Record<string, PresenceShape>;\n },\n opts: PresenceOpts<PresenceShape, Keys>,\n userPeerId: string,\n): PresenceSlice<PresenceShape, Keys> {\n const slice: PresenceSlice<PresenceShape, Keys> = {\n peers: {},\n };\n\n const includeUser = opts && 'user' in opts ? opts.user : true;\n\n if (includeUser) {\n const user = pick(data.user ?? {}, opts?.keys);\n slice.user = { ...user, peerId: userPeerId };\n }\n\n for (const id of Object.keys(data.peers ?? {})) {\n const shouldIncludeAllPeers = opts?.peers === undefined;\n const isPeerIncluded =\n Array.isArray(opts?.peers) && opts?.peers.includes(id);\n\n if (shouldIncludeAllPeers || isPeerIncluded) {\n const peer = pick(data.peers[id], opts?.keys);\n slice.peers[id] = { ...peer, peerId: id };\n }\n }\n\n return slice;\n}\n\n/**\n * Compare two presence slices\n * 0. compare isLoading and error\n * 1. shallow compare user\n * 2. compare peers keys\n * 3. shallow compare each peer\n */\nexport function hasPresenceResponseChanged<\n PresenceShape,\n Keys extends keyof PresenceShape,\n>(\n a: PresenceResponse<PresenceShape, Keys>,\n b: PresenceResponse<PresenceShape, Keys>,\n) {\n if (a.isLoading !== b.isLoading) return true;\n if (a.error !== b.error) return true;\n\n if (a.user || b.user) {\n if (!a.user || !b.user) return true;\n\n const same = areObjectsShallowEqual(a.user, b.user);\n\n if (!same) return true;\n }\n\n const sameKeys = areObjectKeysEqual(a.peers, b.peers);\n\n if (!sameKeys) return true;\n\n for (const id of Object.keys(a.peers)) {\n const same = areObjectsShallowEqual(a.peers[id], b.peers[id]);\n\n if (!same) return true;\n }\n\n return false;\n}\n"]}
@@ -224,6 +224,7 @@ const validateDollarObject = (dollarObj, entityName, schema, path, depth = 0) =>
224
224
  }
225
225
  };
226
226
  const validateEntityInQuery = (queryPart, entityName, schema, path, depth = 0) => {
227
+ var _a;
227
228
  if (!queryPart || typeof queryPart !== 'object') {
228
229
  throw new QueryValidationError(`Query part for entity '${entityName}' must be an object, but received: ${typeof queryPart}`, path);
229
230
  }
@@ -237,7 +238,7 @@ const validateEntityInQuery = (queryPart, entityName, schema, path, depth = 0) =
237
238
  // Recursively validate nested query
238
239
  const nestedQuery = queryPart[key];
239
240
  if (typeof nestedQuery === 'object' && nestedQuery !== null) {
240
- const linkedEntityName = schema?.entities[entityName].links[key]?.entityName;
241
+ const linkedEntityName = (_a = schema === null || schema === void 0 ? void 0 : schema.entities[entityName].links[key]) === null || _a === void 0 ? void 0 : _a.entityName;
241
242
  if (linkedEntityName) {
242
243
  validateEntityInQuery(nestedQuery, linkedEntityName, schema, `${path}.${key}`, depth + 1);
243
244
  }
@@ -1 +1 @@
1
- {"version":3,"file":"queryValidation.js","sourceRoot":"","sources":["../../src/queryValidation.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,GAEZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,MAAM,CAAC;AAEhD,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7C,YAAY,OAAe,EAAE,IAAa;QACxC,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,YAAY,IAAI,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACrE,KAAK,CAAC,WAAW,CAAC,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED,MAAM,cAAc,GAAG;IACrB,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,WAAW;CACZ,CAAC;AAIF,MAAM,WAAW,GAAG,CAClB,OAAmC,EAChB,EAAE;IACrB,OAAO,OAAO,CAAC,SAAS,IAAI,SAAS,CAAC;AACxC,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAC1B,KAAc,EACd,YAA+B,EAC/B,YAAqB,KAAK,EACjB,EAAE;IACX,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC;IAC3B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAEvD,QAAQ,YAAY,EAAE,CAAC;QACrB,KAAK,QAAQ;YACX,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;QACnC,KAAK,QAAQ;YACX,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACpD,KAAK,SAAS;YACZ,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC;QACpC,KAAK,MAAM;YACT,OAAO,CACL,KAAK,YAAY,IAAI;gBACrB,OAAO,KAAK,KAAK,QAAQ;gBACzB,OAAO,KAAK,KAAK,QAAQ,CAC1B,CAAC;QACJ;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CACvB,EAAU,EACV,OAAgB,EAChB,YAA+B,EAC/B,QAAgB,EAChB,UAAkB,EAClB,OAAmC,EACnC,IAAY,EACZ,EAAE;IACF,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,KAAK,MAAM,CAAC;IAC/C,MAAM,gBAAgB,GAAG,CACvB,EAAU,EACV,YAA+B,EAC/B,OAAgB,EAChB,EAAE;QACF,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,CAAC;YAC3D,MAAM,IAAI,oBAAoB,CAC5B,+BAA+B,EAAE,mBAAmB,QAAQ,gBAAgB,UAAU,eAAe,YAAY,mBAAmB,OAAO,OAAO,EAAE,EACpJ,IAAI,CACL,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;IAEF,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,IAAI,CAAC;QACV,KAAK,KAAK;YACR,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,oBAAoB,CAC5B,aAAa,EAAE,oBAAoB,QAAQ,gBAAgB,UAAU,qCAAqC,OAAO,OAAO,EAAE,EAC1H,IAAI,CACL,CAAC;YACJ,CAAC;YACD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;gBAC3B,gBAAgB,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;YAC3C,CAAC;YACD,MAAM;QACR,KAAK,MAAM,CAAC;QACZ,KAAK,KAAK,CAAC;QACX,KAAK,KAAK,CAAC;QACX,KAAK,KAAK,CAAC;QACX,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM;YACT,gBAAgB,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;YAC5C,MAAM;QACR,KAAK,OAAO,CAAC;QACb,KAAK,QAAQ;YACX,gBAAgB,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YAExC,IAAI,EAAE,KAAK,QAAQ,EAAE,CAAC;gBACpB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;oBACvB,MAAM,IAAI,oBAAoB,CAC5B,aAAa,EAAE,oDAAoD,QAAQ,gBAAgB,UAAU,kBAAkB,EACvH,IAAI,CACL,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,MAAM;QACR,KAAK,SAAS;YACZ,gBAAgB,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YACzC,MAAM;QACR;YACE,MAAM,IAAI,oBAAoB,CAC5B,qBAAqB,EAAE,oBAAoB,QAAQ,gBAAgB,UAAU,GAAG,EAChF,IAAI,CACL,CAAC;IACN,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,wBAAwB,GAAG,CAC/B,KAAc,EACd,QAAgB,EAChB,OAAmC,EACnC,UAAkB,EAClB,IAAY,EACN,EAAE;IACR,MAAM,YAAY,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,KAAK,MAAM,CAAC;IAE/C,MAAM,eAAe,GACnB,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACvE,IAAI,eAAe,EAAE,CAAC;QACpB,yEAAyE;QACzE,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,CAAC,wDAAwD;QAClE,CAAC;QAED,MAAM,SAAS,GAAG,KAAgC,CAAC;QAEnD,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YACtD,gBAAgB,CACd,EAAE,EACF,OAAO,EACP,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,OAAO,EACP,GAAG,IAAI,IAAI,EAAE,EAAE,CAChB,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,CAAC;YACzD,MAAM,IAAI,oBAAoB,CAC5B,gCAAgC,QAAQ,gBAAgB,UAAU,eAAe,YAAY,mBAAmB,OAAO,KAAK,EAAE,EAC9H,IAAI,CACL,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,4BAA4B,GAAG,CACnC,OAAe,EACf,KAAc,EACd,eAAuB,EACvB,MAA0C,EAC1C,IAAY,EACN,EAAE;IACR,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,oBAAoB,CAC5B,8BAA8B,OAAO,mCAAmC,EACxE,IAAI,CACL,CAAC;IACJ,CAAC;IAED,IAAI,iBAAiB,GAAG,eAAe,CAAC;IAExC,6EAA6E;IAC7E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;QAEzD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,oBAAoB,CAC5B,WAAW,iBAAiB,kEAAkE,OAAO,IAAI,EACzG,IAAI,CACL,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YACxD,MAAM,IAAI,oBAAoB,CAC5B,SAAS,QAAQ,+BAA+B,iBAAiB,2BAA2B,OAAO,uBAAuB,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAC1L,IAAI,CACL,CAAC;QACJ,CAAC;QAED,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC;IACtC,CAAC;IAED,+BAA+B;IAC/B,MAAM,aAAa,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IAEvD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,oBAAoB,CAC5B,kBAAkB,iBAAiB,qDAAqD,OAAO,IAAI,EACnG,IAAI,CACL,CAAC;IACJ,CAAC;IAED,6DAA6D;IAC7D,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QAC3B,IAAI,OAAO,KAAK,IAAI,QAAQ,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,oBAAoB,CAC5B,yCAAyC,iBAAiB,qCAAqC,KAAK,EAAE,EACtG,IAAI,CACL,CAAC;QACJ,CAAC;QACD,wBAAwB,CACtB,KAAK,EACL,OAAO,EACP,IAAI,WAAW,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,EACtC,eAAe,EACf,IAAI,CACL,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAEjD,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QAC3D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,oBAAoB,CAC5B,2BAA2B,aAAa,gBAAgB,iBAAiB,qCAAqC,KAAK,EAAE,EACrH,IAAI,CACL,CAAC;QACJ,CAAC;QAED,wBAAwB,CACtB,KAAK,EACL,OAAO,EACP,IAAI,WAAW,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,EACtC,eAAe,EACf,IAAI,CACL,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACtD,MAAM,IAAI,oBAAoB,CAC5B,cAAc,aAAa,+BAA+B,iBAAiB,2BAA2B,OAAO,4BAA4B,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,EAChN,IAAI,CACL,CAAC;IACJ,CAAC;IAED,gDAAgD;IAChD,wBAAwB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;AAC3E,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAC1B,WAAoC,EACpC,UAAkB,EAClB,MAA0C,EAC1C,IAAY,EACN,EAAE;IACR,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QACvD,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;YAClC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;oBAC3B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;wBAClD,mBAAmB,CACjB,MAAiC,EACjC,UAAU,EACV,MAAM,EACN,GAAG,IAAI,IAAI,GAAG,IAAI,MAAM,GAAG,CAC5B,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,wBAAwB,CACtB,KAAK,EACL,IAAI,EACJ,IAAI,WAAW,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,EACtC,UAAU,EACV,GAAG,IAAI,KAAK,CACb,CAAC;YACF,SAAS;QACX,CAAC;QAED,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,4BAA4B,CAC1B,GAAG,EACH,KAAK,EACL,UAAU,EACV,MAAM,EACN,GAAG,IAAI,IAAI,GAAG,EAAE,CACjB,CAAC;YACF,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,CAAC,SAAS;YAAE,SAAS;QAEzB,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAErC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;YACzB,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACpD,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACpD,MAAM,IAAI,oBAAoB,CAC5B,sBAAsB,GAAG,+BAA+B,UAAU,4BAA4B,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,sBAAsB,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAClP,GAAG,IAAI,IAAI,GAAG,EAAE,CACjB,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,wBAAwB,CACtB,KAAK,EACL,GAAG,EACH,OAAO,EACP,UAAU,EACV,GAAG,IAAI,IAAI,GAAG,EAAE,CACjB,CAAC;QACJ,CAAC;aAAM,IAAI,OAAO,EAAE,CAAC;YACnB,0EAA0E;YAC1E,gEAAgE;YAChE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtD,MAAM,IAAI,oBAAoB,CAC5B,2BAA2B,GAAG,gBAAgB,UAAU,qCAAqC,KAAK,EAAE,EACpG,GAAG,IAAI,IAAI,GAAG,EAAE,CACjB,CAAC;YACJ,CAAC;YACD,MAAM,gBAAgB,GAAG,IAAI,WAAW,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YAChE,wBAAwB,CACtB,KAAK,EACL,GAAG,EACH,gBAAgB,EAChB,UAAU,EACV,GAAG,IAAI,IAAI,GAAG,EAAE,CACjB,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAC3B,SAAkC,EAClC,UAAkB,EAClB,MAA8D,EAC9D,IAAa,EACb,QAAgB,CAAC,EACX,EAAE;IACR,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,oBAAoB,CAC5B,4BAA4B,GAAG,wCAAwC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,EAAE,EACjH,IAAI,CACL,CAAC;QACJ,CAAC;IACH,CAAC;IAED,iEAAiE;IACjE,MAAM,gBAAgB,GAAG;QACvB,yCAAyC;QACzC,QAAQ;QACR,QAAQ;QACR,OAAO;QACP,OAAO;QACP,MAAM;KACP,CAAC;IACF,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;QACrC,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,oBAAoB,CAC5B,IAAI,KAAK,kFAAkF,EAC3F,IAAI,CACL,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,SAAS,CAAC,KAAK,IAAI,MAAM,EAAE,CAAC;QAC9B,IAAI,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ,IAAI,SAAS,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACpE,MAAM,IAAI,oBAAoB,CAC5B,+CAA+C,UAAU,oBAAoB,OAAO,SAAS,CAAC,KAAK,EAAE,EACrG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,SAAS,CACnC,CAAC;QACJ,CAAC;QACD,mBAAmB,CACjB,SAAS,CAAC,KAAgC,EAC1C,UAAU,EACV,MAAM,EACN,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,OAAO,CACjC,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAC5B,SAAkC,EAClC,UAAkB,EAClB,MAA6D,EAC7D,IAAY,EACZ,QAAgB,CAAC,EACX,EAAE;IACR,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,IAAI,oBAAoB,CAC5B,0BAA0B,UAAU,sCAAsC,OAAO,SAAS,EAAE,EAC5F,IAAI,CACL,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;YAChB,uBAAuB;YACvB,IAAI,MAAM,IAAI,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1D,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC;gBACtE,MAAM,IAAI,oBAAoB,CAC5B,SAAS,GAAG,+BAA+B,UAAU,uBAAuB,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAC5I,GAAG,IAAI,IAAI,GAAG,EAAE,CACjB,CAAC;YACJ,CAAC;YAED,oCAAoC;YACpC,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;gBAC5D,MAAM,gBAAgB,GACpB,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC;gBACtD,IAAI,gBAAgB,EAAE,CAAC;oBACrB,qBAAqB,CACnB,WAAsC,EACtC,gBAAgB,EAChB,MAAM,EACN,GAAG,IAAI,IAAI,GAAG,EAAE,EAChB,KAAK,GAAG,CAAC,CACV,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,oBAAoB;YACpB,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;gBACxD,MAAM,IAAI,oBAAoB,CAC5B,oDAAoD,UAAU,oBAAoB,OAAO,SAAS,EAAE,EACpG,GAAG,IAAI,IAAI,CACZ,CAAC;YACJ,CAAC;YAED,oBAAoB,CAClB,SAAoC,EACpC,UAAU,EACV,MAAM,EACN,GAAG,IAAI,IAAI,EACX,KAAK,CACN,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,CAAU,EACV,MAA2C,EACrC,EAAE;IACR,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QACxC,MAAM,IAAI,oBAAoB,CAC5B,0CAA0C,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CACnF,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,oBAAoB,CAC5B,0CAA0C,OAAO,CAAC,EAAE,CACrD,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,CAA4B,CAAC;IAE9C,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,oBAAoB,CAC5B,sDAAsD,OAAO,WAAW,EAAE,EAC1E,WAAW,CACZ,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;YACpC,MAAM,IAAI,oBAAoB,CAC5B,sDAAsD,OAAO,WAAW,EAAE,EAC1E,WAAW,CACZ,CAAC;QACJ,CAAC;QAED,IAAI,WAAW,KAAK,cAAc,EAAE,CAAC;YACnC,SAAS;QACX,CAAC;QAED,uCAAuC;QACvC,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBAClC,MAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACvD,MAAM,IAAI,oBAAoB,CAC5B,WAAW,WAAW,mDAAmD,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAC/I,WAAW,CACZ,CAAC;YACJ,CAAC;QACH,CAAC;QAED,qBAAqB,CACnB,QAAQ,CAAC,WAAW,CAA4B,EAChD,WAAW,EACX,MAAM,EACN,WAAW,EACX,CAAC,CACF,CAAC;IACJ,CAAC;AACH,CAAC,CAAC","sourcesContent":["import {\n IContainEntitiesAndLinks,\n DataAttrDef,\n ValueTypes,\n} from './schemaTypes.ts';\nimport { validate as validateUUID } from 'uuid';\n\nexport class QueryValidationError extends Error {\n constructor(message: string, path?: string) {\n const fullMessage = path ? `At path '${path}': ${message}` : message;\n super(fullMessage);\n this.name = 'QueryValidationError';\n }\n}\n\nconst dollarSignKeys = [\n 'where',\n 'order',\n 'limit',\n 'last',\n 'first',\n 'offset',\n 'after',\n 'before',\n 'fields',\n 'aggregate',\n];\n\ntype PossibleAttrTypes = ValueTypes | 'unknown';\n\nconst getAttrType = (\n attrDef: DataAttrDef<any, any, any>,\n): PossibleAttrTypes => {\n return attrDef.valueType || 'unknown';\n};\n\nconst isValidValueForType = (\n value: unknown,\n expectedType: PossibleAttrTypes,\n isAnyType: boolean = false,\n): boolean => {\n if (isAnyType) return true;\n if (value === null || value === undefined) return true;\n\n switch (expectedType) {\n case 'string':\n return typeof value === 'string';\n case 'number':\n return typeof value === 'number' && !isNaN(value);\n case 'boolean':\n return typeof value === 'boolean';\n case 'date':\n return (\n value instanceof Date ||\n typeof value === 'string' ||\n typeof value === 'number'\n );\n default:\n return true;\n }\n};\n\nconst validateOperator = (\n op: string,\n opValue: unknown,\n expectedType: PossibleAttrTypes,\n attrName: string,\n entityName: string,\n attrDef: DataAttrDef<any, any, any>,\n path: string,\n) => {\n const isAnyType = attrDef.valueType === 'json';\n const assertValidValue = (\n op: string,\n expectedType: PossibleAttrTypes,\n opValue: unknown,\n ) => {\n if (!isValidValueForType(opValue, expectedType, isAnyType)) {\n throw new QueryValidationError(\n `Invalid value for operator '${op}' on attribute '${attrName}' in entity '${entityName}'. Expected ${expectedType}, but received: ${typeof opValue}`,\n path,\n );\n }\n };\n\n switch (op) {\n case 'in':\n case '$in':\n if (!Array.isArray(opValue)) {\n throw new QueryValidationError(\n `Operator '${op}' for attribute '${attrName}' in entity '${entityName}' must be an array, but received: ${typeof opValue}`,\n path,\n );\n }\n for (const item of opValue) {\n assertValidValue(op, expectedType, item);\n }\n break;\n case '$not':\n case '$ne':\n case '$gt':\n case '$lt':\n case '$gte':\n case '$lte':\n assertValidValue(op, expectedType, opValue);\n break;\n case '$like':\n case '$ilike':\n assertValidValue(op, 'string', opValue);\n\n if (op === '$ilike') {\n if (!attrDef.isIndexed) {\n throw new QueryValidationError(\n `Operator '${op}' can only be used with indexed attributes, but '${attrName}' in entity '${entityName}' is not indexed`,\n path,\n );\n }\n }\n\n break;\n case '$isNull':\n assertValidValue(op, 'boolean', opValue);\n break;\n default:\n throw new QueryValidationError(\n `Unknown operator '${op}' for attribute '${attrName}' in entity '${entityName}'`,\n path,\n );\n }\n};\n\nconst validateWhereClauseValue = (\n value: unknown,\n attrName: string,\n attrDef: DataAttrDef<any, any, any>,\n entityName: string,\n path: string,\n): void => {\n const expectedType = getAttrType(attrDef);\n const isAnyType = attrDef.valueType === 'json';\n\n const isComplexObject =\n typeof value === 'object' && value !== null && !Array.isArray(value);\n if (isComplexObject) {\n // For any type, allow complex objects without treating them as operators\n if (isAnyType) {\n return; // Any type accepts any value, including complex objects\n }\n\n const operators = value as Record<string, unknown>;\n\n for (const [op, opValue] of Object.entries(operators)) {\n validateOperator(\n op,\n opValue,\n expectedType,\n attrName,\n entityName,\n attrDef,\n `${path}.${op}`,\n );\n }\n } else {\n if (!isValidValueForType(value, expectedType, isAnyType)) {\n throw new QueryValidationError(\n `Invalid value for attribute '${attrName}' in entity '${entityName}'. Expected ${expectedType}, but received: ${typeof value}`,\n path,\n );\n }\n }\n};\n\nconst validateDotNotationAttribute = (\n dotPath: string,\n value: unknown,\n startEntityName: string,\n schema: IContainEntitiesAndLinks<any, any>,\n path: string,\n): void => {\n const pathParts = dotPath.split('.');\n if (pathParts.length < 2) {\n throw new QueryValidationError(\n `Invalid dot notation path '${dotPath}'. Must contain at least one dot.`,\n path,\n );\n }\n\n let currentEntityName = startEntityName;\n\n // Traverse all path parts except the last one (which should be an attribute)\n for (let i = 0; i < pathParts.length - 1; i++) {\n const linkName = pathParts[i];\n const currentEntity = schema.entities[currentEntityName];\n\n if (!currentEntity) {\n throw new QueryValidationError(\n `Entity '${currentEntityName}' does not exist in schema while traversing dot notation path '${dotPath}'.`,\n path,\n );\n }\n\n const link = currentEntity.links[linkName];\n if (!link) {\n const availableLinks = Object.keys(currentEntity.links);\n throw new QueryValidationError(\n `Link '${linkName}' does not exist on entity '${currentEntityName}' in dot notation path '${dotPath}'. Available links: ${availableLinks.length > 0 ? availableLinks.join(', ') : 'none'}`,\n path,\n );\n }\n\n currentEntityName = link.entityName;\n }\n\n // Validate the final attribute\n const finalAttrName = pathParts[pathParts.length - 1];\n const finalEntity = schema.entities[currentEntityName];\n\n if (!finalEntity) {\n throw new QueryValidationError(\n `Target entity '${currentEntityName}' does not exist in schema for dot notation path '${dotPath}'.`,\n path,\n );\n }\n\n // Handle 'id' field specially - every entity has an id field\n if (finalAttrName === 'id') {\n if (typeof value == 'string' && !validateUUID(value)) {\n throw new QueryValidationError(\n `Invalid value for id field in entity '${currentEntityName}'. Expected a UUID, but received: ${value}`,\n path,\n );\n }\n validateWhereClauseValue(\n value,\n dotPath,\n new DataAttrDef('string', false, true),\n startEntityName,\n path,\n );\n return;\n }\n\n const attrDef = finalEntity.attrs[finalAttrName];\n\n if (Object.keys(finalEntity.links).includes(finalAttrName)) {\n if (typeof value === 'string' && !validateUUID(value)) {\n throw new QueryValidationError(\n `Invalid value for link '${finalAttrName}' in entity '${currentEntityName}'. Expected a UUID, but received: ${value}`,\n path,\n );\n }\n\n validateWhereClauseValue(\n value,\n dotPath,\n new DataAttrDef('string', false, true),\n startEntityName,\n path,\n );\n return;\n }\n\n if (!attrDef) {\n const availableAttrs = Object.keys(finalEntity.attrs);\n throw new QueryValidationError(\n `Attribute '${finalAttrName}' does not exist on entity '${currentEntityName}' in dot notation path '${dotPath}'. Available attributes: ${availableAttrs.length > 0 ? availableAttrs.join(', ') + ', id' : 'id'}`,\n path,\n );\n }\n\n // Validate the value against the attribute type\n validateWhereClauseValue(value, dotPath, attrDef, startEntityName, path);\n};\n\nconst validateWhereClause = (\n whereClause: Record<string, unknown>,\n entityName: string,\n schema: IContainEntitiesAndLinks<any, any>,\n path: string,\n): void => {\n for (const [key, value] of Object.entries(whereClause)) {\n if (key === 'or' || key === 'and') {\n if (Array.isArray(value)) {\n for (const clause of value) {\n if (typeof clause === 'object' && clause !== null) {\n validateWhereClause(\n clause as Record<string, unknown>,\n entityName,\n schema,\n `${path}.${key}[${clause}]`,\n );\n }\n }\n }\n continue;\n }\n\n if (key === 'id') {\n validateWhereClauseValue(\n value,\n 'id',\n new DataAttrDef('string', false, true),\n entityName,\n `${path}.id`,\n );\n continue;\n }\n\n if (key.includes('.')) {\n validateDotNotationAttribute(\n key,\n value,\n entityName,\n schema,\n `${path}.${key}`,\n );\n continue;\n }\n\n const entityDef = schema.entities[entityName];\n if (!entityDef) continue;\n\n const attrDef = entityDef.attrs[key];\n const linkDef = entityDef.links[key];\n\n if (!attrDef && !linkDef) {\n const availableAttrs = Object.keys(entityDef.attrs);\n const availableLinks = Object.keys(entityDef.links);\n throw new QueryValidationError(\n `Attribute or link '${key}' does not exist on entity '${entityName}'. Available attributes: ${availableAttrs.length > 0 ? availableAttrs.join(', ') : 'none'}. Available links: ${availableLinks.length > 0 ? availableLinks.join(', ') : 'none'}`,\n `${path}.${key}`,\n );\n }\n\n if (attrDef) {\n validateWhereClauseValue(\n value,\n key,\n attrDef,\n entityName,\n `${path}.${key}`,\n );\n } else if (linkDef) {\n // For links, we expect the value to be a string (ID of the linked entity)\n // Create a synthetic string attribute definition for validation\n if (typeof value === 'string' && !validateUUID(value)) {\n throw new QueryValidationError(\n `Invalid value for link '${key}' in entity '${entityName}'. Expected a UUID, but received: ${value}`,\n `${path}.${key}`,\n );\n }\n const syntheticAttrDef = new DataAttrDef('string', false, true);\n validateWhereClauseValue(\n value,\n key,\n syntheticAttrDef,\n entityName,\n `${path}.${key}`,\n );\n }\n }\n};\n\nconst validateDollarObject = (\n dollarObj: Record<string, unknown>,\n entityName: string,\n schema?: IContainEntitiesAndLinks<any, any> | null | undefined,\n path?: string,\n depth: number = 0,\n): void => {\n for (const key of Object.keys(dollarObj)) {\n if (!dollarSignKeys.includes(key)) {\n throw new QueryValidationError(\n `Invalid query parameter '${key}' in $ object. Valid parameters are: ${dollarSignKeys.join(', ')}. Found: ${key}`,\n path,\n );\n }\n }\n\n // Validate that pagination parameters are only used at top-level\n const paginationParams = [\n // 'limit', // only supported client side\n 'offset',\n 'before',\n 'after',\n 'first',\n 'last',\n ];\n for (const param of paginationParams) {\n if (dollarObj[param] !== undefined && depth > 0) {\n throw new QueryValidationError(\n `'${param}' can only be used on top-level namespaces. It cannot be used in nested queries.`,\n path,\n );\n }\n }\n\n if (dollarObj.where && schema) {\n if (typeof dollarObj.where !== 'object' || dollarObj.where === null) {\n throw new QueryValidationError(\n `'where' clause must be an object in entity '${entityName}', but received: ${typeof dollarObj.where}`,\n path ? `${path}.where` : undefined,\n );\n }\n validateWhereClause(\n dollarObj.where as Record<string, unknown>,\n entityName,\n schema,\n path ? `${path}.where` : 'where',\n );\n }\n};\n\nconst validateEntityInQuery = (\n queryPart: Record<string, unknown>,\n entityName: string,\n schema: IContainEntitiesAndLinks<any, any> | null | undefined,\n path: string,\n depth: number = 0,\n): void => {\n if (!queryPart || typeof queryPart !== 'object') {\n throw new QueryValidationError(\n `Query part for entity '${entityName}' must be an object, but received: ${typeof queryPart}`,\n path,\n );\n }\n\n for (const key of Object.keys(queryPart)) {\n if (key !== '$') {\n // Validate link exists\n if (schema && !(key in schema.entities[entityName].links)) {\n const availableLinks = Object.keys(schema.entities[entityName].links);\n throw new QueryValidationError(\n `Link '${key}' does not exist on entity '${entityName}'. Available links: ${availableLinks.length > 0 ? availableLinks.join(', ') : 'none'}`,\n `${path}.${key}`,\n );\n }\n\n // Recursively validate nested query\n const nestedQuery = queryPart[key];\n if (typeof nestedQuery === 'object' && nestedQuery !== null) {\n const linkedEntityName =\n schema?.entities[entityName].links[key]?.entityName;\n if (linkedEntityName) {\n validateEntityInQuery(\n nestedQuery as Record<string, unknown>,\n linkedEntityName,\n schema,\n `${path}.${key}`,\n depth + 1,\n );\n }\n }\n } else {\n // Validate $ object\n const dollarObj = queryPart[key];\n if (typeof dollarObj !== 'object' || dollarObj === null) {\n throw new QueryValidationError(\n `Query parameter '$' must be an object in entity '${entityName}', but received: ${typeof dollarObj}`,\n `${path}.$`,\n );\n }\n\n validateDollarObject(\n dollarObj as Record<string, unknown>,\n entityName,\n schema,\n `${path}.$`,\n depth,\n );\n }\n }\n};\n\nexport const validateQuery = (\n q: unknown,\n schema?: IContainEntitiesAndLinks<any, any>,\n): void => {\n if (typeof q !== 'object' || q === null) {\n throw new QueryValidationError(\n `Query must be an object, but received: ${typeof q}${q === null ? ' (null)' : ''}`,\n );\n }\n\n if (Array.isArray(q)) {\n throw new QueryValidationError(\n `Query must be an object, but received: ${typeof q}`,\n );\n }\n\n const queryObj = q as Record<string, unknown>;\n\n for (const topLevelKey of Object.keys(queryObj)) {\n if (Array.isArray(q[topLevelKey])) {\n throw new QueryValidationError(\n `Query keys must be strings, but found key of type: ${typeof topLevelKey}`,\n topLevelKey,\n );\n }\n\n if (typeof topLevelKey !== 'string') {\n throw new QueryValidationError(\n `Query keys must be strings, but found key of type: ${typeof topLevelKey}`,\n topLevelKey,\n );\n }\n\n if (topLevelKey === '$$ruleParams') {\n continue;\n }\n\n // Check if the key is top level entity\n if (schema) {\n if (!schema.entities[topLevelKey]) {\n const availableEntities = Object.keys(schema.entities);\n throw new QueryValidationError(\n `Entity '${topLevelKey}' does not exist in schema. Available entities: ${availableEntities.length > 0 ? availableEntities.join(', ') : 'none'}`,\n topLevelKey,\n );\n }\n }\n\n validateEntityInQuery(\n queryObj[topLevelKey] as Record<string, unknown>,\n topLevelKey,\n schema,\n topLevelKey,\n 0, // Start at depth 0 for top-level entities\n );\n }\n};\n"]}
1
+ {"version":3,"file":"queryValidation.js","sourceRoot":"","sources":["../../src/queryValidation.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n IContainEntitiesAndLinks,\n DataAttrDef,\n ValueTypes,\n} from './schemaTypes.ts';\nimport { validate as validateUUID } from 'uuid';\n\nexport class QueryValidationError extends Error {\n constructor(message: string, path?: string) {\n const fullMessage = path ? `At path '${path}': ${message}` : message;\n super(fullMessage);\n this.name = 'QueryValidationError';\n }\n}\n\nconst dollarSignKeys = [\n 'where',\n 'order',\n 'limit',\n 'last',\n 'first',\n 'offset',\n 'after',\n 'before',\n 'fields',\n 'aggregate',\n];\n\ntype PossibleAttrTypes = ValueTypes | 'unknown';\n\nconst getAttrType = (\n attrDef: DataAttrDef<any, any, any>,\n): PossibleAttrTypes => {\n return attrDef.valueType || 'unknown';\n};\n\nconst isValidValueForType = (\n value: unknown,\n expectedType: PossibleAttrTypes,\n isAnyType: boolean = false,\n): boolean => {\n if (isAnyType) return true;\n if (value === null || value === undefined) return true;\n\n switch (expectedType) {\n case 'string':\n return typeof value === 'string';\n case 'number':\n return typeof value === 'number' && !isNaN(value);\n case 'boolean':\n return typeof value === 'boolean';\n case 'date':\n return (\n value instanceof Date ||\n typeof value === 'string' ||\n typeof value === 'number'\n );\n default:\n return true;\n }\n};\n\nconst validateOperator = (\n op: string,\n opValue: unknown,\n expectedType: PossibleAttrTypes,\n attrName: string,\n entityName: string,\n attrDef: DataAttrDef<any, any, any>,\n path: string,\n) => {\n const isAnyType = attrDef.valueType === 'json';\n const assertValidValue = (\n op: string,\n expectedType: PossibleAttrTypes,\n opValue: unknown,\n ) => {\n if (!isValidValueForType(opValue, expectedType, isAnyType)) {\n throw new QueryValidationError(\n `Invalid value for operator '${op}' on attribute '${attrName}' in entity '${entityName}'. Expected ${expectedType}, but received: ${typeof opValue}`,\n path,\n );\n }\n };\n\n switch (op) {\n case 'in':\n case '$in':\n if (!Array.isArray(opValue)) {\n throw new QueryValidationError(\n `Operator '${op}' for attribute '${attrName}' in entity '${entityName}' must be an array, but received: ${typeof opValue}`,\n path,\n );\n }\n for (const item of opValue) {\n assertValidValue(op, expectedType, item);\n }\n break;\n case '$not':\n case '$ne':\n case '$gt':\n case '$lt':\n case '$gte':\n case '$lte':\n assertValidValue(op, expectedType, opValue);\n break;\n case '$like':\n case '$ilike':\n assertValidValue(op, 'string', opValue);\n\n if (op === '$ilike') {\n if (!attrDef.isIndexed) {\n throw new QueryValidationError(\n `Operator '${op}' can only be used with indexed attributes, but '${attrName}' in entity '${entityName}' is not indexed`,\n path,\n );\n }\n }\n\n break;\n case '$isNull':\n assertValidValue(op, 'boolean', opValue);\n break;\n default:\n throw new QueryValidationError(\n `Unknown operator '${op}' for attribute '${attrName}' in entity '${entityName}'`,\n path,\n );\n }\n};\n\nconst validateWhereClauseValue = (\n value: unknown,\n attrName: string,\n attrDef: DataAttrDef<any, any, any>,\n entityName: string,\n path: string,\n): void => {\n const expectedType = getAttrType(attrDef);\n const isAnyType = attrDef.valueType === 'json';\n\n const isComplexObject =\n typeof value === 'object' && value !== null && !Array.isArray(value);\n if (isComplexObject) {\n // For any type, allow complex objects without treating them as operators\n if (isAnyType) {\n return; // Any type accepts any value, including complex objects\n }\n\n const operators = value as Record<string, unknown>;\n\n for (const [op, opValue] of Object.entries(operators)) {\n validateOperator(\n op,\n opValue,\n expectedType,\n attrName,\n entityName,\n attrDef,\n `${path}.${op}`,\n );\n }\n } else {\n if (!isValidValueForType(value, expectedType, isAnyType)) {\n throw new QueryValidationError(\n `Invalid value for attribute '${attrName}' in entity '${entityName}'. Expected ${expectedType}, but received: ${typeof value}`,\n path,\n );\n }\n }\n};\n\nconst validateDotNotationAttribute = (\n dotPath: string,\n value: unknown,\n startEntityName: string,\n schema: IContainEntitiesAndLinks<any, any>,\n path: string,\n): void => {\n const pathParts = dotPath.split('.');\n if (pathParts.length < 2) {\n throw new QueryValidationError(\n `Invalid dot notation path '${dotPath}'. Must contain at least one dot.`,\n path,\n );\n }\n\n let currentEntityName = startEntityName;\n\n // Traverse all path parts except the last one (which should be an attribute)\n for (let i = 0; i < pathParts.length - 1; i++) {\n const linkName = pathParts[i];\n const currentEntity = schema.entities[currentEntityName];\n\n if (!currentEntity) {\n throw new QueryValidationError(\n `Entity '${currentEntityName}' does not exist in schema while traversing dot notation path '${dotPath}'.`,\n path,\n );\n }\n\n const link = currentEntity.links[linkName];\n if (!link) {\n const availableLinks = Object.keys(currentEntity.links);\n throw new QueryValidationError(\n `Link '${linkName}' does not exist on entity '${currentEntityName}' in dot notation path '${dotPath}'. Available links: ${availableLinks.length > 0 ? availableLinks.join(', ') : 'none'}`,\n path,\n );\n }\n\n currentEntityName = link.entityName;\n }\n\n // Validate the final attribute\n const finalAttrName = pathParts[pathParts.length - 1];\n const finalEntity = schema.entities[currentEntityName];\n\n if (!finalEntity) {\n throw new QueryValidationError(\n `Target entity '${currentEntityName}' does not exist in schema for dot notation path '${dotPath}'.`,\n path,\n );\n }\n\n // Handle 'id' field specially - every entity has an id field\n if (finalAttrName === 'id') {\n if (typeof value == 'string' && !validateUUID(value)) {\n throw new QueryValidationError(\n `Invalid value for id field in entity '${currentEntityName}'. Expected a UUID, but received: ${value}`,\n path,\n );\n }\n validateWhereClauseValue(\n value,\n dotPath,\n new DataAttrDef('string', false, true),\n startEntityName,\n path,\n );\n return;\n }\n\n const attrDef = finalEntity.attrs[finalAttrName];\n\n if (Object.keys(finalEntity.links).includes(finalAttrName)) {\n if (typeof value === 'string' && !validateUUID(value)) {\n throw new QueryValidationError(\n `Invalid value for link '${finalAttrName}' in entity '${currentEntityName}'. Expected a UUID, but received: ${value}`,\n path,\n );\n }\n\n validateWhereClauseValue(\n value,\n dotPath,\n new DataAttrDef('string', false, true),\n startEntityName,\n path,\n );\n return;\n }\n\n if (!attrDef) {\n const availableAttrs = Object.keys(finalEntity.attrs);\n throw new QueryValidationError(\n `Attribute '${finalAttrName}' does not exist on entity '${currentEntityName}' in dot notation path '${dotPath}'. Available attributes: ${availableAttrs.length > 0 ? availableAttrs.join(', ') + ', id' : 'id'}`,\n path,\n );\n }\n\n // Validate the value against the attribute type\n validateWhereClauseValue(value, dotPath, attrDef, startEntityName, path);\n};\n\nconst validateWhereClause = (\n whereClause: Record<string, unknown>,\n entityName: string,\n schema: IContainEntitiesAndLinks<any, any>,\n path: string,\n): void => {\n for (const [key, value] of Object.entries(whereClause)) {\n if (key === 'or' || key === 'and') {\n if (Array.isArray(value)) {\n for (const clause of value) {\n if (typeof clause === 'object' && clause !== null) {\n validateWhereClause(\n clause as Record<string, unknown>,\n entityName,\n schema,\n `${path}.${key}[${clause}]`,\n );\n }\n }\n }\n continue;\n }\n\n if (key === 'id') {\n validateWhereClauseValue(\n value,\n 'id',\n new DataAttrDef('string', false, true),\n entityName,\n `${path}.id`,\n );\n continue;\n }\n\n if (key.includes('.')) {\n validateDotNotationAttribute(\n key,\n value,\n entityName,\n schema,\n `${path}.${key}`,\n );\n continue;\n }\n\n const entityDef = schema.entities[entityName];\n if (!entityDef) continue;\n\n const attrDef = entityDef.attrs[key];\n const linkDef = entityDef.links[key];\n\n if (!attrDef && !linkDef) {\n const availableAttrs = Object.keys(entityDef.attrs);\n const availableLinks = Object.keys(entityDef.links);\n throw new QueryValidationError(\n `Attribute or link '${key}' does not exist on entity '${entityName}'. Available attributes: ${availableAttrs.length > 0 ? availableAttrs.join(', ') : 'none'}. Available links: ${availableLinks.length > 0 ? availableLinks.join(', ') : 'none'}`,\n `${path}.${key}`,\n );\n }\n\n if (attrDef) {\n validateWhereClauseValue(\n value,\n key,\n attrDef,\n entityName,\n `${path}.${key}`,\n );\n } else if (linkDef) {\n // For links, we expect the value to be a string (ID of the linked entity)\n // Create a synthetic string attribute definition for validation\n if (typeof value === 'string' && !validateUUID(value)) {\n throw new QueryValidationError(\n `Invalid value for link '${key}' in entity '${entityName}'. Expected a UUID, but received: ${value}`,\n `${path}.${key}`,\n );\n }\n const syntheticAttrDef = new DataAttrDef('string', false, true);\n validateWhereClauseValue(\n value,\n key,\n syntheticAttrDef,\n entityName,\n `${path}.${key}`,\n );\n }\n }\n};\n\nconst validateDollarObject = (\n dollarObj: Record<string, unknown>,\n entityName: string,\n schema?: IContainEntitiesAndLinks<any, any> | null | undefined,\n path?: string,\n depth: number = 0,\n): void => {\n for (const key of Object.keys(dollarObj)) {\n if (!dollarSignKeys.includes(key)) {\n throw new QueryValidationError(\n `Invalid query parameter '${key}' in $ object. Valid parameters are: ${dollarSignKeys.join(', ')}. Found: ${key}`,\n path,\n );\n }\n }\n\n // Validate that pagination parameters are only used at top-level\n const paginationParams = [\n // 'limit', // only supported client side\n 'offset',\n 'before',\n 'after',\n 'first',\n 'last',\n ];\n for (const param of paginationParams) {\n if (dollarObj[param] !== undefined && depth > 0) {\n throw new QueryValidationError(\n `'${param}' can only be used on top-level namespaces. It cannot be used in nested queries.`,\n path,\n );\n }\n }\n\n if (dollarObj.where && schema) {\n if (typeof dollarObj.where !== 'object' || dollarObj.where === null) {\n throw new QueryValidationError(\n `'where' clause must be an object in entity '${entityName}', but received: ${typeof dollarObj.where}`,\n path ? `${path}.where` : undefined,\n );\n }\n validateWhereClause(\n dollarObj.where as Record<string, unknown>,\n entityName,\n schema,\n path ? `${path}.where` : 'where',\n );\n }\n};\n\nconst validateEntityInQuery = (\n queryPart: Record<string, unknown>,\n entityName: string,\n schema: IContainEntitiesAndLinks<any, any> | null | undefined,\n path: string,\n depth: number = 0,\n): void => {\n if (!queryPart || typeof queryPart !== 'object') {\n throw new QueryValidationError(\n `Query part for entity '${entityName}' must be an object, but received: ${typeof queryPart}`,\n path,\n );\n }\n\n for (const key of Object.keys(queryPart)) {\n if (key !== '$') {\n // Validate link exists\n if (schema && !(key in schema.entities[entityName].links)) {\n const availableLinks = Object.keys(schema.entities[entityName].links);\n throw new QueryValidationError(\n `Link '${key}' does not exist on entity '${entityName}'. Available links: ${availableLinks.length > 0 ? availableLinks.join(', ') : 'none'}`,\n `${path}.${key}`,\n );\n }\n\n // Recursively validate nested query\n const nestedQuery = queryPart[key];\n if (typeof nestedQuery === 'object' && nestedQuery !== null) {\n const linkedEntityName =\n schema?.entities[entityName].links[key]?.entityName;\n if (linkedEntityName) {\n validateEntityInQuery(\n nestedQuery as Record<string, unknown>,\n linkedEntityName,\n schema,\n `${path}.${key}`,\n depth + 1,\n );\n }\n }\n } else {\n // Validate $ object\n const dollarObj = queryPart[key];\n if (typeof dollarObj !== 'object' || dollarObj === null) {\n throw new QueryValidationError(\n `Query parameter '$' must be an object in entity '${entityName}', but received: ${typeof dollarObj}`,\n `${path}.$`,\n );\n }\n\n validateDollarObject(\n dollarObj as Record<string, unknown>,\n entityName,\n schema,\n `${path}.$`,\n depth,\n );\n }\n }\n};\n\nexport const validateQuery = (\n q: unknown,\n schema?: IContainEntitiesAndLinks<any, any>,\n): void => {\n if (typeof q !== 'object' || q === null) {\n throw new QueryValidationError(\n `Query must be an object, but received: ${typeof q}${q === null ? ' (null)' : ''}`,\n );\n }\n\n if (Array.isArray(q)) {\n throw new QueryValidationError(\n `Query must be an object, but received: ${typeof q}`,\n );\n }\n\n const queryObj = q as Record<string, unknown>;\n\n for (const topLevelKey of Object.keys(queryObj)) {\n if (Array.isArray(q[topLevelKey])) {\n throw new QueryValidationError(\n `Query keys must be strings, but found key of type: ${typeof topLevelKey}`,\n topLevelKey,\n );\n }\n\n if (typeof topLevelKey !== 'string') {\n throw new QueryValidationError(\n `Query keys must be strings, but found key of type: ${typeof topLevelKey}`,\n topLevelKey,\n );\n }\n\n if (topLevelKey === '$$ruleParams') {\n continue;\n }\n\n // Check if the key is top level entity\n if (schema) {\n if (!schema.entities[topLevelKey]) {\n const availableEntities = Object.keys(schema.entities);\n throw new QueryValidationError(\n `Entity '${topLevelKey}' does not exist in schema. Available entities: ${availableEntities.length > 0 ? availableEntities.join(', ') : 'none'}`,\n topLevelKey,\n );\n }\n }\n\n validateEntityInQuery(\n queryObj[topLevelKey] as Record<string, unknown>,\n topLevelKey,\n schema,\n topLevelKey,\n 0, // Start at depth 0 for top-level entities\n );\n }\n};\n"]}
@@ -63,10 +63,11 @@ function any() {
63
63
  // ==========
64
64
  // internal
65
65
  function enrichEntitiesWithLinks(entities, links) {
66
+ var _a, _b, _c, _d;
66
67
  const linksIndex = { fwd: {}, rev: {} };
67
68
  for (const linkDef of Object.values(links)) {
68
- linksIndex.fwd[linkDef.forward.on] ||= {};
69
- linksIndex.rev[linkDef.reverse.on] ||= {};
69
+ (_a = linksIndex.fwd)[_b = linkDef.forward.on] || (_a[_b] = {});
70
+ (_c = linksIndex.rev)[_d = linkDef.reverse.on] || (_c[_d] = {});
70
71
  linksIndex.fwd[linkDef.forward.on][linkDef.forward.label] = {
71
72
  entityName: linkDef.reverse.on,
72
73
  cardinality: linkDef.forward.has,
@@ -78,10 +79,7 @@ function enrichEntitiesWithLinks(entities, links) {
78
79
  }
79
80
  const enrichedEntities = Object.fromEntries(Object.entries(entities).map(([name, def]) => [
80
81
  name,
81
- new EntityDef(def.attrs, {
82
- ...linksIndex.fwd[name],
83
- ...linksIndex.rev[name],
84
- }),
82
+ new EntityDef(def.attrs, Object.assign(Object.assign({}, linksIndex.fwd[name]), linksIndex.rev[name])),
85
83
  ]));
86
84
  return enrichedEntities;
87
85
  }
@@ -103,8 +101,8 @@ function enrichEntitiesWithLinks(entities, links) {
103
101
  * });
104
102
  */
105
103
  function schema({ entities, links, rooms, }) {
106
- const linksDef = (links ?? {});
107
- const roomsDef = (rooms ?? {});
104
+ const linksDef = (links !== null && links !== void 0 ? links : {});
105
+ const roomsDef = (rooms !== null && rooms !== void 0 ? rooms : {});
108
106
  return new InstantSchemaDef(enrichEntitiesWithLinks(entities, linksDef),
109
107
  // (XXX): LinksDef<any> stems from TypeScript's inability to reconcile the
110
108
  // type EntitiesWithLinks<EntitiesWithoutLinks, Links> with