@payloadcms/drizzle 4.0.0-internal.ea6e8f8 → 4.0.0-internal.ee5d8bd

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 (169) hide show
  1. package/dist/count.d.ts.map +1 -1
  2. package/dist/count.js +3 -25
  3. package/dist/count.js.map +1 -1
  4. package/dist/countVersions.d.ts.map +1 -1
  5. package/dist/countVersions.js +4 -28
  6. package/dist/countVersions.js.map +1 -1
  7. package/dist/createGlobalVersion.d.ts.map +1 -1
  8. package/dist/createGlobalVersion.js +2 -15
  9. package/dist/createGlobalVersion.js.map +1 -1
  10. package/dist/createVersion.d.ts.map +1 -1
  11. package/dist/createVersion.js +1 -12
  12. package/dist/createVersion.js.map +1 -1
  13. package/dist/deleteOne.d.ts.map +1 -1
  14. package/dist/deleteOne.js +1 -18
  15. package/dist/deleteOne.js.map +1 -1
  16. package/dist/find/buildFindManyArgs.d.ts +2 -3
  17. package/dist/find/buildFindManyArgs.d.ts.map +1 -1
  18. package/dist/find/buildFindManyArgs.js +1 -2
  19. package/dist/find/buildFindManyArgs.js.map +1 -1
  20. package/dist/find/buildPolymorphicJoinQuery.d.ts +4 -4
  21. package/dist/find/buildPolymorphicJoinQuery.d.ts.map +1 -1
  22. package/dist/find/buildPolymorphicJoinQuery.js +26 -32
  23. package/dist/find/buildPolymorphicJoinQuery.js.map +1 -1
  24. package/dist/find/buildPolymorphicJoinWhere.js +1 -1
  25. package/dist/find/buildPolymorphicJoinWhere.js.map +1 -1
  26. package/dist/find/createPolymorphicJoinWherePlan.d.ts +2 -1
  27. package/dist/find/createPolymorphicJoinWherePlan.d.ts.map +1 -1
  28. package/dist/find/createPolymorphicJoinWherePlan.js +14 -5
  29. package/dist/find/createPolymorphicJoinWherePlan.js.map +1 -1
  30. package/dist/find/findMany.d.ts +1 -6
  31. package/dist/find/findMany.d.ts.map +1 -1
  32. package/dist/find/findMany.js +3 -16
  33. package/dist/find/findMany.js.map +1 -1
  34. package/dist/find/traverseFields.d.ts +2 -3
  35. package/dist/find/traverseFields.d.ts.map +1 -1
  36. package/dist/find/traverseFields.js +8 -54
  37. package/dist/find/traverseFields.js.map +1 -1
  38. package/dist/find.d.ts.map +1 -1
  39. package/dist/find.js +4 -32
  40. package/dist/find.js.map +1 -1
  41. package/dist/findDistinct.d.ts.map +1 -1
  42. package/dist/findDistinct.js +8 -107
  43. package/dist/findDistinct.js.map +1 -1
  44. package/dist/findGlobal.d.ts.map +1 -1
  45. package/dist/findGlobal.js +5 -22
  46. package/dist/findGlobal.js.map +1 -1
  47. package/dist/findGlobalVersions.js +3 -8
  48. package/dist/findGlobalVersions.js.map +1 -1
  49. package/dist/findOne.d.ts +1 -1
  50. package/dist/findOne.d.ts.map +1 -1
  51. package/dist/findOne.js +3 -30
  52. package/dist/findOne.js.map +1 -1
  53. package/dist/findVersions.d.ts.map +1 -1
  54. package/dist/findVersions.js +5 -32
  55. package/dist/findVersions.js.map +1 -1
  56. package/dist/index.d.ts +0 -10
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +0 -10
  59. package/dist/index.js.map +1 -1
  60. package/dist/postgres/insert.d.ts.map +1 -1
  61. package/dist/postgres/insert.js +2 -4
  62. package/dist/postgres/insert.js.map +1 -1
  63. package/dist/postgres/types.d.ts +0 -4
  64. package/dist/postgres/types.d.ts.map +1 -1
  65. package/dist/postgres/types.js.map +1 -1
  66. package/dist/queries/buildAndOrConditions.d.ts +2 -3
  67. package/dist/queries/buildAndOrConditions.d.ts.map +1 -1
  68. package/dist/queries/buildAndOrConditions.js +1 -2
  69. package/dist/queries/buildAndOrConditions.js.map +1 -1
  70. package/dist/queries/buildOrderBy.d.ts +2 -3
  71. package/dist/queries/buildOrderBy.d.ts.map +1 -1
  72. package/dist/queries/buildOrderBy.js +1 -2
  73. package/dist/queries/buildOrderBy.js.map +1 -1
  74. package/dist/queries/buildQuery.d.ts +2 -3
  75. package/dist/queries/buildQuery.d.ts.map +1 -1
  76. package/dist/queries/buildQuery.js +2 -4
  77. package/dist/queries/buildQuery.js.map +1 -1
  78. package/dist/queries/getTableColumnFromPath.d.ts +2 -3
  79. package/dist/queries/getTableColumnFromPath.d.ts.map +1 -1
  80. package/dist/queries/getTableColumnFromPath.js +27 -166
  81. package/dist/queries/getTableColumnFromPath.js.map +1 -1
  82. package/dist/queries/parseParams.d.ts +2 -3
  83. package/dist/queries/parseParams.d.ts.map +1 -1
  84. package/dist/queries/parseParams.js +1 -4
  85. package/dist/queries/parseParams.js.map +1 -1
  86. package/dist/queryDrafts.d.ts.map +1 -1
  87. package/dist/queryDrafts.js +4 -23
  88. package/dist/queryDrafts.js.map +1 -1
  89. package/dist/schema/build.d.ts.map +1 -1
  90. package/dist/schema/build.js +20 -23
  91. package/dist/schema/build.js.map +1 -1
  92. package/dist/sqlite/execute.js.map +1 -1
  93. package/dist/sqlite/insert.d.ts.map +1 -1
  94. package/dist/sqlite/insert.js +3 -5
  95. package/dist/sqlite/insert.js.map +1 -1
  96. package/dist/sqlite/types.d.ts +0 -4
  97. package/dist/sqlite/types.d.ts.map +1 -1
  98. package/dist/sqlite/types.js.map +1 -1
  99. package/dist/transactions/beginTransaction.d.ts.map +1 -1
  100. package/dist/transactions/beginTransaction.js +5 -13
  101. package/dist/transactions/beginTransaction.js.map +1 -1
  102. package/dist/transactions/commitTransaction.d.ts.map +1 -1
  103. package/dist/transactions/commitTransaction.js +5 -1
  104. package/dist/transactions/commitTransaction.js.map +1 -1
  105. package/dist/transform/read/traverseFields.js.map +1 -1
  106. package/dist/transform/write/array.d.ts +2 -3
  107. package/dist/transform/write/array.d.ts.map +1 -1
  108. package/dist/transform/write/array.js +1 -2
  109. package/dist/transform/write/array.js.map +1 -1
  110. package/dist/transform/write/blocks.d.ts +2 -3
  111. package/dist/transform/write/blocks.d.ts.map +1 -1
  112. package/dist/transform/write/blocks.js +1 -2
  113. package/dist/transform/write/blocks.js.map +1 -1
  114. package/dist/transform/write/index.d.ts.map +1 -1
  115. package/dist/transform/write/index.js +0 -2
  116. package/dist/transform/write/index.js.map +1 -1
  117. package/dist/transform/write/traverseFields.d.ts +1 -2
  118. package/dist/transform/write/traverseFields.d.ts.map +1 -1
  119. package/dist/transform/write/traverseFields.js +6 -32
  120. package/dist/transform/write/traverseFields.js.map +1 -1
  121. package/dist/transform/write/types.d.ts +0 -7
  122. package/dist/transform/write/types.d.ts.map +1 -1
  123. package/dist/transform/write/types.js.map +1 -1
  124. package/dist/types.d.ts +0 -1
  125. package/dist/types.d.ts.map +1 -1
  126. package/dist/types.js.map +1 -1
  127. package/dist/updateGlobal.d.ts +1 -5
  128. package/dist/updateGlobal.d.ts.map +1 -1
  129. package/dist/updateGlobal.js +4 -96
  130. package/dist/updateGlobal.js.map +1 -1
  131. package/dist/updateOne.d.ts.map +1 -1
  132. package/dist/updateOne.js +5 -47
  133. package/dist/updateOne.js.map +1 -1
  134. package/dist/upsertRow/deleteExistingRowsByPath.d.ts.map +1 -1
  135. package/dist/upsertRow/deleteExistingRowsByPath.js +12 -17
  136. package/dist/upsertRow/deleteExistingRowsByPath.js.map +1 -1
  137. package/dist/upsertRow/index.d.ts +1 -1
  138. package/dist/upsertRow/index.d.ts.map +1 -1
  139. package/dist/upsertRow/index.js +42 -132
  140. package/dist/upsertRow/index.js.map +1 -1
  141. package/dist/upsertRow/types.d.ts +0 -3
  142. package/dist/upsertRow/types.d.ts.map +1 -1
  143. package/dist/upsertRow/types.js.map +1 -1
  144. package/dist/utilities/blocksToJsonMigrator.d.ts.map +1 -1
  145. package/dist/utilities/blocksToJsonMigrator.js +6 -17
  146. package/dist/utilities/blocksToJsonMigrator.js.map +1 -1
  147. package/dist/utilities/createSchemaGenerator.d.ts.map +1 -1
  148. package/dist/utilities/createSchemaGenerator.js +7 -12
  149. package/dist/utilities/createSchemaGenerator.js.map +1 -1
  150. package/dist/utilities/executeSchemaHooks.js +1 -1
  151. package/dist/utilities/executeSchemaHooks.js.map +1 -1
  152. package/dist/utilities/formatGeneratedFile.d.ts +10 -0
  153. package/dist/utilities/formatGeneratedFile.d.ts.map +1 -0
  154. package/dist/utilities/formatGeneratedFile.js +58 -0
  155. package/dist/utilities/formatGeneratedFile.js.map +1 -0
  156. package/dist/utilities/getTransaction.js.map +1 -1
  157. package/package.json +16 -19
  158. package/dist/deleteBranchGlobal.d.ts +0 -10
  159. package/dist/deleteBranchGlobal.d.ts.map +0 -1
  160. package/dist/deleteBranchGlobal.js +0 -27
  161. package/dist/deleteBranchGlobal.js.map +0 -1
  162. package/dist/queries/buildBranchVisibility.d.ts +0 -11
  163. package/dist/queries/buildBranchVisibility.d.ts.map +0 -1
  164. package/dist/queries/buildBranchVisibility.js +0 -48
  165. package/dist/queries/buildBranchVisibility.js.map +0 -1
  166. package/dist/upsertBranchGlobalChange.d.ts +0 -3
  167. package/dist/upsertBranchGlobalChange.d.ts.map +0 -1
  168. package/dist/upsertBranchGlobalChange.js +0 -35
  169. package/dist/upsertBranchGlobalChange.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"blocksToJsonMigrator.d.ts","sourceRoot":"","sources":["../../src/utilities/blocksToJsonMigrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EAExB,OAAO,EAGR,MAAM,SAAS,CAAA;AAchB,OAAO,KAAK,EAGV,oBAAoB,EACpB,cAAc,EACf,MAAM,aAAa,CAAA;AA8rBpB,eAAO,MAAM,0BAA0B,oDAIpC;IACD,OAAO,EAAE,cAAc,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB,kBAAkB,EAAE,CAAC,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE,KAAK,MAAM,CAAA;CACnF,KAAG,oBAEH,CAAA;AAED,eAAO,MAAM,uBAAuB,YAAa,OAAO,KAAG,oBAQ1D,CAAA;AAED,eAAO,MAAM,2CAA2C,qBAErD;IACD,WAAW,EAAE,MAAM,CAAA;CACpB,KAAG,wBAoCH,CAAA"}
