@instantdb/platform 0.22.99-experimental.add-user-perm-rules.20792844601.1 → 0.22.99
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/.turbo/turbo-build.log +8 -8
- package/dist/commonjs/ProgressPromise.js +45 -58
- package/dist/commonjs/ProgressPromise.js.map +1 -1
- package/dist/commonjs/api.js +366 -412
- package/dist/commonjs/api.js.map +1 -1
- package/dist/commonjs/migrationUtils.js +16 -4
- package/dist/commonjs/migrationUtils.js.map +1 -1
- package/dist/commonjs/migrations.js +10 -21
- package/dist/commonjs/migrations.js.map +1 -1
- package/dist/commonjs/oauth.js +52 -55
- package/dist/commonjs/oauth.js.map +1 -1
- package/dist/commonjs/oauthCommon.js +2 -0
- package/dist/commonjs/oauthCommon.js.map +1 -1
- package/dist/commonjs/perms.js +1 -1
- package/dist/commonjs/perms.js.map +1 -1
- package/dist/commonjs/schema.js +8 -14
- package/dist/commonjs/schema.js.map +1 -1
- package/dist/commonjs/serverOAuth.js +55 -68
- package/dist/commonjs/serverOAuth.js.map +1 -1
- package/dist/commonjs/typescript-schema.js +1 -2
- package/dist/commonjs/typescript-schema.js.map +1 -1
- package/dist/commonjs/util.js +1 -1
- package/dist/commonjs/util.js.map +1 -1
- package/dist/esm/ProgressPromise.js +45 -58
- package/dist/esm/ProgressPromise.js.map +1 -1
- package/dist/esm/api.js +366 -412
- package/dist/esm/api.js.map +1 -1
- package/dist/esm/migrationUtils.js +16 -4
- package/dist/esm/migrationUtils.js.map +1 -1
- package/dist/esm/migrations.js +10 -21
- package/dist/esm/migrations.js.map +1 -1
- package/dist/esm/oauth.js +52 -55
- package/dist/esm/oauth.js.map +1 -1
- package/dist/esm/oauthCommon.js +2 -0
- package/dist/esm/oauthCommon.js.map +1 -1
- package/dist/esm/perms.js +1 -1
- package/dist/esm/perms.js.map +1 -1
- package/dist/esm/schema.js +8 -14
- package/dist/esm/schema.js.map +1 -1
- package/dist/esm/serverOAuth.js +55 -68
- package/dist/esm/serverOAuth.js.map +1 -1
- package/dist/esm/typescript-schema.js +1 -2
- package/dist/esm/typescript-schema.js.map +1 -1
- package/dist/esm/util.js +1 -1
- package/dist/esm/util.js.map +1 -1
- package/dist/standalone/index.js +690 -660
- package/dist/standalone/index.umd.cjs +16 -16
- 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"]}
|
package/dist/esm/oauth.js
CHANGED
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
1
|
import { version as coreVersion } from '@instantdb/core';
|
|
11
2
|
import { pkceVerifier, pkceCodeChallengeOfVerifier } from "./crypto.js";
|
|
12
3
|
import { InstantOAuthError } from "./oauthCommon.js";
|
|
@@ -48,48 +39,46 @@ function oAuthStartUrl({ clientId, state, codeChallenge, apiURI, redirectUri, sc
|
|
|
48
39
|
oauthUrl.searchParams.set('code_challenge_method', 'S256');
|
|
49
40
|
return oauthUrl.toString();
|
|
50
41
|
}
|
|
51
|
-
function exchangeCodeForToken(
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}),
|
|
67
|
-
});
|
|
68
|
-
if (!res.ok) {
|
|
69
|
-
const text = yield res.text();
|
|
70
|
-
let error;
|
|
71
|
-
try {
|
|
72
|
-
const json = JSON.parse(text);
|
|
73
|
-
error = {
|
|
74
|
-
error: json.error,
|
|
75
|
-
errorDescription: json.error_description,
|
|
76
|
-
message: `OAuth error: ${json.error || 'server_error'}`,
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
catch (e) {
|
|
80
|
-
error = {
|
|
81
|
-
error: 'server_error',
|
|
82
|
-
message: 'OAuth error: server_error',
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
throw new InstantOAuthError(error);
|
|
86
|
-
}
|
|
87
|
-
const json = (yield res.json());
|
|
88
|
-
return {
|
|
89
|
-
token: json.access_token,
|
|
90
|
-
expiresAt: new Date(Date.now() + (json.expires_in - 30) * 1000),
|
|
91
|
-
};
|
|
42
|
+
async function exchangeCodeForToken({ code, clientId, verifier, apiURI, redirectUri, }) {
|
|
43
|
+
const res = await fetch(`${apiURI}/platform/oauth/token`, {
|
|
44
|
+
method: 'POST',
|
|
45
|
+
headers: {
|
|
46
|
+
'Content-type': 'application/json',
|
|
47
|
+
'Instant-Platform-Version': version,
|
|
48
|
+
'Instant-Core-Version': coreVersion,
|
|
49
|
+
},
|
|
50
|
+
body: JSON.stringify({
|
|
51
|
+
grant_type: 'authorization_code',
|
|
52
|
+
code,
|
|
53
|
+
redirect_uri: redirectUri,
|
|
54
|
+
client_id: clientId,
|
|
55
|
+
code_verifier: verifier,
|
|
56
|
+
}),
|
|
92
57
|
});
|
|
58
|
+
if (!res.ok) {
|
|
59
|
+
const text = await res.text();
|
|
60
|
+
let error;
|
|
61
|
+
try {
|
|
62
|
+
const json = JSON.parse(text);
|
|
63
|
+
error = {
|
|
64
|
+
error: json.error,
|
|
65
|
+
errorDescription: json.error_description,
|
|
66
|
+
message: `OAuth error: ${json.error || 'server_error'}`,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
catch (e) {
|
|
70
|
+
error = {
|
|
71
|
+
error: 'server_error',
|
|
72
|
+
message: 'OAuth error: server_error',
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
throw new InstantOAuthError(error);
|
|
76
|
+
}
|
|
77
|
+
const json = (await res.json());
|
|
78
|
+
return {
|
|
79
|
+
token: json.access_token,
|
|
80
|
+
expiresAt: new Date(Date.now() + (json.expires_in - 30) * 1000),
|
|
81
|
+
};
|
|
93
82
|
}
|
|
94
83
|
export function handleClientRedirect() {
|
|
95
84
|
if (typeof window === 'undefined') {
|
|
@@ -132,7 +121,7 @@ export function startInstantOAuthClientOnlyFlow({ clientId, apiURI, redirectUri,
|
|
|
132
121
|
const verifier = pkceVerifier();
|
|
133
122
|
const channel = new BroadcastChannel(state);
|
|
134
123
|
const flowCompletePromise = new Promise((resolve, reject) => {
|
|
135
|
-
channel.addEventListener('message', (event) =>
|
|
124
|
+
channel.addEventListener('message', async (event) => {
|
|
136
125
|
if (event.data.type !== 'oauth-redirect') {
|
|
137
126
|
return;
|
|
138
127
|
}
|
|
@@ -142,7 +131,7 @@ export function startInstantOAuthClientOnlyFlow({ clientId, apiURI, redirectUri,
|
|
|
142
131
|
}
|
|
143
132
|
if (code) {
|
|
144
133
|
try {
|
|
145
|
-
const token =
|
|
134
|
+
const token = await exchangeCodeForToken({
|
|
146
135
|
clientId,
|
|
147
136
|
code,
|
|
148
137
|
verifier,
|
|
@@ -175,7 +164,7 @@ export function startInstantOAuthClientOnlyFlow({ clientId, apiURI, redirectUri,
|
|
|
175
164
|
}));
|
|
176
165
|
}
|
|
177
166
|
channel.postMessage({ type: 'oauth-redirect-window-done' });
|
|
178
|
-
})
|
|
167
|
+
});
|
|
179
168
|
});
|
|
180
169
|
const w = window.open(
|
|
181
170
|
// Open window synchronously to prevent popup blocker
|
|
@@ -203,10 +192,18 @@ export function startInstantOAuthClientOnlyFlow({ clientId, apiURI, redirectUri,
|
|
|
203
192
|
* Thin wrapper that drives InstantDB’s browser-only OAuth flow.
|
|
204
193
|
*/
|
|
205
194
|
export class OAuthHandler {
|
|
195
|
+
/** Redirect URI that the provider will call back into. */
|
|
196
|
+
redirectUri;
|
|
197
|
+
/** OAuth client ID. */
|
|
198
|
+
clientId;
|
|
199
|
+
/**
|
|
200
|
+
* Base URL for InstantDB’s REST API.
|
|
201
|
+
* Defaults to `https://api.instantdb.com`.
|
|
202
|
+
*/
|
|
203
|
+
apiURI;
|
|
206
204
|
constructor(config) {
|
|
207
|
-
var _a;
|
|
208
205
|
this.redirectUri = config.redirectUri;
|
|
209
|
-
this.apiURI =
|
|
206
|
+
this.apiURI = config.apiURI ?? 'https://api.instantdb.com';
|
|
210
207
|
this.clientId = config.clientId;
|
|
211
208
|
}
|
|
212
209
|
/**
|
package/dist/esm/oauth.js.map
CHANGED
|
@@ -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"]}
|
package/dist/esm/oauthCommon.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauthCommon.js","sourceRoot":"","sources":["../../src/oauthCommon.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,iBAAkB,SAAQ,KAAK;
|
|
1
|
+
{"version":3,"file":"oauthCommon.js","sourceRoot":"","sources":["../../src/oauthCommon.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,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","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"]}
|
package/dist/esm/perms.js
CHANGED
|
@@ -22,7 +22,7 @@ export function generatePermsTypescriptFile(permsCode, instantModuleName) {
|
|
|
22
22
|
`.trim();
|
|
23
23
|
return `// Docs: https://www.instantdb.com/docs/permissions
|
|
24
24
|
|
|
25
|
-
import type { InstantRules } from "${instantModuleName
|
|
25
|
+
import type { InstantRules } from "${instantModuleName ?? '@instantdb/core'}";
|
|
26
26
|
|
|
27
27
|
const rules = ${rulesTxt} satisfies InstantRules;
|
|
28
28
|
|
package/dist/esm/perms.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"perms.js","sourceRoot":"","sources":["../../src/perms.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,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,
|
|
1
|
+
{"version":3,"file":"perms.js","sourceRoot":"","sources":["../../src/perms.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,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"]}
|
package/dist/esm/schema.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { indentLines, joinWithTrailingSep, sortedEntries, formatKey, } from "./util.js";
|
|
2
2
|
function attrDefToCodeString([name, attr]) {
|
|
3
|
-
|
|
4
|
-
const type = ((_a = attr.metadata.derivedType) === null || _a === void 0 ? void 0 : _a.type) || attr.valueType || 'any';
|
|
3
|
+
const type = attr.metadata.derivedType?.type || attr.valueType || 'any';
|
|
5
4
|
const unique = attr.config.unique ? '.unique()' : '';
|
|
6
5
|
const index = attr.config.indexed ? '.indexed()' : '';
|
|
7
6
|
const required = attr.required ? '' : '.optional()';
|
|
@@ -22,20 +21,16 @@ export function identName(ident) {
|
|
|
22
21
|
return `${identEtype(ident)}.${identLabel(ident)}`;
|
|
23
22
|
}
|
|
24
23
|
export function attrFwdLabel(attr) {
|
|
25
|
-
|
|
26
|
-
return (_a = attr['forward-identity']) === null || _a === void 0 ? void 0 : _a[2];
|
|
24
|
+
return attr['forward-identity']?.[2];
|
|
27
25
|
}
|
|
28
26
|
export function attrFwdEtype(attr) {
|
|
29
|
-
|
|
30
|
-
return (_a = attr['forward-identity']) === null || _a === void 0 ? void 0 : _a[1];
|
|
27
|
+
return attr['forward-identity']?.[1];
|
|
31
28
|
}
|
|
32
29
|
export function attrRevLabel(attr) {
|
|
33
|
-
|
|
34
|
-
return (_a = attr['reverse-identity']) === null || _a === void 0 ? void 0 : _a[2];
|
|
30
|
+
return attr['reverse-identity']?.[2];
|
|
35
31
|
}
|
|
36
32
|
export function attrRevEtype(attr) {
|
|
37
|
-
|
|
38
|
-
return (_a = attr['reverse-identity']) === null || _a === void 0 ? void 0 : _a[1];
|
|
33
|
+
return attr['reverse-identity']?.[1];
|
|
39
34
|
}
|
|
40
35
|
export function attrFwdName(attr) {
|
|
41
36
|
return `${attrFwdEtype(attr)}.${attrFwdLabel(attr)}`;
|
|
@@ -72,13 +67,12 @@ function roomsCodeStr(rooms) {
|
|
|
72
67
|
return ret;
|
|
73
68
|
}
|
|
74
69
|
export function generateSchemaTypescriptFile(prevSchema, newSchema, instantModuleName) {
|
|
75
|
-
var _a;
|
|
76
70
|
// entities
|
|
77
71
|
const entitiesEntriesCode = joinWithTrailingSep(sortedEntries(newSchema.entities).map(([etype, entityDef]) => entityDefToCodeStr(etype, entityDef)), ',\n', ',');
|
|
78
72
|
const inferredAttrs = [];
|
|
79
73
|
for (const entity of Object.values(newSchema.entities)) {
|
|
80
74
|
for (const attr of Object.values(entity.attrs)) {
|
|
81
|
-
if (
|
|
75
|
+
if (attr.metadata.derivedType?.origin === 'inferred') {
|
|
82
76
|
inferredAttrs.push(attr);
|
|
83
77
|
}
|
|
84
78
|
}
|
|
@@ -91,7 +85,7 @@ export function generateSchemaTypescriptFile(prevSchema, newSchema, instantModul
|
|
|
91
85
|
: '';
|
|
92
86
|
const linksEntriesCode = JSON.stringify(newSchema.links, null, 2).trim();
|
|
93
87
|
// rooms
|
|
94
|
-
const rooms =
|
|
88
|
+
const rooms = prevSchema?.rooms || {};
|
|
95
89
|
const roomsCode = roomsCodeStr(rooms);
|
|
96
90
|
const kv = (k, v, comment) => {
|
|
97
91
|
const res = comment ? `${comment}\n${k}: ${v}` : `${k}: ${v}`;
|
|
@@ -99,7 +93,7 @@ export function generateSchemaTypescriptFile(prevSchema, newSchema, instantModul
|
|
|
99
93
|
};
|
|
100
94
|
const code = `// Docs: https://www.instantdb.com/docs/modeling-data
|
|
101
95
|
|
|
102
|
-
import { i } from "${instantModuleName
|
|
96
|
+
import { i } from "${instantModuleName ?? '@instantdb/core'}";
|
|
103
97
|
|
|
104
98
|
const _schema = i.schema({
|
|
105
99
|
${kv('entities', entitiesObjCode, entitiesComment)},
|