@instantdb/platform 0.22.98 → 0.22.99-experimental.add-user-perm-rules.20792844601.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 (48) hide show
  1. package/.turbo/turbo-build.log +8 -8
  2. package/dist/commonjs/ProgressPromise.js +58 -45
  3. package/dist/commonjs/ProgressPromise.js.map +1 -1
  4. package/dist/commonjs/api.js +412 -366
  5. package/dist/commonjs/api.js.map +1 -1
  6. package/dist/commonjs/migrationUtils.js +4 -16
  7. package/dist/commonjs/migrationUtils.js.map +1 -1
  8. package/dist/commonjs/migrations.js +21 -10
  9. package/dist/commonjs/migrations.js.map +1 -1
  10. package/dist/commonjs/oauth.js +55 -52
  11. package/dist/commonjs/oauth.js.map +1 -1
  12. package/dist/commonjs/oauthCommon.js +0 -2
  13. package/dist/commonjs/oauthCommon.js.map +1 -1
  14. package/dist/commonjs/perms.js +1 -1
  15. package/dist/commonjs/perms.js.map +1 -1
  16. package/dist/commonjs/schema.js +14 -8
  17. package/dist/commonjs/schema.js.map +1 -1
  18. package/dist/commonjs/serverOAuth.js +68 -55
  19. package/dist/commonjs/serverOAuth.js.map +1 -1
  20. package/dist/commonjs/typescript-schema.js +2 -1
  21. package/dist/commonjs/typescript-schema.js.map +1 -1
  22. package/dist/commonjs/util.js +1 -1
  23. package/dist/commonjs/util.js.map +1 -1
  24. package/dist/esm/ProgressPromise.js +58 -45
  25. package/dist/esm/ProgressPromise.js.map +1 -1
  26. package/dist/esm/api.js +412 -366
  27. package/dist/esm/api.js.map +1 -1
  28. package/dist/esm/migrationUtils.js +4 -16
  29. package/dist/esm/migrationUtils.js.map +1 -1
  30. package/dist/esm/migrations.js +21 -10
  31. package/dist/esm/migrations.js.map +1 -1
  32. package/dist/esm/oauth.js +55 -52
  33. package/dist/esm/oauth.js.map +1 -1
  34. package/dist/esm/oauthCommon.js +0 -2
  35. package/dist/esm/oauthCommon.js.map +1 -1
  36. package/dist/esm/perms.js +1 -1
  37. package/dist/esm/perms.js.map +1 -1
  38. package/dist/esm/schema.js +14 -8
  39. package/dist/esm/schema.js.map +1 -1
  40. package/dist/esm/serverOAuth.js +68 -55
  41. package/dist/esm/serverOAuth.js.map +1 -1
  42. package/dist/esm/typescript-schema.js +2 -1
  43. package/dist/esm/typescript-schema.js.map +1 -1
  44. package/dist/esm/util.js +1 -1
  45. package/dist/esm/util.js.map +1 -1
  46. package/dist/standalone/index.js +660 -690
  47. package/dist/standalone/index.umd.cjs +16 -16
  48. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/migrations.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DataAttrDef,\n id,\n InstantDBAttr,\n InstantDBAttrOnDelete,\n InstantDBCheckedDataType,\n InstantSchemaDef,\n LinkDef,\n} from '@instantdb/core';\nimport { PlanStep } from './api.ts';\nimport { attrDefToNewAttrTx, linkDefToNewAttrTx } from './migrationUtils.ts';\nimport { relationshipConstraints, RelationshipKinds } from './relationships.ts';\n\nexport type Identifier = {\n namespace: string;\n attrName: string;\n};\n\ntype AttrWithIdentifier = {\n 'value-type': 'blob' | 'ref';\n cardinality?: 'many' | 'one';\n 'forward-identity'?: Identifier;\n 'reverse-identity'?: Identifier | null;\n 'on-delete'?: InstantDBAttrOnDelete | null | undefined;\n 'on-delete-reverse'?: InstantDBAttrOnDelete | null | undefined;\n};\n\nexport type MigrationTxTypes = {\n 'delete-attr': { identifier: Identifier };\n 'update-attr': { identifier: Identifier; partialAttr: AttrWithIdentifier };\n 'add-attr': {\n identifier: Identifier;\n 'unique?': boolean;\n 'index?': boolean;\n 'required?': boolean;\n 'reverse-identity'?: Identifier | null;\n 'forward-identity': Identifier;\n cardinality: 'many' | 'one';\n 'value-type': 'blob' | 'ref';\n 'on-delete'?: InstantDBAttrOnDelete | null;\n 'on-delete-reverse'?: InstantDBAttrOnDelete | null;\n 'checked-data-type'?: InstantDBCheckedDataType | null;\n };\n index: { identifier: Identifier };\n 'remove-index': { identifier: Identifier };\n unique: { identifier: Identifier };\n 'remove-unique': { identifier: Identifier };\n required: { identifier: Identifier };\n 'remove-required': { identifier: Identifier };\n 'check-data-type': {\n identifier: Identifier;\n 'checked-data-type': InstantDBCheckedDataType;\n };\n 'remove-data-type': { identifier: Identifier };\n};\n\ntype JobMigrationTypes =\n | 'index'\n | 'remove-index'\n | 'remove-unique'\n | 'remove-required'\n | 'unique'\n | 'remove-data-type'\n | 'required';\n\ntype PlanStepMap = {\n [K in PlanStep as K[0]]: K[1];\n};\n\nconst getExistingAttrThrowing = (\n ident: Identifier,\n existingAttrs: InstantDBAttr[],\n): InstantDBAttr => {\n const found =\n existingAttrs.find((attr) => {\n return (\n attr['forward-identity'][1] === ident.namespace &&\n attr['forward-identity'][2] === ident.attrName\n );\n }) || null;\n if (!found) {\n throw new Error(`Attribute ${ident.namespace}.${ident.attrName} not found`);\n }\n return found;\n};\n\nconst convertSimpleConstraintUpdate: ConvertPlanStepFn<any> = (\n tx,\n existing,\n) => {\n const found = getExistingAttrThrowing(tx.identifier, existing);\n return {\n 'attr-id': found.id,\n 'forward-identity': found['forward-identity'],\n };\n};\n\n// converts migration operations from Identifier (namespace/name) based\n// into transaction steps that use database ids\nconst CONVERTERS: AllConvertPlanStepFns = {\n index: convertSimpleConstraintUpdate,\n unique: convertSimpleConstraintUpdate,\n required: convertSimpleConstraintUpdate,\n 'remove-index': convertSimpleConstraintUpdate,\n 'remove-unique': convertSimpleConstraintUpdate,\n 'remove-required': convertSimpleConstraintUpdate,\n\n 'delete-attr': (from, existing) => {\n const found = getExistingAttrThrowing(from.identifier, existing);\n return found.id;\n },\n 'update-attr': (from, existing) => {\n const found = getExistingAttrThrowing(from.identifier, existing);\n return {\n id: found.id,\n 'forward-identity': from.partialAttr['forward-identity']\n ? [\n found.id,\n from.partialAttr['forward-identity'].namespace,\n from.partialAttr['forward-identity'].attrName,\n ]\n : undefined,\n 'reverse-identity': from.partialAttr['reverse-identity']\n ? [\n found.id,\n from.partialAttr['reverse-identity'].namespace,\n from.partialAttr['reverse-identity'].attrName,\n ]\n : undefined,\n cardinality: from.partialAttr['cardinality']\n ? from.partialAttr['cardinality']\n : undefined,\n\n 'on-delete': from.partialAttr['on-delete']\n ? from.partialAttr['on-delete']\n : undefined,\n 'on-delete-reverse': from.partialAttr['on-delete-reverse']\n ? from.partialAttr['on-delete-reverse']\n : undefined,\n };\n },\n 'add-attr': (from, _existing) => {\n const attrId = id();\n const forwardIdentity: [string, string, string] = [\n attrId,\n from.identifier.namespace,\n from.identifier.attrName,\n ];\n\n const steps: PlanStep[] = [];\n\n // First, create the attribute without unique, required, or indexed\n steps.push([\n 'add-attr',\n {\n 'forward-identity': forwardIdentity,\n 'reverse-identity': from['reverse-identity']\n ? [\n id(),\n from['reverse-identity'].namespace,\n from['reverse-identity'].attrName,\n ]\n : null,\n 'inferred-types': null,\n 'value-type': from['value-type'],\n id: attrId,\n cardinality: from.cardinality,\n 'index?': false,\n 'required?': false,\n 'unique?': false,\n catalog: 'user',\n 'on-delete': from['on-delete'],\n 'on-delete-reverse': from['on-delete-reverse'],\n 'checked-data-type': from['checked-data-type'],\n },\n ]);\n\n // Then add separate steps for unique, required, and indexed\n if (from['unique?']) {\n steps.push([\n 'unique',\n {\n 'attr-id': attrId,\n 'forward-identity': forwardIdentity,\n },\n ]);\n }\n\n if (from['required?']) {\n steps.push([\n 'required',\n {\n 'attr-id': attrId,\n 'forward-identity': forwardIdentity,\n },\n ]);\n }\n\n if (from['index?']) {\n steps.push([\n 'index',\n {\n 'attr-id': attrId,\n 'forward-identity': forwardIdentity,\n },\n ]);\n }\n\n return steps;\n },\n 'remove-data-type': convertSimpleConstraintUpdate,\n 'check-data-type': (from, existing) => {\n const found = getExistingAttrThrowing(from.identifier, existing);\n return {\n 'attr-id': found.id,\n 'checked-data-type': from['checked-data-type'],\n 'forward-identity': found['forward-identity'],\n };\n },\n};\n\nfunction isSystemCatalogAttr(\n systemCatalogIdentNames: Record<string, Set<string>>,\n entityName: string,\n attrName: string,\n): boolean {\n return !!systemCatalogIdentNames[entityName]?.has(attrName);\n}\n\nexport const convertTxSteps = (\n txs: MigrationTx[],\n existingAttrs: InstantDBAttr[],\n): PlanStep[] => {\n if (!existingAttrs) {\n throw new Error('Existing attributes are required');\n }\n const result: PlanStep[] = [];\n txs.forEach((tx) => {\n const converter = CONVERTERS[tx.type];\n if (!converter) {\n throw new Error(`Unknown transaction type: ${tx.type}`);\n }\n const converted = converter(tx as any, existingAttrs);\n if (Array.isArray(converted)) {\n result.push(...converted);\n } else {\n result.push([tx.type, converted] as PlanStep);\n }\n });\n return result;\n};\n\ntype ConvertPlanStepFn<T extends keyof MigrationTxTypes> = (\n from: MigrationTxTypes[T],\n existingAttrs: InstantDBAttr[],\n) => PlanStepMap[T] | PlanStep[];\n\ntype AllConvertPlanStepFns = {\n [K in keyof MigrationTxTypes]: ConvertPlanStepFn<K>;\n};\n\nexport type MigrationTx = {\n [K in keyof MigrationTxTypes]: {\n type: K;\n } & MigrationTxTypes[K];\n}[keyof MigrationTxTypes];\n\nexport type MigrationTxSpecific<T extends keyof MigrationTxTypes> = {\n type: T;\n} & MigrationTxTypes[T];\n\nexport type AnyLink = LinkDef<any, any, any, any, any, any, any>;\nexport type AnyBlob = DataAttrDef<any, any, any>;\n\nexport const diffSchemas = async (\n oldSchema: InstantSchemaDef<any, any, any>,\n newSchema: InstantSchemaDef<any, any, any>,\n resolveFn: RenameResolveFn<string>,\n systemCatalogIdentNames: Record<string, Set<string>>,\n): Promise<MigrationTx[]> => {\n const transactions: MigrationTx[] = [];\n\n const oldEntities = oldSchema.entities;\n const newEntities = newSchema.entities;\n\n const oldEntityNames = Object.keys(oldEntities);\n const newEntityNames = Object.keys(newEntities);\n\n const deletedEntityNames = oldEntityNames.filter(\n (name) => !newEntityNames.includes(name),\n );\n\n for (const entityName of deletedEntityNames) {\n Object.keys(oldEntities[entityName].attrs).forEach((attrName) => {\n if (isSystemCatalogAttr(systemCatalogIdentNames, entityName, attrName))\n return;\n transactions.push({\n type: 'delete-attr',\n identifier: {\n attrName,\n namespace: entityName,\n },\n });\n });\n if (isSystemCatalogAttr(systemCatalogIdentNames, entityName, 'id')) {\n continue;\n }\n transactions.push({\n type: 'delete-attr',\n identifier: {\n attrName: 'id',\n namespace: entityName,\n },\n });\n }\n\n const addedEntityNames = newEntityNames.filter(\n (name) => !oldEntityNames.includes(name),\n );\n\n for (const entityName of addedEntityNames) {\n if (!isSystemCatalogAttr(systemCatalogIdentNames, entityName, 'id')) {\n transactions.push({\n type: 'add-attr',\n 'forward-identity': {\n namespace: entityName,\n attrName: 'id',\n },\n identifier: {\n attrName: 'id',\n namespace: entityName,\n },\n 'index?': false,\n 'required?': true,\n cardinality: 'one',\n 'unique?': true,\n 'value-type': 'blob',\n });\n }\n\n for (const attrName of Object.keys(newEntities[entityName].attrs)) {\n if (isSystemCatalogAttr(systemCatalogIdentNames, entityName, attrName)) {\n continue;\n }\n const attrInSchema = newEntities[entityName].attrs[attrName];\n transactions.push(attrDefToNewAttrTx(attrInSchema, entityName, attrName));\n }\n }\n\n const innerEntityNames = oldEntityNames.filter((name) =>\n newEntityNames.includes(name),\n );\n\n for (const entityName of innerEntityNames) {\n // BLOB ATTRIBUTES\n const addedFields = Object.keys(newEntities[entityName].attrs).filter(\n (field) => {\n if (isSystemCatalogAttr(systemCatalogIdentNames, entityName, field))\n return false;\n\n const oldEntityHasIt = Object.keys(\n oldEntities[entityName].attrs,\n ).includes(field);\n return !oldEntityHasIt;\n },\n );\n const removedFields = Object.keys(oldEntities[entityName].attrs).filter(\n (field) => {\n if (isSystemCatalogAttr(systemCatalogIdentNames, entityName, field))\n return false;\n\n const newEntityHasIt = Object.keys(\n newEntities[entityName].attrs,\n ).includes(field);\n return !newEntityHasIt;\n },\n );\n\n const resolved = await resolveRenames(\n addedFields,\n removedFields,\n resolveFn,\n {\n type: 'attribute',\n entityName: entityName,\n },\n );\n\n const consistentFields = Object.keys(oldEntities[entityName].attrs).filter(\n (field) => Object.keys(newEntities[entityName].attrs).includes(field),\n );\n\n consistentFields.forEach((fieldName) => {\n if (isSystemCatalogAttr(systemCatalogIdentNames, entityName, fieldName)) {\n return;\n }\n transactions.push(\n ...compareBlobs(\n {\n attrName: fieldName,\n namespace: entityName,\n },\n oldEntities[entityName].attrs[fieldName],\n newEntities[entityName].attrs[fieldName],\n ),\n );\n });\n\n resolved.deleted.forEach((attrName) => {\n transactions.push({\n type: 'delete-attr',\n identifier: {\n attrName,\n namespace: entityName,\n },\n });\n });\n\n resolved.created.forEach((createdName) => {\n const attrInSchema = newSchema.entities[entityName].attrs[\n createdName\n ] as AnyBlob;\n transactions.push(\n attrDefToNewAttrTx(attrInSchema, entityName, createdName),\n );\n });\n\n resolved.renamed.forEach((renamed) => {\n transactions.push({\n type: 'update-attr',\n identifier: {\n attrName: renamed.from,\n namespace: entityName,\n },\n partialAttr: {\n 'value-type': 'blob',\n cardinality: 'one',\n 'forward-identity': {\n attrName: renamed.to,\n namespace: entityName,\n },\n },\n });\n\n transactions.push(\n ...compareBlobs(\n {\n attrName: renamed.from,\n namespace: entityName,\n },\n oldEntities[entityName].attrs[renamed.from],\n newEntities[entityName].attrs[renamed.to],\n ),\n );\n });\n }\n\n const oldLinks = (Object.values(oldSchema.links) as AnyLink[]).filter(\n (link) =>\n !isSystemCatalogAttr(\n systemCatalogIdentNames,\n link.forward.on,\n link.forward.label,\n ),\n );\n const newLinks = (Object.values(newSchema.links) as AnyLink[]).filter(\n (link) =>\n !isSystemCatalogAttr(\n systemCatalogIdentNames,\n link.forward.on,\n link.forward.label,\n ),\n );\n\n // Group links by their forward namespace-label combination for comparison\n const createLinkKey = (link: AnyLink) =>\n `${link.forward.on}<->${link.reverse.on}`;\n const createLinkIdentity = (link: AnyLink) =>\n `${link.forward.on}.${link.forward.label}<->${link.reverse.on}.${link.reverse.label}`;\n\n const newLinksByKey = new Map<string, AnyLink[]>();\n const oldLinksByKey = new Map<string, AnyLink[]>();\n\n for (const link of newLinks) {\n const key = createLinkKey(link);\n const links = newLinksByKey.get(key) || [];\n links.push(link);\n newLinksByKey.set(key, links);\n }\n\n for (const link of oldLinks) {\n const key = createLinkKey(link);\n const links = oldLinksByKey.get(key) || [];\n links.push(link);\n oldLinksByKey.set(key, links);\n }\n\n const allLinkKeys = new Set([\n ...oldLinksByKey.keys(),\n ...newLinksByKey.keys(),\n ]);\n\n for (const linkKey of allLinkKeys) {\n const oldLinksInGroup = oldLinksByKey.get(linkKey) || [];\n const newLinksInGroup = newLinksByKey.get(linkKey) || [];\n\n const oldIdentities = oldLinksInGroup.map((link) =>\n createLinkIdentity(link),\n );\n const newIdentities = newLinksInGroup.map((link) =>\n createLinkIdentity(link),\n );\n\n const addedIdentities = newIdentities.filter(\n (identity) => !oldIdentities.includes(identity),\n );\n\n const removedIdentities = oldIdentities.filter(\n (identity) => !newIdentities.includes(identity),\n );\n\n const consistentIdentities = oldIdentities.filter((identity) =>\n newIdentities.includes(identity),\n );\n\n consistentIdentities.forEach((identity) => {\n const oldLink = oldLinksInGroup.find(\n (l) => createLinkIdentity(l) === identity,\n );\n const newLink = newLinksInGroup.find(\n (l) => createLinkIdentity(l) === identity,\n );\n if (!oldLink || !newLink) return;\n transactions.push(\n ...compareLinks(\n {\n namespace: oldLink.forward.on,\n attrName: oldLink.forward.label,\n },\n oldLink,\n newLink,\n ),\n );\n });\n\n const resolved = await resolveRenames(\n addedIdentities,\n removedIdentities,\n resolveFn,\n {\n type: 'link',\n forwardEntityName: oldLinksInGroup[0]?.forward.on,\n reverseEntityName: oldLinksInGroup[0]?.reverse.on,\n },\n );\n\n resolved.deleted.forEach((identity) => {\n const link = oldLinksInGroup.find(\n (l) => createLinkIdentity(l) === identity,\n );\n if (!link) return;\n transactions.push({\n type: 'delete-attr',\n identifier: {\n attrName: link.forward.label,\n namespace: link.forward.on,\n },\n });\n });\n\n resolved.created.forEach((identity) => {\n const link = newLinksInGroup.find(\n (l) => createLinkIdentity(l) === identity,\n );\n if (!link) return;\n transactions.push(linkDefToNewAttrTx(link));\n });\n\n resolved.renamed.forEach((renamed) => {\n const oldLink = oldLinksInGroup.find(\n (l) => createLinkIdentity(l) === renamed.from,\n );\n const newLink = newLinksInGroup.find(\n (l) => createLinkIdentity(l) === renamed.to,\n );\n if (!oldLink || !newLink) return;\n\n transactions.push({\n type: 'update-attr',\n identifier: {\n attrName: oldLink.forward.label,\n namespace: oldLink.forward.on,\n },\n partialAttr: {\n 'value-type': 'ref',\n cardinality: newLink.forward.has === 'one' ? 'one' : 'many',\n 'forward-identity': {\n attrName: newLink.forward.label,\n namespace: newLink.forward.on,\n },\n 'reverse-identity': {\n attrName: newLink.reverse.label,\n namespace: newLink.reverse.on,\n },\n },\n });\n transactions.push(\n ...compareLinks(\n {\n attrName: oldLink.forward.label,\n namespace: oldLink.forward.on,\n },\n oldLink,\n newLink,\n ),\n );\n });\n }\n\n return transactions;\n};\n\nexport interface RenamePromptItem<T> {\n from: T;\n to: T;\n}\n\nexport const compareBlobs = (\n identity: Identifier,\n oldBlob: AnyBlob,\n newBlob: AnyBlob,\n): MigrationTx[] => {\n const results: MigrationTx[] = [];\n const sendType = <T extends JobMigrationTypes>(type: T) => {\n results.push({\n type,\n identifier: identity,\n });\n };\n\n // check if index needs to be added\n if (oldBlob.isIndexed === false && newBlob.isIndexed === true)\n sendType('index');\n\n // check if index needs to be removed\n if (oldBlob.isIndexed === true && newBlob.isIndexed === false)\n sendType('remove-index');\n\n // check if needs to become unique\n if (oldBlob.config.unique === false && newBlob.config.unique === true)\n sendType('unique');\n\n // check if needs to become non-unique\n if (oldBlob.config.unique === true && newBlob.config.unique === false)\n sendType('remove-unique');\n\n // check if needs to become required\n if (oldBlob.required === false && newBlob.required === true)\n sendType('required');\n\n // check if needs to become non-required\n if (oldBlob.required === true && newBlob.required === false)\n sendType('remove-required');\n\n // check if data type needs to be changed / added\n if (oldBlob.valueType !== 'json' && newBlob.valueType === 'json') {\n results.push({\n type: 'remove-data-type',\n identifier: identity,\n });\n } else if (\n oldBlob.valueType !== newBlob.valueType &&\n newBlob.valueType !== 'json'\n ) {\n results.push({\n type: 'check-data-type',\n identifier: identity,\n 'checked-data-type': newBlob.valueType,\n });\n }\n\n return results;\n};\n\nexport const compareLinks = (\n identity: Identifier,\n oldLink: AnyLink,\n newLink: AnyLink,\n): MigrationTx[] => {\n const results: MigrationTx[] = [];\n const oldRelationship =\n `${oldLink.forward.has}-${oldLink.reverse.has}` as RelationshipKinds;\n const { cardinality: oldCardinal, 'unique?': oldUnique } =\n relationshipConstraints[oldRelationship];\n\n const newRelationship =\n `${newLink.forward.has}-${newLink.reverse.has}` as RelationshipKinds;\n const { cardinality: newCardinal, 'unique?': newUnique } =\n relationshipConstraints[newRelationship];\n\n if (!oldUnique && newUnique) {\n results.push({\n type: 'unique',\n identifier: identity,\n });\n }\n if (!newUnique && newUnique !== oldUnique) {\n results.push({\n type: 'remove-unique',\n identifier: identity,\n });\n }\n\n if (\n oldLink.reverse.onDelete !== newLink.reverse.onDelete ||\n oldLink.forward.onDelete !== newLink.forward.onDelete ||\n oldCardinal !== newCardinal\n ) {\n results.push({\n type: 'update-attr',\n identifier: identity,\n partialAttr: {\n 'value-type': 'ref',\n 'on-delete-reverse': newLink.reverse.onDelete,\n 'on-delete': newLink.forward.onDelete,\n cardinality: newCardinal,\n },\n });\n }\n\n return results;\n};\n\nexport const isRenamePromptItem = <T>(\n item: RenamePromptItem<T> | T,\n): item is RenamePromptItem<T> => {\n if (typeof item === 'object') return true;\n return false;\n};\n\nexport type RenameResolveFn<T> = (\n created: T,\n promptData: (RenamePromptItem<T> | T)[],\n extraInfo?: any,\n) => Promise<T | RenamePromptItem<T>>;\n\nconst resolveRenames = async <T>(\n newItems: T[],\n missingItems: T[],\n resolveFn: RenameResolveFn<T>,\n extraInfo?: any,\n): Promise<{\n created: T[];\n deleted: T[];\n renamed: {\n from: T;\n to: T;\n }[];\n}> => {\n if (missingItems.length === 0 || newItems.length === 0) {\n return {\n created: newItems,\n deleted: missingItems,\n renamed: [],\n };\n }\n\n const result: {\n created: T[];\n renamed: { from: T; to: T }[];\n deleted: T[];\n } = { created: [], renamed: [], deleted: [] };\n let index = 0;\n let leftMissing = [...missingItems];\n\n do {\n const created = newItems[index];\n const renames: RenamePromptItem<T>[] = leftMissing.map((it) => {\n return { from: it, to: created };\n });\n const promptData: (RenamePromptItem<T> | T)[] = [created, ...renames];\n\n const data = await resolveFn(created, promptData, extraInfo);\n if (isRenamePromptItem(data)) {\n if (data.from !== data.to) {\n result.renamed.push(data);\n }\n delete leftMissing[leftMissing.indexOf(data.from)];\n leftMissing = leftMissing.filter(Boolean);\n } else {\n result.created.push(created);\n }\n index += 1;\n } while (index < newItems.length);\n\n result.deleted.push(...leftMissing);\n return result;\n};\n"]}
