@autonoma-ai/sdk-prisma 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -288,6 +288,10 @@ function prismaAdapter(prisma, config) {
288
288
  async teardown(scopeValue, refs) {
289
289
  const schema = this.getSchema();
290
290
  return teardown(prisma, schema, scopeValue, refs);
291
+ },
292
+ async updateEntity(model, id, fields) {
293
+ const delegate = prisma[model.charAt(0).toLowerCase() + model.slice(1)];
294
+ await delegate.update({ where: { id }, data: fields });
291
295
  }
292
296
  };
293
297
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/introspect.ts","../src/create.ts","../src/teardown.ts","../src/index.ts"],"sourcesContent":["import type { SchemaInfo, ModelInfo, FieldInfo, FKEdge, SchemaRelation } from '@autonoma-ai/sdk'\n\ninterface PrismaClient {\n _runtimeDataModel?: { models: Record<string, DMMFModel> }\n _baseDmmf?: { datamodel: { models: DMMFModel[] } }\n}\n\ninterface DMMFModel {\n name: string\n fields: DMMFField[]\n}\n\ninterface DMMFField {\n name: string\n type: string\n kind: string\n isList?: boolean\n isRequired?: boolean\n isId?: boolean\n hasDefaultValue?: boolean\n isUpdatedAt?: boolean\n isGenerated?: boolean\n relationFromFields?: string[]\n relationToFields?: string[]\n relationName?: string\n}\n\nexport interface PrismaAdapterConfig {\n scopeField: string\n}\n\n/**\n * Introspect Prisma DMMF to extract schema metadata.\n * Supports Prisma 5/6 (full DMMF) and Prisma 7+ (stripped _runtimeDataModel, uses inference).\n */\nexport function introspectPrisma(\n prisma: PrismaClient,\n config: PrismaAdapterConfig,\n): SchemaInfo {\n const dmmfModels = getDMMFModels(prisma)\n\n // Prisma 7+ stripped relationFromFields/relationToFields from _runtimeDataModel.\n // Detect by checking if any object field still carries that metadata.\n const hasDMMFRelationMeta = dmmfModels.some((m) =>\n m.fields.some((f) => f.kind === 'object' && f.relationFromFields !== undefined),\n )\n\n const models: ModelInfo[] = []\n const edges: FKEdge[] = []\n const relations: SchemaRelation[] = []\n\n // Extract scalar/enum fields for every model\n for (const model of dmmfModels) {\n const fields: FieldInfo[] = []\n for (const field of model.fields) {\n if (field.kind !== 'scalar' && field.kind !== 'enum') continue\n const { isId, hasDefault, isRequired } = hasDMMFRelationMeta\n ? {\n isId: field.isId ?? false,\n hasDefault:\n field.hasDefaultValue || !!field.isUpdatedAt || !!field.isGenerated || false,\n isRequired: field.isRequired ?? true,\n }\n : inferFieldMetadata(field)\n fields.push({ name: field.name, type: field.type, isRequired, isId, hasDefault })\n }\n models.push({ name: model.name, fields })\n }\n\n if (hasDMMFRelationMeta) {\n buildEdgesFromDMMF(dmmfModels, edges)\n buildRelationsFromDMMF(dmmfModels, edges, relations)\n } else {\n buildEdgesFromInference(dmmfModels, edges)\n buildRelationsFromInference(dmmfModels, edges, relations)\n }\n\n return { models, edges, relations, scopeField: config.scopeField }\n}\n\n// ---------------------------------------------------------------------------\n// Prisma 7+: inference-based FK detection\n// ---------------------------------------------------------------------------\n\n/**\n * Infer isId / hasDefault / isRequired from field name + type conventions.\n * Used when Prisma 7 strips those attributes from _runtimeDataModel.\n */\nfunction inferFieldMetadata(field: DMMFField): {\n isId: boolean\n hasDefault: boolean\n isRequired: boolean\n} {\n const isId = field.name === 'id'\n const isAutoTimestamp =\n (field.name === 'createdAt' ||\n field.name === 'updatedAt' ||\n field.name.endsWith('At')) &&\n field.type === 'DateTime'\n const hasDefault = isId || isAutoTimestamp\n return { isId, hasDefault, isRequired: !hasDefault }\n}\n\n/**\n * Infer FK edges from scalar field names.\n * For an object field `organization: Organization`, if the same model has a scalar\n * field named `organizationId` or `organizationId` (lowerFirst(type) + \"Id\"),\n * that scalar is the FK.\n */\nfunction buildEdgesFromInference(dmmfModels: DMMFModel[], edges: FKEdge[]): void {\n for (const model of dmmfModels) {\n const scalarNames = new Set(\n model.fields.filter((f) => f.kind === 'scalar' || f.kind === 'enum').map((f) => f.name),\n )\n\n for (const field of model.fields) {\n if (field.kind !== 'object') continue\n const fkField = findFKField(field, scalarNames)\n if (fkField) {\n edges.push({\n from: model.name,\n to: field.type,\n localField: fkField,\n foreignField: 'id',\n nullable: false,\n })\n }\n }\n }\n}\n\n/**\n * Build parent→child relation mappings using inferred edges.\n * - Child side (has scalar FK): parentModel=thisModel, childModel=field.type\n * - Parent side (no scalar FK): find the edge on the child model pointing back here\n */\nfunction buildRelationsFromInference(\n dmmfModels: DMMFModel[],\n edges: FKEdge[],\n relations: SchemaRelation[],\n): void {\n for (const model of dmmfModels) {\n const scalarNames = new Set(\n model.fields.filter((f) => f.kind === 'scalar' || f.kind === 'enum').map((f) => f.name),\n )\n\n for (const field of model.fields) {\n if (field.kind !== 'object') continue\n const fkField = findFKField(field, scalarNames)\n\n if (fkField) {\n // This model is the child — it holds the FK pointing to field.type\n relations.push({\n parentModel: model.name,\n childModel: field.type,\n parentField: field.name,\n childField: fkField,\n })\n } else {\n // This model is the parent — the child holds the FK back to this model\n const childEdge = edges.find((e) => e.from === field.type && e.to === model.name)\n if (childEdge) {\n relations.push({\n parentModel: model.name,\n childModel: field.type,\n parentField: field.name,\n childField: childEdge.localField,\n })\n }\n }\n }\n }\n}\n\n/**\n * Given an object field and the set of scalar field names on the same model,\n * return the FK scalar field name if one can be found, or null.\n *\n * Tries (in order):\n * 1. `${fieldName}Id` e.g. organization → organizationId\n * 2. `${lowerFirst(type)}Id` e.g. Organization → organizationId\n */\nfunction findFKField(field: DMMFField, scalarNames: Set<string>): string | null {\n const byFieldName = `${field.name}Id`\n if (scalarNames.has(byFieldName)) return byFieldName\n\n const byTypeName = `${lowerFirst(field.type)}Id`\n if (scalarNames.has(byTypeName)) return byTypeName\n\n return null\n}\n\nfunction lowerFirst(str: string): string {\n return str.charAt(0).toLowerCase() + str.slice(1)\n}\n\n// ---------------------------------------------------------------------------\n// Prisma ≤6: DMMF-based FK detection (unchanged original logic)\n// ---------------------------------------------------------------------------\n\nfunction buildEdgesFromDMMF(dmmfModels: DMMFModel[], edges: FKEdge[]): void {\n for (const model of dmmfModels) {\n for (const field of model.fields) {\n if (field.kind === 'object' && field.relationFromFields?.length) {\n edges.push({\n from: model.name,\n to: field.type,\n localField: field.relationFromFields[0]!,\n foreignField: field.relationToFields?.[0] ?? 'id',\n nullable: !field.isRequired,\n })\n }\n }\n }\n}\n\nfunction buildRelationsFromDMMF(\n dmmfModels: DMMFModel[],\n edges: FKEdge[],\n relations: SchemaRelation[],\n): void {\n // Parent side: object fields with no relationFromFields (they don't hold the FK)\n for (const model of dmmfModels) {\n for (const field of model.fields) {\n if (field.kind === 'object' && !field.relationFromFields?.length) {\n const childEdge = edges.find(\n (e) => e.from === field.type && e.to === model.name && e.foreignField === 'id',\n )\n const childEdgeByRelation =\n !childEdge\n ? edges.find((e) => {\n if (e.from !== field.type || e.to !== model.name) return false\n const childModel = dmmfModels.find((m) => m.name === field.type)\n if (!childModel) return false\n const childField = childModel.fields.find(\n (f) =>\n f.kind === 'object' &&\n f.relationName === field.relationName &&\n f.relationFromFields?.length,\n )\n return childField?.relationFromFields?.[0] === e.localField\n })\n : null\n\n const edge = childEdge ?? childEdgeByRelation\n if (edge) {\n relations.push({\n parentModel: model.name,\n childModel: field.type,\n parentField: field.name,\n childField: edge.localField,\n })\n }\n }\n }\n }\n\n // Child-side singular relations: object fields that DO hold the FK\n for (const model of dmmfModels) {\n for (const field of model.fields) {\n if (field.kind === 'object' && !field.isList && field.relationFromFields?.length) {\n const localField = field.relationFromFields[0]!\n const alreadyCovered = relations.some(\n (r) => r.parentModel === model.name && r.parentField === field.name,\n )\n if (!alreadyCovered) {\n relations.push({\n parentModel: model.name,\n childModel: field.type,\n parentField: field.name,\n childField: localField,\n })\n }\n }\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// DMMF model extraction\n// ---------------------------------------------------------------------------\n\nfunction getDMMFModels(prisma: PrismaClient): DMMFModel[] {\n if (prisma._runtimeDataModel?.models) {\n return Object.entries(prisma._runtimeDataModel.models).map(([name, model]) => ({\n ...model,\n name,\n }))\n }\n\n if (prisma._baseDmmf?.datamodel?.models) {\n return prisma._baseDmmf.datamodel.models\n }\n\n throw new Error(\n 'Cannot introspect Prisma schema. Ensure @prisma/client is generated.',\n )\n}\n","import type { ResolvedEntitySpec, CreateContext } from '@autonoma-ai/sdk'\n\ntype PrismaClient = Record<string, any>\n\n/**\n * Create entities using Prisma client.\n *\n * - Normal mode: individual create() calls, returns all created records (available in refs)\n * - Batch mode: single createMany() call, much faster for large counts but returns empty array\n */\nexport async function createEntities(\n prisma: PrismaClient,\n spec: Record<string, ResolvedEntitySpec>,\n _context: CreateContext,\n): Promise<Record<string, Record<string, unknown>[]>> {\n const results: Record<string, Record<string, unknown>[]> = {}\n\n await prisma.$transaction(async (tx: PrismaClient) => {\n for (const [model, entitySpec] of Object.entries(spec)) {\n const delegate = tx[camelCase(model)]\n if (!delegate) {\n throw new Error(`Prisma model '${model}' not found. Check model name casing.`)\n }\n\n if (entitySpec.batch) {\n // Batch: single createMany call — fast, but no records returned\n await delegate.createMany({ data: entitySpec.fields })\n results[model] = []\n } else {\n // Normal: individual creates — returns records for refs\n const created: Record<string, unknown>[] = []\n for (const fields of entitySpec.fields) {\n const record = await delegate.create({ data: fields })\n created.push(record)\n }\n results[model] = created\n }\n }\n })\n\n return results\n}\n\nfunction camelCase(str: string): string {\n return str.charAt(0).toLowerCase() + str.slice(1)\n}\n","import type { SchemaInfo, FKEdge } from '@autonoma-ai/sdk'\nimport { topoSort, findDeferrableEdge } from '@autonoma-ai/sdk'\n\ntype PrismaClient = Record<string, any>\n\n/**\n * Tear down all data scoped to a value, in reverse topological order.\n *\n * Strategy:\n * 1. Find the scope root model (e.g. Organization) from FK edges\n * 2. Any model with a FK pointing to the scope root is a \"scoped model\"\n * 3. Delete scoped models by their FK = scopeValue (regardless of field name casing)\n * 4. Delete non-scoped models by their record IDs from refs\n * 5. Delete the scope root entity last by id = scopeValue\n */\nexport async function teardown(\n prisma: PrismaClient,\n schema: SchemaInfo,\n scopeValue: string,\n refs?: Record<string, Record<string, unknown>[]>,\n): Promise<void> {\n // Find scope root: the model that the scopeField FK points TO\n // e.g. scopeField = \"organizationID\", edges have { to: \"Organization\" } → root is Organization\n let scopeRootModel: string | null = null\n for (const edge of schema.edges) {\n if (edge.localField.toLowerCase() === schema.scopeField.toLowerCase() && edge.to !== edge.from) {\n scopeRootModel = edge.to\n break\n }\n }\n\n // Build map: model → FK field name that points to the scope root\n // Handles mixed casing (organizationId vs organizationID)\n const scopeFieldByModel = new Map<string, string>()\n if (scopeRootModel) {\n for (const edge of schema.edges) {\n if (edge.to === scopeRootModel && edge.from !== scopeRootModel) {\n scopeFieldByModel.set(edge.from, edge.localField)\n }\n }\n }\n\n const modelNames = schema.models.map((m) => m.name)\n const { sorted, cycles } = topoSort(modelNames, schema.edges)\n\n await prisma.$transaction(async (tx: PrismaClient) => {\n // Break cycles\n for (const cycle of cycles) {\n const edge = findDeferrableEdge(cycle, schema.edges)\n if (edge) {\n const scopeFK = scopeFieldByModel.get(edge.from)\n if (scopeFK) {\n const delegate = tx[camelCase(edge.from)]\n if (delegate) {\n await delegate.updateMany({\n where: { [scopeFK]: scopeValue },\n data: { [edge.localField]: null },\n })\n }\n }\n }\n }\n\n // Delete cycle nodes\n for (const cycle of cycles) {\n for (const model of cycle) {\n await deleteModel(tx, model, scopeValue, scopeFieldByModel, refs)\n }\n }\n\n // Delete in reverse topo order (dependents first)\n const reversed = [...sorted].reverse()\n for (const model of reversed) {\n if (model === scopeRootModel) continue // deleted last\n await deleteModel(tx, model, scopeValue, scopeFieldByModel, refs)\n }\n\n // Delete the scope root entity last\n if (scopeRootModel) {\n const delegate = tx[camelCase(scopeRootModel)]\n if (delegate) {\n await delegate.deleteMany({ where: { id: scopeValue } })\n }\n }\n })\n}\n\nasync function deleteModel(\n tx: PrismaClient,\n model: string,\n scopeValue: string,\n scopeFieldByModel: Map<string, string>,\n refs?: Record<string, Record<string, unknown>[]>,\n): Promise<void> {\n const delegate = tx[camelCase(model)]\n if (!delegate) {\n return\n }\n\n const scopeFK = scopeFieldByModel.get(model)\n if (scopeFK) {\n // Has FK to scope root → delete by that FK\n await delegate.deleteMany({ where: { [scopeFK]: scopeValue } })\n } else if (refs?.[model]) {\n // No FK to scope root, but we created records → delete by IDs\n const ids = refs[model]\n .map((r) => r.id)\n .filter((id): id is string => typeof id === 'string')\n if (ids.length > 0) {\n await delegate.deleteMany({ where: { id: { in: ids } } })\n }\n }\n}\n\nfunction camelCase(str: string): string {\n return str.charAt(0).toLowerCase() + str.slice(1)\n}\n","import type { OrmAdapter, SchemaInfo, ResolvedEntitySpec, CreateContext } from '@autonoma-ai/sdk'\nimport { introspectPrisma, type PrismaAdapterConfig } from './introspect'\nimport { createEntities } from './create'\nimport { teardown } from './teardown'\n\nexport type { PrismaAdapterConfig }\n\n/**\n * Create a Prisma ORM adapter for the Autonoma SDK.\n *\n * @example\n * ```ts\n * import { prismaAdapter } from '@autonoma-ai/sdk-prisma'\n * import { prisma } from './db'\n *\n * const adapter = prismaAdapter(prisma, { scopeField: 'organizationId' })\n * ```\n */\nexport function prismaAdapter(\n prisma: any,\n config: PrismaAdapterConfig,\n): OrmAdapter {\n let cachedSchema: SchemaInfo | null = null\n\n return {\n getSchema() {\n if (!cachedSchema) {\n cachedSchema = introspectPrisma(prisma, config)\n }\n return cachedSchema\n },\n\n async createEntities(\n spec: Record<string, ResolvedEntitySpec>,\n context: CreateContext,\n ) {\n return createEntities(prisma, spec, context)\n },\n\n async teardown(scopeValue: string, refs?: Record<string, Record<string, unknown>[]>) {\n const schema = this.getSchema()\n return teardown(prisma, schema, scopeValue, refs)\n },\n }\n}\n"],"mappings":"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","names":["camelCase"]}
1
+ {"version":3,"sources":["../src/introspect.ts","../src/create.ts","../src/teardown.ts","../src/index.ts"],"sourcesContent":["import type { SchemaInfo, ModelInfo, FieldInfo, FKEdge, SchemaRelation } from '@autonoma-ai/sdk'\n\ninterface PrismaClient {\n _runtimeDataModel?: { models: Record<string, DMMFModel> }\n _baseDmmf?: { datamodel: { models: DMMFModel[] } }\n}\n\ninterface DMMFModel {\n name: string\n fields: DMMFField[]\n}\n\ninterface DMMFField {\n name: string\n type: string\n kind: string\n isList?: boolean\n isRequired?: boolean\n isId?: boolean\n hasDefaultValue?: boolean\n isUpdatedAt?: boolean\n isGenerated?: boolean\n relationFromFields?: string[]\n relationToFields?: string[]\n relationName?: string\n}\n\nexport interface PrismaAdapterConfig {\n scopeField: string\n}\n\n/**\n * Introspect Prisma DMMF to extract schema metadata.\n * Supports Prisma 5/6 (full DMMF) and Prisma 7+ (stripped _runtimeDataModel, uses inference).\n */\nexport function introspectPrisma(\n prisma: PrismaClient,\n config: PrismaAdapterConfig,\n): SchemaInfo {\n const dmmfModels = getDMMFModels(prisma)\n\n // Prisma 7+ stripped relationFromFields/relationToFields from _runtimeDataModel.\n // Detect by checking if any object field still carries that metadata.\n const hasDMMFRelationMeta = dmmfModels.some((m) =>\n m.fields.some((f) => f.kind === 'object' && f.relationFromFields !== undefined),\n )\n\n const models: ModelInfo[] = []\n const edges: FKEdge[] = []\n const relations: SchemaRelation[] = []\n\n // Extract scalar/enum fields for every model\n for (const model of dmmfModels) {\n const fields: FieldInfo[] = []\n for (const field of model.fields) {\n if (field.kind !== 'scalar' && field.kind !== 'enum') continue\n const { isId, hasDefault, isRequired } = hasDMMFRelationMeta\n ? {\n isId: field.isId ?? false,\n hasDefault:\n field.hasDefaultValue || !!field.isUpdatedAt || !!field.isGenerated || false,\n isRequired: field.isRequired ?? true,\n }\n : inferFieldMetadata(field)\n fields.push({ name: field.name, type: field.type, isRequired, isId, hasDefault })\n }\n models.push({ name: model.name, fields })\n }\n\n if (hasDMMFRelationMeta) {\n buildEdgesFromDMMF(dmmfModels, edges)\n buildRelationsFromDMMF(dmmfModels, edges, relations)\n } else {\n buildEdgesFromInference(dmmfModels, edges)\n buildRelationsFromInference(dmmfModels, edges, relations)\n }\n\n return { models, edges, relations, scopeField: config.scopeField }\n}\n\n// ---------------------------------------------------------------------------\n// Prisma 7+: inference-based FK detection\n// ---------------------------------------------------------------------------\n\n/**\n * Infer isId / hasDefault / isRequired from field name + type conventions.\n * Used when Prisma 7 strips those attributes from _runtimeDataModel.\n */\nfunction inferFieldMetadata(field: DMMFField): {\n isId: boolean\n hasDefault: boolean\n isRequired: boolean\n} {\n const isId = field.name === 'id'\n const isAutoTimestamp =\n (field.name === 'createdAt' ||\n field.name === 'updatedAt' ||\n field.name.endsWith('At')) &&\n field.type === 'DateTime'\n const hasDefault = isId || isAutoTimestamp\n return { isId, hasDefault, isRequired: !hasDefault }\n}\n\n/**\n * Infer FK edges from scalar field names.\n * For an object field `organization: Organization`, if the same model has a scalar\n * field named `organizationId` or `organizationId` (lowerFirst(type) + \"Id\"),\n * that scalar is the FK.\n */\nfunction buildEdgesFromInference(dmmfModels: DMMFModel[], edges: FKEdge[]): void {\n for (const model of dmmfModels) {\n const scalarNames = new Set(\n model.fields.filter((f) => f.kind === 'scalar' || f.kind === 'enum').map((f) => f.name),\n )\n\n for (const field of model.fields) {\n if (field.kind !== 'object') continue\n const fkField = findFKField(field, scalarNames)\n if (fkField) {\n edges.push({\n from: model.name,\n to: field.type,\n localField: fkField,\n foreignField: 'id',\n nullable: false,\n })\n }\n }\n }\n}\n\n/**\n * Build parent→child relation mappings using inferred edges.\n * - Child side (has scalar FK): parentModel=thisModel, childModel=field.type\n * - Parent side (no scalar FK): find the edge on the child model pointing back here\n */\nfunction buildRelationsFromInference(\n dmmfModels: DMMFModel[],\n edges: FKEdge[],\n relations: SchemaRelation[],\n): void {\n for (const model of dmmfModels) {\n const scalarNames = new Set(\n model.fields.filter((f) => f.kind === 'scalar' || f.kind === 'enum').map((f) => f.name),\n )\n\n for (const field of model.fields) {\n if (field.kind !== 'object') continue\n const fkField = findFKField(field, scalarNames)\n\n if (fkField) {\n // This model is the child — it holds the FK pointing to field.type\n relations.push({\n parentModel: model.name,\n childModel: field.type,\n parentField: field.name,\n childField: fkField,\n })\n } else {\n // This model is the parent — the child holds the FK back to this model\n const childEdge = edges.find((e) => e.from === field.type && e.to === model.name)\n if (childEdge) {\n relations.push({\n parentModel: model.name,\n childModel: field.type,\n parentField: field.name,\n childField: childEdge.localField,\n })\n }\n }\n }\n }\n}\n\n/**\n * Given an object field and the set of scalar field names on the same model,\n * return the FK scalar field name if one can be found, or null.\n *\n * Tries (in order):\n * 1. `${fieldName}Id` e.g. organization → organizationId\n * 2. `${lowerFirst(type)}Id` e.g. Organization → organizationId\n */\nfunction findFKField(field: DMMFField, scalarNames: Set<string>): string | null {\n const byFieldName = `${field.name}Id`\n if (scalarNames.has(byFieldName)) return byFieldName\n\n const byTypeName = `${lowerFirst(field.type)}Id`\n if (scalarNames.has(byTypeName)) return byTypeName\n\n return null\n}\n\nfunction lowerFirst(str: string): string {\n return str.charAt(0).toLowerCase() + str.slice(1)\n}\n\n// ---------------------------------------------------------------------------\n// Prisma ≤6: DMMF-based FK detection (unchanged original logic)\n// ---------------------------------------------------------------------------\n\nfunction buildEdgesFromDMMF(dmmfModels: DMMFModel[], edges: FKEdge[]): void {\n for (const model of dmmfModels) {\n for (const field of model.fields) {\n if (field.kind === 'object' && field.relationFromFields?.length) {\n edges.push({\n from: model.name,\n to: field.type,\n localField: field.relationFromFields[0]!,\n foreignField: field.relationToFields?.[0] ?? 'id',\n nullable: !field.isRequired,\n })\n }\n }\n }\n}\n\nfunction buildRelationsFromDMMF(\n dmmfModels: DMMFModel[],\n edges: FKEdge[],\n relations: SchemaRelation[],\n): void {\n // Parent side: object fields with no relationFromFields (they don't hold the FK)\n for (const model of dmmfModels) {\n for (const field of model.fields) {\n if (field.kind === 'object' && !field.relationFromFields?.length) {\n const childEdge = edges.find(\n (e) => e.from === field.type && e.to === model.name && e.foreignField === 'id',\n )\n const childEdgeByRelation =\n !childEdge\n ? edges.find((e) => {\n if (e.from !== field.type || e.to !== model.name) return false\n const childModel = dmmfModels.find((m) => m.name === field.type)\n if (!childModel) return false\n const childField = childModel.fields.find(\n (f) =>\n f.kind === 'object' &&\n f.relationName === field.relationName &&\n f.relationFromFields?.length,\n )\n return childField?.relationFromFields?.[0] === e.localField\n })\n : null\n\n const edge = childEdge ?? childEdgeByRelation\n if (edge) {\n relations.push({\n parentModel: model.name,\n childModel: field.type,\n parentField: field.name,\n childField: edge.localField,\n })\n }\n }\n }\n }\n\n // Child-side singular relations: object fields that DO hold the FK\n for (const model of dmmfModels) {\n for (const field of model.fields) {\n if (field.kind === 'object' && !field.isList && field.relationFromFields?.length) {\n const localField = field.relationFromFields[0]!\n const alreadyCovered = relations.some(\n (r) => r.parentModel === model.name && r.parentField === field.name,\n )\n if (!alreadyCovered) {\n relations.push({\n parentModel: model.name,\n childModel: field.type,\n parentField: field.name,\n childField: localField,\n })\n }\n }\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// DMMF model extraction\n// ---------------------------------------------------------------------------\n\nfunction getDMMFModels(prisma: PrismaClient): DMMFModel[] {\n if (prisma._runtimeDataModel?.models) {\n return Object.entries(prisma._runtimeDataModel.models).map(([name, model]) => ({\n ...model,\n name,\n }))\n }\n\n if (prisma._baseDmmf?.datamodel?.models) {\n return prisma._baseDmmf.datamodel.models\n }\n\n throw new Error(\n 'Cannot introspect Prisma schema. Ensure @prisma/client is generated.',\n )\n}\n","import type { ResolvedEntitySpec, CreateContext } from '@autonoma-ai/sdk'\n\ntype PrismaClient = Record<string, any>\n\n/**\n * Create entities using Prisma client.\n *\n * - Normal mode: individual create() calls, returns all created records (available in refs)\n * - Batch mode: single createMany() call, much faster for large counts but returns empty array\n */\nexport async function createEntities(\n prisma: PrismaClient,\n spec: Record<string, ResolvedEntitySpec>,\n _context: CreateContext,\n): Promise<Record<string, Record<string, unknown>[]>> {\n const results: Record<string, Record<string, unknown>[]> = {}\n\n await prisma.$transaction(async (tx: PrismaClient) => {\n for (const [model, entitySpec] of Object.entries(spec)) {\n const delegate = tx[camelCase(model)]\n if (!delegate) {\n throw new Error(`Prisma model '${model}' not found. Check model name casing.`)\n }\n\n if (entitySpec.batch) {\n // Batch: single createMany call — fast, but no records returned\n await delegate.createMany({ data: entitySpec.fields })\n results[model] = []\n } else {\n // Normal: individual creates — returns records for refs\n const created: Record<string, unknown>[] = []\n for (const fields of entitySpec.fields) {\n const record = await delegate.create({ data: fields })\n created.push(record)\n }\n results[model] = created\n }\n }\n })\n\n return results\n}\n\nfunction camelCase(str: string): string {\n return str.charAt(0).toLowerCase() + str.slice(1)\n}\n","import type { SchemaInfo, FKEdge } from '@autonoma-ai/sdk'\nimport { topoSort, findDeferrableEdge } from '@autonoma-ai/sdk'\n\ntype PrismaClient = Record<string, any>\n\n/**\n * Tear down all data scoped to a value, in reverse topological order.\n *\n * Strategy:\n * 1. Find the scope root model (e.g. Organization) from FK edges\n * 2. Any model with a FK pointing to the scope root is a \"scoped model\"\n * 3. Delete scoped models by their FK = scopeValue (regardless of field name casing)\n * 4. Delete non-scoped models by their record IDs from refs\n * 5. Delete the scope root entity last by id = scopeValue\n */\nexport async function teardown(\n prisma: PrismaClient,\n schema: SchemaInfo,\n scopeValue: string,\n refs?: Record<string, Record<string, unknown>[]>,\n): Promise<void> {\n // Find scope root: the model that the scopeField FK points TO\n // e.g. scopeField = \"organizationID\", edges have { to: \"Organization\" } → root is Organization\n let scopeRootModel: string | null = null\n for (const edge of schema.edges) {\n if (edge.localField.toLowerCase() === schema.scopeField.toLowerCase() && edge.to !== edge.from) {\n scopeRootModel = edge.to\n break\n }\n }\n\n // Build map: model → FK field name that points to the scope root\n // Handles mixed casing (organizationId vs organizationID)\n const scopeFieldByModel = new Map<string, string>()\n if (scopeRootModel) {\n for (const edge of schema.edges) {\n if (edge.to === scopeRootModel && edge.from !== scopeRootModel) {\n scopeFieldByModel.set(edge.from, edge.localField)\n }\n }\n }\n\n const modelNames = schema.models.map((m) => m.name)\n const { sorted, cycles } = topoSort(modelNames, schema.edges)\n\n await prisma.$transaction(async (tx: PrismaClient) => {\n // Break cycles\n for (const cycle of cycles) {\n const edge = findDeferrableEdge(cycle, schema.edges)\n if (edge) {\n const scopeFK = scopeFieldByModel.get(edge.from)\n if (scopeFK) {\n const delegate = tx[camelCase(edge.from)]\n if (delegate) {\n await delegate.updateMany({\n where: { [scopeFK]: scopeValue },\n data: { [edge.localField]: null },\n })\n }\n }\n }\n }\n\n // Delete cycle nodes\n for (const cycle of cycles) {\n for (const model of cycle) {\n await deleteModel(tx, model, scopeValue, scopeFieldByModel, refs)\n }\n }\n\n // Delete in reverse topo order (dependents first)\n const reversed = [...sorted].reverse()\n for (const model of reversed) {\n if (model === scopeRootModel) continue // deleted last\n await deleteModel(tx, model, scopeValue, scopeFieldByModel, refs)\n }\n\n // Delete the scope root entity last\n if (scopeRootModel) {\n const delegate = tx[camelCase(scopeRootModel)]\n if (delegate) {\n await delegate.deleteMany({ where: { id: scopeValue } })\n }\n }\n })\n}\n\nasync function deleteModel(\n tx: PrismaClient,\n model: string,\n scopeValue: string,\n scopeFieldByModel: Map<string, string>,\n refs?: Record<string, Record<string, unknown>[]>,\n): Promise<void> {\n const delegate = tx[camelCase(model)]\n if (!delegate) {\n return\n }\n\n const scopeFK = scopeFieldByModel.get(model)\n if (scopeFK) {\n // Has FK to scope root → delete by that FK\n await delegate.deleteMany({ where: { [scopeFK]: scopeValue } })\n } else if (refs?.[model]) {\n // No FK to scope root, but we created records → delete by IDs\n const ids = refs[model]\n .map((r) => r.id)\n .filter((id): id is string => typeof id === 'string')\n if (ids.length > 0) {\n await delegate.deleteMany({ where: { id: { in: ids } } })\n }\n }\n}\n\nfunction camelCase(str: string): string {\n return str.charAt(0).toLowerCase() + str.slice(1)\n}\n","import type { OrmAdapter, SchemaInfo, ResolvedEntitySpec, CreateContext } from '@autonoma-ai/sdk'\nimport { introspectPrisma, type PrismaAdapterConfig } from './introspect'\nimport { createEntities } from './create'\nimport { teardown } from './teardown'\n\nexport type { PrismaAdapterConfig }\n\n/**\n * Create a Prisma ORM adapter for the Autonoma SDK.\n *\n * @example\n * ```ts\n * import { prismaAdapter } from '@autonoma-ai/sdk-prisma'\n * import { prisma } from './db'\n *\n * const adapter = prismaAdapter(prisma, { scopeField: 'organizationId' })\n * ```\n */\nexport function prismaAdapter(\n prisma: any,\n config: PrismaAdapterConfig,\n): OrmAdapter {\n let cachedSchema: SchemaInfo | null = null\n\n return {\n getSchema() {\n if (!cachedSchema) {\n cachedSchema = introspectPrisma(prisma, config)\n }\n return cachedSchema\n },\n\n async createEntities(\n spec: Record<string, ResolvedEntitySpec>,\n context: CreateContext,\n ) {\n return createEntities(prisma, spec, context)\n },\n\n async teardown(scopeValue: string, refs?: Record<string, Record<string, unknown>[]>) {\n const schema = this.getSchema()\n return teardown(prisma, schema, scopeValue, refs)\n },\n\n async updateEntity(model: string, id: string, fields: Record<string, unknown>) {\n const delegate = prisma[model.charAt(0).toLowerCase() + model.slice(1)]\n await delegate.update({ where: { id }, data: fields })\n },\n }\n}\n"],"mappings":"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","names":["camelCase"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autonoma-ai/sdk-prisma",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Prisma adapter for Autonoma SDK",
5
5
  "type": "module",
6
6
  "exports": {
@@ -16,7 +16,7 @@
16
16
  "access": "public"
17
17
  },
18
18
  "dependencies": {
19
- "@autonoma-ai/sdk": "0.1.0"
19
+ "@autonoma-ai/sdk": "0.1.2"
20
20
  },
21
21
  "peerDependencies": {
22
22
  "@prisma/client": ">=5.0.0"