@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
package/dist/esm/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n InstantAPIError,\n version as coreVersion,\n InstantRules,\n InstantSchemaDef,\n EntitiesDef,\n LinksDef,\n RoomsDef,\n InstantDBAttr,\n InstantDBIdent,\n InstantDBCheckedDataType,\n i,\n InstantDBInferredType,\n DataAttrDef,\n} from '@instantdb/core';\nimport version from './version.ts';\nimport {\n attrFwdLabel,\n attrFwdName,\n attrRevName,\n identName,\n InstantAPIPlatformSchema,\n InstantAPISchemaPlanStep,\n InstantAPISchemaPushStep,\n} from './schema.ts';\nimport { ProgressPromise } from './ProgressPromise.ts';\nimport {\n capitalizeFirstLetter,\n deriveClientType,\n rels,\n sortedEntries,\n} from './util.ts';\nimport { exchangeRefreshToken } from './serverOAuth.ts';\n\ntype Simplify<T> = {\n [K in keyof T]: T[K];\n} & {};\n\ntype AppDataOpts = {\n includePerms?: boolean | null | undefined;\n includeSchema?: boolean | null | undefined;\n};\n\ntype AppResponseJSON<Opts extends AppDataOpts | undefined> = Simplify<\n {\n id: string;\n title: string;\n created_at: Date;\n org_id: string | null;\n 'admin-token'?: string;\n } & (NonNullable<Opts>['includePerms'] extends true\n ? { perms: InstantRules }\n : {}) &\n (NonNullable<Opts>['includeSchema'] extends true\n ? {\n schema: InstantAPIPlatformSchema;\n }\n : {})\n>;\n\ntype OrgResponseJSON = {\n id: string;\n title: string;\n created_at: Date;\n};\n\nexport type InstantAPIAppDetails<Opts extends AppDataOpts | undefined> =\n Simplify<\n {\n id: string;\n title: string;\n createdAt: Date;\n orgId: string | null;\n } & (NonNullable<Opts>['includePerms'] extends true\n ? { perms: InstantRules }\n : {}) &\n (NonNullable<Opts>['includeSchema'] extends true\n ? {\n schema: InstantSchemaDef<\n EntitiesDef,\n LinksDef<EntitiesDef>,\n RoomsDef\n >;\n }\n : {})\n >;\n\nexport type InstantAPIOrgDetails = {\n id: string;\n title: string;\n createdAt: Date;\n};\n\nexport type InstantAPIGetAppResponse<Opts extends AppDataOpts> = Simplify<{\n app: InstantAPIAppDetails<Opts>;\n}>;\n\nexport type InstantAPIListAppsResponse<Opts extends AppDataOpts | undefined> =\n Simplify<{\n apps: InstantAPIAppDetails<Opts>[];\n }>;\n\nexport type InstantAPIListOrgsResponse = {\n orgs: InstantAPIOrgDetails[];\n};\n\nexport type InstantAPIGetAppSchemaResponse = {\n schema: InstantSchemaDef<EntitiesDef, LinksDef<EntitiesDef>, RoomsDef>;\n};\n\nexport type InstantAPIGetAppPermsResponse = { perms: InstantRules };\n\nexport type InstantAPICreateAppBody = {\n title: string;\n schema?:\n | InstantSchemaDef<EntitiesDef, LinksDef<EntitiesDef>, RoomsDef>\n | null\n | undefined;\n perms?: InstantRules | null | undefined;\n orgId?: string | null | undefined;\n};\n\nexport type InstantAPICreateTemporaryAppBody = {\n title: string;\n schema?:\n | InstantSchemaDef<EntitiesDef, LinksDef<EntitiesDef>, RoomsDef>\n | null\n | undefined;\n rules?: {\n code: InstantRules;\n } | null;\n};\n\nexport type InstantAPICreateTemporaryAppResponse = {\n app: Simplify<\n InstantAPIAppDetails<{ includePerms: false; includeSchema: false }> & {\n adminToken: string;\n }\n >;\n expiresMs: number;\n};\n\nexport type InstantAPICreateAppResponse = Simplify<{\n app: InstantAPIAppDetails<{ includePerms: true; includeSchema: true }> & {\n adminToken: string;\n };\n}>;\n\nexport type InstantAPIUpdateAppBody = { title: string };\n\nexport type InstantAPIUpdateAppResponse = Simplify<{\n app: InstantAPIAppDetails<{}>;\n}>;\n\nexport type InstantAPIDeleteAppResponse = Simplify<{\n app: InstantAPIAppDetails<{}>;\n}>;\n\nexport type InstantAPISchemaPushBody = {\n schema: InstantSchemaDef<EntitiesDef, LinksDef<EntitiesDef>, RoomsDef>;\n};\n\nexport type InstantAPIPushPermsBody = {\n perms: InstantRules;\n};\n\nexport type InstantAPIPushPermsResponse = {\n perms: InstantRules;\n};\n\nexport type InstantAPITokenInfoResponse = {\n expiresAt: Date;\n scopes: string;\n tokenType: 'Bearer';\n};\n\nexport type PlanStep =\n | ['add-attr', InstantDBAttr]\n | ['update-attr', Partial<InstantDBAttr>]\n | ['index', { 'attr-id': string; 'forward-identity': InstantDBIdent }]\n | ['remove-index', { 'attr-id': string; 'forward-identity': InstantDBIdent }]\n | ['unique', { 'attr-id': string; 'forward-identity': InstantDBIdent }]\n | ['remove-unique', { 'attr-id': string; 'forward-identity': InstantDBIdent }]\n | ['required', { 'attr-id': string; 'forward-identity': InstantDBIdent }]\n | [\n 'remove-required',\n { 'attr-id': string; 'forward-identity': InstantDBIdent },\n ]\n | [\n 'check-data-type',\n {\n 'attr-id': string;\n 'forward-identity': InstantDBIdent;\n 'checked-data-type': InstantDBCheckedDataType;\n },\n ]\n | [\n 'remove-data-type',\n { 'attr-id': string; 'forward-identity': InstantDBIdent },\n ]\n | ['delete-attr', string];\n\ntype PlanReponseJSON = {\n 'new-schema': InstantAPIPlatformSchema;\n 'current-schema': InstantAPIPlatformSchema;\n 'current-attrs': InstantDBAttr[];\n steps: PlanStep[];\n};\n\n// Same as PlanStep, but some background steps get a job-id\ntype StepWithJobId<T> = T extends ['add-attr', infer P]\n ? ['add-attr', P]\n : T extends ['update-attr', infer P]\n ? ['update-attr', P]\n : T extends [infer K, infer P]\n ? [K, P & { 'job-id': string }]\n : never;\n\ntype PushStep = StepWithJobId<PlanStep>;\n\ntype IndexingJobJSON = {\n id: string;\n app_id: string;\n group_id: string;\n attr_id: string;\n attr_name: string;\n job_type:\n | 'check-data-type'\n | 'remove-data-type'\n | 'index'\n | 'remove-index'\n | 'unique'\n | 'remove-unique'\n | 'required'\n | 'remove-required';\n job_status: 'waiting' | 'processing' | 'completed' | 'errored';\n work_estimate: number | null;\n work_completed: number | null;\n error:\n | 'invalid-triple-error'\n | 'invalid-attr-state-error'\n | 'triple-not-unique-error'\n | 'triple-too-large-error'\n | 'missing-required-error'\n | 'unexpected-error';\n checked_data_type?: InstantDBCheckedDataType;\n created_at: string;\n updated_at: string;\n done_at: string;\n invalid_unique_value: any;\n invalid_triples_sample: {\n entity_id: string;\n value: any;\n json_type:\n | 'string'\n | 'number'\n | 'boolean'\n | 'null'\n | 'object'\n | 'array'\n | 'date';\n }[];\n error_data: any;\n};\n\ntype SchemaPushResponseJSON = {\n 'indexing-jobs'?: {\n 'group-id': string;\n jobs: IndexingJobJSON[];\n } | null;\n steps: PushStep[];\n};\n\nexport type InstantAPIPlanSchemaPushResponse = {\n newSchema: InstantSchemaDef<EntitiesDef, LinksDef<EntitiesDef>, RoomsDef>;\n currentSchema: InstantSchemaDef<EntitiesDef, LinksDef<EntitiesDef>, RoomsDef>;\n steps: InstantAPISchemaPlanStep[];\n};\n\ntype InProgressStepsSummary = {\n friendlyDescription: string;\n totalCount: number;\n inProgressCount: number;\n completedCount: number;\n errorCount: number;\n steps: InstantAPISchemaPushStep[];\n inProgressSteps: InstantAPISchemaPushStep[];\n completedSteps: InstantAPISchemaPushStep[];\n erroredSteps: InstantAPISchemaPushStep[];\n};\n\nexport type InstantAPISchemaPushResponse = {\n newSchema: InstantSchemaDef<EntitiesDef, LinksDef<EntitiesDef>, RoomsDef>;\n steps: InstantAPISchemaPushStep[];\n summary: InProgressStepsSummary;\n};\n\nasync function jsonFetch<T>(\n input: RequestInfo,\n init: RequestInit | undefined,\n): Promise<T> {\n const headers = {\n ...(init?.headers || {}),\n 'Instant-Platform-Version': version,\n 'Instant-Core-Version': coreVersion,\n 'X-Instant-Source': 'platform-sdk',\n 'X-Instant-Version': version,\n };\n const res = await fetch(input, { ...init, headers });\n if (res.status === 200) {\n const json = await res.json();\n return Promise.resolve(json);\n }\n const body = await res.text();\n try {\n const json = JSON.parse(body);\n return Promise.reject(\n new InstantAPIError({ status: res.status, body: json }),\n );\n } catch (_e) {\n return Promise.reject(\n new InstantAPIError({\n status: res.status,\n body: { type: undefined, message: body },\n }),\n );\n }\n}\n\nfunction attrDefForType(\n type: InstantDBCheckedDataType | InstantDBInferredType | 'any',\n) {\n switch (type) {\n case 'string':\n return i.string();\n case 'any':\n return i.any();\n case 'json':\n return i.json();\n case 'boolean':\n return i.boolean();\n case 'date':\n return i.date();\n case 'number':\n return i.number();\n default: {\n const neverType: never = type;\n throw new Error(`Unknown type ${neverType}.`);\n }\n }\n}\n\ntype APISchemaConversionOpts = {\n disableTypeInference: boolean;\n};\n\nfunction apiSchemaAttrToDataAttrDef(\n attr: InstantDBAttr,\n opts?: APISchemaConversionOpts,\n) {\n const derivedType = deriveClientType(attr, opts?.disableTypeInference);\n let i: DataAttrDef<string, boolean, boolean> = attrDefForType(\n derivedType.type,\n );\n if (attr['unique?']) {\n i = i.unique();\n }\n if (attr['index?']) {\n i = i.indexed();\n }\n if (!attr['required?']) {\n i = i.optional();\n }\n i.metadata.derivedType = derivedType;\n return i;\n}\n\nfunction apiSchemaBlobToEntityDef(\n attrs: InstantAPIPlatformSchema['blobs'][string],\n opts?: APISchemaConversionOpts,\n) {\n const defs: Record<string, DataAttrDef<string, boolean, boolean>> = {};\n for (const [label, attr] of sortedEntries(attrs)) {\n if (label === 'id') {\n continue;\n }\n defs[label] = apiSchemaAttrToDataAttrDef(attr, opts);\n }\n return i.entity(defs);\n}\n\nfunction apiSchemaAttrToLinkName(attr: InstantDBAttr): string {\n const [, fe, flabel] = attr['forward-identity'];\n return `${fe}${capitalizeFirstLetter(flabel)}`;\n}\n\nfunction apiSchemaAttrToLinkDef(attr: InstantDBAttr) {\n const [, fe, flabel] = attr['forward-identity'];\n const [, re, rlabel] = attr['reverse-identity']!;\n const [fhas, rhas] = rels[`${attr.cardinality}-${attr['unique?']}`];\n return {\n forward: {\n on: fe,\n has: fhas,\n label: flabel,\n required: attr['required?'] || undefined,\n onDelete:\n attr['on-delete'] === 'cascade' ? ('cascade' as 'cascade') : undefined,\n },\n reverse: {\n on: re,\n has: rhas,\n label: rlabel,\n onDelete:\n attr['on-delete-reverse'] === 'cascade'\n ? ('cascade' as 'cascade')\n : undefined,\n },\n };\n}\n\nexport function apiSchemaToInstantSchemaDef(\n apiSchema: InstantAPIPlatformSchema,\n opts?: { disableTypeInference: boolean },\n): InstantSchemaDef<EntitiesDef, LinksDef<EntitiesDef>, RoomsDef> {\n const entities: EntitiesDef = {};\n for (const [etype, attrs] of sortedEntries(apiSchema.blobs)) {\n entities[etype] = apiSchemaBlobToEntityDef(attrs, opts);\n }\n const links: LinksDef<EntitiesDef> = {};\n for (const [_name, attr] of sortedEntries(apiSchema.refs)) {\n const link = apiSchemaAttrToLinkDef(attr);\n const linkName = apiSchemaAttrToLinkName(attr);\n links[linkName] = link;\n }\n\n return i.schema({ entities, links });\n}\n\nfunction coerceApp<Opts extends AppDataOpts>(\n app: AppResponseJSON<Opts>,\n): InstantAPIAppDetails<Opts> {\n const base = {\n id: app.id,\n title: app.title,\n createdAt: new Date(app.created_at),\n orgId: app.org_id,\n ...(app['admin-token'] ? { adminToken: app['admin-token'] } : {}),\n };\n\n // `in` narrows the union, so it’s safe to read `perms` / `schema`\n // when the property exists. :contentReference[oaicite:0]{index=0}\n const permsPart = (\n 'perms' in app ? { perms: app.perms } : {}\n ) as InstantAPIAppDetails<Opts>;\n\n const schemaPart = (\n 'schema' in app\n ? {\n schema: apiSchemaToInstantSchemaDef(\n app.schema as InstantAPIPlatformSchema,\n ),\n }\n : {}\n ) as InstantAPIAppDetails<Opts>;\n\n return { ...base, ...permsPart, ...schemaPart };\n}\n\nfunction coerceOrg(org: OrgResponseJSON): InstantAPIOrgDetails {\n return {\n id: org.id,\n title: org.title,\n createdAt: new Date(org.created_at),\n };\n}\n\nasync function getApps<Opts extends AppDataOpts>(\n apiURI: string,\n token: string,\n opts?: Opts,\n): Promise<InstantAPIListAppsResponse<Opts>> {\n const url = new URL(`${apiURI}/superadmin/apps`);\n const include = [];\n if (opts?.includePerms) {\n include.push('perms');\n }\n if (opts?.includeSchema) {\n include.push('schema');\n }\n\n if (include.length) {\n url.searchParams.set('include', include.join(','));\n }\n const resp = await jsonFetch<{ apps: AppResponseJSON<typeof opts>[] }>(\n url.toString(),\n {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${token}`,\n },\n },\n );\n\n return { apps: resp.apps.map(coerceApp) };\n}\n\nasync function getOrgs(\n apiURI: string,\n token: string,\n): Promise<InstantAPIListOrgsResponse> {\n const url = new URL(`${apiURI}/superadmin/orgs`);\n\n const resp = await jsonFetch<{ orgs: OrgResponseJSON[] }>(url.toString(), {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n return { orgs: resp.orgs.map(coerceOrg) };\n}\n\nasync function getAppsForOrg<Opts extends AppDataOpts>(\n apiURI: string,\n token: string,\n orgId: string,\n opts?: Opts,\n): Promise<InstantAPIListAppsResponse<Opts>> {\n const url = new URL(`${apiURI}/superadmin/orgs/${orgId}/apps`);\n const include = [];\n if (opts?.includePerms) {\n include.push('perms');\n }\n if (opts?.includeSchema) {\n include.push('schema');\n }\n\n if (include.length) {\n url.searchParams.set('include', include.join(','));\n }\n const resp = await jsonFetch<{ apps: AppResponseJSON<typeof opts>[] }>(\n url.toString(),\n {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${token}`,\n },\n },\n );\n\n return { apps: resp.apps.map(coerceApp) };\n}\n\nasync function getAppSchema(\n apiURI: string,\n token: string,\n appId: string,\n): Promise<InstantAPIGetAppSchemaResponse> {\n const { schema } = await jsonFetch<{ schema: InstantAPIPlatformSchema }>(\n `${apiURI}/superadmin/apps/${appId}/schema`,\n {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${token}`,\n },\n },\n );\n return { schema: apiSchemaToInstantSchemaDef(schema) };\n}\n\nasync function getAppPerms(\n apiURI: string,\n token: string,\n appId: string,\n): Promise<InstantAPIGetAppPermsResponse> {\n return await jsonFetch<InstantAPIGetAppPermsResponse>(\n `${apiURI}/superadmin/apps/${appId}/perms`,\n {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${token}`,\n },\n },\n );\n}\n\nasync function getApp<Opts extends AppDataOpts>(\n apiURI: string,\n token: string,\n appId: string,\n opts?: Opts,\n): Promise<Simplify<InstantAPIGetAppResponse<Opts>>> {\n let permsPromise: null | Promise<InstantAPIGetAppPermsResponse> = null;\n let schemaPromise: null | Promise<InstantAPIGetAppSchemaResponse> = null;\n if (opts?.includePerms) {\n permsPromise = getAppPerms(apiURI, token, appId);\n }\n if (opts?.includeSchema) {\n schemaPromise = getAppSchema(apiURI, token, appId);\n }\n\n const { app: apiApp } = await jsonFetch<{ app: AppResponseJSON<{}> }>(\n `${apiURI}/superadmin/apps/${appId}`,\n {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${token}`,\n },\n },\n );\n\n if (!permsPromise && !schemaPromise) {\n const app = coerceApp(apiApp) as InstantAPIAppDetails<{}>;\n return { app } as Simplify<InstantAPIGetAppResponse<Opts>>;\n }\n\n const app = {\n ...(coerceApp(apiApp) as unknown as Simplify<InstantAPIGetAppResponse<{}>>),\n ...(permsPromise ? { perms: (await permsPromise).perms } : {}),\n ...(schemaPromise ? { schema: (await schemaPromise).schema } : {}),\n } as unknown as InstantAPIAppDetails<Opts>;\n\n return {\n app,\n };\n}\n\nasync function createApp(\n apiURI: string,\n token: string,\n fields: InstantAPICreateAppBody,\n): Promise<InstantAPICreateAppResponse> {\n const apiFields: any = fields;\n apiFields.org_id = fields.orgId;\n\n const { app } = await jsonFetch<{\n app: AppResponseJSON<{ includePerms: true; includeSchema: true }> & {\n 'admin-token': string;\n };\n }>(`${apiURI}/superadmin/apps`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify(apiFields),\n });\n const withAdminToken = {\n ...coerceApp<{ includePerms: true; includeSchema: true }>(app),\n adminToken: app['admin-token'],\n };\n return {\n app: withAdminToken,\n };\n}\n\nasync function createTemporaryApp(\n apiURI: string,\n fields: InstantAPICreateTemporaryAppBody,\n): Promise<InstantAPICreateTemporaryAppResponse> {\n const response = await jsonFetch<{ app: any; expires_ms: number }>(\n `${apiURI}/dash/apps/ephemeral`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(fields),\n },\n );\n const withAdminToken = {\n ...coerceApp<{ includePerms: true; includeSchema: true }>(response.app),\n adminToken: response.app['admin-token'],\n };\n return {\n app: withAdminToken,\n expiresMs: response.expires_ms,\n };\n}\n\nasync function updateApp(\n apiURI: string,\n token: string,\n appId: string,\n fields: InstantAPIUpdateAppBody,\n): Promise<InstantAPIUpdateAppResponse> {\n const { app } = await jsonFetch<{ app: AppResponseJSON<{}> }>(\n `${apiURI}/superadmin/apps/${appId}`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify(fields),\n },\n );\n\n return { app: coerceApp(app) };\n}\n\nasync function deleteApp(\n apiURI: string,\n token: string,\n appId: string,\n): Promise<InstantAPIDeleteAppResponse> {\n const { app } = await jsonFetch<{ app: AppResponseJSON<{}> }>(\n `${apiURI}/superadmin/apps/${appId}`,\n {\n method: 'DELETE',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n },\n );\n return { app: coerceApp(app) };\n}\n\nfunction translatePlanStep(apiStep: PlanStep): InstantAPISchemaPlanStep {\n const [stepType, stepParams] = apiStep;\n\n switch (stepType) {\n case 'add-attr': {\n const attr = stepParams;\n const attrName = attrFwdName(attr);\n const friendlyDescription =\n attr['value-type'] === 'blob'\n ? attrFwdLabel(attr) === 'id'\n ? `Create new entity ${attrName}.`\n : `Add attribute ${attrName}.`\n : `Link ${attrName} to ${attrRevName(attr)}.`;\n return { type: 'add-attr', friendlyDescription, attr };\n }\n case 'update-attr': {\n const attr = stepParams as InstantDBAttr;\n return {\n type: 'update-attr',\n friendlyDescription: `Update attribute ${attrFwdName(attr)}.`,\n attr,\n };\n }\n case 'index': {\n return {\n type: 'index',\n friendlyDescription: `Add index to ${identName(stepParams['forward-identity'])}.`,\n attrId: stepParams['attr-id'],\n forwardIdentity: stepParams['forward-identity'],\n };\n }\n case 'remove-index': {\n return {\n type: 'remove-index',\n friendlyDescription: `Remove index from ${identName(stepParams['forward-identity'])}.`,\n attrId: stepParams['attr-id'],\n forwardIdentity: stepParams['forward-identity'],\n };\n }\n case 'unique': {\n return {\n type: 'unique',\n friendlyDescription: `Ensure that ${identName(stepParams['forward-identity'])} is unique.`,\n attrId: stepParams['attr-id'],\n forwardIdentity: stepParams['forward-identity'],\n };\n }\n case 'remove-unique': {\n return {\n type: 'remove-unique',\n friendlyDescription: `Remove uniqueness constarint from ${identName(stepParams['forward-identity'])}.`,\n attrId: stepParams['attr-id'],\n forwardIdentity: stepParams['forward-identity'],\n };\n }\n case 'required': {\n return {\n type: 'required',\n friendlyDescription: `Make ${identName(stepParams['forward-identity'])} a required attribute.`,\n attrId: stepParams['attr-id'],\n forwardIdentity: stepParams['forward-identity'],\n };\n }\n case 'remove-required': {\n return {\n type: 'remove-required',\n friendlyDescription: `Allow ${identName(stepParams['forward-identity'])} to be missing or null.`,\n attrId: stepParams['attr-id'],\n forwardIdentity: stepParams['forward-identity'],\n };\n }\n case 'check-data-type': {\n const forwardIdentity = stepParams['forward-identity'];\n const dataType = stepParams['checked-data-type'];\n return {\n type: 'check-data-type',\n friendlyDescription: `Enforce data type of ${identName(forwardIdentity)} as type ${dataType}.`,\n attrId: stepParams['attr-id'],\n forwardIdentity,\n checkedDataType: dataType,\n };\n }\n case 'remove-data-type': {\n const forwardIdentity = stepParams['forward-identity'];\n return {\n type: 'remove-data-type',\n friendlyDescription: `Stop enforcing data type of ${identName(forwardIdentity)}.`,\n attrId: stepParams['attr-id'],\n forwardIdentity: stepParams['forward-identity'],\n };\n }\n // This case will never actually run because /schema/push/plan doesn't detect deleted attrs\n case 'delete-attr': {\n return {\n type: 'delete-attr',\n attrId: stepParams,\n friendlyDescription: `Delete attribute ${stepParams}.`,\n };\n }\n default: {\n // Get a type error if we ignore a case\n const unknownType: never = stepType;\n throw new Error(`Uknown schema operation ${unknownType}.`);\n }\n }\n}\n\nexport function translatePlanSteps(\n apiSteps: PlanStep[],\n): InstantAPISchemaPlanStep[] {\n return apiSteps.map((step) => translatePlanStep(step));\n}\n\ntype PushObjOf<S extends PushStep> =\n // grab from the union the member whose discriminant matches S[0]\n Extract<InstantAPISchemaPushStep, { type: S[0] }>;\n\nfunction translatePushStep<S extends PushStep>(\n apiStep: S,\n jobs: IndexingJobJSON[],\n): PushObjOf<S> {\n const [stepType, stepParams] = apiStep;\n if (stepType === 'add-attr' || stepType === 'update-attr') {\n const planStep = translatePlanStep(apiStep);\n if (planStep.type !== 'add-attr' && planStep.type !== 'update-attr') {\n // This is just here for typescript\n throw new Error('Invalid step.');\n }\n return planStep as PushObjOf<S>;\n }\n const jobId = stepParams['job-id'];\n const job = jobs.find((j) => j.id === jobId)!;\n const planStep = translatePlanStep(apiStep);\n const backgroundJob = formatJob(job);\n\n if (planStep.type !== backgroundJob.type) {\n throw new Error('Invalid type');\n }\n\n return { ...planStep, backgroundJob } as PushObjOf<S>;\n}\n\nfunction translatePushSteps(\n apiSteps: PushStep[],\n jobs: IndexingJobJSON[],\n): InstantAPISchemaPushStep[] {\n return apiSteps.map((step) => translatePushStep(step, jobs));\n}\n\nasync function planSchemaPush(\n apiURI: string,\n token: string,\n appId: string,\n body: InstantAPISchemaPushBody,\n): Promise<InstantAPIPlanSchemaPushResponse> {\n const resp = await jsonFetch<PlanReponseJSON>(\n `${apiURI}/superadmin/apps/${appId}/schema/push/plan`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({\n ...body,\n check_types: true,\n supports_background_updates: true,\n }),\n },\n );\n\n return {\n newSchema: apiSchemaToInstantSchemaDef(resp['new-schema']),\n currentSchema: apiSchemaToInstantSchemaDef(resp['current-schema']),\n steps: translatePlanSteps(resp['steps']),\n };\n}\n\nfunction allJobsComplete(jobs: IndexingJobJSON[]): boolean {\n return !!jobs.find(\n (j) => j.job_status === 'completed' || j.job_status === 'errored',\n );\n}\n\nfunction latestJobUpdate(jobs: IndexingJobJSON[]): Date | null {\n const res = jobs.reduce((acc: Date | null, job) => {\n if (job.updated_at) {\n const d = new Date(job.updated_at);\n if (!acc || d > acc) {\n return d;\n }\n }\n return acc;\n }, null);\n return res;\n}\n\nasync function jobFetchLoop(\n apiURI: string,\n token: string,\n appId: string,\n groupId: string,\n startingJobs: IndexingJobJSON[],\n onFetch: (jobs: IndexingJobJSON[]) => void,\n): Promise<IndexingJobJSON[]> {\n let interval = 100;\n let lastJobs = startingJobs;\n let errorCount = 0;\n\n while (!allJobsComplete(lastJobs)) {\n await new Promise((resolve) => setTimeout(resolve, interval));\n try {\n const nextJobs = (\n await jsonFetch<{ jobs: IndexingJobJSON[] }>(\n `${apiURI}/dash/apps/${appId}/indexing-jobs/group/${groupId}`,\n {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${token}`,\n },\n },\n )\n ).jobs;\n onFetch(nextJobs);\n if (allJobsComplete(nextJobs)) {\n return nextJobs;\n }\n errorCount = 0;\n const lastUpdate = latestJobUpdate(lastJobs);\n const thisUpdate = latestJobUpdate(nextJobs);\n interval =\n thisUpdate === null || (lastUpdate && lastUpdate >= thisUpdate)\n ? Math.min(interval * 2, 10000)\n : 100;\n } catch (e) {\n if (errorCount > 3) {\n throw e;\n } else {\n errorCount++;\n interval = Math.min(interval * 2, 10000);\n }\n }\n }\n\n return lastJobs;\n}\n\ntype InstantBackgroundSchemaBaseJob = {\n id: string;\n createdAt: Date;\n updatedAt: Date;\n status: 'completed' | 'waiting' | 'processing' | 'errored';\n workEstimate: number | null;\n workCompleted: number | null;\n error?:\n | 'invalid-triple-error'\n | 'invalid-attr-state-error'\n | 'triple-not-unique-error'\n | 'triple-too-large-error'\n | 'missing-required-error'\n | 'unexpected-error';\n invalidTriplesSample?: {\n entityId: string;\n value: any;\n jsonType:\n | 'string'\n | 'number'\n | 'boolean'\n | 'null'\n | 'object'\n | 'array'\n | 'date';\n }[];\n};\n\nexport interface InstantBackgroundSchemaRemoveDataTypeJob\n extends InstantBackgroundSchemaBaseJob {\n type: 'remove-data-type';\n}\n\nexport interface InstantBackgroundSchemaCheckDataTypeJob\n extends InstantBackgroundSchemaBaseJob {\n type: 'check-data-type';\n checkedDataType: InstantDBCheckedDataType;\n}\n\nexport interface InstantBackgroundSchemaAddIndexJob\n extends InstantBackgroundSchemaBaseJob {\n type: 'index';\n}\n\nexport interface InstantBackgroundSchemaRemoveIndexJob\n extends InstantBackgroundSchemaBaseJob {\n type: 'remove-index';\n}\n\nexport interface InstantBackgroundSchemaAddUniqueJob\n extends InstantBackgroundSchemaBaseJob {\n type: 'unique';\n invalidUniqueValue?: any;\n}\n\nexport interface InstantBackgroundSchemaRemoveUniqueJob\n extends InstantBackgroundSchemaBaseJob {\n type: 'remove-unique';\n}\n\nexport interface InstantBackgroundSchemaAddRequiredJob\n extends InstantBackgroundSchemaBaseJob {\n type: 'required';\n}\n\nexport interface InstantBackgroundSchemaRemoveRequiredJob\n extends InstantBackgroundSchemaBaseJob {\n type: 'remove-required';\n}\n\nexport type InstantBackgroundSchemaJob =\n | InstantBackgroundSchemaRemoveDataTypeJob\n | InstantBackgroundSchemaCheckDataTypeJob\n | InstantBackgroundSchemaAddIndexJob\n | InstantBackgroundSchemaRemoveIndexJob\n | InstantBackgroundSchemaAddUniqueJob\n | InstantBackgroundSchemaRemoveUniqueJob\n | InstantBackgroundSchemaAddRequiredJob\n | InstantBackgroundSchemaRemoveRequiredJob;\n\nfunction formatJob(job: IndexingJobJSON): InstantBackgroundSchemaJob {\n const baseJob: InstantBackgroundSchemaBaseJob = {\n id: job.id,\n createdAt: new Date(job.created_at),\n updatedAt: new Date(job.updated_at),\n status: job.job_status,\n workEstimate: job.work_estimate,\n workCompleted: job.work_completed,\n error: job.error,\n invalidTriplesSample: job.invalid_triples_sample?.map((s) => {\n return { entityId: s.entity_id, value: s.value, jsonType: s.json_type };\n }),\n };\n switch (job.job_type) {\n case 'remove-data-type':\n case 'index':\n case 'remove-index':\n case 'required':\n case 'remove-required':\n case 'remove-unique': {\n return { ...baseJob, type: job.job_type };\n }\n case 'check-data-type': {\n return {\n ...baseJob,\n type: job.job_type,\n checkedDataType: job.checked_data_type!,\n };\n }\n case 'unique': {\n return {\n ...baseJob,\n type: job.job_type,\n invalidUniqueValue: job.invalid_unique_value,\n };\n }\n default: {\n const neverType: never = job.job_type;\n throw new Error(`Unknown job type: ${neverType}.`);\n }\n }\n}\n\nfunction stepSummary(\n steps: InstantAPISchemaPushStep[],\n): InProgressStepsSummary {\n const inProgress = steps.filter(\n (s) =>\n 'backgroundJob' in s &&\n (s.backgroundJob.status === 'processing' ||\n s.backgroundJob.status === 'waiting'),\n );\n const completed = steps.filter(\n (s) => !('backgroundJob' in s) || s.backgroundJob.status === 'completed',\n );\n const errored = steps.filter(\n (s) => 'backgroundJob' in s && s.backgroundJob.status === 'errored',\n );\n return {\n friendlyDescription: inProgress.length\n ? `Completing ${inProgress.length} of ${steps.length} schema operations.`\n : `Finished ${steps.length} schema operation${steps.length === 1 ? '' : 's'}${\n errored.length\n ? `, with ${errored.length} error${errored.length > 1 ? 's' : ''}`\n : '.'\n }`,\n totalCount: steps.length,\n inProgressCount: inProgress.length,\n completedCount: completed.length,\n errorCount: errored.length,\n steps,\n inProgressSteps: inProgress,\n completedSteps: completed,\n erroredSteps: errored,\n };\n}\n\nfunction schemaPush(\n apiURI: string,\n token: string,\n appId: string,\n body: InstantAPISchemaPushBody,\n): ProgressPromise<InProgressStepsSummary, InstantAPISchemaPushResponse> {\n return new ProgressPromise(async (progress, resolve, reject) => {\n try {\n const resp = await jsonFetch<SchemaPushResponseJSON>(\n `${apiURI}/superadmin/apps/${appId}/schema/push/apply`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({\n ...body,\n check_types: true,\n supports_background_updates: true,\n }),\n },\n );\n\n const indexingJobs = resp['indexing-jobs'];\n\n const jobs = !indexingJobs\n ? []\n : await jobFetchLoop(\n apiURI,\n token,\n appId,\n indexingJobs['group-id'],\n indexingJobs['jobs'],\n (jobs) => {\n progress(stepSummary(translatePushSteps(resp.steps, jobs)));\n },\n );\n\n const schemaRes = await getAppSchema(apiURI, token, appId);\n resolve({\n newSchema: schemaRes.schema,\n steps: translatePushSteps(resp.steps, jobs),\n summary: stepSummary(translatePushSteps(resp.steps, jobs)),\n });\n } catch (e) {\n reject(e as Error);\n }\n });\n}\n\nasync function pushPerms(\n apiURI: string,\n token: string,\n appId: string,\n body: InstantAPIPushPermsBody,\n): Promise<InstantAPIPushPermsResponse> {\n const result = await jsonFetch<{ rules: { code: InstantRules } }>(\n `${apiURI}/superadmin/apps/${appId}/perms`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({ code: body.perms }),\n },\n );\n\n return { perms: result.rules.code };\n}\n\nasync function tokenInfo(\n apiURI: string,\n token: string,\n): Promise<InstantAPITokenInfoResponse> {\n const result = await jsonFetch<{\n expires_in: number;\n scopes: string;\n token_type: 'Bearer';\n }>(`${apiURI}/platform/oauth/token-info?access_token=${token}`, {\n method: 'GET',\n });\n\n return {\n tokenType: result.token_type,\n scopes: result.scopes,\n expiresAt: new Date(Date.now() + (result.expires_in - 60) * 1000),\n };\n}\n\nexport type PlatformApiAuth =\n | {\n token: string;\n }\n | {\n accessToken: string;\n refreshToken: string;\n clientId: string;\n clientSecret: string;\n onRefresh?: (tokenInfo: {\n accessToken: string;\n expiresAt: Date;\n }) => Promise<void>;\n };\n\nexport type PlatformApiConfig = {\n auth?: PlatformApiAuth;\n apiURI?: string;\n};\n\nexport class PlatformApiMissingAuthError extends Error {\n constructor() {\n super('PlatformApi was not provided auth.');\n }\n}\n\n/**\n * API methods for the Platform API\n *\n * Usage:\n *\n * ```ts\n * import { PlatformApi } from '@instantdb/platform';\n *\n * const api = new PlatformApi({ auth: { token: 'oauth-access-token' } });\n * const { apps } = await api.getApps({\n * includeSchema: true,\n * includePerms: true,\n * });\n * ```\n */\nexport class PlatformApi {\n #auth: PlatformApiAuth | undefined;\n #apiURI: string;\n\n /**\n * @param config – Runtime configuration.\n * @param config.auth.token – OAuth access-token obtained via the oauth flow\n * or a personal access token.\n * @throws {Error} When `token` is missing.\n */\n constructor(config?: PlatformApiConfig) {\n this.#auth = config?.auth;\n this.#apiURI = config?.apiURI || 'https://api.instantdb.com';\n }\n\n token(): string {\n if (!this.#auth) {\n throw new PlatformApiMissingAuthError();\n }\n if ('token' in this.#auth) {\n return this.#auth.token;\n }\n return this.#auth.accessToken;\n }\n\n canRefreshToken(): boolean {\n if (!this.#auth) {\n throw new PlatformApiMissingAuthError();\n }\n return (\n 'refreshToken' in this.#auth &&\n 'clientId' in this.#auth &&\n 'clientSecret' in this.#auth &&\n this.#auth.refreshToken != null &&\n this.#auth.clientId != null &&\n this.#auth.clientSecret != null\n );\n }\n\n async refreshToken(): Promise<null | {\n accessToken: string;\n expiresAt: Date;\n }> {\n if (!this.#auth) {\n throw new PlatformApiMissingAuthError();\n }\n if (\n !this.canRefreshToken() ||\n // Checked in canRefreshToken, but this lets\n // typescript refine this.#auth here\n !('clientId' in this.#auth)\n ) {\n return null;\n }\n const token = await exchangeRefreshToken({\n apiURI: this.#apiURI,\n clientId: this.#auth.clientId,\n clientSecret: this.#auth.clientSecret,\n refreshToken: this.#auth.refreshToken,\n });\n this.#auth.accessToken = token.accessToken;\n if (this.#auth.onRefresh) {\n await this.#auth.onRefresh(token);\n }\n return token;\n }\n\n async withRetry<F extends (...args: any[]) => any>(\n f: F,\n args: Parameters<F>,\n ) {\n let attempt = 0;\n const [apiURI, tokenInArg, ...restArgs] = args;\n let token = tokenInArg;\n while (attempt < 2) {\n try {\n return await f(apiURI, token, ...restArgs);\n } catch (e) {\n if (\n e instanceof InstantAPIError &&\n (e.status === 401 ||\n e.body?.type === 'record-expired' ||\n (e.body?.type === 'record-not-found' &&\n e.body.hint['record-type'].match(/token/i))) &&\n this.canRefreshToken()\n ) {\n const refreshedToken = await this.refreshToken();\n if (refreshedToken) {\n token = refreshedToken.accessToken;\n attempt++;\n continue;\n }\n }\n throw e;\n }\n }\n }\n\n /**\n * Fetch a single app by its id.\n *\n * ```ts\n * const { app } = await api.getApp('MY_APP_ID', {\n * includeSchema: true,\n * includePerms: true,\n * });\n * ```\n *\n * @template Opts – Narrow the shape of the response via the\n * {@link AppDataOpts} flags.\n * @param appId – UUID of the app.\n * @param opts – `{ includeSchema?: boolean; includePerms?: boolean }`\n * @returns A typed wrapper containing the app, whose shape is expanded\n * according to `Opts`.\n */\n async getApp<Opts extends AppDataOpts>(\n appId: string,\n opts?: Opts,\n ): Promise<InstantAPIGetAppResponse<Opts>> {\n return this.withRetry(getApp, [this.#apiURI, this.token(), appId, opts]);\n }\n\n /**\n * List **all apps** owned by the auth owner.\n *\n * ```ts\n * const { apps } = await api.getApps({\n * includeSchema: true,\n * includePerms: true,\n * });\n * ```\n *\n * @template Opts – Same as {@link getApp}.\n * @param opts – `{ includeSchema?: boolean; includePerms?: boolean }`\n * @returns An array wrapper; each element’s shape follows `Opts`.\n */\n async getApps<Opts extends AppDataOpts>(\n opts?: Opts,\n ): Promise<InstantAPIListAppsResponse<Opts>> {\n return this.withRetry(getApps, [this.#apiURI, this.token(), opts]);\n }\n\n /**\n * List **all orgs** that the auth owner is a member of.\n *\n * ```ts\n * const { orgs } = await api.getOrgs();\n * ```\n *\n * @returns An array of orgs\n */\n async getOrgs(): Promise<InstantAPIListOrgsResponse> {\n return this.withRetry(getOrgs, [this.#apiURI, this.token()]);\n }\n\n /**\n * List **all apps** owned by the auth owner.\n *\n * ```ts\n * const { apps } = await api.getApps({\n * includeSchema: true,\n * includePerms: true,\n * });\n * ```\n *\n * @template Opts – Same as {@link getApp}.\n * @param opts – `{ includeSchema?: boolean; includePerms?: boolean }`\n * @returns An array wrapper; each element’s shape follows `Opts`.\n */\n async getAppsForOrg<Opts extends AppDataOpts>(\n orgId: string,\n opts?: Opts,\n ): Promise<InstantAPIListAppsResponse<Opts>> {\n return this.withRetry(getAppsForOrg, [\n this.#apiURI,\n this.token(),\n orgId,\n opts,\n ]);\n }\n\n /**\n * Gets the schema for an app by its id.\n *\n * ```ts\n * const { schema } = await api.getSchema('MY_APP_ID');\n * ```\n *\n * @param appId -- UUID of the app\n */\n async getSchema(appId: string): Promise<InstantAPIGetAppSchemaResponse> {\n return this.withRetry(getAppSchema, [this.#apiURI, this.token(), appId]);\n }\n\n /**\n * Gets the permissions for an app by its id.\n *\n * ```ts\n * const { perms } = await api.getPerms('MY_APP_ID');\n * ```\n *\n * @param appId -- UUID of the app\n */\n async getPerms(appId: string): Promise<InstantAPIGetAppPermsResponse> {\n return this.withRetry(getAppPerms, [this.#apiURI, this.token(), appId]);\n }\n\n /**\n * Create a new app.\n *\n * The app will be placed in the authenticated user's account\n * if no orgId is provided.\n *\n * Optionally set permissions and schema.\n *\n * ```ts\n * const { app } = await api.createApp({\n * title: 'My new app',\n * // Optional permissions\n * perms: { $default: { allow: { $default: 'false' } } },\n * // Optional schema\n * schema: i.schema({\n * entities: { books: i.entity({ title: i.string() }) },\n * }),\n * });\n * ```\n *\n * @param fields\n * @param fields.title -- Title for app\n * @param fields.schema -- Optional schema for the app\n * @param fields.perms -- Optional permissions for the app\n * @param fields.orgId -- Optional id of the org that the app will be placed in\n */\n async createApp(\n fields: InstantAPICreateAppBody,\n ): Promise<InstantAPICreateAppResponse> {\n return this.withRetry(createApp, [this.#apiURI, this.token(), fields]);\n }\n\n /**\n * Create a new temporary app.\n *\n * Optionally set permissions and schema.\n *\n * ```ts\n * const { app } = await api.createTemporaryApp({\n * title: 'My new app',\n * // Optional permissions\n * perms: { $default: { allow: { $default: 'false' } } },\n * // Optional schema\n * schema: i.schema({\n * entities: { books: i.entity({ title: i.string() }) },\n * }),\n * });\n * ```\n *\n * @param fields\n * @param fields.title -- Title for app\n * @param fields.schema -- Optional schema for the app\n * @param fields.perms -- Optional permissions for the app\n */\n async createTemporaryApp(fields: InstantAPICreateTemporaryAppBody) {\n return createTemporaryApp(this.#apiURI, fields);\n }\n\n /**\n * Update the title of an app by its id.\n *\n * ```ts\n * const { app } = await api.updateApp('MY_APP_ID', {\n * title: 'New title',\n * });\n * ```\n *\n * @param appId -- UUID of the app\n * @param fields.title -- New title for the app\n */\n async updateApp(\n appId: string,\n fields: InstantAPIUpdateAppBody,\n ): Promise<InstantAPIUpdateAppResponse> {\n return this.withRetry(updateApp, [\n this.#apiURI,\n this.token(),\n appId,\n fields,\n ]);\n }\n\n /**\n * Delete an app by its id.\n *\n * ```ts\n * const { app } = await api.deleteApp('MY_APP_ID');\n * ```\n *\n * @param appId -- UUID of the app\n */\n async deleteApp(appId: string): Promise<InstantAPIDeleteAppResponse> {\n return this.withRetry(deleteApp, [this.#apiURI, this.token(), appId]);\n }\n\n /**\n * Dry-run a **schema push** and receive a _plan_ of steps the server would\n * execute.\n *\n * ```ts\n * const { steps } = await api.planSchemaPush(appId, body);\n * ```\n */\n async planSchemaPush(\n appId: string,\n body: InstantAPISchemaPushBody,\n ): Promise<InstantAPIPlanSchemaPushResponse> {\n return this.withRetry(planSchemaPush, [\n this.#apiURI,\n this.token(),\n appId,\n body,\n ]);\n }\n\n /**\n * Execute a **schema push**. The server returns a long-running job\n * represented as a {@link ProgressPromise}: you can both `await` the final\n * result **or** subscribe to intermediate status updates.\n *\n * ```ts\n * // 1) Subscribe to progress\n * const schema = i.schema({\n * entities: {\n * books: i.entity({\n * title: i.string().indexed(),\n * }),\n * },\n * });\n * const job = api.schemaPush(appId, { schema: schema });\n * job\n * .then(({ summary }) => console.log('done!', summary))\n * .catch((e) => console.error(e));\n * job.subscribe({\n * next: (status) => renderProgress(status),\n * });\n *\n * // 2) Or just await it\n * const result = await api.schemaPush(appId, { schema: schema });\n * ```\n */\n schemaPush(\n appId: string,\n body: InstantAPISchemaPushBody,\n ): ProgressPromise<InProgressStepsSummary, InstantAPISchemaPushResponse> {\n if (!this.#auth) {\n throw new PlatformApiMissingAuthError();\n }\n return new ProgressPromise(async (progress, resolve, reject) => {\n // It's tricky to add withRetry to the background process that fetches the jobs,\n // so we'll just refresh the token at the start.\n if (this.canRefreshToken()) {\n try {\n await this.refreshToken();\n } catch (_e) {}\n }\n schemaPush(this.#apiURI, this.token(), appId, body).subscribe({\n complete(v) {\n resolve(v);\n },\n error(e) {\n reject(e);\n },\n next(v) {\n progress(v);\n },\n });\n });\n }\n\n /**\n * Update permission rules for an app by its id.\n *\n * Completely replaces the current rule set.\n *\n * ```ts\n * const { steps } = await api.pushPerms(appId, {\n * perms: {\n * $default: { allow: { $default: 'false' } },\n * books: { allow: { view: 'true', $default: 'false' } },\n * },\n * });\n * ```\n */\n async pushPerms(\n appId: string,\n body: InstantAPIPushPermsBody,\n ): Promise<InstantAPIPushPermsResponse> {\n if (!this.#auth) {\n throw new PlatformApiMissingAuthError();\n }\n return this.withRetry(pushPerms, [this.#apiURI, this.token(), appId, body]);\n }\n\n async tokenInfo(): Promise<InstantAPITokenInfoResponse> {\n if (!this.#auth) {\n throw new PlatformApiMissingAuthError();\n }\n return this.withRetry(tokenInfo, [this.#apiURI, this.token()]);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n InstantAPIError,\n version as coreVersion,\n InstantRules,\n InstantSchemaDef,\n EntitiesDef,\n LinksDef,\n RoomsDef,\n InstantDBAttr,\n InstantDBIdent,\n InstantDBCheckedDataType,\n i,\n InstantDBInferredType,\n DataAttrDef,\n} from '@instantdb/core';\nimport version from './version.ts';\nimport {\n attrFwdLabel,\n attrFwdName,\n attrRevName,\n identName,\n InstantAPIPlatformSchema,\n InstantAPISchemaPlanStep,\n InstantAPISchemaPushStep,\n} from './schema.ts';\nimport { ProgressPromise } from './ProgressPromise.ts';\nimport {\n capitalizeFirstLetter,\n deriveClientType,\n rels,\n sortedEntries,\n} from './util.ts';\nimport { exchangeRefreshToken } from './serverOAuth.ts';\n\ntype Simplify<T> = {\n [K in keyof T]: T[K];\n} & {};\n\ntype AppDataOpts = {\n includePerms?: boolean | null | undefined;\n includeSchema?: boolean | null | undefined;\n};\n\ntype AppResponseJSON<Opts extends AppDataOpts | undefined> = Simplify<\n {\n id: string;\n title: string;\n created_at: Date;\n org_id: string | null;\n 'admin-token'?: string;\n } & (NonNullable<Opts>['includePerms'] extends true\n ? { perms: InstantRules }\n : {}) &\n (NonNullable<Opts>['includeSchema'] extends true\n ? {\n schema: InstantAPIPlatformSchema;\n }\n : {})\n>;\n\ntype OrgResponseJSON = {\n id: string;\n title: string;\n created_at: Date;\n};\n\nexport type InstantAPIAppDetails<Opts extends AppDataOpts | undefined> =\n Simplify<\n {\n id: string;\n title: string;\n createdAt: Date;\n orgId: string | null;\n } & (NonNullable<Opts>['includePerms'] extends true\n ? { perms: InstantRules }\n : {}) &\n (NonNullable<Opts>['includeSchema'] extends true\n ? {\n schema: InstantSchemaDef<\n EntitiesDef,\n LinksDef<EntitiesDef>,\n RoomsDef\n >;\n }\n : {})\n >;\n\nexport type InstantAPIOrgDetails = {\n id: string;\n title: string;\n createdAt: Date;\n};\n\nexport type InstantAPIGetAppResponse<Opts extends AppDataOpts> = Simplify<{\n app: InstantAPIAppDetails<Opts>;\n}>;\n\nexport type InstantAPIListAppsResponse<Opts extends AppDataOpts | undefined> =\n Simplify<{\n apps: InstantAPIAppDetails<Opts>[];\n }>;\n\nexport type InstantAPIListOrgsResponse = {\n orgs: InstantAPIOrgDetails[];\n};\n\nexport type InstantAPIGetAppSchemaResponse = {\n schema: InstantSchemaDef<EntitiesDef, LinksDef<EntitiesDef>, RoomsDef>;\n};\n\nexport type InstantAPIGetAppPermsResponse = { perms: InstantRules };\n\nexport type InstantAPICreateAppBody = {\n title: string;\n schema?:\n | InstantSchemaDef<EntitiesDef, LinksDef<EntitiesDef>, RoomsDef>\n | null\n | undefined;\n perms?: InstantRules | null | undefined;\n orgId?: string | null | undefined;\n};\n\nexport type InstantAPICreateTemporaryAppBody = {\n title: string;\n schema?:\n | InstantSchemaDef<EntitiesDef, LinksDef<EntitiesDef>, RoomsDef>\n | null\n | undefined;\n rules?: {\n code: InstantRules;\n } | null;\n};\n\nexport type InstantAPICreateTemporaryAppResponse = {\n app: Simplify<\n InstantAPIAppDetails<{ includePerms: false; includeSchema: false }> & {\n adminToken: string;\n }\n >;\n expiresMs: number;\n};\n\nexport type InstantAPICreateAppResponse = Simplify<{\n app: InstantAPIAppDetails<{ includePerms: true; includeSchema: true }> & {\n adminToken: string;\n };\n}>;\n\nexport type InstantAPIUpdateAppBody = { title: string };\n\nexport type InstantAPIUpdateAppResponse = Simplify<{\n app: InstantAPIAppDetails<{}>;\n}>;\n\nexport type InstantAPIDeleteAppResponse = Simplify<{\n app: InstantAPIAppDetails<{}>;\n}>;\n\nexport type InstantAPISchemaPushBody = {\n schema: InstantSchemaDef<EntitiesDef, LinksDef<EntitiesDef>, RoomsDef>;\n};\n\nexport type InstantAPIPushPermsBody = {\n perms: InstantRules;\n};\n\nexport type InstantAPIPushPermsResponse = {\n perms: InstantRules;\n};\n\nexport type InstantAPITokenInfoResponse = {\n expiresAt: Date;\n scopes: string;\n tokenType: 'Bearer';\n};\n\nexport type PlanStep =\n | ['add-attr', InstantDBAttr]\n | ['update-attr', Partial<InstantDBAttr>]\n | ['index', { 'attr-id': string; 'forward-identity': InstantDBIdent }]\n | ['remove-index', { 'attr-id': string; 'forward-identity': InstantDBIdent }]\n | ['unique', { 'attr-id': string; 'forward-identity': InstantDBIdent }]\n | ['remove-unique', { 'attr-id': string; 'forward-identity': InstantDBIdent }]\n | ['required', { 'attr-id': string; 'forward-identity': InstantDBIdent }]\n | [\n 'remove-required',\n { 'attr-id': string; 'forward-identity': InstantDBIdent },\n ]\n | [\n 'check-data-type',\n {\n 'attr-id': string;\n 'forward-identity': InstantDBIdent;\n 'checked-data-type': InstantDBCheckedDataType;\n },\n ]\n | [\n 'remove-data-type',\n { 'attr-id': string; 'forward-identity': InstantDBIdent },\n ]\n | ['delete-attr', string];\n\ntype PlanReponseJSON = {\n 'new-schema': InstantAPIPlatformSchema;\n 'current-schema': InstantAPIPlatformSchema;\n 'current-attrs': InstantDBAttr[];\n steps: PlanStep[];\n};\n\n// Same as PlanStep, but some background steps get a job-id\ntype StepWithJobId<T> = T extends ['add-attr', infer P]\n ? ['add-attr', P]\n : T extends ['update-attr', infer P]\n ? ['update-attr', P]\n : T extends [infer K, infer P]\n ? [K, P & { 'job-id': string }]\n : never;\n\ntype PushStep = StepWithJobId<PlanStep>;\n\ntype IndexingJobJSON = {\n id: string;\n app_id: string;\n group_id: string;\n attr_id: string;\n attr_name: string;\n job_type:\n | 'check-data-type'\n | 'remove-data-type'\n | 'index'\n | 'remove-index'\n | 'unique'\n | 'remove-unique'\n | 'required'\n | 'remove-required';\n job_status: 'waiting' | 'processing' | 'completed' | 'errored';\n work_estimate: number | null;\n work_completed: number | null;\n error:\n | 'invalid-triple-error'\n | 'invalid-attr-state-error'\n | 'triple-not-unique-error'\n | 'triple-too-large-error'\n | 'missing-required-error'\n | 'unexpected-error';\n checked_data_type?: InstantDBCheckedDataType;\n created_at: string;\n updated_at: string;\n done_at: string;\n invalid_unique_value: any;\n invalid_triples_sample: {\n entity_id: string;\n value: any;\n json_type:\n | 'string'\n | 'number'\n | 'boolean'\n | 'null'\n | 'object'\n | 'array'\n | 'date';\n }[];\n error_data: any;\n};\n\ntype SchemaPushResponseJSON = {\n 'indexing-jobs'?: {\n 'group-id': string;\n jobs: IndexingJobJSON[];\n } | null;\n steps: PushStep[];\n};\n\nexport type InstantAPIPlanSchemaPushResponse = {\n newSchema: InstantSchemaDef<EntitiesDef, LinksDef<EntitiesDef>, RoomsDef>;\n currentSchema: InstantSchemaDef<EntitiesDef, LinksDef<EntitiesDef>, RoomsDef>;\n steps: InstantAPISchemaPlanStep[];\n};\n\ntype InProgressStepsSummary = {\n friendlyDescription: string;\n totalCount: number;\n inProgressCount: number;\n completedCount: number;\n errorCount: number;\n steps: InstantAPISchemaPushStep[];\n inProgressSteps: InstantAPISchemaPushStep[];\n completedSteps: InstantAPISchemaPushStep[];\n erroredSteps: InstantAPISchemaPushStep[];\n};\n\nexport type InstantAPISchemaPushResponse = {\n newSchema: InstantSchemaDef<EntitiesDef, LinksDef<EntitiesDef>, RoomsDef>;\n steps: InstantAPISchemaPushStep[];\n summary: InProgressStepsSummary;\n};\n\nasync function jsonFetch<T>(\n input: RequestInfo,\n init: RequestInit | undefined,\n): Promise<T> {\n const headers = {\n ...(init?.headers || {}),\n 'Instant-Platform-Version': version,\n 'Instant-Core-Version': coreVersion,\n 'X-Instant-Source': 'platform-sdk',\n 'X-Instant-Version': version,\n };\n const res = await fetch(input, { ...init, headers });\n if (res.status === 200) {\n const json = await res.json();\n return Promise.resolve(json);\n }\n const body = await res.text();\n try {\n const json = JSON.parse(body);\n return Promise.reject(\n new InstantAPIError({ status: res.status, body: json }),\n );\n } catch (_e) {\n return Promise.reject(\n new InstantAPIError({\n status: res.status,\n body: { type: undefined, message: body },\n }),\n );\n }\n}\n\nfunction attrDefForType(\n type: InstantDBCheckedDataType | InstantDBInferredType | 'any',\n) {\n switch (type) {\n case 'string':\n return i.string();\n case 'any':\n return i.any();\n case 'json':\n return i.json();\n case 'boolean':\n return i.boolean();\n case 'date':\n return i.date();\n case 'number':\n return i.number();\n default: {\n const neverType: never = type;\n throw new Error(`Unknown type ${neverType}.`);\n }\n }\n}\n\ntype APISchemaConversionOpts = {\n disableTypeInference: boolean;\n};\n\nfunction apiSchemaAttrToDataAttrDef(\n attr: InstantDBAttr,\n opts?: APISchemaConversionOpts,\n) {\n const derivedType = deriveClientType(attr, opts?.disableTypeInference);\n let i: DataAttrDef<string, boolean, boolean> = attrDefForType(\n derivedType.type,\n );\n if (attr['unique?']) {\n i = i.unique();\n }\n if (attr['index?']) {\n i = i.indexed();\n }\n if (!attr['required?']) {\n i = i.optional();\n }\n i.metadata.derivedType = derivedType;\n return i;\n}\n\nfunction apiSchemaBlobToEntityDef(\n attrs: InstantAPIPlatformSchema['blobs'][string],\n opts?: APISchemaConversionOpts,\n) {\n const defs: Record<string, DataAttrDef<string, boolean, boolean>> = {};\n for (const [label, attr] of sortedEntries(attrs)) {\n if (label === 'id') {\n continue;\n }\n defs[label] = apiSchemaAttrToDataAttrDef(attr, opts);\n }\n return i.entity(defs);\n}\n\nfunction apiSchemaAttrToLinkName(attr: InstantDBAttr): string {\n const [, fe, flabel] = attr['forward-identity'];\n return `${fe}${capitalizeFirstLetter(flabel)}`;\n}\n\nfunction apiSchemaAttrToLinkDef(attr: InstantDBAttr) {\n const [, fe, flabel] = attr['forward-identity'];\n const [, re, rlabel] = attr['reverse-identity']!;\n const [fhas, rhas] = rels[`${attr.cardinality}-${attr['unique?']}`];\n return {\n forward: {\n on: fe,\n has: fhas,\n label: flabel,\n required: attr['required?'] || undefined,\n onDelete:\n attr['on-delete'] === 'cascade' ? ('cascade' as 'cascade') : undefined,\n },\n reverse: {\n on: re,\n has: rhas,\n label: rlabel,\n onDelete:\n attr['on-delete-reverse'] === 'cascade'\n ? ('cascade' as 'cascade')\n : undefined,\n },\n };\n}\n\nexport function apiSchemaToInstantSchemaDef(\n apiSchema: InstantAPIPlatformSchema,\n opts?: { disableTypeInference: boolean },\n): InstantSchemaDef<EntitiesDef, LinksDef<EntitiesDef>, RoomsDef> {\n const entities: EntitiesDef = {};\n for (const [etype, attrs] of sortedEntries(apiSchema.blobs)) {\n entities[etype] = apiSchemaBlobToEntityDef(attrs, opts);\n }\n const links: LinksDef<EntitiesDef> = {};\n for (const [_name, attr] of sortedEntries(apiSchema.refs)) {\n const link = apiSchemaAttrToLinkDef(attr);\n const linkName = apiSchemaAttrToLinkName(attr);\n links[linkName] = link;\n }\n\n return i.schema({ entities, links });\n}\n\nfunction coerceApp<Opts extends AppDataOpts>(\n app: AppResponseJSON<Opts>,\n): InstantAPIAppDetails<Opts> {\n const base = {\n id: app.id,\n title: app.title,\n createdAt: new Date(app.created_at),\n orgId: app.org_id,\n ...(app['admin-token'] ? { adminToken: app['admin-token'] } : {}),\n };\n\n // `in` narrows the union, so it’s safe to read `perms` / `schema`\n // when the property exists. :contentReference[oaicite:0]{index=0}\n const permsPart = (\n 'perms' in app ? { perms: app.perms } : {}\n ) as InstantAPIAppDetails<Opts>;\n\n const schemaPart = (\n 'schema' in app\n ? {\n schema: apiSchemaToInstantSchemaDef(\n app.schema as InstantAPIPlatformSchema,\n ),\n }\n : {}\n ) as InstantAPIAppDetails<Opts>;\n\n return { ...base, ...permsPart, ...schemaPart };\n}\n\nfunction coerceOrg(org: OrgResponseJSON): InstantAPIOrgDetails {\n return {\n id: org.id,\n title: org.title,\n createdAt: new Date(org.created_at),\n };\n}\n\nasync function getApps<Opts extends AppDataOpts>(\n apiURI: string,\n token: string,\n opts?: Opts,\n): Promise<InstantAPIListAppsResponse<Opts>> {\n const url = new URL(`${apiURI}/superadmin/apps`);\n const include = [];\n if (opts?.includePerms) {\n include.push('perms');\n }\n if (opts?.includeSchema) {\n include.push('schema');\n }\n\n if (include.length) {\n url.searchParams.set('include', include.join(','));\n }\n const resp = await jsonFetch<{ apps: AppResponseJSON<typeof opts>[] }>(\n url.toString(),\n {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${token}`,\n },\n },\n );\n\n return { apps: resp.apps.map(coerceApp) };\n}\n\nasync function getOrgs(\n apiURI: string,\n token: string,\n): Promise<InstantAPIListOrgsResponse> {\n const url = new URL(`${apiURI}/superadmin/orgs`);\n\n const resp = await jsonFetch<{ orgs: OrgResponseJSON[] }>(url.toString(), {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n return { orgs: resp.orgs.map(coerceOrg) };\n}\n\nasync function getAppsForOrg<Opts extends AppDataOpts>(\n apiURI: string,\n token: string,\n orgId: string,\n opts?: Opts,\n): Promise<InstantAPIListAppsResponse<Opts>> {\n const url = new URL(`${apiURI}/superadmin/orgs/${orgId}/apps`);\n const include = [];\n if (opts?.includePerms) {\n include.push('perms');\n }\n if (opts?.includeSchema) {\n include.push('schema');\n }\n\n if (include.length) {\n url.searchParams.set('include', include.join(','));\n }\n const resp = await jsonFetch<{ apps: AppResponseJSON<typeof opts>[] }>(\n url.toString(),\n {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${token}`,\n },\n },\n );\n\n return { apps: resp.apps.map(coerceApp) };\n}\n\nasync function getAppSchema(\n apiURI: string,\n token: string,\n appId: string,\n): Promise<InstantAPIGetAppSchemaResponse> {\n const { schema } = await jsonFetch<{ schema: InstantAPIPlatformSchema }>(\n `${apiURI}/superadmin/apps/${appId}/schema`,\n {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${token}`,\n },\n },\n );\n return { schema: apiSchemaToInstantSchemaDef(schema) };\n}\n\nasync function getAppPerms(\n apiURI: string,\n token: string,\n appId: string,\n): Promise<InstantAPIGetAppPermsResponse> {\n return await jsonFetch<InstantAPIGetAppPermsResponse>(\n `${apiURI}/superadmin/apps/${appId}/perms`,\n {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${token}`,\n },\n },\n );\n}\n\nasync function getApp<Opts extends AppDataOpts>(\n apiURI: string,\n token: string,\n appId: string,\n opts?: Opts,\n): Promise<Simplify<InstantAPIGetAppResponse<Opts>>> {\n let permsPromise: null | Promise<InstantAPIGetAppPermsResponse> = null;\n let schemaPromise: null | Promise<InstantAPIGetAppSchemaResponse> = null;\n if (opts?.includePerms) {\n permsPromise = getAppPerms(apiURI, token, appId);\n }\n if (opts?.includeSchema) {\n schemaPromise = getAppSchema(apiURI, token, appId);\n }\n\n const { app: apiApp } = await jsonFetch<{ app: AppResponseJSON<{}> }>(\n `${apiURI}/superadmin/apps/${appId}`,\n {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${token}`,\n },\n },\n );\n\n if (!permsPromise && !schemaPromise) {\n const app = coerceApp(apiApp) as InstantAPIAppDetails<{}>;\n return { app } as Simplify<InstantAPIGetAppResponse<Opts>>;\n }\n\n const app = {\n ...(coerceApp(apiApp) as unknown as Simplify<InstantAPIGetAppResponse<{}>>),\n ...(permsPromise ? { perms: (await permsPromise).perms } : {}),\n ...(schemaPromise ? { schema: (await schemaPromise).schema } : {}),\n } as unknown as InstantAPIAppDetails<Opts>;\n\n return {\n app,\n };\n}\n\nasync function createApp(\n apiURI: string,\n token: string,\n fields: InstantAPICreateAppBody,\n): Promise<InstantAPICreateAppResponse> {\n const apiFields: any = fields;\n apiFields.org_id = fields.orgId;\n\n const { app } = await jsonFetch<{\n app: AppResponseJSON<{ includePerms: true; includeSchema: true }> & {\n 'admin-token': string;\n };\n }>(`${apiURI}/superadmin/apps`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify(apiFields),\n });\n const withAdminToken = {\n ...coerceApp<{ includePerms: true; includeSchema: true }>(app),\n adminToken: app['admin-token'],\n };\n return {\n app: withAdminToken,\n };\n}\n\nasync function createTemporaryApp(\n apiURI: string,\n fields: InstantAPICreateTemporaryAppBody,\n): Promise<InstantAPICreateTemporaryAppResponse> {\n const response = await jsonFetch<{ app: any; expires_ms: number }>(\n `${apiURI}/dash/apps/ephemeral`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(fields),\n },\n );\n const withAdminToken = {\n ...coerceApp<{ includePerms: true; includeSchema: true }>(response.app),\n adminToken: response.app['admin-token'],\n };\n return {\n app: withAdminToken,\n expiresMs: response.expires_ms,\n };\n}\n\nasync function updateApp(\n apiURI: string,\n token: string,\n appId: string,\n fields: InstantAPIUpdateAppBody,\n): Promise<InstantAPIUpdateAppResponse> {\n const { app } = await jsonFetch<{ app: AppResponseJSON<{}> }>(\n `${apiURI}/superadmin/apps/${appId}`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify(fields),\n },\n );\n\n return { app: coerceApp(app) };\n}\n\nasync function deleteApp(\n apiURI: string,\n token: string,\n appId: string,\n): Promise<InstantAPIDeleteAppResponse> {\n const { app } = await jsonFetch<{ app: AppResponseJSON<{}> }>(\n `${apiURI}/superadmin/apps/${appId}`,\n {\n method: 'DELETE',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n },\n );\n return { app: coerceApp(app) };\n}\n\nfunction translatePlanStep(apiStep: PlanStep): InstantAPISchemaPlanStep {\n const [stepType, stepParams] = apiStep;\n\n switch (stepType) {\n case 'add-attr': {\n const attr = stepParams;\n const attrName = attrFwdName(attr);\n const friendlyDescription =\n attr['value-type'] === 'blob'\n ? attrFwdLabel(attr) === 'id'\n ? `Create new entity ${attrName}.`\n : `Add attribute ${attrName}.`\n : `Link ${attrName} to ${attrRevName(attr)}.`;\n return { type: 'add-attr', friendlyDescription, attr };\n }\n case 'update-attr': {\n const attr = stepParams as InstantDBAttr;\n return {\n type: 'update-attr',\n friendlyDescription: `Update attribute ${attrFwdName(attr)}.`,\n attr,\n };\n }\n case 'index': {\n return {\n type: 'index',\n friendlyDescription: `Add index to ${identName(stepParams['forward-identity'])}.`,\n attrId: stepParams['attr-id'],\n forwardIdentity: stepParams['forward-identity'],\n };\n }\n case 'remove-index': {\n return {\n type: 'remove-index',\n friendlyDescription: `Remove index from ${identName(stepParams['forward-identity'])}.`,\n attrId: stepParams['attr-id'],\n forwardIdentity: stepParams['forward-identity'],\n };\n }\n case 'unique': {\n return {\n type: 'unique',\n friendlyDescription: `Ensure that ${identName(stepParams['forward-identity'])} is unique.`,\n attrId: stepParams['attr-id'],\n forwardIdentity: stepParams['forward-identity'],\n };\n }\n case 'remove-unique': {\n return {\n type: 'remove-unique',\n friendlyDescription: `Remove uniqueness constarint from ${identName(stepParams['forward-identity'])}.`,\n attrId: stepParams['attr-id'],\n forwardIdentity: stepParams['forward-identity'],\n };\n }\n case 'required': {\n return {\n type: 'required',\n friendlyDescription: `Make ${identName(stepParams['forward-identity'])} a required attribute.`,\n attrId: stepParams['attr-id'],\n forwardIdentity: stepParams['forward-identity'],\n };\n }\n case 'remove-required': {\n return {\n type: 'remove-required',\n friendlyDescription: `Allow ${identName(stepParams['forward-identity'])} to be missing or null.`,\n attrId: stepParams['attr-id'],\n forwardIdentity: stepParams['forward-identity'],\n };\n }\n case 'check-data-type': {\n const forwardIdentity = stepParams['forward-identity'];\n const dataType = stepParams['checked-data-type'];\n return {\n type: 'check-data-type',\n friendlyDescription: `Enforce data type of ${identName(forwardIdentity)} as type ${dataType}.`,\n attrId: stepParams['attr-id'],\n forwardIdentity,\n checkedDataType: dataType,\n };\n }\n case 'remove-data-type': {\n const forwardIdentity = stepParams['forward-identity'];\n return {\n type: 'remove-data-type',\n friendlyDescription: `Stop enforcing data type of ${identName(forwardIdentity)}.`,\n attrId: stepParams['attr-id'],\n forwardIdentity: stepParams['forward-identity'],\n };\n }\n // This case will never actually run because /schema/push/plan doesn't detect deleted attrs\n case 'delete-attr': {\n return {\n type: 'delete-attr',\n attrId: stepParams,\n friendlyDescription: `Delete attribute ${stepParams}.`,\n };\n }\n default: {\n // Get a type error if we ignore a case\n const unknownType: never = stepType;\n throw new Error(`Uknown schema operation ${unknownType}.`);\n }\n }\n}\n\nexport function translatePlanSteps(\n apiSteps: PlanStep[],\n): InstantAPISchemaPlanStep[] {\n return apiSteps.map((step) => translatePlanStep(step));\n}\n\ntype PushObjOf<S extends PushStep> =\n // grab from the union the member whose discriminant matches S[0]\n Extract<InstantAPISchemaPushStep, { type: S[0] }>;\n\nfunction translatePushStep<S extends PushStep>(\n apiStep: S,\n jobs: IndexingJobJSON[],\n): PushObjOf<S> {\n const [stepType, stepParams] = apiStep;\n if (stepType === 'add-attr' || stepType === 'update-attr') {\n const planStep = translatePlanStep(apiStep);\n if (planStep.type !== 'add-attr' && planStep.type !== 'update-attr') {\n // This is just here for typescript\n throw new Error('Invalid step.');\n }\n return planStep as PushObjOf<S>;\n }\n const jobId = stepParams['job-id'];\n const job = jobs.find((j) => j.id === jobId)!;\n const planStep = translatePlanStep(apiStep);\n const backgroundJob = formatJob(job);\n\n if (planStep.type !== backgroundJob.type) {\n throw new Error('Invalid type');\n }\n\n return { ...planStep, backgroundJob } as PushObjOf<S>;\n}\n\nfunction translatePushSteps(\n apiSteps: PushStep[],\n jobs: IndexingJobJSON[],\n): InstantAPISchemaPushStep[] {\n return apiSteps.map((step) => translatePushStep(step, jobs));\n}\n\nasync function planSchemaPush(\n apiURI: string,\n token: string,\n appId: string,\n body: InstantAPISchemaPushBody,\n): Promise<InstantAPIPlanSchemaPushResponse> {\n const resp = await jsonFetch<PlanReponseJSON>(\n `${apiURI}/superadmin/apps/${appId}/schema/push/plan`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({\n ...body,\n check_types: true,\n supports_background_updates: true,\n }),\n },\n );\n\n return {\n newSchema: apiSchemaToInstantSchemaDef(resp['new-schema']),\n currentSchema: apiSchemaToInstantSchemaDef(resp['current-schema']),\n steps: translatePlanSteps(resp['steps']),\n };\n}\n\nfunction allJobsComplete(jobs: IndexingJobJSON[]): boolean {\n return !!jobs.find(\n (j) => j.job_status === 'completed' || j.job_status === 'errored',\n );\n}\n\nfunction latestJobUpdate(jobs: IndexingJobJSON[]): Date | null {\n const res = jobs.reduce((acc: Date | null, job) => {\n if (job.updated_at) {\n const d = new Date(job.updated_at);\n if (!acc || d > acc) {\n return d;\n }\n }\n return acc;\n }, null);\n return res;\n}\n\nasync function jobFetchLoop(\n apiURI: string,\n token: string,\n appId: string,\n groupId: string,\n startingJobs: IndexingJobJSON[],\n onFetch: (jobs: IndexingJobJSON[]) => void,\n): Promise<IndexingJobJSON[]> {\n let interval = 100;\n let lastJobs = startingJobs;\n let errorCount = 0;\n\n while (!allJobsComplete(lastJobs)) {\n await new Promise((resolve) => setTimeout(resolve, interval));\n try {\n const nextJobs = (\n await jsonFetch<{ jobs: IndexingJobJSON[] }>(\n `${apiURI}/dash/apps/${appId}/indexing-jobs/group/${groupId}`,\n {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${token}`,\n },\n },\n )\n ).jobs;\n onFetch(nextJobs);\n if (allJobsComplete(nextJobs)) {\n return nextJobs;\n }\n errorCount = 0;\n const lastUpdate = latestJobUpdate(lastJobs);\n const thisUpdate = latestJobUpdate(nextJobs);\n interval =\n thisUpdate === null || (lastUpdate && lastUpdate >= thisUpdate)\n ? Math.min(interval * 2, 10000)\n : 100;\n } catch (e) {\n if (errorCount > 3) {\n throw e;\n } else {\n errorCount++;\n interval = Math.min(interval * 2, 10000);\n }\n }\n }\n\n return lastJobs;\n}\n\ntype InstantBackgroundSchemaBaseJob = {\n id: string;\n createdAt: Date;\n updatedAt: Date;\n status: 'completed' | 'waiting' | 'processing' | 'errored';\n workEstimate: number | null;\n workCompleted: number | null;\n error?:\n | 'invalid-triple-error'\n | 'invalid-attr-state-error'\n | 'triple-not-unique-error'\n | 'triple-too-large-error'\n | 'missing-required-error'\n | 'unexpected-error';\n invalidTriplesSample?: {\n entityId: string;\n value: any;\n jsonType:\n | 'string'\n | 'number'\n | 'boolean'\n | 'null'\n | 'object'\n | 'array'\n | 'date';\n }[];\n};\n\nexport interface InstantBackgroundSchemaRemoveDataTypeJob\n extends InstantBackgroundSchemaBaseJob {\n type: 'remove-data-type';\n}\n\nexport interface InstantBackgroundSchemaCheckDataTypeJob\n extends InstantBackgroundSchemaBaseJob {\n type: 'check-data-type';\n checkedDataType: InstantDBCheckedDataType;\n}\n\nexport interface InstantBackgroundSchemaAddIndexJob\n extends InstantBackgroundSchemaBaseJob {\n type: 'index';\n}\n\nexport interface InstantBackgroundSchemaRemoveIndexJob\n extends InstantBackgroundSchemaBaseJob {\n type: 'remove-index';\n}\n\nexport interface InstantBackgroundSchemaAddUniqueJob\n extends InstantBackgroundSchemaBaseJob {\n type: 'unique';\n invalidUniqueValue?: any;\n}\n\nexport interface InstantBackgroundSchemaRemoveUniqueJob\n extends InstantBackgroundSchemaBaseJob {\n type: 'remove-unique';\n}\n\nexport interface InstantBackgroundSchemaAddRequiredJob\n extends InstantBackgroundSchemaBaseJob {\n type: 'required';\n}\n\nexport interface InstantBackgroundSchemaRemoveRequiredJob\n extends InstantBackgroundSchemaBaseJob {\n type: 'remove-required';\n}\n\nexport type InstantBackgroundSchemaJob =\n | InstantBackgroundSchemaRemoveDataTypeJob\n | InstantBackgroundSchemaCheckDataTypeJob\n | InstantBackgroundSchemaAddIndexJob\n | InstantBackgroundSchemaRemoveIndexJob\n | InstantBackgroundSchemaAddUniqueJob\n | InstantBackgroundSchemaRemoveUniqueJob\n | InstantBackgroundSchemaAddRequiredJob\n | InstantBackgroundSchemaRemoveRequiredJob;\n\nfunction formatJob(job: IndexingJobJSON): InstantBackgroundSchemaJob {\n const baseJob: InstantBackgroundSchemaBaseJob = {\n id: job.id,\n createdAt: new Date(job.created_at),\n updatedAt: new Date(job.updated_at),\n status: job.job_status,\n workEstimate: job.work_estimate,\n workCompleted: job.work_completed,\n error: job.error,\n invalidTriplesSample: job.invalid_triples_sample?.map((s) => {\n return { entityId: s.entity_id, value: s.value, jsonType: s.json_type };\n }),\n };\n switch (job.job_type) {\n case 'remove-data-type':\n case 'index':\n case 'remove-index':\n case 'required':\n case 'remove-required':\n case 'remove-unique': {\n return { ...baseJob, type: job.job_type };\n }\n case 'check-data-type': {\n return {\n ...baseJob,\n type: job.job_type,\n checkedDataType: job.checked_data_type!,\n };\n }\n case 'unique': {\n return {\n ...baseJob,\n type: job.job_type,\n invalidUniqueValue: job.invalid_unique_value,\n };\n }\n default: {\n const neverType: never = job.job_type;\n throw new Error(`Unknown job type: ${neverType}.`);\n }\n }\n}\n\nfunction stepSummary(\n steps: InstantAPISchemaPushStep[],\n): InProgressStepsSummary {\n const inProgress = steps.filter(\n (s) =>\n 'backgroundJob' in s &&\n (s.backgroundJob.status === 'processing' ||\n s.backgroundJob.status === 'waiting'),\n );\n const completed = steps.filter(\n (s) => !('backgroundJob' in s) || s.backgroundJob.status === 'completed',\n );\n const errored = steps.filter(\n (s) => 'backgroundJob' in s && s.backgroundJob.status === 'errored',\n );\n return {\n friendlyDescription: inProgress.length\n ? `Completing ${inProgress.length} of ${steps.length} schema operations.`\n : `Finished ${steps.length} schema operation${steps.length === 1 ? '' : 's'}${\n errored.length\n ? `, with ${errored.length} error${errored.length > 1 ? 's' : ''}`\n : '.'\n }`,\n totalCount: steps.length,\n inProgressCount: inProgress.length,\n completedCount: completed.length,\n errorCount: errored.length,\n steps,\n inProgressSteps: inProgress,\n completedSteps: completed,\n erroredSteps: errored,\n };\n}\n\nfunction schemaPush(\n apiURI: string,\n token: string,\n appId: string,\n body: InstantAPISchemaPushBody,\n): ProgressPromise<InProgressStepsSummary, InstantAPISchemaPushResponse> {\n return new ProgressPromise(async (progress, resolve, reject) => {\n try {\n const resp = await jsonFetch<SchemaPushResponseJSON>(\n `${apiURI}/superadmin/apps/${appId}/schema/push/apply`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({\n ...body,\n check_types: true,\n supports_background_updates: true,\n }),\n },\n );\n\n const indexingJobs = resp['indexing-jobs'];\n\n const jobs = !indexingJobs\n ? []\n : await jobFetchLoop(\n apiURI,\n token,\n appId,\n indexingJobs['group-id'],\n indexingJobs['jobs'],\n (jobs) => {\n progress(stepSummary(translatePushSteps(resp.steps, jobs)));\n },\n );\n\n const schemaRes = await getAppSchema(apiURI, token, appId);\n resolve({\n newSchema: schemaRes.schema,\n steps: translatePushSteps(resp.steps, jobs),\n summary: stepSummary(translatePushSteps(resp.steps, jobs)),\n });\n } catch (e) {\n reject(e as Error);\n }\n });\n}\n\nasync function pushPerms(\n apiURI: string,\n token: string,\n appId: string,\n body: InstantAPIPushPermsBody,\n): Promise<InstantAPIPushPermsResponse> {\n const result = await jsonFetch<{ rules: { code: InstantRules } }>(\n `${apiURI}/superadmin/apps/${appId}/perms`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({ code: body.perms }),\n },\n );\n\n return { perms: result.rules.code };\n}\n\nasync function tokenInfo(\n apiURI: string,\n token: string,\n): Promise<InstantAPITokenInfoResponse> {\n const result = await jsonFetch<{\n expires_in: number;\n scopes: string;\n token_type: 'Bearer';\n }>(`${apiURI}/platform/oauth/token-info?access_token=${token}`, {\n method: 'GET',\n });\n\n return {\n tokenType: result.token_type,\n scopes: result.scopes,\n expiresAt: new Date(Date.now() + (result.expires_in - 60) * 1000),\n };\n}\n\nexport type PlatformApiAuth =\n | {\n token: string;\n }\n | {\n accessToken: string;\n refreshToken: string;\n clientId: string;\n clientSecret: string;\n onRefresh?: (tokenInfo: {\n accessToken: string;\n expiresAt: Date;\n }) => Promise<void>;\n };\n\nexport type PlatformApiConfig = {\n auth?: PlatformApiAuth;\n apiURI?: string;\n};\n\nexport class PlatformApiMissingAuthError extends Error {\n constructor() {\n super('PlatformApi was not provided auth.');\n }\n}\n\n/**\n * API methods for the Platform API\n *\n * Usage:\n *\n * ```ts\n * import { PlatformApi } from '@instantdb/platform';\n *\n * const api = new PlatformApi({ auth: { token: 'oauth-access-token' } });\n * const { apps } = await api.getApps({\n * includeSchema: true,\n * includePerms: true,\n * });\n * ```\n */\nexport class PlatformApi {\n #auth: PlatformApiAuth | undefined;\n #apiURI: string;\n\n /**\n * @param config – Runtime configuration.\n * @param config.auth.token – OAuth access-token obtained via the oauth flow\n * or a personal access token.\n * @throws {Error} When `token` is missing.\n */\n constructor(config?: PlatformApiConfig) {\n this.#auth = config?.auth;\n this.#apiURI = config?.apiURI || 'https://api.instantdb.com';\n }\n\n token(): string {\n if (!this.#auth) {\n throw new PlatformApiMissingAuthError();\n }\n if ('token' in this.#auth) {\n return this.#auth.token;\n }\n return this.#auth.accessToken;\n }\n\n canRefreshToken(): boolean {\n if (!this.#auth) {\n throw new PlatformApiMissingAuthError();\n }\n return (\n 'refreshToken' in this.#auth &&\n 'clientId' in this.#auth &&\n 'clientSecret' in this.#auth &&\n this.#auth.refreshToken != null &&\n this.#auth.clientId != null &&\n this.#auth.clientSecret != null\n );\n }\n\n async refreshToken(): Promise<null | {\n accessToken: string;\n expiresAt: Date;\n }> {\n if (!this.#auth) {\n throw new PlatformApiMissingAuthError();\n }\n if (\n !this.canRefreshToken() ||\n // Checked in canRefreshToken, but this lets\n // typescript refine this.#auth here\n !('clientId' in this.#auth)\n ) {\n return null;\n }\n const token = await exchangeRefreshToken({\n apiURI: this.#apiURI,\n clientId: this.#auth.clientId,\n clientSecret: this.#auth.clientSecret,\n refreshToken: this.#auth.refreshToken,\n });\n this.#auth.accessToken = token.accessToken;\n if (this.#auth.onRefresh) {\n await this.#auth.onRefresh(token);\n }\n return token;\n }\n\n async withRetry<F extends (...args: any[]) => any>(\n f: F,\n args: Parameters<F>,\n ) {\n let attempt = 0;\n const [apiURI, tokenInArg, ...restArgs] = args;\n let token = tokenInArg;\n while (attempt < 2) {\n try {\n return await f(apiURI, token, ...restArgs);\n } catch (e) {\n if (\n e instanceof InstantAPIError &&\n (e.status === 401 ||\n e.body?.type === 'record-expired' ||\n (e.body?.type === 'record-not-found' &&\n e.body.hint['record-type'].match(/token/i))) &&\n this.canRefreshToken()\n ) {\n const refreshedToken = await this.refreshToken();\n if (refreshedToken) {\n token = refreshedToken.accessToken;\n attempt++;\n continue;\n }\n }\n throw e;\n }\n }\n }\n\n /**\n * Fetch a single app by its id.\n *\n * ```ts\n * const { app } = await api.getApp('MY_APP_ID', {\n * includeSchema: true,\n * includePerms: true,\n * });\n * ```\n *\n * @template Opts – Narrow the shape of the response via the\n * {@link AppDataOpts} flags.\n * @param appId – UUID of the app.\n * @param opts – `{ includeSchema?: boolean; includePerms?: boolean }`\n * @returns A typed wrapper containing the app, whose shape is expanded\n * according to `Opts`.\n */\n async getApp<Opts extends AppDataOpts>(\n appId: string,\n opts?: Opts,\n ): Promise<InstantAPIGetAppResponse<Opts>> {\n return this.withRetry(getApp, [this.#apiURI, this.token(), appId, opts]);\n }\n\n /**\n * List **all apps** owned by the auth owner.\n *\n * ```ts\n * const { apps } = await api.getApps({\n * includeSchema: true,\n * includePerms: true,\n * });\n * ```\n *\n * @template Opts – Same as {@link getApp}.\n * @param opts – `{ includeSchema?: boolean; includePerms?: boolean }`\n * @returns An array wrapper; each element’s shape follows `Opts`.\n */\n async getApps<Opts extends AppDataOpts>(\n opts?: Opts,\n ): Promise<InstantAPIListAppsResponse<Opts>> {\n return this.withRetry(getApps, [this.#apiURI, this.token(), opts]);\n }\n\n /**\n * List **all orgs** that the auth owner is a member of.\n *\n * ```ts\n * const { orgs } = await api.getOrgs();\n * ```\n *\n * @returns An array of orgs\n */\n async getOrgs(): Promise<InstantAPIListOrgsResponse> {\n return this.withRetry(getOrgs, [this.#apiURI, this.token()]);\n }\n\n /**\n * List **all apps** owned by the auth owner.\n *\n * ```ts\n * const { apps } = await api.getApps({\n * includeSchema: true,\n * includePerms: true,\n * });\n * ```\n *\n * @template Opts – Same as {@link getApp}.\n * @param opts – `{ includeSchema?: boolean; includePerms?: boolean }`\n * @returns An array wrapper; each element’s shape follows `Opts`.\n */\n async getAppsForOrg<Opts extends AppDataOpts>(\n orgId: string,\n opts?: Opts,\n ): Promise<InstantAPIListAppsResponse<Opts>> {\n return this.withRetry(getAppsForOrg, [\n this.#apiURI,\n this.token(),\n orgId,\n opts,\n ]);\n }\n\n /**\n * Gets the schema for an app by its id.\n *\n * ```ts\n * const { schema } = await api.getSchema('MY_APP_ID');\n * ```\n *\n * @param appId -- UUID of the app\n */\n async getSchema(appId: string): Promise<InstantAPIGetAppSchemaResponse> {\n return this.withRetry(getAppSchema, [this.#apiURI, this.token(), appId]);\n }\n\n /**\n * Gets the permissions for an app by its id.\n *\n * ```ts\n * const { perms } = await api.getPerms('MY_APP_ID');\n * ```\n *\n * @param appId -- UUID of the app\n */\n async getPerms(appId: string): Promise<InstantAPIGetAppPermsResponse> {\n return this.withRetry(getAppPerms, [this.#apiURI, this.token(), appId]);\n }\n\n /**\n * Create a new app.\n *\n * The app will be placed in the authenticated user's account\n * if no orgId is provided.\n *\n * Optionally set permissions and schema.\n *\n * ```ts\n * const { app } = await api.createApp({\n * title: 'My new app',\n * // Optional permissions\n * perms: { $default: { allow: { $default: 'false' } } },\n * // Optional schema\n * schema: i.schema({\n * entities: { books: i.entity({ title: i.string() }) },\n * }),\n * });\n * ```\n *\n * @param fields\n * @param fields.title -- Title for app\n * @param fields.schema -- Optional schema for the app\n * @param fields.perms -- Optional permissions for the app\n * @param fields.orgId -- Optional id of the org that the app will be placed in\n */\n async createApp(\n fields: InstantAPICreateAppBody,\n ): Promise<InstantAPICreateAppResponse> {\n return this.withRetry(createApp, [this.#apiURI, this.token(), fields]);\n }\n\n /**\n * Create a new temporary app.\n *\n * Optionally set permissions and schema.\n *\n * ```ts\n * const { app } = await api.createTemporaryApp({\n * title: 'My new app',\n * // Optional permissions\n * perms: { $default: { allow: { $default: 'false' } } },\n * // Optional schema\n * schema: i.schema({\n * entities: { books: i.entity({ title: i.string() }) },\n * }),\n * });\n * ```\n *\n * @param fields\n * @param fields.title -- Title for app\n * @param fields.schema -- Optional schema for the app\n * @param fields.perms -- Optional permissions for the app\n */\n async createTemporaryApp(fields: InstantAPICreateTemporaryAppBody) {\n return createTemporaryApp(this.#apiURI, fields);\n }\n\n /**\n * Update the title of an app by its id.\n *\n * ```ts\n * const { app } = await api.updateApp('MY_APP_ID', {\n * title: 'New title',\n * });\n * ```\n *\n * @param appId -- UUID of the app\n * @param fields.title -- New title for the app\n */\n async updateApp(\n appId: string,\n fields: InstantAPIUpdateAppBody,\n ): Promise<InstantAPIUpdateAppResponse> {\n return this.withRetry(updateApp, [\n this.#apiURI,\n this.token(),\n appId,\n fields,\n ]);\n }\n\n /**\n * Delete an app by its id.\n *\n * ```ts\n * const { app } = await api.deleteApp('MY_APP_ID');\n * ```\n *\n * @param appId -- UUID of the app\n */\n async deleteApp(appId: string): Promise<InstantAPIDeleteAppResponse> {\n return this.withRetry(deleteApp, [this.#apiURI, this.token(), appId]);\n }\n\n /**\n * Dry-run a **schema push** and receive a _plan_ of steps the server would\n * execute.\n *\n * ```ts\n * const { steps } = await api.planSchemaPush(appId, body);\n * ```\n */\n async planSchemaPush(\n appId: string,\n body: InstantAPISchemaPushBody,\n ): Promise<InstantAPIPlanSchemaPushResponse> {\n return this.withRetry(planSchemaPush, [\n this.#apiURI,\n this.token(),\n appId,\n body,\n ]);\n }\n\n /**\n * Execute a **schema push**. The server returns a long-running job\n * represented as a {@link ProgressPromise}: you can both `await` the final\n * result **or** subscribe to intermediate status updates.\n *\n * ```ts\n * // 1) Subscribe to progress\n * const schema = i.schema({\n * entities: {\n * books: i.entity({\n * title: i.string().indexed(),\n * }),\n * },\n * });\n * const job = api.schemaPush(appId, { schema: schema });\n * job\n * .then(({ summary }) => console.log('done!', summary))\n * .catch((e) => console.error(e));\n * job.subscribe({\n * next: (status) => renderProgress(status),\n * });\n *\n * // 2) Or just await it\n * const result = await api.schemaPush(appId, { schema: schema });\n * ```\n */\n schemaPush(\n appId: string,\n body: InstantAPISchemaPushBody,\n ): ProgressPromise<InProgressStepsSummary, InstantAPISchemaPushResponse> {\n if (!this.#auth) {\n throw new PlatformApiMissingAuthError();\n }\n return new ProgressPromise(async (progress, resolve, reject) => {\n // It's tricky to add withRetry to the background process that fetches the jobs,\n // so we'll just refresh the token at the start.\n if (this.canRefreshToken()) {\n try {\n await this.refreshToken();\n } catch (_e) {}\n }\n schemaPush(this.#apiURI, this.token(), appId, body).subscribe({\n complete(v) {\n resolve(v);\n },\n error(e) {\n reject(e);\n },\n next(v) {\n progress(v);\n },\n });\n });\n }\n\n /**\n * Update permission rules for an app by its id.\n *\n * Completely replaces the current rule set.\n *\n * ```ts\n * const { steps } = await api.pushPerms(appId, {\n * perms: {\n * $default: { allow: { $default: 'false' } },\n * books: { allow: { view: 'true', $default: 'false' } },\n * },\n * });\n * ```\n */\n async pushPerms(\n appId: string,\n body: InstantAPIPushPermsBody,\n ): Promise<InstantAPIPushPermsResponse> {\n if (!this.#auth) {\n throw new PlatformApiMissingAuthError();\n }\n return this.withRetry(pushPerms, [this.#apiURI, this.token(), appId, body]);\n }\n\n async tokenInfo(): Promise<InstantAPITokenInfoResponse> {\n if (!this.#auth) {\n throw new PlatformApiMissingAuthError();\n }\n return this.withRetry(tokenInfo, [this.#apiURI, this.token()]);\n }\n}\n"]}
|
|
@@ -21,15 +21,27 @@ export const attrDefToNewAttrTx = (attrInSchema, entityName, createdName) => {
|
|
|
21
21
|
export const linkDefToNewAttrTx = (link) => {
|
|
22
22
|
const relationship = `${link.forward.has}-${link.reverse.has}`;
|
|
23
23
|
const uniqueAndCardinality = relationshipConstraints[relationship];
|
|
24
|
-
return
|
|
24
|
+
return {
|
|
25
|
+
'checked-data-type': null,
|
|
26
|
+
'index?': false,
|
|
27
|
+
...uniqueAndCardinality,
|
|
28
|
+
'required?': false,
|
|
29
|
+
identifier: {
|
|
25
30
|
attrName: link.forward.label,
|
|
26
31
|
namespace: link.forward.on,
|
|
27
|
-
},
|
|
32
|
+
},
|
|
33
|
+
'value-type': 'ref',
|
|
34
|
+
type: 'add-attr',
|
|
35
|
+
'forward-identity': {
|
|
28
36
|
attrName: link.forward.label,
|
|
29
37
|
namespace: link.forward.on,
|
|
30
|
-
},
|
|
38
|
+
},
|
|
39
|
+
'on-delete': link.forward.onDelete,
|
|
40
|
+
'on-delete-reverse': link.reverse.onDelete,
|
|
41
|
+
'reverse-identity': {
|
|
31
42
|
attrName: link.reverse.label,
|
|
32
43
|
namespace: link.reverse.on,
|
|
33
|
-
}
|
|
44
|
+
},
|
|
45
|
+
};
|
|
34
46
|
};
|
|
35
47
|
//# sourceMappingURL=migrationUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrationUtils.js","sourceRoot":"","sources":["../../src/migrationUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAqB,MAAM,oBAAoB,CAAC;AAEhF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,YAAqB,EACrB,UAAkB,EAClB,WAAmB,EACN,EAAE;IACf,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,SAAS,EAAE,YAAY,CAAC,MAAM,CAAC,MAAM;QACrC,YAAY,EAAE,MAAM;QACpB,WAAW,EAAE,KAAK;QAClB,UAAU,EAAE;YACV,SAAS,EAAE,UAAU;YACrB,QAAQ,EAAE,WAAW;SACtB;QACD,WAAW,EAAE,YAAY,CAAC,QAAQ;QAClC,kBAAkB,EAAE;YAClB,QAAQ,EAAE,WAAW;YACrB,SAAS,EAAE,UAAU;SACtB;QACD,QAAQ,EAAE,YAAY,CAAC,MAAM,CAAC,OAAO;QACrC,mBAAmB,EACjB,YAAY,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;KACpE,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAa,EAAe,EAAE;IAC/D,MAAM,YAAY,GAChB,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAuB,CAAC;IACjE,MAAM,oBAAoB,GAAG,uBAAuB,CAAC,YAAY,CAAC,CAAC;IAEnE,
|
|
1
|
+
{"version":3,"file":"migrationUtils.js","sourceRoot":"","sources":["../../src/migrationUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAqB,MAAM,oBAAoB,CAAC;AAEhF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,YAAqB,EACrB,UAAkB,EAClB,WAAmB,EACN,EAAE;IACf,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,SAAS,EAAE,YAAY,CAAC,MAAM,CAAC,MAAM;QACrC,YAAY,EAAE,MAAM;QACpB,WAAW,EAAE,KAAK;QAClB,UAAU,EAAE;YACV,SAAS,EAAE,UAAU;YACrB,QAAQ,EAAE,WAAW;SACtB;QACD,WAAW,EAAE,YAAY,CAAC,QAAQ;QAClC,kBAAkB,EAAE;YAClB,QAAQ,EAAE,WAAW;YACrB,SAAS,EAAE,UAAU;SACtB;QACD,QAAQ,EAAE,YAAY,CAAC,MAAM,CAAC,OAAO;QACrC,mBAAmB,EACjB,YAAY,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;KACpE,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAa,EAAe,EAAE;IAC/D,MAAM,YAAY,GAChB,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAuB,CAAC;IACjE,MAAM,oBAAoB,GAAG,uBAAuB,CAAC,YAAY,CAAC,CAAC;IAEnE,OAAO;QACL,mBAAmB,EAAE,IAAI;QACzB,QAAQ,EAAE,KAAK;QACf,GAAG,oBAAoB;QACvB,WAAW,EAAE,KAAK;QAClB,UAAU,EAAE;YACV,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;YAC5B,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;SAC3B;QACD,YAAY,EAAE,KAAK;QACnB,IAAI,EAAE,UAAU;QAChB,kBAAkB,EAAE;YAClB,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;YAC5B,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;SAC3B;QACD,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ;QAClC,mBAAmB,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ;QAC1C,kBAAkB,EAAE;YAClB,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;YAC5B,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;SAC3B;KACF,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { AnyBlob, AnyLink, MigrationTx } from './migrations.ts';\nimport { relationshipConstraints, RelationshipKinds } from './relationships.ts';\n\nexport const attrDefToNewAttrTx = (\n attrInSchema: AnyBlob,\n entityName: string,\n createdName: string,\n): MigrationTx => {\n return {\n type: 'add-attr',\n 'unique?': attrInSchema.config.unique,\n 'value-type': 'blob',\n cardinality: 'one',\n identifier: {\n namespace: entityName,\n attrName: createdName,\n },\n 'required?': attrInSchema.required,\n 'forward-identity': {\n attrName: createdName,\n namespace: entityName,\n },\n 'index?': attrInSchema.config.indexed,\n 'checked-data-type':\n attrInSchema.valueType !== 'json' ? attrInSchema.valueType : null,\n };\n};\n\nexport const linkDefToNewAttrTx = (link: AnyLink): MigrationTx => {\n const relationship =\n `${link.forward.has}-${link.reverse.has}` as RelationshipKinds;\n const uniqueAndCardinality = relationshipConstraints[relationship];\n\n return {\n 'checked-data-type': null,\n 'index?': false,\n ...uniqueAndCardinality,\n 'required?': false,\n identifier: {\n attrName: link.forward.label,\n namespace: link.forward.on,\n },\n 'value-type': 'ref',\n type: 'add-attr',\n 'forward-identity': {\n attrName: link.forward.label,\n namespace: link.forward.on,\n },\n 'on-delete': link.forward.onDelete,\n 'on-delete-reverse': link.reverse.onDelete,\n 'reverse-identity': {\n attrName: link.reverse.label,\n namespace: link.reverse.on,\n },\n };\n};\n"]}
|
package/dist/esm/migrations.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 { id, } from '@instantdb/core';
|
|
11
2
|
import { attrDefToNewAttrTx, linkDefToNewAttrTx } from "./migrationUtils.js";
|
|
12
3
|
import { relationshipConstraints } from "./relationships.js";
|
|
@@ -143,8 +134,7 @@ const CONVERTERS = {
|
|
|
143
134
|
},
|
|
144
135
|
};
|
|
145
136
|
function isSystemCatalogAttr(systemCatalogIdentNames, entityName, attrName) {
|
|
146
|
-
|
|
147
|
-
return !!((_a = systemCatalogIdentNames[entityName]) === null || _a === void 0 ? void 0 : _a.has(attrName));
|
|
137
|
+
return !!systemCatalogIdentNames[entityName]?.has(attrName);
|
|
148
138
|
}
|
|
149
139
|
export const convertTxSteps = (txs, existingAttrs) => {
|
|
150
140
|
if (!existingAttrs) {
|
|
@@ -166,8 +156,7 @@ export const convertTxSteps = (txs, existingAttrs) => {
|
|
|
166
156
|
});
|
|
167
157
|
return result;
|
|
168
158
|
};
|
|
169
|
-
export const diffSchemas = (oldSchema, newSchema, resolveFn, systemCatalogIdentNames) =>
|
|
170
|
-
var _a, _b;
|
|
159
|
+
export const diffSchemas = async (oldSchema, newSchema, resolveFn, systemCatalogIdentNames) => {
|
|
171
160
|
const transactions = [];
|
|
172
161
|
const oldEntities = oldSchema.entities;
|
|
173
162
|
const newEntities = newSchema.entities;
|
|
@@ -240,7 +229,7 @@ export const diffSchemas = (oldSchema, newSchema, resolveFn, systemCatalogIdentN
|
|
|
240
229
|
const newEntityHasIt = Object.keys(newEntities[entityName].attrs).includes(field);
|
|
241
230
|
return !newEntityHasIt;
|
|
242
231
|
});
|
|
243
|
-
const resolved =
|
|
232
|
+
const resolved = await resolveRenames(addedFields, removedFields, resolveFn, {
|
|
244
233
|
type: 'attribute',
|
|
245
234
|
entityName: entityName,
|
|
246
235
|
});
|
|
@@ -330,10 +319,10 @@ export const diffSchemas = (oldSchema, newSchema, resolveFn, systemCatalogIdentN
|
|
|
330
319
|
attrName: oldLink.forward.label,
|
|
331
320
|
}, oldLink, newLink));
|
|
332
321
|
});
|
|
333
|
-
const resolved =
|
|
322
|
+
const resolved = await resolveRenames(addedIdentities, removedIdentities, resolveFn, {
|
|
334
323
|
type: 'link',
|
|
335
|
-
forwardEntityName:
|
|
336
|
-
reverseEntityName:
|
|
324
|
+
forwardEntityName: oldLinksInGroup[0]?.forward.on,
|
|
325
|
+
reverseEntityName: oldLinksInGroup[0]?.reverse.on,
|
|
337
326
|
});
|
|
338
327
|
resolved.deleted.forEach((identity) => {
|
|
339
328
|
const link = oldLinksInGroup.find((l) => createLinkIdentity(l) === identity);
|
|
@@ -384,7 +373,7 @@ export const diffSchemas = (oldSchema, newSchema, resolveFn, systemCatalogIdentN
|
|
|
384
373
|
});
|
|
385
374
|
}
|
|
386
375
|
return transactions;
|
|
387
|
-
}
|
|
376
|
+
};
|
|
388
377
|
export const compareBlobs = (identity, oldBlob, newBlob) => {
|
|
389
378
|
const results = [];
|
|
390
379
|
const sendType = (type) => {
|
|
@@ -467,7 +456,7 @@ export const isRenamePromptItem = (item) => {
|
|
|
467
456
|
return true;
|
|
468
457
|
return false;
|
|
469
458
|
};
|
|
470
|
-
const resolveRenames = (newItems, missingItems, resolveFn, extraInfo) =>
|
|
459
|
+
const resolveRenames = async (newItems, missingItems, resolveFn, extraInfo) => {
|
|
471
460
|
if (missingItems.length === 0 || newItems.length === 0) {
|
|
472
461
|
return {
|
|
473
462
|
created: newItems,
|
|
@@ -484,7 +473,7 @@ const resolveRenames = (newItems, missingItems, resolveFn, extraInfo) => __await
|
|
|
484
473
|
return { from: it, to: created };
|
|
485
474
|
});
|
|
486
475
|
const promptData = [created, ...renames];
|
|
487
|
-
const data =
|
|
476
|
+
const data = await resolveFn(created, promptData, extraInfo);
|
|
488
477
|
if (isRenamePromptItem(data)) {
|
|
489
478
|
if (data.from !== data.to) {
|
|
490
479
|
result.renamed.push(data);
|
|
@@ -499,5 +488,5 @@ const resolveRenames = (newItems, missingItems, resolveFn, extraInfo) => __await
|
|
|
499
488
|
} while (index < newItems.length);
|
|
500
489
|
result.deleted.push(...leftMissing);
|
|
501
490
|
return result;
|
|
502
|
-
}
|
|
491
|
+
};
|
|
503
492
|
//# sourceMappingURL=migrations.js.map
|