@appweaver/core 1.0.24 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/package.json +1 -1
  2. package/prisma/client/internal/class.js +4 -4
  3. package/prisma/client/internal/prismaNamespace.d.ts +1 -0
  4. package/prisma/client/internal/prismaNamespace.js +1 -0
  5. package/prisma/client/internal/prismaNamespaceBrowser.d.ts +1 -0
  6. package/prisma/client/internal/prismaNamespaceBrowser.js +1 -0
  7. package/prisma/client/models/File.d.ts +29 -1
  8. package/resource/resource-service.d.ts +0 -1
  9. package/resource/resource-service.js +2 -39
  10. package/security/auth-service.d.ts +16 -1
  11. package/security/auth-service.js +28 -0
  12. package/security/create-auth-resources.d.ts +2 -1
  13. package/security/oauth2/create-oauth2-plugin.d.ts +2 -7
  14. package/security/oauth2/create-oauth2-plugin.js +45 -1
  15. package/security/oauth2/oauth2-custom.d.ts +1 -0
  16. package/security/oauth2/oauth2-custom.js +2 -1
  17. package/security/oauth2/oauth2-facebook.js +3 -2
  18. package/security/oauth2/oauth2-google.js +2 -1
  19. package/seeder/seeder.d.ts +1 -1
  20. package/seeder/seeder.js +5 -5
  21. package/server/index.d.ts +1 -0
  22. package/server/index.js +1 -0
  23. package/server/register-route.js +13 -0
  24. package/server/virtual-projection.d.ts +26 -0
  25. package/server/virtual-projection.js +231 -0
  26. package/storage/file-service.js +21 -7
  27. package/storage/resources/file/model.js +7 -8
  28. package/types/auth.d.ts +17 -1
  29. package/types/generated.d.ts +5 -0
  30. package/utils/file-util.d.ts +9 -0
  31. package/utils/file-util.js +16 -0
  32. package/utils/index.d.ts +1 -0
  33. package/utils/index.js +1 -0
  34. package/utils/virtual-util.d.ts +11 -0
  35. package/utils/virtual-util.js +53 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@appweaver/core",
3
- "version": "1.0.24",
3
+ "version": "1.1.0",
4
4
  "description": "Appweaver - the backend framework for AI-first development (@core)",
5
5
  "author": "Luka Matosevic",
6
6
  "license": "MIT",
