@instantdb/core 0.22.97 → 0.22.98
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commonjs/Connection.js +50 -51
- package/dist/commonjs/Connection.js.map +1 -1
- package/dist/commonjs/InMemoryStorage.js +13 -32
- package/dist/commonjs/InMemoryStorage.js.map +1 -1
- package/dist/commonjs/IndexedDBStorage.js +193 -217
- package/dist/commonjs/IndexedDBStorage.js.map +1 -1
- package/dist/commonjs/InstantError.js +1 -0
- package/dist/commonjs/InstantError.js.map +1 -1
- package/dist/commonjs/Reactor.js +566 -610
- package/dist/commonjs/Reactor.js.map +1 -1
- package/dist/commonjs/StorageAPI.js +51 -70
- package/dist/commonjs/StorageAPI.js.map +1 -1
- package/dist/commonjs/SyncTable.js +68 -81
- package/dist/commonjs/SyncTable.js.map +1 -1
- package/dist/commonjs/WindowNetworkListener.js +2 -13
- package/dist/commonjs/WindowNetworkListener.js.map +1 -1
- package/dist/commonjs/__types__/fieldsTypeTest.js +8 -16
- package/dist/commonjs/__types__/fieldsTypeTest.js.map +1 -1
- package/dist/commonjs/__types__/useDatesTypeTest.js +3 -6
- package/dist/commonjs/__types__/useDatesTypeTest.js.map +1 -1
- package/dist/commonjs/authAPI.js +62 -79
- package/dist/commonjs/authAPI.js.map +1 -1
- package/dist/commonjs/createRouteHandler.js +5 -15
- package/dist/commonjs/createRouteHandler.js.map +1 -1
- package/dist/commonjs/datalog.js +1 -1
- package/dist/commonjs/datalog.js.map +1 -1
- package/dist/commonjs/devtool.js +26 -8
- package/dist/commonjs/devtool.js.map +1 -1
- package/dist/commonjs/framework.d.ts.map +1 -1
- package/dist/commonjs/framework.js +142 -152
- package/dist/commonjs/framework.js.map +1 -1
- package/dist/commonjs/index.js +204 -190
- package/dist/commonjs/index.js.map +1 -1
- package/dist/commonjs/instaml.js +44 -30
- package/dist/commonjs/instaml.js.map +1 -1
- package/dist/commonjs/instaql.js +25 -33
- package/dist/commonjs/instaql.js.map +1 -1
- package/dist/commonjs/parseSchemaFromJSON.js +6 -7
- package/dist/commonjs/parseSchemaFromJSON.js.map +1 -1
- package/dist/commonjs/presence.js +7 -8
- package/dist/commonjs/presence.js.map +1 -1
- package/dist/commonjs/queryValidation.js +1 -2
- package/dist/commonjs/queryValidation.js.map +1 -1
- package/dist/commonjs/schema.js +8 -6
- package/dist/commonjs/schema.js.map +1 -1
- package/dist/commonjs/schemaTypes.js +22 -3
- package/dist/commonjs/schemaTypes.js.map +1 -1
- package/dist/commonjs/store.js +29 -38
- package/dist/commonjs/store.js.map +1 -1
- package/dist/commonjs/transactionValidation.js +1 -2
- package/dist/commonjs/transactionValidation.js.map +1 -1
- package/dist/commonjs/utils/Deferred.js +3 -0
- package/dist/commonjs/utils/Deferred.js.map +1 -1
- package/dist/commonjs/utils/PersistedObject.js +216 -233
- package/dist/commonjs/utils/PersistedObject.js.map +1 -1
- package/dist/commonjs/utils/fetch.js +9 -19
- package/dist/commonjs/utils/fetch.js.map +1 -1
- package/dist/commonjs/utils/linkIndex.js +2 -4
- package/dist/commonjs/utils/linkIndex.js.map +1 -1
- package/dist/commonjs/utils/object.js +1 -1
- package/dist/commonjs/utils/object.js.map +1 -1
- package/dist/esm/Connection.js +50 -51
- package/dist/esm/Connection.js.map +1 -1
- package/dist/esm/InMemoryStorage.js +13 -32
- package/dist/esm/InMemoryStorage.js.map +1 -1
- package/dist/esm/IndexedDBStorage.js +193 -217
- package/dist/esm/IndexedDBStorage.js.map +1 -1
- package/dist/esm/InstantError.js +1 -0
- package/dist/esm/InstantError.js.map +1 -1
- package/dist/esm/Reactor.js +566 -610
- package/dist/esm/Reactor.js.map +1 -1
- package/dist/esm/StorageAPI.js +51 -70
- package/dist/esm/StorageAPI.js.map +1 -1
- package/dist/esm/SyncTable.js +68 -81
- package/dist/esm/SyncTable.js.map +1 -1
- package/dist/esm/WindowNetworkListener.js +2 -13
- package/dist/esm/WindowNetworkListener.js.map +1 -1
- package/dist/esm/__types__/fieldsTypeTest.js +8 -16
- package/dist/esm/__types__/fieldsTypeTest.js.map +1 -1
- package/dist/esm/__types__/useDatesTypeTest.js +3 -6
- package/dist/esm/__types__/useDatesTypeTest.js.map +1 -1
- package/dist/esm/authAPI.js +62 -79
- package/dist/esm/authAPI.js.map +1 -1
- package/dist/esm/createRouteHandler.js +5 -15
- package/dist/esm/createRouteHandler.js.map +1 -1
- package/dist/esm/datalog.js +1 -1
- package/dist/esm/datalog.js.map +1 -1
- package/dist/esm/devtool.js +26 -8
- package/dist/esm/devtool.js.map +1 -1
- package/dist/esm/framework.d.ts.map +1 -1
- package/dist/esm/framework.js +142 -152
- package/dist/esm/framework.js.map +1 -1
- package/dist/esm/index.js +204 -190
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/instaml.js +44 -30
- package/dist/esm/instaml.js.map +1 -1
- package/dist/esm/instaql.js +25 -33
- package/dist/esm/instaql.js.map +1 -1
- package/dist/esm/parseSchemaFromJSON.js +6 -7
- package/dist/esm/parseSchemaFromJSON.js.map +1 -1
- package/dist/esm/presence.js +7 -8
- package/dist/esm/presence.js.map +1 -1
- package/dist/esm/queryValidation.js +1 -2
- package/dist/esm/queryValidation.js.map +1 -1
- package/dist/esm/schema.js +8 -6
- package/dist/esm/schema.js.map +1 -1
- package/dist/esm/schemaTypes.js +22 -3
- package/dist/esm/schemaTypes.js.map +1 -1
- package/dist/esm/store.js +29 -38
- package/dist/esm/store.js.map +1 -1
- package/dist/esm/transactionValidation.js +1 -2
- package/dist/esm/transactionValidation.js.map +1 -1
- package/dist/esm/utils/Deferred.js +3 -0
- package/dist/esm/utils/Deferred.js.map +1 -1
- package/dist/esm/utils/PersistedObject.js +216 -233
- package/dist/esm/utils/PersistedObject.js.map +1 -1
- package/dist/esm/utils/fetch.js +9 -19
- package/dist/esm/utils/fetch.js.map +1 -1
- package/dist/esm/utils/linkIndex.js +2 -4
- package/dist/esm/utils/linkIndex.js.map +1 -1
- package/dist/esm/utils/object.js +1 -1
- package/dist/esm/utils/object.js.map +1 -1
- package/dist/standalone/index.js +2610 -2367
- package/dist/standalone/index.umd.cjs +3 -3
- package/package.json +2 -2
- package/src/framework.ts +0 -1
|
@@ -1 +1 @@
|
|
|
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"]}
|
|
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"]}
|
package/dist/commonjs/schema.js
CHANGED
|
@@ -66,11 +66,10 @@ function any() {
|
|
|
66
66
|
// ==========
|
|
67
67
|
// internal
|
|
68
68
|
function enrichEntitiesWithLinks(entities, links) {
|
|
69
|
-
var _a, _b, _c, _d;
|
|
70
69
|
const linksIndex = { fwd: {}, rev: {} };
|
|
71
70
|
for (const linkDef of Object.values(links)) {
|
|
72
|
-
|
|
73
|
-
|
|
71
|
+
linksIndex.fwd[linkDef.forward.on] ||= {};
|
|
72
|
+
linksIndex.rev[linkDef.reverse.on] ||= {};
|
|
74
73
|
linksIndex.fwd[linkDef.forward.on][linkDef.forward.label] = {
|
|
75
74
|
entityName: linkDef.reverse.on,
|
|
76
75
|
cardinality: linkDef.forward.has,
|
|
@@ -82,7 +81,10 @@ function enrichEntitiesWithLinks(entities, links) {
|
|
|
82
81
|
}
|
|
83
82
|
const enrichedEntities = Object.fromEntries(Object.entries(entities).map(([name, def]) => [
|
|
84
83
|
name,
|
|
85
|
-
new schemaTypes_ts_1.EntityDef(def.attrs,
|
|
84
|
+
new schemaTypes_ts_1.EntityDef(def.attrs, {
|
|
85
|
+
...linksIndex.fwd[name],
|
|
86
|
+
...linksIndex.rev[name],
|
|
87
|
+
}),
|
|
86
88
|
]));
|
|
87
89
|
return enrichedEntities;
|
|
88
90
|
}
|
|
@@ -104,8 +106,8 @@ function enrichEntitiesWithLinks(entities, links) {
|
|
|
104
106
|
* });
|
|
105
107
|
*/
|
|
106
108
|
function schema({ entities, links, rooms, }) {
|
|
107
|
-
const linksDef = (links
|
|
108
|
-
const roomsDef = (rooms
|
|
109
|
+
const linksDef = (links ?? {});
|
|
110
|
+
const roomsDef = (rooms ?? {});
|
|
109
111
|
return new schemaTypes_ts_1.InstantSchemaDef(enrichEntitiesWithLinks(entities, linksDef),
|
|
110
112
|
// (XXX): LinksDef<any> stems from TypeScript's inability to reconcile the
|
|
111
113
|
// type EntitiesWithLinks<EntitiesWithoutLinks, Links> with
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/schema.ts"],"names":[],"mappings":";;;AAAA,qDAU0B;AAE1B,aAAa;AACb,MAAM;AAEN;;;;;;;;;;;;;GAaG;AACH,SAAS,KAAK,CAGZ,QAA8B,EAAE,KAAY;IAC5C,OAAO,IAAI,iCAAgB,CACzB,uBAAuB,CAA8B,QAAQ,EAAE,KAAK,CAAC;IACrE,0EAA0E;IAC1E,2DAA2D;IAC3D,2EAA2E;IAC3E,0EAA0E;IAC1E,4CAA4C;IAC5C,KAAsB,EACtB,SAAoC,CACrC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAS,MAAM,CACb,KAAY;IAEZ,OAAO,IAAI,0BAAS,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,MAAM;IAKb,OAAO,IAAI,4BAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,MAAM;IACb,OAAO,IAAI,4BAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,OAAO;IACd,OAAO,IAAI,4BAAW,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,IAAI;IACX,OAAO,IAAI,4BAAW,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,IAAI;IACX,OAAO,IAAI,4BAAW,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,GAAG;IACV,OAAO,IAAI,4BAAW,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAC9C,CAAC;AAED,aAAa;AACb,WAAW;AAEX,SAAS,uBAAuB,CAI9B,QAA8B,EAAE,KAAY
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/schema.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n EntityDef,\n DataAttrDef,\n InstantSchemaDef,\n type EntitiesDef,\n type AttrsDefs,\n type EntitiesWithLinks,\n type LinksDef,\n type RoomsDef,\n type UnknownRooms,\n} from './schemaTypes.ts';\n\n// ==========\n// API\n\n/**\n * @deprecated\n * `i.graph` is deprecated. Use `i.schema` instead.\n *\n * @example\n * // Before\n * i.graph(entities, links).withRoomSchema<RoomType>();\n *\n * // After\n * i.schema({ entities, links, rooms })\n *\n * @see\n * https://instantdb.com/docs/modeling-data\n */\nfunction graph<\n EntitiesWithoutLinks extends EntitiesDef,\n const Links extends LinksDef<EntitiesWithoutLinks>,\n>(entities: EntitiesWithoutLinks, links: Links) {\n return new InstantSchemaDef(\n enrichEntitiesWithLinks<EntitiesWithoutLinks, Links>(entities, links),\n // (XXX): LinksDef<any> stems from TypeScript’s inability to reconcile the\n // type EntitiesWithLinks<EntitiesWithoutLinks, Links> with\n // EntitiesWithoutLinks. TypeScript is strict about ensuring that types are\n // correctly aligned and does not allow for substituting a type that might\n // be broader or have additional properties.\n links as LinksDef<any>,\n undefined as unknown as UnknownRooms,\n );\n}\n\n/**\n * Creates an entity definition, to be used in conjunction with `i.graph`.\n *\n * @see https://instantdb.com/docs/modeling-data\n * @example\n * {\n * posts: i.entity({\n * title: i.string(),\n * body: i.string(),\n * }),\n * comments: i.entity({\n * body: i.string(),\n * })\n * }\n */\nfunction entity<Attrs extends AttrsDefs>(\n attrs: Attrs,\n): EntityDef<Attrs, {}, void> {\n return new EntityDef(attrs, {});\n}\n\nfunction string<StringEnum extends string = string>(): DataAttrDef<\n StringEnum,\n true,\n false\n> {\n return new DataAttrDef('string', true, false);\n}\n\nfunction number(): DataAttrDef<number, true, false> {\n return new DataAttrDef('number', true, false);\n}\n\nfunction boolean(): DataAttrDef<boolean, true, false> {\n return new DataAttrDef('boolean', true, false);\n}\n\nfunction date(): DataAttrDef<Date, true, false> {\n return new DataAttrDef('date', true, false);\n}\n\nfunction json<T = any>(): DataAttrDef<T, true, false> {\n return new DataAttrDef('json', true, false);\n}\n\nfunction any(): DataAttrDef<any, true, false> {\n return new DataAttrDef('json', true, false);\n}\n\n// ==========\n// internal\n\nfunction enrichEntitiesWithLinks<\n EntitiesWithoutLinks extends EntitiesDef,\n Links extends LinksDef<any>,\n EnrichedEntities = EntitiesWithLinks<EntitiesWithoutLinks, Links>,\n>(entities: EntitiesWithoutLinks, links: Links): EnrichedEntities {\n const linksIndex: LinksIndex = { fwd: {}, rev: {} };\n\n for (const linkDef of Object.values(links)) {\n linksIndex.fwd[linkDef.forward.on as string] ||= {};\n linksIndex.rev[linkDef.reverse.on as string] ||= {};\n\n linksIndex.fwd[linkDef.forward.on as string][linkDef.forward.label] = {\n entityName: linkDef.reverse.on as string,\n cardinality: linkDef.forward.has,\n };\n\n linksIndex.rev[linkDef.reverse.on as string][linkDef.reverse.label] = {\n entityName: linkDef.forward.on as string,\n cardinality: linkDef.reverse.has,\n };\n }\n\n const enrichedEntities = Object.fromEntries(\n Object.entries(entities).map(([name, def]) => [\n name,\n new EntityDef(def.attrs, {\n ...linksIndex.fwd[name],\n ...linksIndex.rev[name],\n }),\n ]),\n );\n\n return enrichedEntities as EnrichedEntities;\n}\n\ntype LinksIndex = Record<\n 'fwd' | 'rev',\n Record<string, Record<string, { entityName: string; cardinality: string }>>\n>;\n\n/**\n * Lets you define a schema for your database.\n *\n * You can define entities, links between entities, and if you use\n * presence, you can define rooms.\n *\n * You can push this schema to your database with the CLI,\n * or use it inside `init`, to get typesafety and autocompletion.\n *\n * @see https://instantdb.com/docs/modeling-data\n * @example\n * i.schema({\n * entities: { },\n * links: { },\n * rooms: { }\n * });\n */\nfunction schema<\n EntitiesWithoutLinks extends EntitiesDef,\n const Links extends LinksDef<EntitiesWithoutLinks>,\n Rooms extends RoomsDef = {},\n>({\n entities,\n links,\n rooms,\n}: {\n entities: EntitiesWithoutLinks;\n links?: Links;\n rooms?: Rooms;\n}) {\n const linksDef = (links ?? {}) as Links;\n const roomsDef = (rooms ?? {}) as Rooms;\n return new InstantSchemaDef(\n enrichEntitiesWithLinks<EntitiesWithoutLinks, Links>(entities, linksDef),\n // (XXX): LinksDef<any> stems from TypeScript's inability to reconcile the\n // type EntitiesWithLinks<EntitiesWithoutLinks, Links> with\n // EntitiesWithoutLinks. TypeScript is strict about ensuring that types are\n // correctly aligned and does not allow for substituting a type that might\n // be broader or have additional properties.\n linksDef as LinksDef<any>,\n roomsDef,\n );\n}\n\nexport const i = {\n // constructs\n graph,\n schema,\n entity,\n // value types\n string,\n number,\n boolean,\n date,\n json,\n any,\n};\n"]}
|
|
@@ -2,12 +2,16 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.InstantUnknownSchemaDef = exports.InstantGraph = exports.InstantSchemaDef = exports.EntityDef = exports.LinkAttrDef = exports.DataAttrDef = void 0;
|
|
4
4
|
class DataAttrDef {
|
|
5
|
+
valueType;
|
|
6
|
+
required;
|
|
7
|
+
isIndexed;
|
|
8
|
+
config;
|
|
9
|
+
metadata = {};
|
|
5
10
|
constructor(valueType, required, isIndexed, config = { indexed: false, unique: false }) {
|
|
6
11
|
this.valueType = valueType;
|
|
7
12
|
this.required = required;
|
|
8
13
|
this.isIndexed = isIndexed;
|
|
9
14
|
this.config = config;
|
|
10
|
-
this.metadata = {};
|
|
11
15
|
}
|
|
12
16
|
/**
|
|
13
17
|
* @deprecated Only use this temporarily for attributes that you want
|
|
@@ -21,14 +25,22 @@ class DataAttrDef {
|
|
|
21
25
|
return new DataAttrDef(this.valueType, false, this.isIndexed, this.config);
|
|
22
26
|
}
|
|
23
27
|
unique() {
|
|
24
|
-
return new DataAttrDef(this.valueType, this.required, this.isIndexed,
|
|
28
|
+
return new DataAttrDef(this.valueType, this.required, this.isIndexed, {
|
|
29
|
+
...this.config,
|
|
30
|
+
unique: true,
|
|
31
|
+
});
|
|
25
32
|
}
|
|
26
33
|
indexed() {
|
|
27
|
-
return new DataAttrDef(this.valueType, this.required, true,
|
|
34
|
+
return new DataAttrDef(this.valueType, this.required, true, {
|
|
35
|
+
...this.config,
|
|
36
|
+
indexed: true,
|
|
37
|
+
});
|
|
28
38
|
}
|
|
29
39
|
}
|
|
30
40
|
exports.DataAttrDef = DataAttrDef;
|
|
31
41
|
class LinkAttrDef {
|
|
42
|
+
cardinality;
|
|
43
|
+
entityName;
|
|
32
44
|
constructor(cardinality, entityName) {
|
|
33
45
|
this.cardinality = cardinality;
|
|
34
46
|
this.entityName = entityName;
|
|
@@ -36,6 +48,8 @@ class LinkAttrDef {
|
|
|
36
48
|
}
|
|
37
49
|
exports.LinkAttrDef = LinkAttrDef;
|
|
38
50
|
class EntityDef {
|
|
51
|
+
attrs;
|
|
52
|
+
links;
|
|
39
53
|
constructor(attrs, links) {
|
|
40
54
|
this.attrs = attrs;
|
|
41
55
|
this.links = links;
|
|
@@ -46,6 +60,9 @@ class EntityDef {
|
|
|
46
60
|
}
|
|
47
61
|
exports.EntityDef = EntityDef;
|
|
48
62
|
class InstantSchemaDef {
|
|
63
|
+
entities;
|
|
64
|
+
links;
|
|
65
|
+
rooms;
|
|
49
66
|
constructor(entities, links, rooms) {
|
|
50
67
|
this.entities = entities;
|
|
51
68
|
this.links = links;
|
|
@@ -82,6 +99,8 @@ exports.InstantSchemaDef = InstantSchemaDef;
|
|
|
82
99
|
* @see https://instantdb.com/docs/modeling-data
|
|
83
100
|
*/
|
|
84
101
|
class InstantGraph {
|
|
102
|
+
entities;
|
|
103
|
+
links;
|
|
85
104
|
constructor(entities, links) {
|
|
86
105
|
this.entities = entities;
|
|
87
106
|
this.links = links;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemaTypes.js","sourceRoot":"","sources":["../../src/schemaTypes.ts"],"names":[],"mappings":";;;AAGA,MAAa,WAAW;IAOtB,YACS,SAAqB,EACrB,QAAoB,EACpB,SAAoB,EAEpB,SAIH,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;QAR9B,cAAS,GAAT,SAAS,CAAY;QACrB,aAAQ,GAAR,QAAQ,CAAY;QACpB,cAAS,GAAT,SAAS,CAAW;QAEpB,WAAM,GAAN,MAAM,CAIwB;QAXhC,aAAQ,GAA4B,EAAE,CAAC;IAY3C,CAAC;IAEJ;;;;OAIG;IACH,cAAc;QACZ,OAAO,IAAI,WAAW,CACpB,IAAI,CAAC,SAAS,EACd,KAAwB,EACxB,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,MAAM,CACZ,CAAC;IACJ,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,WAAW,CACpB,IAAI,CAAC,SAAS,EACd,KAAK,EACL,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,MAAM,CACZ,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,WAAW,CACpB,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,SAAS,kCAET,IAAI,CAAC,MAAM,KACd,MAAM,EAAE,IAAI,IAEf,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,IAAI,WAAW,CACpB,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,QAAQ,EACb,IAAI,kCAEC,IAAI,CAAC,MAAM,KACd,OAAO,EAAE,IAAI,IAEhB,CAAC;IACJ,CAAC;CAQF;AAxED,kCAwEC;AAED,MAAa,WAAW;IAItB,YACS,WAAwB,EACxB,UAAsB;QADtB,gBAAW,GAAX,WAAW,CAAa;QACxB,eAAU,GAAV,UAAU,CAAY;IAC5B,CAAC;CACL;AARD,kCAQC;AAuBD,MAAa,SAAS;IAKpB,YACS,KAAY,EACZ,KAAY;QADZ,UAAK,GAAL,KAAK,CAAO;QACZ,UAAK,GAAL,KAAK,CAAO;IAClB,CAAC;IAEJ,MAAM;QACJ,OAAO,IAAI,SAAS,CAAwB,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACtE,CAAC;CACF;AAbD,8BAaC;AAmQD,MAAa,gBAAgB;IAM3B,YACS,QAAkB,EAClB,KAAY,EACZ,KAAY;QAFZ,aAAQ,GAAR,QAAQ,CAAU;QAClB,UAAK,GAAL,KAAK,CAAO;QACZ,UAAK,GAAL,KAAK,CAAO;IAClB,CAAC;IAEJ;;;;;;;;;;;;;;;;;;OAkBG;IACH,cAAc;QAEZ,OAAO,IAAI,gBAAgB,CACzB,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,KAAK,EACV,EAAU,CACX,CAAC;IACJ,CAAC;CACF;AAvCD,4CAuCC;AAED;;;;;GAKG;AACH,MAAa,YAAY;IAMvB,YACS,QAAkB,EAClB,KAAY;QADZ,aAAQ,GAAR,QAAQ,CAAU;QAClB,UAAK,GAAL,KAAK,CAAO;IAClB,CAAC;IAEJ,cAAc;QACZ,OAAO,IAAI,YAAY,CACrB,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,KAAK,CACX,CAAC;IACJ,CAAC;CACF;AAjBD,oCAiBC;AAqGD,MAAa,uBAAwB,SAAQ,gBAI5C;CAAG;AAJJ,0DAII","sourcesContent":["import type { RoomSchemaShape } from './presence.ts';\nimport { Expand } from './queryTypes.ts';\n\nexport class DataAttrDef<\n ValueType,\n IsRequired extends RequirementKind,\n IsIndexed extends boolean,\n> {\n public metadata: Record<string, unknown> = {};\n\n constructor(\n public valueType: ValueTypes,\n public required: IsRequired,\n public isIndexed: IsIndexed,\n\n public config: {\n indexed: boolean;\n unique: boolean;\n // clientValidator?: (value: ValueType) => boolean;\n } = { indexed: false, unique: false },\n ) {}\n\n /**\n * @deprecated Only use this temporarily for attributes that you want\n * to treat as required in frontend code but can’t yet mark as required\n * and enforced for backend\n */\n clientRequired() {\n return new DataAttrDef<ValueType, true, IsIndexed>(\n this.valueType,\n false as unknown as true,\n this.isIndexed,\n this.config,\n );\n }\n\n optional() {\n return new DataAttrDef<ValueType, false, IsIndexed>(\n this.valueType,\n false,\n this.isIndexed,\n this.config,\n );\n }\n\n unique() {\n return new DataAttrDef<ValueType, IsRequired, IsIndexed>(\n this.valueType,\n this.required,\n this.isIndexed,\n {\n ...this.config,\n unique: true,\n },\n );\n }\n\n indexed() {\n return new DataAttrDef<ValueType, IsRequired, true>(\n this.valueType,\n this.required,\n true,\n {\n ...this.config,\n indexed: true,\n },\n );\n }\n\n // clientValidate(clientValidator: (value: ValueType) => boolean) {\n // return new DataAttrDef(this.valueType, this.required, {\n // ...this.config,\n // clientValidator,\n // });\n // }\n}\n\nexport class LinkAttrDef<\n Cardinality extends CardinalityKind,\n EntityName extends string,\n> {\n constructor(\n public cardinality: Cardinality,\n public entityName: EntityName,\n ) {}\n}\n\nexport interface IContainEntitiesAndLinks<\n Entities extends EntitiesDef,\n Links extends LinksDef<Entities>,\n> {\n entities: Entities;\n links: Links;\n}\n\n// ==========\n// base types\n\nexport type ValueTypes = 'string' | 'number' | 'boolean' | 'date' | 'json';\n\nexport type CardinalityKind = 'one' | 'many';\n\n// true - force required\n// false - optional, not required\nexport type RequirementKind = true | false;\n\nexport type AttrsDefs = Record<string, DataAttrDef<any, any, any>>;\n\nexport class EntityDef<\n Attrs extends AttrsDefs,\n Links extends Record<string, LinkAttrDef<any, any>>,\n AsType,\n> {\n constructor(\n public attrs: Attrs,\n public links: Links,\n ) {}\n\n asType<_AsType extends Partial<MappedAttrs<Attrs, boolean>>>() {\n return new EntityDef<Attrs, Links, _AsType>(this.attrs, this.links);\n }\n}\n\nexport type EntityDefFromSchema<\n S extends IContainEntitiesAndLinks<any, any>,\n K extends keyof S['entities'],\n> = {\n [k in keyof S['entities'][K]['attrs']]: S['entities'][K] extends EntityDef<\n any,\n any,\n any\n >\n ? S['entities'][K]['attrs'][k]\n : never;\n};\n\nexport type EntitiesDef = Record<string, EntityDef<any, any, any>>;\n\nexport type LinksDef<Entities extends EntitiesDef> = Record<\n string,\n LinkDef<\n Entities,\n keyof Entities,\n string,\n CardinalityKind,\n keyof Entities,\n string,\n CardinalityKind\n >\n>;\n\nexport type LinkDef<\n Entities extends EntitiesDef,\n FwdEntity extends keyof Entities,\n FwdAttr extends string,\n FwdCardinality extends CardinalityKind,\n RevEntity extends keyof Entities,\n RevAttr extends string,\n RevCardinality extends CardinalityKind,\n> = {\n forward: {\n on: FwdEntity;\n label: FwdAttr;\n has: FwdCardinality;\n required?: RequirementKind;\n onDelete?: 'cascade';\n };\n reverse: {\n on: RevEntity;\n label: RevAttr;\n has: RevCardinality;\n onDelete?: 'cascade';\n };\n};\n\n// ==========\n// derived types\ntype IsEmptyOrIndexSignature<T> = keyof T extends never\n ? true\n : string extends keyof T\n ? true\n : false;\n\nexport type EntitiesWithLinks<\n Entities extends EntitiesDef,\n Links extends LinksDef<Entities>,\n> = {\n [EntityName in keyof Entities]: EntityDef<\n Entities[EntityName]['attrs'],\n EntityForwardLinksMap<EntityName, Entities, Links> &\n EntityReverseLinksMap<EntityName, Entities, Links>,\n Entities[EntityName] extends EntityDef<any, any, infer O>\n ? O extends void\n ? void\n : O\n : void\n >;\n};\n\ntype EntityForwardLinksMap<\n EntityName extends keyof Entities,\n Entities extends EntitiesDef,\n Links extends LinksDef<Entities>,\n LinkIndexFwd = LinksIndexedByEntity<Entities, Links, 'reverse'>,\n> =\n IsEmptyOrIndexSignature<Links> extends true\n ? {}\n : EntityName extends keyof LinkIndexFwd\n ? {\n [LinkName in keyof LinkIndexFwd[EntityName]]: LinkIndexFwd[EntityName][LinkName] extends LinkDef<\n Entities,\n infer RelatedEntityName,\n any,\n any,\n any,\n any,\n infer Cardinality\n >\n ? {\n entityName: RelatedEntityName;\n cardinality: Cardinality;\n }\n : never;\n }\n : {};\n\ntype EntityReverseLinksMap<\n EntityName extends keyof Entities,\n Entities extends EntitiesDef,\n Links extends LinksDef<Entities>,\n RevLinkIndex = LinksIndexedByEntity<Entities, Links, 'forward'>,\n> =\n IsEmptyOrIndexSignature<Links> extends true\n ? {}\n : EntityName extends keyof RevLinkIndex\n ? {\n [LinkName in keyof RevLinkIndex[EntityName]]: RevLinkIndex[EntityName][LinkName] extends LinkDef<\n Entities,\n any,\n any,\n infer Cardinality,\n infer RelatedEntityName,\n any,\n any\n >\n ? {\n entityName: RelatedEntityName;\n cardinality: Cardinality;\n }\n : never;\n }\n : {};\n\ntype LinksIndexedByEntity<\n Entities extends EntitiesDef,\n Links extends LinksDef<Entities>,\n Direction extends 'forward' | 'reverse',\n> = {\n [FwdEntity in keyof Entities]: {\n [LinkName in keyof Links as Links[LinkName][Direction]['on'] extends FwdEntity\n ? Links[LinkName][Direction]['label']\n : never]: Links[LinkName] extends LinkDef<\n Entities,\n infer FwdEntity,\n infer FwdAttr,\n infer FwdCardinality,\n infer RevEntity,\n infer RevAttr,\n infer RevCardinality\n >\n ? LinkDef<\n Entities,\n FwdEntity,\n FwdAttr,\n FwdCardinality,\n RevEntity,\n RevAttr,\n RevCardinality\n >\n : never;\n };\n};\n\ntype RequiredKeys<Attrs extends AttrsDefs> = {\n [K in keyof Attrs]: Attrs[K] extends DataAttrDef<any, infer R, any>\n ? R extends true\n ? K\n : never\n : never;\n}[keyof Attrs];\n\ntype OptionalKeys<Attrs extends AttrsDefs> = {\n [K in keyof Attrs]: Attrs[K] extends DataAttrDef<any, infer R, any>\n ? R extends false\n ? K\n : never\n : never;\n}[keyof Attrs];\n\n/**\n * MappedAttrs:\n * - Required keys => `key: ValueType`\n * - Optional keys => `key?: ValueType`\n */\ntype MappedAttrs<Attrs extends AttrsDefs, UseDates extends boolean> = {\n [K in RequiredKeys<Attrs>]: Attrs[K] extends DataAttrDef<infer V, any, any>\n ? V extends Date\n ? UseDates extends true\n ? V\n : string | number\n : V\n : never;\n} & {\n [K in OptionalKeys<Attrs>]?: Attrs[K] extends DataAttrDef<infer V, any, any>\n ? V extends Date\n ? UseDates extends true\n ? V\n : string | number\n : V\n : never;\n};\n\nexport type ResolveEntityAttrs<\n EDef extends EntityDef<any, any, any>,\n UseDates extends boolean = false,\n ResolvedAttrs = MappedAttrs<EDef['attrs'], UseDates>,\n> =\n EDef extends EntityDef<any, any, infer AsType>\n ? AsType extends void\n ? ResolvedAttrs\n : Omit<ResolvedAttrs, keyof AsType> & AsType\n : ResolvedAttrs;\n\nexport type ResolveAttrs<\n Entities extends EntitiesDef,\n EntityName extends keyof Entities,\n UseDates extends boolean,\n> = ResolveEntityAttrs<Entities[EntityName], UseDates>;\n\nexport type RoomsFromDef<RDef extends RoomsDef> = {\n [RoomName in keyof RDef]: {\n presence: Expand<ResolveEntityAttrs<RDef[RoomName]['presence']>>;\n topics: {\n [TopicName in keyof RDef[RoomName]['topics']]: Expand<\n ResolveEntityAttrs<NonNullable<RDef[RoomName]['topics']>[TopicName]>\n >;\n };\n };\n};\n\nexport type RoomsOf<S> =\n S extends InstantSchemaDef<any, any, infer RDef> ? RoomsFromDef<RDef> : never;\n\nexport type PresenceOf<\n S,\n RoomType extends keyof RoomsOf<S>,\n> = RoomsOf<S>[RoomType] extends { presence: infer P } ? P : {};\n\nexport type TopicsOf<\n S,\n RoomType extends keyof RoomsOf<S>,\n> = RoomsOf<S>[RoomType] extends { topics: infer T } ? T : {};\n\nexport type TopicOf<\n S,\n RoomType extends keyof RoomsOf<S>,\n TopicType extends keyof TopicsOf<S, RoomType>,\n> = TopicsOf<S, RoomType>[TopicType];\n\ninterface RoomDef {\n presence: EntityDef<any, any, any>;\n topics?: {\n [TopicName: string]: EntityDef<any, any, any>;\n };\n}\n\nexport interface RoomsDef {\n [RoomType: string]: RoomDef;\n}\n\nexport class InstantSchemaDef<\n Entities extends EntitiesDef,\n Links extends LinksDef<Entities>,\n Rooms extends RoomsDef,\n> implements IContainEntitiesAndLinks<Entities, Links>\n{\n constructor(\n public entities: Entities,\n public links: Links,\n public rooms: Rooms,\n ) {}\n\n /**\n * @deprecated\n * `withRoomSchema` is deprecated. Define your schema in `rooms` directly:\n *\n * @example\n * // Before:\n * const schema = i.schema({\n * // ...\n * }).withRoomSchema<RoomSchema>()\n *\n * // After\n * const schema = i.schema({\n * rooms: {\n * // ...\n * }\n * })\n *\n * @see https://instantdb.com/docs/presence-and-topics#typesafety\n */\n withRoomSchema<_RoomSchema extends RoomSchemaShape>() {\n type RDef = RoomDefFromShape<_RoomSchema>;\n return new InstantSchemaDef<Entities, Links, RDef>(\n this.entities,\n this.links,\n {} as RDef,\n );\n }\n}\n\n/**\n * @deprecated\n * `i.graph` is deprecated. Use `i.schema` instead.\n *\n * @see https://instantdb.com/docs/modeling-data\n */\nexport class InstantGraph<\n Entities extends EntitiesDef,\n Links extends LinksDef<Entities>,\n RoomSchema extends RoomSchemaShape = {},\n> implements IContainEntitiesAndLinks<Entities, Links>\n{\n constructor(\n public entities: Entities,\n public links: Links,\n ) {}\n\n withRoomSchema<_RoomSchema extends RoomSchemaShape>() {\n return new InstantGraph<Entities, Links, _RoomSchema>(\n this.entities,\n this.links,\n );\n }\n}\n\ntype EntityDefFromRoomSlice<Shape extends { [k: string]: any }> = EntityDef<\n {\n [AttrName in keyof Shape]: DataAttrDef<\n Shape[AttrName],\n Shape[AttrName] extends undefined ? false : true,\n any\n >;\n },\n any,\n void\n>;\n\ntype RoomDefFromShape<RoomSchema extends RoomSchemaShape> = {\n [RoomName in keyof RoomSchema]: {\n presence: EntityDefFromRoomSlice<\n NonNullable<RoomSchema[RoomName]['presence']>\n >;\n topics: {\n [TopicName in keyof RoomSchema[RoomName]['topics']]: EntityDefFromRoomSlice<\n NonNullable<RoomSchema[RoomName]['topics'][TopicName]>\n >;\n };\n };\n};\n\ntype EntityDefFromShape<Shape, K extends keyof Shape> = EntityDef<\n {\n [AttrName in keyof Shape[K]]: DataAttrDef<\n Shape[K][AttrName],\n Shape[K][AttrName] extends undefined ? false : true,\n any\n >;\n },\n {\n [LinkName in keyof Shape]: LinkAttrDef<\n 'many',\n LinkName extends string ? LinkName : string\n >;\n },\n void\n>;\n\n/**\n * If you were using the old `schema` types, you can use this to help you\n * migrate.\n *\n * @example\n * // Before\n * const db = init<Schema, Rooms>({...})\n *\n * // After\n * const db = init<BackwardsCompatibleSchema<Schema, Rooms>>({...})\n */\nexport type BackwardsCompatibleSchema<\n Shape extends { [k: string]: any },\n RoomSchema extends RoomSchemaShape = {},\n> = InstantSchemaDef<\n { [K in keyof Shape]: EntityDefFromShape<Shape, K> },\n UnknownLinks<EntitiesDef>,\n RoomDefFromShape<RoomSchema>\n>;\n\n// ----------\n// InstantUnknownSchema\n\nexport type UnknownEntity = EntityDef<\n {\n id: DataAttrDef<string, true, true>;\n [AttrName: string]: DataAttrDef<any, boolean, boolean>;\n },\n { [LinkName: string]: LinkAttrDef<'many', string> },\n void\n>;\n\nexport type UnknownEntities = {\n [EntityName: string]: UnknownEntity;\n};\n\nexport interface UnknownLinks<Entities extends EntitiesDef> {\n [LinkName: string]: LinkDef<\n Entities,\n string,\n string,\n 'many',\n string,\n string,\n 'many'\n >;\n}\n\nexport interface UnknownRooms {\n [RoomName: string]: {\n presence: EntityDef<any, any, any>;\n topics: {\n [TopicName: string]: EntityDef<any, any, any>;\n };\n };\n}\n\nexport class InstantUnknownSchemaDef extends InstantSchemaDef<\n UnknownEntities,\n UnknownLinks<UnknownEntities>,\n UnknownRooms\n> {}\n\nexport type InstantUnknownSchema = InstantUnknownSchemaDef;\n\nexport type CreateParams<\n Schema extends IContainEntitiesAndLinks<any, any>,\n EntityName extends keyof Schema['entities'],\n> = {\n [AttrName in RequiredKeys<\n Schema['entities'][EntityName]['attrs']\n >]: Schema['entities'][EntityName]['attrs'][AttrName] extends DataAttrDef<\n infer ValueType,\n any,\n any\n >\n ? ValueType extends Date\n ? string | number | Date\n : ValueType\n : never;\n} & {\n [AttrName in OptionalKeys<\n Schema['entities'][EntityName]['attrs']\n >]?: Schema['entities'][EntityName]['attrs'][AttrName] extends DataAttrDef<\n infer ValueType,\n false,\n any\n >\n ? (ValueType extends Date ? string | number | Date : ValueType) | null\n : never;\n};\n\nexport type UpdateParams<\n Schema extends IContainEntitiesAndLinks<any, any>,\n EntityName extends keyof Schema['entities'],\n> = {\n [AttrName in keyof Schema['entities'][EntityName]['attrs']]?: Schema['entities'][EntityName]['attrs'][AttrName] extends DataAttrDef<\n infer ValueType,\n infer IsRequired,\n any\n >\n ? IsRequired extends true\n ? ValueType extends Date\n ? string | number | Date\n : ValueType\n : (ValueType extends Date ? string | number | Date : ValueType) | null\n : never;\n};\n\nexport type UpdateOpts = {\n upsert?: boolean | undefined;\n};\n\nexport type LinkParams<\n Schema extends IContainEntitiesAndLinks<any, any>,\n EntityName extends keyof Schema['entities'],\n> = {\n [LinkName in keyof Schema['entities'][EntityName]['links']]?: Schema['entities'][EntityName]['links'][LinkName] extends LinkAttrDef<\n infer Cardinality,\n any\n >\n ? Cardinality extends 'one'\n ? string\n : string | string[]\n : never;\n};\n\nexport type RuleParams = {\n [key: string]: any;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"schemaTypes.js","sourceRoot":"","sources":["../../src/schemaTypes.ts"],"names":[],"mappings":";;;AAGA,MAAa,WAAW;IAQb;IACA;IACA;IAEA;IAPF,QAAQ,GAA4B,EAAE,CAAC;IAE9C,YACS,SAAqB,EACrB,QAAoB,EACpB,SAAoB,EAEpB,SAIH,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;QAR9B,cAAS,GAAT,SAAS,CAAY;QACrB,aAAQ,GAAR,QAAQ,CAAY;QACpB,cAAS,GAAT,SAAS,CAAW;QAEpB,WAAM,GAAN,MAAM,CAIwB;IACpC,CAAC;IAEJ;;;;OAIG;IACH,cAAc;QACZ,OAAO,IAAI,WAAW,CACpB,IAAI,CAAC,SAAS,EACd,KAAwB,EACxB,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,MAAM,CACZ,CAAC;IACJ,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,WAAW,CACpB,IAAI,CAAC,SAAS,EACd,KAAK,EACL,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,MAAM,CACZ,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,WAAW,CACpB,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,SAAS,EACd;YACE,GAAG,IAAI,CAAC,MAAM;YACd,MAAM,EAAE,IAAI;SACb,CACF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,IAAI,WAAW,CACpB,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,QAAQ,EACb,IAAI,EACJ;YACE,GAAG,IAAI,CAAC,MAAM;YACd,OAAO,EAAE,IAAI;SACd,CACF,CAAC;IACJ,CAAC;CAQF;AAxED,kCAwEC;AAED,MAAa,WAAW;IAKb;IACA;IAFT,YACS,WAAwB,EACxB,UAAsB;QADtB,gBAAW,GAAX,WAAW,CAAa;QACxB,eAAU,GAAV,UAAU,CAAY;IAC5B,CAAC;CACL;AARD,kCAQC;AAuBD,MAAa,SAAS;IAMX;IACA;IAFT,YACS,KAAY,EACZ,KAAY;QADZ,UAAK,GAAL,KAAK,CAAO;QACZ,UAAK,GAAL,KAAK,CAAO;IAClB,CAAC;IAEJ,MAAM;QACJ,OAAO,IAAI,SAAS,CAAwB,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACtE,CAAC;CACF;AAbD,8BAaC;AAmQD,MAAa,gBAAgB;IAOlB;IACA;IACA;IAHT,YACS,QAAkB,EAClB,KAAY,EACZ,KAAY;QAFZ,aAAQ,GAAR,QAAQ,CAAU;QAClB,UAAK,GAAL,KAAK,CAAO;QACZ,UAAK,GAAL,KAAK,CAAO;IAClB,CAAC;IAEJ;;;;;;;;;;;;;;;;;;OAkBG;IACH,cAAc;QAEZ,OAAO,IAAI,gBAAgB,CACzB,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,KAAK,EACV,EAAU,CACX,CAAC;IACJ,CAAC;CACF;AAvCD,4CAuCC;AAED;;;;;GAKG;AACH,MAAa,YAAY;IAOd;IACA;IAFT,YACS,QAAkB,EAClB,KAAY;QADZ,aAAQ,GAAR,QAAQ,CAAU;QAClB,UAAK,GAAL,KAAK,CAAO;IAClB,CAAC;IAEJ,cAAc;QACZ,OAAO,IAAI,YAAY,CACrB,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,KAAK,CACX,CAAC;IACJ,CAAC;CACF;AAjBD,oCAiBC;AAqGD,MAAa,uBAAwB,SAAQ,gBAI5C;CAAG;AAJJ,0DAII","sourcesContent":["import type { RoomSchemaShape } from './presence.ts';\nimport { Expand } from './queryTypes.ts';\n\nexport class DataAttrDef<\n ValueType,\n IsRequired extends RequirementKind,\n IsIndexed extends boolean,\n> {\n public metadata: Record<string, unknown> = {};\n\n constructor(\n public valueType: ValueTypes,\n public required: IsRequired,\n public isIndexed: IsIndexed,\n\n public config: {\n indexed: boolean;\n unique: boolean;\n // clientValidator?: (value: ValueType) => boolean;\n } = { indexed: false, unique: false },\n ) {}\n\n /**\n * @deprecated Only use this temporarily for attributes that you want\n * to treat as required in frontend code but can’t yet mark as required\n * and enforced for backend\n */\n clientRequired() {\n return new DataAttrDef<ValueType, true, IsIndexed>(\n this.valueType,\n false as unknown as true,\n this.isIndexed,\n this.config,\n );\n }\n\n optional() {\n return new DataAttrDef<ValueType, false, IsIndexed>(\n this.valueType,\n false,\n this.isIndexed,\n this.config,\n );\n }\n\n unique() {\n return new DataAttrDef<ValueType, IsRequired, IsIndexed>(\n this.valueType,\n this.required,\n this.isIndexed,\n {\n ...this.config,\n unique: true,\n },\n );\n }\n\n indexed() {\n return new DataAttrDef<ValueType, IsRequired, true>(\n this.valueType,\n this.required,\n true,\n {\n ...this.config,\n indexed: true,\n },\n );\n }\n\n // clientValidate(clientValidator: (value: ValueType) => boolean) {\n // return new DataAttrDef(this.valueType, this.required, {\n // ...this.config,\n // clientValidator,\n // });\n // }\n}\n\nexport class LinkAttrDef<\n Cardinality extends CardinalityKind,\n EntityName extends string,\n> {\n constructor(\n public cardinality: Cardinality,\n public entityName: EntityName,\n ) {}\n}\n\nexport interface IContainEntitiesAndLinks<\n Entities extends EntitiesDef,\n Links extends LinksDef<Entities>,\n> {\n entities: Entities;\n links: Links;\n}\n\n// ==========\n// base types\n\nexport type ValueTypes = 'string' | 'number' | 'boolean' | 'date' | 'json';\n\nexport type CardinalityKind = 'one' | 'many';\n\n// true - force required\n// false - optional, not required\nexport type RequirementKind = true | false;\n\nexport type AttrsDefs = Record<string, DataAttrDef<any, any, any>>;\n\nexport class EntityDef<\n Attrs extends AttrsDefs,\n Links extends Record<string, LinkAttrDef<any, any>>,\n AsType,\n> {\n constructor(\n public attrs: Attrs,\n public links: Links,\n ) {}\n\n asType<_AsType extends Partial<MappedAttrs<Attrs, boolean>>>() {\n return new EntityDef<Attrs, Links, _AsType>(this.attrs, this.links);\n }\n}\n\nexport type EntityDefFromSchema<\n S extends IContainEntitiesAndLinks<any, any>,\n K extends keyof S['entities'],\n> = {\n [k in keyof S['entities'][K]['attrs']]: S['entities'][K] extends EntityDef<\n any,\n any,\n any\n >\n ? S['entities'][K]['attrs'][k]\n : never;\n};\n\nexport type EntitiesDef = Record<string, EntityDef<any, any, any>>;\n\nexport type LinksDef<Entities extends EntitiesDef> = Record<\n string,\n LinkDef<\n Entities,\n keyof Entities,\n string,\n CardinalityKind,\n keyof Entities,\n string,\n CardinalityKind\n >\n>;\n\nexport type LinkDef<\n Entities extends EntitiesDef,\n FwdEntity extends keyof Entities,\n FwdAttr extends string,\n FwdCardinality extends CardinalityKind,\n RevEntity extends keyof Entities,\n RevAttr extends string,\n RevCardinality extends CardinalityKind,\n> = {\n forward: {\n on: FwdEntity;\n label: FwdAttr;\n has: FwdCardinality;\n required?: RequirementKind;\n onDelete?: 'cascade';\n };\n reverse: {\n on: RevEntity;\n label: RevAttr;\n has: RevCardinality;\n onDelete?: 'cascade';\n };\n};\n\n// ==========\n// derived types\ntype IsEmptyOrIndexSignature<T> = keyof T extends never\n ? true\n : string extends keyof T\n ? true\n : false;\n\nexport type EntitiesWithLinks<\n Entities extends EntitiesDef,\n Links extends LinksDef<Entities>,\n> = {\n [EntityName in keyof Entities]: EntityDef<\n Entities[EntityName]['attrs'],\n EntityForwardLinksMap<EntityName, Entities, Links> &\n EntityReverseLinksMap<EntityName, Entities, Links>,\n Entities[EntityName] extends EntityDef<any, any, infer O>\n ? O extends void\n ? void\n : O\n : void\n >;\n};\n\ntype EntityForwardLinksMap<\n EntityName extends keyof Entities,\n Entities extends EntitiesDef,\n Links extends LinksDef<Entities>,\n LinkIndexFwd = LinksIndexedByEntity<Entities, Links, 'reverse'>,\n> =\n IsEmptyOrIndexSignature<Links> extends true\n ? {}\n : EntityName extends keyof LinkIndexFwd\n ? {\n [LinkName in keyof LinkIndexFwd[EntityName]]: LinkIndexFwd[EntityName][LinkName] extends LinkDef<\n Entities,\n infer RelatedEntityName,\n any,\n any,\n any,\n any,\n infer Cardinality\n >\n ? {\n entityName: RelatedEntityName;\n cardinality: Cardinality;\n }\n : never;\n }\n : {};\n\ntype EntityReverseLinksMap<\n EntityName extends keyof Entities,\n Entities extends EntitiesDef,\n Links extends LinksDef<Entities>,\n RevLinkIndex = LinksIndexedByEntity<Entities, Links, 'forward'>,\n> =\n IsEmptyOrIndexSignature<Links> extends true\n ? {}\n : EntityName extends keyof RevLinkIndex\n ? {\n [LinkName in keyof RevLinkIndex[EntityName]]: RevLinkIndex[EntityName][LinkName] extends LinkDef<\n Entities,\n any,\n any,\n infer Cardinality,\n infer RelatedEntityName,\n any,\n any\n >\n ? {\n entityName: RelatedEntityName;\n cardinality: Cardinality;\n }\n : never;\n }\n : {};\n\ntype LinksIndexedByEntity<\n Entities extends EntitiesDef,\n Links extends LinksDef<Entities>,\n Direction extends 'forward' | 'reverse',\n> = {\n [FwdEntity in keyof Entities]: {\n [LinkName in keyof Links as Links[LinkName][Direction]['on'] extends FwdEntity\n ? Links[LinkName][Direction]['label']\n : never]: Links[LinkName] extends LinkDef<\n Entities,\n infer FwdEntity,\n infer FwdAttr,\n infer FwdCardinality,\n infer RevEntity,\n infer RevAttr,\n infer RevCardinality\n >\n ? LinkDef<\n Entities,\n FwdEntity,\n FwdAttr,\n FwdCardinality,\n RevEntity,\n RevAttr,\n RevCardinality\n >\n : never;\n };\n};\n\ntype RequiredKeys<Attrs extends AttrsDefs> = {\n [K in keyof Attrs]: Attrs[K] extends DataAttrDef<any, infer R, any>\n ? R extends true\n ? K\n : never\n : never;\n}[keyof Attrs];\n\ntype OptionalKeys<Attrs extends AttrsDefs> = {\n [K in keyof Attrs]: Attrs[K] extends DataAttrDef<any, infer R, any>\n ? R extends false\n ? K\n : never\n : never;\n}[keyof Attrs];\n\n/**\n * MappedAttrs:\n * - Required keys => `key: ValueType`\n * - Optional keys => `key?: ValueType`\n */\ntype MappedAttrs<Attrs extends AttrsDefs, UseDates extends boolean> = {\n [K in RequiredKeys<Attrs>]: Attrs[K] extends DataAttrDef<infer V, any, any>\n ? V extends Date\n ? UseDates extends true\n ? V\n : string | number\n : V\n : never;\n} & {\n [K in OptionalKeys<Attrs>]?: Attrs[K] extends DataAttrDef<infer V, any, any>\n ? V extends Date\n ? UseDates extends true\n ? V\n : string | number\n : V\n : never;\n};\n\nexport type ResolveEntityAttrs<\n EDef extends EntityDef<any, any, any>,\n UseDates extends boolean = false,\n ResolvedAttrs = MappedAttrs<EDef['attrs'], UseDates>,\n> =\n EDef extends EntityDef<any, any, infer AsType>\n ? AsType extends void\n ? ResolvedAttrs\n : Omit<ResolvedAttrs, keyof AsType> & AsType\n : ResolvedAttrs;\n\nexport type ResolveAttrs<\n Entities extends EntitiesDef,\n EntityName extends keyof Entities,\n UseDates extends boolean,\n> = ResolveEntityAttrs<Entities[EntityName], UseDates>;\n\nexport type RoomsFromDef<RDef extends RoomsDef> = {\n [RoomName in keyof RDef]: {\n presence: Expand<ResolveEntityAttrs<RDef[RoomName]['presence']>>;\n topics: {\n [TopicName in keyof RDef[RoomName]['topics']]: Expand<\n ResolveEntityAttrs<NonNullable<RDef[RoomName]['topics']>[TopicName]>\n >;\n };\n };\n};\n\nexport type RoomsOf<S> =\n S extends InstantSchemaDef<any, any, infer RDef> ? RoomsFromDef<RDef> : never;\n\nexport type PresenceOf<\n S,\n RoomType extends keyof RoomsOf<S>,\n> = RoomsOf<S>[RoomType] extends { presence: infer P } ? P : {};\n\nexport type TopicsOf<\n S,\n RoomType extends keyof RoomsOf<S>,\n> = RoomsOf<S>[RoomType] extends { topics: infer T } ? T : {};\n\nexport type TopicOf<\n S,\n RoomType extends keyof RoomsOf<S>,\n TopicType extends keyof TopicsOf<S, RoomType>,\n> = TopicsOf<S, RoomType>[TopicType];\n\ninterface RoomDef {\n presence: EntityDef<any, any, any>;\n topics?: {\n [TopicName: string]: EntityDef<any, any, any>;\n };\n}\n\nexport interface RoomsDef {\n [RoomType: string]: RoomDef;\n}\n\nexport class InstantSchemaDef<\n Entities extends EntitiesDef,\n Links extends LinksDef<Entities>,\n Rooms extends RoomsDef,\n> implements IContainEntitiesAndLinks<Entities, Links>\n{\n constructor(\n public entities: Entities,\n public links: Links,\n public rooms: Rooms,\n ) {}\n\n /**\n * @deprecated\n * `withRoomSchema` is deprecated. Define your schema in `rooms` directly:\n *\n * @example\n * // Before:\n * const schema = i.schema({\n * // ...\n * }).withRoomSchema<RoomSchema>()\n *\n * // After\n * const schema = i.schema({\n * rooms: {\n * // ...\n * }\n * })\n *\n * @see https://instantdb.com/docs/presence-and-topics#typesafety\n */\n withRoomSchema<_RoomSchema extends RoomSchemaShape>() {\n type RDef = RoomDefFromShape<_RoomSchema>;\n return new InstantSchemaDef<Entities, Links, RDef>(\n this.entities,\n this.links,\n {} as RDef,\n );\n }\n}\n\n/**\n * @deprecated\n * `i.graph` is deprecated. Use `i.schema` instead.\n *\n * @see https://instantdb.com/docs/modeling-data\n */\nexport class InstantGraph<\n Entities extends EntitiesDef,\n Links extends LinksDef<Entities>,\n RoomSchema extends RoomSchemaShape = {},\n> implements IContainEntitiesAndLinks<Entities, Links>\n{\n constructor(\n public entities: Entities,\n public links: Links,\n ) {}\n\n withRoomSchema<_RoomSchema extends RoomSchemaShape>() {\n return new InstantGraph<Entities, Links, _RoomSchema>(\n this.entities,\n this.links,\n );\n }\n}\n\ntype EntityDefFromRoomSlice<Shape extends { [k: string]: any }> = EntityDef<\n {\n [AttrName in keyof Shape]: DataAttrDef<\n Shape[AttrName],\n Shape[AttrName] extends undefined ? false : true,\n any\n >;\n },\n any,\n void\n>;\n\ntype RoomDefFromShape<RoomSchema extends RoomSchemaShape> = {\n [RoomName in keyof RoomSchema]: {\n presence: EntityDefFromRoomSlice<\n NonNullable<RoomSchema[RoomName]['presence']>\n >;\n topics: {\n [TopicName in keyof RoomSchema[RoomName]['topics']]: EntityDefFromRoomSlice<\n NonNullable<RoomSchema[RoomName]['topics'][TopicName]>\n >;\n };\n };\n};\n\ntype EntityDefFromShape<Shape, K extends keyof Shape> = EntityDef<\n {\n [AttrName in keyof Shape[K]]: DataAttrDef<\n Shape[K][AttrName],\n Shape[K][AttrName] extends undefined ? false : true,\n any\n >;\n },\n {\n [LinkName in keyof Shape]: LinkAttrDef<\n 'many',\n LinkName extends string ? LinkName : string\n >;\n },\n void\n>;\n\n/**\n * If you were using the old `schema` types, you can use this to help you\n * migrate.\n *\n * @example\n * // Before\n * const db = init<Schema, Rooms>({...})\n *\n * // After\n * const db = init<BackwardsCompatibleSchema<Schema, Rooms>>({...})\n */\nexport type BackwardsCompatibleSchema<\n Shape extends { [k: string]: any },\n RoomSchema extends RoomSchemaShape = {},\n> = InstantSchemaDef<\n { [K in keyof Shape]: EntityDefFromShape<Shape, K> },\n UnknownLinks<EntitiesDef>,\n RoomDefFromShape<RoomSchema>\n>;\n\n// ----------\n// InstantUnknownSchema\n\nexport type UnknownEntity = EntityDef<\n {\n id: DataAttrDef<string, true, true>;\n [AttrName: string]: DataAttrDef<any, boolean, boolean>;\n },\n { [LinkName: string]: LinkAttrDef<'many', string> },\n void\n>;\n\nexport type UnknownEntities = {\n [EntityName: string]: UnknownEntity;\n};\n\nexport interface UnknownLinks<Entities extends EntitiesDef> {\n [LinkName: string]: LinkDef<\n Entities,\n string,\n string,\n 'many',\n string,\n string,\n 'many'\n >;\n}\n\nexport interface UnknownRooms {\n [RoomName: string]: {\n presence: EntityDef<any, any, any>;\n topics: {\n [TopicName: string]: EntityDef<any, any, any>;\n };\n };\n}\n\nexport class InstantUnknownSchemaDef extends InstantSchemaDef<\n UnknownEntities,\n UnknownLinks<UnknownEntities>,\n UnknownRooms\n> {}\n\nexport type InstantUnknownSchema = InstantUnknownSchemaDef;\n\nexport type CreateParams<\n Schema extends IContainEntitiesAndLinks<any, any>,\n EntityName extends keyof Schema['entities'],\n> = {\n [AttrName in RequiredKeys<\n Schema['entities'][EntityName]['attrs']\n >]: Schema['entities'][EntityName]['attrs'][AttrName] extends DataAttrDef<\n infer ValueType,\n any,\n any\n >\n ? ValueType extends Date\n ? string | number | Date\n : ValueType\n : never;\n} & {\n [AttrName in OptionalKeys<\n Schema['entities'][EntityName]['attrs']\n >]?: Schema['entities'][EntityName]['attrs'][AttrName] extends DataAttrDef<\n infer ValueType,\n false,\n any\n >\n ? (ValueType extends Date ? string | number | Date : ValueType) | null\n : never;\n};\n\nexport type UpdateParams<\n Schema extends IContainEntitiesAndLinks<any, any>,\n EntityName extends keyof Schema['entities'],\n> = {\n [AttrName in keyof Schema['entities'][EntityName]['attrs']]?: Schema['entities'][EntityName]['attrs'][AttrName] extends DataAttrDef<\n infer ValueType,\n infer IsRequired,\n any\n >\n ? IsRequired extends true\n ? ValueType extends Date\n ? string | number | Date\n : ValueType\n : (ValueType extends Date ? string | number | Date : ValueType) | null\n : never;\n};\n\nexport type UpdateOpts = {\n upsert?: boolean | undefined;\n};\n\nexport type LinkParams<\n Schema extends IContainEntitiesAndLinks<any, any>,\n EntityName extends keyof Schema['entities'],\n> = {\n [LinkName in keyof Schema['entities'][EntityName]['links']]?: Schema['entities'][EntityName]['links'][LinkName] extends LinkAttrDef<\n infer Cardinality,\n any\n >\n ? Cardinality extends 'one'\n ? string\n : string | string[]\n : never;\n};\n\nexport type RuleParams = {\n [key: string]: any;\n};\n"]}
|
package/dist/commonjs/store.js
CHANGED
|
@@ -23,11 +23,13 @@ const mutative_1 = require("mutative");
|
|
|
23
23
|
const object_js_1 = require("./utils/object.js");
|
|
24
24
|
const dates_ts_1 = require("./utils/dates.js");
|
|
25
25
|
class AttrsStoreClass {
|
|
26
|
+
attrs;
|
|
27
|
+
linkIndex;
|
|
28
|
+
_blobAttrs = null;
|
|
29
|
+
_primaryKeys = null;
|
|
30
|
+
_forwardIdents = null;
|
|
31
|
+
_revIdents = null;
|
|
26
32
|
constructor(attrs, linkIndex) {
|
|
27
|
-
this._blobAttrs = null;
|
|
28
|
-
this._primaryKeys = null;
|
|
29
|
-
this._forwardIdents = null;
|
|
30
|
-
this._revIdents = null;
|
|
31
33
|
this.attrs = attrs;
|
|
32
34
|
this.linkIndex = linkIndex;
|
|
33
35
|
}
|
|
@@ -49,7 +51,7 @@ class AttrsStoreClass {
|
|
|
49
51
|
const attr = this.attrs[partialAttr.id];
|
|
50
52
|
if (!attr)
|
|
51
53
|
return;
|
|
52
|
-
this.attrs[partialAttr.id] =
|
|
54
|
+
this.attrs[partialAttr.id] = { ...attr, ...partialAttr };
|
|
53
55
|
this.resetAttrIndexes();
|
|
54
56
|
}
|
|
55
57
|
getAttr(id) {
|
|
@@ -241,7 +243,6 @@ function createStore(attrsStore, triples, enableCardinalityInference, useDateObj
|
|
|
241
243
|
// then we drop the triple and have to wait for the server response
|
|
242
244
|
// to see the optimistic updates.
|
|
243
245
|
function resolveLookupRefs(store, triple) {
|
|
244
|
-
var _a, _b;
|
|
245
246
|
let eid;
|
|
246
247
|
// Check if `e` is a lookup ref
|
|
247
248
|
if (Array.isArray(triple[0])) {
|
|
@@ -254,7 +255,7 @@ function resolveLookupRefs(store, triple) {
|
|
|
254
255
|
}
|
|
255
256
|
// This would be a lot more efficient with a ave index
|
|
256
257
|
const triples = allMapValues(eMaps, 2);
|
|
257
|
-
eid =
|
|
258
|
+
eid = triples.find((x) => x[2] === v)?.[0];
|
|
258
259
|
}
|
|
259
260
|
else {
|
|
260
261
|
eid = triple[0];
|
|
@@ -277,7 +278,7 @@ function resolveLookupRefs(store, triple) {
|
|
|
277
278
|
return null;
|
|
278
279
|
}
|
|
279
280
|
const triples = allMapValues(eMaps, 2);
|
|
280
|
-
const value =
|
|
281
|
+
const value = triples.find((x) => x[2] === v)?.[0];
|
|
281
282
|
if (!value) {
|
|
282
283
|
return null;
|
|
283
284
|
}
|
|
@@ -337,7 +338,6 @@ function getCreatedAt(store, attr, triple) {
|
|
|
337
338
|
return createdAt || Date.now() * 10 + _seed++;
|
|
338
339
|
}
|
|
339
340
|
function addTriple(store, attrsStore, rawTriple) {
|
|
340
|
-
var _a;
|
|
341
341
|
const triple = resolveLookupRefs(store, rawTriple);
|
|
342
342
|
if (!triple) {
|
|
343
343
|
return;
|
|
@@ -358,7 +358,7 @@ function addTriple(store, attrsStore, rawTriple) {
|
|
|
358
358
|
// Reuse the created_at for a triple if it's already in the store.
|
|
359
359
|
// Prevents updates from temporarily pushing an entity to the top
|
|
360
360
|
// while waiting for the server response.
|
|
361
|
-
const t =
|
|
361
|
+
const t = existingTriple?.[3] ?? getCreatedAt(store, attr, triple);
|
|
362
362
|
const enhancedTriple = [eid, aid, v, t];
|
|
363
363
|
if (hasEA(attr)) {
|
|
364
364
|
setInMap(store.eav, [eid, aid], new Map([[v, enhancedTriple]]));
|
|
@@ -373,7 +373,6 @@ function addTriple(store, attrsStore, rawTriple) {
|
|
|
373
373
|
}
|
|
374
374
|
}
|
|
375
375
|
function mergeTriple(store, attrsStore, rawTriple) {
|
|
376
|
-
var _a;
|
|
377
376
|
const triple = resolveLookupRefs(store, rawTriple);
|
|
378
377
|
if (!triple) {
|
|
379
378
|
return;
|
|
@@ -387,7 +386,7 @@ function mergeTriple(store, attrsStore, rawTriple) {
|
|
|
387
386
|
const eavValuesMap = getInMap(store.eav, [eid, aid]);
|
|
388
387
|
if (!eavValuesMap)
|
|
389
388
|
return;
|
|
390
|
-
const currentTriple =
|
|
389
|
+
const currentTriple = eavValuesMap.values().next()?.value;
|
|
391
390
|
if (!currentTriple)
|
|
392
391
|
return;
|
|
393
392
|
const currentValue = currentTriple[2];
|
|
@@ -402,7 +401,6 @@ function mergeTriple(store, attrsStore, rawTriple) {
|
|
|
402
401
|
setInMap(store.aev, [aid, eid], new Map([[updatedValue, enhancedTriple]]));
|
|
403
402
|
}
|
|
404
403
|
function deleteEntity(store, attrsStore, args) {
|
|
405
|
-
var _a, _b;
|
|
406
404
|
const [lookup, etype] = args;
|
|
407
405
|
const triple = resolveLookupRefs(store, [lookup]);
|
|
408
406
|
if (!triple) {
|
|
@@ -416,7 +414,7 @@ function deleteEntity(store, attrsStore, args) {
|
|
|
416
414
|
const attr = attrsStore.getAttr(a);
|
|
417
415
|
// delete cascade refs
|
|
418
416
|
if (attr && attr['on-delete-reverse'] === 'cascade') {
|
|
419
|
-
allMapValues(eMap.get(a), 1).forEach(([e, a, v]) =>
|
|
417
|
+
allMapValues(eMap.get(a), 1).forEach(([e, a, v]) => deleteEntity(store, attrsStore, [v, attr['reverse-identity']?.[1]]));
|
|
420
418
|
}
|
|
421
419
|
if (
|
|
422
420
|
// Fall back to deleting everything if we've rehydrated tx-steps from
|
|
@@ -425,7 +423,7 @@ function deleteEntity(store, attrsStore, args) {
|
|
|
425
423
|
// If we don't know about the attr, let's just get rid of it
|
|
426
424
|
!attr ||
|
|
427
425
|
// Make sure it matches the etype
|
|
428
|
-
|
|
426
|
+
attr['forward-identity']?.[1] === etype) {
|
|
429
427
|
deleteInMap(store.aev, [a, id]);
|
|
430
428
|
deleteInMap(store.eav, [id, a]);
|
|
431
429
|
}
|
|
@@ -439,23 +437,22 @@ function deleteEntity(store, attrsStore, args) {
|
|
|
439
437
|
const vaeTriples = store.vae.get(id) && allMapValues(store.vae.get(id), 2);
|
|
440
438
|
if (vaeTriples) {
|
|
441
439
|
vaeTriples.forEach((triple) => {
|
|
442
|
-
var _a, _b, _c;
|
|
443
440
|
const [e, a, v] = triple;
|
|
444
441
|
const attr = attrsStore.getAttr(a);
|
|
445
|
-
if (!etype || !attr ||
|
|
442
|
+
if (!etype || !attr || attr['reverse-identity']?.[1] === etype) {
|
|
446
443
|
deleteInMap(store.eav, [e, a, v]);
|
|
447
444
|
deleteInMap(store.aev, [a, e, v]);
|
|
448
445
|
deleteInMap(store.vae, [v, a, e]);
|
|
449
446
|
}
|
|
450
447
|
if (attr &&
|
|
451
448
|
attr['on-delete'] === 'cascade' &&
|
|
452
|
-
|
|
453
|
-
deleteEntity(store, attrsStore, [e,
|
|
449
|
+
attr['reverse-identity']?.[1] === etype) {
|
|
450
|
+
deleteEntity(store, attrsStore, [e, attr['forward-identity']?.[1]]);
|
|
454
451
|
}
|
|
455
452
|
});
|
|
456
453
|
}
|
|
457
454
|
// Clear out vae index for `id` if we deleted all the reverse attributes
|
|
458
|
-
if (
|
|
455
|
+
if (store.vae.get(id)?.size === 0) {
|
|
459
456
|
deleteInMap(store.vae, [id]);
|
|
460
457
|
}
|
|
461
458
|
}
|
|
@@ -543,9 +540,8 @@ function allMapValues(m, level, res = []) {
|
|
|
543
540
|
return res;
|
|
544
541
|
}
|
|
545
542
|
function triplesByValue(store, m, v) {
|
|
546
|
-
var _a;
|
|
547
543
|
const res = [];
|
|
548
|
-
if (v
|
|
544
|
+
if (v?.hasOwnProperty('$not')) {
|
|
549
545
|
for (const candidate of m.keys()) {
|
|
550
546
|
if (v.$not !== candidate) {
|
|
551
547
|
res.push(m.get(candidate));
|
|
@@ -553,7 +549,7 @@ function triplesByValue(store, m, v) {
|
|
|
553
549
|
}
|
|
554
550
|
return res;
|
|
555
551
|
}
|
|
556
|
-
if (v
|
|
552
|
+
if (v?.hasOwnProperty('$isNull')) {
|
|
557
553
|
const { attrId, isNull, reverse } = v.$isNull;
|
|
558
554
|
if (reverse) {
|
|
559
555
|
for (const candidate of m.keys()) {
|
|
@@ -567,7 +563,7 @@ function triplesByValue(store, m, v) {
|
|
|
567
563
|
else {
|
|
568
564
|
const aMap = store.aev.get(attrId);
|
|
569
565
|
for (const candidate of m.keys()) {
|
|
570
|
-
const isValNull = !aMap ||
|
|
566
|
+
const isValNull = !aMap || aMap.get(candidate)?.get(null) || !aMap.get(candidate);
|
|
571
567
|
if (isNull ? isValNull : !isValNull) {
|
|
572
568
|
res.push(m.get(candidate));
|
|
573
569
|
}
|
|
@@ -575,7 +571,7 @@ function triplesByValue(store, m, v) {
|
|
|
575
571
|
}
|
|
576
572
|
return res;
|
|
577
573
|
}
|
|
578
|
-
if (v
|
|
574
|
+
if (v?.$comparator) {
|
|
579
575
|
// TODO: A sorted index would be nice here
|
|
580
576
|
return allMapValues(m, 1).filter(v.$op);
|
|
581
577
|
}
|
|
@@ -604,7 +600,6 @@ function whichIdx(e, a, v) {
|
|
|
604
600
|
return res;
|
|
605
601
|
}
|
|
606
602
|
function getTriples(store, [e, a, v]) {
|
|
607
|
-
var _a, _b;
|
|
608
603
|
const idx = whichIdx(e, a, v);
|
|
609
604
|
switch (idx) {
|
|
610
605
|
case 'e': {
|
|
@@ -612,11 +607,11 @@ function getTriples(store, [e, a, v]) {
|
|
|
612
607
|
return allMapValues(eMap, 2);
|
|
613
608
|
}
|
|
614
609
|
case 'ea': {
|
|
615
|
-
const aMap =
|
|
610
|
+
const aMap = store.eav.get(e)?.get(a);
|
|
616
611
|
return allMapValues(aMap, 1);
|
|
617
612
|
}
|
|
618
613
|
case 'eav': {
|
|
619
|
-
const aMap =
|
|
614
|
+
const aMap = store.eav.get(e)?.get(a);
|
|
620
615
|
if (!aMap) {
|
|
621
616
|
return [];
|
|
622
617
|
}
|
|
@@ -663,13 +658,12 @@ function getTriples(store, [e, a, v]) {
|
|
|
663
658
|
}
|
|
664
659
|
}
|
|
665
660
|
function getAsObject(store, attrs, e) {
|
|
666
|
-
var _a;
|
|
667
661
|
const obj = {};
|
|
668
662
|
if (!attrs) {
|
|
669
663
|
return obj;
|
|
670
664
|
}
|
|
671
665
|
for (const [label, attr] of attrs.entries()) {
|
|
672
|
-
const aMap =
|
|
666
|
+
const aMap = store.eav.get(e)?.get(attr.id);
|
|
673
667
|
const triples = allMapValues(aMap, 1);
|
|
674
668
|
for (const triple of triples) {
|
|
675
669
|
obj[label] = triple[2];
|
|
@@ -678,23 +672,20 @@ function getAsObject(store, attrs, e) {
|
|
|
678
672
|
return obj;
|
|
679
673
|
}
|
|
680
674
|
function getAttrByFwdIdentName(attrsStore, inputEtype, inputLabel) {
|
|
681
|
-
|
|
682
|
-
return (_a = attrsStore.forwardIdents.get(inputEtype)) === null || _a === void 0 ? void 0 : _a.get(inputLabel);
|
|
675
|
+
return attrsStore.forwardIdents.get(inputEtype)?.get(inputLabel);
|
|
683
676
|
}
|
|
684
677
|
function getAttrByReverseIdentName(attrsStore, inputEtype, inputLabel) {
|
|
685
|
-
|
|
686
|
-
return (_a = attrsStore.revIdents.get(inputEtype)) === null || _a === void 0 ? void 0 : _a.get(inputLabel);
|
|
678
|
+
return attrsStore.revIdents.get(inputEtype)?.get(inputLabel);
|
|
687
679
|
}
|
|
688
680
|
function getBlobAttrs(attrsStore, etype) {
|
|
689
681
|
return attrsStore.blobAttrs.get(etype);
|
|
690
682
|
}
|
|
691
683
|
function getPrimaryKeyAttr(attrsStore, etype) {
|
|
692
|
-
var _a;
|
|
693
684
|
const fromPrimary = attrsStore.primaryKeys.get(etype);
|
|
694
685
|
if (fromPrimary) {
|
|
695
686
|
return fromPrimary;
|
|
696
687
|
}
|
|
697
|
-
return
|
|
688
|
+
return attrsStore.forwardIdents.get(etype)?.get('id');
|
|
698
689
|
}
|
|
699
690
|
function findTriple(store, attrsStore, rawTriple) {
|
|
700
691
|
const triple = resolveLookupRefs(store, rawTriple);
|
|
@@ -717,7 +708,7 @@ function transact(store, attrsStore, txSteps) {
|
|
|
717
708
|
if (action !== 'add-triple' && action !== 'deep-merge-triple') {
|
|
718
709
|
return true;
|
|
719
710
|
}
|
|
720
|
-
const mode = opts
|
|
711
|
+
const mode = opts?.mode;
|
|
721
712
|
if (mode !== 'create' && mode !== 'update') {
|
|
722
713
|
return true;
|
|
723
714
|
}
|
|
@@ -727,7 +718,7 @@ function transact(store, attrsStore, txSteps) {
|
|
|
727
718
|
const idAttr = getPrimaryKeyAttr(attrsStore, attr['forward-identity'][1]);
|
|
728
719
|
exists = !!findTriple(store, attrsStore, [
|
|
729
720
|
eid,
|
|
730
|
-
idAttr
|
|
721
|
+
idAttr?.id,
|
|
731
722
|
eid,
|
|
732
723
|
]);
|
|
733
724
|
}
|