1
+ {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/migrations.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DataAttrDef,\n id,\n InstantDBAttr,\n InstantDBAttrOnDelete,\n InstantDBCheckedDataType,\n InstantSchemaDef,\n LinkDef,\n} from '@instantdb/core';\nimport { PlanStep } from './api.ts';\nimport { attrDefToNewAttrTx, linkDefToNewAttrTx } from './migrationUtils.ts';\nimport { relationshipConstraints, RelationshipKinds } from './relationships.ts';\n\nexport type Identifier = {\n namespace: string;\n attrName: string;\n};\n\ntype AttrWithIdentifier = {\n 'value-type': 'blob' | 'ref';\n cardinality?: 'many' | 'one';\n 'forward-identity'?: Identifier;\n 'reverse-identity'?: Identifier | null;\n 'on-delete'?: InstantDBAttrOnDelete | null | undefined;\n 'on-delete-reverse'?: InstantDBAttrOnDelete | null | undefined;\n};\n\nexport type MigrationTxTypes = {\n 'delete-attr': { identifier: Identifier };\n 'update-attr': { identifier: Identifier; partialAttr: AttrWithIdentifier };\n 'add-attr': {\n identifier: Identifier;\n 'unique?': boolean;\n 'index?': boolean;\n 'required?': boolean;\n 'reverse-identity'?: Identifier | null;\n 'forward-identity': Identifier;\n cardinality: 'many' | 'one';\n 'value-type': 'blob' | 'ref';\n 'on-delete'?: InstantDBAttrOnDelete | null;\n 'on-delete-reverse'?: InstantDBAttrOnDelete | null;\n 'checked-data-type'?: InstantDBCheckedDataType | null;\n };\n index: { identifier: Identifier };\n 'remove-index': { identifier: Identifier };\n unique: { identifier: Identifier };\n 'remove-unique': { identifier: Identifier };\n required: { identifier: Identifier };\n 'remove-required': { identifier: Identifier };\n 'check-data-type': {\n identifier: Identifier;\n 'checked-data-type': InstantDBCheckedDataType;\n };\n 'remove-data-type': { identifier: Identifier };\n};\n\ntype JobMigrationTypes =\n | 'index'\n | 'remove-index'\n | 'remove-unique'\n | 'remove-required'\n | 'unique'\n | 'remove-data-type'\n | 'required';\n\ntype PlanStepMap = {\n [K in PlanStep as K[0]]: K[1];\n};\n\nconst getExistingAttrThrowing = (\n ident: Identifier,\n existingAttrs: InstantDBAttr[],\n): InstantDBAttr => {\n const found =\n existingAttrs.find((attr) => {\n return (\n attr['forward-identity'][1] === ident.namespace &&\n attr['forward-identity'][2] === ident.attrName\n );\n }) || null;\n if (!found) {\n throw new Error(`Attribute ${ident.namespace}.${ident.attrName} not found`);\n }\n return found;\n};\n\nconst convertSimpleConstraintUpdate: ConvertPlanStepFn<any> = (\n tx,\n existing,\n) => {\n const found = getExistingAttrThrowing(tx.identifier, existing);\n return {\n 'attr-id': found.id,\n 'forward-identity': found['forward-identity'],\n };\n};\n\n// converts migration operations from Identifier (namespace/name) based\n// into transaction steps that use database ids\nconst CONVERTERS: AllConvertPlanStepFns = {\n index: convertSimpleConstraintUpdate,\n unique: convertSimpleConstraintUpdate,\n required: convertSimpleConstraintUpdate,\n 'remove-index': convertSimpleConstraintUpdate,\n 'remove-unique': convertSimpleConstraintUpdate,\n 'remove-required': convertSimpleConstraintUpdate,\n\n 'delete-attr': (from, existing) => {\n const found = getExistingAttrThrowing(from.identifier, existing);\n return found.id;\n },\n 'update-attr': (from, existing) => {\n const found = getExistingAttrThrowing(from.identifier, existing);\n return {\n id: found.id,\n 'forward-identity': from.partialAttr['forward-identity']\n ? [\n found.id,\n from.partialAttr['forward-identity'].namespace,\n from.partialAttr['forward-identity'].attrName,\n ]\n : undefined,\n 'reverse-identity': from.partialAttr['reverse-identity']\n ? [\n found.id,\n from.partialAttr['reverse-identity'].namespace,\n from.partialAttr['reverse-identity'].attrName,\n ]\n : undefined,\n cardinality: from.partialAttr['cardinality']\n ? from.partialAttr['cardinality']\n : undefined,\n\n 'on-delete': from.partialAttr['on-delete']\n ? from.partialAttr['on-delete']\n : undefined,\n 'on-delete-reverse': from.partialAttr['on-delete-reverse']\n ? from.partialAttr['on-delete-reverse']\n : undefined,\n };\n },\n 'add-attr': (from, _existing) => {\n const attrId = id();\n const forwardIdentity: [string, string, string] = [\n attrId,\n from.identifier.namespace,\n from.identifier.attrName,\n ];\n\n const steps: PlanStep[] = [];\n\n // First, create the attribute without unique, required, or indexed\n steps.push([\n 'add-attr',\n {\n 'forward-identity': forwardIdentity,\n 'reverse-identity': from['reverse-identity']\n ? [\n id(),\n from['reverse-identity'].namespace,\n from['reverse-identity'].attrName,\n ]\n : null,\n 'inferred-types': null,\n 'value-type': from['value-type'],\n id: attrId,\n cardinality: from.cardinality,\n 'index?': false,\n 'required?': false,\n 'unique?': false,\n catalog: 'user',\n 'on-delete': from['on-delete'],\n 'on-delete-reverse': from['on-delete-reverse'],\n 'checked-data-type': from['checked-data-type'],\n },\n ]);\n\n // Then add separate steps for unique, required, and indexed\n if (from['unique?']) {\n steps.push([\n 'unique',\n {\n 'attr-id': attrId,\n 'forward-identity': forwardIdentity,\n },\n ]);\n }\n\n if (from['required?']) {\n steps.push([\n 'required',\n {\n 'attr-id': attrId,\n 'forward-identity': forwardIdentity,\n },\n ]);\n }\n\n if (from['index?']) {\n steps.push([\n 'index',\n {\n 'attr-id': attrId,\n 'forward-identity': forwardIdentity,\n },\n ]);\n }\n\n return steps;\n },\n 'remove-data-type': convertSimpleConstraintUpdate,\n 'check-data-type': (from, existing) => {\n const found = getExistingAttrThrowing(from.identifier, existing);\n return {\n 'attr-id': found.id,\n 'checked-data-type': from['checked-data-type'],\n 'forward-identity': found['forward-identity'],\n };\n },\n};\n\nfunction isSystemCatalogAttr(\n systemCatalogIdentNames: Record<string, Set<string>>,\n entityName: string,\n attrName: string,\n): boolean {\n return !!systemCatalogIdentNames[entityName]?.has(attrName);\n}\n\nexport const convertTxSteps = (\n txs: MigrationTx[],\n existingAttrs: InstantDBAttr[],\n): PlanStep[] => {\n if (!existingAttrs) {\n throw new Error('Existing attributes are required');\n }\n const result: PlanStep[] = [];\n txs.forEach((tx) => {\n const converter = CONVERTERS[tx.type];\n if (!converter) {\n throw new Error(`Unknown transaction type: ${tx.type}`);\n }\n const converted = converter(tx as any, existingAttrs);\n if (Array.isArray(converted)) {\n result.push(...converted);\n } else {\n result.push([tx.type, converted] as PlanStep);\n }\n });\n return result;\n};\n\ntype ConvertPlanStepFn<T extends keyof MigrationTxTypes> = (\n from: MigrationTxTypes[T],\n existingAttrs: InstantDBAttr[],\n) => PlanStepMap[T] | PlanStep[];\n\ntype AllConvertPlanStepFns = {\n [K in keyof MigrationTxTypes]: ConvertPlanStepFn<K>;\n};\n\nexport type MigrationTx = {\n [K in keyof MigrationTxTypes]: {\n type: K;\n } & MigrationTxTypes[K];\n}[keyof MigrationTxTypes];\n\nexport type MigrationTxSpecific<T extends keyof MigrationTxTypes> = {\n type: T;\n} & MigrationTxTypes[T];\n\nexport type AnyLink = LinkDef<any, any, any, any, any, any, any>;\nexport type AnyBlob = DataAttrDef<any, any, any>;\n\nexport const diffSchemas = async (\n oldSchema: InstantSchemaDef<any, any, any>,\n newSchema: InstantSchemaDef<any, any, any>,\n resolveFn: RenameResolveFn<string>,\n systemCatalogIdentNames: Record<string, Set<string>>,\n): Promise<MigrationTx[]> => {\n const transactions: MigrationTx[] = [];\n\n const oldEntities = oldSchema.entities;\n const newEntities = newSchema.entities;\n\n const oldEntityNames = Object.keys(oldEntities);\n const newEntityNames = Object.keys(newEntities);\n\n const deletedEntityNames = oldEntityNames.filter(\n (name) => !newEntityNames.includes(name),\n );\n\n for (const entityName of deletedEntityNames) {\n Object.keys(oldEntities[entityName].attrs).forEach((attrName) => {\n if (isSystemCatalogAttr(systemCatalogIdentNames, entityName, attrName))\n return;\n transactions.push({\n type: 'delete-attr',\n identifier: {\n attrName,\n namespace: entityName,\n },\n });\n });\n if (isSystemCatalogAttr(systemCatalogIdentNames, entityName, 'id')) {\n continue;\n }\n transactions.push({\n type: 'delete-attr',\n identifier: {\n attrName: 'id',\n namespace: entityName,\n },\n });\n }\n\n const addedEntityNames = newEntityNames.filter(\n (name) => !oldEntityNames.includes(name),\n );\n\n for (const entityName of addedEntityNames) {\n if (!isSystemCatalogAttr(systemCatalogIdentNames, entityName, 'id')) {\n transactions.push({\n type: 'add-attr',\n 'forward-identity': {\n namespace: entityName,\n attrName: 'id',\n },\n identifier: {\n attrName: 'id',\n namespace: entityName,\n },\n 'index?': false,\n 'required?': true,\n cardinality: 'one',\n 'unique?': true,\n 'value-type': 'blob',\n });\n }\n\n for (const attrName of Object.keys(newEntities[entityName].attrs)) {\n if (isSystemCatalogAttr(systemCatalogIdentNames, entityName, attrName)) {\n continue;\n }\n const attrInSchema = newEntities[entityName].attrs[attrName];\n transactions.push(attrDefToNewAttrTx(attrInSchema, entityName, attrName));\n }\n }\n\n const innerEntityNames = oldEntityNames.filter((name) =>\n newEntityNames.includes(name),\n );\n\n for (const entityName of innerEntityNames) {\n // BLOB ATTRIBUTES\n const addedFields = Object.keys(newEntities[entityName].attrs).filter(\n (field) => {\n if (isSystemCatalogAttr(systemCatalogIdentNames, entityName, field))\n return false;\n\n const oldEntityHasIt = Object.keys(\n oldEntities[entityName].attrs,\n ).includes(field);\n return !oldEntityHasIt;\n },\n );\n const removedFields = Object.keys(oldEntities[entityName].attrs).filter(\n (field) => {\n if (isSystemCatalogAttr(systemCatalogIdentNames, entityName, field))\n return false;\n\n const newEntityHasIt = Object.keys(\n newEntities[entityName].attrs,\n ).includes(field);\n return !newEntityHasIt;\n },\n );\n\n const resolved = await resolveRenames(\n addedFields,\n removedFields,\n resolveFn,\n {\n type: 'attribute',\n entityName: entityName,\n },\n );\n\n const consistentFields = Object.keys(oldEntities[entityName].attrs).filter(\n (field) => Object.keys(newEntities[entityName].attrs).includes(field),\n );\n\n consistentFields.forEach((fieldName) => {\n if (isSystemCatalogAttr(systemCatalogIdentNames, entityName, fieldName)) {\n return;\n }\n transactions.push(\n ...compareBlobs(\n {\n attrName: fieldName,\n namespace: entityName,\n },\n oldEntities[entityName].attrs[fieldName],\n newEntities[entityName].attrs[fieldName],\n ),\n );\n });\n\n resolved.deleted.forEach((attrName) => {\n transactions.push({\n type: 'delete-attr',\n identifier: {\n attrName,\n namespace: entityName,\n },\n });\n });\n\n resolved.created.forEach((createdName) => {\n const attrInSchema = newSchema.entities[entityName].attrs[\n createdName\n ] as AnyBlob;\n transactions.push(\n attrDefToNewAttrTx(attrInSchema, entityName, createdName),\n );\n });\n\n resolved.renamed.forEach((renamed) => {\n transactions.push({\n type: 'update-attr',\n identifier: {\n attrName: renamed.from,\n namespace: entityName,\n },\n partialAttr: {\n 'value-type': 'blob',\n cardinality: 'one',\n 'forward-identity': {\n attrName: renamed.to,\n namespace: entityName,\n },\n },\n });\n\n transactions.push(\n ...compareBlobs(\n {\n attrName: renamed.from,\n namespace: entityName,\n },\n oldEntities[entityName].attrs[renamed.from],\n newEntities[entityName].attrs[renamed.to],\n ),\n );\n });\n }\n\n const oldLinks = (Object.values(oldSchema.links) as AnyLink[]).filter(\n (link) =>\n !isSystemCatalogAttr(\n systemCatalogIdentNames,\n link.forward.on,\n link.forward.label,\n ),\n );\n const newLinks = (Object.values(newSchema.links) as AnyLink[]).filter(\n (link) =>\n !isSystemCatalogAttr(\n systemCatalogIdentNames,\n link.forward.on,\n link.forward.label,\n ),\n );\n\n // Group links by their forward namespace-label combination for comparison\n const createLinkKey = (link: AnyLink) =>\n `${link.forward.on}<->${link.reverse.on}`;\n const createLinkIdentity = (link: AnyLink) =>\n `${link.forward.on}.${link.forward.label}<->${link.reverse.on}.${link.reverse.label}`;\n\n const newLinksByKey = new Map<string, AnyLink[]>();\n const oldLinksByKey = new Map<string, AnyLink[]>();\n\n for (const link of newLinks) {\n const key = createLinkKey(link);\n const links = newLinksByKey.get(key) || [];\n links.push(link);\n newLinksByKey.set(key, links);\n }\n\n for (const link of oldLinks) {\n const key = createLinkKey(link);\n const links = oldLinksByKey.get(key) || [];\n links.push(link);\n oldLinksByKey.set(key, links);\n }\n\n const allLinkKeys = new Set([\n ...oldLinksByKey.keys(),\n ...newLinksByKey.keys(),\n ]);\n\n for (const linkKey of allLinkKeys) {\n const oldLinksInGroup = oldLinksByKey.get(linkKey) || [];\n const newLinksInGroup = newLinksByKey.get(linkKey) || [];\n\n const oldIdentities = oldLinksInGroup.map((link) =>\n createLinkIdentity(link),\n );\n const newIdentities = newLinksInGroup.map((link) =>\n createLinkIdentity(link),\n );\n\n const addedIdentities = newIdentities.filter(\n (identity) => !oldIdentities.includes(identity),\n );\n\n const removedIdentities = oldIdentities.filter(\n (identity) => !newIdentities.includes(identity),\n );\n\n const consistentIdentities = oldIdentities.filter((identity) =>\n newIdentities.includes(identity),\n );\n\n consistentIdentities.forEach((identity) => {\n const oldLink = oldLinksInGroup.find(\n (l) => createLinkIdentity(l) === identity,\n );\n const newLink = newLinksInGroup.find(\n (l) => createLinkIdentity(l) === identity,\n );\n if (!oldLink || !newLink) return;\n transactions.push(\n ...compareLinks(\n {\n namespace: oldLink.forward.on,\n attrName: oldLink.forward.label,\n },\n oldLink,\n newLink,\n ),\n );\n });\n\n const resolved = await resolveRenames(\n addedIdentities,\n removedIdentities,\n resolveFn,\n {\n type: 'link',\n forwardEntityName: oldLinksInGroup[0]?.forward.on,\n reverseEntityName: oldLinksInGroup[0]?.reverse.on,\n },\n );\n\n resolved.deleted.forEach((identity) => {\n const link = oldLinksInGroup.find(\n (l) => createLinkIdentity(l) === identity,\n );\n if (!link) return;\n transactions.push({\n type: 'delete-attr',\n identifier: {\n attrName: link.forward.label,\n namespace: link.forward.on,\n },\n });\n });\n\n resolved.created.forEach((identity) => {\n const link = newLinksInGroup.find(\n (l) => createLinkIdentity(l) === identity,\n );\n if (!link) return;\n transactions.push(linkDefToNewAttrTx(link));\n });\n\n resolved.renamed.forEach((renamed) => {\n const oldLink = oldLinksInGroup.find(\n (l) => createLinkIdentity(l) === renamed.from,\n );\n const newLink = newLinksInGroup.find(\n (l) => createLinkIdentity(l) === renamed.to,\n );\n if (!oldLink || !newLink) return;\n\n transactions.push({\n type: 'update-attr',\n identifier: {\n attrName: oldLink.forward.label,\n namespace: oldLink.forward.on,\n },\n partialAttr: {\n 'value-type': 'ref',\n cardinality: newLink.forward.has === 'one' ? 'one' : 'many',\n 'forward-identity': {\n attrName: newLink.forward.label,\n namespace: newLink.forward.on,\n },\n 'reverse-identity': {\n attrName: newLink.reverse.label,\n namespace: newLink.reverse.on,\n },\n },\n });\n transactions.push(\n ...compareLinks(\n {\n attrName: oldLink.forward.label,\n namespace: oldLink.forward.on,\n },\n oldLink,\n newLink,\n ),\n );\n });\n }\n\n return transactions;\n};\n\nexport interface RenamePromptItem<T> {\n from: T;\n to: T;\n}\n\nexport const compareBlobs = (\n identity: Identifier,\n oldBlob: AnyBlob,\n newBlob: AnyBlob,\n): MigrationTx[] => {\n const results: MigrationTx[] = [];\n const sendType = <T extends JobMigrationTypes>(type: T) => {\n results.push({\n type,\n identifier: identity,\n });\n };\n\n // check if index needs to be added\n if (oldBlob.isIndexed === false && newBlob.isIndexed === true)\n sendType('index');\n\n // check if index needs to be removed\n if (oldBlob.isIndexed === true && newBlob.isIndexed === false)\n sendType('remove-index');\n\n // check if needs to become unique\n if (oldBlob.config.unique === false && newBlob.config.unique === true)\n sendType('unique');\n\n // check if needs to become non-unique\n if (oldBlob.config.unique === true && newBlob.config.unique === false)\n sendType('remove-unique');\n\n // check if needs to become required\n if (oldBlob.required === false && newBlob.required === true)\n sendType('required');\n\n // check if needs to become non-required\n if (oldBlob.required === true && newBlob.required === false)\n sendType('remove-required');\n\n // check if data type needs to be changed / added\n if (oldBlob.valueType !== 'json' && newBlob.valueType === 'json') {\n results.push({\n type: 'remove-data-type',\n identifier: identity,\n });\n } else if (\n oldBlob.valueType !== newBlob.valueType &&\n newBlob.valueType !== 'json'\n ) {\n results.push({\n type: 'check-data-type',\n identifier: identity,\n 'checked-data-type': newBlob.valueType,\n });\n }\n\n return results;\n};\n\nexport const compareLinks = (\n identity: Identifier,\n oldLink: AnyLink,\n newLink: AnyLink,\n): MigrationTx[] => {\n const results: MigrationTx[] = [];\n const oldRelationship =\n `${oldLink.forward.has}-${oldLink.reverse.has}` as RelationshipKinds;\n const { cardinality: oldCardinal, 'unique?': oldUnique } =\n relationshipConstraints[oldRelationship];\n\n const newRelationship =\n `${newLink.forward.has}-${newLink.reverse.has}` as RelationshipKinds;\n const { cardinality: newCardinal, 'unique?': newUnique } =\n relationshipConstraints[newRelationship];\n\n if (!oldUnique && newUnique) {\n results.push({\n type: 'unique',\n identifier: identity,\n });\n }\n if (!newUnique && newUnique !== oldUnique) {\n results.push({\n type: 'remove-unique',\n identifier: identity,\n });\n }\n\n if (\n oldLink.reverse.onDelete !== newLink.reverse.onDelete ||\n oldLink.forward.onDelete !== newLink.forward.onDelete ||\n oldCardinal !== newCardinal\n ) {\n results.push({\n type: 'update-attr',\n identifier: identity,\n partialAttr: {\n 'value-type': 'ref',\n 'on-delete-reverse': newLink.reverse.onDelete,\n 'on-delete': newLink.forward.onDelete,\n cardinality: newCardinal,\n },\n });\n }\n\n return results;\n};\n\nexport const isRenamePromptItem = <T>(\n item: RenamePromptItem<T> | T,\n): item is RenamePromptItem<T> => {\n if (typeof item === 'object') return true;\n return false;\n};\n\nexport type RenameResolveFn<T> = (\n created: T,\n promptData: (RenamePromptItem<T> | T)[],\n extraInfo?: any,\n) => Promise<T | RenamePromptItem<T>>;\n\nconst resolveRenames = async <T>(\n newItems: T[],\n missingItems: T[],\n resolveFn: RenameResolveFn<T>,\n extraInfo?: any,\n): Promise<{\n created: T[];\n deleted: T[];\n renamed: {\n from: T;\n to: T;\n }[];\n}> => {\n if (missingItems.length === 0 || newItems.length === 0) {\n return {\n created: newItems,\n deleted: missingItems,\n renamed: [],\n };\n }\n\n const result: {\n created: T[];\n renamed: { from: T; to: T }[];\n deleted: T[];\n } = { created: [], renamed: [], deleted: [] };\n let index = 0;\n let leftMissing = [...missingItems];\n\n do {\n const created = newItems[index];\n const renames: RenamePromptItem<T>[] = leftMissing.map((it) => {\n return { from: it, to: created };\n });\n const promptData: (RenamePromptItem<T> | T)[] = [created, ...renames];\n\n const data = await resolveFn(created, promptData, extraInfo);\n if (isRenamePromptItem(data)) {\n if (data.from !== data.to) {\n result.renamed.push(data);\n }\n delete leftMissing[leftMissing.indexOf(data.from)];\n leftMissing = leftMissing.filter(Boolean);\n } else {\n result.created.push(created);\n }\n index += 1;\n } while (index < newItems.length);\n\n result.deleted.push(...leftMissing);\n return result;\n};\n"]}
@@ -1,4 +1,13 @@
1
1
  "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