@@ -51,7 +51,7 @@ const config = {
51
51
  "clientVersion": "7.8.0",
52
52
  "engineVersion": "3c6e192761c0362d496ed980de936e2f3cebcd3a",
53
53
  "activeProvider": "sqlite",
54
- "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\n// Generated by Appweaver. Please do not edit this file manually.\n\ndatasource db {\n provider = \"sqlite\"\n}\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"./client\"\n}\n\nmodel ApiKey {\n id Int @id @default(autoincrement())\n key String\n keyHash String @unique\n name String?\n description String?\n enabled Boolean @default(true)\n expiresAt DateTime?\n\n /// Audit columns\n updatedAt DateTime @updatedAt\n createdAt DateTime @default(now())\n}\n\nmodel OneTimeToken {\n id Int @id @default(autoincrement())\n tokenHash String\n purpose String\n expiresAt DateTime\n data Json\n\n /// Audit columns\n updatedAt DateTime @updatedAt\n createdAt DateTime @default(now())\n\n @@index([tokenHash, purpose])\n}\n\nmodel Permission {\n id Int @id @default(autoincrement())\n name String @unique\n\n /// Related columns\n roles Role[] @relation(\"RolePermissionsPermission\")\n\n /// Audit columns\n updatedAt DateTime @updatedAt\n createdAt DateTime @default(now())\n}\n\nmodel Role {\n id Int @id @default(autoincrement())\n name String @unique\n\n /// Related columns\n permissions Permission[] @relation(\"RolePermissionsPermission\")\n\n /// Audit columns\n updatedAt DateTime @updatedAt\n createdAt DateTime @default(now())\n}\n\nmodel Seeder {\n id String @id @default(uuid())\n checksum String\n seederName String @unique\n startedAt DateTime\n finishedAt DateTime\n logs String?\n\n @@map(\"_seeders\")\n}\n\nmodel File {\n id Int @id @default(autoincrement())\n name String @unique\n originalName String\n mimeType String\n sizeBytes Int\n title String?\n description String?\n resourceField String?\n resourceName String?\n resourceId Int?\n\n /// Audit columns\n updatedAt DateTime @updatedAt\n createdAt DateTime @default(now())\n\n @@index([resourceField, resourceName, resourceId])\n}\n",
54
+ "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\n// Generated by Appweaver. Please do not edit this file manually.\n\ndatasource db {\n provider = \"sqlite\"\n}\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"./client\"\n}\n\nmodel ApiKey {\n id Int @id @default(autoincrement())\n key String\n keyHash String @unique\n name String?\n description String?\n enabled Boolean @default(true)\n expiresAt DateTime?\n\n /// Audit columns\n updatedAt DateTime @updatedAt\n createdAt DateTime @default(now())\n}\n\nmodel OneTimeToken {\n id Int @id @default(autoincrement())\n tokenHash String\n purpose String\n expiresAt DateTime\n data Json\n\n /// Audit columns\n updatedAt DateTime @updatedAt\n createdAt DateTime @default(now())\n\n @@index([tokenHash, purpose])\n}\n\nmodel Permission {\n id Int @id @default(autoincrement())\n name String @unique\n\n /// Related columns\n roles Role[] @relation(\"RolePermissionsPermission\")\n\n /// Audit columns\n updatedAt DateTime @updatedAt\n createdAt DateTime @default(now())\n}\n\nmodel Role {\n id Int @id @default(autoincrement())\n name String @unique\n\n /// Related columns\n permissions Permission[] @relation(\"RolePermissionsPermission\")\n\n /// Audit columns\n updatedAt DateTime @updatedAt\n createdAt DateTime @default(now())\n}\n\nmodel Seeder {\n id String @id @default(uuid())\n checksum String\n seederName String @unique\n startedAt DateTime\n finishedAt DateTime\n logs String?\n\n @@map(\"_seeders\")\n}\n\nmodel File {\n id Int @id @default(autoincrement())\n name String @unique\n originalName String\n mimeType String\n sizeBytes Int\n checksum String?\n title String?\n description String?\n resourceField String?\n resourceName String?\n resourceId Int?\n\n /// Audit columns\n updatedAt DateTime @updatedAt\n createdAt DateTime @default(now())\n\n @@index([resourceField, resourceName, resourceId])\n}\n",
55
55
  "runtimeDataModel": {
56
56
  "models": {},
57
57
  "enums": {},
@@ -62,10 +62,10 @@ const config = {
62
62
  "graph": ""
63
63
  }
64
64
  };
65
- config.runtimeDataModel = JSON.parse("{\"models\":{\"ApiKey\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"key\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"keyHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"enabled\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"OneTimeToken\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"tokenHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"purpose\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"data\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Permission\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"roles\",\"kind\":\"object\",\"type\":\"Role\",\"relationName\":\"RolePermissionsPermission\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Role\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"permissions\",\"kind\":\"object\",\"type\":\"Permission\",\"relationName\":\"RolePermissionsPermission\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Seeder\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"checksum\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"seederName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"startedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"finishedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"logs\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":\"_seeders\"},\"File\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"originalName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"mimeType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sizeBytes\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"resourceField\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"resourceName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"resourceId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}");
65
+ config.runtimeDataModel = JSON.parse("{\"models\":{\"ApiKey\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"key\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"keyHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"enabled\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"OneTimeToken\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"tokenHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"purpose\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"data\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Permission\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"roles\",\"kind\":\"object\",\"type\":\"Role\",\"relationName\":\"RolePermissionsPermission\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Role\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"permissions\",\"kind\":\"object\",\"type\":\"Permission\",\"relationName\":\"RolePermissionsPermission\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Seeder\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"checksum\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"seederName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"startedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"finishedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"logs\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":\"_seeders\"},\"File\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"originalName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"mimeType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sizeBytes\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"checksum\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"resourceField\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"resourceName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"resourceId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}");
66
66
  config.parameterizationSchema = {
67
- strings: JSON.parse("[\"where\",\"ApiKey.findUnique\",\"ApiKey.findUniqueOrThrow\",\"orderBy\",\"cursor\",\"ApiKey.findFirst\",\"ApiKey.findFirstOrThrow\",\"ApiKey.findMany\",\"data\",\"ApiKey.createOne\",\"ApiKey.createMany\",\"ApiKey.createManyAndReturn\",\"ApiKey.updateOne\",\"ApiKey.updateMany\",\"ApiKey.updateManyAndReturn\",\"create\",\"update\",\"ApiKey.upsertOne\",\"ApiKey.deleteOne\",\"ApiKey.deleteMany\",\"having\",\"_count\",\"_avg\",\"_sum\",\"_min\",\"_max\",\"ApiKey.groupBy\",\"ApiKey.aggregate\",\"OneTimeToken.findUnique\",\"OneTimeToken.findUniqueOrThrow\",\"OneTimeToken.findFirst\",\"OneTimeToken.findFirstOrThrow\",\"OneTimeToken.findMany\",\"OneTimeToken.createOne\",\"OneTimeToken.createMany\",\"OneTimeToken.createManyAndReturn\",\"OneTimeToken.updateOne\",\"OneTimeToken.updateMany\",\"OneTimeToken.updateManyAndReturn\",\"OneTimeToken.upsertOne\",\"OneTimeToken.deleteOne\",\"OneTimeToken.deleteMany\",\"OneTimeToken.groupBy\",\"OneTimeToken.aggregate\",\"permissions\",\"roles\",\"Permission.findUnique\",\"Permission.findUniqueOrThrow\",\"Permission.findFirst\",\"Permission.findFirstOrThrow\",\"Permission.findMany\",\"Permission.createOne\",\"Permission.createMany\",\"Permission.createManyAndReturn\",\"Permission.updateOne\",\"Permission.updateMany\",\"Permission.updateManyAndReturn\",\"Permission.upsertOne\",\"Permission.deleteOne\",\"Permission.deleteMany\",\"Permission.groupBy\",\"Permission.aggregate\",\"Role.findUnique\",\"Role.findUniqueOrThrow\",\"Role.findFirst\",\"Role.findFirstOrThrow\",\"Role.findMany\",\"Role.createOne\",\"Role.createMany\",\"Role.createManyAndReturn\",\"Role.updateOne\",\"Role.updateMany\",\"Role.updateManyAndReturn\",\"Role.upsertOne\",\"Role.deleteOne\",\"Role.deleteMany\",\"Role.groupBy\",\"Role.aggregate\",\"Seeder.findUnique\",\"Seeder.findUniqueOrThrow\",\"Seeder.findFirst\",\"Seeder.findFirstOrThrow\",\"Seeder.findMany\",\"Seeder.createOne\",\"Seeder.createMany\",\"Seeder.createManyAndReturn\",\"Seeder.updateOne\",\"Seeder.updateMany\",\"Seeder.updateManyAndReturn\",\"Seeder.upsertOne\",\"Seeder.deleteOne\",\"Seeder.deleteMany\",\"Seeder.groupBy\",\"Seeder.aggregate\",\"File.findUnique\",\"File.findUniqueOrThrow\",\"File.findFirst\",\"File.findFirstOrThrow\",\"File.findMany\",\"File.createOne\",\"File.createMany\",\"File.createManyAndReturn\",\"File.updateOne\",\"File.updateMany\",\"File.updateManyAndReturn\",\"File.upsertOne\",\"File.deleteOne\",\"File.deleteMany\",\"File.groupBy\",\"File.aggregate\",\"AND\",\"OR\",\"NOT\",\"id\",\"name\",\"originalName\",\"mimeType\",\"sizeBytes\",\"title\",\"description\",\"resourceField\",\"resourceName\",\"resourceId\",\"updatedAt\",\"createdAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"contains\",\"startsWith\",\"endsWith\",\"checksum\",\"seederName\",\"startedAt\",\"finishedAt\",\"logs\",\"every\",\"some\",\"none\",\"tokenHash\",\"purpose\",\"expiresAt\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"key\",\"keyHash\",\"enabled\",\"connectOrCreate\",\"upsert\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"),
68
- graph: "iQI9YAxuAADHAQAwbwAABAAQcAAAxwEAMHECAAAAAXIBALABACF3AQCwAQAhe0AAsgEAIXxAALIBACGSAUAAyQEAIZgBAQCvAQAhmQEBAAAAAZoBIADIAQAhAQAAAAEAIAEAAAABACAMbgAAxwEAMG8AAAQAEHAAAMcBADBxAgCuAQAhcgEAsAEAIXcBALABACF7QACyAQAhfEAAsgEAIZIBQADJAQAhmAEBAK8BACGZAQEArwEAIZoBIADIAQAhA3IAAMoBACB3AADKAQAgkgEAAMoBACADAAAABAAgAwAABQAwBAAAAQAgAwAAAAQAIAMAAAUAMAQAAAEAIAMAAAAEACADAAAFADAEAAABACAJcQIAAAABcgEAAAABdwEAAAABe0AAAAABfEAAAAABkgFAAAAAAZgBAQAAAAGZAQEAAAABmgEgAAAAAQEIAAAJACAJcQIAAAABcgEAAAABdwEAAAABe0AAAAABfEAAAAABkgFAAAAAAZgBAQAAAAGZAQEAAAABmgEgAAAAAQEIAAALADABCAAACwAwCXECANEBACFyAQDSAQAhdwEA0gEAIXtAANQBACF8QADUAQAhkgFAAIkCACGYAQEA0AEAIZkBAQDQAQAhmgEgAIgCACECAAAAAQAgCAAADgAgCXECANEBACFyAQDSAQAhdwEA0gEAIXtAANQBACF8QADUAQAhkgFAAIkCACGYAQEA0AEAIZkBAQDQAQAhmgEgAIgCACECAAAABAAgCAAAEAAgAgAAAAQAIAgAABAAIAMAAAABACAPAAAJACAQAAAOACABAAAAAQAgAQAAAAQAIAgVAACDAgAgFgAAhAIAIBcAAIcCACAYAACGAgAgGQAAhQIAIHIAAMoBACB3AADKAQAgkgEAAMoBACAMbgAAwAEAMG8AABcAEHAAAMABADBxAgCcAQAhcgEAngEAIXcBAJ4BACF7QACgAQAhfEAAoAEAIZIBQADCAQAhmAEBAJ0BACGZAQEAnQEAIZoBIADBAQAhAwAAAAQAIAMAABYAMBQAABcAIAMAAAAEACADAAAFADAEAAABACAKCAAAvwEAIG4AAL4BADBvAAAdABBwAAC-AQAwcQIAAAABe0AAsgEAIXxAALIBACGQAQEArwEAIZEBAQCvAQAhkgFAALIBACEBAAAAGgAgAQAAABoAIAoIAAC_AQAgbgAAvgEAMG8AAB0AEHAAAL4BADBxAgCuAQAhe0AAsgEAIXxAALIBACGQAQEArwEAIZEBAQCvAQAhkgFAALIBACEAAwAAAB0AIAMAAB4AMAQAABoAIAMAAAAdACADAAAeADAEAAAaACADAAAAHQAgAwAAHgAwBAAAGgAgBwiAAAAAAXECAAAAAXtAAAAAAXxAAAAAAZABAQAAAAGRAQEAAAABkgFAAAAAAQEIAAAiACAHCIAAAAABcQIAAAABe0AAAAABfEAAAAABkAEBAAAAAZEBAQAAAAGSAUAAAAABAQgAACQAMAEIAAAkADAHCIAAAAABcQIA0QEAIXtAANQBACF8QADUAQAhkAEBANABACGRAQEA0AEAIZIBQADUAQAhAgAAABoAIAgAACcAIAcIgAAAAAFxAgDRAQAhe0AA1AEAIXxAANQBACGQAQEA0AEAIZEBAQDQAQAhkgFAANQBACECAAAAHQAgCAAAKQAgAgAAAB0AIAgAACkAIAMAAAAaACAPAAAiACAQAAAnACABAAAAGgAgAQAAAB0AIAUVAAD-AQAgFgAA_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-AQAAAAV_AQAAAAWAAQEAAAABgQEBAAAAAYIBAQAAAAGDAQEAAAABhAEBAKcBACGFAQEAAAABhgEBAAAAAYcBAQAAAAENFQAApQEAIBYAAKYBACAXAAClAQAgGAAApQEAIBkAAKUBACB9AgAAAAF-AgAAAAV_AgAAAAWAAQIAAAABgQECAAAAAYIBAgAAAAGDAQIAAAABhAECAKQBACELFQAAogEAIBgAAKMBACAZAACjAQAgfUAAAAABfkAAAAAEf0AAAAAEgAFAAAAAAYEBQAAAAAGCAUAAAAABgwFAAAAAAYQBQAChAQAhCxUAAKIBACAYAACjAQAgGQAAowEAIH1AAAAAAX5AAAAABH9AAAAABIABQAAAAAGBAUAAAAABggFAAAAAAYMBQAAAAAGEAUAAoQEAIQh9AgAAAAF-AgAAAAR_AgAAAASAAQIAAAABgQECAAAAAYIBAgAAAAGDAQIAAAABhAECAKIBACEIfUAAAAABfkAAAAAEf0AAAAAEgAFAAAAAAYEBQAAAAAGCAUAAAAABgwFAAAAAAYQBQACjAQAhDRUAAKUBACAWAACmAQAgFwAApQEAIBgAAKUBACAZAAClAQAgfQIAAAABfgIAAAAFfwIAAAAFgAECAAAAAYEBAgAAAAGCAQIAAAABgwECAAAAAYQBAgCkAQAhCH0CAAAAAX4CAAAABX8CAAAABYABAgAAAAGBAQIAAAABggECAAAAAYMBAgAAAAGEAQIApQEAIQh9CAAAAAF-CAAAAAV_CAAAAAWAAQgAAAABgQEIAAAAAYIBCAAAAAGDAQgAAAABhAEIAKYBACEOFQAApQEAIBgAAKgBACAZAACoAQAgfQEAAAABfgEAAAAFfwEAAAAFgAEBAAAAAYEBAQAAAAGCAQEAAAABgwEBAAAAAYQBAQCnAQAhhQEBAAAAAYYBAQAAAAGHAQEAAAABC30BAAAAAX4BAAAABX8BAAAABYABAQAAAAGBAQEAAAABggEBAAAAAYMBAQAAAAGEAQEAqAEAIYUBAQAAAAGGAQEAAAABhwEBAAAAAQ4VAACiAQAgGAAAqgEAIBkAAKoBACB9AQAAAAF-AQAAAAR_AQAAAASAAQEAAAABgQEBAAAAAYIBAQAAAAGDAQEAAAABhAEBAKkBACGFAQEAAAABhgEBAAAAAYcBAQAAAAELfQEAAAABfgEAAAAEfwEAAAAEgAEBAAAAAYEBAQAAAAGCAQEAAAABgwEBAAAAAYQBAQCqAQAhhQEBAAAAAYYBAQAAAAGHAQEAAAABDRUAAKIBACAWAACsAQAgFwAAogEAIBgAAKIBACAZAACiAQAgfQIAAAABfgIAAAAEfwIAAAAEgAECAAAAAYEBAgAAAAGCAQIAAAABgwECAAAAAYQBAgCrAQAhCH0IAAAAAX4IAAAABH8IAAAABIABCAAAAAGBAQgAAAABggEIAAAAAYMBCAAAAAGEAQgArAEAIQ9uAACtAQAwbwAAhQEAEHAAAK0BADBxAgCuAQAhcgEArwEAIXMBAK8BACF0AQCvAQAhdQIArgEAIXYBALABACF3AQCwAQAheAEAsAEAIXkBALABACF6AgCxAQAhe0AAsgEAIXxAALIBACEIfQIAAAABfgIAAAAEfwIAAAAEgAECAAAAAYEBAgAAAAGCAQIAAAABgwECAAAAAYQBAgCiAQAhC30BAAAAAX4BAAAABH8BAAAABIABAQAAAAGBAQEAAAABggEBAAAAAYMBAQAAAAGEAQEAqgEAIYUBAQAAAAGGAQEAAAABhwEBAAAAAQt9AQAAAAF-AQAAAAV_AQAAAAWAAQEAAAABgQEBAAAAAYIBAQAAAAGDAQEAAAABhAEBAKgBACGFAQEAAAABhgEBAAAAAYcBAQAAAAEIfQIAAAABfgIAAAAFfwIAAAAFgAECAAAAAYEBAgAAAAGCAQIAAAABgwECAAAAAYQBAgClAQAhCH1AAAAAAX5AAAAABH9AAAAABIABQAAAAAGBAUAAAAABggFAAAAAAYMBQAAAAAGEAUAAowEAIQluAACzAQAwbwAAfwAQcAAAswEAMHEBAJ0BACGIAQEAnQEAIYkBAQCdAQAhigFAAKABACGLAUAAoAEAIYwBAQCeAQAhCW4AALQBADBvAABsABBwAAC0AQAwcQEArwEAIYgBAQCvAQAhiQEBAK8BACGKAUAAsgEAIYsBQACyAQAhjAEBALABACEHbgAAtQEAMG8AAGYAEHAAALUBADBxAgCcAQAhcgEAnQEAIXtAAKABACF8QACgAQAhB24AALYBADBvAABQABBwAAC2AQAwcQIAnAEAIXIBAJ0BACF7QACgAQAhfEAAoAEAIQgtAAC4AQAgbgAAtwEAMG8AADkAEHAAALcBADBxAgCuAQAhcgEArwEAIXtAALIBACF8QACyAQAhA40BAAA1ACCOAQAANQAgjwEAADUAIAgsAAC6AQAgbgAAuQEAMG8AADUAEHAAALkBADBxAgCuAQAhcgEArwEAIXtAALIBACF8QACyAQAhA40BAAA5ACCOAQAAOQAgjwEAADkAIAoIAAC8AQAgbgAAuwEAMG8AADAAEHAAALsBADBxAgCcAQAhe0AAoAEAIXxAAKABACGQAQEAnQEAIZEBAQCdAQAhkgFAAKABACEKFQAAogEAIBgAAL0BACAZAAC9AQAgfYAAAAABhAGAAAAAAZMBAQAAAAGUAQEAAAABlQEBAAAAAZYBgAAAAAGXAYAAAAABB32AAAAAAYQBgAAAAAGTAQEAAAABlAEBAAAAAZUBAQAAAAGWAYAAAAABlwGAAAAAAQoIAAC_AQAgbgAAvgEAMG8AAB0AEHAAAL4BADBxAgCuAQAhe0AAsgEAIXxAALIBACGQAQEArwEAIZEBAQCvAQAhkgFAALIBACEHfYAAAAABhAGAAAAAAZMBAQAAAAGUAQEAAAABlQEBAAAAAZYBgAAAAAGXAYAAAAABDG4AAMABADBvAAAXABBwAADAAQAwcQIAnAEAIXIBAJ4BACF3AQCeAQAhe0AAoAEAIXxAAKABACGSAUAAwgEAIZgBAQCdAQAhmQEBAJ0BACGaASAAwQEAIQUVAACiAQAgGAAAxgEAIBkAAMYBACB9IAAAAAGEASAAxQEAIQsVAAClAQAgGAAAxAEAIBkAAMQBACB9QAAAAAF-QAAAAAV_QAAAAAWAAUAAAAABgQFAAAAAAYIBQAAAAAGDAUAAAAABhAFAAMMBACELFQAApQEAIBgAAMQBACAZAADEAQAgfUAAAAABfkAAAAAFf0AAAAAFgAFAAAAAAYEBQAAAAAGCAUAAAAABgwFAAAAAAYQBQADDAQAhCH1AAAAAAX5AAAAABX9AAAAABYABQAAAAAGBAUAAAAABggFAAAAAAYMBQAAAAAGEAUAAxAEAIQUVAACiAQAgGAAAxgEAIBkAAMYBACB9IAAAAAGEASAAxQEAIQJ9IAAAAAGEASAAxgEAIQxuAADHAQAwbwAABAAQcAAAxwEAMHECAK4BACFyAQCwAQAhdwEAsAEAIXtAALIBACF8QACyAQAhkgFAAMkBACGYAQEArwEAIZkBAQCvAQAhmgEgAMgBACECfSAAAAABhAEgAMYBACEIfUAAAAABfkAAAAAFf0AAAAAFgAFAAAAAAYEBQAAAAAGCAUAAAAABgwFAAAAAAYQBQADEAQAhAAAAAAAAAZ0BAQAAAAEFnQECAAAAAaMBAgAAAAGkAQIAAAABpQECAAAAAaYBAgAAAAEBnQEBAAAAAQWdAQIAAAABowECAAAAAaQBAgAAAAGlAQIAAAABpgECAAAAAQGdAUAAAAABAAAAAAAAAAAKDwAA3gEAMBAAAOIBADCbAQAA3wEAMJwBAADgAQAwnQEAAOEBADCeAQAA4QEAMJ8BAADhAQAwoAEAAOEBADChAQAA4wEAMKIBAADkAQAwBHECAAAAAXIBAAAAAXtAAAAAAXxAAAAAAQIAAAAzACAPAADoAQAgAwAAADMAIA8AAOgBACAQAADnAQAgCC0AALgBACBuAAC3AQAwbwAAOQAQcAAAtwEAMHECAAAAAXIBAAAAAXtAALIBACF8QACyAQAhAgAAADMAIAgAAOcBACACAAAA5QEAIAgAAOYBACAHbgAA5AEAMG8AAOUBABBwAADkAQAwcQIArgEAIXIBAK8BACF7QACyAQAhfEAAsgEAIQduAADkAQAwbwAA5QEAEHAAAOQBADBxAgCuAQAhcgEArwEAIXtAALIBACF8QACyAQAhBHECANEBACFyAQDQAQAhe0AA1AEAIXxAANQBACEEcQIA0QEAIXIBANABACF7QADUAQAhfEAA1AEAIQRxAgAAAAFyAQAAAAF7QAAAAAF8QAAAAAEDDwAA3gEAMJsBAADfAQAwoAEAAOEBADAAAAAAAAoPAADwAQAwEAAA9AEAMJsBAADxAQAwnAEAAPIBADCdAQAA8wEAMJ4BAADzAQAwnwEAAPMBADCgAQAA8wEAMKEBAAD1AQAwogEAAPYBADAEcQIAAAABcgEAAAABe0AAAAABfEAAAAABAgAAADcAIA8AAPoBACADAAAANwAgDwAA-gEAIBAAAPkBACAILAAAugEAIG4AALkBADBvAAA1ABBwAAC5AQAwcQIAAAABcgEAAAABe0AAsgEAIXxAALIBACECAAAANwAgCAAA-QEAIAIAAAD3AQAgCAAA-AEAIAduAAD2AQAwbwAA9wEAEHAAAPYBADBxAgCuAQAhcgEArwEAIXtAALIBACF8QACyAQAhB24AAPYBADBvAAD3AQAQcAAA9gEAMHECAK4BACFyAQCvAQAhe0AAsgEAIXxAALIBACEEcQIA0QEAIXIBANABACF7QADUAQAhfEAA1AEAIQRxAgDRAQAhcgEA0AEAIXtAANQBACF8QADUAQAhBHECAAAAAXIBAAAAAXtAAAAAAXxAAAAAAQMPAADwAQAwmwEAAPEBADCgAQAA8wEAMAAAAAAAAAAAAAAAAAGdASAAAAABAZ0BQAAAAAEAAAAABRUABhYABxcACBgACRkACgAAAAAABRUABhYABxcACBgACRkACgAAAAUVABAWABEXABIYABMZABQAAAAAAAUVABAWABEXABIYABMZABQCFQAZLTgXAhUAGCw7FgEsPAABLT0AAAAFFQAdFgAeFwAfGAAgGQAhAAAAAAAFFQAdFgAeFwAfGAAgGQAhAAAFFQAmFgAnFwAoGAApGQAqAAAAAAAFFQAmFgAnFwAoGAApGQAqAAAAAxUAMBgAMRkAMgAAAAMVADAYADEZADIAAAAFFQA4FgA5FwA6GAA7GQA8AAAAAAAFFQA4FgA5FwA6GAA7GQA8AQIBAgMBBQYBBgcBBwgBCQoBCgwCCw0DDA8BDRECDhIEERMBEhQBExUCGhgFGxkLHBsMHRwMHh8MHyAMICEMISMMIiUCIyYNJCgMJSoCJisOJywMKC0MKS4CKjEPKzIVLjQWLz4WMD8WMUAWMkEWM0MWNEUCNUYaNkgWN0oCOEsbOUwWOk0WO04CPFEcPVIiPlMXP1QXQFUXQVYXQlcXQ1kXRFsCRVwjRl4XR2ACSGEkSWIXSmMXS2QCTGclTWgrTmosT2ssUG4sUW8sUnAsU3IsVHQCVXUtVncsV3kCWHouWXssWnwsW30CXIABL12BATNegwE0X4QBNGCHATRhiAE0YokBNGOLATRkjQECZY4BNWaQATRnkgECaJMBNmmUATRqlQE0a5YBAmyZATdtmgE9"
67
+ strings: JSON.parse("[\"where\",\"ApiKey.findUnique\",\"ApiKey.findUniqueOrThrow\",\"orderBy\",\"cursor\",\"ApiKey.findFirst\",\"ApiKey.findFirstOrThrow\",\"ApiKey.findMany\",\"data\",\"ApiKey.createOne\",\"ApiKey.createMany\",\"ApiKey.createManyAndReturn\",\"ApiKey.updateOne\",\"ApiKey.updateMany\",\"ApiKey.updateManyAndReturn\",\"create\",\"update\",\"ApiKey.upsertOne\",\"ApiKey.deleteOne\",\"ApiKey.deleteMany\",\"having\",\"_count\",\"_avg\",\"_sum\",\"_min\",\"_max\",\"ApiKey.groupBy\",\"ApiKey.aggregate\",\"OneTimeToken.findUnique\",\"OneTimeToken.findUniqueOrThrow\",\"OneTimeToken.findFirst\",\"OneTimeToken.findFirstOrThrow\",\"OneTimeToken.findMany\",\"OneTimeToken.createOne\",\"OneTimeToken.createMany\",\"OneTimeToken.createManyAndReturn\",\"OneTimeToken.updateOne\",\"OneTimeToken.updateMany\",\"OneTimeToken.updateManyAndReturn\",\"OneTimeToken.upsertOne\",\"OneTimeToken.deleteOne\",\"OneTimeToken.deleteMany\",\"OneTimeToken.groupBy\",\"OneTimeToken.aggregate\",\"permissions\",\"roles\",\"Permission.findUnique\",\"Permission.findUniqueOrThrow\",\"Permission.findFirst\",\"Permission.findFirstOrThrow\",\"Permission.findMany\",\"Permission.createOne\",\"Permission.createMany\",\"Permission.createManyAndReturn\",\"Permission.updateOne\",\"Permission.updateMany\",\"Permission.updateManyAndReturn\",\"Permission.upsertOne\",\"Permission.deleteOne\",\"Permission.deleteMany\",\"Permission.groupBy\",\"Permission.aggregate\",\"Role.findUnique\",\"Role.findUniqueOrThrow\",\"Role.findFirst\",\"Role.findFirstOrThrow\",\"Role.findMany\",\"Role.createOne\",\"Role.createMany\",\"Role.createManyAndReturn\",\"Role.updateOne\",\"Role.updateMany\",\"Role.updateManyAndReturn\",\"Role.upsertOne\",\"Role.deleteOne\",\"Role.deleteMany\",\"Role.groupBy\",\"Role.aggregate\",\"Seeder.findUnique\",\"Seeder.findUniqueOrThrow\",\"Seeder.findFirst\",\"Seeder.findFirstOrThrow\",\"Seeder.findMany\",\"Seeder.createOne\",\"Seeder.createMany\",\"Seeder.createManyAndReturn\",\"Seeder.updateOne\",\"Seeder.updateMany\",\"Seeder.updateManyAndReturn\",\"Seeder.upsertOne\",\"Seeder.deleteOne\",\"Seeder.deleteMany\",\"Seeder.groupBy\",\"Seeder.aggregate\",\"File.findUnique\",\"File.findUniqueOrThrow\",\"File.findFirst\",\"File.findFirstOrThrow\",\"File.findMany\",\"File.createOne\",\"File.createMany\",\"File.createManyAndReturn\",\"File.updateOne\",\"File.updateMany\",\"File.updateManyAndReturn\",\"File.upsertOne\",\"File.deleteOne\",\"File.deleteMany\",\"File.groupBy\",\"File.aggregate\",\"AND\",\"OR\",\"NOT\",\"id\",\"name\",\"originalName\",\"mimeType\",\"sizeBytes\",\"checksum\",\"title\",\"description\",\"resourceField\",\"resourceName\",\"resourceId\",\"updatedAt\",\"createdAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"contains\",\"startsWith\",\"endsWith\",\"seederName\",\"startedAt\",\"finishedAt\",\"logs\",\"every\",\"some\",\"none\",\"tokenHash\",\"purpose\",\"expiresAt\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"key\",\"keyHash\",\"enabled\",\"connectOrCreate\",\"upsert\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"),
68
+ graph: "iQI9YAxuAADHAQAwbwAABAAQcAAAxwEAMHECAAAAAXIBALABACF4AQCwAQAhfEAAsgEAIX1AALIBACGSAUAAyQEAIZgBAQCvAQAhmQEBAAAAAZoBIADIAQAhAQAAAAEAIAEAAAABACAMbgAAxwEAMG8AAAQAEHAAAMcBADBxAgCuAQAhcgEAsAEAIXgBALABACF8QACyAQAhfUAAsgEAIZIBQADJAQAhmAEBAK8BACGZAQEArwEAIZoBIADIAQAhA3IAAMoBACB4AADKAQAgkgEAAMoBACADAAAABAAgAwAABQAwBAAAAQAgAwAAAAQAIAMAAAUAMAQAAAEAIAMAAAAEACADAAAFADAEAAABACAJcQIAAAABcgEAAAABeAEAAAABfEAAAAABfUAAAAABkgFAAAAAAZgBAQAAAAGZAQEAAAABmgEgAAAAAQEIAAAJACAJcQIAAAABcgEAAAABeAEAAAABfEAAAAABfUAAAAABkgFAAAAAAZgBAQAAAAGZAQEAAAABmgEgAAAAAQEIAAALADABCAAACwAwCXECANEBACFyAQDSAQAheAEA0gEAIXxAANQBACF9QADUAQAhkgFAAIkCACGYAQEA0AEAIZkBAQDQAQAhmgEgAIgCACECAAAAAQAgCAAADgAgCXECANEBACFyAQDSAQAheAEA0gEAIXxAANQBACF9QADUAQAhkgFAAIkCACGYAQEA0AEAIZkBAQDQAQAhmgEgAIgCACECAAAABAAgCAAAEAAgAgAAAAQAIAgAABAAIAMAAAABACAPAAAJACAQAAAOACABAAAAAQAgAQAAAAQAIAgVAACDAgAgFgAAhAIAIBcAAIcCACAYAACGAgAgGQAAhQIAIHIAAMoBACB4AADKAQAgkgEAAMoBACAMbgAAwAEAMG8AABcAEHAAAMABADBxAgCcAQAhcgEAngEAIXgBAJ4BACF8QACgAQAhfUAAoAEAIZIBQADCAQAhmAEBAJ0BACGZAQEAnQEAIZoBIADBAQAhAwAAAAQAIAMAABYAMBQAABcAIAMAAAAEACADAAAFADAEAAABACAKCAAAvwEAIG4AAL4BADBvAAAdABBwAAC-AQAwcQIAAAABfEAAsgEAIX1AALIBACGQAQEArwEAIZEBAQCvAQAhkgFAALIBACEBAAAAGgAgAQAAABoAIAoIAAC_AQAgbgAAvgEAMG8AAB0AEHAAAL4BADBxAgCuAQAhfEAAsgEAIX1AALIBACGQAQEArwEAIZEBAQCvAQAhkgFAALIBACEAAwAAAB0AIAMAAB4AMAQAABoAIAMAAAAdACADAAAeADAEAAAaACADAAAAHQAgAwAAHgAwBAAAGgAgBwiAAAAAAXECAAAAAXxAAAAAAX1AAAAAAZABAQAAAAGRAQEAAAABkgFAAAAAAQEIAAAiACAHCIAAAAABcQIAAAABfEAAAAABfUAAAAABkAEBAAAAAZEBAQAAAAGSAUAAAAABAQgAACQAMAEIAAAkADAHCIAAAAABcQIA0QEAIXxAANQBACF9QADUAQAhkAEBANABACGRAQEA0AEAIZIBQADUAQAhAgAAABoAIAgAACcAIAcIgAAAAAFxAgDRAQAhfEAA1AEAIX1AANQBACGQAQEA0AEAIZEBAQDQAQAhkgFAANQBACECAAAAHQAgCAAAKQAgAgAAAB0AIAgAACkAIAMAAAAaACAPAAAiACAQAAAnACABAAAAGgAgAQAAAB0AIAUVAAD-AQAgFgAA_wEAIBcAAIICACAYAACBAgAgGQAAgAIAIAoIAAC8AQAgbgAAuwEAMG8AADAAEHAAALsBADBxAgCcAQAhfEAAoAEAIX1AAKABACGQAQEAnQEAIZEBAQCdAQAhkgFAAKABACEDAAAAHQAgAwAALwAwFAAAMAAgAwAAAB0AIAMAAB4AMAQAABoAIAgtAAC4AQAgbgAAtwEAMG8AADkAEHAAALcBADBxAgAAAAFyAQAAAAF8QACyAQAhfUAAsgEAIQEAAAAzACAILAAAugEAIG4AALkBADBvAAA1ABBwAAC5AQAwcQIArgEAIXIBAK8BACF8QACyAQAhfUAAsgEAIQEsAAD9AQAgCCwAALoBACBuAAC5AQAwbwAANQAQcAAAuQEAMHECAAAAAXIBAAAAAXxAALIBACF9QACyAQAhAwAAADUAIAMAADYAMAQAADcAIAgtAAC4AQAgbgAAtwEAMG8AADkAEHAAALcBADBxAgCuAQAhcgEArwEAIXxAALIBACF9QACyAQAhAS0AAPwBACADAAAAOQAgAwAAOgAwBAAAMwAgAQAAADkAIAEAAAA1ACABAAAAMwAgAwAAADkAIAMAADoAMAQAADMAIAMAAAA5ACADAAA6ADAEAAAzACADAAAAOQAgAwAAOgAwBAAAMwAgBS0AAPsBACBxAgAAAAFyAQAAAAF8QAAAAAF9QAAAAAEBCAAAQgAgBHECAAAAAXIBAAAAAXxAAAAAAX1AAAAAAQEIAABEADABCAAARAAwBS0AAO8BACBxAgDRAQAhcgEA0AEAIXxAANQBACF9QADUAQAhAgAAADMAIAgAAEcAIARxAgDRAQAhcgEA0AEAIXxAANQBACF9QADUAQAhAgAAADkAIAgAAEkAIAIAAAA5ACAIAABJACADAAAAMwAgDwAAQgAgEAAARwAgAQAAADMAIAEAAAA5ACAFFQAA6gEAIBYAAOsBACAXAADuAQAgGAAA7QEAIBkAAOwBACAHbgAAtgEAMG8AAFAAEHAAALYBADBxAgCcAQAhcgEAnQEAIXxAAKABACF9QACgAQAhAwAAADkAIAMAAE8AMBQAAFAAIAMAAAA5ACADAAA6ADAEAAAzACABAAAANwAgAQAAADcAIAMAAAA1ACADAAA2ADAEAAA3ACADAAAANQAgAwAANgAwBAAANwAgAwAAADUAIAMAADYAMAQAADcAIAUsAADpAQAgcQIAAAABcgEAAAABfEAAAAABfUAAAAABAQgAAFgAIARxAgAAAAFyAQAAAAF8QAAAAAF9QAAAAAEBCAAAWgAwAQgAAFoAMAUsAADdAQAgcQIA0QEAIXIBANABACF8QADUAQAhfUAA1AEAIQIAAAA3ACAIAABdACAEcQIA0QEAIXIBANABACF8QADUAQAhfUAA1AEAIQIAAAA1ACAIAABfACACAAAANQAgCAAAXwAgAwAAADcAIA8AAFgAIBAAAF0AIAEAAAA3ACABAAAANQAgBRUAANgBACAWAADZAQAgFwAA3AEAIBgAANsBACAZAADaAQAgB24AALUBADBvAABmABBwAAC1AQAwcQIAnAEAIXIBAJ0BACF8QACgAQAhfUAAoAEAIQMAAAA1ACADAABlADAUAABmACADAAAANQAgAwAANgAwBAAANwAgCW4AALQBADBvAABsABBwAAC0AQAwcQEAAAABdgEArwEAIYkBAQAAAAGKAUAAsgEAIYsBQACyAQAhjAEBALABACEBAAAAaQAgAQAAAGkAIAluAAC0AQAwbwAAbAAQcAAAtAEAMHEBAK8BACF2AQCvAQAhiQEBAK8BACGKAUAAsgEAIYsBQACyAQAhjAEBALABACEBjAEAAMoBACADAAAAbAAgAwAAbQAwBAAAaQAgAwAAAGwAIAMAAG0AMAQAAGkAIAMAAABsACADAABtADAEAABpACAGcQEAAAABdgEAAAABiQEBAAAAAYoBQAAAAAGLAUAAAAABjAEBAAAAAQEIAABxACAGcQEAAAABdgEAAAABiQEBAAAAAYoBQAAAAAGLAUAAAAABjAEBAAAAAQEIAABzADABCAAAcwAwBnEBANABACF2AQDQAQAhiQEBANABACGKAUAA1AEAIYsBQADUAQAhjAEBANIBACECAAAAaQAgCAAAdgAgBnEBANABACF2AQDQAQAhiQEBANABACGKAUAA1AEAIYsBQADUAQAhjAEBANIBACECAAAAbAAgCAAAeAAgAgAAAGwAIAgAAHgAIAMAAABpACAPAABxACAQAAB2ACABAAAAaQAgAQAAAGwAIAQVAADVAQAgGAAA1wEAIBkAANYBACCMAQAAygEAIAluAACzAQAwbwAAfwAQcAAAswEAMHEBAJ0BACF2AQCdAQAhiQEBAJ0BACGKAUAAoAEAIYsBQACgAQAhjAEBAJ4BACEDAAAAbAAgAwAAfgAwFAAAfwAgAwAAAGwAIAMAAG0AMAQAAGkAIBBuAACtAQAwbwAAhQEAEHAAAK0BADBxAgAAAAFyAQAAAAFzAQCvAQAhdAEArwEAIXUCAK4BACF2AQCwAQAhdwEAsAEAIXgBALABACF5AQCwAQAhegEAsAEAIXsCALEBACF8QACyAQAhfUAAsgEAIQEAAACCAQAgAQAAAIIBACAQbgAArQEAMG8AAIUBABBwAACtAQAwcQIArgEAIXIBAK8BACFzAQCvAQAhdAEArwEAIXUCAK4BACF2AQCwAQAhdwEAsAEAIXgBALABACF5AQCwAQAhegEAsAEAIXsCALEBACF8QACyAQAhfUAAsgEAIQZ2AADKAQAgdwAAygEAIHgAAMoBACB5AADKAQAgegAAygEAIHsAAMoBACADAAAAhQEAIAMAAIYBADAEAACCAQAgAwAAAIUBACADAACGAQAwBAAAggEAIAMAAACFAQAgAwAAhgEAMAQAAIIBACANcQIAAAABcgEAAAABcwEAAAABdAEAAAABdQIAAAABdgEAAAABdwEAAAABeAEAAAABeQEAAAABegEAAAABewIAAAABfEAAAAABfUAAAAABAQgAAIoBACANcQIAAAABcgEAAAABcwEAAAABdAEAAAABdQIAAAABdgEAAAABdwEAAAABeAEAAAABeQEAAAABegEAAAABewIAAAABfEAAAAABfUAAAAABAQgAAIwBADABCAAAjAEAMA1xAgDRAQAhcgEA0AEAIXMBANABACF0AQDQAQAhdQIA0QEAIXYBANIBACF3AQDSAQAheAEA0gEAIXkBANIBACF6AQDSAQAhewIA0wEAIXxAANQBACF9QADUAQAhAgAAAIIBACAIAACPAQAgDXECANEBACFyAQDQAQAhcwEA0AEAIXQBANABACF1AgDRAQAhdgEA0gEAIXcBANIBACF4AQDSAQAheQEA0gEAIXoBANIBACF7AgDTAQAhfEAA1AEAIX1AANQBACECAAAAhQEAIAgAAJEBACACAAAAhQEAIAgAAJEBACADAAAAggEAIA8AAIoBACAQAACPAQAgAQAAAIIBACABAAAAhQEAIAsVAADLAQAgFgAAzAEAIBcAAM8BACAYAADOAQAgGQAAzQEAIHYAAMoBACB3AADKAQAgeAAAygEAIHkAAMoBACB6AADKAQAgewAAygEAIBBuAACbAQAwbwAAmAEAEHAAAJsBADBxAgCcAQAhcgEAnQEAIXMBAJ0BACF0AQCdAQAhdQIAnAEAIXYBAJ4BACF3AQCeAQAheAEAngEAIXkBAJ4BACF6AQCeAQAhewIAnwEAIXxAAKABACF9QACgAQAhAwAAAIUBACADAACXAQAwFAAAmAEAIAMAAACFAQAgAwAAhgEAMAQAAIIBACAQbgAAmwEAMG8AAJgBABBwAACbAQAwcQIAnAEAIXIBAJ0BACFzAQCdAQAhdAEAnQEAIXUCAJwBACF2AQCeAQAhdwEAngEAIXgBAJ4BACF5AQCeAQAhegEAngEAIXsCAJ8BACF8QACgAQAhfUAAoAEAIQ0VAACiAQAgFgAArAEAIBcAAKIBACAYAACiAQAgGQAAogEAIH4CAAAAAX8CAAAABIABAgAAAASBAQIAAAABggECAAAAAYMBAgAAAAGEAQIAAAABhQECAKsBACEOFQAAogEAIBgAAKoBACAZAACqAQAgfgEAAAABfwEAAAAEgAEBAAAABIEBAQAAAAGCAQEAAAABgwEBAAAAAYQBAQAAAAGFAQEAqQEAIYYBAQAAAAGHAQEAAAABiAEBAAAAAQ4VAAClAQAgGAAAqAEAIBkAAKgBACB-AQAAAAF_AQAAAAWAAQEAAAAFgQEBAAAAAYIBAQAAAAGDAQEAAAABhAEBAAAAAYUBAQCnAQAhhgEBAAAAAYcBAQAAAAGIAQEAAAABDRUAAKUBACAWAACmAQAgFwAApQEAIBgAAKUBACAZAAClAQAgfgIAAAABfwIAAAAFgAECAAAABYEBAgAAAAGCAQIAAAABgwECAAAAAYQBAgAAAAGFAQIApAEAIQsVAACiAQAgGAAAowEAIBkAAKMBACB-QAAAAAF_QAAAAASAAUAAAAAEgQFAAAAAAYIBQAAAAAGDAUAAAAABhAFAAAAAAYUBQAChAQAhCxUAAKIBACAYAACjAQAgGQAAowEAIH5AAAAAAX9AAAAABIABQAAAAASBAUAAAAABggFAAAAAAYMBQAAAAAGEAUAAAAABhQFAAKEBACEIfgIAAAABfwIAAAAEgAECAAAABIEBAgAAAAGCAQIAAAABgwECAAAAAYQBAgAAAAGFAQIAogEAIQh-QAAAAAF_QAAAAASAAUAAAAAEgQFAAAAAAYIBQAAAAAGDAUAAAAABhAFAAAAAAYUBQACjAQAhDRUAAKUBACAWAACmAQAgFwAApQEAIBgAAKUBACAZAAClAQAgfgIAAAABfwIAAAAFgAECAAAABYEBAgAAAAGCAQIAAAABgwECAAAAAYQBAgAAAAGFAQIApAEAIQh-AgAAAAF_AgAAAAWAAQIAAAAFgQECAAAAAYIBAgAAAAGDAQIAAAABhAECAAAAAYUBAgClAQAhCH4IAAAAAX8IAAAABYABCAAAAAWBAQgAAAABggEIAAAAAYMBCAAAAAGEAQgAAAABhQEIAKYBACEOFQAApQEAIBgAAKgBACAZAACoAQAgfgEAAAABfwEAAAAFgAEBAAAABYEBAQAAAAGCAQEAAAABgwEBAAAAAYQBAQAAAAGFAQEApwEAIYYBAQAAAAGHAQEAAAABiAEBAAAAAQt-AQAAAAF_AQAAAAWAAQEAAAAFgQEBAAAAAYIBAQAAAAGDAQEAAAABhAEBAAAAAYUBAQCoAQAhhgEBAAAAAYcBAQAAAAGIAQEAAAABDhUAAKIBACAYAACqAQAgGQAAqgEAIH4BAAAAAX8BAAAABIABAQAAAASBAQEAAAABggEBAAAAAYMBAQAAAAGEAQEAAAABhQEBAKkBACGGAQEAAAABhwEBAAAAAYgBAQAAAAELfgEAAAABfwEAAAAEgAEBAAAABIEBAQAAAAGCAQEAAAABgwEBAAAAAYQBAQAAAAGFAQEAqgEAIYYBAQAAAAGHAQEAAAABiAEBAAAAAQ0VAACiAQAgFgAArAEAIBcAAKIBACAYAACiAQAgGQAAogEAIH4CAAAAAX8CAAAABIABAgAAAASBAQIAAAABggECAAAAAYMBAgAAAAGEAQIAAAABhQECAKsBACEIfggAAAABfwgAAAAEgAEIAAAABIEBCAAAAAGCAQgAAAABgwEIAAAAAYQBCAAAAAGFAQgArAEAIRBuAACtAQAwbwAAhQEAEHAAAK0BADBxAgCuAQAhcgEArwEAIXMBAK8BACF0AQCvAQAhdQIArgEAIXYBALABACF3AQCwAQAheAEAsAEAIXkBALABACF6AQCwAQAhewIAsQEAIXxAALIBACF9QACyAQAhCH4CAAAAAX8CAAAABIABAgAAAASBAQIAAAABggECAAAAAYMBAgAAAAGEAQIAAAABhQECAKIBACELfgEAAAABfwEAAAAEgAEBAAAABIEBAQAAAAGCAQEAAAABgwEBAAAAAYQBAQAAAAGFAQEAqgEAIYYBAQAAAAGHAQEAAAABiAEBAAAAAQt-AQAAAAF_AQAAAAWAAQEAAAAFgQEBAAAAAYIBAQAAAAGDAQEAAAABhAEBAAAAAYUBAQCoAQAhhgEBAAAAAYcBAQAAAAGIAQEAAAABCH4CAAAAAX8CAAAABYABAgAAAAWBAQIAAAABggECAAAAAYMBAgAAAAGEAQIAAAABhQECAKUBACEIfkAAAAABf0AAAAAEgAFAAAAABIEBQAAAAAGCAUAAAAABgwFAAAAAAYQBQAAAAAGFAUAAowEAIQluAACzAQAwbwAAfwAQcAAAswEAMHEBAJ0BACF2AQCdAQAhiQEBAJ0BACGKAUAAoAEAIYsBQACgAQAhjAEBAJ4BACEJbgAAtAEAMG8AAGwAEHAAALQBADBxAQCvAQAhdgEArwEAIYkBAQCvAQAhigFAALIBACGLAUAAsgEAIYwBAQCwAQAhB24AALUBADBvAABmABBwAAC1AQAwcQIAnAEAIXIBAJ0BACF8QACgAQAhfUAAoAEAIQduAAC2AQAwbwAAUAAQcAAAtgEAMHECAJwBACFyAQCdAQAhfEAAoAEAIX1AAKABACEILQAAuAEAIG4AALcBADBvAAA5ABBwAAC3AQAwcQIArgEAIXIBAK8BACF8QACyAQAhfUAAsgEAIQONAQAANQAgjgEAADUAII8BAAA1ACAILAAAugEAIG4AALkBADBvAAA1ABBwAAC5AQAwcQIArgEAIXIBAK8BACF8QACyAQAhfUAAsgEAIQONAQAAOQAgjgEAADkAII8BAAA5ACAKCAAAvAEAIG4AALsBADBvAAAwABBwAAC7AQAwcQIAnAEAIXxAAKABACF9QACgAQAhkAEBAJ0BACGRAQEAnQEAIZIBQACgAQAhChUAAKIBACAYAAC9AQAgGQAAvQEAIH6AAAAAAYUBgAAAAAGTAQEAAAABlAEBAAAAAZUBAQAAAAGWAYAAAAABlwGAAAAAAQd-gAAAAAGFAYAAAAABkwEBAAAAAZQBAQAAAAGVAQEAAAABlgGAAAAAAZcBgAAAAAEKCAAAvwEAIG4AAL4BADBvAAAdABBwAAC-AQAwcQIArgEAIXxAALIBACF9QACyAQAhkAEBAK8BACGRAQEArwEAIZIBQACyAQAhB36AAAAAAYUBgAAAAAGTAQEAAAABlAEBAAAAAZUBAQAAAAGWAYAAAAABlwGAAAAAAQxuAADAAQAwbwAAFwAQcAAAwAEAMHECAJwBACFyAQCeAQAheAEAngEAIXxAAKABACF9QACgAQAhkgFAAMIBACGYAQEAnQEAIZkBAQCdAQAhmgEgAMEBACEFFQAAogEAIBgAAMYBACAZAADGAQAgfiAAAAABhQEgAMUBACELFQAApQEAIBgAAMQBACAZAADEAQAgfkAAAAABf0AAAAAFgAFAAAAABYEBQAAAAAGCAUAAAAABgwFAAAAAAYQBQAAAAAGFAUAAwwEAIQsVAAClAQAgGAAAxAEAIBkAAMQBACB-QAAAAAF_QAAAAAWAAUAAAAAFgQFAAAAAAYIBQAAAAAGDAUAAAAABhAFAAAAAAYUBQADDAQAhCH5AAAAAAX9AAAAABYABQAAAAAWBAUAAAAABggFAAAAAAYMBQAAAAAGEAUAAAAABhQFAAMQBACEFFQAAogEAIBgAAMYBACAZAADGAQAgfiAAAAABhQEgAMUBACECfiAAAAABhQEgAMYBACEMbgAAxwEAMG8AAAQAEHAAAMcBADBxAgCuAQAhcgEAsAEAIXgBALABACF8QACyAQAhfUAAsgEAIZIBQADJAQAhmAEBAK8BACGZAQEArwEAIZoBIADIAQAhAn4gAAAAAYUBIADGAQAhCH5AAAAAAX9AAAAABYABQAAAAAWBAUAAAAABggFAAAAAAYMBQAAAAAGEAUAAAAABhQFAAMQBACEAAAAAAAABnQEBAAAAAQWdAQIAAAABowECAAAAAaQBAgAAAAGlAQIAAAABpgECAAAAAQGdAQEAAAABBZ0BAgAAAAGjAQIAAAABpAECAAAAAaUBAgAAAAGmAQIAAAABAZ0BQAAAAAEAAAAAAAAAAAoPAADeAQAwEAAA4gEAMJsBAADfAQAwnAEAAOABADCdAQAA4QEAMJ4BAADhAQAwnwEAAOEBADCgAQAA4QEAMKEBAADjAQAwogEAAOQBADAEcQIAAAABcgEAAAABfEAAAAABfUAAAAABAgAAADMAIA8AAOgBACADAAAAMwAgDwAA6AEAIBAAAOcBACAILQAAuAEAIG4AALcBADBvAAA5ABBwAAC3AQAwcQIAAAABcgEAAAABfEAAsgEAIX1AALIBACECAAAAMwAgCAAA5wEAIAIAAADlAQAgCAAA5gEAIAduAADkAQAwbwAA5QEAEHAAAOQBADBxAgCuAQAhcgEArwEAIXxAALIBACF9QACyAQAhB24AAOQBADBvAADlAQAQcAAA5AEAMHECAK4BACFyAQCvAQAhfEAAsgEAIX1AALIBACEEcQIA0QEAIXIBANABACF8QADUAQAhfUAA1AEAIQRxAgDRAQAhcgEA0AEAIXxAANQBACF9QADUAQAhBHECAAAAAXIBAAAAAXxAAAAAAX1AAAAAAQMPAADeAQAwmwEAAN8BADCgAQAA4QEAMAAAAAAACg8AAPABADAQAAD0AQAwmwEAAPEBADCcAQAA8gEAMJ0BAADzAQAwngEAAPMBADCfAQAA8wEAMKABAADzAQAwoQEAAPUBADCiAQAA9gEAMARxAgAAAAFyAQAAAAF8QAAAAAF9QAAAAAECAAAANwAgDwAA-gEAIAMAAAA3ACAPAAD6AQAgEAAA-QEAIAgsAAC6AQAgbgAAuQEAMG8AADUAEHAAALkBADBxAgAAAAFyAQAAAAF8QACyAQAhfUAAsgEAIQIAAAA3ACAIAAD5AQAgAgAAAPcBACAIAAD4AQAgB24AAPYBADBvAAD3AQAQcAAA9gEAMHECAK4BACFyAQCvAQAhfEAAsgEAIX1AALIBACEHbgAA9gEAMG8AAPcBABBwAAD2AQAwcQIArgEAIXIBAK8BACF8QACyAQAhfUAAsgEAIQRxAgDRAQAhcgEA0AEAIXxAANQBACF9QADUAQAhBHECANEBACFyAQDQAQAhfEAA1AEAIX1AANQBACEEcQIAAAABcgEAAAABfEAAAAABfUAAAAABAw8AAPABADCbAQAA8QEAMKABAADzAQAwAAAAAAAAAAAAAAAAAZ0BIAAAAAEBnQFAAAAAAQAAAAAFFQAGFgAHFwAIGAAJGQAKAAAAAAAFFQAGFgAHFwAIGAAJGQAKAAAABRUAEBYAERcAEhgAExkAFAAAAAAABRUAEBYAERcAEhgAExkAFAIVABktOBcCFQAYLDsWASw8AAEtPQAAAAUVAB0WAB4XAB8YACAZACEAAAAAAAUVAB0WAB4XAB8YACAZACEAAAUVACYWACcXACgYACkZACoAAAAAAAUVACYWACcXACgYACkZACoAAAADFQAwGAAxGQAyAAAAAxUAMBgAMRkAMgAAAAUVADgWADkXADoYADsZADwAAAAAAAUVADgWADkXADoYADsZADwBAgECAwEFBgEGBwEHCAEJCgEKDAILDQMMDwENEQIOEgQREwESFAETFQIaGAUbGQscGwwdHAweHwwfIAwgIQwhIwwiJQIjJg0kKAwlKgImKw4nLAwoLQwpLgIqMQ8rMhUuNBYvPhYwPxYxQBYyQRYzQxY0RQI1Rho2SBY3SgI4Sxs5TBY6TRY7TgI8URw9UiI-Uxc_VBdAVRdBVhdCVxdDWRdEWwJFXCNGXhdHYAJIYSRJYhdKYxdLZAJMZyVNaCtOaixPayxQbixRbyxScCxTcixUdAJVdS1WdyxXeQJYei5ZeyxafCxbfQJcgAEvXYEBM16DATRfhAE0YIcBNGGIATRiiQE0Y4sBNGSNAQJljgE1ZpABNGeSAQJokwE2aZQBNGqVATRrlgECbJkBN22aAT0"
69
69
  };
70
70
  async function decodeBase64AsWasm(wasmBase64) {
71
71
  const { Buffer } = await Promise.resolve().then(() => __importStar(require('node:buffer')));
@@ -779,6 +779,7 @@ export declare const FileScalarFieldEnum: {
779
779
  readonly originalName: "originalName";
780
780
  readonly mimeType: "mimeType";
781
781
  readonly sizeBytes: "sizeBytes";
782
+ readonly checksum: "checksum";
782
783
  readonly title: "title";
783
784
  readonly description: "description";
784
785
  readonly resourceField: "resourceField";
@@ -162,6 +162,7 @@ exports.FileScalarFieldEnum = {
162
162
  originalName: 'originalName',
163
163
  mimeType: 'mimeType',
164
164
  sizeBytes: 'sizeBytes',
165
+ checksum: 'checksum',
165
166
  title: 'title',
166
167
  description: 'description',
167
168
  resourceField: 'resourceField',
@@ -89,6 +89,7 @@ export declare const FileScalarFieldEnum: {
89
89
  readonly originalName: "originalName";
90
90
  readonly mimeType: "mimeType";
91
91
  readonly sizeBytes: "sizeBytes";
92
+ readonly checksum: "checksum";
92
93
  readonly title: "title";
93
94
  readonly description: "description";
94
95
  readonly resourceField: "resourceField";
@@ -134,6 +134,7 @@ exports.FileScalarFieldEnum = {
134
134
  originalName: 'originalName',
135
135
  mimeType: 'mimeType',
136
136
  sizeBytes: 'sizeBytes',
137
+ checksum: 'checksum',
137
138
  title: 'title',
138
139
  description: 'description',
139
140
  resourceField: 'resourceField',
@@ -28,6 +28,7 @@ export type FileMinAggregateOutputType = {
28
28
  originalName: string | null;
29
29
  mimeType: string | null;
30
30
  sizeBytes: number | null;
31
+ checksum: string | null;
31
32
  title: string | null;
32
33
  description: string | null;
33
34
  resourceField: string | null;
@@ -42,6 +43,7 @@ export type FileMaxAggregateOutputType = {
42
43
  originalName: string | null;
43
44
  mimeType: string | null;
44
45
  sizeBytes: number | null;
46
+ checksum: string | null;
45
47
  title: string | null;
46
48
  description: string | null;
47
49
  resourceField: string | null;
@@ -56,6 +58,7 @@ export type FileCountAggregateOutputType = {
56
58
  originalName: number;
57
59
  mimeType: number;
58
60
  sizeBytes: number;
61
+ checksum: number;
59
62
  title: number;
60
63
  description: number;
61
64
  resourceField: number;
@@ -81,6 +84,7 @@ export type FileMinAggregateInputType = {
81
84
  originalName?: true;
82
85
  mimeType?: true;
83
86
  sizeBytes?: true;
87
+ checksum?: true;
84
88
  title?: true;
85
89
  description?: true;
86
90
  resourceField?: true;
@@ -95,6 +99,7 @@ export type FileMaxAggregateInputType = {
95
99
  originalName?: true;
96
100
  mimeType?: true;
97
101
  sizeBytes?: true;
102
+ checksum?: true;
98
103
  title?: true;
99
104
  description?: true;
100
105
  resourceField?: true;
@@ -109,6 +114,7 @@ export type FileCountAggregateInputType = {
109
114
  originalName?: true;
110
115
  mimeType?: true;
111
116
  sizeBytes?: true;
117
+ checksum?: true;
112
118
  title?: true;
113
119
  description?: true;
114
120
  resourceField?: true;
@@ -200,6 +206,7 @@ export type FileGroupByOutputType = {
200
206
  originalName: string;
201
207
  mimeType: string;
202
208
  sizeBytes: number;
209
+ checksum: string | null;
203
210
  title: string | null;
204
211
  description: string | null;
205
212
  resourceField: string | null;
@@ -225,6 +232,7 @@ export type FileWhereInput = {
225
232
  originalName?: Prisma.StringFilter<"File"> | string;
226
233
  mimeType?: Prisma.StringFilter<"File"> | string;
227
234
  sizeBytes?: Prisma.IntFilter<"File"> | number;
235
+ checksum?: Prisma.StringNullableFilter<"File"> | string | null;
228
236
  title?: Prisma.StringNullableFilter<"File"> | string | null;
229
237
  description?: Prisma.StringNullableFilter<"File"> | string | null;
230
238
  resourceField?: Prisma.StringNullableFilter<"File"> | string | null;
@@ -239,6 +247,7 @@ export type FileOrderByWithRelationInput = {
239
247
  originalName?: Prisma.SortOrder;
240
248
  mimeType?: Prisma.SortOrder;
241
249
  sizeBytes?: Prisma.SortOrder;
250
+ checksum?: Prisma.SortOrderInput | Prisma.SortOrder;
242
251
  title?: Prisma.SortOrderInput | Prisma.SortOrder;
243
252
  description?: Prisma.SortOrderInput | Prisma.SortOrder;
244
253
  resourceField?: Prisma.SortOrderInput | Prisma.SortOrder;
@@ -256,6 +265,7 @@ export type FileWhereUniqueInput = Prisma.AtLeast<{
256
265
  originalName?: Prisma.StringFilter<"File"> | string;
257
266
  mimeType?: Prisma.StringFilter<"File"> | string;
258
267
  sizeBytes?: Prisma.IntFilter<"File"> | number;
268
+ checksum?: Prisma.StringNullableFilter<"File"> | string | null;
259
269
  title?: Prisma.StringNullableFilter<"File"> | string | null;
260
270
  description?: Prisma.StringNullableFilter<"File"> | string | null;
261
271
  resourceField?: Prisma.StringNullableFilter<"File"> | string | null;
@@ -270,6 +280,7 @@ export type FileOrderByWithAggregationInput = {
270
280
  originalName?: Prisma.SortOrder;
271
281
  mimeType?: Prisma.SortOrder;
272
282
  sizeBytes?: Prisma.SortOrder;
283
+ checksum?: Prisma.SortOrderInput | Prisma.SortOrder;
273
284
  title?: Prisma.SortOrderInput | Prisma.SortOrder;
274
285
  description?: Prisma.SortOrderInput | Prisma.SortOrder;
275
286
  resourceField?: Prisma.SortOrderInput | Prisma.SortOrder;
@@ -292,6 +303,7 @@ export type FileScalarWhereWithAggregatesInput = {
292
303
  originalName?: Prisma.StringWithAggregatesFilter<"File"> | string;
293
304
  mimeType?: Prisma.StringWithAggregatesFilter<"File"> | string;
294
305
  sizeBytes?: Prisma.IntWithAggregatesFilter<"File"> | number;
306
+ checksum?: Prisma.StringNullableWithAggregatesFilter<"File"> | string | null;
295
307
  title?: Prisma.StringNullableWithAggregatesFilter<"File"> | string | null;
296
308
  description?: Prisma.StringNullableWithAggregatesFilter<"File"> | string | null;
297
309
  resourceField?: Prisma.StringNullableWithAggregatesFilter<"File"> | string | null;
@@ -305,6 +317,7 @@ export type FileCreateInput = {
305
317
  originalName: string;
306
318
  mimeType: string;
307
319
  sizeBytes: number;
320
+ checksum?: string | null;
308
321
  title?: string | null;
309
322
  description?: string | null;
310
323
  resourceField?: string | null;
@@ -319,6 +332,7 @@ export type FileUncheckedCreateInput = {
319
332
  originalName: string;
320
333
  mimeType: string;
321
334
  sizeBytes: number;
335
+ checksum?: string | null;
322
336
  title?: string | null;
323
337
  description?: string | null;
324
338
  resourceField?: string | null;
@@ -332,6 +346,7 @@ export type FileUpdateInput = {
332
346
  originalName?: Prisma.StringFieldUpdateOperationsInput | string;
333
347
  mimeType?: Prisma.StringFieldUpdateOperationsInput | string;
334
348
  sizeBytes?: Prisma.IntFieldUpdateOperationsInput | number;
349
+ checksum?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
335
350
  title?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
336
351
  description?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
337
352
  resourceField?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
@@ -346,6 +361,7 @@ export type FileUncheckedUpdateInput = {
346
361
  originalName?: Prisma.StringFieldUpdateOperationsInput | string;
347
362
  mimeType?: Prisma.StringFieldUpdateOperationsInput | string;
348
363
  sizeBytes?: Prisma.IntFieldUpdateOperationsInput | number;
364
+ checksum?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
349
365
  title?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
350
366
  description?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
351
367
  resourceField?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
@@ -360,6 +376,7 @@ export type FileCreateManyInput = {
360
376
  originalName: string;
361
377
  mimeType: string;
362
378
  sizeBytes: number;
379
+ checksum?: string | null;
363
380
  title?: string | null;
364
381
  description?: string | null;
365
382
  resourceField?: string | null;
@@ -373,6 +390,7 @@ export type FileUpdateManyMutationInput = {
373
390
  originalName?: Prisma.StringFieldUpdateOperationsInput | string;
374
391
  mimeType?: Prisma.StringFieldUpdateOperationsInput | string;
375
392
  sizeBytes?: Prisma.IntFieldUpdateOperationsInput | number;
393
+ checksum?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
376
394
  title?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
377
395
  description?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
378
396
  resourceField?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
@@ -387,6 +405,7 @@ export type FileUncheckedUpdateManyInput = {
387
405
  originalName?: Prisma.StringFieldUpdateOperationsInput | string;
388
406
  mimeType?: Prisma.StringFieldUpdateOperationsInput | string;
389
407
  sizeBytes?: Prisma.IntFieldUpdateOperationsInput | number;
408
+ checksum?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
390
409
  title?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
391
410
  description?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
392
411
  resourceField?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
@@ -401,6 +420,7 @@ export type FileCountOrderByAggregateInput = {
401
420
  originalName?: Prisma.SortOrder;
402
421
  mimeType?: Prisma.SortOrder;
403
422
  sizeBytes?: Prisma.SortOrder;
423
+ checksum?: Prisma.SortOrder;
404
424
  title?: Prisma.SortOrder;
405
425
  description?: Prisma.SortOrder;
406
426
  resourceField?: Prisma.SortOrder;
@@ -420,6 +440,7 @@ export type FileMaxOrderByAggregateInput = {
420
440
  originalName?: Prisma.SortOrder;
421
441
  mimeType?: Prisma.SortOrder;
422
442
  sizeBytes?: Prisma.SortOrder;
443
+ checksum?: Prisma.SortOrder;
423
444
  title?: Prisma.SortOrder;
424
445
  description?: Prisma.SortOrder;
425
446
  resourceField?: Prisma.SortOrder;
@@ -434,6 +455,7 @@ export type FileMinOrderByAggregateInput = {
434
455
  originalName?: Prisma.SortOrder;
435
456
  mimeType?: Prisma.SortOrder;
436
457
  sizeBytes?: Prisma.SortOrder;
458
+ checksum?: Prisma.SortOrder;
437
459
  title?: Prisma.SortOrder;
438
460
  description?: Prisma.SortOrder;
439
461
  resourceField?: Prisma.SortOrder;
@@ -460,6 +482,7 @@ export type FileSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs = r
460
482
  originalName?: boolean;
461
483
  mimeType?: boolean;
462
484
  sizeBytes?: boolean;
485
+ checksum?: boolean;
463
486
  title?: boolean;
464
487
  description?: boolean;
465
488
  resourceField?: boolean;
@@ -474,6 +497,7 @@ export type FileSelectCreateManyAndReturn<ExtArgs extends runtime.Types.Extensio
474
497
  originalName?: boolean;
475
498
  mimeType?: boolean;
476
499
  sizeBytes?: boolean;
500
+ checksum?: boolean;
477
501
  title?: boolean;
478
502
  description?: boolean;
479
503
  resourceField?: boolean;
@@ -488,6 +512,7 @@ export type FileSelectUpdateManyAndReturn<ExtArgs extends runtime.Types.Extensio
488
512
  originalName?: boolean;
489
513
  mimeType?: boolean;
490
514
  sizeBytes?: boolean;
515
+ checksum?: boolean;
491
516
  title?: boolean;
492
517
  description?: boolean;
493
518
  resourceField?: boolean;
@@ -502,6 +527,7 @@ export type FileSelectScalar = {
502
527
  originalName?: boolean;
503
528
  mimeType?: boolean;
504
529
  sizeBytes?: boolean;
530
+ checksum?: boolean;
505
531
  title?: boolean;
506
532
  description?: boolean;
507
533
  resourceField?: boolean;
@@ -510,7 +536,7 @@ export type FileSelectScalar = {
510
536
  updatedAt?: boolean;
511
537
  createdAt?: boolean;
512
538
  };
513
- export type FileOmit<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetOmit<"id" | "name" | "originalName" | "mimeType" | "sizeBytes" | "title" | "description" | "resourceField" | "resourceName" | "resourceId" | "updatedAt" | "createdAt", ExtArgs["result"]["file"]>;
539
+ export type FileOmit<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetOmit<"id" | "name" | "originalName" | "mimeType" | "sizeBytes" | "checksum" | "title" | "description" | "resourceField" | "resourceName" | "resourceId" | "updatedAt" | "createdAt", ExtArgs["result"]["file"]>;
514
540
  export type $FilePayload<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
515
541
  name: "File";
516
542
  objects: {};
@@ -520,6 +546,7 @@ export type $FilePayload<ExtArgs extends runtime.Types.Extensions.InternalArgs =
520
546
  originalName: string;
521
547
  mimeType: string;
522
548
  sizeBytes: number;
549
+ checksum: string | null;
523
550
  title: string | null;
524
551
  description: string | null;
525
552
  resourceField: string | null;
@@ -889,6 +916,7 @@ export interface FileFieldRefs {
889
916
  readonly originalName: Prisma.FieldRef<"File", 'String'>;
890
917
  readonly mimeType: Prisma.FieldRef<"File", 'String'>;
891
918
  readonly sizeBytes: Prisma.FieldRef<"File", 'Int'>;
919
+ readonly checksum: Prisma.FieldRef<"File", 'String'>;
892
920
  readonly title: Prisma.FieldRef<"File", 'String'>;
893
921
  readonly description: Prisma.FieldRef<"File", 'String'>;
894
922
  readonly resourceField: Prisma.FieldRef<"File", 'String'>;
@@ -78,7 +78,6 @@ export declare abstract class ResourceService<ReadOne = Resource, ReadMany = Res
78
78
  private mapAggregationValues;
79
79
  private makeAggregationIterator;
80
80
  private projectResource;
81
- private projectVirtualFields;
82
81
  private sanitizeData;
83
82
  private mapQueryFilter;
84
83
  private mapRelationInclusions;
@@ -4,6 +4,7 @@ exports.ResourceService = void 0;
4
4
  const date_fns_1 = require("date-fns");
5
5
  const common_1 = require("@appweaver/common");
6
6
  const context_1 = require("../context");
7
+ const utils_1 = require("../utils");
7
8
  const security_1 = require("../security");
8
9
  const cache_1 = require("../cache");
9
10
  const errors_1 = require("../errors");
@@ -443,7 +444,7 @@ class ResourceService {
443
444
  };
444
445
  }
445
446
  projectResource(resource) {
446
- const projectedResource = this.projectVirtualFields(resource);
447
+ const projectedResource = (0, utils_1.projectVirtualFields)(resource, this._client.name);
447
448
  if (!(0, common_1.isObject)(projectedResource['_count'])) {
448
449
  return projectedResource;
449
450
  }
@@ -454,44 +455,6 @@ class ResourceService {
454
455
  delete projectedResource['_count'];
455
456
  return projectedResource;
456
457
  }
457
- projectVirtualFields(resource, resourceName) {
458
- if (!resource) {
459
- return resource;
460
- }
461
- const projectedVirtual = { ...resource };
462
- const resourceModel = (0, context_1.injectModel)(resourceName ?? this._client.name, false);
463
- const relationsModel = resourceModel?.relationsModel;
464
- const filesModel = resourceModel?.filesModel;
465
- // Set output or default value for virtual fields
466
- for (const [fieldName, virtual] of Object.entries(resourceModel?.config?.virtual ?? {})) {
467
- const outputValue = virtual.output?.value;
468
- if ((0, common_1.isFunction)(outputValue)) {
469
- projectedVirtual[fieldName] = outputValue(projectedVirtual);
470
- }
471
- else if (outputValue) {
472
- projectedVirtual[fieldName] = outputValue;
473
- }
474
- else if (virtual.required !== false) {
475
- projectedVirtual[fieldName] =
476
- virtual.default ?? (0, common_1.defaultScalarValue)(virtual);
477
- }
478
- }
479
- // Recursively project virtual fields for nested relational objects
480
- for (const key in projectedVirtual) {
481
- const value = projectedVirtual[key];
482
- const relationSchema = (0, common_1.extractSchemaProperties)(relationsModel, key);
483
- const fileSchema = (0, common_1.extractSchemaProperties)(filesModel, key);
484
- if ((0, common_1.isObject)(value) || ((0, common_1.isArray)(value) && (0, common_1.isObject)(value[0]))) {
485
- const resourceName = (0, common_1.extractResourceName)(relationSchema ?? fileSchema);
486
- if (resourceName) {
487
- projectedVirtual[key] = (0, common_1.isArray)(value)
488
- ? value.map((item) => this.projectVirtualFields(item, resourceName))
489
- : this.projectVirtualFields(value, resourceName);
490
- }
491
- }
492
- }
493
- return projectedVirtual;
494
- }
495
458
  sanitizeData(action, data, resourceName) {
496
459
  const sanitizedData = { ...data };
497
460
  const resourceModel = (0, context_1.injectModel)(resourceName ?? this._client.name, false);
@@ -1,5 +1,5 @@
1
1
  import { AuthScope, AuthSource, AuthUser, RouteConfig } from '@appweaver/common';
2
- import { AuthTokens, JwtPayload, UserAdditionalData } from '../types';
2
+ import { AuthTokens, JwtPayload, UserAdditionalData, UserInfo } from '../types';
3
3
  export declare class AuthService {
4
4
  /**
5
5
  * Finds an authenticated user by their unique identifier.
@@ -40,6 +40,21 @@ export declare class AuthService {
40
40
  * @throws {HttpError} Throws an error if the registration process fails.
41
41
  */
42
42
  registerAuthUser(source: AuthSource, email: string, password?: string, data?: Partial<UserAdditionalData>): Promise<AuthUser>;
43
+ /**
44
+ * Checks whether a user is allowed to be registered and/or authenticated via OAuth2 by invoking the optional
45
+ * `checkOAuth2User` callback configured on the auth service. When the callback returns nothing, the OAuth2 flow
46
+ * proceeds normally (registration of a new user or login of an existing one). When it returns a string or an error,
47
+ * the flow is aborted by throwing an `HttpError`.
48
+ *
49
+ * @param {AuthSource} source - The OAuth2 authentication source, e.g., oauth2Google, oauth2Facebook, oauth2Custom.
50
+ * @param {UserInfo} userInfo - The user info extracted from the OAuth2 provider.
51
+ * @param {AuthUser | null} authUser - The existing authenticated user matched by email, or null when the user does
52
+ * not exist yet (i.e., a new user would be registered).
53
+ * @return {Promise<void>} A promise that resolves when the user is allowed to proceed.
54
+ * @throws {HttpError} If the configured callback returns a string or an error (status 403 unless an `HttpError` is
55
+ * returned, in which case it is thrown as-is).
56
+ */
57
+ checkOAuth2User(source: AuthSource, userInfo: UserInfo, authUser: AuthUser | null): Promise<void>;
43
58
  /**
44
59
  * Changes the password for the authenticated user.
45
60
  *
@@ -114,6 +114,34 @@ class AuthService {
114
114
  throw new errors_1.HttpError('Auth user registration error', 500, e);
115
115
  }
116
116
  }
117
+ /**
118
+ * Checks whether a user is allowed to be registered and/or authenticated via OAuth2 by invoking the optional
119
+ * `checkOAuth2User` callback configured on the auth service. When the callback returns nothing, the OAuth2 flow
120
+ * proceeds normally (registration of a new user or login of an existing one). When it returns a string or an error,
121
+ * the flow is aborted by throwing an `HttpError`.
122
+ *
123
+ * @param {AuthSource} source - The OAuth2 authentication source, e.g., oauth2Google, oauth2Facebook, oauth2Custom.
124
+ * @param {UserInfo} userInfo - The user info extracted from the OAuth2 provider.
125
+ * @param {AuthUser | null} authUser - The existing authenticated user matched by email, or null when the user does
126
+ * not exist yet (i.e., a new user would be registered).
127
+ * @return {Promise<void>} A promise that resolves when the user is allowed to proceed.
128
+ * @throws {HttpError} If the configured callback returns a string or an error (status 403 unless an `HttpError` is
129
+ * returned, in which case it is thrown as-is).
130
+ */
131
+ async checkOAuth2User(source, userInfo, authUser) {
132
+ const serviceConfig = this._authUserService[common_1.CONFIG];
133
+ if (!serviceConfig.checkOAuth2User) {
134
+ return;
135
+ }
136
+ const result = await serviceConfig.checkOAuth2User(source, userInfo, authUser);
137
+ if (!result) {
138
+ return;
139
+ }
140
+ if (result instanceof errors_1.HttpError) {
141
+ throw result;
142
+ }
143
+ throw new errors_1.HttpError(result instanceof Error ? result.message : result, 403, result instanceof Error ? result : undefined);
144
+ }
117
145
  /**
118
146
  * Changes the password for the authenticated user.
119
147
  *
@@ -1,6 +1,7 @@
1
1
  import { Ctor, IResourceService, ResourceModel, ResourceModelConfig, ResourceServiceConfig } from '@appweaver/common';
2
- import { RegistrationDataFn } from '../types';
2
+ import { CheckOAuth2UserFn, RegistrationDataFn } from '../types';
3
3
  export declare function createAuthModel(config: ResourceModelConfig): ResourceModel;
4
4
  export declare function createAuthService<T = any, C = any, U = any>(config: ResourceServiceConfig<T, C, U> & {
5
5
  registrationData?: RegistrationDataFn<T>;
6
+ checkOAuth2User?: CheckOAuth2UserFn;
6
7
  }): Ctor<IResourceService<T, T, C, U>>;
@@ -1,11 +1,6 @@
1
1
  import { AuthSource } from '@appweaver/common';
2
- import { Server } from '../../types';
3
- export type UserInfo = {
4
- id: string;
5
- email: string;
6
- firstName: string;
7
- lastName: string;
8
- };
2
+ import { Server, UserInfo } from '../../types';
3
+ export type { UserInfo };
9
4
  export type OAuth2Config = {
10
5
  enabled: boolean;
11
6
  clientId?: string;
@@ -70,8 +70,19 @@ function createOAuth2Plugin(authSource, oAuth2Config) {
70
70
  const { token } = await server[authSource].getAccessTokenFromAuthorizationCodeFlow(request);
71
71
  const userInfo = await oAuth2Config.extractUserInfo(token.access_token);
72
72
  let authUser = await authService.findByUsername(userInfo.email);
73
+ await authService.checkOAuth2User(authSource, userInfo, authUser);
73
74
  if (!authUser) {
74
- authUser = await authService.registerAuthUser(authSource, userInfo.email, undefined, (0, common_1.pickProperties)(userInfo, ['firstName', 'lastName']));
75
+ if (!common_1.config.SECURITY_OAUTH2_REGISTRATION_ENABLED) {
76
+ throw new errors_1.HttpError('Auth user does not exist and OAuth2 registration is disabled', 403);
77
+ }
78
+ authUser = await authService.registerAuthUser(authSource, userInfo.email, undefined, {
79
+ ...(0, common_1.pickProperties)(userInfo, [
80
+ 'firstName',
81
+ 'lastName',
82
+ 'avatarUrl'
83
+ ]),
84
+ avatarFile: await fetchAvatarFile(userInfo)
85
+ });
75
86
  }
76
87
  else if (!authUser.verifiedEmail) {
77
88
  throw new errors_1.HttpError('Auth user email address is not verified', 403);
@@ -83,3 +94,36 @@ function createOAuth2Plugin(authSource, oAuth2Config) {
83
94
  });
84
95
  });
85
96
  }
97
+ /**
98
+ * Downloads the user's avatar image from the OAuth2 provider so it can be passed to the `registrationData` callback.
99
+ * Fetching is best-effort: any failure is logged and `undefined` is returned so the registration flow is not blocked.
100
+ *
101
+ * @param {UserInfo} userInfo - The user info extracted from the OAuth2 provider, including the optional avatar URL.
102
+ * @return {Promise<AvatarFile | undefined>} A promise resolving to the downloaded avatar file, or `undefined` when
103
+ * avatar fetching is disabled, no avatar URL is available, or the download fails.
104
+ */
105
+ async function fetchAvatarFile(userInfo) {
106
+ if (!common_1.config.SECURITY_OAUTH2_FETCH_AVATAR_ENABLED || !userInfo.avatarUrl) {
107
+ return undefined;
108
+ }
109
+ try {
110
+ const resp = await fetch(userInfo.avatarUrl, { method: 'GET' });
111
+ if (!resp.ok) {
112
+ common_1.logger.debug({ url: userInfo.avatarUrl, status: resp.status }, 'OAuth2 avatar fetch failed');
113
+ return undefined;
114
+ }
115
+ const mimeType = resp.headers.get('content-type') ?? 'image/jpeg';
116
+ const data = Buffer.from(await resp.arrayBuffer());
117
+ const extension = mimeType.split('/')[1]?.split(';')[0] ?? 'jpg';
118
+ return {
119
+ name: `avatar-${userInfo.id}.${extension}`,
120
+ mimeType,
121
+ size: data.length,
122
+ data
123
+ };
124
+ }
125
+ catch (e) {
126
+ common_1.logger.debug({ url: userInfo.avatarUrl, err: e }, 'OAuth2 avatar fetch error');
127
+ return undefined;
128
+ }
129
+ }
@@ -3,5 +3,6 @@ export type OAuth2UserInfo = {
3
3
  email: string;
4
4
  given_name: string;
5
5
  family_name: string;
6
+ picture?: string;
6
7
  };
7
8
  export declare const oauth2Custom: (server: import("../..").Server) => Promise<void>;
@@ -35,6 +35,7 @@ async function fetchCustomUser(accessToken) {
35
35
  id: data.sub,
36
36
  email: data.email,
37
37
  firstName: data.given_name,
38
- lastName: data.family_name
38
+ lastName: data.family_name,
39
+ avatarUrl: data.picture
39
40
  };
40
41
  }