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