2
11
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
13
  };
@@ -47,46 +56,48 @@ function oAuthStartUrl({ clientId, state, codeChallenge, apiURI, redirectUri, sc
47
56
  oauthUrl.searchParams.set('code_challenge_method', 'S256');
48
57
  return oauthUrl.toString();
49
58
  }
50
- async function exchangeCodeForToken({ code, clientId, verifier, apiURI, redirectUri, }) {
51
- const res = await fetch(`${apiURI}/platform/oauth/token`, {
52
- method: 'POST',
53
- headers: {
54
- 'Content-type': 'application/json',
55
- 'Instant-Platform-Version': version_ts_1.default,
56
- 'Instant-Core-Version': core_1.version,
57
- },
58
- body: JSON.stringify({
59
- grant_type: 'authorization_code',
60
- code,
61
- redirect_uri: redirectUri,
62
- client_id: clientId,
63
- code_verifier: verifier,
64
- }),
65
- });
66
- if (!res.ok) {
67
- const text = await res.text();
68
- let error;
69
- try {
70
- const json = JSON.parse(text);
71
- error = {
72
- error: json.error,
73
- errorDescription: json.error_description,
74
- message: `OAuth error: ${json.error || 'server_error'}`,
75
- };
76
- }
77
- catch (e) {
78
- error = {
79
- error: 'server_error',
80
- message: 'OAuth error: server_error',
81
- };
59
+ function exchangeCodeForToken(_a) {
60
+ return __awaiter(this, arguments, void 0, function* ({ code, clientId, verifier, apiURI, redirectUri, }) {
61
+ const res = yield fetch(`${apiURI}/platform/oauth/token`, {
62
+ method: 'POST',
63
+ headers: {
64
+ 'Content-type': 'application/json',
65
+ 'Instant-Platform-Version': version_ts_1.default,
66
+ 'Instant-Core-Version': core_1.version,
67
+ },
68
+ body: JSON.stringify({
69
+ grant_type: 'authorization_code',
70
+ code,
71
+ redirect_uri: redirectUri,
72
+ client_id: clientId,
73
+ code_verifier: verifier,
74
+ }),
75
+ });
76
+ if (!res.ok) {
77
+ const text = yield res.text();
78
+ let error;
79
+ try {
80
+ const json = JSON.parse(text);
81
+ error = {
82
+ error: json.error,
83
+ errorDescription: json.error_description,
84
+ message: `OAuth error: ${json.error || 'server_error'}`,
85
+ };
86
+ }
87
+ catch (e) {
88
+ error = {
89
+ error: 'server_error',
90
+ message: 'OAuth error: server_error',
91
+ };
92
+ }
93
+ throw new oauthCommon_ts_1.InstantOAuthError(error);
82
94
  }
83
- throw new oauthCommon_ts_1.InstantOAuthError(error);
84
- }
85
- const json = (await res.json());
86
- return {
87
- token: json.access_token,
88
- expiresAt: new Date(Date.now() + (json.expires_in - 30) * 1000),
89
- };
95
+ const json = (yield res.json());
96
+ return {
97
+ token: json.access_token,
98
+ expiresAt: new Date(Date.now() + (json.expires_in - 30) * 1000),
99
+ };
100
+ });
90
101
  }
91
102
  function handleClientRedirect() {
92
103
  if (typeof window === 'undefined') {
@@ -129,7 +140,7 @@ function startInstantOAuthClientOnlyFlow({ clientId, apiURI, redirectUri, scopes
129
140
  const verifier = (0, crypto_ts_1.pkceVerifier)();
130
141
  const channel = new BroadcastChannel(state);
131
142
  const flowCompletePromise = new Promise((resolve, reject) => {
132
- channel.addEventListener('message', async (event) => {
143
+ channel.addEventListener('message', (event) => __awaiter(this, void 0, void 0, function* () {
133
144
  if (event.data.type !== 'oauth-redirect') {
134
145
  return;
135
146
  }
@@ -139,7 +150,7 @@ function startInstantOAuthClientOnlyFlow({ clientId, apiURI, redirectUri, scopes
139
150
  }
140
151
  if (code) {
141
152
  try {
142
- const token = await exchangeCodeForToken({
153
+ const token = yield exchangeCodeForToken({
143
154
  clientId,
144
155
  code,
145
156
  verifier,
@@ -172,7 +183,7 @@ function startInstantOAuthClientOnlyFlow({ clientId, apiURI, redirectUri, scopes
172
183
  }));
173
184
  }
174
185
  channel.postMessage({ type: 'oauth-redirect-window-done' });
175
- });
186
+ }));
176
187
  });
177
188
  const w = window.open(
178
189
  // Open window synchronously to prevent popup blocker
@@ -200,18 +211,10 @@ function startInstantOAuthClientOnlyFlow({ clientId, apiURI, redirectUri, scopes
200
211
  * Thin wrapper that drives InstantDB’s browser-only OAuth flow.
201
212
  */
202
213
  class OAuthHandler {
203
- /** Redirect URI that the provider will call back into. */
204
- redirectUri;
205
- /** OAuth client ID. */
206
- clientId;
207
- /**
208
- * Base URL for InstantDB’s REST API.
209
- * Defaults to `https://api.instantdb.com`.
210
- */
211
- apiURI;
212
214
  constructor(config) {
215
+ var _a;
213
216
  this.redirectUri = config.redirectUri;
214
- this.apiURI = config.apiURI ?? 'https://api.instantdb.com';
217
+ this.apiURI = (_a = config.apiURI) !== null && _a !== void 0 ? _a : 'https://api.instantdb.com';
215
218
  this.clientId = config.clientId;
216
219
  }
217
220
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/oauth.ts"],"names":[],"mappings":"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","sourcesContent":["import { version as coreVersion } from '@instantdb/core';\nimport { pkceVerifier, pkceCodeChallengeOfVerifier } from './crypto.ts';\nimport { InstantOAuthError, OAuthScope } from './oauthCommon.ts';\nimport version from './version.ts';\n\nexport type InstantDBOAuthAccessToken = {\n /**\n * Token that can be used to access the Instant platform API on behalf of a user\n */\n token: string;\n /**\n * The date when the token expires (2 weeks from when it was issued by default)\n */\n expiresAt: Date;\n};\n\nfunction getWindowOpts(): string {\n const windowWidth = Math.min(800, Math.floor(window.outerWidth * 0.8));\n const windowHeight = Math.min(630, Math.floor(window.outerHeight * 0.5));\n const windowArea = {\n width: windowWidth,\n height: windowHeight,\n left: Math.round(window.screenX + (window.outerWidth - windowWidth) / 2),\n top: Math.round(window.screenY + (window.outerHeight - windowHeight) / 8),\n };\n\n const opts: Record<string, number | string> = {\n width: windowArea.width,\n height: windowArea.height,\n left: windowArea.left,\n top: windowArea.top,\n toolbar: 0,\n scrollbars: 1,\n status: 1,\n resizable: 1,\n menuBar: 0,\n rel: 'opener',\n };\n\n return Object.keys(opts)\n .map((k) => `${k}=${opts[k]}`)\n .join(',');\n}\n\nlet AUTH_WINDOW: null | Window = null;\n\nfunction oAuthStartUrl({\n clientId,\n state,\n codeChallenge,\n apiURI,\n redirectUri,\n scopes,\n}: {\n clientId: string;\n state: string;\n codeChallenge: string;\n apiURI: string;\n redirectUri: string;\n scopes: string[];\n}): string {\n const oauthUrl = new URL(`${apiURI}/platform/oauth/start`);\n oauthUrl.searchParams.set('client_id', clientId);\n oauthUrl.searchParams.set('redirect_uri', redirectUri);\n oauthUrl.searchParams.set('scope', scopes.join(' '));\n oauthUrl.searchParams.set('state', state);\n oauthUrl.searchParams.set('response_type', 'code');\n oauthUrl.searchParams.set('code_challenge', codeChallenge);\n oauthUrl.searchParams.set('code_challenge_method', 'S256');\n\n return oauthUrl.toString();\n}\n\nasync function exchangeCodeForToken({\n code,\n clientId,\n verifier,\n apiURI,\n redirectUri,\n}: {\n code: string;\n clientId: string;\n verifier: string;\n apiURI: string;\n redirectUri: string;\n}): Promise<InstantDBOAuthAccessToken> {\n const res = await fetch(`${apiURI}/platform/oauth/token`, {\n method: 'POST',\n headers: {\n 'Content-type': 'application/json',\n 'Instant-Platform-Version': version,\n 'Instant-Core-Version': coreVersion,\n },\n body: JSON.stringify({\n grant_type: 'authorization_code',\n code,\n redirect_uri: redirectUri,\n client_id: clientId,\n code_verifier: verifier,\n }),\n });\n\n if (!res.ok) {\n const text = await res.text();\n let error;\n\n try {\n const json = JSON.parse(text);\n error = {\n error: json.error,\n errorDescription: json.error_description,\n message: `OAuth error: ${json.error || 'server_error'}`,\n };\n } catch (e) {\n error = {\n error: 'server_error',\n message: 'OAuth error: server_error',\n };\n }\n\n throw new InstantOAuthError(error);\n }\n\n const json = (await res.json()) as {\n access_token: string;\n expires_in: number;\n };\n\n return {\n token: json.access_token,\n expiresAt: new Date(Date.now() + (json.expires_in - 30) * 1000),\n };\n}\n\nexport function handleClientRedirect() {\n if (typeof window === 'undefined') {\n throw new Error('This function may only be used in a browser context.');\n }\n\n const searchParams = new URL(window.location.href).searchParams;\n\n const state = searchParams.get('state');\n const error = searchParams.get('error');\n const errorDescription = searchParams.get('error_description');\n const code = searchParams.get('code');\n\n if (!state) {\n throw new Error('Invalid redirect. The state param is missing.');\n }\n\n const channel = new BroadcastChannel(state);\n channel.addEventListener('message', (event) => {\n if (event.data.type === 'oauth-redirect-window-done') {\n window.close();\n }\n });\n channel.postMessage({\n type: 'oauth-redirect',\n state,\n error,\n errorDescription,\n code,\n });\n\n return () => {\n channel.close();\n };\n}\n\nexport function startInstantOAuthClientOnlyFlow({\n clientId,\n apiURI,\n redirectUri,\n scopes,\n}: {\n clientId: string;\n apiURI: string;\n redirectUri: string;\n scopes: OAuthScope[];\n}): Promise<InstantDBOAuthAccessToken> {\n if (typeof window === 'undefined') {\n throw new Error('OAuth flow can only be started on the client.');\n }\n\n const existingAuthWindow = AUTH_WINDOW;\n\n if (existingAuthWindow) {\n existingAuthWindow.close();\n }\n\n const state = crypto.randomUUID();\n\n const verifier = pkceVerifier();\n\n const channel = new BroadcastChannel(state);\n\n const flowCompletePromise: Promise<InstantDBOAuthAccessToken> = new Promise(\n (resolve, reject) => {\n channel.addEventListener('message', async (event) => {\n if (event.data.type !== 'oauth-redirect') {\n return;\n }\n\n const {\n state: redirectState,\n error,\n code,\n errorDescription,\n } = event.data;\n\n if (!redirectState || redirectState !== state) {\n return;\n }\n\n if (code) {\n try {\n const token = await exchangeCodeForToken({\n clientId,\n code,\n verifier,\n apiURI,\n redirectUri,\n });\n resolve(token);\n } catch (e) {\n if (e instanceof InstantOAuthError) {\n reject(e);\n }\n reject(\n new InstantOAuthError({\n error: 'server_error',\n message: 'OAuth error exchanging code for token',\n }),\n );\n }\n } else if (typeof error === 'string') {\n reject(\n new InstantOAuthError({\n error,\n errorDescription,\n message: `OAuth error: ${error}`,\n }),\n );\n } else {\n reject(\n new InstantOAuthError({\n error: 'server_error',\n message: 'OAuth error: server_error',\n }),\n );\n }\n\n channel.postMessage({ type: 'oauth-redirect-window-done' });\n });\n },\n );\n\n const w = window.open(\n // Open window synchronously to prevent popup blocker\n '',\n // A unqiue name prevents orphaned popups from stealing our window.open\n `instantdb_oauth_${Math.random()}`.replace('.', ''),\n getWindowOpts(),\n );\n\n if (!w) {\n return Promise.reject({ error: 'Could not open Auth window' });\n }\n\n AUTH_WINDOW = w;\n\n pkceCodeChallengeOfVerifier(verifier).then((codeChallenge) => {\n const oauthUrl = oAuthStartUrl({\n clientId,\n state,\n codeChallenge,\n apiURI,\n redirectUri,\n scopes,\n });\n w.location.href = oauthUrl;\n });\n\n return flowCompletePromise.finally(() => channel.close());\n}\n\n/**\n * Configuration for {@link OAuthHandler}.\n */\nexport interface OAuthHandlerConfig {\n /**\n * Must exactly match one of the **Authorized Redirect URIs** in your OAuth\n * client settings on the Instant dashboard.\n */\n redirectUri: string;\n\n /** OAuth client ID from the Instant dashboard. */\n clientId: string;\n\n /**\n * Optional Instant API base-URL.\n * Defaults to `https://api.instantdb.com`.\n */\n apiURI?: string | null;\n}\n\n/**\n * Thin wrapper that drives InstantDB’s browser-only OAuth flow.\n */\nexport class OAuthHandler {\n /** Redirect URI that the provider will call back into. */\n readonly redirectUri: string;\n\n /** OAuth client ID. */\n readonly clientId: string;\n\n /**\n * Base URL for InstantDB’s REST API.\n * Defaults to `https://api.instantdb.com`.\n */\n readonly apiURI: string;\n\n constructor(config: OAuthHandlerConfig) {\n this.redirectUri = config.redirectUri;\n this.apiURI = config.apiURI ?? 'https://api.instantdb.com';\n this.clientId = config.clientId;\n }\n\n /**\n * **Client-only flow** using PKCE (no client-secret required).\n * Opens a popup to start the OAuth flow.\n * Returns an {@link InstantDBOAuthAccessToken}.\n * *Refresh tokens are **not** available in this flow.*\n *\n * @example\n * const oauthHandler = new OAuthHandler({\n * clientId: YOUR_CLIENT_ID,\n * redirectUri: YOUR_REDIRECT_URI,\n * });\n *\n * function ConnectToInstant() {\n * const handleConnect = async () => {\n * try {\n * const token = await oauthHandler.startClientOnlyFlow(['apps-write']);\n * console.log('success!', token)\n * } catch (e) {\n * console.log('OAuth flow failed', e);\n * }\n * }\n * return <button onClick={handleConnect}>Connect to Instant</button>\n * }\n */\n startClientOnlyFlow(\n scopes: OAuthScope[],\n ): Promise<InstantDBOAuthAccessToken> {\n return startInstantOAuthClientOnlyFlow({\n clientId: this.clientId,\n apiURI: this.apiURI,\n redirectUri: this.redirectUri,\n scopes,\n });\n }\n\n /**\n * Call from the page served at {@link OAuthHandlerConfig.redirectUri}.\n * Parses `state` & `code` from the URL, exchanges them for an access token,\n * then automatically closes the popup/window.\n *\n * @example\n * ```tsx\n * const oauthHandler = new OAuthHandler({\n * clientId: YOUR_CLIENT_ID,\n * redirectUri: YOUR_REDIRECT_URI,\n * })\n *\n * function RedirectPage() {\n * useEffect(() => {\n * return oauthHandler.handleClientRedirect();\n * }, []);\n * return <div>Loading…</div>;\n * }\n * ```\n */\n handleClientRedirect(): () => void {\n return handleClientRedirect();\n }\n}\n"]}
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/oauth.ts"],"names":[],"mappings":"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","sourcesContent":["import { version as coreVersion } from '@instantdb/core';\nimport { pkceVerifier, pkceCodeChallengeOfVerifier } from './crypto.ts';\nimport { InstantOAuthError, OAuthScope } from './oauthCommon.ts';\nimport version from './version.ts';\n\nexport type InstantDBOAuthAccessToken = {\n /**\n * Token that can be used to access the Instant platform API on behalf of a user\n */\n token: string;\n /**\n * The date when the token expires (2 weeks from when it was issued by default)\n */\n expiresAt: Date;\n};\n\nfunction getWindowOpts(): string {\n const windowWidth = Math.min(800, Math.floor(window.outerWidth * 0.8));\n const windowHeight = Math.min(630, Math.floor(window.outerHeight * 0.5));\n const windowArea = {\n width: windowWidth,\n height: windowHeight,\n left: Math.round(window.screenX + (window.outerWidth - windowWidth) / 2),\n top: Math.round(window.screenY + (window.outerHeight - windowHeight) / 8),\n };\n\n const opts: Record<string, number | string> = {\n width: windowArea.width,\n height: windowArea.height,\n left: windowArea.left,\n top: windowArea.top,\n toolbar: 0,\n scrollbars: 1,\n status: 1,\n resizable: 1,\n menuBar: 0,\n rel: 'opener',\n };\n\n return Object.keys(opts)\n .map((k) => `${k}=${opts[k]}`)\n .join(',');\n}\n\nlet AUTH_WINDOW: null | Window = null;\n\nfunction oAuthStartUrl({\n clientId,\n state,\n codeChallenge,\n apiURI,\n redirectUri,\n scopes,\n}: {\n clientId: string;\n state: string;\n codeChallenge: string;\n apiURI: string;\n redirectUri: string;\n scopes: string[];\n}): string {\n const oauthUrl = new URL(`${apiURI}/platform/oauth/start`);\n oauthUrl.searchParams.set('client_id', clientId);\n oauthUrl.searchParams.set('redirect_uri', redirectUri);\n oauthUrl.searchParams.set('scope', scopes.join(' '));\n oauthUrl.searchParams.set('state', state);\n oauthUrl.searchParams.set('response_type', 'code');\n oauthUrl.searchParams.set('code_challenge', codeChallenge);\n oauthUrl.searchParams.set('code_challenge_method', 'S256');\n\n return oauthUrl.toString();\n}\n\nasync function exchangeCodeForToken({\n code,\n clientId,\n verifier,\n apiURI,\n redirectUri,\n}: {\n code: string;\n clientId: string;\n verifier: string;\n apiURI: string;\n redirectUri: string;\n}): Promise<InstantDBOAuthAccessToken> {\n const res = await fetch(`${apiURI}/platform/oauth/token`, {\n method: 'POST',\n headers: {\n 'Content-type': 'application/json',\n 'Instant-Platform-Version': version,\n 'Instant-Core-Version': coreVersion,\n },\n body: JSON.stringify({\n grant_type: 'authorization_code',\n code,\n redirect_uri: redirectUri,\n client_id: clientId,\n code_verifier: verifier,\n }),\n });\n\n if (!res.ok) {\n const text = await res.text();\n let error;\n\n try {\n const json = JSON.parse(text);\n error = {\n error: json.error,\n errorDescription: json.error_description,\n message: `OAuth error: ${json.error || 'server_error'}`,\n };\n } catch (e) {\n error = {\n error: 'server_error',\n message: 'OAuth error: server_error',\n };\n }\n\n throw new InstantOAuthError(error);\n }\n\n const json = (await res.json()) as {\n access_token: string;\n expires_in: number;\n };\n\n return {\n token: json.access_token,\n expiresAt: new Date(Date.now() + (json.expires_in - 30) * 1000),\n };\n}\n\nexport function handleClientRedirect() {\n if (typeof window === 'undefined') {\n throw new Error('This function may only be used in a browser context.');\n }\n\n const searchParams = new URL(window.location.href).searchParams;\n\n const state = searchParams.get('state');\n const error = searchParams.get('error');\n const errorDescription = searchParams.get('error_description');\n const code = searchParams.get('code');\n\n if (!state) {\n throw new Error('Invalid redirect. The state param is missing.');\n }\n\n const channel = new BroadcastChannel(state);\n channel.addEventListener('message', (event) => {\n if (event.data.type === 'oauth-redirect-window-done') {\n window.close();\n }\n });\n channel.postMessage({\n type: 'oauth-redirect',\n state,\n error,\n errorDescription,\n code,\n });\n\n return () => {\n channel.close();\n };\n}\n\nexport function startInstantOAuthClientOnlyFlow({\n clientId,\n apiURI,\n redirectUri,\n scopes,\n}: {\n clientId: string;\n apiURI: string;\n redirectUri: string;\n scopes: OAuthScope[];\n}): Promise<InstantDBOAuthAccessToken> {\n if (typeof window === 'undefined') {\n throw new Error('OAuth flow can only be started on the client.');\n }\n\n const existingAuthWindow = AUTH_WINDOW;\n\n if (existingAuthWindow) {\n existingAuthWindow.close();\n }\n\n const state = crypto.randomUUID();\n\n const verifier = pkceVerifier();\n\n const channel = new BroadcastChannel(state);\n\n const flowCompletePromise: Promise<InstantDBOAuthAccessToken> = new Promise(\n (resolve, reject) => {\n channel.addEventListener('message', async (event) => {\n if (event.data.type !== 'oauth-redirect') {\n return;\n }\n\n const {\n state: redirectState,\n error,\n code,\n errorDescription,\n } = event.data;\n\n if (!redirectState || redirectState !== state) {\n return;\n }\n\n if (code) {\n try {\n const token = await exchangeCodeForToken({\n clientId,\n code,\n verifier,\n apiURI,\n redirectUri,\n });\n resolve(token);\n } catch (e) {\n if (e instanceof InstantOAuthError) {\n reject(e);\n }\n reject(\n new InstantOAuthError({\n error: 'server_error',\n message: 'OAuth error exchanging code for token',\n }),\n );\n }\n } else if (typeof error === 'string') {\n reject(\n new InstantOAuthError({\n error,\n errorDescription,\n message: `OAuth error: ${error}`,\n }),\n );\n } else {\n reject(\n new InstantOAuthError({\n error: 'server_error',\n message: 'OAuth error: server_error',\n }),\n );\n }\n\n channel.postMessage({ type: 'oauth-redirect-window-done' });\n });\n },\n );\n\n const w = window.open(\n // Open window synchronously to prevent popup blocker\n '',\n // A unqiue name prevents orphaned popups from stealing our window.open\n `instantdb_oauth_${Math.random()}`.replace('.', ''),\n getWindowOpts(),\n );\n\n if (!w) {\n return Promise.reject({ error: 'Could not open Auth window' });\n }\n\n AUTH_WINDOW = w;\n\n pkceCodeChallengeOfVerifier(verifier).then((codeChallenge) => {\n const oauthUrl = oAuthStartUrl({\n clientId,\n state,\n codeChallenge,\n apiURI,\n redirectUri,\n scopes,\n });\n w.location.href = oauthUrl;\n });\n\n return flowCompletePromise.finally(() => channel.close());\n}\n\n/**\n * Configuration for {@link OAuthHandler}.\n */\nexport interface OAuthHandlerConfig {\n /**\n * Must exactly match one of the **Authorized Redirect URIs** in your OAuth\n * client settings on the Instant dashboard.\n */\n redirectUri: string;\n\n /** OAuth client ID from the Instant dashboard. */\n clientId: string;\n\n /**\n * Optional Instant API base-URL.\n * Defaults to `https://api.instantdb.com`.\n */\n apiURI?: string | null;\n}\n\n/**\n * Thin wrapper that drives InstantDB’s browser-only OAuth flow.\n */\nexport class OAuthHandler {\n /** Redirect URI that the provider will call back into. */\n readonly redirectUri: string;\n\n /** OAuth client ID. */\n readonly clientId: string;\n\n /**\n * Base URL for InstantDB’s REST API.\n * Defaults to `https://api.instantdb.com`.\n */\n readonly apiURI: string;\n\n constructor(config: OAuthHandlerConfig) {\n this.redirectUri = config.redirectUri;\n this.apiURI = config.apiURI ?? 'https://api.instantdb.com';\n this.clientId = config.clientId;\n }\n\n /**\n * **Client-only flow** using PKCE (no client-secret required).\n * Opens a popup to start the OAuth flow.\n * Returns an {@link InstantDBOAuthAccessToken}.\n * *Refresh tokens are **not** available in this flow.*\n *\n * @example\n * const oauthHandler = new OAuthHandler({\n * clientId: YOUR_CLIENT_ID,\n * redirectUri: YOUR_REDIRECT_URI,\n * });\n *\n * function ConnectToInstant() {\n * const handleConnect = async () => {\n * try {\n * const token = await oauthHandler.startClientOnlyFlow(['apps-write']);\n * console.log('success!', token)\n * } catch (e) {\n * console.log('OAuth flow failed', e);\n * }\n * }\n * return <button onClick={handleConnect}>Connect to Instant</button>\n * }\n */\n startClientOnlyFlow(\n scopes: OAuthScope[],\n ): Promise<InstantDBOAuthAccessToken> {\n return startInstantOAuthClientOnlyFlow({\n clientId: this.clientId,\n apiURI: this.apiURI,\n redirectUri: this.redirectUri,\n scopes,\n });\n }\n\n /**\n * Call from the page served at {@link OAuthHandlerConfig.redirectUri}.\n * Parses `state` & `code` from the URL, exchanges them for an access token,\n * then automatically closes the popup/window.\n *\n * @example\n * ```tsx\n * const oauthHandler = new OAuthHandler({\n * clientId: YOUR_CLIENT_ID,\n * redirectUri: YOUR_REDIRECT_URI,\n * })\n *\n * function RedirectPage() {\n * useEffect(() => {\n * return oauthHandler.handleClientRedirect();\n * }, []);\n * return <div>Loading…</div>;\n * }\n * ```\n */\n handleClientRedirect(): () => void {\n return handleClientRedirect();\n }\n}\n"]}
@@ -2,8 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.InstantOAuthError = void 0;
4
4
  class InstantOAuthError extends Error {
5
- error;
6
- errorDescription;
7
5
  constructor(config) {
8
6
  super(config.message);
9
7
  const actualProto = new.target.prototype;
@@ -1 +1 @@
1
- {"version":3,"file":"oauthCommon.js","sourceRoot":"","sources":["../../src/oauthCommon.ts"],"names":[],"mappings":";;;AAQA,MAAa,iBAAkB,SAAQ,KAAK;IAC1C,KAAK,CAAS;IACd,gBAAgB,CAA4B;IAE5C,YAAY,MAIX;QACC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEtB,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;QACzC,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC3C,CAAC;QAED,6DAA6D;QAC7D,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC5B,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAClD,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;QACtB,OAAO,iBAAiB,CAAC;IAC3B,CAAC;CACF;AA7BD,8CA6BC","sourcesContent":["export type OAuthScope =\n | 'apps-read'\n | 'apps-write'\n | 'data-read'\n | 'data-write'\n | 'storage-read'\n | 'storage-write';\n\nexport class InstantOAuthError extends Error {\n error: string;\n errorDescription: string | null | undefined;\n\n constructor(config: {\n message: string;\n error: string;\n errorDescription?: string | null | undefined;\n }) {\n super(config.message);\n\n const actualProto = new.target.prototype;\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(this, actualProto);\n }\n\n // Maintain proper stack trace for where our error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, InstantOAuthError);\n }\n\n this.name = 'InstantOAuthError';\n this.error = config.error;\n this.errorDescription = config.errorDescription;\n }\n\n get [Symbol.toStringTag]() {\n return 'InstantAPIError';\n }\n}\n"]}
1
+ {"version":3,"file":"oauthCommon.js","sourceRoot":"","sources":["../../src/oauthCommon.ts"],"names":[],"mappings":";;;AAQA,MAAa,iBAAkB,SAAQ,KAAK;IAI1C,YAAY,MAIX;QACC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEtB,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;QACzC,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC3C,CAAC;QAED,6DAA6D;QAC7D,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC5B,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAClD,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;QACtB,OAAO,iBAAiB,CAAC;IAC3B,CAAC;CACF;AA7BD,8CA6BC","sourcesContent":["export type OAuthScope =\n | 'apps-read'\n | 'apps-write'\n | 'data-read'\n | 'data-write'\n | 'storage-read'\n | 'storage-write';\n\nexport class InstantOAuthError extends Error {\n error: string;\n errorDescription: string | null | undefined;\n\n constructor(config: {\n message: string;\n error: string;\n errorDescription?: string | null | undefined;\n }) {\n super(config.message);\n\n const actualProto = new.target.prototype;\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(this, actualProto);\n }\n\n // Maintain proper stack trace for where our error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, InstantOAuthError);\n }\n\n this.name = 'InstantOAuthError';\n this.error = config.error;\n this.errorDescription = config.errorDescription;\n }\n\n get [Symbol.toStringTag]() {\n return 'InstantAPIError';\n }\n}\n"]}
@@ -25,7 +25,7 @@ function generatePermsTypescriptFile(permsCode, instantModuleName) {
25
25
  `.trim();
26
26
  return `// Docs: https://www.instantdb.com/docs/permissions
27
27
 
28
- import type { InstantRules } from "${instantModuleName ?? '@instantdb/core'}";
28
+ import type { InstantRules } from "${instantModuleName !== null && instantModuleName !== void 0 ? instantModuleName : '@instantdb/core'}";
29
29
 
30
30
  const rules = ${rulesTxt} satisfies InstantRules;
31
31
 
@@ -1 +1 @@
1
- {"version":3,"file":"perms.js","sourceRoot":"","sources":["../../src/perms.ts"],"names":[],"mappings":";;AAAA,kEAmCC;AAnCD,SAAgB,2BAA2B,CACzC,SAAqC,EACrC,iBAAyB;IAEzB,MAAM,QAAQ,GACZ,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM;QACxC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpC,CAAC,CAAC;;;;;;;;;;;;;;;;;;CAkBP,CAAC,IAAI,EAAE,CAAC;IAEP,OAAO;;qCAE4B,iBAAiB,IAAI,iBAAiB;;gBAE3D,QAAQ;;;CAGvB,CAAC;AACF,CAAC","sourcesContent":["export function generatePermsTypescriptFile(\n permsCode: null | Record<string, any>,\n instantModuleName: string,\n) {\n const rulesTxt =\n permsCode && Object.keys(permsCode).length\n ? JSON.stringify(permsCode, null, 2)\n : `{\n /**\n * Welcome to Instant's permission system!\n * Right now your rules are empty. To start filling them in, check out the docs:\n * https://www.instantdb.com/docs/permissions\n *\n * Here's an example to give you a feel:\n * posts: {\n * allow: {\n * view: \"true\",\n * create: \"isOwner\",\n * update: \"isOwner\",\n * delete: \"isOwner\",\n * },\n * bind: [\"isOwner\", \"auth.id != null && auth.id == data.ownerId\"],\n * },\n */\n}\n`.trim();\n\n return `// Docs: https://www.instantdb.com/docs/permissions\n\nimport type { InstantRules } from \"${instantModuleName ?? '@instantdb/core'}\";\n\nconst rules = ${rulesTxt} satisfies InstantRules;\n\nexport default rules;\n`;\n}\n"]}
1
+ {"version":3,"file":"perms.js","sourceRoot":"","sources":["../../src/perms.ts"],"names":[],"mappings":";;AAAA,kEAmCC;AAnCD,SAAgB,2BAA2B,CACzC,SAAqC,EACrC,iBAAyB;IAEzB,MAAM,QAAQ,GACZ,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM;QACxC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpC,CAAC,CAAC;;;;;;;;;;;;;;;;;;CAkBP,CAAC,IAAI,EAAE,CAAC;IAEP,OAAO;;qCAE4B,iBAAiB,aAAjB,iBAAiB,cAAjB,iBAAiB,GAAI,iBAAiB;;gBAE3D,QAAQ;;;CAGvB,CAAC;AACF,CAAC","sourcesContent":["export function generatePermsTypescriptFile(\n permsCode: null | Record<string, any>,\n instantModuleName: string,\n) {\n const rulesTxt =\n permsCode && Object.keys(permsCode).length\n ? JSON.stringify(permsCode, null, 2)\n : `{\n /**\n * Welcome to Instant's permission system!\n * Right now your rules are empty. To start filling them in, check out the docs:\n * https://www.instantdb.com/docs/permissions\n *\n * Here's an example to give you a feel:\n * posts: {\n * allow: {\n * view: \"true\",\n * create: \"isOwner\",\n * update: \"isOwner\",\n * delete: \"isOwner\",\n * },\n * bind: [\"isOwner\", \"auth.id != null && auth.id == data.ownerId\"],\n * },\n */\n}\n`.trim();\n\n return `// Docs: https://www.instantdb.com/docs/permissions\n\nimport type { InstantRules } from \"${instantModuleName ?? '@instantdb/core'}\";\n\nconst rules = ${rulesTxt} satisfies InstantRules;\n\nexport default rules;\n`;\n}\n"]}
@@ -13,7 +13,8 @@ exports.attrRevName = attrRevName;
13
13
  exports.generateSchemaTypescriptFile = generateSchemaTypescriptFile;
14
14
  const util_ts_1 = require("./util.js");
15
15
  function attrDefToCodeString([name, attr]) {
16
- const type = attr.metadata.derivedType?.type || attr.valueType || 'any';
16
+ var _a;
17
+ const type = ((_a = attr.metadata.derivedType) === null || _a === void 0 ? void 0 : _a.type) || attr.valueType || 'any';
17
18
  const unique = attr.config.unique ? '.unique()' : '';
18
19
  const index = attr.config.indexed ? '.indexed()' : '';
19
20
  const required = attr.required ? '' : '.optional()';
@@ -34,16 +35,20 @@ function identName(ident) {
34
35
  return `${identEtype(ident)}.${identLabel(ident)}`;
35
36
  }
36
37
  function attrFwdLabel(attr) {
37
- return attr['forward-identity']?.[2];
38
+ var _a;
39
+ return (_a = attr['forward-identity']) === null || _a === void 0 ? void 0 : _a[2];
38
40
  }
39
41
  function attrFwdEtype(attr) {
40
- return attr['forward-identity']?.[1];
42
+ var _a;
43
+ return (_a = attr['forward-identity']) === null || _a === void 0 ? void 0 : _a[1];
41
44
  }
42
45
  function attrRevLabel(attr) {
43
- return attr['reverse-identity']?.[2];
46
+ var _a;
47
+ return (_a = attr['reverse-identity']) === null || _a === void 0 ? void 0 : _a[2];
44
48
  }
45
49
  function attrRevEtype(attr) {
46
- return attr['reverse-identity']?.[1];
50
+ var _a;
51
+ return (_a = attr['reverse-identity']) === null || _a === void 0 ? void 0 : _a[1];
47
52
  }
48
53
  function attrFwdName(attr) {
49
54
  return `${attrFwdEtype(attr)}.${attrFwdLabel(attr)}`;
@@ -80,12 +85,13 @@ function roomsCodeStr(rooms) {
80
85
  return ret;
81
86
  }
82
87
  function generateSchemaTypescriptFile(prevSchema, newSchema, instantModuleName) {
88
+ var _a;
83
89
  // entities
84
90
  const entitiesEntriesCode = (0, util_ts_1.joinWithTrailingSep)((0, util_ts_1.sortedEntries)(newSchema.entities).map(([etype, entityDef]) => entityDefToCodeStr(etype, entityDef)), ',\n', ',');
85
91
  const inferredAttrs = [];
86
92
  for (const entity of Object.values(newSchema.entities)) {
87
93
  for (const attr of Object.values(entity.attrs)) {
88
- if (attr.metadata.derivedType?.origin === 'inferred') {
94
+ if (((_a = attr.metadata.derivedType) === null || _a === void 0 ? void 0 : _a.origin) === 'inferred') {
89
95
  inferredAttrs.push(attr);
90
96
  }
91
97
  }
@@ -98,7 +104,7 @@ function generateSchemaTypescriptFile(prevSchema, newSchema, instantModuleName)
98
104
  : '';
99
105
  const linksEntriesCode = JSON.stringify(newSchema.links, null, 2).trim();
100
106
  // rooms
101
- const rooms = prevSchema?.rooms || {};
107
+ const rooms = (prevSchema === null || prevSchema === void 0 ? void 0 : prevSchema.rooms) || {};
102
108
  const roomsCode = roomsCodeStr(rooms);
103
109
  const kv = (k, v, comment) => {
104
110
  const res = comment ? `${comment}\n${k}: ${v}` : `${k}: ${v}`;
@@ -106,7 +112,7 @@ function generateSchemaTypescriptFile(prevSchema, newSchema, instantModuleName)
106
112
  };
107
113
  const code = `// Docs: https://www.instantdb.com/docs/modeling-data
108
114
 
109
- import { i } from "${instantModuleName ?? '@instantdb/core'}";
115
+ import { i } from "${instantModuleName !== null && instantModuleName !== void 0 ? instantModuleName : '@instantdb/core'}";
110
116
 
111
117
  const _schema = i.schema({
112
118
  ${kv('entities', entitiesObjCode, entitiesComment)},