1
+ {"version":3,"file":"blocksToJsonMigrator.d.ts","sourceRoot":"","sources":["../../src/utilities/blocksToJsonMigrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EAExB,OAAO,EAGR,MAAM,SAAS,CAAA;AAchB,OAAO,KAAK,EAGV,oBAAoB,EACpB,cAAc,EACf,MAAM,aAAa,CAAA;AAkrBpB,eAAO,MAAM,0BAA0B,oDAIpC;IACD,OAAO,EAAE,cAAc,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB,kBAAkB,EAAE,CAAC,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE,KAAK,MAAM,CAAA;CACnF,KAAG,oBAEH,CAAA;AAED,eAAO,MAAM,uBAAuB,YAAa,OAAO,KAAG,oBAQ1D,CAAA;AAED,eAAO,MAAM,2CAA2C,qBAErD;IACD,WAAW,EAAE,MAAM,CAAA;CACpB,KAAG,wBAoCH,CAAA"}
@@ -3,6 +3,7 @@ import path from 'path';
3
3
  import { APIError, buildVersionCollectionFields, buildVersionGlobalFields, dynamicImport } from 'payload';
4
4
  import { findConfig } from 'payload/node';
5
5
  import { fieldShouldBeLocalized } from 'payload/shared';
6
+ import { formatGeneratedFile } from './formatGeneratedFile.js';
6
7
  import { getTransaction } from './getTransaction.js';
7
8
  const DEFAULT_BATCH_SIZE = 100;
8
9
  const TEMP_FOLDER_NAME = '.payload-blocks-migration';
@@ -520,23 +521,11 @@ class BlocksToJsonMigratorImpl {
520
521
  const printer = ts.createPrinter({
521
522
  newLine: ts.NewLineKind.LineFeed
522
523
  });
523
- let output = printer.printFile(result.transformed[0]);
524
- try {
525
- // eslint-disable-next-line @typescript-eslint/consistent-type-imports
526
- const prettier = await dynamicImport('prettier');
527
- const configPath = await prettier.resolveConfigFile();
528
- const config = configPath ? await prettier.resolveConfig(configPath) : {};
529
- output = await prettier.format(output, {
530
- ...config,
531
- parser: 'typescript'
532
- });
533
- } catch (err) {
534
- this.adapter.payload.logger.error({
535
- err,
536
- msg: 'Could not format payload config with Prettier'
537
- });
538
- }
539
- writeFileSync(configPath, output, 'utf-8');
524
+ writeFileSync(configPath, printer.printFile(result.transformed[0]), 'utf-8');
525
+ await formatGeneratedFile({
526
+ filePath: configPath,
527
+ logger: this.adapter.payload.logger
528
+ });
540
529
  this.adapter.payload.logger.info(`Updated ${configPath} with blocksAsJSON: true`);
541
530
  }
542
531
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/blocksToJsonMigrator.ts"],"sourcesContent":["import type {\n DynamicMigrationTemplate,\n FlattenedField,\n Payload,\n PayloadRequest,\n SanitizedConfig,\n} from 'payload'\nimport type tsTypes from 'typescript'\n\nimport { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'fs'\nimport path from 'path'\nimport {\n APIError,\n buildVersionCollectionFields,\n buildVersionGlobalFields,\n dynamicImport,\n} from 'payload'\nimport { findConfig } from 'payload/node'\nimport { fieldShouldBeLocalized } from 'payload/shared'\n\nimport type {\n BlocksToJsonBlockToMigrate,\n BlocksToJsonEntityToMigrate,\n BlocksToJsonMigrator,\n DrizzleAdapter,\n} from '../types.js'\n\nimport { getTransaction } from './getTransaction.js'\n\nconst DEFAULT_BATCH_SIZE = 100\nconst TEMP_FOLDER_NAME = '.payload-blocks-migration'\n\nconst writeEntitiesToTempFile = (\n entities: BlocksToJsonEntityToMigrate[],\n tempFolderPath: string,\n batchIndex: number,\n): void => {\n const filePath = path.join(tempFolderPath, `entities-batch-${batchIndex}.json`)\n writeFileSync(filePath, JSON.stringify(entities, null, 2), 'utf-8')\n}\n\nconst acceptDrizzlePrompts = async <T>(\n callPrompt: () => Promise<T> | T,\n {\n silenceLogs = false,\n }: {\n silenceLogs?: boolean\n } = {},\n): Promise<T> => {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const write = process.stdout.write\n\n if (silenceLogs) {\n process.stdout.write = () => true\n }\n\n const promise = callPrompt()\n\n const interval = setInterval(\n () =>\n process.stdin.emit('keypress', '\\n', {\n name: 'return',\n ctrl: false,\n }),\n 25,\n )\n\n const res = await promise\n\n if (silenceLogs) {\n process.stdout.write = write\n }\n\n clearInterval(interval)\n\n return res\n}\n\nconst entityHasBlocksField = (entity: { flattenedFields: FlattenedField[] }): boolean => {\n for (const field of entity.flattenedFields) {\n if (field.type === 'blocks') {\n return true\n }\n\n if (\n 'flattenedFields' in field &&\n entityHasBlocksField({ flattenedFields: field.flattenedFields })\n ) {\n return true\n }\n }\n\n return false\n}\n\nconst collectBlocksToMigrate = ({\n config,\n data,\n fields,\n parentAccessor,\n parentIsLocalized,\n}: {\n config: SanitizedConfig\n data: any\n fields: FlattenedField[]\n parentAccessor: (number | string)[]\n parentIsLocalized: boolean\n}): BlocksToJsonBlockToMigrate[] => {\n const result: BlocksToJsonBlockToMigrate[] = []\n\n for (const field of fields) {\n switch (field.type) {\n case 'array': {\n const arrayData = data[field.name]\n\n if (!Array.isArray(arrayData)) {\n continue\n }\n\n if (config.localization && fieldShouldBeLocalized({ field, parentIsLocalized })) {\n result.push(\n ...collectBlocksToMigrate({\n config,\n data: arrayData,\n fields: config.localization.localeCodes.map((code) => ({\n ...field,\n name: code,\n localized: false,\n })),\n parentAccessor: [...parentAccessor, field.name],\n parentIsLocalized: true,\n }),\n )\n\n continue\n }\n\n for (const [index, row] of arrayData.entries()) {\n result.push(\n ...collectBlocksToMigrate({\n config,\n data: row,\n fields: field.flattenedFields,\n parentAccessor: [...parentAccessor, field.name, index],\n parentIsLocalized,\n }),\n )\n }\n break\n }\n case 'blocks': {\n result.push({\n data: data[field.name],\n fieldAccessor: [...parentAccessor, field.name],\n })\n break\n }\n case 'group':\n case 'tab': {\n if (config.localization && fieldShouldBeLocalized({ field, parentIsLocalized })) {\n result.push(\n ...collectBlocksToMigrate({\n config,\n data: data[field.name],\n fields: config.localization.localeCodes.map((code) => ({\n ...field,\n name: code,\n localized: false,\n })),\n parentAccessor: [...parentAccessor, field.name],\n parentIsLocalized: true,\n }),\n )\n\n continue\n }\n\n result.push(\n ...collectBlocksToMigrate({\n config,\n data: data[field.name],\n fields: field.flattenedFields,\n parentAccessor: [...parentAccessor, field.name],\n parentIsLocalized,\n }),\n )\n break\n }\n default: {\n continue\n }\n }\n }\n\n return result\n}\n\nclass BlocksToJsonMigratorImpl implements BlocksToJsonMigrator {\n private readonly batchSize: number\n private tempFolderPath: string\n\n constructor(\n private readonly adapter: DrizzleAdapter,\n private readonly sanitizeStatements: (args: {\n sqlExecute: string\n statements: string[]\n }) => string,\n private readonly executeMethod: string,\n batchSize?: number,\n ) {\n this.batchSize = batchSize || DEFAULT_BATCH_SIZE\n this.tempFolderPath = path.resolve(this.adapter.migrationDir, TEMP_FOLDER_NAME)\n }\n\n private ensureTempFolder(): void {\n if (!existsSync(this.tempFolderPath)) {\n mkdirSync(this.tempFolderPath, { recursive: true })\n }\n }\n\n private *fetchEntitiesFromJsonBatches(): IterableIterator<BlocksToJsonEntityToMigrate[]> {\n if (!existsSync(this.tempFolderPath)) {\n return\n }\n\n const files = readdirSync(this.tempFolderPath)\n .filter((file) => file.startsWith('entities-batch-') && file.endsWith('.json'))\n .sort((a, b) => {\n const aNum = parseInt(a.match(/\\d+/)?.[0] || '0', 10)\n const bNum = parseInt(b.match(/\\d+/)?.[0] || '0', 10)\n return aNum - bNum\n })\n\n for (const file of files) {\n const filePath = path.join(this.tempFolderPath, file)\n const fileContent = readFileSync(filePath, 'utf-8')\n const batchEntities = JSON.parse(fileContent) as BlocksToJsonEntityToMigrate[]\n yield batchEntities\n }\n }\n\n private async migrateEntities(\n entities: BlocksToJsonEntityToMigrate[],\n req: PayloadRequest,\n ): Promise<void> {\n this.adapter.blocksAsJSON = true\n this.resetSchema()\n await this.adapter.init()\n await this.adapter.connect()\n\n await this.syncTransactionDrizzleInstance(req)\n\n const totalEntities = entities.length\n let processed = 0\n\n for (const entity of entities) {\n switch (entity.type) {\n case 'collection': {\n await this.adapter.updateOne({\n collection: entity.slug,\n data: entity.originalData,\n joins: false,\n req,\n where: {\n id: {\n equals: entity.id,\n },\n },\n })\n break\n }\n case 'collectionVersion': {\n await this.adapter.updateVersion({\n id: entity.id,\n collection: entity.slug,\n req,\n versionData: entity.originalData as any,\n })\n\n break\n }\n case 'global': {\n await this.adapter.updateGlobal({\n slug: entity.slug,\n data: entity.originalData,\n req,\n })\n break\n }\n case 'globalVersion': {\n await this.adapter.updateGlobalVersion({\n id: entity.id,\n global: entity.slug,\n req,\n versionData: entity.originalData as any,\n })\n break\n }\n }\n\n processed++\n if (processed % this.batchSize === 0 || processed === totalEntities) {\n this.adapter.payload.logger.info(\n `Migrated ${processed}/${totalEntities} entities (${Math.round((processed / totalEntities) * 100)}%)`,\n )\n }\n }\n }\n\n private resetSchema() {\n this.adapter.schema = {}\n this.adapter.tables = {}\n this.adapter.indexes = new Set()\n this.adapter.foreignKeys = new Set()\n this.adapter.relations = {}\n this.adapter.rawTables = {}\n this.adapter.rawRelations = {}\n this.adapter.tableNameMap = new Map()\n this.adapter.enums = {}\n }\n\n private async syncTransactionDrizzleInstance(req: PayloadRequest) {\n const tsx = (await getTransaction(this.adapter, req)) as any\n\n tsx._ = this.adapter.drizzle._\n tsx.schema = this.adapter.drizzle._\n tsx.session.schema = (this.adapter.drizzle as any).session.schema\n }\n\n cleanupTempFolder(): void {\n rmSync(this.tempFolderPath, { force: true, recursive: true })\n\n this.adapter.payload.logger.info(`Cleaned up temp folder at ${this.tempFolderPath}`)\n }\n\n async collectAndSaveEntitiesToBatches(\n req: PayloadRequest,\n options?: {\n batchSize?: number\n },\n ): Promise<void> {\n const batchSize = options?.batchSize ?? this.batchSize\n\n this.cleanupTempFolder()\n this.ensureTempFolder()\n\n this.adapter.blocksAsJSON = false\n this.resetSchema()\n await this.adapter.init()\n await this.adapter.connect()\n\n // Count total entities to migrate\n let totalExpected = 0\n for (const collection of this.adapter.payload.config.collections.filter(entityHasBlocksField)) {\n const { totalDocs } = await this.adapter.count({ collection: collection.slug })\n totalExpected += totalDocs\n\n if (collection.versions) {\n const { totalDocs: totalVersions } = await this.adapter.countVersions({\n collection: collection.slug,\n })\n totalExpected += totalVersions\n }\n }\n\n for (const globalConfig of this.adapter.payload.config.globals.filter(entityHasBlocksField)) {\n totalExpected += 1 // Global itself\n\n if (globalConfig.versions) {\n const { totalDocs: totalGlobalVersions } = await this.adapter.countGlobalVersions({\n global: globalConfig.slug,\n })\n totalExpected += totalGlobalVersions\n }\n }\n\n this.adapter.payload.logger.info(\n `Found ${totalExpected} total entities to collect and save to batches`,\n )\n\n let batchIndex = 0\n let currentBatch: BlocksToJsonEntityToMigrate[] = []\n let totalCollected = 0\n\n const flushBatch = () => {\n if (currentBatch.length > 0) {\n writeEntitiesToTempFile(currentBatch, this.tempFolderPath, batchIndex)\n const percentage =\n totalExpected > 0 ? Math.round((totalCollected / totalExpected) * 100) : 0\n this.adapter.payload.logger.info(\n `Saved batch ${batchIndex} with ${currentBatch.length} entities (${totalCollected}/${totalExpected} - ${percentage}%)`,\n )\n batchIndex++\n currentBatch = []\n }\n }\n\n const addEntity = (entity: BlocksToJsonEntityToMigrate) => {\n currentBatch.push(entity)\n totalCollected++\n if (currentBatch.length >= batchSize) {\n flushBatch()\n }\n }\n\n for (const collection of this.adapter.payload.config.collections.filter(entityHasBlocksField)) {\n let page = 1\n let hasMore = true\n\n while (hasMore) {\n const { docs, hasNextPage } = await this.adapter.find({\n collection: collection.slug,\n limit: batchSize,\n page,\n })\n\n for (const doc of docs) {\n const entity: BlocksToJsonEntityToMigrate = {\n id: doc.id,\n slug: collection.slug,\n type: 'collection',\n blocks: collectBlocksToMigrate({\n config: this.adapter.payload.config,\n data: doc,\n fields: collection.flattenedFields,\n parentAccessor: [],\n parentIsLocalized: false,\n }),\n originalData: doc,\n }\n\n addEntity(entity)\n }\n\n this.adapter.payload.logger.info(\n `Collected ${docs.length} entries from ${collection.slug} (page ${page})`,\n )\n\n hasMore = hasNextPage\n page++\n }\n\n if (collection.versions) {\n let versionPage = 1\n let hasMoreVersions = true\n\n while (hasMoreVersions) {\n const { docs: versionDocs, hasNextPage: hasNextVersionPage } =\n await this.adapter.findVersions({\n collection: collection.slug,\n limit: batchSize,\n page: versionPage,\n })\n\n for (const versionDoc of versionDocs) {\n const entity: BlocksToJsonEntityToMigrate = {\n id: versionDoc.id,\n slug: collection.slug,\n type: 'collectionVersion',\n blocks: collectBlocksToMigrate({\n config: this.adapter.payload.config,\n data: versionDoc,\n fields: buildVersionCollectionFields(this.adapter.payload.config, collection, true),\n parentAccessor: [],\n parentIsLocalized: false,\n }),\n originalData: versionDoc,\n }\n\n addEntity(entity)\n }\n\n this.adapter.payload.logger.info(\n `Collected ${versionDocs.length} versions from ${collection.slug} (page ${versionPage})`,\n )\n\n hasMoreVersions = hasNextVersionPage\n versionPage++\n }\n }\n }\n\n for (const globalConfig of this.adapter.payload.config.globals.filter(entityHasBlocksField)) {\n const globalDoc = await this.adapter.findGlobal({ slug: globalConfig.slug })\n\n const entity: BlocksToJsonEntityToMigrate = {\n slug: globalConfig.slug,\n type: 'global',\n blocks: collectBlocksToMigrate({\n config: this.adapter.payload.config,\n data: globalDoc,\n fields: globalConfig.flattenedFields,\n parentAccessor: [],\n parentIsLocalized: false,\n }),\n originalData: globalDoc,\n }\n\n addEntity(entity)\n this.adapter.payload.logger.info(`Collected global ${globalConfig.slug}`)\n\n if (globalConfig.versions) {\n let globalVersionPage = 1\n let hasMoreGlobalVersions = true\n\n while (hasMoreGlobalVersions) {\n const { docs: globalVersionDocs, hasNextPage: hasNextGlobalVersionPage } =\n await this.adapter.findGlobalVersions({\n global: globalConfig.slug,\n limit: batchSize,\n page: globalVersionPage,\n })\n\n for (const globalVersionDoc of globalVersionDocs) {\n const entity: BlocksToJsonEntityToMigrate = {\n id: globalVersionDoc.id,\n slug: globalConfig.slug,\n type: 'globalVersion',\n blocks: collectBlocksToMigrate({\n config: this.adapter.payload.config,\n data: globalVersionDoc,\n fields: buildVersionGlobalFields(this.adapter.payload.config, globalConfig, true),\n parentAccessor: [],\n parentIsLocalized: false,\n }),\n originalData: globalVersionDoc,\n }\n\n addEntity(entity)\n }\n\n this.adapter.payload.logger.info(\n `Collected ${globalVersionDocs.length} versions from global ${globalConfig.slug} (page ${globalVersionPage})`,\n )\n\n hasMoreGlobalVersions = hasNextGlobalVersionPage\n globalVersionPage++\n }\n }\n }\n\n flushBatch()\n\n this.adapter.payload.logger.info(\n `Collected total of ${totalCollected} entities across ${batchIndex} batches`,\n )\n }\n\n async getMigrationStatements(): Promise<{\n statements: string\n writeDrizzleSnapshot(filePath: string): void\n }> {\n const { generateDrizzleJson, generateMigration } = this.adapter.requireDrizzleKit()\n\n const drizzleJsonBefore = await generateDrizzleJson(this.adapter.schema)\n this.adapter.blocksAsJSON = true\n this.resetSchema()\n\n await this.adapter.init()\n const drizzleJsonAfter = await generateDrizzleJson(this.adapter.schema)\n this.adapter.blocksAsJSON = false\n this.resetSchema()\n await this.adapter.init()\n\n const statements = await acceptDrizzlePrompts(\n () => generateMigration(drizzleJsonBefore, drizzleJsonAfter),\n {\n silenceLogs: true,\n },\n )\n\n const sqlExecute = `await db.${this.executeMethod}(` + 'sql`'\n\n return {\n statements: this.sanitizeStatements({\n sqlExecute,\n statements,\n }),\n writeDrizzleSnapshot(filePath) {\n writeFileSync(`${filePath}.json`, JSON.stringify(drizzleJsonAfter, null, 2))\n },\n }\n }\n\n async migrateEntitiesFromTempFolder(\n req: PayloadRequest,\n options?: {\n clearBatches?: boolean\n },\n ): Promise<void> {\n const clearBatches = options?.clearBatches ?? true\n\n let totalEntities = 0\n let hasEntities = false\n\n for (const entities of this.fetchEntitiesFromJsonBatches()) {\n hasEntities = true\n totalEntities += entities.length\n\n this.adapter.payload.logger.info(\n `Migrating batch with ${entities.length} entities (total: ${totalEntities})`,\n )\n\n await this.migrateEntities(entities, req)\n }\n\n if (!hasEntities) {\n this.adapter.payload.logger.warn('No entities found in temp folder to migrate')\n return\n }\n\n this.adapter.payload.logger.info(\n `Completed migration of ${totalEntities} entities from temp folder`,\n )\n\n if (clearBatches) {\n this.cleanupTempFolder()\n } else {\n this.adapter.payload.logger.info(\n `Temp folder preserved at ${this.tempFolderPath} (clearBatches: false)`,\n )\n }\n }\n\n setTempFolder(tempFolderPath: string): void {\n this.tempFolderPath = tempFolderPath\n }\n\n async updatePayloadConfigFile(): Promise<void> {\n let configPath: string\n\n try {\n configPath = findConfig()\n } catch {\n this.adapter.payload.logger.info(\n 'updatePayloadConfigFile failed - could not find the payload config. Please set the blocksAsJSON DB adapter property manually to \"true\"',\n )\n return\n }\n\n const configFile = readFileSync(configPath, 'utf-8')\n\n const ts = await dynamicImport<typeof tsTypes>('typescript')\n\n const source = ts.createSourceFile(configPath, configFile, ts.ScriptTarget.ESNext)\n\n let hadChanges = false\n\n const result = ts.transform(source, [\n (ctx) => (sourceFile) => {\n const factory = ctx.factory\n\n const visit: tsTypes.Visitor = (node) => {\n if (\n ts.isPropertyAssignment(node) &&\n ts.isIdentifier(node.name) &&\n node.name.text === 'db' &&\n ts.isCallExpression(node.initializer) &&\n node.initializer.arguments.length > 0 &&\n ts.isObjectLiteralExpression(node.initializer.arguments[0])\n ) {\n const call = node.initializer\n const obj = node.initializer.arguments[0]\n\n const filteredProps = obj.properties.filter((prop) => {\n if (!ts.isPropertyAssignment(prop)) {\n return true\n }\n\n return !(ts.isIdentifier(prop.name) && prop.name.text === 'blocksAsJSON')\n })\n\n const newProperty = factory.createPropertyAssignment(\n 'blocksAsJSON',\n factory.createTrue(),\n )\n hadChanges = true\n const newObject = factory.updateObjectLiteralExpression(obj, [\n ...filteredProps,\n newProperty,\n ])\n\n const newCall = factory.updateCallExpression(\n call,\n call.expression,\n call.typeArguments,\n [newObject],\n )\n\n return factory.updatePropertyAssignment(node, node.name, newCall)\n }\n\n return ts.visitEachChild(node, visit, ctx)\n }\n\n return ts.visitNode(sourceFile, visit) as tsTypes.SourceFile\n },\n ])\n\n if (!hadChanges) {\n this.adapter.payload.logger.info(\n 'No changes made to payload config. Set blocksAsJSON to true manually.',\n )\n return\n }\n\n const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed })\n let output = printer.printFile(result.transformed[0])\n\n try {\n // eslint-disable-next-line @typescript-eslint/consistent-type-imports\n const prettier = await dynamicImport<typeof import('prettier')>('prettier')\n const configPath = await prettier.resolveConfigFile()\n const config = configPath ? await prettier.resolveConfig(configPath) : {}\n output = await prettier.format(output, { ...config, parser: 'typescript' })\n } catch (err) {\n this.adapter.payload.logger.error({\n err,\n msg: 'Could not format payload config with Prettier',\n })\n }\n\n writeFileSync(configPath, output, 'utf-8')\n this.adapter.payload.logger.info(`Updated ${configPath} with blocksAsJSON: true`)\n }\n}\n\nexport const createBlocksToJsonMigrator = ({\n adapter,\n executeMethod,\n sanitizeStatements,\n}: {\n adapter: DrizzleAdapter\n executeMethod: string\n sanitizeStatements: (args: { sqlExecute: string; statements: string[] }) => string\n}): BlocksToJsonMigrator => {\n return new BlocksToJsonMigratorImpl(adapter, sanitizeStatements, executeMethod)\n}\n\nexport const getBlocksToJsonMigrator = (payload: Payload): BlocksToJsonMigrator => {\n const migrator = (payload.db as DrizzleAdapter).blocksToJsonMigrator\n\n if (!migrator) {\n throw new APIError(`blocksToJsonMigrator is not defined for ${payload.db.packageName}`)\n }\n\n return migrator\n}\n\nexport const buildDynamicPredefinedBlocksToJsonMigration = ({\n packageName,\n}: {\n packageName: string\n}): DynamicMigrationTemplate => {\n return async ({ filePath, payload }) => {\n const migrator = getBlocksToJsonMigrator(payload)\n\n const migrationStatements = await migrator.getMigrationStatements()\n\n migrationStatements.writeDrizzleSnapshot(filePath)\n\n await migrator.updatePayloadConfigFile()\n const upSQL = `\nconst migrator = getBlocksToJsonMigrator(payload)\nmigrator.setTempFolder(TEMP_FOLDER)\nawait migrator.collectAndSaveEntitiesToBatches(req, { batchSize: BATCH_SIZE })\n\n${migrationStatements.statements}\npayload.logger.info(\"Executed blocks to JSON migration statements.\")\n\nawait migrator.migrateEntitiesFromTempFolder(req, { clearBatches: true })\n `\n\n return {\n imports: `\nimport { getBlocksToJsonMigrator } from '${packageName}/migration-utils'\nimport { fileURLToPath } from 'url'\nimport path from 'path'\n\nconst filename = fileURLToPath(import.meta.url)\nconst dirname = path.dirname(filename)\n\n// Configure migration options (optional)\nconst BATCH_SIZE = 100 // Number of entities to process per batch\nconst TEMP_FOLDER = path.resolve(dirname, '${TEMP_FOLDER_NAME}') // Folder path to store migration batch\n`,\n upSQL,\n }\n }\n}\n"],"names":["existsSync","mkdirSync","readdirSync","readFileSync","rmSync","writeFileSync","path","APIError","buildVersionCollectionFields","buildVersionGlobalFields","dynamicImport","findConfig","fieldShouldBeLocalized","getTransaction","DEFAULT_BATCH_SIZE","TEMP_FOLDER_NAME","writeEntitiesToTempFile","entities","tempFolderPath","batchIndex","filePath","join","JSON","stringify","acceptDrizzlePrompts","callPrompt","silenceLogs","write","process","stdout","promise","interval","setInterval","stdin","emit","name","ctrl","res","clearInterval","entityHasBlocksField","entity","field","flattenedFields","type","collectBlocksToMigrate","config","data","fields","parentAccessor","parentIsLocalized","result","arrayData","Array","isArray","localization","push","localeCodes","map","code","localized","index","row","entries","fieldAccessor","BlocksToJsonMigratorImpl","batchSize","adapter","sanitizeStatements","executeMethod","resolve","migrationDir","ensureTempFolder","recursive","fetchEntitiesFromJsonBatches","files","filter","file","startsWith","endsWith","sort","a","b","aNum","parseInt","match","bNum","fileContent","batchEntities","parse","migrateEntities","req","blocksAsJSON","resetSchema","init","connect","syncTransactionDrizzleInstance","totalEntities","length","processed","updateOne","collection","slug","originalData","joins","where","id","equals","updateVersion","versionData","updateGlobal","updateGlobalVersion","global","payload","logger","info","Math","round","schema","tables","indexes","Set","foreignKeys","relations","rawTables","rawRelations","tableNameMap","Map","enums","tsx","_","drizzle","session","cleanupTempFolder","force","collectAndSaveEntitiesToBatches","options","totalExpected","collections","totalDocs","count","versions","totalVersions","countVersions","globalConfig","globals","totalGlobalVersions","countGlobalVersions","currentBatch","totalCollected","flushBatch","percentage","addEntity","page","hasMore","docs","hasNextPage","find","limit","doc","blocks","versionPage","hasMoreVersions","versionDocs","hasNextVersionPage","findVersions","versionDoc","globalDoc","findGlobal","globalVersionPage","hasMoreGlobalVersions","globalVersionDocs","hasNextGlobalVersionPage","findGlobalVersions","globalVersionDoc","getMigrationStatements","generateDrizzleJson","generateMigration","requireDrizzleKit","drizzleJsonBefore","drizzleJsonAfter","statements","sqlExecute","writeDrizzleSnapshot","migrateEntitiesFromTempFolder","clearBatches","hasEntities","warn","setTempFolder","updatePayloadConfigFile","configPath","configFile","ts","source","createSourceFile","ScriptTarget","ESNext","hadChanges","transform","ctx","sourceFile","factory","visit","node","isPropertyAssignment","isIdentifier","text","isCallExpression","initializer","arguments","isObjectLiteralExpression","call","obj","filteredProps","properties","prop","newProperty","createPropertyAssignment","createTrue","newObject","updateObjectLiteralExpression","newCall","updateCallExpression","expression","typeArguments","updatePropertyAssignment","visitEachChild","visitNode","printer","createPrinter","newLine","NewLineKind","LineFeed","output","printFile","transformed","prettier","resolveConfigFile","resolveConfig","format","parser","err","error","msg","createBlocksToJsonMigrator","getBlocksToJsonMigrator","migrator","db","blocksToJsonMigrator","packageName","buildDynamicPredefinedBlocksToJsonMigration","migrationStatements","upSQL","imports"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utilities/blocksToJsonMigrator.ts"],"sourcesContent":["import type {\n DynamicMigrationTemplate,\n FlattenedField,\n Payload,\n PayloadRequest,\n SanitizedConfig,\n} from 'payload'\nimport type tsTypes from 'typescript'\n\nimport { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'fs'\nimport path from 'path'\nimport {\n APIError,\n buildVersionCollectionFields,\n buildVersionGlobalFields,\n dynamicImport,\n} from 'payload'\nimport { findConfig } from 'payload/node'\nimport { fieldShouldBeLocalized } from 'payload/shared'\n\nimport type {\n BlocksToJsonBlockToMigrate,\n BlocksToJsonEntityToMigrate,\n BlocksToJsonMigrator,\n DrizzleAdapter,\n} from '../types.js'\n\nimport { formatGeneratedFile } from './formatGeneratedFile.js'\nimport { getTransaction } from './getTransaction.js'\n\nconst DEFAULT_BATCH_SIZE = 100\nconst TEMP_FOLDER_NAME = '.payload-blocks-migration'\n\nconst writeEntitiesToTempFile = (\n entities: BlocksToJsonEntityToMigrate[],\n tempFolderPath: string,\n batchIndex: number,\n): void => {\n const filePath = path.join(tempFolderPath, `entities-batch-${batchIndex}.json`)\n writeFileSync(filePath, JSON.stringify(entities, null, 2), 'utf-8')\n}\n\nconst acceptDrizzlePrompts = async <T>(\n callPrompt: () => Promise<T> | T,\n {\n silenceLogs = false,\n }: {\n silenceLogs?: boolean\n } = {},\n): Promise<T> => {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const write = process.stdout.write\n\n if (silenceLogs) {\n process.stdout.write = () => true\n }\n\n const promise = callPrompt()\n\n const interval = setInterval(\n () =>\n process.stdin.emit('keypress', '\\n', {\n name: 'return',\n ctrl: false,\n }),\n 25,\n )\n\n const res = await promise\n\n if (silenceLogs) {\n process.stdout.write = write\n }\n\n clearInterval(interval)\n\n return res\n}\n\nconst entityHasBlocksField = (entity: { flattenedFields: FlattenedField[] }): boolean => {\n for (const field of entity.flattenedFields) {\n if (field.type === 'blocks') {\n return true\n }\n\n if (\n 'flattenedFields' in field &&\n entityHasBlocksField({ flattenedFields: field.flattenedFields })\n ) {\n return true\n }\n }\n\n return false\n}\n\nconst collectBlocksToMigrate = ({\n config,\n data,\n fields,\n parentAccessor,\n parentIsLocalized,\n}: {\n config: SanitizedConfig\n data: any\n fields: FlattenedField[]\n parentAccessor: (number | string)[]\n parentIsLocalized: boolean\n}): BlocksToJsonBlockToMigrate[] => {\n const result: BlocksToJsonBlockToMigrate[] = []\n\n for (const field of fields) {\n switch (field.type) {\n case 'array': {\n const arrayData = data[field.name]\n\n if (!Array.isArray(arrayData)) {\n continue\n }\n\n if (config.localization && fieldShouldBeLocalized({ field, parentIsLocalized })) {\n result.push(\n ...collectBlocksToMigrate({\n config,\n data: arrayData,\n fields: config.localization.localeCodes.map((code) => ({\n ...field,\n name: code,\n localized: false,\n })),\n parentAccessor: [...parentAccessor, field.name],\n parentIsLocalized: true,\n }),\n )\n\n continue\n }\n\n for (const [index, row] of arrayData.entries()) {\n result.push(\n ...collectBlocksToMigrate({\n config,\n data: row,\n fields: field.flattenedFields,\n parentAccessor: [...parentAccessor, field.name, index],\n parentIsLocalized,\n }),\n )\n }\n break\n }\n case 'blocks': {\n result.push({\n data: data[field.name],\n fieldAccessor: [...parentAccessor, field.name],\n })\n break\n }\n case 'group':\n case 'tab': {\n if (config.localization && fieldShouldBeLocalized({ field, parentIsLocalized })) {\n result.push(\n ...collectBlocksToMigrate({\n config,\n data: data[field.name],\n fields: config.localization.localeCodes.map((code) => ({\n ...field,\n name: code,\n localized: false,\n })),\n parentAccessor: [...parentAccessor, field.name],\n parentIsLocalized: true,\n }),\n )\n\n continue\n }\n\n result.push(\n ...collectBlocksToMigrate({\n config,\n data: data[field.name],\n fields: field.flattenedFields,\n parentAccessor: [...parentAccessor, field.name],\n parentIsLocalized,\n }),\n )\n break\n }\n default: {\n continue\n }\n }\n }\n\n return result\n}\n\nclass BlocksToJsonMigratorImpl implements BlocksToJsonMigrator {\n private readonly batchSize: number\n private tempFolderPath: string\n\n constructor(\n private readonly adapter: DrizzleAdapter,\n private readonly sanitizeStatements: (args: {\n sqlExecute: string\n statements: string[]\n }) => string,\n private readonly executeMethod: string,\n batchSize?: number,\n ) {\n this.batchSize = batchSize || DEFAULT_BATCH_SIZE\n this.tempFolderPath = path.resolve(this.adapter.migrationDir, TEMP_FOLDER_NAME)\n }\n\n private ensureTempFolder(): void {\n if (!existsSync(this.tempFolderPath)) {\n mkdirSync(this.tempFolderPath, { recursive: true })\n }\n }\n\n private *fetchEntitiesFromJsonBatches(): IterableIterator<BlocksToJsonEntityToMigrate[]> {\n if (!existsSync(this.tempFolderPath)) {\n return\n }\n\n const files = readdirSync(this.tempFolderPath)\n .filter((file) => file.startsWith('entities-batch-') && file.endsWith('.json'))\n .sort((a, b) => {\n const aNum = parseInt(a.match(/\\d+/)?.[0] || '0', 10)\n const bNum = parseInt(b.match(/\\d+/)?.[0] || '0', 10)\n return aNum - bNum\n })\n\n for (const file of files) {\n const filePath = path.join(this.tempFolderPath, file)\n const fileContent = readFileSync(filePath, 'utf-8')\n const batchEntities = JSON.parse(fileContent) as BlocksToJsonEntityToMigrate[]\n yield batchEntities\n }\n }\n\n private async migrateEntities(\n entities: BlocksToJsonEntityToMigrate[],\n req: PayloadRequest,\n ): Promise<void> {\n this.adapter.blocksAsJSON = true\n this.resetSchema()\n await this.adapter.init()\n await this.adapter.connect()\n\n await this.syncTransactionDrizzleInstance(req)\n\n const totalEntities = entities.length\n let processed = 0\n\n for (const entity of entities) {\n switch (entity.type) {\n case 'collection': {\n await this.adapter.updateOne({\n collection: entity.slug,\n data: entity.originalData,\n joins: false,\n req,\n where: {\n id: {\n equals: entity.id,\n },\n },\n })\n break\n }\n case 'collectionVersion': {\n await this.adapter.updateVersion({\n id: entity.id,\n collection: entity.slug,\n req,\n versionData: entity.originalData as any,\n })\n\n break\n }\n case 'global': {\n await this.adapter.updateGlobal({\n slug: entity.slug,\n data: entity.originalData,\n req,\n })\n break\n }\n case 'globalVersion': {\n await this.adapter.updateGlobalVersion({\n id: entity.id,\n global: entity.slug,\n req,\n versionData: entity.originalData as any,\n })\n break\n }\n }\n\n processed++\n if (processed % this.batchSize === 0 || processed === totalEntities) {\n this.adapter.payload.logger.info(\n `Migrated ${processed}/${totalEntities} entities (${Math.round((processed / totalEntities) * 100)}%)`,\n )\n }\n }\n }\n\n private resetSchema() {\n this.adapter.schema = {}\n this.adapter.tables = {}\n this.adapter.indexes = new Set()\n this.adapter.foreignKeys = new Set()\n this.adapter.relations = {}\n this.adapter.rawTables = {}\n this.adapter.rawRelations = {}\n this.adapter.tableNameMap = new Map()\n this.adapter.enums = {}\n }\n\n private async syncTransactionDrizzleInstance(req: PayloadRequest) {\n const tsx = (await getTransaction(this.adapter, req)) as any\n\n tsx._ = this.adapter.drizzle._\n tsx.schema = this.adapter.drizzle._\n tsx.session.schema = (this.adapter.drizzle as any).session.schema\n }\n\n cleanupTempFolder(): void {\n rmSync(this.tempFolderPath, { force: true, recursive: true })\n\n this.adapter.payload.logger.info(`Cleaned up temp folder at ${this.tempFolderPath}`)\n }\n\n async collectAndSaveEntitiesToBatches(\n req: PayloadRequest,\n options?: {\n batchSize?: number\n },\n ): Promise<void> {\n const batchSize = options?.batchSize ?? this.batchSize\n\n this.cleanupTempFolder()\n this.ensureTempFolder()\n\n this.adapter.blocksAsJSON = false\n this.resetSchema()\n await this.adapter.init()\n await this.adapter.connect()\n\n // Count total entities to migrate\n let totalExpected = 0\n for (const collection of this.adapter.payload.config.collections.filter(entityHasBlocksField)) {\n const { totalDocs } = await this.adapter.count({ collection: collection.slug })\n totalExpected += totalDocs\n\n if (collection.versions) {\n const { totalDocs: totalVersions } = await this.adapter.countVersions({\n collection: collection.slug,\n })\n totalExpected += totalVersions\n }\n }\n\n for (const globalConfig of this.adapter.payload.config.globals.filter(entityHasBlocksField)) {\n totalExpected += 1 // Global itself\n\n if (globalConfig.versions) {\n const { totalDocs: totalGlobalVersions } = await this.adapter.countGlobalVersions({\n global: globalConfig.slug,\n })\n totalExpected += totalGlobalVersions\n }\n }\n\n this.adapter.payload.logger.info(\n `Found ${totalExpected} total entities to collect and save to batches`,\n )\n\n let batchIndex = 0\n let currentBatch: BlocksToJsonEntityToMigrate[] = []\n let totalCollected = 0\n\n const flushBatch = () => {\n if (currentBatch.length > 0) {\n writeEntitiesToTempFile(currentBatch, this.tempFolderPath, batchIndex)\n const percentage =\n totalExpected > 0 ? Math.round((totalCollected / totalExpected) * 100) : 0\n this.adapter.payload.logger.info(\n `Saved batch ${batchIndex} with ${currentBatch.length} entities (${totalCollected}/${totalExpected} - ${percentage}%)`,\n )\n batchIndex++\n currentBatch = []\n }\n }\n\n const addEntity = (entity: BlocksToJsonEntityToMigrate) => {\n currentBatch.push(entity)\n totalCollected++\n if (currentBatch.length >= batchSize) {\n flushBatch()\n }\n }\n\n for (const collection of this.adapter.payload.config.collections.filter(entityHasBlocksField)) {\n let page = 1\n let hasMore = true\n\n while (hasMore) {\n const { docs, hasNextPage } = await this.adapter.find({\n collection: collection.slug,\n limit: batchSize,\n page,\n })\n\n for (const doc of docs) {\n const entity: BlocksToJsonEntityToMigrate = {\n id: doc.id,\n slug: collection.slug,\n type: 'collection',\n blocks: collectBlocksToMigrate({\n config: this.adapter.payload.config,\n data: doc,\n fields: collection.flattenedFields,\n parentAccessor: [],\n parentIsLocalized: false,\n }),\n originalData: doc,\n }\n\n addEntity(entity)\n }\n\n this.adapter.payload.logger.info(\n `Collected ${docs.length} entries from ${collection.slug} (page ${page})`,\n )\n\n hasMore = hasNextPage\n page++\n }\n\n if (collection.versions) {\n let versionPage = 1\n let hasMoreVersions = true\n\n while (hasMoreVersions) {\n const { docs: versionDocs, hasNextPage: hasNextVersionPage } =\n await this.adapter.findVersions({\n collection: collection.slug,\n limit: batchSize,\n page: versionPage,\n })\n\n for (const versionDoc of versionDocs) {\n const entity: BlocksToJsonEntityToMigrate = {\n id: versionDoc.id,\n slug: collection.slug,\n type: 'collectionVersion',\n blocks: collectBlocksToMigrate({\n config: this.adapter.payload.config,\n data: versionDoc,\n fields: buildVersionCollectionFields(this.adapter.payload.config, collection, true),\n parentAccessor: [],\n parentIsLocalized: false,\n }),\n originalData: versionDoc,\n }\n\n addEntity(entity)\n }\n\n this.adapter.payload.logger.info(\n `Collected ${versionDocs.length} versions from ${collection.slug} (page ${versionPage})`,\n )\n\n hasMoreVersions = hasNextVersionPage\n versionPage++\n }\n }\n }\n\n for (const globalConfig of this.adapter.payload.config.globals.filter(entityHasBlocksField)) {\n const globalDoc = await this.adapter.findGlobal({ slug: globalConfig.slug })\n\n const entity: BlocksToJsonEntityToMigrate = {\n slug: globalConfig.slug,\n type: 'global',\n blocks: collectBlocksToMigrate({\n config: this.adapter.payload.config,\n data: globalDoc,\n fields: globalConfig.flattenedFields,\n parentAccessor: [],\n parentIsLocalized: false,\n }),\n originalData: globalDoc,\n }\n\n addEntity(entity)\n this.adapter.payload.logger.info(`Collected global ${globalConfig.slug}`)\n\n if (globalConfig.versions) {\n let globalVersionPage = 1\n let hasMoreGlobalVersions = true\n\n while (hasMoreGlobalVersions) {\n const { docs: globalVersionDocs, hasNextPage: hasNextGlobalVersionPage } =\n await this.adapter.findGlobalVersions({\n global: globalConfig.slug,\n limit: batchSize,\n page: globalVersionPage,\n })\n\n for (const globalVersionDoc of globalVersionDocs) {\n const entity: BlocksToJsonEntityToMigrate = {\n id: globalVersionDoc.id,\n slug: globalConfig.slug,\n type: 'globalVersion',\n blocks: collectBlocksToMigrate({\n config: this.adapter.payload.config,\n data: globalVersionDoc,\n fields: buildVersionGlobalFields(this.adapter.payload.config, globalConfig, true),\n parentAccessor: [],\n parentIsLocalized: false,\n }),\n originalData: globalVersionDoc,\n }\n\n addEntity(entity)\n }\n\n this.adapter.payload.logger.info(\n `Collected ${globalVersionDocs.length} versions from global ${globalConfig.slug} (page ${globalVersionPage})`,\n )\n\n hasMoreGlobalVersions = hasNextGlobalVersionPage\n globalVersionPage++\n }\n }\n }\n\n flushBatch()\n\n this.adapter.payload.logger.info(\n `Collected total of ${totalCollected} entities across ${batchIndex} batches`,\n )\n }\n\n async getMigrationStatements(): Promise<{\n statements: string\n writeDrizzleSnapshot(filePath: string): void\n }> {\n const { generateDrizzleJson, generateMigration } = this.adapter.requireDrizzleKit()\n\n const drizzleJsonBefore = await generateDrizzleJson(this.adapter.schema)\n this.adapter.blocksAsJSON = true\n this.resetSchema()\n\n await this.adapter.init()\n const drizzleJsonAfter = await generateDrizzleJson(this.adapter.schema)\n this.adapter.blocksAsJSON = false\n this.resetSchema()\n await this.adapter.init()\n\n const statements = await acceptDrizzlePrompts(\n () => generateMigration(drizzleJsonBefore, drizzleJsonAfter),\n {\n silenceLogs: true,\n },\n )\n\n const sqlExecute = `await db.${this.executeMethod}(` + 'sql`'\n\n return {\n statements: this.sanitizeStatements({\n sqlExecute,\n statements,\n }),\n writeDrizzleSnapshot(filePath) {\n writeFileSync(`${filePath}.json`, JSON.stringify(drizzleJsonAfter, null, 2))\n },\n }\n }\n\n async migrateEntitiesFromTempFolder(\n req: PayloadRequest,\n options?: {\n clearBatches?: boolean\n },\n ): Promise<void> {\n const clearBatches = options?.clearBatches ?? true\n\n let totalEntities = 0\n let hasEntities = false\n\n for (const entities of this.fetchEntitiesFromJsonBatches()) {\n hasEntities = true\n totalEntities += entities.length\n\n this.adapter.payload.logger.info(\n `Migrating batch with ${entities.length} entities (total: ${totalEntities})`,\n )\n\n await this.migrateEntities(entities, req)\n }\n\n if (!hasEntities) {\n this.adapter.payload.logger.warn('No entities found in temp folder to migrate')\n return\n }\n\n this.adapter.payload.logger.info(\n `Completed migration of ${totalEntities} entities from temp folder`,\n )\n\n if (clearBatches) {\n this.cleanupTempFolder()\n } else {\n this.adapter.payload.logger.info(\n `Temp folder preserved at ${this.tempFolderPath} (clearBatches: false)`,\n )\n }\n }\n\n setTempFolder(tempFolderPath: string): void {\n this.tempFolderPath = tempFolderPath\n }\n\n async updatePayloadConfigFile(): Promise<void> {\n let configPath: string\n\n try {\n configPath = findConfig()\n } catch {\n this.adapter.payload.logger.info(\n 'updatePayloadConfigFile failed - could not find the payload config. Please set the blocksAsJSON DB adapter property manually to \"true\"',\n )\n return\n }\n\n const configFile = readFileSync(configPath, 'utf-8')\n\n const ts = await dynamicImport<typeof tsTypes>('typescript')\n\n const source = ts.createSourceFile(configPath, configFile, ts.ScriptTarget.ESNext)\n\n let hadChanges = false\n\n const result = ts.transform(source, [\n (ctx) => (sourceFile) => {\n const factory = ctx.factory\n\n const visit: tsTypes.Visitor = (node) => {\n if (\n ts.isPropertyAssignment(node) &&\n ts.isIdentifier(node.name) &&\n node.name.text === 'db' &&\n ts.isCallExpression(node.initializer) &&\n node.initializer.arguments.length > 0 &&\n ts.isObjectLiteralExpression(node.initializer.arguments[0])\n ) {\n const call = node.initializer\n const obj = node.initializer.arguments[0]\n\n const filteredProps = obj.properties.filter((prop) => {\n if (!ts.isPropertyAssignment(prop)) {\n return true\n }\n\n return !(ts.isIdentifier(prop.name) && prop.name.text === 'blocksAsJSON')\n })\n\n const newProperty = factory.createPropertyAssignment(\n 'blocksAsJSON',\n factory.createTrue(),\n )\n hadChanges = true\n const newObject = factory.updateObjectLiteralExpression(obj, [\n ...filteredProps,\n newProperty,\n ])\n\n const newCall = factory.updateCallExpression(\n call,\n call.expression,\n call.typeArguments,\n [newObject],\n )\n\n return factory.updatePropertyAssignment(node, node.name, newCall)\n }\n\n return ts.visitEachChild(node, visit, ctx)\n }\n\n return ts.visitNode(sourceFile, visit) as tsTypes.SourceFile\n },\n ])\n\n if (!hadChanges) {\n this.adapter.payload.logger.info(\n 'No changes made to payload config. Set blocksAsJSON to true manually.',\n )\n return\n }\n\n const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed })\n writeFileSync(configPath, printer.printFile(result.transformed[0]), 'utf-8')\n await formatGeneratedFile({ filePath: configPath, logger: this.adapter.payload.logger })\n\n this.adapter.payload.logger.info(`Updated ${configPath} with blocksAsJSON: true`)\n }\n}\n\nexport const createBlocksToJsonMigrator = ({\n adapter,\n executeMethod,\n sanitizeStatements,\n}: {\n adapter: DrizzleAdapter\n executeMethod: string\n sanitizeStatements: (args: { sqlExecute: string; statements: string[] }) => string\n}): BlocksToJsonMigrator => {\n return new BlocksToJsonMigratorImpl(adapter, sanitizeStatements, executeMethod)\n}\n\nexport const getBlocksToJsonMigrator = (payload: Payload): BlocksToJsonMigrator => {\n const migrator = (payload.db as DrizzleAdapter).blocksToJsonMigrator\n\n if (!migrator) {\n throw new APIError(`blocksToJsonMigrator is not defined for ${payload.db.packageName}`)\n }\n\n return migrator\n}\n\nexport const buildDynamicPredefinedBlocksToJsonMigration = ({\n packageName,\n}: {\n packageName: string\n}): DynamicMigrationTemplate => {\n return async ({ filePath, payload }) => {\n const migrator = getBlocksToJsonMigrator(payload)\n\n const migrationStatements = await migrator.getMigrationStatements()\n\n migrationStatements.writeDrizzleSnapshot(filePath)\n\n await migrator.updatePayloadConfigFile()\n const upSQL = `\nconst migrator = getBlocksToJsonMigrator(payload)\nmigrator.setTempFolder(TEMP_FOLDER)\nawait migrator.collectAndSaveEntitiesToBatches(req, { batchSize: BATCH_SIZE })\n\n${migrationStatements.statements}\npayload.logger.info(\"Executed blocks to JSON migration statements.\")\n\nawait migrator.migrateEntitiesFromTempFolder(req, { clearBatches: true })\n `\n\n return {\n imports: `\nimport { getBlocksToJsonMigrator } from '${packageName}/migration-utils'\nimport { fileURLToPath } from 'url'\nimport path from 'path'\n\nconst filename = fileURLToPath(import.meta.url)\nconst dirname = path.dirname(filename)\n\n// Configure migration options (optional)\nconst BATCH_SIZE = 100 // Number of entities to process per batch\nconst TEMP_FOLDER = path.resolve(dirname, '${TEMP_FOLDER_NAME}') // Folder path to store migration batch\n`,\n upSQL,\n }\n }\n}\n"],"names":["existsSync","mkdirSync","readdirSync","readFileSync","rmSync","writeFileSync","path","APIError","buildVersionCollectionFields","buildVersionGlobalFields","dynamicImport","findConfig","fieldShouldBeLocalized","formatGeneratedFile","getTransaction","DEFAULT_BATCH_SIZE","TEMP_FOLDER_NAME","writeEntitiesToTempFile","entities","tempFolderPath","batchIndex","filePath","join","JSON","stringify","acceptDrizzlePrompts","callPrompt","silenceLogs","write","process","stdout","promise","interval","setInterval","stdin","emit","name","ctrl","res","clearInterval","entityHasBlocksField","entity","field","flattenedFields","type","collectBlocksToMigrate","config","data","fields","parentAccessor","parentIsLocalized","result","arrayData","Array","isArray","localization","push","localeCodes","map","code","localized","index","row","entries","fieldAccessor","BlocksToJsonMigratorImpl","batchSize","adapter","sanitizeStatements","executeMethod","resolve","migrationDir","ensureTempFolder","recursive","fetchEntitiesFromJsonBatches","files","filter","file","startsWith","endsWith","sort","a","b","aNum","parseInt","match","bNum","fileContent","batchEntities","parse","migrateEntities","req","blocksAsJSON","resetSchema","init","connect","syncTransactionDrizzleInstance","totalEntities","length","processed","updateOne","collection","slug","originalData","joins","where","id","equals","updateVersion","versionData","updateGlobal","updateGlobalVersion","global","payload","logger","info","Math","round","schema","tables","indexes","Set","foreignKeys","relations","rawTables","rawRelations","tableNameMap","Map","enums","tsx","_","drizzle","session","cleanupTempFolder","force","collectAndSaveEntitiesToBatches","options","totalExpected","collections","totalDocs","count","versions","totalVersions","countVersions","globalConfig","globals","totalGlobalVersions","countGlobalVersions","currentBatch","totalCollected","flushBatch","percentage","addEntity","page","hasMore","docs","hasNextPage","find","limit","doc","blocks","versionPage","hasMoreVersions","versionDocs","hasNextVersionPage","findVersions","versionDoc","globalDoc","findGlobal","globalVersionPage","hasMoreGlobalVersions","globalVersionDocs","hasNextGlobalVersionPage","findGlobalVersions","globalVersionDoc","getMigrationStatements","generateDrizzleJson","generateMigration","requireDrizzleKit","drizzleJsonBefore","drizzleJsonAfter","statements","sqlExecute","writeDrizzleSnapshot","migrateEntitiesFromTempFolder","clearBatches","hasEntities","warn","setTempFolder","updatePayloadConfigFile","configPath","configFile","ts","source","createSourceFile","ScriptTarget","ESNext","hadChanges","transform","ctx","sourceFile","factory","visit","node","isPropertyAssignment","isIdentifier","text","isCallExpression","initializer","arguments","isObjectLiteralExpression","call","obj","filteredProps","properties","prop","newProperty","createPropertyAssignment","createTrue","newObject","updateObjectLiteralExpression","newCall","updateCallExpression","expression","typeArguments","updatePropertyAssignment","visitEachChild","visitNode","printer","createPrinter","newLine","NewLineKind","LineFeed","printFile","transformed","createBlocksToJsonMigrator","getBlocksToJsonMigrator","migrator","db","blocksToJsonMigrator","packageName","buildDynamicPredefinedBlocksToJsonMigration","migrationStatements","upSQL","imports"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"createSchemaGenerator.d.ts","sourceRoot":"","sources":["../../src/utilities/createSchemaGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAM7C,OAAO,KAAK,EAAE,qBAAqB,EAAkB,MAAM,aAAa,CAAA;AAkCxE,eAAO,MAAM,qBAAqB,4GAO/B;IACD,qBAAqB,EAAE,qBAAqB,CAAA;IAC5C,iBAAiB,EAAE,MAAM,CAAA;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;CACpB,KAAG,cAmTH,CAAA"}
1
+ {"version":3,"file":"createSchemaGenerator.d.ts","sourceRoot":"","sources":["../../src/utilities/createSchemaGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAM7C,OAAO,KAAK,EAAE,qBAAqB,EAAkB,MAAM,aAAa,CAAA;AAoCxE,eAAO,MAAM,qBAAqB,4GAO/B;IACD,qBAAqB,EAAE,qBAAqB,CAAA;IAC5C,iBAAiB,EAAE,MAAM,CAAA;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;CACpB,KAAG,cA4SH,CAAA"}
@@ -1,6 +1,7 @@
1
1
  import { existsSync } from 'fs';
2
2
  import { writeFile } from 'fs/promises';
3
3
  import path from 'path';
4
+ import { formatGeneratedFile } from './formatGeneratedFile.js';
4
5
  /**
5
6
  * @example
6
7
  * console.log(sanitizeObjectKey("oneTwo")); // oneTwo
@@ -215,7 +216,7 @@ declare module '${this.packageName}' {
215
216
  */
216
217
  `;
217
218
  const importTypes = `import type {} from '${this.packageName}'`;
218
- let code = [
219
+ const code = [
219
220
  warning,
220
221
  importTypes,
221
222
  ...importDeclarationsSanitized,
@@ -235,19 +236,13 @@ declare module '${this.packageName}' {
235
236
  outputFile = path.resolve(cwd, 'payload-generated-schema.ts');
236
237
  }
237
238
  }
239
+ await writeFile(outputFile, code, 'utf-8');
238
240
  if (prettify) {
239
- try {
240
- const prettier = await eval('import("prettier")');
241
- const configPath = await prettier.resolveConfigFile();
242
- const config = configPath ? await prettier.resolveConfig(configPath) : {};
243
- code = await prettier.format(code, {
244
- ...config,
245
- parser: 'typescript'
246
- });
247
- } catch {
248
- /* empty */ }
241
+ await formatGeneratedFile({
242
+ filePath: outputFile,
243
+ logger: this.payload.logger
244
+ });
249
245
  }
250
- await writeFile(outputFile, code, 'utf-8');
251
246
  if (log) {
252
247
  this.payload.logger.info(`Written ${outputFile}`);
253
248
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/createSchemaGenerator.ts"],"sourcesContent":["import type { GenerateSchema } from 'payload'\n\nimport { existsSync } from 'fs'\nimport { writeFile } from 'fs/promises'\nimport path from 'path'\n\nimport type { ColumnToCodeConverter, DrizzleAdapter } from '../types.js'\n\n/**\n * @example\n * console.log(sanitizeObjectKey(\"oneTwo\")); // oneTwo\n * console.log(sanitizeObjectKey(\"one-two\")); // 'one-two'\n * console.log(sanitizeObjectKey(\"_one$Two3\")); // _one$Two3\n * console.log(sanitizeObjectKey(\"3invalid\")); // '3invalid'\n */\nconst sanitizeObjectKey = (key: string) => {\n // Regular expression for a valid identifier\n const identifierRegex = /^[a-z_$][\\w$]*$/i\n if (identifierRegex.test(key)) {\n return key\n }\n\n return `'${key}'`\n}\n\n/**\n * @example\n * (columns default-valuesID) -> columns['default-valuesID']\n * (columns defaultValues) -> columns.defaultValues\n */\nconst accessProperty = (objName: string, key: string) => {\n const sanitized = sanitizeObjectKey(key)\n\n if (sanitized.startsWith(\"'\")) {\n return `${objName}[${sanitized}]`\n }\n\n return `${objName}.${key}`\n}\n\nexport const createSchemaGenerator = ({\n columnToCodeConverter,\n corePackageSuffix,\n defaultOutputFile,\n enumImport,\n schemaImport,\n tableImport,\n}: {\n columnToCodeConverter: ColumnToCodeConverter\n corePackageSuffix: string\n defaultOutputFile?: string\n enumImport?: string\n schemaImport?: string\n tableImport: string\n}): GenerateSchema => {\n return async function generateSchema(\n this: DrizzleAdapter,\n { log = true, outputFile = defaultOutputFile, prettify = true } = {},\n ) {\n const importDeclarations: Record<string, Set<string>> = {}\n\n const tableDeclarations: string[] = []\n const enumDeclarations: string[] = []\n const relationsDeclarations: string[] = []\n\n const addImport = (from: string, name: string) => {\n if (!importDeclarations[from]) {\n importDeclarations[from] = new Set()\n }\n\n importDeclarations[from].add(name)\n }\n\n const corePackage = `${this.packageName}/drizzle/${corePackageSuffix}`\n\n let schemaDeclaration: null | string = null\n\n if (this.schemaName) {\n addImport(corePackage, schemaImport)\n schemaDeclaration = `export const db_schema = ${schemaImport}('${this.schemaName}')`\n }\n\n const enumFn = this.schemaName ? `db_schema.enum` : enumImport\n\n const enumsList: string[] = []\n const addEnum = (name: string, options: string[]) => {\n if (enumsList.some((each) => each === name)) {\n return\n }\n enumsList.push(name)\n enumDeclarations.push(\n `export const ${name} = ${enumFn}('${name}', [${options.map((option) => `'${option}'`).join(', ')}])`,\n )\n }\n\n if (this.payload.config.localization && enumImport) {\n addEnum('enum__locales', this.payload.config.localization.localeCodes)\n }\n\n const tableFn = this.schemaName ? `db_schema.table` : tableImport\n\n if (!this.schemaName) {\n addImport(corePackage, tableImport)\n }\n\n addImport(corePackage, 'index')\n addImport(corePackage, 'uniqueIndex')\n addImport(corePackage, 'foreignKey')\n\n addImport(`${this.packageName}/drizzle`, 'sql')\n addImport(`${this.packageName}/drizzle`, 'relations')\n\n const fkGraph: Record<string, Set<string>> = {}\n\n for (const tableName in this.rawTables) {\n fkGraph[tableName] = new Set()\n const table = this.rawTables[tableName]\n\n for (const colKey in table.columns) {\n const col = table.columns[colKey]\n\n if (col.reference && col.reference.table !== tableName) {\n fkGraph[tableName].add(col.reference.table)\n }\n }\n }\n\n const canReach = (from: string, target: string, visited: Set<string>): boolean => {\n if (from === target) {\n return true\n }\n\n if (visited.has(from)) {\n return false\n }\n\n visited.add(from)\n\n for (const neighbor of fkGraph[from] ?? []) {\n if (canReach(neighbor, target, visited)) {\n return true\n }\n }\n\n return false\n }\n\n const circularEdges = new Set<string>()\n\n for (const tableA in fkGraph) {\n for (const tableB of fkGraph[tableA]) {\n if (canReach(tableB, tableA, new Set())) {\n circularEdges.add(`${tableA}:${tableB}`)\n }\n }\n }\n\n for (const tableName in this.rawTables) {\n const table = this.rawTables[tableName]\n\n const extrasDeclarations: string[] = []\n\n if (table.indexes) {\n for (const key in table.indexes) {\n const index = table.indexes[key]\n let indexDeclaration = `${index.unique ? 'uniqueIndex' : 'index'}('${index.name}')`\n indexDeclaration += `.on(${typeof index.on === 'string' ? `${accessProperty('columns', index.on)}` : `${index.on.map((on) => `${accessProperty('columns', on)}`).join(', ')}`}),`\n extrasDeclarations.push(indexDeclaration)\n }\n }\n\n if (table.foreignKeys) {\n for (const key in table.foreignKeys) {\n const foreignKey = table.foreignKeys[key]\n\n let foreignKeyDeclaration = `foreignKey({\n columns: [${foreignKey.columns.map((col) => `columns['${col}']`).join(', ')}],\n foreignColumns: [${foreignKey.foreignColumns.map((col) => `${accessProperty(col.table, col.name)}`).join(', ')}],\n name: '${foreignKey.name}'\n })`\n\n if (foreignKey.onDelete) {\n foreignKeyDeclaration += `.onDelete('${foreignKey.onDelete}')`\n }\n if (foreignKey.onUpdate) {\n foreignKeyDeclaration += `.onUpdate('${foreignKey.onDelete}')`\n }\n\n foreignKeyDeclaration += ','\n\n extrasDeclarations.push(foreignKeyDeclaration)\n }\n }\n\n const tableCode = `\nexport const ${tableName} = ${tableFn}('${tableName}', {\n${Object.entries(table.columns)\n .map(\n ([key, column]) =>\n ` ${sanitizeObjectKey(key)}: ${columnToCodeConverter({\n adapter: this,\n addEnum,\n addImport,\n circularEdges,\n column,\n locales: this.payload.config.localization\n ? this.payload.config.localization.localeCodes\n : undefined,\n tableKey: tableName,\n })},`,\n )\n .join('\\n')}\n}${\n extrasDeclarations.length\n ? `, (columns) => [\n ${extrasDeclarations.join(' ')}\n]`\n : ''\n }\n)\n`\n\n tableDeclarations.push(tableCode)\n }\n\n for (const tableName in this.rawRelations) {\n const relations = this.rawRelations[tableName]\n const properties: string[] = []\n\n for (const key in relations) {\n const relation = relations[key]\n let declaration: string\n\n if (relation.type === 'one') {\n declaration = `${sanitizeObjectKey(key)}: one(${relation.to}, {\n ${relation.fields.some((field) => field.table !== tableName) ? '// @ts-expect-error Drizzle TypeScript bug for ONE relationships with a field in different table' : ''}\n fields: [${relation.fields.map((field) => `${accessProperty(field.table, field.name)}`).join(', ')}],\n references: [${relation.references.map((col) => `${accessProperty(relation.to, col)}`).join(', ')}],\n ${relation.relationName ? `relationName: '${relation.relationName}',` : ''}\n }),`\n } else {\n declaration = `${sanitizeObjectKey(key)}: many(${relation.to}, {\n ${relation.relationName ? `relationName: '${relation.relationName}',` : ''}\n }),`\n }\n\n properties.push(declaration)\n }\n\n // beautify / lintify relations callback output, when no many for example, don't add it\n const args = []\n\n if (Object.values(relations).some((rel) => rel.type === 'one')) {\n args.push('one')\n }\n\n if (Object.values(relations).some((rel) => rel.type === 'many')) {\n args.push('many')\n }\n\n const arg = args.length ? `{ ${args.join(', ')} }` : ''\n\n const declaration = `export const relations_${tableName} = relations(${tableName}, (${arg}) => ({\n ${properties.join('\\n ')}\n }))`\n\n relationsDeclarations.push(declaration)\n }\n\n if (enumDeclarations.length && !this.schemaName) {\n addImport(corePackage, enumImport)\n }\n\n const importDeclarationsSanitized: string[] = []\n\n for (const moduleName in importDeclarations) {\n const moduleImports = importDeclarations[moduleName]\n\n importDeclarationsSanitized.push(\n `import { ${Array.from(moduleImports).join(', ')} } from '${moduleName}'`,\n )\n }\n\n const schemaType = `\ntype DatabaseSchema = {\n ${[\n this.schemaName ? 'db_schema' : null,\n ...enumsList,\n ...Object.keys(this.rawTables),\n ...Object.keys(this.rawRelations).map((table) => `relations_${table}`),\n ]\n .filter(Boolean)\n .map((name) => `${name}: typeof ${name}`)\n .join('\\n ')}\n}\n `\n\n const finalDeclaration = `\ndeclare module '${this.packageName}' {\n export interface GeneratedDatabaseSchema {\n schema: DatabaseSchema\n }\n}\n `\n\n const warning = `\n/* tslint:disable */\n/* eslint-disable */\n/**\n * This file was automatically generated by Payload.\n * DO NOT MODIFY IT BY HAND. Instead, modify your source Payload config,\n * and re-run \\`payload generate:db-schema\\` to regenerate this file.\n */\n`\n\n const importTypes = `import type {} from '${this.packageName}'`\n\n let code = [\n warning,\n importTypes,\n ...importDeclarationsSanitized,\n schemaDeclaration,\n ...enumDeclarations,\n ...tableDeclarations,\n ...relationsDeclarations,\n schemaType,\n finalDeclaration,\n ]\n .filter(Boolean)\n .join('\\n')\n\n if (!outputFile) {\n const cwd = process.cwd()\n const srcDir = path.resolve(cwd, 'src')\n\n if (existsSync(srcDir)) {\n outputFile = path.resolve(srcDir, 'payload-generated-schema.ts')\n } else {\n outputFile = path.resolve(cwd, 'payload-generated-schema.ts')\n }\n }\n\n if (prettify) {\n try {\n const prettier = await eval('import(\"prettier\")')\n const configPath = await prettier.resolveConfigFile()\n const config = configPath ? await prettier.resolveConfig(configPath) : {}\n code = await prettier.format(code, { ...config, parser: 'typescript' })\n } catch {\n /* empty */\n }\n }\n\n await writeFile(outputFile, code, 'utf-8')\n\n if (log) {\n this.payload.logger.info(`Written ${outputFile}`)\n }\n\n return { outputFile }\n }\n}\n"],"names":["existsSync","writeFile","path","sanitizeObjectKey","key","identifierRegex","test","accessProperty","objName","sanitized","startsWith","createSchemaGenerator","columnToCodeConverter","corePackageSuffix","defaultOutputFile","enumImport","schemaImport","tableImport","generateSchema","log","outputFile","prettify","importDeclarations","tableDeclarations","enumDeclarations","relationsDeclarations","addImport","from","name","Set","add","corePackage","packageName","schemaDeclaration","schemaName","enumFn","enumsList","addEnum","options","some","each","push","map","option","join","payload","config","localization","localeCodes","tableFn","fkGraph","tableName","rawTables","table","colKey","columns","col","reference","canReach","target","visited","has","neighbor","circularEdges","tableA","tableB","extrasDeclarations","indexes","index","indexDeclaration","unique","on","foreignKeys","foreignKey","foreignKeyDeclaration","foreignColumns","onDelete","onUpdate","tableCode","Object","entries","column","adapter","locales","undefined","tableKey","length","rawRelations","relations","properties","relation","declaration","type","to","fields","field","references","relationName","args","values","rel","arg","importDeclarationsSanitized","moduleName","moduleImports","Array","schemaType","keys","filter","Boolean","finalDeclaration","warning","importTypes","code","cwd","process","srcDir","resolve","prettier","eval","configPath","resolveConfigFile","resolveConfig","format","parser","logger","info"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utilities/createSchemaGenerator.ts"],"sourcesContent":["import type { GenerateSchema } from 'payload'\n\nimport { existsSync } from 'fs'\nimport { writeFile } from 'fs/promises'\nimport path from 'path'\n\nimport type { ColumnToCodeConverter, DrizzleAdapter } from '../types.js'\n\nimport { formatGeneratedFile } from './formatGeneratedFile.js'\n\n/**\n * @example\n * console.log(sanitizeObjectKey(\"oneTwo\")); // oneTwo\n * console.log(sanitizeObjectKey(\"one-two\")); // 'one-two'\n * console.log(sanitizeObjectKey(\"_one$Two3\")); // _one$Two3\n * console.log(sanitizeObjectKey(\"3invalid\")); // '3invalid'\n */\nconst sanitizeObjectKey = (key: string) => {\n // Regular expression for a valid identifier\n const identifierRegex = /^[a-z_$][\\w$]*$/i\n if (identifierRegex.test(key)) {\n return key\n }\n\n return `'${key}'`\n}\n\n/**\n * @example\n * (columns default-valuesID) -> columns['default-valuesID']\n * (columns defaultValues) -> columns.defaultValues\n */\nconst accessProperty = (objName: string, key: string) => {\n const sanitized = sanitizeObjectKey(key)\n\n if (sanitized.startsWith(\"'\")) {\n return `${objName}[${sanitized}]`\n }\n\n return `${objName}.${key}`\n}\n\nexport const createSchemaGenerator = ({\n columnToCodeConverter,\n corePackageSuffix,\n defaultOutputFile,\n enumImport,\n schemaImport,\n tableImport,\n}: {\n columnToCodeConverter: ColumnToCodeConverter\n corePackageSuffix: string\n defaultOutputFile?: string\n enumImport?: string\n schemaImport?: string\n tableImport: string\n}): GenerateSchema => {\n return async function generateSchema(\n this: DrizzleAdapter,\n { log = true, outputFile = defaultOutputFile, prettify = true } = {},\n ) {\n const importDeclarations: Record<string, Set<string>> = {}\n\n const tableDeclarations: string[] = []\n const enumDeclarations: string[] = []\n const relationsDeclarations: string[] = []\n\n const addImport = (from: string, name: string) => {\n if (!importDeclarations[from]) {\n importDeclarations[from] = new Set()\n }\n\n importDeclarations[from].add(name)\n }\n\n const corePackage = `${this.packageName}/drizzle/${corePackageSuffix}`\n\n let schemaDeclaration: null | string = null\n\n if (this.schemaName) {\n addImport(corePackage, schemaImport)\n schemaDeclaration = `export const db_schema = ${schemaImport}('${this.schemaName}')`\n }\n\n const enumFn = this.schemaName ? `db_schema.enum` : enumImport\n\n const enumsList: string[] = []\n const addEnum = (name: string, options: string[]) => {\n if (enumsList.some((each) => each === name)) {\n return\n }\n enumsList.push(name)\n enumDeclarations.push(\n `export const ${name} = ${enumFn}('${name}', [${options.map((option) => `'${option}'`).join(', ')}])`,\n )\n }\n\n if (this.payload.config.localization && enumImport) {\n addEnum('enum__locales', this.payload.config.localization.localeCodes)\n }\n\n const tableFn = this.schemaName ? `db_schema.table` : tableImport\n\n if (!this.schemaName) {\n addImport(corePackage, tableImport)\n }\n\n addImport(corePackage, 'index')\n addImport(corePackage, 'uniqueIndex')\n addImport(corePackage, 'foreignKey')\n\n addImport(`${this.packageName}/drizzle`, 'sql')\n addImport(`${this.packageName}/drizzle`, 'relations')\n\n const fkGraph: Record<string, Set<string>> = {}\n\n for (const tableName in this.rawTables) {\n fkGraph[tableName] = new Set()\n const table = this.rawTables[tableName]\n\n for (const colKey in table.columns) {\n const col = table.columns[colKey]\n\n if (col.reference && col.reference.table !== tableName) {\n fkGraph[tableName].add(col.reference.table)\n }\n }\n }\n\n const canReach = (from: string, target: string, visited: Set<string>): boolean => {\n if (from === target) {\n return true\n }\n\n if (visited.has(from)) {\n return false\n }\n\n visited.add(from)\n\n for (const neighbor of fkGraph[from] ?? []) {\n if (canReach(neighbor, target, visited)) {\n return true\n }\n }\n\n return false\n }\n\n const circularEdges = new Set<string>()\n\n for (const tableA in fkGraph) {\n for (const tableB of fkGraph[tableA]) {\n if (canReach(tableB, tableA, new Set())) {\n circularEdges.add(`${tableA}:${tableB}`)\n }\n }\n }\n\n for (const tableName in this.rawTables) {\n const table = this.rawTables[tableName]\n\n const extrasDeclarations: string[] = []\n\n if (table.indexes) {\n for (const key in table.indexes) {\n const index = table.indexes[key]\n let indexDeclaration = `${index.unique ? 'uniqueIndex' : 'index'}('${index.name}')`\n indexDeclaration += `.on(${typeof index.on === 'string' ? `${accessProperty('columns', index.on)}` : `${index.on.map((on) => `${accessProperty('columns', on)}`).join(', ')}`}),`\n extrasDeclarations.push(indexDeclaration)\n }\n }\n\n if (table.foreignKeys) {\n for (const key in table.foreignKeys) {\n const foreignKey = table.foreignKeys[key]\n\n let foreignKeyDeclaration = `foreignKey({\n columns: [${foreignKey.columns.map((col) => `columns['${col}']`).join(', ')}],\n foreignColumns: [${foreignKey.foreignColumns.map((col) => `${accessProperty(col.table, col.name)}`).join(', ')}],\n name: '${foreignKey.name}'\n })`\n\n if (foreignKey.onDelete) {\n foreignKeyDeclaration += `.onDelete('${foreignKey.onDelete}')`\n }\n if (foreignKey.onUpdate) {\n foreignKeyDeclaration += `.onUpdate('${foreignKey.onDelete}')`\n }\n\n foreignKeyDeclaration += ','\n\n extrasDeclarations.push(foreignKeyDeclaration)\n }\n }\n\n const tableCode = `\nexport const ${tableName} = ${tableFn}('${tableName}', {\n${Object.entries(table.columns)\n .map(\n ([key, column]) =>\n ` ${sanitizeObjectKey(key)}: ${columnToCodeConverter({\n adapter: this,\n addEnum,\n addImport,\n circularEdges,\n column,\n locales: this.payload.config.localization\n ? this.payload.config.localization.localeCodes\n : undefined,\n tableKey: tableName,\n })},`,\n )\n .join('\\n')}\n}${\n extrasDeclarations.length\n ? `, (columns) => [\n ${extrasDeclarations.join(' ')}\n]`\n : ''\n }\n)\n`\n\n tableDeclarations.push(tableCode)\n }\n\n for (const tableName in this.rawRelations) {\n const relations = this.rawRelations[tableName]\n const properties: string[] = []\n\n for (const key in relations) {\n const relation = relations[key]\n let declaration: string\n\n if (relation.type === 'one') {\n declaration = `${sanitizeObjectKey(key)}: one(${relation.to}, {\n ${relation.fields.some((field) => field.table !== tableName) ? '// @ts-expect-error Drizzle TypeScript bug for ONE relationships with a field in different table' : ''}\n fields: [${relation.fields.map((field) => `${accessProperty(field.table, field.name)}`).join(', ')}],\n references: [${relation.references.map((col) => `${accessProperty(relation.to, col)}`).join(', ')}],\n ${relation.relationName ? `relationName: '${relation.relationName}',` : ''}\n }),`\n } else {\n declaration = `${sanitizeObjectKey(key)}: many(${relation.to}, {\n ${relation.relationName ? `relationName: '${relation.relationName}',` : ''}\n }),`\n }\n\n properties.push(declaration)\n }\n\n // beautify / lintify relations callback output, when no many for example, don't add it\n const args = []\n\n if (Object.values(relations).some((rel) => rel.type === 'one')) {\n args.push('one')\n }\n\n if (Object.values(relations).some((rel) => rel.type === 'many')) {\n args.push('many')\n }\n\n const arg = args.length ? `{ ${args.join(', ')} }` : ''\n\n const declaration = `export const relations_${tableName} = relations(${tableName}, (${arg}) => ({\n ${properties.join('\\n ')}\n }))`\n\n relationsDeclarations.push(declaration)\n }\n\n if (enumDeclarations.length && !this.schemaName) {\n addImport(corePackage, enumImport)\n }\n\n const importDeclarationsSanitized: string[] = []\n\n for (const moduleName in importDeclarations) {\n const moduleImports = importDeclarations[moduleName]\n\n importDeclarationsSanitized.push(\n `import { ${Array.from(moduleImports).join(', ')} } from '${moduleName}'`,\n )\n }\n\n const schemaType = `\ntype DatabaseSchema = {\n ${[\n this.schemaName ? 'db_schema' : null,\n ...enumsList,\n ...Object.keys(this.rawTables),\n ...Object.keys(this.rawRelations).map((table) => `relations_${table}`),\n ]\n .filter(Boolean)\n .map((name) => `${name}: typeof ${name}`)\n .join('\\n ')}\n}\n `\n\n const finalDeclaration = `\ndeclare module '${this.packageName}' {\n export interface GeneratedDatabaseSchema {\n schema: DatabaseSchema\n }\n}\n `\n\n const warning = `\n/* tslint:disable */\n/* eslint-disable */\n/**\n * This file was automatically generated by Payload.\n * DO NOT MODIFY IT BY HAND. Instead, modify your source Payload config,\n * and re-run \\`payload generate:db-schema\\` to regenerate this file.\n */\n`\n\n const importTypes = `import type {} from '${this.packageName}'`\n\n const code = [\n warning,\n importTypes,\n ...importDeclarationsSanitized,\n schemaDeclaration,\n ...enumDeclarations,\n ...tableDeclarations,\n ...relationsDeclarations,\n schemaType,\n finalDeclaration,\n ]\n .filter(Boolean)\n .join('\\n')\n\n if (!outputFile) {\n const cwd = process.cwd()\n const srcDir = path.resolve(cwd, 'src')\n\n if (existsSync(srcDir)) {\n outputFile = path.resolve(srcDir, 'payload-generated-schema.ts')\n } else {\n outputFile = path.resolve(cwd, 'payload-generated-schema.ts')\n }\n }\n\n await writeFile(outputFile, code, 'utf-8')\n\n if (prettify) {\n await formatGeneratedFile({ filePath: outputFile, logger: this.payload.logger })\n }\n\n if (log) {\n this.payload.logger.info(`Written ${outputFile}`)\n }\n\n return { outputFile }\n }\n}\n"],"names":["existsSync","writeFile","path","formatGeneratedFile","sanitizeObjectKey","key","identifierRegex","test","accessProperty","objName","sanitized","startsWith","createSchemaGenerator","columnToCodeConverter","corePackageSuffix","defaultOutputFile","enumImport","schemaImport","tableImport","generateSchema","log","outputFile","prettify","importDeclarations","tableDeclarations","enumDeclarations","relationsDeclarations","addImport","from","name","Set","add","corePackage","packageName","schemaDeclaration","schemaName","enumFn","enumsList","addEnum","options","some","each","push","map","option","join","payload","config","localization","localeCodes","tableFn","fkGraph","tableName","rawTables","table","colKey","columns","col","reference","canReach","target","visited","has","neighbor","circularEdges","tableA","tableB","extrasDeclarations","indexes","index","indexDeclaration","unique","on","foreignKeys","foreignKey","foreignKeyDeclaration","foreignColumns","onDelete","onUpdate","tableCode","Object","entries","column","adapter","locales","undefined","tableKey","length","rawRelations","relations","properties","relation","declaration","type","to","fields","field","references","relationName","args","values","rel","arg","importDeclarationsSanitized","moduleName","moduleImports","Array","schemaType","keys","filter","Boolean","finalDeclaration","warning","importTypes","code","cwd","process","srcDir","resolve","filePath","logger","info"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { extendDrizzleTable } from './extendDrizzleTable.js';
2
2
  export const executeSchemaHooks = async ({ type, adapter })=>{
3
3
  for (const hook of adapter[type]){
4
4
  const result = await hook({
5
- adapter: adapter,
5
+ adapter,
6
6
  extendTable: extendDrizzleTable,
7
7
  schema: {
8
8
  enums: adapter.enums,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/executeSchemaHooks.ts"],"sourcesContent":["import type { DrizzleAdapter } from '../types.js'\n\nimport { extendDrizzleTable } from './extendDrizzleTable.js'\n\ntype DatabaseSchema = {\n enums?: DrizzleAdapter['enums']\n relations: Record<string, any>\n tables: DrizzleAdapter['tables']\n}\n\ntype Adapter = {\n afterSchemaInit: DatabaseSchemaHook[]\n beforeSchemaInit: DatabaseSchemaHook[]\n} & DatabaseSchema\n\ntype DatabaseSchemaHookArgs = {\n adapter: Record<string, unknown>\n extendTable: typeof extendDrizzleTable\n schema: DatabaseSchema\n}\n\ntype DatabaseSchemaHook = (args: DatabaseSchemaHookArgs) => DatabaseSchema | Promise<DatabaseSchema>\n\ntype Args = {\n adapter: Adapter\n type: 'afterSchemaInit' | 'beforeSchemaInit'\n}\n\nexport const executeSchemaHooks = async ({ type, adapter }: Args): Promise<void> => {\n for (const hook of (adapter as unknown as Adapter)[type]) {\n const result = await hook({\n adapter: adapter as unknown as Adapter,\n extendTable: extendDrizzleTable,\n schema: {\n enums: adapter.enums,\n relations: adapter.relations,\n tables: adapter.tables,\n },\n })\n if (result.enums) {\n adapter.enums = result.enums\n }\n\n adapter.tables = result.tables\n adapter.relations = result.relations\n }\n}\n"],"names":["extendDrizzleTable","executeSchemaHooks","type","adapter","hook","result","extendTable","schema","enums","relations","tables"],"mappings":"AAEA,SAASA,kBAAkB,QAAQ,0BAAyB;AA0B5D,OAAO,MAAMC,qBAAqB,OAAO,EAAEC,IAAI,EAAEC,OAAO,EAAQ;IAC9D,KAAK,MAAMC,QAAQ,AAACD,OAA8B,CAACD,KAAK,CAAE;QACxD,MAAMG,SAAS,MAAMD,KAAK;YACxBD,SAASA;YACTG,aAAaN;YACbO,QAAQ;gBACNC,OAAOL,QAAQK,KAAK;gBACpBC,WAAWN,QAAQM,SAAS;gBAC5BC,QAAQP,QAAQO,MAAM;YACxB;QACF;QACA,IAAIL,OAAOG,KAAK,EAAE;YAChBL,QAAQK,KAAK,GAAGH,OAAOG,KAAK;QAC9B;QAEAL,QAAQO,MAAM,GAAGL,OAAOK,MAAM;QAC9BP,QAAQM,SAAS,GAAGJ,OAAOI,SAAS;IACtC;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/executeSchemaHooks.ts"],"sourcesContent":["import type { DrizzleAdapter } from '../types.js'\n\nimport { extendDrizzleTable } from './extendDrizzleTable.js'\n\ntype DatabaseSchema = {\n enums?: DrizzleAdapter['enums']\n relations: Record<string, any>\n tables: DrizzleAdapter['tables']\n}\n\ntype Adapter = {\n afterSchemaInit: DatabaseSchemaHook[]\n beforeSchemaInit: DatabaseSchemaHook[]\n} & DatabaseSchema\n\ntype DatabaseSchemaHookArgs = {\n adapter: Record<string, unknown>\n extendTable: typeof extendDrizzleTable\n schema: DatabaseSchema\n}\n\ntype DatabaseSchemaHook = (args: DatabaseSchemaHookArgs) => DatabaseSchema | Promise<DatabaseSchema>\n\ntype Args = {\n adapter: Adapter\n type: 'afterSchemaInit' | 'beforeSchemaInit'\n}\n\nexport const executeSchemaHooks = async ({ type, adapter }: Args): Promise<void> => {\n for (const hook of adapter[type]) {\n const result = await hook({\n adapter,\n extendTable: extendDrizzleTable,\n schema: {\n enums: adapter.enums,\n relations: adapter.relations,\n tables: adapter.tables,\n },\n })\n if (result.enums) {\n adapter.enums = result.enums\n }\n\n adapter.tables = result.tables\n adapter.relations = result.relations\n }\n}\n"],"names":["extendDrizzleTable","executeSchemaHooks","type","adapter","hook","result","extendTable","schema","enums","relations","tables"],"mappings":"AAEA,SAASA,kBAAkB,QAAQ,0BAAyB;AA0B5D,OAAO,MAAMC,qBAAqB,OAAO,EAAEC,IAAI,EAAEC,OAAO,EAAQ;IAC9D,KAAK,MAAMC,QAAQD,OAAO,CAACD,KAAK,CAAE;QAChC,MAAMG,SAAS,MAAMD,KAAK;YACxBD;YACAG,aAAaN;YACbO,QAAQ;gBACNC,OAAOL,QAAQK,KAAK;gBACpBC,WAAWN,QAAQM,SAAS;gBAC5BC,QAAQP,QAAQO,MAAM;YACxB;QACF;QACA,IAAIL,OAAOG,KAAK,EAAE;YAChBL,QAAQK,KAAK,GAAGH,OAAOG,KAAK;QAC9B;QAEAL,QAAQO,MAAM,GAAGL,OAAOK,MAAM;QAC9BP,QAAQM,SAAS,GAAGJ,OAAOI,SAAS;IACtC;AACF,EAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Payload } from 'payload';
2
+ /**
3
+ * Formats a generated file in place with the project's formatter and formatter config: oxfmt if
4
+ * it's installed, otherwise Prettier. Logs an error if neither can format the file.
5
+ */
6
+ export declare function formatGeneratedFile({ filePath, logger, }: {
7
+ filePath: string;
8
+ logger: Payload['logger'];
9
+ }): Promise<void>;
10
+ //# sourceMappingURL=formatGeneratedFile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatGeneratedFile.d.ts","sourceRoot":"","sources":["../../src/utilities/formatGeneratedFile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAoBtC;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,EACxC,QAAQ,EACR,MAAM,GACP,EAAE;IACD,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;CAC1B,GAAG,OAAO,CAAC,IAAI,CAAC,CAwChB"}
@@ -0,0 +1,58 @@
1
+ import { execFile } from 'child_process';
2
+ import { readFile, writeFile } from 'fs/promises';
3
+ import { createRequire } from 'module';
4
+ import path from 'path';
5
+ import { dynamicImport } from 'payload';
6
+ import { promisify } from 'util';
7
+ const execFileAsync = promisify(execFile);
8
+ /**
9
+ * Formats a generated file in place with the project's formatter and formatter config: oxfmt if
10
+ * it's installed, otherwise Prettier. Logs an error if neither can format the file.
11
+ */ export async function formatGeneratedFile({ filePath, logger }) {
12
+ let formatError;
13
+ // oxfmt's `format()` API doesn't discover config files, so run the project's oxfmt CLI instead
14
+ let oxfmtBinPath;
15
+ try {
16
+ const projectRequire = createRequire(path.join(process.cwd(), 'package.json'));
17
+ const packageJSONPath = projectRequire.resolve('oxfmt/package.json');
18
+ const { bin } = projectRequire(packageJSONPath);
19
+ oxfmtBinPath = path.join(path.dirname(packageJSONPath), bin.oxfmt);
20
+ } catch {
21
+ // oxfmt isn't installed
22
+ }
23
+ if (oxfmtBinPath) {
24
+ try {
25
+ await execFileAsync(process.execPath, // Loading `oxfmt.config.ts` relies on Node's type stripping, which `NODE_OPTIONS` may disable
26
+ [
27
+ '--experimental-strip-types',
28
+ oxfmtBinPath,
29
+ '--no-error-on-unmatched-pattern',
30
+ filePath
31
+ ], {
32
+ cwd: process.cwd()
33
+ });
34
+ return;
35
+ } catch (err) {
36
+ formatError = err;
37
+ }
38
+ }
39
+ try {
40
+ const prettier = await dynamicImport('prettier');
41
+ const configPath = await prettier.resolveConfigFile();
42
+ const config = configPath ? await prettier.resolveConfig(configPath) : {};
43
+ const code = await readFile(filePath, 'utf-8');
44
+ await writeFile(filePath, await prettier.format(code, {
45
+ ...config,
46
+ parser: 'typescript'
47
+ }));
48
+ return;
49
+ } catch (err) {
50
+ formatError ??= err;
51
+ }
52
+ logger.error({
53
+ err: formatError,
54
+ msg: `Could not format ${filePath} with oxfmt or Prettier`
55
+ });
56
+ }
57
+
58
+ //# sourceMappingURL=formatGeneratedFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/formatGeneratedFile.ts"],"sourcesContent":["import type { Payload } from 'payload'\n\nimport { execFile } from 'child_process'\nimport { readFile, writeFile } from 'fs/promises'\nimport { createRequire } from 'module'\nimport path from 'path'\nimport { dynamicImport } from 'payload'\nimport { promisify } from 'util'\n\n/**\n * The subset of Prettier's API used here. Prettier isn't a dependency, so its types aren't available.\n */\ntype Prettier = {\n format: (source: string, options: Record<string, unknown>) => Promise<string>\n resolveConfig: (filePath: string) => Promise<null | Record<string, unknown>>\n resolveConfigFile: () => Promise<null | string>\n}\n\nconst execFileAsync = promisify(execFile)\n\n/**\n * Formats a generated file in place with the project's formatter and formatter config: oxfmt if\n * it's installed, otherwise Prettier. Logs an error if neither can format the file.\n */\nexport async function formatGeneratedFile({\n filePath,\n logger,\n}: {\n filePath: string\n logger: Payload['logger']\n}): Promise<void> {\n let formatError: unknown\n\n // oxfmt's `format()` API doesn't discover config files, so run the project's oxfmt CLI instead\n let oxfmtBinPath: string | undefined\n try {\n const projectRequire = createRequire(path.join(process.cwd(), 'package.json'))\n const packageJSONPath = projectRequire.resolve('oxfmt/package.json')\n const { bin } = projectRequire(packageJSONPath) as { bin: { oxfmt: string } }\n oxfmtBinPath = path.join(path.dirname(packageJSONPath), bin.oxfmt)\n } catch {\n // oxfmt isn't installed\n }\n\n if (oxfmtBinPath) {\n try {\n await execFileAsync(\n process.execPath,\n // Loading `oxfmt.config.ts` relies on Node's type stripping, which `NODE_OPTIONS` may disable\n ['--experimental-strip-types', oxfmtBinPath, '--no-error-on-unmatched-pattern', filePath],\n { cwd: process.cwd() },\n )\n return\n } catch (err) {\n formatError = err\n }\n }\n\n try {\n const prettier = await dynamicImport<Prettier>('prettier')\n const configPath = await prettier.resolveConfigFile()\n const config = configPath ? await prettier.resolveConfig(configPath) : {}\n const code = await readFile(filePath, 'utf-8')\n await writeFile(filePath, await prettier.format(code, { ...config, parser: 'typescript' }))\n return\n } catch (err) {\n formatError ??= err\n }\n\n logger.error({ err: formatError, msg: `Could not format ${filePath} with oxfmt or Prettier` })\n}\n"],"names":["execFile","readFile","writeFile","createRequire","path","dynamicImport","promisify","execFileAsync","formatGeneratedFile","filePath","logger","formatError","oxfmtBinPath","projectRequire","join","process","cwd","packageJSONPath","resolve","bin","dirname","oxfmt","execPath","err","prettier","configPath","resolveConfigFile","config","resolveConfig","code","format","parser","error","msg"],"mappings":"AAEA,SAASA,QAAQ,QAAQ,gBAAe;AACxC,SAASC,QAAQ,EAAEC,SAAS,QAAQ,cAAa;AACjD,SAASC,aAAa,QAAQ,SAAQ;AACtC,OAAOC,UAAU,OAAM;AACvB,SAASC,aAAa,QAAQ,UAAS;AACvC,SAASC,SAAS,QAAQ,OAAM;AAWhC,MAAMC,gBAAgBD,UAAUN;AAEhC;;;CAGC,GACD,OAAO,eAAeQ,oBAAoB,EACxCC,QAAQ,EACRC,MAAM,EAIP;IACC,IAAIC;IAEJ,+FAA+F;IAC/F,IAAIC;IACJ,IAAI;QACF,MAAMC,iBAAiBV,cAAcC,KAAKU,IAAI,CAACC,QAAQC,GAAG,IAAI;QAC9D,MAAMC,kBAAkBJ,eAAeK,OAAO,CAAC;QAC/C,MAAM,EAAEC,GAAG,EAAE,GAAGN,eAAeI;QAC/BL,eAAeR,KAAKU,IAAI,CAACV,KAAKgB,OAAO,CAACH,kBAAkBE,IAAIE,KAAK;IACnE,EAAE,OAAM;IACN,wBAAwB;IAC1B;IAEA,IAAIT,cAAc;QAChB,IAAI;YACF,MAAML,cACJQ,QAAQO,QAAQ,EAChB,8FAA8F;YAC9F;gBAAC;gBAA8BV;gBAAc;gBAAmCH;aAAS,EACzF;gBAAEO,KAAKD,QAAQC,GAAG;YAAG;YAEvB;QACF,EAAE,OAAOO,KAAK;YACZZ,cAAcY;QAChB;IACF;IAEA,IAAI;QACF,MAAMC,WAAW,MAAMnB,cAAwB;QAC/C,MAAMoB,aAAa,MAAMD,SAASE,iBAAiB;QACnD,MAAMC,SAASF,aAAa,MAAMD,SAASI,aAAa,CAACH,cAAc,CAAC;QACxE,MAAMI,OAAO,MAAM5B,SAASQ,UAAU;QACtC,MAAMP,UAAUO,UAAU,MAAMe,SAASM,MAAM,CAACD,MAAM;YAAE,GAAGF,MAAM;YAAEI,QAAQ;QAAa;QACxF;IACF,EAAE,OAAOR,KAAK;QACZZ,gBAAgBY;IAClB;IAEAb,OAAOsB,KAAK,CAAC;QAAET,KAAKZ;QAAasB,KAAK,CAAC,iBAAiB,EAAExB,SAAS,uBAAuB,CAAC;IAAC;AAC9F"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/getTransaction.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\n\nimport type { DrizzleAdapter } from '../types.js'\n\nimport { shouldReadFromPrimary } from './readAfterWrite.js'\n\n/**\n * Returns current db transaction instance from req or adapter.drizzle itself\n *\n * If a transaction session doesn't exist (e.g., it was already committed/rolled back),\n * falls back to the default adapter.drizzle instance to prevent errors.\n *\n * When read replicas are configured and a write happened recently, returns the\n * unwrapped primary to avoid replication-lag stale reads.\n */\nexport const getTransaction = async <T extends DrizzleAdapter = DrizzleAdapter>(\n adapter: T,\n req?: Partial<PayloadRequest>,\n): Promise<T['drizzle']> => {\n if (!req?.transactionID) {\n if (shouldReadFromPrimary(adapter)) {\n return adapter.primaryDrizzle as T['drizzle']\n }\n return adapter.drizzle\n }\n\n return (adapter.sessions[await req.transactionID]?.db as T['drizzle']) || adapter.drizzle\n}\n"],"names":["shouldReadFromPrimary","getTransaction","adapter","req","transactionID","primaryDrizzle","drizzle","sessions","db"],"mappings":"AAIA,SAASA,qBAAqB,QAAQ,sBAAqB;AAE3D;;;;;;;;CAQC,GACD,OAAO,MAAMC,iBAAiB,OAC5BC,SACAC;IAEA,IAAI,CAACA,KAAKC,eAAe;QACvB,IAAIJ,sBAAsBE,UAAU;YAClC,OAAOA,QAAQG,cAAc;QAC/B;QACA,OAAOH,QAAQI,OAAO;IACxB;IAEA,OAAO,AAACJ,QAAQK,QAAQ,CAAC,MAAMJ,IAAIC,aAAa,CAAC,EAAEI,MAAuBN,QAAQI,OAAO;AAC3F,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/getTransaction.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\n\nimport type { DrizzleAdapter } from '../types.js'\n\nimport { shouldReadFromPrimary } from './readAfterWrite.js'\n\n/**\n * Returns current db transaction instance from req or adapter.drizzle itself\n *\n * If a transaction session doesn't exist (e.g., it was already committed/rolled back),\n * falls back to the default adapter.drizzle instance to prevent errors.\n *\n * When read replicas are configured and a write happened recently, returns the\n * unwrapped primary to avoid replication-lag stale reads.\n */\nexport const getTransaction = async <T extends DrizzleAdapter = DrizzleAdapter>(\n adapter: T,\n req?: Partial<PayloadRequest>,\n): Promise<T['drizzle']> => {\n if (!req?.transactionID) {\n if (shouldReadFromPrimary(adapter)) {\n return adapter.primaryDrizzle\n }\n return adapter.drizzle\n }\n\n return (adapter.sessions[await req.transactionID]?.db as T['drizzle']) || adapter.drizzle\n}\n"],"names":["shouldReadFromPrimary","getTransaction","adapter","req","transactionID","primaryDrizzle","drizzle","sessions","db"],"mappings":"AAIA,SAASA,qBAAqB,QAAQ,sBAAqB;AAE3D;;;;;;;;CAQC,GACD,OAAO,MAAMC,iBAAiB,OAC5BC,SACAC;IAEA,IAAI,CAACA,KAAKC,eAAe;QACvB,IAAIJ,sBAAsBE,UAAU;YAClC,OAAOA,QAAQG,cAAc;QAC/B;QACA,OAAOH,QAAQI,OAAO;IACxB;IAEA,OAAO,AAACJ,QAAQK,QAAQ,CAAC,MAAMJ,IAAIC,aAAa,CAAC,EAAEI,MAAuBN,QAAQI,OAAO;AAC3F,EAAC"}
package/package.json CHANGED
@@ -1,13 +1,8 @@
1
1
  {
2
2
  "name": "@payloadcms/drizzle",
3
- "version": "4.0.0-internal.ea6e8f8",
3
+ "version": "4.0.0-internal.ee5d8bd",
4
4
  "description": "A library of shared functions used by different payload database adapters",
5
5
  "homepage": "https://payloadcms.com",
6
- "repository": {
7
- "type": "git",
8
- "url": "https://github.com/payloadcms/payload.git",
9
- "directory": "packages/drizzle"
10
- },
11
6
  "license": "MIT",
12
7
  "author": "Payload <dev@payloadcms.com> (https://payloadcms.com)",
13
8
  "maintainers": [
@@ -17,8 +12,19 @@
17
12
  "url": "https://payloadcms.com"
18
13
  }
19
14
  ],
20
- "sideEffects": false,
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "https://github.com/payloadcms/payload.git",
18
+ "directory": "packages/drizzle"
19
+ },
20
+ "files": [
21
+ "dist",
22
+ "mock.js"
23
+ ],
21
24
  "type": "module",
25
+ "sideEffects": false,
26
+ "main": "./dist/index.js",
27
+ "types": "./dist/index.d.ts",
22
28
  "exports": {
23
29
  ".": {
24
30
  "import": "./dist/index.js",
@@ -36,12 +42,6 @@
36
42
  "default": "./dist/exports/sqlite.js"
37
43
  }
38
44
  },
39
- "main": "./dist/index.js",
40
- "types": "./dist/index.d.ts",
41
- "files": [
42
- "dist",
43
- "mock.js"
44
- ],
45
45
  "dependencies": {
46
46
  "console-table-printer": "2.15.0",
47
47
  "dequal": "2.0.3",
@@ -54,19 +54,16 @@
54
54
  "@libsql/client": "0.14.0",
55
55
  "@types/pg": "8.20.0",
56
56
  "@types/to-snake-case": "1.0.0",
57
- "@payloadcms/eslint-config": "3.28.0",
58
- "payload": "4.0.0-internal.ea6e8f8"
57
+ "payload": "4.0.0-internal.ee5d8bd"
59
58
  },
60
59
  "peerDependencies": {
61
- "payload": "4.0.0-internal.ea6e8f8"
60
+ "payload": "4.0.0-internal.ee5d8bd"
62
61
  },
63
62
  "scripts": {
64
63
  "build": "pnpm build:swc && pnpm build:types",
65
64
  "build:debug": "pnpm build",
66
65
  "build:swc": "swc ./src -d ./dist --config-file .swcrc --strip-leading-paths",
67
66
  "build:types": "tsc --emitDeclarationOnly --outDir dist",
68
- "clean": "rimraf -g {dist,*.tsbuildinfo}",
69
- "lint": "eslint .",
70
- "lint:fix": "eslint . --fix"
67
+ "clean": "rimraf -g {dist,*.tsbuildinfo}"
71
68
  }
72
69
  }
@@ -1,10 +0,0 @@
1
- import type { DeleteBranchGlobal } from 'payload';
2
- /**
3
- * Drops a branch's copy of a global.
4
- *
5
- * Each global has its own table holding one row per branch, so this deletes by the branch
6
- * column. Main's row uses the `main` sentinel, and `branch` is always a real non-main
7
- * branch by the time this is called, so main's row can never match.
8
- */
9
- export declare const deleteBranchGlobal: DeleteBranchGlobal;
10
- //# sourceMappingURL=deleteBranchGlobal.d.ts.map