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

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 (280) hide show
  1. package/dist/count.d.ts.map +1 -1
  2. package/dist/count.js +25 -3
  3. package/dist/count.js.map +1 -1
  4. package/dist/countVersions.d.ts.map +1 -1
  5. package/dist/countVersions.js +28 -4
  6. package/dist/countVersions.js.map +1 -1
  7. package/dist/createGlobalVersion.d.ts.map +1 -1
  8. package/dist/createGlobalVersion.js +15 -2
  9. package/dist/createGlobalVersion.js.map +1 -1
  10. package/dist/createTableName.d.ts.map +1 -1
  11. package/dist/createTableName.js +2 -7
  12. package/dist/createTableName.js.map +1 -1
  13. package/dist/createVersion.d.ts.map +1 -1
  14. package/dist/createVersion.js +12 -1
  15. package/dist/createVersion.js.map +1 -1
  16. package/dist/deleteBranchGlobal.d.ts +10 -0
  17. package/dist/deleteBranchGlobal.d.ts.map +1 -0
  18. package/dist/deleteBranchGlobal.js +27 -0
  19. package/dist/deleteBranchGlobal.js.map +1 -0
  20. package/dist/deleteOne.d.ts.map +1 -1
  21. package/dist/deleteOne.js +18 -1
  22. package/dist/deleteOne.js.map +1 -1
  23. package/dist/exports/postgres.d.ts +3 -0
  24. package/dist/exports/postgres.d.ts.map +1 -1
  25. package/dist/exports/postgres.js +3 -0
  26. package/dist/exports/postgres.js.map +1 -1
  27. package/dist/exports/sqlite.d.ts +1 -0
  28. package/dist/exports/sqlite.d.ts.map +1 -1
  29. package/dist/exports/sqlite.js +1 -0
  30. package/dist/exports/sqlite.js.map +1 -1
  31. package/dist/find/buildFindManyArgs.d.ts +3 -2
  32. package/dist/find/buildFindManyArgs.d.ts.map +1 -1
  33. package/dist/find/buildFindManyArgs.js +2 -1
  34. package/dist/find/buildFindManyArgs.js.map +1 -1
  35. package/dist/find/buildPolymorphicJoinQuery.d.ts +39 -0
  36. package/dist/find/buildPolymorphicJoinQuery.d.ts.map +1 -0
  37. package/dist/find/buildPolymorphicJoinQuery.js +152 -0
  38. package/dist/find/buildPolymorphicJoinQuery.js.map +1 -0
  39. package/dist/find/buildPolymorphicJoinWhere.d.ts +20 -0
  40. package/dist/find/buildPolymorphicJoinWhere.d.ts.map +1 -0
  41. package/dist/find/buildPolymorphicJoinWhere.js +301 -0
  42. package/dist/find/buildPolymorphicJoinWhere.js.map +1 -0
  43. package/dist/find/createPolymorphicJoinWherePlan.d.ts +37 -0
  44. package/dist/find/createPolymorphicJoinWherePlan.d.ts.map +1 -0
  45. package/dist/find/createPolymorphicJoinWherePlan.js +191 -0
  46. package/dist/find/createPolymorphicJoinWherePlan.js.map +1 -0
  47. package/dist/find/findMany.d.ts +6 -1
  48. package/dist/find/findMany.d.ts.map +1 -1
  49. package/dist/find/findMany.js +16 -3
  50. package/dist/find/findMany.js.map +1 -1
  51. package/dist/find/traverseFields.d.ts +3 -2
  52. package/dist/find/traverseFields.d.ts.map +1 -1
  53. package/dist/find/traverseFields.js +72 -197
  54. package/dist/find/traverseFields.js.map +1 -1
  55. package/dist/find.d.ts.map +1 -1
  56. package/dist/find.js +32 -4
  57. package/dist/find.js.map +1 -1
  58. package/dist/findDistinct.d.ts.map +1 -1
  59. package/dist/findDistinct.js +107 -8
  60. package/dist/findDistinct.js.map +1 -1
  61. package/dist/findGlobal.d.ts.map +1 -1
  62. package/dist/findGlobal.js +22 -5
  63. package/dist/findGlobal.js.map +1 -1
  64. package/dist/findGlobalVersions.js +8 -3
  65. package/dist/findGlobalVersions.js.map +1 -1
  66. package/dist/findOne.d.ts +1 -1
  67. package/dist/findOne.d.ts.map +1 -1
  68. package/dist/findOne.js +30 -3
  69. package/dist/findOne.js.map +1 -1
  70. package/dist/findVersions.d.ts.map +1 -1
  71. package/dist/findVersions.js +32 -5
  72. package/dist/findVersions.js.map +1 -1
  73. package/dist/index.d.ts +6 -2
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +4 -0
  76. package/dist/index.js.map +1 -1
  77. package/dist/migrate.d.ts.map +1 -1
  78. package/dist/migrate.js +41 -15
  79. package/dist/migrate.js.map +1 -1
  80. package/dist/migrateDown.d.ts +2 -1
  81. package/dist/migrateDown.d.ts.map +1 -1
  82. package/dist/migrateDown.js +17 -4
  83. package/dist/migrateDown.js.map +1 -1
  84. package/dist/migrateFresh.d.ts +4 -2
  85. package/dist/migrateFresh.d.ts.map +1 -1
  86. package/dist/migrateFresh.js +26 -9
  87. package/dist/migrateFresh.js.map +1 -1
  88. package/dist/migrateRefresh.d.ts +2 -1
  89. package/dist/migrateRefresh.d.ts.map +1 -1
  90. package/dist/migrateRefresh.js +20 -5
  91. package/dist/migrateRefresh.js.map +1 -1
  92. package/dist/migrateReset.d.ts +2 -1
  93. package/dist/migrateReset.d.ts.map +1 -1
  94. package/dist/migrateReset.js +18 -4
  95. package/dist/migrateReset.js.map +1 -1
  96. package/dist/migrateStatus.d.ts +2 -1
  97. package/dist/migrateStatus.d.ts.map +1 -1
  98. package/dist/migrateStatus.js +11 -6
  99. package/dist/migrateStatus.js.map +1 -1
  100. package/dist/postgres/createJSONQuery/index.js +3 -3
  101. package/dist/postgres/createJSONQuery/index.js.map +1 -1
  102. package/dist/postgres/init.d.ts.map +1 -1
  103. package/dist/postgres/init.js +6 -0
  104. package/dist/postgres/init.js.map +1 -1
  105. package/dist/postgres/insert.d.ts.map +1 -1
  106. package/dist/postgres/insert.js +4 -2
  107. package/dist/postgres/insert.js.map +1 -1
  108. package/dist/postgres/predefinedMigrations/sizes-to-variants/index.d.ts +35 -0
  109. package/dist/postgres/predefinedMigrations/sizes-to-variants/index.d.ts.map +1 -0
  110. package/dist/postgres/predefinedMigrations/sizes-to-variants/index.js +185 -0
  111. package/dist/postgres/predefinedMigrations/sizes-to-variants/index.js.map +1 -0
  112. package/dist/postgres/predefinedMigrations/v2-v3/fetchAndResave/index.d.ts.map +1 -1
  113. package/dist/postgres/predefinedMigrations/v2-v3/fetchAndResave/index.js +8 -4
  114. package/dist/postgres/predefinedMigrations/v2-v3/fetchAndResave/index.js.map +1 -1
  115. package/dist/postgres/predefinedMigrations/v2-v3/index.js +1 -1
  116. package/dist/postgres/predefinedMigrations/v2-v3/index.js.map +1 -1
  117. package/dist/postgres/query/assertOperatorHandlerExtensionsInstalled.d.ts +15 -0
  118. package/dist/postgres/query/assertOperatorHandlerExtensionsInstalled.d.ts.map +1 -0
  119. package/dist/postgres/query/assertOperatorHandlerExtensionsInstalled.js +25 -0
  120. package/dist/postgres/query/assertOperatorHandlerExtensionsInstalled.js.map +1 -0
  121. package/dist/postgres/query/postgresUnaccent.d.ts +13 -0
  122. package/dist/postgres/query/postgresUnaccent.d.ts.map +1 -0
  123. package/dist/postgres/query/postgresUnaccent.js +40 -0
  124. package/dist/postgres/query/postgresUnaccent.js.map +1 -0
  125. package/dist/postgres/types.d.ts +17 -2
  126. package/dist/postgres/types.d.ts.map +1 -1
  127. package/dist/postgres/types.js.map +1 -1
  128. package/dist/queries/buildAndOrConditions.d.ts +3 -2
  129. package/dist/queries/buildAndOrConditions.d.ts.map +1 -1
  130. package/dist/queries/buildAndOrConditions.js +2 -1
  131. package/dist/queries/buildAndOrConditions.js.map +1 -1
  132. package/dist/queries/buildBranchVisibility.d.ts +11 -0
  133. package/dist/queries/buildBranchVisibility.d.ts.map +1 -0
  134. package/dist/queries/buildBranchVisibility.js +48 -0
  135. package/dist/queries/buildBranchVisibility.js.map +1 -0
  136. package/dist/queries/buildOperatorConstraint.d.ts +22 -0
  137. package/dist/queries/buildOperatorConstraint.d.ts.map +1 -0
  138. package/dist/queries/buildOperatorConstraint.js +63 -0
  139. package/dist/queries/buildOperatorConstraint.js.map +1 -0
  140. package/dist/queries/buildOrderBy.d.ts +3 -2
  141. package/dist/queries/buildOrderBy.d.ts.map +1 -1
  142. package/dist/queries/buildOrderBy.js +2 -1
  143. package/dist/queries/buildOrderBy.js.map +1 -1
  144. package/dist/queries/buildQuery.d.ts +3 -2
  145. package/dist/queries/buildQuery.d.ts.map +1 -1
  146. package/dist/queries/buildQuery.js +4 -2
  147. package/dist/queries/buildQuery.js.map +1 -1
  148. package/dist/queries/getTableColumnFromPath.d.ts +15 -5
  149. package/dist/queries/getTableColumnFromPath.d.ts.map +1 -1
  150. package/dist/queries/getTableColumnFromPath.js +225 -54
  151. package/dist/queries/getTableColumnFromPath.js.map +1 -1
  152. package/dist/queries/operatorMap.d.ts +7 -3
  153. package/dist/queries/operatorMap.d.ts.map +1 -1
  154. package/dist/queries/operatorMap.js.map +1 -1
  155. package/dist/queries/parseParams.d.ts +3 -2
  156. package/dist/queries/parseParams.d.ts.map +1 -1
  157. package/dist/queries/parseParams.js +266 -11
  158. package/dist/queries/parseParams.js.map +1 -1
  159. package/dist/queries/resolveRelationshipPath.d.ts +36 -0
  160. package/dist/queries/resolveRelationshipPath.d.ts.map +1 -0
  161. package/dist/queries/resolveRelationshipPath.js +66 -0
  162. package/dist/queries/resolveRelationshipPath.js.map +1 -0
  163. package/dist/queries/validateOperatorHandlers.d.ts +8 -0
  164. package/dist/queries/validateOperatorHandlers.d.ts.map +1 -0
  165. package/dist/queries/validateOperatorHandlers.js +30 -0
  166. package/dist/queries/validateOperatorHandlers.js.map +1 -0
  167. package/dist/queryDrafts.d.ts.map +1 -1
  168. package/dist/queryDrafts.js +23 -4
  169. package/dist/queryDrafts.js.map +1 -1
  170. package/dist/schema/build.d.ts.map +1 -1
  171. package/dist/schema/build.js +20 -17
  172. package/dist/schema/build.js.map +1 -1
  173. package/dist/schema/traverseFields.js +5 -5
  174. package/dist/schema/traverseFields.js.map +1 -1
  175. package/dist/sqlite/createJSONQuery/convertPathToJSONTraversal.js +3 -2
  176. package/dist/sqlite/createJSONQuery/convertPathToJSONTraversal.js.map +1 -1
  177. package/dist/sqlite/createJSONQuery/index.d.ts.map +1 -1
  178. package/dist/sqlite/createJSONQuery/index.js +6 -5
  179. package/dist/sqlite/createJSONQuery/index.js.map +1 -1
  180. package/dist/sqlite/insert.d.ts.map +1 -1
  181. package/dist/sqlite/insert.js +9 -4
  182. package/dist/sqlite/insert.js.map +1 -1
  183. package/dist/sqlite/predefinedMigrations/sizes-to-variants/index.d.ts +15 -0
  184. package/dist/sqlite/predefinedMigrations/sizes-to-variants/index.d.ts.map +1 -0
  185. package/dist/sqlite/predefinedMigrations/sizes-to-variants/index.js +114 -0
  186. package/dist/sqlite/predefinedMigrations/sizes-to-variants/index.js.map +1 -0
  187. package/dist/sqlite/types.d.ts +4 -0
  188. package/dist/sqlite/types.d.ts.map +1 -1
  189. package/dist/sqlite/types.js.map +1 -1
  190. package/dist/transactions/beginTransaction.d.ts.map +1 -1
  191. package/dist/transactions/beginTransaction.js +13 -5
  192. package/dist/transactions/beginTransaction.js.map +1 -1
  193. package/dist/transactions/commitTransaction.d.ts.map +1 -1
  194. package/dist/transactions/commitTransaction.js +1 -5
  195. package/dist/transactions/commitTransaction.js.map +1 -1
  196. package/dist/transform/write/array.d.ts +3 -2
  197. package/dist/transform/write/array.d.ts.map +1 -1
  198. package/dist/transform/write/array.js +2 -1
  199. package/dist/transform/write/array.js.map +1 -1
  200. package/dist/transform/write/blocks.d.ts +3 -2
  201. package/dist/transform/write/blocks.d.ts.map +1 -1
  202. package/dist/transform/write/blocks.js +2 -1
  203. package/dist/transform/write/blocks.js.map +1 -1
  204. package/dist/transform/write/index.d.ts.map +1 -1
  205. package/dist/transform/write/index.js +2 -0
  206. package/dist/transform/write/index.js.map +1 -1
  207. package/dist/transform/write/traverseFields.d.ts +2 -1
  208. package/dist/transform/write/traverseFields.d.ts.map +1 -1
  209. package/dist/transform/write/traverseFields.js +40 -20
  210. package/dist/transform/write/traverseFields.js.map +1 -1
  211. package/dist/transform/write/types.d.ts +7 -0
  212. package/dist/transform/write/types.d.ts.map +1 -1
  213. package/dist/transform/write/types.js.map +1 -1
  214. package/dist/types.d.ts +51 -2
  215. package/dist/types.d.ts.map +1 -1
  216. package/dist/types.js.map +1 -1
  217. package/dist/updateGlobal.d.ts +5 -1
  218. package/dist/updateGlobal.d.ts.map +1 -1
  219. package/dist/updateGlobal.js +96 -4
  220. package/dist/updateGlobal.js.map +1 -1
  221. package/dist/updateJobs.d.ts.map +1 -1
  222. package/dist/updateJobs.js +37 -0
  223. package/dist/updateJobs.js.map +1 -1
  224. package/dist/updateOne.d.ts.map +1 -1
  225. package/dist/updateOne.js +86 -4
  226. package/dist/updateOne.js.map +1 -1
  227. package/dist/upsertBranchGlobalChange.d.ts +3 -0
  228. package/dist/upsertBranchGlobalChange.d.ts.map +1 -0
  229. package/dist/upsertBranchGlobalChange.js +35 -0
  230. package/dist/upsertBranchGlobalChange.js.map +1 -0
  231. package/dist/upsertRow/deleteExistingRowsByPath.d.ts.map +1 -1
  232. package/dist/upsertRow/deleteExistingRowsByPath.js +17 -12
  233. package/dist/upsertRow/deleteExistingRowsByPath.js.map +1 -1
  234. package/dist/upsertRow/index.d.ts +1 -1
  235. package/dist/upsertRow/index.d.ts.map +1 -1
  236. package/dist/upsertRow/index.js +156 -46
  237. package/dist/upsertRow/index.js.map +1 -1
  238. package/dist/upsertRow/types.d.ts +3 -0
  239. package/dist/upsertRow/types.d.ts.map +1 -1
  240. package/dist/upsertRow/types.js.map +1 -1
  241. package/dist/utilities/buildCreateMigration.d.ts.map +1 -1
  242. package/dist/utilities/buildCreateMigration.js +12 -8
  243. package/dist/utilities/buildCreateMigration.js.map +1 -1
  244. package/dist/utilities/buildDynamicPredefinedSizesToVariantsMigration.d.ts +15 -0
  245. package/dist/utilities/buildDynamicPredefinedSizesToVariantsMigration.d.ts.map +1 -0
  246. package/dist/utilities/buildDynamicPredefinedSizesToVariantsMigration.js +110 -0
  247. package/dist/utilities/buildDynamicPredefinedSizesToVariantsMigration.js.map +1 -0
  248. package/dist/utilities/buildForeignKeyName.d.ts.map +1 -1
  249. package/dist/utilities/buildForeignKeyName.js +3 -2
  250. package/dist/utilities/buildForeignKeyName.js.map +1 -1
  251. package/dist/utilities/buildIndexName.d.ts.map +1 -1
  252. package/dist/utilities/buildIndexName.js +3 -2
  253. package/dist/utilities/buildIndexName.js.map +1 -1
  254. package/dist/utilities/checkTruncatedIdentifiers.d.ts +13 -0
  255. package/dist/utilities/checkTruncatedIdentifiers.d.ts.map +1 -0
  256. package/dist/utilities/checkTruncatedIdentifiers.js +56 -0
  257. package/dist/utilities/checkTruncatedIdentifiers.js.map +1 -0
  258. package/dist/utilities/createSchemaGenerator.d.ts.map +1 -1
  259. package/dist/utilities/createSchemaGenerator.js +3 -0
  260. package/dist/utilities/createSchemaGenerator.js.map +1 -1
  261. package/dist/utilities/getSizesToVariantsRenames.d.ts +54 -0
  262. package/dist/utilities/getSizesToVariantsRenames.d.ts.map +1 -0
  263. package/dist/utilities/getSizesToVariantsRenames.js +251 -0
  264. package/dist/utilities/getSizesToVariantsRenames.js.map +1 -0
  265. package/dist/utilities/parseJSONPathSegment.d.ts +9 -0
  266. package/dist/utilities/parseJSONPathSegment.d.ts.map +1 -0
  267. package/dist/utilities/parseJSONPathSegment.js +17 -0
  268. package/dist/utilities/parseJSONPathSegment.js.map +1 -0
  269. package/dist/utilities/validateExistingBlockIsIdentical.d.ts +1 -5
  270. package/dist/utilities/validateExistingBlockIsIdentical.d.ts.map +1 -1
  271. package/dist/utilities/validateExistingBlockIsIdentical.js.map +1 -1
  272. package/dist/utilities/validateIdentifierLength.d.ts +12 -0
  273. package/dist/utilities/validateIdentifierLength.d.ts.map +1 -0
  274. package/dist/utilities/validateIdentifierLength.js +18 -0
  275. package/dist/utilities/validateIdentifierLength.js.map +1 -0
  276. package/package.json +3 -3
  277. package/dist/upsertRow/handleUpsertError.spec.js +0 -42
  278. package/dist/upsertRow/handleUpsertError.spec.js.map +0 -1
  279. package/dist/utilities/isValidStringID.spec.js +0 -15
  280. package/dist/utilities/isValidStringID.spec.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/schema/traverseFields.ts"],"sourcesContent":["import type { FlattenedField } from 'payload'\n\nimport { InvalidConfiguration } from 'payload'\nimport {\n fieldAffectsData,\n fieldIsVirtual,\n fieldShouldBeLocalized,\n optionIsObject,\n} from 'payload/shared'\nimport toSnakeCase from 'to-snake-case'\n\nimport type {\n DrizzleAdapter,\n IDType,\n RawColumn,\n RawForeignKey,\n RawIndex,\n RawRelation,\n RelationMap,\n SetColumnID,\n} from '../types.js'\n\nimport { createTableName } from '../createTableName.js'\nimport { buildIndexName } from '../utilities/buildIndexName.js'\nimport { getArrayRelationName } from '../utilities/getArrayRelationName.js'\nimport { hasLocalesTable } from '../utilities/hasLocalesTable.js'\nimport { isUUIDType } from '../utilities/isUUIDType.js'\nimport {\n InternalBlockTableNameIndex,\n setInternalBlockIndex,\n validateExistingBlockIsIdentical,\n} from '../utilities/validateExistingBlockIsIdentical.js'\nimport { buildTable } from './build.js'\nimport { idToUUID } from './idToUUID.js'\nimport { withDefault } from './withDefault.js'\n\ntype Args = {\n adapter: DrizzleAdapter\n blocksTableNameMap: Record<string, number>\n columnPrefix?: string\n columns: Record<string, RawColumn>\n disableNotNull: boolean\n disableRelsTableUnique?: boolean\n disableUnique?: boolean\n fieldPrefix?: string\n fields: FlattenedField[]\n forceLocalized?: boolean\n indexes: Record<string, RawIndex>\n localesColumns: Record<string, RawColumn>\n localesIndexes: Record<string, RawIndex>\n newTableName: string\n parentIsLocalized: boolean\n parentTableName: string\n relationships: Set<string>\n relationsToBuild: RelationMap\n rootRelationsToBuild?: RelationMap\n rootTableIDColType: IDType\n rootTableName: string\n setColumnID: SetColumnID\n uniqueRelationships: Set<string>\n versions: boolean\n /**\n * Tracks whether or not this table is built\n * from the result of a localized array or block field at some point\n */\n withinLocalizedArrayOrBlock?: boolean\n}\n\ntype Result = {\n hasLocalizedField: boolean\n hasLocalizedManyNumberField: boolean\n hasLocalizedManyTextField: boolean\n hasLocalizedRelationshipField: boolean\n hasManyNumberField: 'index' | boolean\n hasManyTextField: 'index' | boolean\n}\n\nexport const traverseFields = ({\n adapter,\n blocksTableNameMap,\n columnPrefix,\n columns,\n disableNotNull,\n disableRelsTableUnique,\n disableUnique = false,\n fieldPrefix,\n fields,\n forceLocalized,\n indexes,\n localesColumns,\n localesIndexes,\n newTableName,\n parentIsLocalized,\n parentTableName,\n relationships,\n relationsToBuild,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName,\n setColumnID,\n uniqueRelationships,\n versions,\n withinLocalizedArrayOrBlock,\n}: Args): Result => {\n const throwValidationError = true\n let hasLocalizedField = false\n let hasLocalizedRelationshipField = false\n let hasManyTextField: 'index' | boolean = false\n let hasLocalizedManyTextField = false\n let hasManyNumberField: 'index' | boolean = false\n let hasLocalizedManyNumberField = false\n\n let parentIDColType: IDType = 'integer'\n\n const idColumn = columns.id\n\n if (idColumn && ['numeric', 'text', 'uuid', 'varchar'].includes(idColumn.type)) {\n parentIDColType = idColumn.type as IDType\n }\n\n fields.forEach((field) => {\n if ('name' in field && field.name === 'id') {\n return\n }\n if (fieldIsVirtual(field)) {\n return\n }\n\n let targetTable = columns\n let targetIndexes = indexes\n\n const columnName = `${columnPrefix || ''}${field.name[0] === '_' ? '_' : ''}${toSnakeCase(\n field.name,\n )}`\n const fieldName = `${fieldPrefix?.replace('.', '_') || ''}${field.name}`\n\n const isFieldLocalized = fieldShouldBeLocalized({ field, parentIsLocalized })\n\n // If field is localized,\n // add the column to the locale table instead of main table\n if (\n adapter.payload.config.localization &&\n (isFieldLocalized || forceLocalized) &&\n field.type !== 'array' &&\n (field.type !== 'blocks' || adapter.blocksAsJSON) &&\n (('hasMany' in field && field.hasMany !== true) || !('hasMany' in field))\n ) {\n hasLocalizedField = true\n targetTable = localesColumns\n targetIndexes = localesIndexes\n }\n\n if (\n (field.unique || field.index || ['relationship', 'upload'].includes(field.type)) &&\n !['array', 'blocks', 'group'].includes(field.type) &&\n !('hasMany' in field && field.hasMany === true) &&\n !('relationTo' in field && Array.isArray(field.relationTo))\n ) {\n const unique = disableUnique !== true && field.unique\n if (unique) {\n const constraintValue = `${fieldPrefix || ''}${field.name}`\n if (!adapter.fieldConstraints?.[rootTableName]) {\n adapter.fieldConstraints[rootTableName] = {}\n }\n adapter.fieldConstraints[rootTableName][`${columnName}_idx`] = constraintValue\n }\n\n const indexName = buildIndexName({ name: `${newTableName}_${columnName}`, adapter })\n\n targetIndexes[indexName] = {\n name: indexName,\n on: isFieldLocalized ? [fieldName, '_locale'] : fieldName,\n unique,\n }\n }\n\n switch (field.type) {\n case 'array': {\n const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull\n\n const arrayTableName = createTableName({\n adapter,\n config: field,\n parentTableName: newTableName,\n prefix: `${newTableName}_`,\n throwValidationError,\n versionsCustomName: versions,\n })\n\n const baseColumns: Record<string, RawColumn> = {\n _order: {\n name: '_order',\n type: 'integer',\n notNull: true,\n },\n _parentID: {\n name: '_parent_id',\n type: parentIDColType,\n notNull: true,\n },\n }\n\n const baseIndexes: Record<string, RawIndex> = {\n _orderIdx: {\n name: `${arrayTableName}_order_idx`,\n on: ['_order'],\n },\n _parentIDIdx: {\n name: `${arrayTableName}_parent_id_idx`,\n on: '_parentID',\n },\n }\n\n const baseForeignKeys: Record<string, RawForeignKey> = {\n _parentIDFk: {\n name: `${arrayTableName}_parent_id_fk`,\n columns: ['_parentID'],\n foreignColumns: [\n {\n name: 'id',\n table: parentTableName,\n },\n ],\n onDelete: 'cascade',\n },\n }\n\n const isLocalized =\n Boolean(isFieldLocalized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock ||\n forceLocalized\n\n if (isLocalized) {\n baseColumns._locale = {\n name: '_locale',\n type: 'enum',\n locale: true,\n notNull: true,\n }\n\n baseIndexes._localeIdx = {\n name: `${arrayTableName}_locale_idx`,\n on: '_locale',\n }\n }\n\n const {\n hasLocalizedManyNumberField: subHasLocalizedManyNumberField,\n hasLocalizedManyTextField: subHasLocalizedManyTextField,\n hasLocalizedRelationshipField: subHasLocalizedRelationshipField,\n hasManyNumberField: subHasManyNumberField,\n hasManyTextField: subHasManyTextField,\n relationsToBuild: subRelationsToBuild,\n } = buildTable({\n adapter,\n baseColumns,\n baseForeignKeys,\n baseIndexes,\n blocksTableNameMap,\n disableNotNull: disableNotNullFromHere,\n disableRelsTableUnique: true,\n disableUnique,\n fields: disableUnique ? idToUUID(field.flattenedFields) : field.flattenedFields,\n parentIsLocalized: parentIsLocalized || field.localized,\n rootRelationships: relationships,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName,\n rootUniqueRelationships: uniqueRelationships,\n setColumnID,\n tableName: arrayTableName,\n versions,\n withinLocalizedArrayOrBlock: isLocalized,\n })\n\n if (subHasLocalizedManyNumberField) {\n hasLocalizedManyNumberField = subHasLocalizedManyNumberField\n }\n\n if (subHasLocalizedRelationshipField) {\n hasLocalizedRelationshipField = subHasLocalizedRelationshipField\n }\n\n if (subHasLocalizedManyTextField) {\n hasLocalizedManyTextField = subHasLocalizedManyTextField\n }\n\n if (subHasManyTextField) {\n if (!hasManyTextField || subHasManyTextField === 'index') {\n hasManyTextField = subHasManyTextField\n }\n }\n if (subHasManyNumberField) {\n if (!hasManyNumberField || subHasManyNumberField === 'index') {\n hasManyNumberField = subHasManyNumberField\n }\n }\n\n const relationName = getArrayRelationName({\n field,\n path: fieldName,\n tableName: arrayTableName,\n })\n\n relationsToBuild.set(relationName, {\n type: 'many',\n // arrays have their own localized table, independent of the base table.\n localized: false,\n target: arrayTableName,\n })\n\n const arrayRelations: Record<string, RawRelation> = {\n _parentID: {\n type: 'one',\n fields: [\n {\n name: '_parentID',\n table: arrayTableName,\n },\n ],\n references: ['id'],\n relationName,\n to: parentTableName,\n },\n }\n\n if (\n hasLocalesTable({\n fields: field.fields,\n parentIsLocalized: parentIsLocalized || field.localized,\n })\n ) {\n arrayRelations._locales = {\n type: 'many',\n relationName: '_locales',\n to: `${arrayTableName}${adapter.localesSuffix}`,\n }\n }\n\n subRelationsToBuild.forEach(({ type, localized, target }, key) => {\n if (type === 'one') {\n const arrayWithLocalized = localized\n ? `${arrayTableName}${adapter.localesSuffix}`\n : arrayTableName\n\n arrayRelations[key] = {\n type: 'one',\n fields: [\n {\n name: key,\n table: arrayWithLocalized,\n },\n ],\n references: ['id'],\n relationName: key,\n to: target,\n }\n }\n\n if (type === 'many') {\n arrayRelations[key] = {\n type: 'many',\n relationName: key,\n to: target,\n }\n }\n })\n\n adapter.rawRelations[arrayTableName] = arrayRelations\n\n break\n }\n case 'blocks': {\n if (adapter.blocksAsJSON) {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'jsonb',\n },\n field,\n )\n break\n }\n\n const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull\n\n field.blocks.forEach((_block) => {\n const block = typeof _block === 'string' ? adapter.payload.blocks[_block] : _block\n\n let blockTableName = createTableName({\n adapter,\n config: block,\n parentTableName: rootTableName,\n prefix: `${rootTableName}_blocks_`,\n throwValidationError,\n versionsCustomName: versions,\n })\n\n if (typeof blocksTableNameMap[blockTableName] === 'undefined') {\n blocksTableNameMap[blockTableName] = 1\n } else if (\n !adapter.rawTables[blockTableName] ||\n !validateExistingBlockIsIdentical({\n block,\n localized: field.localized,\n rootTableName,\n table: adapter.rawTables[blockTableName],\n tableLocales: adapter.rawTables[`${blockTableName}${adapter.localesSuffix}`],\n })\n ) {\n blocksTableNameMap[blockTableName]++\n setInternalBlockIndex(block, blocksTableNameMap[blockTableName])\n blockTableName = `${blockTableName}_${blocksTableNameMap[blockTableName]}`\n }\n let relationName = `_blocks_${block.slug}`\n if (typeof block[InternalBlockTableNameIndex] !== 'undefined') {\n relationName = `_blocks_${block.slug}_${block[InternalBlockTableNameIndex]}`\n }\n\n if (!adapter.rawTables[blockTableName]) {\n const baseColumns: Record<string, RawColumn> = {\n _order: {\n name: '_order',\n type: 'integer',\n notNull: true,\n },\n _parentID: {\n name: '_parent_id',\n type: rootTableIDColType,\n notNull: true,\n },\n _path: {\n name: '_path',\n type: 'text',\n notNull: true,\n },\n }\n\n const baseIndexes: Record<string, RawIndex> = {\n _orderIdx: {\n name: `${blockTableName}_order_idx`,\n on: '_order',\n },\n _parentIDIdx: {\n name: `${blockTableName}_parent_id_idx`,\n on: ['_parentID'],\n },\n _pathIdx: {\n name: `${blockTableName}_path_idx`,\n on: '_path',\n },\n }\n\n const baseForeignKeys: Record<string, RawForeignKey> = {\n _parentIdFk: {\n name: `${blockTableName}_parent_id_fk`,\n columns: ['_parentID'],\n foreignColumns: [\n {\n name: 'id',\n table: rootTableName,\n },\n ],\n onDelete: 'cascade',\n },\n }\n\n const isLocalized =\n Boolean(isFieldLocalized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock ||\n forceLocalized\n\n if (isLocalized) {\n baseColumns._locale = {\n name: '_locale',\n type: 'enum',\n locale: true,\n notNull: true,\n }\n\n baseIndexes._localeIdx = {\n name: `${blockTableName}_locale_idx`,\n on: '_locale',\n }\n }\n\n const {\n hasLocalizedManyNumberField: subHasLocalizedManyNumberField,\n hasLocalizedManyTextField: subHasLocalizedManyTextField,\n hasLocalizedRelationshipField: subHasLocalizedRelationshipField,\n hasManyNumberField: subHasManyNumberField,\n hasManyTextField: subHasManyTextField,\n relationsToBuild: subRelationsToBuild,\n } = buildTable({\n adapter,\n baseColumns,\n baseForeignKeys,\n baseIndexes,\n blocksTableNameMap,\n disableNotNull: disableNotNullFromHere,\n disableRelsTableUnique: true,\n disableUnique,\n fields: disableUnique ? idToUUID(block.flattenedFields) : block.flattenedFields,\n parentIsLocalized: parentIsLocalized || field.localized,\n rootRelationships: relationships,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName,\n rootUniqueRelationships: uniqueRelationships,\n setColumnID,\n tableName: blockTableName,\n versions,\n withinLocalizedArrayOrBlock: isLocalized,\n })\n\n if (subHasLocalizedManyNumberField) {\n hasLocalizedManyNumberField = subHasLocalizedManyNumberField\n }\n\n if (subHasLocalizedRelationshipField) {\n hasLocalizedRelationshipField = subHasLocalizedRelationshipField\n }\n\n if (subHasLocalizedManyTextField) {\n hasLocalizedManyTextField = subHasLocalizedManyTextField\n }\n\n if (subHasManyTextField) {\n if (!hasManyTextField || subHasManyTextField === 'index') {\n hasManyTextField = subHasManyTextField\n }\n }\n\n if (subHasManyNumberField) {\n if (!hasManyNumberField || subHasManyNumberField === 'index') {\n hasManyNumberField = subHasManyNumberField\n }\n }\n\n const blockRelations: Record<string, RawRelation> = {\n _parentID: {\n type: 'one',\n fields: [\n {\n name: '_parentID',\n table: blockTableName,\n },\n ],\n references: ['id'],\n relationName,\n to: rootTableName,\n },\n }\n\n if (\n hasLocalesTable({\n fields: block.fields,\n parentIsLocalized: parentIsLocalized || field.localized,\n })\n ) {\n blockRelations._locales = {\n type: 'many',\n relationName: '_locales',\n to: `${blockTableName}${adapter.localesSuffix}`,\n }\n }\n\n subRelationsToBuild.forEach(({ type, localized, target }, key) => {\n if (type === 'one') {\n const blockWithLocalized = localized\n ? `${blockTableName}${adapter.localesSuffix}`\n : blockTableName\n\n blockRelations[key] = {\n type: 'one',\n fields: [\n {\n name: key,\n table: blockWithLocalized,\n },\n ],\n references: ['id'],\n relationName: key,\n to: target,\n }\n }\n\n if (type === 'many') {\n blockRelations[key] = {\n type: 'many',\n relationName: key,\n to: target,\n }\n }\n })\n\n adapter.rawRelations[blockTableName] = blockRelations\n }\n\n // blocks relationships are defined from the collection or globals table down to the block, bypassing any subBlocks\n rootRelationsToBuild.set(relationName, {\n type: 'many',\n // blocks are not localized on the parent table\n localized: false,\n target: blockTableName,\n })\n })\n\n break\n }\n case 'checkbox': {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'boolean',\n },\n field,\n )\n\n break\n }\n\n case 'code':\n case 'email':\n case 'slug':\n case 'textarea': {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'varchar',\n },\n field,\n )\n\n break\n }\n\n case 'date': {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'timestamp',\n mode: 'string',\n precision: 3,\n withTimezone: true,\n },\n field,\n )\n\n break\n }\n\n case 'group':\n case 'tab': {\n const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull\n\n const {\n hasLocalizedField: groupHasLocalizedField,\n hasLocalizedManyNumberField: groupHasLocalizedManyNumberField,\n hasLocalizedManyTextField: groupHasLocalizedManyTextField,\n hasLocalizedRelationshipField: groupHasLocalizedRelationshipField,\n hasManyNumberField: groupHasManyNumberField,\n hasManyTextField: groupHasManyTextField,\n } = traverseFields({\n adapter,\n blocksTableNameMap,\n columnPrefix: `${columnName}_`,\n columns,\n disableNotNull: disableNotNullFromHere,\n disableUnique,\n fieldPrefix: `${fieldName}.`,\n fields: field.flattenedFields,\n forceLocalized: isFieldLocalized || Boolean(forceLocalized),\n indexes,\n localesColumns,\n localesIndexes,\n newTableName: `${parentTableName}_${columnName}`,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentTableName,\n relationships,\n relationsToBuild,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName,\n setColumnID,\n uniqueRelationships,\n versions,\n withinLocalizedArrayOrBlock: withinLocalizedArrayOrBlock || isFieldLocalized,\n })\n\n if (groupHasLocalizedField) {\n hasLocalizedField = true\n }\n if (groupHasLocalizedRelationshipField) {\n hasLocalizedRelationshipField = true\n }\n if (groupHasManyTextField) {\n hasManyTextField = true\n }\n if (groupHasLocalizedManyTextField) {\n hasLocalizedManyTextField = true\n }\n if (groupHasManyNumberField) {\n hasManyNumberField = true\n }\n if (groupHasLocalizedManyNumberField) {\n hasLocalizedManyNumberField = true\n }\n break\n }\n\n case 'json':\n case 'richText': {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'jsonb',\n },\n field,\n )\n\n break\n }\n\n case 'number': {\n if (field.hasMany) {\n const isLocalized =\n Boolean(isFieldLocalized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock ||\n forceLocalized\n\n if (isLocalized) {\n hasLocalizedManyNumberField = true\n }\n\n if (field.index) {\n hasManyNumberField = 'index'\n } else if (!hasManyNumberField) {\n hasManyNumberField = true\n }\n\n if (field.unique) {\n throw new InvalidConfiguration(\n 'Unique is not supported in Postgres for hasMany number fields.',\n )\n }\n } else {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'numeric',\n },\n field,\n )\n }\n\n break\n }\n\n case 'point': {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'geometry',\n },\n field,\n )\n\n break\n }\n\n case 'radio':\n case 'select': {\n const enumName = createTableName({\n adapter,\n config: field,\n parentTableName: newTableName,\n prefix: `enum_${newTableName}_`,\n target: 'enumName',\n throwValidationError,\n })\n\n const options = field.options.map((option) => {\n if (optionIsObject(option)) {\n return option.value\n }\n\n return option\n })\n\n if (field.type === 'select' && field.hasMany) {\n const selectTableName = createTableName({\n adapter,\n config: field,\n parentTableName: newTableName,\n prefix: `${newTableName}_`,\n throwValidationError,\n versionsCustomName: versions,\n })\n\n const baseColumns: Record<string, RawColumn> = {\n order: {\n name: 'order',\n type: 'integer',\n notNull: true,\n },\n parent: {\n name: 'parent_id',\n type: parentIDColType,\n notNull: true,\n },\n value: {\n name: 'value',\n type: 'enum',\n enumName: createTableName({\n adapter,\n config: field,\n parentTableName: newTableName,\n prefix: `enum_${newTableName}_`,\n target: 'enumName',\n throwValidationError,\n }),\n options,\n },\n }\n\n const baseIndexes: Record<string, RawIndex> = {\n orderIdx: {\n name: `${selectTableName}_order_idx`,\n on: 'order',\n },\n parentIdx: {\n name: `${selectTableName}_parent_idx`,\n on: 'parent',\n },\n }\n\n const baseForeignKeys: Record<string, RawForeignKey> = {\n parentFk: {\n name: `${selectTableName}_parent_fk`,\n columns: ['parent'],\n foreignColumns: [\n {\n name: 'id',\n table: parentTableName,\n },\n ],\n onDelete: 'cascade',\n },\n }\n\n const isLocalized =\n Boolean(isFieldLocalized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock ||\n forceLocalized\n\n if (isLocalized) {\n baseColumns.locale = {\n name: 'locale',\n type: 'enum',\n locale: true,\n notNull: true,\n }\n\n baseIndexes.localeIdx = {\n name: `${selectTableName}_locale_idx`,\n on: 'locale',\n }\n }\n\n if (field.index) {\n baseIndexes.value = {\n name: `${selectTableName}_value_idx`,\n on: 'value',\n }\n }\n\n buildTable({\n adapter,\n baseColumns,\n baseForeignKeys,\n baseIndexes,\n blocksTableNameMap,\n disableNotNull,\n disableUnique,\n fields: [],\n parentIsLocalized: parentIsLocalized || field.localized,\n rootTableName,\n setColumnID,\n tableName: selectTableName,\n versions,\n })\n\n relationsToBuild.set(fieldName, {\n type: 'many',\n // selects have their own localized table, independent of the base table.\n localized: false,\n target: selectTableName,\n })\n\n adapter.rawRelations[selectTableName] = {\n parent: {\n type: 'one',\n fields: [\n {\n name: 'parent',\n table: selectTableName,\n },\n ],\n references: ['id'],\n relationName: fieldName,\n to: parentTableName,\n },\n }\n } else {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'enum',\n enumName,\n options,\n },\n field,\n )\n }\n break\n }\n\n case 'relationship':\n case 'upload':\n if (Array.isArray(field.relationTo)) {\n field.relationTo.forEach((relation) => {\n relationships.add(relation)\n if (field.unique && !disableUnique && !disableRelsTableUnique) {\n uniqueRelationships.add(relation)\n }\n })\n } else if (field.hasMany) {\n relationships.add(field.relationTo)\n if (field.unique && !disableUnique && !disableRelsTableUnique) {\n uniqueRelationships.add(field.relationTo)\n }\n } else {\n // simple relationships get a column on the targetTable with a foreign key to the relationTo table\n const relationshipConfig = adapter.payload.collections[field.relationTo].config\n\n const tableName = adapter.tableNameMap.get(toSnakeCase(field.relationTo))\n\n // get the id type of the related collection\n let colType: IDType = isUUIDType(adapter.idType) ? 'uuid' : 'integer'\n const relatedCollectionCustomID = relationshipConfig.fields.find(\n (field) => fieldAffectsData(field) && field.name === 'id',\n )\n if (relatedCollectionCustomID?.type === 'number') {\n colType = 'numeric'\n }\n if (relatedCollectionCustomID?.type === 'text') {\n colType = 'varchar'\n }\n\n // make the foreign key column for relationship using the correct id column type\n targetTable[fieldName] = {\n name: `${columnName}_id`,\n type: colType,\n reference: {\n name: 'id',\n onDelete: 'set null',\n table: tableName,\n },\n }\n\n // add relationship to table\n relationsToBuild.set(fieldName, {\n type: 'one',\n localized: adapter.payload.config.localization && (isFieldLocalized || forceLocalized),\n target: tableName,\n })\n\n // add notNull when not required\n if (!disableNotNull && field.required && !field.admin?.condition) {\n targetTable[fieldName].notNull = true\n }\n break\n }\n\n if (\n Boolean(isFieldLocalized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock\n ) {\n hasLocalizedRelationshipField = true\n }\n\n break\n\n case 'text': {\n if (field.hasMany) {\n const isLocalized =\n Boolean(isFieldLocalized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock ||\n forceLocalized\n\n if (isLocalized) {\n hasLocalizedManyTextField = true\n }\n\n if (field.index) {\n hasManyTextField = 'index'\n } else if (!hasManyTextField) {\n hasManyTextField = true\n }\n\n if (field.unique) {\n throw new InvalidConfiguration(\n 'Unique is not supported in Postgres for hasMany text fields.',\n )\n }\n } else {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'varchar',\n },\n field,\n )\n }\n break\n }\n\n default:\n break\n }\n\n const condition = field.admin && field.admin.condition\n\n if (\n !disableNotNull &&\n targetTable[fieldName] &&\n 'required' in field &&\n field.required &&\n !condition\n ) {\n targetTable[fieldName].notNull = true\n }\n })\n\n return {\n hasLocalizedField,\n hasLocalizedManyNumberField,\n hasLocalizedManyTextField,\n hasLocalizedRelationshipField,\n hasManyNumberField,\n hasManyTextField,\n }\n}\n"],"names":["InvalidConfiguration","fieldAffectsData","fieldIsVirtual","fieldShouldBeLocalized","optionIsObject","toSnakeCase","createTableName","buildIndexName","getArrayRelationName","hasLocalesTable","isUUIDType","InternalBlockTableNameIndex","setInternalBlockIndex","validateExistingBlockIsIdentical","buildTable","idToUUID","withDefault","traverseFields","adapter","blocksTableNameMap","columnPrefix","columns","disableNotNull","disableRelsTableUnique","disableUnique","fieldPrefix","fields","forceLocalized","indexes","localesColumns","localesIndexes","newTableName","parentIsLocalized","parentTableName","relationships","relationsToBuild","rootRelationsToBuild","rootTableIDColType","rootTableName","setColumnID","uniqueRelationships","versions","withinLocalizedArrayOrBlock","throwValidationError","hasLocalizedField","hasLocalizedRelationshipField","hasManyTextField","hasLocalizedManyTextField","hasManyNumberField","hasLocalizedManyNumberField","parentIDColType","idColumn","id","includes","type","forEach","field","name","targetTable","targetIndexes","columnName","fieldName","replace","isFieldLocalized","payload","config","localization","blocksAsJSON","hasMany","unique","index","Array","isArray","relationTo","constraintValue","fieldConstraints","indexName","on","disableNotNullFromHere","Boolean","admin","condition","arrayTableName","prefix","versionsCustomName","baseColumns","_order","notNull","_parentID","baseIndexes","_orderIdx","_parentIDIdx","baseForeignKeys","_parentIDFk","foreignColumns","table","onDelete","isLocalized","_locale","locale","_localeIdx","subHasLocalizedManyNumberField","subHasLocalizedManyTextField","subHasLocalizedRelationshipField","subHasManyNumberField","subHasManyTextField","subRelationsToBuild","flattenedFields","localized","rootRelationships","rootUniqueRelationships","tableName","relationName","path","set","target","arrayRelations","references","to","_locales","localesSuffix","key","arrayWithLocalized","rawRelations","blocks","_block","block","blockTableName","rawTables","tableLocales","slug","_path","_pathIdx","_parentIdFk","blockRelations","blockWithLocalized","mode","precision","withTimezone","groupHasLocalizedField","groupHasLocalizedManyNumberField","groupHasLocalizedManyTextField","groupHasLocalizedRelationshipField","groupHasManyNumberField","groupHasManyTextField","enumName","options","map","option","value","selectTableName","order","parent","orderIdx","parentIdx","parentFk","localeIdx","relation","add","relationshipConfig","collections","tableNameMap","get","colType","idType","relatedCollectionCustomID","find","reference","required"],"mappings":"AAEA,SAASA,oBAAoB,QAAQ,UAAS;AAC9C,SACEC,gBAAgB,EAChBC,cAAc,EACdC,sBAAsB,EACtBC,cAAc,QACT,iBAAgB;AACvB,OAAOC,iBAAiB,gBAAe;AAavC,SAASC,eAAe,QAAQ,wBAAuB;AACvD,SAASC,cAAc,QAAQ,iCAAgC;AAC/D,SAASC,oBAAoB,QAAQ,uCAAsC;AAC3E,SAASC,eAAe,QAAQ,kCAAiC;AACjE,SAASC,UAAU,QAAQ,6BAA4B;AACvD,SACEC,2BAA2B,EAC3BC,qBAAqB,EACrBC,gCAAgC,QAC3B,mDAAkD;AACzD,SAASC,UAAU,QAAQ,aAAY;AACvC,SAASC,QAAQ,QAAQ,gBAAe;AACxC,SAASC,WAAW,QAAQ,mBAAkB;AA2C9C,OAAO,MAAMC,iBAAiB,CAAC,EAC7BC,OAAO,EACPC,kBAAkB,EAClBC,YAAY,EACZC,OAAO,EACPC,cAAc,EACdC,sBAAsB,EACtBC,gBAAgB,KAAK,EACrBC,WAAW,EACXC,MAAM,EACNC,cAAc,EACdC,OAAO,EACPC,cAAc,EACdC,cAAc,EACdC,YAAY,EACZC,iBAAiB,EACjBC,eAAe,EACfC,aAAa,EACbC,gBAAgB,EAChBC,oBAAoB,EACpBC,kBAAkB,EAClBC,aAAa,EACbC,WAAW,EACXC,mBAAmB,EACnBC,QAAQ,EACRC,2BAA2B,EACtB;IACL,MAAMC,uBAAuB;IAC7B,IAAIC,oBAAoB;IACxB,IAAIC,gCAAgC;IACpC,IAAIC,mBAAsC;IAC1C,IAAIC,4BAA4B;IAChC,IAAIC,qBAAwC;IAC5C,IAAIC,8BAA8B;IAElC,IAAIC,kBAA0B;IAE9B,MAAMC,WAAW9B,QAAQ+B,EAAE;IAE3B,IAAID,YAAY;QAAC;QAAW;QAAQ;QAAQ;KAAU,CAACE,QAAQ,CAACF,SAASG,IAAI,GAAG;QAC9EJ,kBAAkBC,SAASG,IAAI;IACjC;IAEA5B,OAAO6B,OAAO,CAAC,CAACC;QACd,IAAI,UAAUA,SAASA,MAAMC,IAAI,KAAK,MAAM;YAC1C;QACF;QACA,IAAIvD,eAAesD,QAAQ;YACzB;QACF;QAEA,IAAIE,cAAcrC;QAClB,IAAIsC,gBAAgB/B;QAEpB,MAAMgC,aAAa,GAAGxC,gBAAgB,KAAKoC,MAAMC,IAAI,CAAC,EAAE,KAAK,MAAM,MAAM,KAAKpD,YAC5EmD,MAAMC,IAAI,GACT;QACH,MAAMI,YAAY,GAAGpC,aAAaqC,QAAQ,KAAK,QAAQ,KAAKN,MAAMC,IAAI,EAAE;QAExE,MAAMM,mBAAmB5D,uBAAuB;YAAEqD;YAAOxB;QAAkB;QAE3E,yBAAyB;QACzB,2DAA2D;QAC3D,IACEd,QAAQ8C,OAAO,CAACC,MAAM,CAACC,YAAY,IAClCH,CAAAA,oBAAoBpC,cAAa,KAClC6B,MAAMF,IAAI,KAAK,WACdE,CAAAA,MAAMF,IAAI,KAAK,YAAYpC,QAAQiD,YAAY,AAAD,KAC9C,CAAA,AAAC,aAAaX,SAASA,MAAMY,OAAO,KAAK,QAAS,CAAE,CAAA,aAAaZ,KAAI,CAAC,GACvE;YACAZ,oBAAoB;YACpBc,cAAc7B;YACd8B,gBAAgB7B;QAClB;QAEA,IACE,AAAC0B,CAAAA,MAAMa,MAAM,IAAIb,MAAMc,KAAK,IAAI;YAAC;YAAgB;SAAS,CAACjB,QAAQ,CAACG,MAAMF,IAAI,CAAA,KAC9E,CAAC;YAAC;YAAS;YAAU;SAAQ,CAACD,QAAQ,CAACG,MAAMF,IAAI,KACjD,CAAE,CAAA,aAAaE,SAASA,MAAMY,OAAO,KAAK,IAAG,KAC7C,CAAE,CAAA,gBAAgBZ,SAASe,MAAMC,OAAO,CAAChB,MAAMiB,UAAU,CAAA,GACzD;YACA,MAAMJ,SAAS7C,kBAAkB,QAAQgC,MAAMa,MAAM;YACrD,IAAIA,QAAQ;gBACV,MAAMK,kBAAkB,GAAGjD,eAAe,KAAK+B,MAAMC,IAAI,EAAE;gBAC3D,IAAI,CAACvC,QAAQyD,gBAAgB,EAAE,CAACrC,cAAc,EAAE;oBAC9CpB,QAAQyD,gBAAgB,CAACrC,cAAc,GAAG,CAAC;gBAC7C;gBACApB,QAAQyD,gBAAgB,CAACrC,cAAc,CAAC,GAAGsB,WAAW,IAAI,CAAC,CAAC,GAAGc;YACjE;YAEA,MAAME,YAAYrE,eAAe;gBAAEkD,MAAM,GAAG1B,aAAa,CAAC,EAAE6B,YAAY;gBAAE1C;YAAQ;YAElFyC,aAAa,CAACiB,UAAU,GAAG;gBACzBnB,MAAMmB;gBACNC,IAAId,mBAAmB;oBAACF;oBAAW;iBAAU,GAAGA;gBAChDQ;YACF;QACF;QAEA,OAAQb,MAAMF,IAAI;YAChB,KAAK;gBAAS;oBACZ,MAAMwB,yBAAyBC,QAAQvB,MAAMwB,KAAK,EAAEC,cAAc3D;oBAElE,MAAM4D,iBAAiB5E,gBAAgB;wBACrCY;wBACA+C,QAAQT;wBACRvB,iBAAiBF;wBACjBoD,QAAQ,GAAGpD,aAAa,CAAC,CAAC;wBAC1BY;wBACAyC,oBAAoB3C;oBACtB;oBAEA,MAAM4C,cAAyC;wBAC7CC,QAAQ;4BACN7B,MAAM;4BACNH,MAAM;4BACNiC,SAAS;wBACX;wBACAC,WAAW;4BACT/B,MAAM;4BACNH,MAAMJ;4BACNqC,SAAS;wBACX;oBACF;oBAEA,MAAME,cAAwC;wBAC5CC,WAAW;4BACTjC,MAAM,GAAGyB,eAAe,UAAU,CAAC;4BACnCL,IAAI;gCAAC;6BAAS;wBAChB;wBACAc,cAAc;4BACZlC,MAAM,GAAGyB,eAAe,cAAc,CAAC;4BACvCL,IAAI;wBACN;oBACF;oBAEA,MAAMe,kBAAiD;wBACrDC,aAAa;4BACXpC,MAAM,GAAGyB,eAAe,aAAa,CAAC;4BACtC7D,SAAS;gCAAC;6BAAY;4BACtByE,gBAAgB;gCACd;oCACErC,MAAM;oCACNsC,OAAO9D;gCACT;6BACD;4BACD+D,UAAU;wBACZ;oBACF;oBAEA,MAAMC,cACJlB,QAAQhB,oBAAoB7C,QAAQ8C,OAAO,CAACC,MAAM,CAACC,YAAY,KAC/DxB,+BACAf;oBAEF,IAAIsE,aAAa;wBACfZ,YAAYa,OAAO,GAAG;4BACpBzC,MAAM;4BACNH,MAAM;4BACN6C,QAAQ;4BACRZ,SAAS;wBACX;wBAEAE,YAAYW,UAAU,GAAG;4BACvB3C,MAAM,GAAGyB,eAAe,WAAW,CAAC;4BACpCL,IAAI;wBACN;oBACF;oBAEA,MAAM,EACJ5B,6BAA6BoD,8BAA8B,EAC3DtD,2BAA2BuD,4BAA4B,EACvDzD,+BAA+B0D,gCAAgC,EAC/DvD,oBAAoBwD,qBAAqB,EACzC1D,kBAAkB2D,mBAAmB,EACrCtE,kBAAkBuE,mBAAmB,EACtC,GAAG5F,WAAW;wBACbI;wBACAmE;wBACAO;wBACAH;wBACAtE;wBACAG,gBAAgBwD;wBAChBvD,wBAAwB;wBACxBC;wBACAE,QAAQF,gBAAgBT,SAASyC,MAAMmD,eAAe,IAAInD,MAAMmD,eAAe;wBAC/E3E,mBAAmBA,qBAAqBwB,MAAMoD,SAAS;wBACvDC,mBAAmB3E;wBACnBE;wBACAC;wBACAC;wBACAwE,yBAAyBtE;wBACzBD;wBACAwE,WAAW7B;wBACXzC;wBACAC,6BAA6BuD;oBAC/B;oBAEA,IAAII,gCAAgC;wBAClCpD,8BAA8BoD;oBAChC;oBAEA,IAAIE,kCAAkC;wBACpC1D,gCAAgC0D;oBAClC;oBAEA,IAAID,8BAA8B;wBAChCvD,4BAA4BuD;oBAC9B;oBAEA,IAAIG,qBAAqB;wBACvB,IAAI,CAAC3D,oBAAoB2D,wBAAwB,SAAS;4BACxD3D,mBAAmB2D;wBACrB;oBACF;oBACA,IAAID,uBAAuB;wBACzB,IAAI,CAACxD,sBAAsBwD,0BAA0B,SAAS;4BAC5DxD,qBAAqBwD;wBACvB;oBACF;oBAEA,MAAMQ,eAAexG,qBAAqB;wBACxCgD;wBACAyD,MAAMpD;wBACNkD,WAAW7B;oBACb;oBAEA/C,iBAAiB+E,GAAG,CAACF,cAAc;wBACjC1D,MAAM;wBACN,wEAAwE;wBACxEsD,WAAW;wBACXO,QAAQjC;oBACV;oBAEA,MAAMkC,iBAA8C;wBAClD5B,WAAW;4BACTlC,MAAM;4BACN5B,QAAQ;gCACN;oCACE+B,MAAM;oCACNsC,OAAOb;gCACT;6BACD;4BACDmC,YAAY;gCAAC;6BAAK;4BAClBL;4BACAM,IAAIrF;wBACN;oBACF;oBAEA,IACExB,gBAAgB;wBACdiB,QAAQ8B,MAAM9B,MAAM;wBACpBM,mBAAmBA,qBAAqBwB,MAAMoD,SAAS;oBACzD,IACA;wBACAQ,eAAeG,QAAQ,GAAG;4BACxBjE,MAAM;4BACN0D,cAAc;4BACdM,IAAI,GAAGpC,iBAAiBhE,QAAQsG,aAAa,EAAE;wBACjD;oBACF;oBAEAd,oBAAoBnD,OAAO,CAAC,CAAC,EAAED,IAAI,EAAEsD,SAAS,EAAEO,MAAM,EAAE,EAAEM;wBACxD,IAAInE,SAAS,OAAO;4BAClB,MAAMoE,qBAAqBd,YACvB,GAAG1B,iBAAiBhE,QAAQsG,aAAa,EAAE,GAC3CtC;4BAEJkC,cAAc,CAACK,IAAI,GAAG;gCACpBnE,MAAM;gCACN5B,QAAQ;oCACN;wCACE+B,MAAMgE;wCACN1B,OAAO2B;oCACT;iCACD;gCACDL,YAAY;oCAAC;iCAAK;gCAClBL,cAAcS;gCACdH,IAAIH;4BACN;wBACF;wBAEA,IAAI7D,SAAS,QAAQ;4BACnB8D,cAAc,CAACK,IAAI,GAAG;gCACpBnE,MAAM;gCACN0D,cAAcS;gCACdH,IAAIH;4BACN;wBACF;oBACF;oBAEAjG,QAAQyG,YAAY,CAACzC,eAAe,GAAGkC;oBAEvC;gBACF;YACA,KAAK;gBAAU;oBACb,IAAIlG,QAAQiD,YAAY,EAAE;wBACxBT,WAAW,CAACG,UAAU,GAAG7C,YACvB;4BACEyC,MAAMG;4BACNN,MAAM;wBACR,GACAE;wBAEF;oBACF;oBAEA,MAAMsB,yBAAyBC,QAAQvB,MAAMwB,KAAK,EAAEC,cAAc3D;oBAElEkC,MAAMoE,MAAM,CAACrE,OAAO,CAAC,CAACsE;wBACpB,MAAMC,QAAQ,OAAOD,WAAW,WAAW3G,QAAQ8C,OAAO,CAAC4D,MAAM,CAACC,OAAO,GAAGA;wBAE5E,IAAIE,iBAAiBzH,gBAAgB;4BACnCY;4BACA+C,QAAQ6D;4BACR7F,iBAAiBK;4BACjB6C,QAAQ,GAAG7C,cAAc,QAAQ,CAAC;4BAClCK;4BACAyC,oBAAoB3C;wBACtB;wBAEA,IAAI,OAAOtB,kBAAkB,CAAC4G,eAAe,KAAK,aAAa;4BAC7D5G,kBAAkB,CAAC4G,eAAe,GAAG;wBACvC,OAAO,IACL,CAAC7G,QAAQ8G,SAAS,CAACD,eAAe,IAClC,CAAClH,iCAAiC;4BAChCiH;4BACAlB,WAAWpD,MAAMoD,SAAS;4BAC1BtE;4BACAyD,OAAO7E,QAAQ8G,SAAS,CAACD,eAAe;4BACxCE,cAAc/G,QAAQ8G,SAAS,CAAC,GAAGD,iBAAiB7G,QAAQsG,aAAa,EAAE,CAAC;wBAC9E,IACA;4BACArG,kBAAkB,CAAC4G,eAAe;4BAClCnH,sBAAsBkH,OAAO3G,kBAAkB,CAAC4G,eAAe;4BAC/DA,iBAAiB,GAAGA,eAAe,CAAC,EAAE5G,kBAAkB,CAAC4G,eAAe,EAAE;wBAC5E;wBACA,IAAIf,eAAe,CAAC,QAAQ,EAAEc,MAAMI,IAAI,EAAE;wBAC1C,IAAI,OAAOJ,KAAK,CAACnH,4BAA4B,KAAK,aAAa;4BAC7DqG,eAAe,CAAC,QAAQ,EAAEc,MAAMI,IAAI,CAAC,CAAC,EAAEJ,KAAK,CAACnH,4BAA4B,EAAE;wBAC9E;wBAEA,IAAI,CAACO,QAAQ8G,SAAS,CAACD,eAAe,EAAE;4BACtC,MAAM1C,cAAyC;gCAC7CC,QAAQ;oCACN7B,MAAM;oCACNH,MAAM;oCACNiC,SAAS;gCACX;gCACAC,WAAW;oCACT/B,MAAM;oCACNH,MAAMjB;oCACNkD,SAAS;gCACX;gCACA4C,OAAO;oCACL1E,MAAM;oCACNH,MAAM;oCACNiC,SAAS;gCACX;4BACF;4BAEA,MAAME,cAAwC;gCAC5CC,WAAW;oCACTjC,MAAM,GAAGsE,eAAe,UAAU,CAAC;oCACnClD,IAAI;gCACN;gCACAc,cAAc;oCACZlC,MAAM,GAAGsE,eAAe,cAAc,CAAC;oCACvClD,IAAI;wCAAC;qCAAY;gCACnB;gCACAuD,UAAU;oCACR3E,MAAM,GAAGsE,eAAe,SAAS,CAAC;oCAClClD,IAAI;gCACN;4BACF;4BAEA,MAAMe,kBAAiD;gCACrDyC,aAAa;oCACX5E,MAAM,GAAGsE,eAAe,aAAa,CAAC;oCACtC1G,SAAS;wCAAC;qCAAY;oCACtByE,gBAAgB;wCACd;4CACErC,MAAM;4CACNsC,OAAOzD;wCACT;qCACD;oCACD0D,UAAU;gCACZ;4BACF;4BAEA,MAAMC,cACJlB,QAAQhB,oBAAoB7C,QAAQ8C,OAAO,CAACC,MAAM,CAACC,YAAY,KAC/DxB,+BACAf;4BAEF,IAAIsE,aAAa;gCACfZ,YAAYa,OAAO,GAAG;oCACpBzC,MAAM;oCACNH,MAAM;oCACN6C,QAAQ;oCACRZ,SAAS;gCACX;gCAEAE,YAAYW,UAAU,GAAG;oCACvB3C,MAAM,GAAGsE,eAAe,WAAW,CAAC;oCACpClD,IAAI;gCACN;4BACF;4BAEA,MAAM,EACJ5B,6BAA6BoD,8BAA8B,EAC3DtD,2BAA2BuD,4BAA4B,EACvDzD,+BAA+B0D,gCAAgC,EAC/DvD,oBAAoBwD,qBAAqB,EACzC1D,kBAAkB2D,mBAAmB,EACrCtE,kBAAkBuE,mBAAmB,EACtC,GAAG5F,WAAW;gCACbI;gCACAmE;gCACAO;gCACAH;gCACAtE;gCACAG,gBAAgBwD;gCAChBvD,wBAAwB;gCACxBC;gCACAE,QAAQF,gBAAgBT,SAAS+G,MAAMnB,eAAe,IAAImB,MAAMnB,eAAe;gCAC/E3E,mBAAmBA,qBAAqBwB,MAAMoD,SAAS;gCACvDC,mBAAmB3E;gCACnBE;gCACAC;gCACAC;gCACAwE,yBAAyBtE;gCACzBD;gCACAwE,WAAWgB;gCACXtF;gCACAC,6BAA6BuD;4BAC/B;4BAEA,IAAII,gCAAgC;gCAClCpD,8BAA8BoD;4BAChC;4BAEA,IAAIE,kCAAkC;gCACpC1D,gCAAgC0D;4BAClC;4BAEA,IAAID,8BAA8B;gCAChCvD,4BAA4BuD;4BAC9B;4BAEA,IAAIG,qBAAqB;gCACvB,IAAI,CAAC3D,oBAAoB2D,wBAAwB,SAAS;oCACxD3D,mBAAmB2D;gCACrB;4BACF;4BAEA,IAAID,uBAAuB;gCACzB,IAAI,CAACxD,sBAAsBwD,0BAA0B,SAAS;oCAC5DxD,qBAAqBwD;gCACvB;4BACF;4BAEA,MAAM8B,iBAA8C;gCAClD9C,WAAW;oCACTlC,MAAM;oCACN5B,QAAQ;wCACN;4CACE+B,MAAM;4CACNsC,OAAOgC;wCACT;qCACD;oCACDV,YAAY;wCAAC;qCAAK;oCAClBL;oCACAM,IAAIhF;gCACN;4BACF;4BAEA,IACE7B,gBAAgB;gCACdiB,QAAQoG,MAAMpG,MAAM;gCACpBM,mBAAmBA,qBAAqBwB,MAAMoD,SAAS;4BACzD,IACA;gCACA0B,eAAef,QAAQ,GAAG;oCACxBjE,MAAM;oCACN0D,cAAc;oCACdM,IAAI,GAAGS,iBAAiB7G,QAAQsG,aAAa,EAAE;gCACjD;4BACF;4BAEAd,oBAAoBnD,OAAO,CAAC,CAAC,EAAED,IAAI,EAAEsD,SAAS,EAAEO,MAAM,EAAE,EAAEM;gCACxD,IAAInE,SAAS,OAAO;oCAClB,MAAMiF,qBAAqB3B,YACvB,GAAGmB,iBAAiB7G,QAAQsG,aAAa,EAAE,GAC3CO;oCAEJO,cAAc,CAACb,IAAI,GAAG;wCACpBnE,MAAM;wCACN5B,QAAQ;4CACN;gDACE+B,MAAMgE;gDACN1B,OAAOwC;4CACT;yCACD;wCACDlB,YAAY;4CAAC;yCAAK;wCAClBL,cAAcS;wCACdH,IAAIH;oCACN;gCACF;gCAEA,IAAI7D,SAAS,QAAQ;oCACnBgF,cAAc,CAACb,IAAI,GAAG;wCACpBnE,MAAM;wCACN0D,cAAcS;wCACdH,IAAIH;oCACN;gCACF;4BACF;4BAEAjG,QAAQyG,YAAY,CAACI,eAAe,GAAGO;wBACzC;wBAEA,mHAAmH;wBACnHlG,qBAAqB8E,GAAG,CAACF,cAAc;4BACrC1D,MAAM;4BACN,+CAA+C;4BAC/CsD,WAAW;4BACXO,QAAQY;wBACV;oBACF;oBAEA;gBACF;YACA,KAAK;gBAAY;oBACfrE,WAAW,CAACG,UAAU,GAAG7C,YACvB;wBACEyC,MAAMG;wBACNN,MAAM;oBACR,GACAE;oBAGF;gBACF;YAEA,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;gBAAY;oBACfE,WAAW,CAACG,UAAU,GAAG7C,YACvB;wBACEyC,MAAMG;wBACNN,MAAM;oBACR,GACAE;oBAGF;gBACF;YAEA,KAAK;gBAAQ;oBACXE,WAAW,CAACG,UAAU,GAAG7C,YACvB;wBACEyC,MAAMG;wBACNN,MAAM;wBACNkF,MAAM;wBACNC,WAAW;wBACXC,cAAc;oBAChB,GACAlF;oBAGF;gBACF;YAEA,KAAK;YACL,KAAK;gBAAO;oBACV,MAAMsB,yBAAyBC,QAAQvB,MAAMwB,KAAK,EAAEC,cAAc3D;oBAElE,MAAM,EACJsB,mBAAmB+F,sBAAsB,EACzC1F,6BAA6B2F,gCAAgC,EAC7D7F,2BAA2B8F,8BAA8B,EACzDhG,+BAA+BiG,kCAAkC,EACjE9F,oBAAoB+F,uBAAuB,EAC3CjG,kBAAkBkG,qBAAqB,EACxC,GAAG/H,eAAe;wBACjBC;wBACAC;wBACAC,cAAc,GAAGwC,WAAW,CAAC,CAAC;wBAC9BvC;wBACAC,gBAAgBwD;wBAChBtD;wBACAC,aAAa,GAAGoC,UAAU,CAAC,CAAC;wBAC5BnC,QAAQ8B,MAAMmD,eAAe;wBAC7BhF,gBAAgBoC,oBAAoBgB,QAAQpD;wBAC5CC;wBACAC;wBACAC;wBACAC,cAAc,GAAGE,gBAAgB,CAAC,EAAE2B,YAAY;wBAChD5B,mBAAmBA,qBAAqBwB,MAAMoD,SAAS;wBACvD3E;wBACAC;wBACAC;wBACAC;wBACAC;wBACAC;wBACAC;wBACAC;wBACAC;wBACAC,6BAA6BA,+BAA+BqB;oBAC9D;oBAEA,IAAI4E,wBAAwB;wBAC1B/F,oBAAoB;oBACtB;oBACA,IAAIkG,oCAAoC;wBACtCjG,gCAAgC;oBAClC;oBACA,IAAImG,uBAAuB;wBACzBlG,mBAAmB;oBACrB;oBACA,IAAI+F,gCAAgC;wBAClC9F,4BAA4B;oBAC9B;oBACA,IAAIgG,yBAAyB;wBAC3B/F,qBAAqB;oBACvB;oBACA,IAAI4F,kCAAkC;wBACpC3F,8BAA8B;oBAChC;oBACA;gBACF;YAEA,KAAK;YACL,KAAK;gBAAY;oBACfS,WAAW,CAACG,UAAU,GAAG7C,YACvB;wBACEyC,MAAMG;wBACNN,MAAM;oBACR,GACAE;oBAGF;gBACF;YAEA,KAAK;gBAAU;oBACb,IAAIA,MAAMY,OAAO,EAAE;wBACjB,MAAM6B,cACJlB,QAAQhB,oBAAoB7C,QAAQ8C,OAAO,CAACC,MAAM,CAACC,YAAY,KAC/DxB,+BACAf;wBAEF,IAAIsE,aAAa;4BACfhD,8BAA8B;wBAChC;wBAEA,IAAIO,MAAMc,KAAK,EAAE;4BACftB,qBAAqB;wBACvB,OAAO,IAAI,CAACA,oBAAoB;4BAC9BA,qBAAqB;wBACvB;wBAEA,IAAIQ,MAAMa,MAAM,EAAE;4BAChB,MAAM,IAAIrE,qBACR;wBAEJ;oBACF,OAAO;wBACL0D,WAAW,CAACG,UAAU,GAAG7C,YACvB;4BACEyC,MAAMG;4BACNN,MAAM;wBACR,GACAE;oBAEJ;oBAEA;gBACF;YAEA,KAAK;gBAAS;oBACZE,WAAW,CAACG,UAAU,GAAG7C,YACvB;wBACEyC,MAAMG;wBACNN,MAAM;oBACR,GACAE;oBAGF;gBACF;YAEA,KAAK;YACL,KAAK;gBAAU;oBACb,MAAMyF,WAAW3I,gBAAgB;wBAC/BY;wBACA+C,QAAQT;wBACRvB,iBAAiBF;wBACjBoD,QAAQ,CAAC,KAAK,EAAEpD,aAAa,CAAC,CAAC;wBAC/BoF,QAAQ;wBACRxE;oBACF;oBAEA,MAAMuG,UAAU1F,MAAM0F,OAAO,CAACC,GAAG,CAAC,CAACC;wBACjC,IAAIhJ,eAAegJ,SAAS;4BAC1B,OAAOA,OAAOC,KAAK;wBACrB;wBAEA,OAAOD;oBACT;oBAEA,IAAI5F,MAAMF,IAAI,KAAK,YAAYE,MAAMY,OAAO,EAAE;wBAC5C,MAAMkF,kBAAkBhJ,gBAAgB;4BACtCY;4BACA+C,QAAQT;4BACRvB,iBAAiBF;4BACjBoD,QAAQ,GAAGpD,aAAa,CAAC,CAAC;4BAC1BY;4BACAyC,oBAAoB3C;wBACtB;wBAEA,MAAM4C,cAAyC;4BAC7CkE,OAAO;gCACL9F,MAAM;gCACNH,MAAM;gCACNiC,SAAS;4BACX;4BACAiE,QAAQ;gCACN/F,MAAM;gCACNH,MAAMJ;gCACNqC,SAAS;4BACX;4BACA8D,OAAO;gCACL5F,MAAM;gCACNH,MAAM;gCACN2F,UAAU3I,gBAAgB;oCACxBY;oCACA+C,QAAQT;oCACRvB,iBAAiBF;oCACjBoD,QAAQ,CAAC,KAAK,EAAEpD,aAAa,CAAC,CAAC;oCAC/BoF,QAAQ;oCACRxE;gCACF;gCACAuG;4BACF;wBACF;wBAEA,MAAMzD,cAAwC;4BAC5CgE,UAAU;gCACRhG,MAAM,GAAG6F,gBAAgB,UAAU,CAAC;gCACpCzE,IAAI;4BACN;4BACA6E,WAAW;gCACTjG,MAAM,GAAG6F,gBAAgB,WAAW,CAAC;gCACrCzE,IAAI;4BACN;wBACF;wBAEA,MAAMe,kBAAiD;4BACrD+D,UAAU;gCACRlG,MAAM,GAAG6F,gBAAgB,UAAU,CAAC;gCACpCjI,SAAS;oCAAC;iCAAS;gCACnByE,gBAAgB;oCACd;wCACErC,MAAM;wCACNsC,OAAO9D;oCACT;iCACD;gCACD+D,UAAU;4BACZ;wBACF;wBAEA,MAAMC,cACJlB,QAAQhB,oBAAoB7C,QAAQ8C,OAAO,CAACC,MAAM,CAACC,YAAY,KAC/DxB,+BACAf;wBAEF,IAAIsE,aAAa;4BACfZ,YAAYc,MAAM,GAAG;gCACnB1C,MAAM;gCACNH,MAAM;gCACN6C,QAAQ;gCACRZ,SAAS;4BACX;4BAEAE,YAAYmE,SAAS,GAAG;gCACtBnG,MAAM,GAAG6F,gBAAgB,WAAW,CAAC;gCACrCzE,IAAI;4BACN;wBACF;wBAEA,IAAIrB,MAAMc,KAAK,EAAE;4BACfmB,YAAY4D,KAAK,GAAG;gCAClB5F,MAAM,GAAG6F,gBAAgB,UAAU,CAAC;gCACpCzE,IAAI;4BACN;wBACF;wBAEA/D,WAAW;4BACTI;4BACAmE;4BACAO;4BACAH;4BACAtE;4BACAG;4BACAE;4BACAE,QAAQ,EAAE;4BACVM,mBAAmBA,qBAAqBwB,MAAMoD,SAAS;4BACvDtE;4BACAC;4BACAwE,WAAWuC;4BACX7G;wBACF;wBAEAN,iBAAiB+E,GAAG,CAACrD,WAAW;4BAC9BP,MAAM;4BACN,yEAAyE;4BACzEsD,WAAW;4BACXO,QAAQmC;wBACV;wBAEApI,QAAQyG,YAAY,CAAC2B,gBAAgB,GAAG;4BACtCE,QAAQ;gCACNlG,MAAM;gCACN5B,QAAQ;oCACN;wCACE+B,MAAM;wCACNsC,OAAOuD;oCACT;iCACD;gCACDjC,YAAY;oCAAC;iCAAK;gCAClBL,cAAcnD;gCACdyD,IAAIrF;4BACN;wBACF;oBACF,OAAO;wBACLyB,WAAW,CAACG,UAAU,GAAG7C,YACvB;4BACEyC,MAAMG;4BACNN,MAAM;4BACN2F;4BACAC;wBACF,GACA1F;oBAEJ;oBACA;gBACF;YAEA,KAAK;YACL,KAAK;gBACH,IAAIe,MAAMC,OAAO,CAAChB,MAAMiB,UAAU,GAAG;oBACnCjB,MAAMiB,UAAU,CAAClB,OAAO,CAAC,CAACsG;wBACxB3H,cAAc4H,GAAG,CAACD;wBAClB,IAAIrG,MAAMa,MAAM,IAAI,CAAC7C,iBAAiB,CAACD,wBAAwB;4BAC7DiB,oBAAoBsH,GAAG,CAACD;wBAC1B;oBACF;gBACF,OAAO,IAAIrG,MAAMY,OAAO,EAAE;oBACxBlC,cAAc4H,GAAG,CAACtG,MAAMiB,UAAU;oBAClC,IAAIjB,MAAMa,MAAM,IAAI,CAAC7C,iBAAiB,CAACD,wBAAwB;wBAC7DiB,oBAAoBsH,GAAG,CAACtG,MAAMiB,UAAU;oBAC1C;gBACF,OAAO;oBACL,kGAAkG;oBAClG,MAAMsF,qBAAqB7I,QAAQ8C,OAAO,CAACgG,WAAW,CAACxG,MAAMiB,UAAU,CAAC,CAACR,MAAM;oBAE/E,MAAM8C,YAAY7F,QAAQ+I,YAAY,CAACC,GAAG,CAAC7J,YAAYmD,MAAMiB,UAAU;oBAEvE,4CAA4C;oBAC5C,IAAI0F,UAAkBzJ,WAAWQ,QAAQkJ,MAAM,IAAI,SAAS;oBAC5D,MAAMC,4BAA4BN,mBAAmBrI,MAAM,CAAC4I,IAAI,CAC9D,CAAC9G,QAAUvD,iBAAiBuD,UAAUA,MAAMC,IAAI,KAAK;oBAEvD,IAAI4G,2BAA2B/G,SAAS,UAAU;wBAChD6G,UAAU;oBACZ;oBACA,IAAIE,2BAA2B/G,SAAS,QAAQ;wBAC9C6G,UAAU;oBACZ;oBAEA,gFAAgF;oBAChFzG,WAAW,CAACG,UAAU,GAAG;wBACvBJ,MAAM,GAAGG,WAAW,GAAG,CAAC;wBACxBN,MAAM6G;wBACNI,WAAW;4BACT9G,MAAM;4BACNuC,UAAU;4BACVD,OAAOgB;wBACT;oBACF;oBAEA,4BAA4B;oBAC5B5E,iBAAiB+E,GAAG,CAACrD,WAAW;wBAC9BP,MAAM;wBACNsD,WAAW1F,QAAQ8C,OAAO,CAACC,MAAM,CAACC,YAAY,IAAKH,CAAAA,oBAAoBpC,cAAa;wBACpFwF,QAAQJ;oBACV;oBAEA,gCAAgC;oBAChC,IAAI,CAACzF,kBAAkBkC,MAAMgH,QAAQ,IAAI,CAAChH,MAAMwB,KAAK,EAAEC,WAAW;wBAChEvB,WAAW,CAACG,UAAU,CAAC0B,OAAO,GAAG;oBACnC;oBACA;gBACF;gBAEA,IACER,QAAQhB,oBAAoB7C,QAAQ8C,OAAO,CAACC,MAAM,CAACC,YAAY,KAC/DxB,6BACA;oBACAG,gCAAgC;gBAClC;gBAEA;YAEF,KAAK;gBAAQ;oBACX,IAAIW,MAAMY,OAAO,EAAE;wBACjB,MAAM6B,cACJlB,QAAQhB,oBAAoB7C,QAAQ8C,OAAO,CAACC,MAAM,CAACC,YAAY,KAC/DxB,+BACAf;wBAEF,IAAIsE,aAAa;4BACflD,4BAA4B;wBAC9B;wBAEA,IAAIS,MAAMc,KAAK,EAAE;4BACfxB,mBAAmB;wBACrB,OAAO,IAAI,CAACA,kBAAkB;4BAC5BA,mBAAmB;wBACrB;wBAEA,IAAIU,MAAMa,MAAM,EAAE;4BAChB,MAAM,IAAIrE,qBACR;wBAEJ;oBACF,OAAO;wBACL0D,WAAW,CAACG,UAAU,GAAG7C,YACvB;4BACEyC,MAAMG;4BACNN,MAAM;wBACR,GACAE;oBAEJ;oBACA;gBACF;YAEA;gBACE;QACJ;QAEA,MAAMyB,YAAYzB,MAAMwB,KAAK,IAAIxB,MAAMwB,KAAK,CAACC,SAAS;QAEtD,IACE,CAAC3D,kBACDoC,WAAW,CAACG,UAAU,IACtB,cAAcL,SACdA,MAAMgH,QAAQ,IACd,CAACvF,WACD;YACAvB,WAAW,CAACG,UAAU,CAAC0B,OAAO,GAAG;QACnC;IACF;IAEA,OAAO;QACL3C;QACAK;QACAF;QACAF;QACAG;QACAF;IACF;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/schema/traverseFields.ts"],"sourcesContent":["import type { FlattenedField } from 'payload'\n\nimport { InvalidConfiguration } from 'payload'\nimport {\n fieldAffectsData,\n fieldIsVirtual,\n fieldShouldBeLocalized,\n optionIsObject,\n} from 'payload/shared'\nimport toSnakeCase from 'to-snake-case'\n\nimport type {\n DrizzleAdapter,\n IDType,\n RawColumn,\n RawForeignKey,\n RawIndex,\n RawRelation,\n RelationMap,\n SetColumnID,\n} from '../types.js'\n\nimport { createTableName } from '../createTableName.js'\nimport { buildIndexName } from '../utilities/buildIndexName.js'\nimport { getArrayRelationName } from '../utilities/getArrayRelationName.js'\nimport { hasLocalesTable } from '../utilities/hasLocalesTable.js'\nimport { isUUIDType } from '../utilities/isUUIDType.js'\nimport {\n InternalBlockTableNameIndex,\n setInternalBlockIndex,\n validateExistingBlockIsIdentical,\n} from '../utilities/validateExistingBlockIsIdentical.js'\nimport { buildTable } from './build.js'\nimport { idToUUID } from './idToUUID.js'\nimport { withDefault } from './withDefault.js'\n\ntype Args = {\n adapter: DrizzleAdapter\n blocksTableNameMap: Record<string, number>\n columnPrefix?: string\n columns: Record<string, RawColumn>\n disableNotNull: boolean\n disableRelsTableUnique?: boolean\n disableUnique?: boolean\n fieldPrefix?: string\n fields: FlattenedField[]\n forceLocalized?: boolean\n indexes: Record<string, RawIndex>\n localesColumns: Record<string, RawColumn>\n localesIndexes: Record<string, RawIndex>\n newTableName: string\n parentIsLocalized: boolean\n parentTableName: string\n relationships: Set<string>\n relationsToBuild: RelationMap\n rootRelationsToBuild?: RelationMap\n rootTableIDColType: IDType\n rootTableName: string\n setColumnID: SetColumnID\n uniqueRelationships: Set<string>\n versions: boolean\n /**\n * Tracks whether or not this table is built\n * from the result of a localized array or block field at some point\n */\n withinLocalizedArrayOrBlock?: boolean\n}\n\ntype Result = {\n hasLocalizedField: boolean\n hasLocalizedManyNumberField: boolean\n hasLocalizedManyTextField: boolean\n hasLocalizedRelationshipField: boolean\n hasManyNumberField: 'index' | boolean\n hasManyTextField: 'index' | boolean\n}\n\nexport const traverseFields = ({\n adapter,\n blocksTableNameMap,\n columnPrefix,\n columns,\n disableNotNull,\n disableRelsTableUnique,\n disableUnique = false,\n fieldPrefix,\n fields,\n forceLocalized,\n indexes,\n localesColumns,\n localesIndexes,\n newTableName,\n parentIsLocalized,\n parentTableName,\n relationships,\n relationsToBuild,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName,\n setColumnID,\n uniqueRelationships,\n versions,\n withinLocalizedArrayOrBlock,\n}: Args): Result => {\n const throwValidationError = true\n let hasLocalizedField = false\n let hasLocalizedRelationshipField = false\n let hasManyTextField: 'index' | boolean = false\n let hasLocalizedManyTextField = false\n let hasManyNumberField: 'index' | boolean = false\n let hasLocalizedManyNumberField = false\n\n let parentIDColType: IDType = 'integer'\n\n const idColumn = columns.id\n\n if (idColumn && ['numeric', 'text', 'uuid', 'varchar'].includes(idColumn.type)) {\n parentIDColType = idColumn.type as IDType\n }\n\n fields.forEach((field) => {\n if ('name' in field && field.name === 'id') {\n return\n }\n if (fieldIsVirtual(field)) {\n return\n }\n\n let targetTable = columns\n let targetIndexes = indexes\n\n const columnName = `${columnPrefix || ''}${field.name[0] === '_' ? '_' : ''}${toSnakeCase(\n field.name,\n )}`\n const fieldName = `${fieldPrefix?.replace('.', '_') || ''}${field.name}`\n\n const isFieldLocalized = fieldShouldBeLocalized({ field, parentIsLocalized })\n\n // If field is localized,\n // add the column to the locale table instead of main table\n if (\n adapter.payload.config.localization &&\n (isFieldLocalized || forceLocalized) &&\n field.type !== 'array' &&\n (field.type !== 'blocks' || adapter.blocksAsJSON) &&\n (('hasMany' in field && field.hasMany !== true) || !('hasMany' in field))\n ) {\n hasLocalizedField = true\n targetTable = localesColumns\n targetIndexes = localesIndexes\n }\n\n if (\n (field.unique || field.index || ['relationship', 'upload'].includes(field.type)) &&\n !['array', 'blocks', 'group'].includes(field.type) &&\n !('hasMany' in field && field.hasMany === true) &&\n !('relationTo' in field && Array.isArray(field.relationTo))\n ) {\n const unique = disableUnique !== true && field.unique\n if (unique) {\n const constraintValue = `${fieldPrefix || ''}${field.name}`\n if (!adapter.fieldConstraints?.[rootTableName]) {\n adapter.fieldConstraints[rootTableName] = {}\n }\n adapter.fieldConstraints[rootTableName][`${columnName}_idx`] = constraintValue\n }\n\n const indexName = buildIndexName({ name: `${newTableName}_${columnName}`, adapter })\n\n targetIndexes[indexName] = {\n name: indexName,\n on: isFieldLocalized ? [fieldName, '_locale'] : fieldName,\n unique,\n }\n }\n\n switch (field.type) {\n case 'array': {\n const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull\n\n const arrayTableName = createTableName({\n adapter,\n config: field,\n parentTableName: newTableName,\n prefix: `${newTableName}_`,\n throwValidationError,\n versionsCustomName: versions,\n })\n\n const baseColumns: Record<string, RawColumn> = {\n _order: {\n name: '_order',\n type: 'integer',\n notNull: true,\n },\n _parentID: {\n name: '_parent_id',\n type: parentIDColType,\n notNull: true,\n },\n }\n\n const baseIndexes: Record<string, RawIndex> = {\n _orderIdx: {\n name: `${arrayTableName}_order_idx`,\n on: ['_order'],\n },\n _parentIDIdx: {\n name: `${arrayTableName}_parent_id_idx`,\n on: '_parentID',\n },\n }\n\n const baseForeignKeys: Record<string, RawForeignKey> = {\n _parentIDFk: {\n name: `${arrayTableName}_parent_id_fk`,\n columns: ['_parentID'],\n foreignColumns: [\n {\n name: 'id',\n table: parentTableName,\n },\n ],\n onDelete: 'cascade',\n },\n }\n\n const isLocalized =\n Boolean(isFieldLocalized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock ||\n forceLocalized\n\n if (isLocalized) {\n baseColumns._locale = {\n name: '_locale',\n type: 'enum',\n locale: true,\n notNull: true,\n }\n\n baseIndexes._localeIdx = {\n name: `${arrayTableName}_locale_idx`,\n on: '_locale',\n }\n }\n\n const {\n hasLocalizedManyNumberField: subHasLocalizedManyNumberField,\n hasLocalizedManyTextField: subHasLocalizedManyTextField,\n hasLocalizedRelationshipField: subHasLocalizedRelationshipField,\n hasManyNumberField: subHasManyNumberField,\n hasManyTextField: subHasManyTextField,\n relationsToBuild: subRelationsToBuild,\n } = buildTable({\n adapter,\n baseColumns,\n baseForeignKeys,\n baseIndexes,\n blocksTableNameMap,\n disableNotNull: disableNotNullFromHere,\n disableRelsTableUnique: true,\n disableUnique,\n fields: disableUnique ? idToUUID(field.flattenedFields) : field.flattenedFields,\n parentIsLocalized: parentIsLocalized || field.localized,\n rootRelationships: relationships,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName,\n rootUniqueRelationships: uniqueRelationships,\n setColumnID,\n tableName: arrayTableName,\n versions,\n withinLocalizedArrayOrBlock: isLocalized,\n })\n\n if (subHasLocalizedManyNumberField) {\n hasLocalizedManyNumberField = subHasLocalizedManyNumberField\n }\n\n if (subHasLocalizedRelationshipField) {\n hasLocalizedRelationshipField = subHasLocalizedRelationshipField\n }\n\n if (subHasLocalizedManyTextField) {\n hasLocalizedManyTextField = subHasLocalizedManyTextField\n }\n\n if (subHasManyTextField) {\n if (!hasManyTextField || subHasManyTextField === 'index') {\n hasManyTextField = subHasManyTextField\n }\n }\n if (subHasManyNumberField) {\n if (!hasManyNumberField || subHasManyNumberField === 'index') {\n hasManyNumberField = subHasManyNumberField\n }\n }\n\n const relationName = getArrayRelationName({\n field,\n path: fieldName,\n tableName: arrayTableName,\n })\n\n relationsToBuild.set(relationName, {\n type: 'many',\n // arrays have their own localized table, independent of the base table.\n localized: false,\n target: arrayTableName,\n })\n\n const arrayRelations: Record<string, RawRelation> = {\n _parentID: {\n type: 'one',\n fields: [\n {\n name: '_parentID',\n table: arrayTableName,\n },\n ],\n references: ['id'],\n relationName,\n to: parentTableName,\n },\n }\n\n if (\n hasLocalesTable({\n fields: field.fields,\n parentIsLocalized: parentIsLocalized || field.localized,\n })\n ) {\n arrayRelations._locales = {\n type: 'many',\n relationName: '_locales',\n to: `${arrayTableName}${adapter.localesSuffix}`,\n }\n }\n\n subRelationsToBuild.forEach(({ type, localized, target }, key) => {\n if (type === 'one') {\n const arrayWithLocalized = localized\n ? `${arrayTableName}${adapter.localesSuffix}`\n : arrayTableName\n\n arrayRelations[key] = {\n type: 'one',\n fields: [\n {\n name: key,\n table: arrayWithLocalized,\n },\n ],\n references: ['id'],\n relationName: key,\n to: target,\n }\n }\n\n if (type === 'many') {\n arrayRelations[key] = {\n type: 'many',\n relationName: key,\n to: target,\n }\n }\n })\n\n adapter.rawRelations[arrayTableName] = arrayRelations\n\n break\n }\n case 'blocks': {\n if (adapter.blocksAsJSON) {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'jsonb',\n },\n field,\n )\n break\n }\n\n const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull\n\n field.blocks.forEach((_block) => {\n const block = typeof _block === 'string' ? adapter.payload.blocks[_block] : _block\n\n let blockTableName = createTableName({\n adapter,\n config: block,\n parentTableName: rootTableName,\n prefix: `${rootTableName}_blocks_`,\n throwValidationError,\n versionsCustomName: versions,\n })\n\n const isLocalizedBlockTable =\n Boolean(isFieldLocalized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock ||\n forceLocalized\n\n if (typeof blocksTableNameMap[blockTableName] === 'undefined') {\n blocksTableNameMap[blockTableName] = 1\n } else if (\n !adapter.rawTables[blockTableName] ||\n !validateExistingBlockIsIdentical({\n block,\n localized: isLocalizedBlockTable,\n parentIsLocalized,\n table: adapter.rawTables[blockTableName],\n tableLocales: adapter.rawTables[`${blockTableName}${adapter.localesSuffix}`],\n })\n ) {\n blocksTableNameMap[blockTableName]++\n setInternalBlockIndex(block, blocksTableNameMap[blockTableName])\n blockTableName = `${blockTableName}_${blocksTableNameMap[blockTableName]}`\n }\n let relationName = `_blocks_${block.slug}`\n if (typeof block[InternalBlockTableNameIndex] !== 'undefined') {\n relationName = `_blocks_${block.slug}_${block[InternalBlockTableNameIndex]}`\n }\n\n if (!adapter.rawTables[blockTableName]) {\n const baseColumns: Record<string, RawColumn> = {\n _order: {\n name: '_order',\n type: 'integer',\n notNull: true,\n },\n _parentID: {\n name: '_parent_id',\n type: rootTableIDColType,\n notNull: true,\n },\n _path: {\n name: '_path',\n type: 'text',\n notNull: true,\n },\n }\n\n const baseIndexes: Record<string, RawIndex> = {\n _orderIdx: {\n name: `${blockTableName}_order_idx`,\n on: '_order',\n },\n _parentIDIdx: {\n name: `${blockTableName}_parent_id_idx`,\n on: ['_parentID'],\n },\n _pathIdx: {\n name: `${blockTableName}_path_idx`,\n on: '_path',\n },\n }\n\n const baseForeignKeys: Record<string, RawForeignKey> = {\n _parentIdFk: {\n name: `${blockTableName}_parent_id_fk`,\n columns: ['_parentID'],\n foreignColumns: [\n {\n name: 'id',\n table: rootTableName,\n },\n ],\n onDelete: 'cascade',\n },\n }\n\n if (isLocalizedBlockTable) {\n baseColumns._locale = {\n name: '_locale',\n type: 'enum',\n locale: true,\n notNull: true,\n }\n\n baseIndexes._localeIdx = {\n name: `${blockTableName}_locale_idx`,\n on: '_locale',\n }\n }\n\n const {\n hasLocalizedManyNumberField: subHasLocalizedManyNumberField,\n hasLocalizedManyTextField: subHasLocalizedManyTextField,\n hasLocalizedRelationshipField: subHasLocalizedRelationshipField,\n hasManyNumberField: subHasManyNumberField,\n hasManyTextField: subHasManyTextField,\n relationsToBuild: subRelationsToBuild,\n } = buildTable({\n adapter,\n baseColumns,\n baseForeignKeys,\n baseIndexes,\n blocksTableNameMap,\n disableNotNull: disableNotNullFromHere,\n disableRelsTableUnique: true,\n disableUnique,\n fields: disableUnique ? idToUUID(block.flattenedFields) : block.flattenedFields,\n parentIsLocalized: parentIsLocalized || field.localized,\n rootRelationships: relationships,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName,\n rootUniqueRelationships: uniqueRelationships,\n setColumnID,\n tableName: blockTableName,\n versions,\n withinLocalizedArrayOrBlock: isLocalizedBlockTable,\n })\n\n if (subHasLocalizedManyNumberField) {\n hasLocalizedManyNumberField = subHasLocalizedManyNumberField\n }\n\n if (subHasLocalizedRelationshipField) {\n hasLocalizedRelationshipField = subHasLocalizedRelationshipField\n }\n\n if (subHasLocalizedManyTextField) {\n hasLocalizedManyTextField = subHasLocalizedManyTextField\n }\n\n if (subHasManyTextField) {\n if (!hasManyTextField || subHasManyTextField === 'index') {\n hasManyTextField = subHasManyTextField\n }\n }\n\n if (subHasManyNumberField) {\n if (!hasManyNumberField || subHasManyNumberField === 'index') {\n hasManyNumberField = subHasManyNumberField\n }\n }\n\n const blockRelations: Record<string, RawRelation> = {\n _parentID: {\n type: 'one',\n fields: [\n {\n name: '_parentID',\n table: blockTableName,\n },\n ],\n references: ['id'],\n relationName,\n to: rootTableName,\n },\n }\n\n if (\n hasLocalesTable({\n fields: block.fields,\n parentIsLocalized: parentIsLocalized || field.localized,\n })\n ) {\n blockRelations._locales = {\n type: 'many',\n relationName: '_locales',\n to: `${blockTableName}${adapter.localesSuffix}`,\n }\n }\n\n subRelationsToBuild.forEach(({ type, localized, target }, key) => {\n if (type === 'one') {\n const blockWithLocalized = localized\n ? `${blockTableName}${adapter.localesSuffix}`\n : blockTableName\n\n blockRelations[key] = {\n type: 'one',\n fields: [\n {\n name: key,\n table: blockWithLocalized,\n },\n ],\n references: ['id'],\n relationName: key,\n to: target,\n }\n }\n\n if (type === 'many') {\n blockRelations[key] = {\n type: 'many',\n relationName: key,\n to: target,\n }\n }\n })\n\n adapter.rawRelations[blockTableName] = blockRelations\n }\n\n // blocks relationships are defined from the collection or globals table down to the block, bypassing any subBlocks\n rootRelationsToBuild.set(relationName, {\n type: 'many',\n // blocks are not localized on the parent table\n localized: false,\n target: blockTableName,\n })\n })\n\n break\n }\n case 'checkbox': {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'boolean',\n },\n field,\n )\n\n break\n }\n\n case 'code':\n case 'email':\n case 'slug':\n case 'textarea': {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'varchar',\n },\n field,\n )\n\n break\n }\n\n case 'date': {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'timestamp',\n mode: 'string',\n precision: 3,\n withTimezone: true,\n },\n field,\n )\n\n break\n }\n\n case 'group':\n case 'tab': {\n const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull\n\n const {\n hasLocalizedField: groupHasLocalizedField,\n hasLocalizedManyNumberField: groupHasLocalizedManyNumberField,\n hasLocalizedManyTextField: groupHasLocalizedManyTextField,\n hasLocalizedRelationshipField: groupHasLocalizedRelationshipField,\n hasManyNumberField: groupHasManyNumberField,\n hasManyTextField: groupHasManyTextField,\n } = traverseFields({\n adapter,\n blocksTableNameMap,\n columnPrefix: `${columnName}_`,\n columns,\n disableNotNull: disableNotNullFromHere,\n disableUnique,\n fieldPrefix: `${fieldName}.`,\n fields: field.flattenedFields,\n forceLocalized: isFieldLocalized || Boolean(forceLocalized),\n indexes,\n localesColumns,\n localesIndexes,\n newTableName: `${parentTableName}_${columnName}`,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentTableName,\n relationships,\n relationsToBuild,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName,\n setColumnID,\n uniqueRelationships,\n versions,\n withinLocalizedArrayOrBlock: withinLocalizedArrayOrBlock || isFieldLocalized,\n })\n\n if (groupHasLocalizedField) {\n hasLocalizedField = true\n }\n if (groupHasLocalizedRelationshipField) {\n hasLocalizedRelationshipField = true\n }\n if (groupHasManyTextField) {\n hasManyTextField = true\n }\n if (groupHasLocalizedManyTextField) {\n hasLocalizedManyTextField = true\n }\n if (groupHasManyNumberField) {\n hasManyNumberField = true\n }\n if (groupHasLocalizedManyNumberField) {\n hasLocalizedManyNumberField = true\n }\n break\n }\n\n case 'json':\n case 'richText': {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'jsonb',\n },\n field,\n )\n\n break\n }\n\n case 'number': {\n if (field.hasMany) {\n const isLocalized =\n Boolean(isFieldLocalized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock ||\n forceLocalized\n\n if (isLocalized) {\n hasLocalizedManyNumberField = true\n }\n\n if (field.index) {\n hasManyNumberField = 'index'\n } else if (!hasManyNumberField) {\n hasManyNumberField = true\n }\n\n if (field.unique) {\n throw new InvalidConfiguration(\n 'Unique is not supported in Postgres for hasMany number fields.',\n )\n }\n } else {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'numeric',\n },\n field,\n )\n }\n\n break\n }\n\n case 'point': {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'geometry',\n },\n field,\n )\n\n break\n }\n\n case 'radio':\n case 'select': {\n const enumName = createTableName({\n adapter,\n config: field,\n parentTableName: newTableName,\n prefix: `enum_${newTableName}_`,\n target: 'enumName',\n throwValidationError,\n })\n\n const options = field.options.map((option) => {\n if (optionIsObject(option)) {\n return option.value\n }\n\n return option\n })\n\n if (field.type === 'select' && field.hasMany) {\n const selectTableName = createTableName({\n adapter,\n config: field,\n parentTableName: newTableName,\n prefix: `${newTableName}_`,\n throwValidationError,\n versionsCustomName: versions,\n })\n\n const baseColumns: Record<string, RawColumn> = {\n order: {\n name: 'order',\n type: 'integer',\n notNull: true,\n },\n parent: {\n name: 'parent_id',\n type: parentIDColType,\n notNull: true,\n },\n value: {\n name: 'value',\n type: 'enum',\n enumName: createTableName({\n adapter,\n config: field,\n parentTableName: newTableName,\n prefix: `enum_${newTableName}_`,\n target: 'enumName',\n throwValidationError,\n }),\n options,\n },\n }\n\n const baseIndexes: Record<string, RawIndex> = {\n orderIdx: {\n name: `${selectTableName}_order_idx`,\n on: 'order',\n },\n parentIdx: {\n name: `${selectTableName}_parent_idx`,\n on: 'parent',\n },\n }\n\n const baseForeignKeys: Record<string, RawForeignKey> = {\n parentFk: {\n name: `${selectTableName}_parent_fk`,\n columns: ['parent'],\n foreignColumns: [\n {\n name: 'id',\n table: parentTableName,\n },\n ],\n onDelete: 'cascade',\n },\n }\n\n const isLocalized =\n Boolean(isFieldLocalized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock ||\n forceLocalized\n\n if (isLocalized) {\n baseColumns.locale = {\n name: 'locale',\n type: 'enum',\n locale: true,\n notNull: true,\n }\n\n baseIndexes.localeIdx = {\n name: `${selectTableName}_locale_idx`,\n on: 'locale',\n }\n }\n\n if (field.index) {\n baseIndexes.value = {\n name: `${selectTableName}_value_idx`,\n on: 'value',\n }\n }\n\n buildTable({\n adapter,\n baseColumns,\n baseForeignKeys,\n baseIndexes,\n blocksTableNameMap,\n disableNotNull,\n disableUnique,\n fields: [],\n parentIsLocalized: parentIsLocalized || field.localized,\n rootTableName,\n setColumnID,\n tableName: selectTableName,\n versions,\n })\n\n relationsToBuild.set(fieldName, {\n type: 'many',\n // selects have their own localized table, independent of the base table.\n localized: false,\n target: selectTableName,\n })\n\n adapter.rawRelations[selectTableName] = {\n parent: {\n type: 'one',\n fields: [\n {\n name: 'parent',\n table: selectTableName,\n },\n ],\n references: ['id'],\n relationName: fieldName,\n to: parentTableName,\n },\n }\n } else {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'enum',\n enumName,\n options,\n },\n field,\n )\n }\n break\n }\n\n case 'relationship':\n case 'upload':\n if (Array.isArray(field.relationTo)) {\n field.relationTo.forEach((relation) => {\n relationships.add(relation)\n if (field.unique && !disableUnique && !disableRelsTableUnique) {\n uniqueRelationships.add(relation)\n }\n })\n } else if (field.hasMany) {\n relationships.add(field.relationTo)\n if (field.unique && !disableUnique && !disableRelsTableUnique) {\n uniqueRelationships.add(field.relationTo)\n }\n } else {\n // simple relationships get a column on the targetTable with a foreign key to the relationTo table\n const relationshipConfig = adapter.payload.collections[field.relationTo].config\n\n const tableName = adapter.tableNameMap.get(toSnakeCase(field.relationTo))\n\n // get the id type of the related collection\n let colType: IDType = isUUIDType(adapter.idType) ? 'uuid' : 'integer'\n const relatedCollectionCustomID = relationshipConfig.fields.find(\n (field) => fieldAffectsData(field) && field.name === 'id',\n )\n if (relatedCollectionCustomID?.type === 'number') {\n colType = 'numeric'\n }\n if (relatedCollectionCustomID?.type === 'text') {\n colType = 'varchar'\n }\n\n // make the foreign key column for relationship using the correct id column type\n targetTable[fieldName] = {\n name: `${columnName}_id`,\n type: colType,\n reference: {\n name: 'id',\n onDelete: 'set null',\n table: tableName,\n },\n }\n\n // add relationship to table\n relationsToBuild.set(fieldName, {\n type: 'one',\n localized: adapter.payload.config.localization && (isFieldLocalized || forceLocalized),\n target: tableName,\n })\n\n // add notNull when not required\n if (!disableNotNull && field.required && !field.admin?.condition) {\n targetTable[fieldName].notNull = true\n }\n break\n }\n\n if (\n Boolean(isFieldLocalized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock\n ) {\n hasLocalizedRelationshipField = true\n }\n\n break\n\n case 'text': {\n if (field.hasMany) {\n const isLocalized =\n Boolean(isFieldLocalized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock ||\n forceLocalized\n\n if (isLocalized) {\n hasLocalizedManyTextField = true\n }\n\n if (field.index) {\n hasManyTextField = 'index'\n } else if (!hasManyTextField) {\n hasManyTextField = true\n }\n\n if (field.unique) {\n throw new InvalidConfiguration(\n 'Unique is not supported in Postgres for hasMany text fields.',\n )\n }\n } else {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'varchar',\n },\n field,\n )\n }\n break\n }\n\n default:\n break\n }\n\n const condition = field.admin && field.admin.condition\n\n if (\n !disableNotNull &&\n targetTable[fieldName] &&\n 'required' in field &&\n field.required &&\n !condition\n ) {\n targetTable[fieldName].notNull = true\n }\n })\n\n return {\n hasLocalizedField,\n hasLocalizedManyNumberField,\n hasLocalizedManyTextField,\n hasLocalizedRelationshipField,\n hasManyNumberField,\n hasManyTextField,\n }\n}\n"],"names":["InvalidConfiguration","fieldAffectsData","fieldIsVirtual","fieldShouldBeLocalized","optionIsObject","toSnakeCase","createTableName","buildIndexName","getArrayRelationName","hasLocalesTable","isUUIDType","InternalBlockTableNameIndex","setInternalBlockIndex","validateExistingBlockIsIdentical","buildTable","idToUUID","withDefault","traverseFields","adapter","blocksTableNameMap","columnPrefix","columns","disableNotNull","disableRelsTableUnique","disableUnique","fieldPrefix","fields","forceLocalized","indexes","localesColumns","localesIndexes","newTableName","parentIsLocalized","parentTableName","relationships","relationsToBuild","rootRelationsToBuild","rootTableIDColType","rootTableName","setColumnID","uniqueRelationships","versions","withinLocalizedArrayOrBlock","throwValidationError","hasLocalizedField","hasLocalizedRelationshipField","hasManyTextField","hasLocalizedManyTextField","hasManyNumberField","hasLocalizedManyNumberField","parentIDColType","idColumn","id","includes","type","forEach","field","name","targetTable","targetIndexes","columnName","fieldName","replace","isFieldLocalized","payload","config","localization","blocksAsJSON","hasMany","unique","index","Array","isArray","relationTo","constraintValue","fieldConstraints","indexName","on","disableNotNullFromHere","Boolean","admin","condition","arrayTableName","prefix","versionsCustomName","baseColumns","_order","notNull","_parentID","baseIndexes","_orderIdx","_parentIDIdx","baseForeignKeys","_parentIDFk","foreignColumns","table","onDelete","isLocalized","_locale","locale","_localeIdx","subHasLocalizedManyNumberField","subHasLocalizedManyTextField","subHasLocalizedRelationshipField","subHasManyNumberField","subHasManyTextField","subRelationsToBuild","flattenedFields","localized","rootRelationships","rootUniqueRelationships","tableName","relationName","path","set","target","arrayRelations","references","to","_locales","localesSuffix","key","arrayWithLocalized","rawRelations","blocks","_block","block","blockTableName","isLocalizedBlockTable","rawTables","tableLocales","slug","_path","_pathIdx","_parentIdFk","blockRelations","blockWithLocalized","mode","precision","withTimezone","groupHasLocalizedField","groupHasLocalizedManyNumberField","groupHasLocalizedManyTextField","groupHasLocalizedRelationshipField","groupHasManyNumberField","groupHasManyTextField","enumName","options","map","option","value","selectTableName","order","parent","orderIdx","parentIdx","parentFk","localeIdx","relation","add","relationshipConfig","collections","tableNameMap","get","colType","idType","relatedCollectionCustomID","find","reference","required"],"mappings":"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"}
@@ -1,11 +1,12 @@
1
- import { sanitizePathSegment } from '../../utilities/sanitizePathSegment.js';
1
+ import { parseJSONPathSegment } from '../../utilities/parseJSONPathSegment.js';
2
2
  export const convertPathToJSONTraversal = (incomingSegments)=>{
3
3
  const segments = [
4
4
  ...incomingSegments
5
5
  ];
6
6
  segments.shift();
7
7
  return segments.reduce((res, segment, i)=>{
8
- const formattedSegment = Number.isNaN(parseInt(segment)) ? `'${sanitizePathSegment(segment)}'` : segment;
8
+ const parsedSegment = parseJSONPathSegment(segment);
9
+ const formattedSegment = parsedSegment.type === 'objectKey' ? `'${parsedSegment.value}'` : parsedSegment.value;
9
10
  const isLast = i === segments.length - 1;
10
11
  return `${res}${isLast ? '->>' : '->'}${formattedSegment}`;
11
12
  }, '');
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/sqlite/createJSONQuery/convertPathToJSONTraversal.ts"],"sourcesContent":["import { sanitizePathSegment } from '../../utilities/sanitizePathSegment.js'\n\nexport const convertPathToJSONTraversal = (incomingSegments: string[]): string => {\n const segments = [...incomingSegments]\n segments.shift()\n\n return segments.reduce((res, segment, i) => {\n const formattedSegment = Number.isNaN(parseInt(segment))\n ? `'${sanitizePathSegment(segment)}'`\n : segment\n const isLast = i === segments.length - 1\n return `${res}${isLast ? '->>' : '->'}${formattedSegment}`\n }, '')\n}\n"],"names":["sanitizePathSegment","convertPathToJSONTraversal","incomingSegments","segments","shift","reduce","res","segment","i","formattedSegment","Number","isNaN","parseInt","isLast","length"],"mappings":"AAAA,SAASA,mBAAmB,QAAQ,yCAAwC;AAE5E,OAAO,MAAMC,6BAA6B,CAACC;IACzC,MAAMC,WAAW;WAAID;KAAiB;IACtCC,SAASC,KAAK;IAEd,OAAOD,SAASE,MAAM,CAAC,CAACC,KAAKC,SAASC;QACpC,MAAMC,mBAAmBC,OAAOC,KAAK,CAACC,SAASL,YAC3C,CAAC,CAAC,EAAEP,oBAAoBO,SAAS,CAAC,CAAC,GACnCA;QACJ,MAAMM,SAASL,MAAML,SAASW,MAAM,GAAG;QACvC,OAAO,GAAGR,MAAMO,SAAS,QAAQ,OAAOJ,kBAAkB;IAC5D,GAAG;AACL,EAAC"}
1
+ {"version":3,"sources":["../../../src/sqlite/createJSONQuery/convertPathToJSONTraversal.ts"],"sourcesContent":["import { parseJSONPathSegment } from '../../utilities/parseJSONPathSegment.js'\n\nexport const convertPathToJSONTraversal = (incomingSegments: string[]): string => {\n const segments = [...incomingSegments]\n segments.shift()\n\n return segments.reduce((res, segment, i) => {\n const parsedSegment = parseJSONPathSegment(segment)\n const formattedSegment =\n parsedSegment.type === 'objectKey' ? `'${parsedSegment.value}'` : parsedSegment.value\n const isLast = i === segments.length - 1\n return `${res}${isLast ? '->>' : '->'}${formattedSegment}`\n }, '')\n}\n"],"names":["parseJSONPathSegment","convertPathToJSONTraversal","incomingSegments","segments","shift","reduce","res","segment","i","parsedSegment","formattedSegment","type","value","isLast","length"],"mappings":"AAAA,SAASA,oBAAoB,QAAQ,0CAAyC;AAE9E,OAAO,MAAMC,6BAA6B,CAACC;IACzC,MAAMC,WAAW;WAAID;KAAiB;IACtCC,SAASC,KAAK;IAEd,OAAOD,SAASE,MAAM,CAAC,CAACC,KAAKC,SAASC;QACpC,MAAMC,gBAAgBT,qBAAqBO;QAC3C,MAAMG,mBACJD,cAAcE,IAAI,KAAK,cAAc,CAAC,CAAC,EAAEF,cAAcG,KAAK,CAAC,CAAC,CAAC,GAAGH,cAAcG,KAAK;QACvF,MAAMC,SAASL,MAAML,SAASW,MAAM,GAAG;QACvC,OAAO,GAAGR,MAAMO,SAAS,QAAQ,OAAOH,kBAAkB;IAC5D,GAAG;AACL,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/sqlite/createJSONQuery/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AA8GzD,eAAO,MAAM,eAAe,iGASzB,mBAAmB,KAAG,MA0BxB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/sqlite/createJSONQuery/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAgHzD,eAAO,MAAM,eAAe,iGASzB,mBAAmB,KAAG,MA2BxB,CAAA"}
@@ -16,7 +16,7 @@ const fromArray = ({ isRoot, operator, pathSegments, table, treatAsArray, value
16
16
  })}
17
17
  )`;
18
18
  };
19
- const createConstraint = ({ alias, operator, pathSegments, value })=>{
19
+ const createConstraint = ({ alias, operator, pathSegments, rootColumn, value })=>{
20
20
  const newAlias = `${pathSegments[0]}_alias_${pathSegments.length - 1}`;
21
21
  if (operator === 'exists' && value === false) {
22
22
  operator = 'not_exists';
@@ -27,7 +27,7 @@ const createConstraint = ({ alias, operator, pathSegments, value })=>{
27
27
  }
28
28
  if (operator === 'exists') {
29
29
  if (pathSegments.length === 1) {
30
- return `EXISTS (SELECT 1 FROM json_each("${sanitizePathSegment(pathSegments[0])}") AS ${newAlias})`;
30
+ return `EXISTS (SELECT 1 FROM json_each(${rootColumn ?? `"${sanitizePathSegment(pathSegments[0])}"`}) AS ${newAlias})`;
31
31
  }
32
32
  return `EXISTS (
33
33
  SELECT 1
@@ -37,7 +37,7 @@ const createConstraint = ({ alias, operator, pathSegments, value })=>{
37
37
  }
38
38
  if (operator === 'not_exists') {
39
39
  if (pathSegments.length === 1) {
40
- return `NOT EXISTS (SELECT 1 FROM json_each("${sanitizePathSegment(pathSegments[0])}") AS ${newAlias})`;
40
+ return `NOT EXISTS (SELECT 1 FROM json_each(${rootColumn ?? `"${sanitizePathSegment(pathSegments[0])}"`}) AS ${newAlias})`;
41
41
  }
42
42
  return `NOT EXISTS (
43
43
  SELECT 1
@@ -63,7 +63,7 @@ const createConstraint = ({ alias, operator, pathSegments, value })=>{
63
63
  formattedOperator = '=';
64
64
  }
65
65
  if (pathSegments.length === 1) {
66
- return `EXISTS (SELECT 1 FROM json_each("${sanitizePathSegment(pathSegments[0])}") AS ${newAlias} WHERE ${newAlias}.value ${formattedOperator} '${formattedValue}')`;
66
+ return `EXISTS (SELECT 1 FROM json_each(${rootColumn ?? `"${sanitizePathSegment(pathSegments[0])}"`}) AS ${newAlias} WHERE ${newAlias}.value ${formattedOperator} '${formattedValue}')`;
67
67
  }
68
68
  return `EXISTS (
69
69
  SELECT 1
@@ -86,7 +86,7 @@ export const createJSONQuery = ({ column, operator, pathSegments, rawColumn, tab
86
86
  value: v
87
87
  })} ${i === value.length - 1 ? '' : ` ${operator === 'in' ? 'OR' : 'AND'} `}`;
88
88
  }
89
- return sql;
89
+ return `(${sql})`;
90
90
  }
91
91
  if (treatAsArray?.includes(pathSegments[1]) && table) {
92
92
  return fromArray({
@@ -101,6 +101,7 @@ export const createJSONQuery = ({ column, operator, pathSegments, rawColumn, tab
101
101
  alias: table,
102
102
  operator,
103
103
  pathSegments,
104
+ rootColumn: typeof column === 'string' ? column : column ? `"${column.name}"` : undefined,
104
105
  treatAsArray,
105
106
  value: value
106
107
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/sqlite/createJSONQuery/index.ts"],"sourcesContent":["import type { CreateJSONQueryArgs } from '../../types.js'\n\nimport { escapeSQLValue } from '../../utilities/escapeSQLValue.js'\nimport { sanitizePathSegment } from '../../utilities/sanitizePathSegment.js'\n\ntype FromArrayArgs = {\n isRoot?: true\n operator: string\n pathSegments: string[]\n table: string\n treatAsArray?: string[]\n value: boolean | number | string\n}\n\nconst fromArray = ({\n isRoot,\n operator,\n pathSegments,\n table,\n treatAsArray,\n value,\n}: FromArrayArgs) => {\n const newPathSegments = pathSegments.slice(1)\n const sanitizedSegment = sanitizePathSegment(pathSegments[isRoot ? 0 : 1])\n const alias = `${sanitizedSegment}_alias_${newPathSegments.length}`\n\n return `EXISTS (\n SELECT 1\n FROM json_each(${table}.${sanitizePathSegment(pathSegments[0])}) AS ${alias}\n WHERE ${createJSONQuery({\n operator,\n pathSegments: newPathSegments,\n table: alias,\n treatAsArray,\n value,\n })}\n )`\n}\n\ntype CreateConstraintArgs = {\n alias?: string\n operator: string\n pathSegments: string[]\n treatAsArray?: string[]\n value: boolean | number | string\n}\n\nconst createConstraint = ({\n alias,\n operator,\n pathSegments,\n value,\n}: CreateConstraintArgs): string => {\n const newAlias = `${pathSegments[0]}_alias_${pathSegments.length - 1}`\n\n if (operator === 'exists' && value === false) {\n operator = 'not_exists'\n value = true\n } else if (operator === 'not_exists' && value === false) {\n operator = 'exists'\n value = true\n }\n\n if (operator === 'exists') {\n if (pathSegments.length === 1) {\n return `EXISTS (SELECT 1 FROM json_each(\"${sanitizePathSegment(pathSegments[0])}\") AS ${newAlias})`\n }\n\n return `EXISTS (\n SELECT 1\n FROM json_each(${alias}.value -> '${sanitizePathSegment(pathSegments[0])}') AS ${newAlias}\n WHERE ${newAlias}.key = '${sanitizePathSegment(pathSegments[1])}'\n )`\n }\n\n if (operator === 'not_exists') {\n if (pathSegments.length === 1) {\n return `NOT EXISTS (SELECT 1 FROM json_each(\"${sanitizePathSegment(pathSegments[0])}\") AS ${newAlias})`\n }\n\n return `NOT EXISTS (\n SELECT 1\n FROM json_each(${alias}.value -> '${sanitizePathSegment(pathSegments[0])}') AS ${newAlias}\n WHERE ${newAlias}.key = '${sanitizePathSegment(pathSegments[1])}'\n )`\n }\n\n let formattedValue = escapeSQLValue(value)\n let formattedOperator = operator\n if (['contains', 'like'].includes(operator)) {\n formattedOperator = 'like'\n formattedValue = `%${value}%`\n } else if (['not_like', 'notlike'].includes(operator)) {\n formattedOperator = 'not like'\n formattedValue = `%${value}%`\n } else if (operator === 'equals') {\n formattedOperator = '='\n }\n\n if (pathSegments.length === 1) {\n return `EXISTS (SELECT 1 FROM json_each(\"${sanitizePathSegment(pathSegments[0])}\") AS ${newAlias} WHERE ${newAlias}.value ${formattedOperator} '${formattedValue}')`\n }\n\n return `EXISTS (\n SELECT 1\n FROM json_each(${alias}.value -> '${sanitizePathSegment(pathSegments[0])}') AS ${newAlias}\n WHERE COALESCE(${newAlias}.value ->> '${sanitizePathSegment(pathSegments[1])}', '') ${formattedOperator} '${formattedValue}'\n )`\n}\n\nexport const createJSONQuery = ({\n column,\n operator,\n pathSegments,\n rawColumn,\n table,\n treatAsArray,\n treatRootAsArray,\n value,\n}: CreateJSONQueryArgs): string => {\n if ((operator === 'in' || operator === 'not_in') && Array.isArray(value)) {\n let sql = ''\n for (const [i, v] of value.entries()) {\n sql = `${sql}${createJSONQuery({ column, operator: operator === 'in' ? 'equals' : 'not_equals', pathSegments, rawColumn, table, treatAsArray, treatRootAsArray, value: v })} ${i === value.length - 1 ? '' : ` ${operator === 'in' ? 'OR' : 'AND'} `}`\n }\n return sql\n }\n\n if (treatAsArray?.includes(pathSegments[1]) && table) {\n return fromArray({\n operator,\n pathSegments,\n table,\n treatAsArray,\n value: value as CreateConstraintArgs['value'],\n })\n }\n\n return createConstraint({\n alias: table,\n operator,\n pathSegments,\n treatAsArray,\n value: value as CreateConstraintArgs['value'],\n })\n}\n"],"names":["escapeSQLValue","sanitizePathSegment","fromArray","isRoot","operator","pathSegments","table","treatAsArray","value","newPathSegments","slice","sanitizedSegment","alias","length","createJSONQuery","createConstraint","newAlias","formattedValue","formattedOperator","includes","column","rawColumn","treatRootAsArray","Array","isArray","sql","i","v","entries"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/sqlite/createJSONQuery/index.ts"],"sourcesContent":["import type { CreateJSONQueryArgs } from '../../types.js'\n\nimport { escapeSQLValue } from '../../utilities/escapeSQLValue.js'\nimport { sanitizePathSegment } from '../../utilities/sanitizePathSegment.js'\n\ntype FromArrayArgs = {\n isRoot?: true\n operator: string\n pathSegments: string[]\n table: string\n treatAsArray?: string[]\n value: boolean | number | string\n}\n\nconst fromArray = ({\n isRoot,\n operator,\n pathSegments,\n table,\n treatAsArray,\n value,\n}: FromArrayArgs) => {\n const newPathSegments = pathSegments.slice(1)\n const sanitizedSegment = sanitizePathSegment(pathSegments[isRoot ? 0 : 1])\n const alias = `${sanitizedSegment}_alias_${newPathSegments.length}`\n\n return `EXISTS (\n SELECT 1\n FROM json_each(${table}.${sanitizePathSegment(pathSegments[0])}) AS ${alias}\n WHERE ${createJSONQuery({\n operator,\n pathSegments: newPathSegments,\n table: alias,\n treatAsArray,\n value,\n })}\n )`\n}\n\ntype CreateConstraintArgs = {\n alias?: string\n operator: string\n pathSegments: string[]\n rootColumn?: string\n treatAsArray?: string[]\n value: boolean | number | string\n}\n\nconst createConstraint = ({\n alias,\n operator,\n pathSegments,\n rootColumn,\n value,\n}: CreateConstraintArgs): string => {\n const newAlias = `${pathSegments[0]}_alias_${pathSegments.length - 1}`\n\n if (operator === 'exists' && value === false) {\n operator = 'not_exists'\n value = true\n } else if (operator === 'not_exists' && value === false) {\n operator = 'exists'\n value = true\n }\n\n if (operator === 'exists') {\n if (pathSegments.length === 1) {\n return `EXISTS (SELECT 1 FROM json_each(${rootColumn ?? `\"${sanitizePathSegment(pathSegments[0])}\"`}) AS ${newAlias})`\n }\n\n return `EXISTS (\n SELECT 1\n FROM json_each(${alias}.value -> '${sanitizePathSegment(pathSegments[0])}') AS ${newAlias}\n WHERE ${newAlias}.key = '${sanitizePathSegment(pathSegments[1])}'\n )`\n }\n\n if (operator === 'not_exists') {\n if (pathSegments.length === 1) {\n return `NOT EXISTS (SELECT 1 FROM json_each(${rootColumn ?? `\"${sanitizePathSegment(pathSegments[0])}\"`}) AS ${newAlias})`\n }\n\n return `NOT EXISTS (\n SELECT 1\n FROM json_each(${alias}.value -> '${sanitizePathSegment(pathSegments[0])}') AS ${newAlias}\n WHERE ${newAlias}.key = '${sanitizePathSegment(pathSegments[1])}'\n )`\n }\n\n let formattedValue = escapeSQLValue(value)\n let formattedOperator = operator\n if (['contains', 'like'].includes(operator)) {\n formattedOperator = 'like'\n formattedValue = `%${value}%`\n } else if (['not_like', 'notlike'].includes(operator)) {\n formattedOperator = 'not like'\n formattedValue = `%${value}%`\n } else if (operator === 'equals') {\n formattedOperator = '='\n }\n\n if (pathSegments.length === 1) {\n return `EXISTS (SELECT 1 FROM json_each(${rootColumn ?? `\"${sanitizePathSegment(pathSegments[0])}\"`}) AS ${newAlias} WHERE ${newAlias}.value ${formattedOperator} '${formattedValue}')`\n }\n\n return `EXISTS (\n SELECT 1\n FROM json_each(${alias}.value -> '${sanitizePathSegment(pathSegments[0])}') AS ${newAlias}\n WHERE COALESCE(${newAlias}.value ->> '${sanitizePathSegment(pathSegments[1])}', '') ${formattedOperator} '${formattedValue}'\n )`\n}\n\nexport const createJSONQuery = ({\n column,\n operator,\n pathSegments,\n rawColumn,\n table,\n treatAsArray,\n treatRootAsArray,\n value,\n}: CreateJSONQueryArgs): string => {\n if ((operator === 'in' || operator === 'not_in') && Array.isArray(value)) {\n let sql = ''\n for (const [i, v] of value.entries()) {\n sql = `${sql}${createJSONQuery({ column, operator: operator === 'in' ? 'equals' : 'not_equals', pathSegments, rawColumn, table, treatAsArray, treatRootAsArray, value: v })} ${i === value.length - 1 ? '' : ` ${operator === 'in' ? 'OR' : 'AND'} `}`\n }\n return `(${sql})`\n }\n\n if (treatAsArray?.includes(pathSegments[1]) && table) {\n return fromArray({\n operator,\n pathSegments,\n table,\n treatAsArray,\n value: value as CreateConstraintArgs['value'],\n })\n }\n\n return createConstraint({\n alias: table,\n operator,\n pathSegments,\n rootColumn: typeof column === 'string' ? column : column ? `\"${column.name}\"` : undefined,\n treatAsArray,\n value: value as CreateConstraintArgs['value'],\n })\n}\n"],"names":["escapeSQLValue","sanitizePathSegment","fromArray","isRoot","operator","pathSegments","table","treatAsArray","value","newPathSegments","slice","sanitizedSegment","alias","length","createJSONQuery","createConstraint","rootColumn","newAlias","formattedValue","formattedOperator","includes","column","rawColumn","treatRootAsArray","Array","isArray","sql","i","v","entries","name","undefined"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"insert.d.ts","sourceRoot":"","sources":["../../src/sqlite/insert.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqB,MAAM,EAAE,MAAM,YAAY,CAAA;AAE3D,eAAO,MAAM,MAAM,EAAE,MAkCpB,CAAA"}
1
+ {"version":3,"file":"insert.d.ts","sourceRoot":"","sources":["../../src/sqlite/insert.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAqB,MAAM,EAAE,MAAM,YAAY,CAAA;AAE3D,eAAO,MAAM,MAAM,EAAE,MA0CpB,CAAA"}
@@ -1,19 +1,24 @@
1
- export const insert = async function({ db, onConflictDoUpdate, tableName, values }) {
1
+ import { getTableColumns } from 'drizzle-orm';
2
+ export const insert = async function({ db, onConflictDoNothing, onConflictDoUpdate, tableName, values }) {
2
3
  const table = this.tables[tableName];
3
4
  // Batch insert if limitedBoundParameters: true
4
5
  if (this.limitedBoundParameters && Array.isArray(values)) {
5
6
  const results = [];
6
- const colsPerRow = Object.keys(values[0]).length;
7
+ // Drizzle emits a value for every table column per row, not just the keys present on the row —
8
+ // omitted columns fall back to their default / defaultFn, which is also a bound parameter
9
+ const colsPerRow = Math.max(1, Object.keys(getTableColumns(table)).length);
7
10
  const maxParams = 100;
8
11
  const maxRowsPerBatch = Math.max(1, Math.floor(maxParams / colsPerRow));
9
12
  for(let i = 0; i < values.length; i += maxRowsPerBatch){
10
13
  const batch = values.slice(i, i + maxRowsPerBatch);
11
- const batchResult = onConflictDoUpdate ? await db.insert(table).values(batch).onConflictDoUpdate(onConflictDoUpdate).returning() : await db.insert(table).values(batch).returning();
14
+ const insertQuery = db.insert(table).values(batch);
15
+ const batchResult = onConflictDoNothing ? await insertQuery.onConflictDoNothing(onConflictDoNothing).returning() : onConflictDoUpdate ? await insertQuery.onConflictDoUpdate(onConflictDoUpdate).returning() : await insertQuery.returning();
12
16
  results.push(...batchResult);
13
17
  }
14
18
  return results;
15
19
  }
16
- const result = onConflictDoUpdate ? await db.insert(table).values(values).onConflictDoUpdate(onConflictDoUpdate).returning() : await db.insert(table).values(values).returning();
20
+ const insertQuery = db.insert(table).values(values);
21
+ const result = onConflictDoNothing ? await insertQuery.onConflictDoNothing(onConflictDoNothing).returning() : onConflictDoUpdate ? await insertQuery.onConflictDoUpdate(onConflictDoUpdate).returning() : await insertQuery.returning();
17
22
  // See https://github.com/payloadcms/payload/pull/11831#discussion_r2010431908
18
23
  return result;
19
24
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/sqlite/insert.ts"],"sourcesContent":["import type { BaseSQLiteAdapter, Insert } from './types.js'\n\nexport const insert: Insert = async function (\n // Here 'this' is not a parameter. See:\n // https://www.typescriptlang.org/docs/handbook/2/classes.html#this-parameters\n this: BaseSQLiteAdapter,\n { db, onConflictDoUpdate, tableName, values },\n): Promise<Record<string, unknown>[]> {\n const table = this.tables[tableName]\n\n // Batch insert if limitedBoundParameters: true\n if (this.limitedBoundParameters && Array.isArray(values)) {\n const results: Record<string, unknown>[] = []\n const colsPerRow = Object.keys(values[0]).length\n const maxParams = 100\n const maxRowsPerBatch = Math.max(1, Math.floor(maxParams / colsPerRow))\n\n for (let i = 0; i < values.length; i += maxRowsPerBatch) {\n const batch = values.slice(i, i + maxRowsPerBatch)\n\n const batchResult = onConflictDoUpdate\n ? await db.insert(table).values(batch).onConflictDoUpdate(onConflictDoUpdate).returning()\n : await db.insert(table).values(batch).returning()\n\n results.push(...(batchResult as Record<string, unknown>[]))\n }\n\n return results\n }\n\n const result = onConflictDoUpdate\n ? await db.insert(table).values(values).onConflictDoUpdate(onConflictDoUpdate).returning()\n : await db.insert(table).values(values).returning()\n\n // See https://github.com/payloadcms/payload/pull/11831#discussion_r2010431908\n return result as Record<string, unknown>[]\n}\n"],"names":["insert","db","onConflictDoUpdate","tableName","values","table","tables","limitedBoundParameters","Array","isArray","results","colsPerRow","Object","keys","length","maxParams","maxRowsPerBatch","Math","max","floor","i","batch","slice","batchResult","returning","push","result"],"mappings":"AAEA,OAAO,MAAMA,SAAiB,eAI5B,EAAEC,EAAE,EAAEC,kBAAkB,EAAEC,SAAS,EAAEC,MAAM,EAAE;IAE7C,MAAMC,QAAQ,IAAI,CAACC,MAAM,CAACH,UAAU;IAEpC,+CAA+C;IAC/C,IAAI,IAAI,CAACI,sBAAsB,IAAIC,MAAMC,OAAO,CAACL,SAAS;QACxD,MAAMM,UAAqC,EAAE;QAC7C,MAAMC,aAAaC,OAAOC,IAAI,CAACT,MAAM,CAAC,EAAE,EAAEU,MAAM;QAChD,MAAMC,YAAY;QAClB,MAAMC,kBAAkBC,KAAKC,GAAG,CAAC,GAAGD,KAAKE,KAAK,CAACJ,YAAYJ;QAE3D,IAAK,IAAIS,IAAI,GAAGA,IAAIhB,OAAOU,MAAM,EAAEM,KAAKJ,gBAAiB;YACvD,MAAMK,QAAQjB,OAAOkB,KAAK,CAACF,GAAGA,IAAIJ;YAElC,MAAMO,cAAcrB,qBAChB,MAAMD,GAAGD,MAAM,CAACK,OAAOD,MAAM,CAACiB,OAAOnB,kBAAkB,CAACA,oBAAoBsB,SAAS,KACrF,MAAMvB,GAAGD,MAAM,CAACK,OAAOD,MAAM,CAACiB,OAAOG,SAAS;YAElDd,QAAQe,IAAI,IAAKF;QACnB;QAEA,OAAOb;IACT;IAEA,MAAMgB,SAASxB,qBACX,MAAMD,GAAGD,MAAM,CAACK,OAAOD,MAAM,CAACA,QAAQF,kBAAkB,CAACA,oBAAoBsB,SAAS,KACtF,MAAMvB,GAAGD,MAAM,CAACK,OAAOD,MAAM,CAACA,QAAQoB,SAAS;IAEnD,8EAA8E;IAC9E,OAAOE;AACT,EAAC"}
1
+ {"version":3,"sources":["../../src/sqlite/insert.ts"],"sourcesContent":["import { getTableColumns } from 'drizzle-orm'\n\nimport type { BaseSQLiteAdapter, Insert } from './types.js'\n\nexport const insert: Insert = async function (\n // Here 'this' is not a parameter. See:\n // https://www.typescriptlang.org/docs/handbook/2/classes.html#this-parameters\n this: BaseSQLiteAdapter,\n { db, onConflictDoNothing, onConflictDoUpdate, tableName, values },\n): Promise<Record<string, unknown>[]> {\n const table = this.tables[tableName]\n\n // Batch insert if limitedBoundParameters: true\n if (this.limitedBoundParameters && Array.isArray(values)) {\n const results: Record<string, unknown>[] = []\n // Drizzle emits a value for every table column per row, not just the keys present on the row —\n // omitted columns fall back to their default / defaultFn, which is also a bound parameter\n const colsPerRow = Math.max(1, Object.keys(getTableColumns(table)).length)\n const maxParams = 100\n const maxRowsPerBatch = Math.max(1, Math.floor(maxParams / colsPerRow))\n\n for (let i = 0; i < values.length; i += maxRowsPerBatch) {\n const batch = values.slice(i, i + maxRowsPerBatch)\n\n const insertQuery = db.insert(table).values(batch)\n const batchResult = onConflictDoNothing\n ? await insertQuery.onConflictDoNothing(onConflictDoNothing).returning()\n : onConflictDoUpdate\n ? await insertQuery.onConflictDoUpdate(onConflictDoUpdate).returning()\n : await insertQuery.returning()\n\n results.push(...(batchResult as Record<string, unknown>[]))\n }\n\n return results\n }\n\n const insertQuery = db.insert(table).values(values)\n const result = onConflictDoNothing\n ? await insertQuery.onConflictDoNothing(onConflictDoNothing).returning()\n : onConflictDoUpdate\n ? await insertQuery.onConflictDoUpdate(onConflictDoUpdate).returning()\n : await insertQuery.returning()\n\n // See https://github.com/payloadcms/payload/pull/11831#discussion_r2010431908\n return result as Record<string, unknown>[]\n}\n"],"names":["getTableColumns","insert","db","onConflictDoNothing","onConflictDoUpdate","tableName","values","table","tables","limitedBoundParameters","Array","isArray","results","colsPerRow","Math","max","Object","keys","length","maxParams","maxRowsPerBatch","floor","i","batch","slice","insertQuery","batchResult","returning","push","result"],"mappings":"AAAA,SAASA,eAAe,QAAQ,cAAa;AAI7C,OAAO,MAAMC,SAAiB,eAI5B,EAAEC,EAAE,EAAEC,mBAAmB,EAAEC,kBAAkB,EAAEC,SAAS,EAAEC,MAAM,EAAE;IAElE,MAAMC,QAAQ,IAAI,CAACC,MAAM,CAACH,UAAU;IAEpC,+CAA+C;IAC/C,IAAI,IAAI,CAACI,sBAAsB,IAAIC,MAAMC,OAAO,CAACL,SAAS;QACxD,MAAMM,UAAqC,EAAE;QAC7C,+FAA+F;QAC/F,0FAA0F;QAC1F,MAAMC,aAAaC,KAAKC,GAAG,CAAC,GAAGC,OAAOC,IAAI,CAACjB,gBAAgBO,QAAQW,MAAM;QACzE,MAAMC,YAAY;QAClB,MAAMC,kBAAkBN,KAAKC,GAAG,CAAC,GAAGD,KAAKO,KAAK,CAACF,YAAYN;QAE3D,IAAK,IAAIS,IAAI,GAAGA,IAAIhB,OAAOY,MAAM,EAAEI,KAAKF,gBAAiB;YACvD,MAAMG,QAAQjB,OAAOkB,KAAK,CAACF,GAAGA,IAAIF;YAElC,MAAMK,cAAcvB,GAAGD,MAAM,CAACM,OAAOD,MAAM,CAACiB;YAC5C,MAAMG,cAAcvB,sBAChB,MAAMsB,YAAYtB,mBAAmB,CAACA,qBAAqBwB,SAAS,KACpEvB,qBACE,MAAMqB,YAAYrB,kBAAkB,CAACA,oBAAoBuB,SAAS,KAClE,MAAMF,YAAYE,SAAS;YAEjCf,QAAQgB,IAAI,IAAKF;QACnB;QAEA,OAAOd;IACT;IAEA,MAAMa,cAAcvB,GAAGD,MAAM,CAACM,OAAOD,MAAM,CAACA;IAC5C,MAAMuB,SAAS1B,sBACX,MAAMsB,YAAYtB,mBAAmB,CAACA,qBAAqBwB,SAAS,KACpEvB,qBACE,MAAMqB,YAAYrB,kBAAkB,CAACA,oBAAoBuB,SAAS,KAClE,MAAMF,YAAYE,SAAS;IAEjC,8EAA8E;IAC9E,OAAOE;AACT,EAAC"}
@@ -0,0 +1,15 @@
1
+ import type { Payload } from 'payload';
2
+ import type { SizesToVariantsDirection } from '../../../utilities/getSizesToVariantsRenames.js';
3
+ /**
4
+ * Moves every upload collection's stored image sizes between the legacy `sizes_*` columns and
5
+ * `variants_*` (main and versions tables), renaming each column in place so no data is copied.
6
+ * SQLite can't rename an index, so each index on a renamed column is dropped and recreated under
7
+ * the name the current schema expects. Skips columns that are already renamed, so it's safe to
8
+ * re-run.
9
+ */
10
+ export declare function migrateSqliteSizesToVariants({ db, direction, payload, }: {
11
+ db: any;
12
+ direction?: SizesToVariantsDirection;
13
+ payload: Payload;
14
+ }): Promise<void>;
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/sqlite/predefinedMigrations/sizes-to-variants/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAKtC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iDAAiD,CAAA;AAQ/F;;;;;;GAMG;AACH,wBAAsB,4BAA4B,CAAC,EACjD,EAAE,EACF,SAAgB,EAChB,OAAO,GACR,EAAE;IACD,EAAE,EAAE,GAAG,CAAA;IACP,SAAS,CAAC,EAAE,wBAAwB,CAAA;IACpC,OAAO,EAAE,OAAO,CAAA;CACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8FhB"}
@@ -0,0 +1,114 @@
1
+ import { sql } from 'drizzle-orm';
2
+ import { assertNoSizesToVariantsColumnCollisions, getSizesToVariantsRenames, isGeneratedLegacyIndexName } from '../../../utilities/getSizesToVariantsRenames.js';
3
+ /**
4
+ * Moves every upload collection's stored image sizes between the legacy `sizes_*` columns and
5
+ * `variants_*` (main and versions tables), renaming each column in place so no data is copied.
6
+ * SQLite can't rename an index, so each index on a renamed column is dropped and recreated under
7
+ * the name the current schema expects. Skips columns that are already renamed, so it's safe to
8
+ * re-run.
9
+ */ export async function migrateSqliteSizesToVariants({ db, direction = 'up', payload }) {
10
+ const adapter = payload.db;
11
+ const plan = getSizesToVariantsRenames({
12
+ adapter,
13
+ direction
14
+ });
15
+ const plannedTables = [];
16
+ for (const tablePlan of plan){
17
+ const existingColumns = await getColumnNames({
18
+ db,
19
+ tableName: tablePlan.tableName
20
+ });
21
+ assertNoSizesToVariantsColumnCollisions({
22
+ columns: tablePlan.columns,
23
+ existingColumns,
24
+ tableName: tablePlan.tableName
25
+ });
26
+ plannedTables.push({
27
+ ...tablePlan,
28
+ existingColumns
29
+ });
30
+ }
31
+ for (const { columns, existingColumns, indexes, tableName } of plannedTables){
32
+ const columnsAfterRename = new Set(existingColumns);
33
+ let renamedCount = 0;
34
+ for (const { from, to } of columns){
35
+ if (!existingColumns.has(from) || existingColumns.has(to)) {
36
+ continue;
37
+ }
38
+ columnsAfterRename.delete(from);
39
+ columnsAfterRename.add(to);
40
+ await db.run(sql`
41
+ ALTER TABLE ${sql.identifier(tableName)}
42
+ RENAME COLUMN ${sql.identifier(from)} TO ${sql.identifier(to)}
43
+ `);
44
+ renamedCount++;
45
+ }
46
+ const existingIndexes = await getIndexes({
47
+ db,
48
+ tableName
49
+ });
50
+ for (const index of indexes){
51
+ if (!index.columns.every((column)=>columnsAfterRename.has(column))) {
52
+ continue;
53
+ }
54
+ const destinationIndex = existingIndexes.find(({ name })=>name === index.to);
55
+ const sourceIndex = destinationIndex ? undefined : index.from ? existingIndexes.find(({ name })=>name === index.from) : index.legacyNameBase ? existingIndexes.find(({ name, columns })=>columns.join(',') === index.columns.join(',') && isGeneratedLegacyIndexName({
56
+ indexName: name,
57
+ legacyNameBase: index.legacyNameBase
58
+ })) : undefined;
59
+ if (destinationIndex) {
60
+ if (destinationIndex.columns.join(',') !== index.columns.join(',') || destinationIndex.unique !== index.unique) {
61
+ throw new Error(`Cannot run the sizes-to-variants migration because index "${index.to}" on table "${tableName}" does not match the expected columns or uniqueness.`);
62
+ }
63
+ } else {
64
+ const unique = index.unique ? sql.raw('UNIQUE ') : sql.empty();
65
+ const columnList = sql.join(index.columns.map((column)=>sql.identifier(column)), sql.raw(', '));
66
+ await db.run(sql`
67
+ CREATE ${unique}INDEX ${sql.identifier(index.to)}
68
+ ON ${sql.identifier(tableName)} (${columnList})
69
+ `);
70
+ }
71
+ if (sourceIndex && sourceIndex.name !== index.to) {
72
+ await db.run(sql`DROP INDEX ${sql.identifier(sourceIndex.name)}`);
73
+ }
74
+ }
75
+ payload.logger.info({
76
+ msg: `sizes-to-variants (${direction}): renamed ${renamedCount} column(s) on "${tableName}"`
77
+ });
78
+ }
79
+ }
80
+ async function getColumnNames({ db, tableName }) {
81
+ const rows = await db.all(sql`SELECT name FROM pragma_table_info(${tableName})`);
82
+ return new Set(rows.map(({ name })=>name));
83
+ }
84
+ async function getIndexes({ db, tableName }) {
85
+ // `origin = 'c'` keeps only `CREATE INDEX` indexes, skipping SQLite's internal autoindexes.
86
+ const rows = await db.all(sql`
87
+ SELECT
88
+ il.name AS index_name,
89
+ il."unique" AS is_unique,
90
+ ii.name AS column_name,
91
+ ii.seqno AS seqno
92
+ FROM pragma_index_list(${tableName}) AS il
93
+ JOIN pragma_index_info(il.name) AS ii
94
+ WHERE il.origin = 'c'
95
+ ORDER BY il.name, ii.seqno
96
+ `);
97
+ const indexes = new Map();
98
+ for (const { column_name, index_name, is_unique } of rows){
99
+ const index = indexes.get(index_name) ?? {
100
+ columns: [],
101
+ unique: Boolean(is_unique)
102
+ };
103
+ index.columns.push(column_name);
104
+ indexes.set(index_name, index);
105
+ }
106
+ return [
107
+ ...indexes
108
+ ].map(([name, index])=>({
109
+ name,
110
+ ...index
111
+ }));
112
+ }
113
+
114
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/sqlite/predefinedMigrations/sizes-to-variants/index.ts"],"sourcesContent":["import type { Payload } from 'payload'\n\nimport { sql } from 'drizzle-orm'\n\nimport type { DrizzleAdapter } from '../../../types.js'\nimport type { SizesToVariantsDirection } from '../../../utilities/getSizesToVariantsRenames.js'\n\nimport {\n assertNoSizesToVariantsColumnCollisions,\n getSizesToVariantsRenames,\n isGeneratedLegacyIndexName,\n} from '../../../utilities/getSizesToVariantsRenames.js'\n\n/**\n * Moves every upload collection's stored image sizes between the legacy `sizes_*` columns and\n * `variants_*` (main and versions tables), renaming each column in place so no data is copied.\n * SQLite can't rename an index, so each index on a renamed column is dropped and recreated under\n * the name the current schema expects. Skips columns that are already renamed, so it's safe to\n * re-run.\n */\nexport async function migrateSqliteSizesToVariants({\n db,\n direction = 'up',\n payload,\n}: {\n db: any\n direction?: SizesToVariantsDirection\n payload: Payload\n}): Promise<void> {\n const adapter = payload.db as unknown as DrizzleAdapter\n const plan = getSizesToVariantsRenames({ adapter, direction })\n const plannedTables: Array<\n (typeof plan)[number] & {\n existingColumns: Set<string>\n }\n > = []\n\n for (const tablePlan of plan) {\n const existingColumns = await getColumnNames({ db, tableName: tablePlan.tableName })\n\n assertNoSizesToVariantsColumnCollisions({\n columns: tablePlan.columns,\n existingColumns,\n tableName: tablePlan.tableName,\n })\n\n plannedTables.push({ ...tablePlan, existingColumns })\n }\n\n for (const { columns, existingColumns, indexes, tableName } of plannedTables) {\n const columnsAfterRename = new Set(existingColumns)\n let renamedCount = 0\n\n for (const { from, to } of columns) {\n if (!existingColumns.has(from) || existingColumns.has(to)) {\n continue\n }\n\n columnsAfterRename.delete(from)\n columnsAfterRename.add(to)\n\n await db.run(sql`\n ALTER TABLE ${sql.identifier(tableName)}\n RENAME COLUMN ${sql.identifier(from)} TO ${sql.identifier(to)}\n `)\n renamedCount++\n }\n\n const existingIndexes = await getIndexes({ db, tableName })\n\n for (const index of indexes) {\n if (!index.columns.every((column) => columnsAfterRename.has(column))) {\n continue\n }\n\n const destinationIndex = existingIndexes.find(({ name }) => name === index.to)\n const sourceIndex = destinationIndex\n ? undefined\n : index.from\n ? existingIndexes.find(({ name }) => name === index.from)\n : index.legacyNameBase\n ? existingIndexes.find(\n ({ name, columns }) =>\n columns.join(',') === index.columns.join(',') &&\n isGeneratedLegacyIndexName({\n indexName: name,\n legacyNameBase: index.legacyNameBase,\n }),\n )\n : undefined\n\n if (destinationIndex) {\n if (\n destinationIndex.columns.join(',') !== index.columns.join(',') ||\n destinationIndex.unique !== index.unique\n ) {\n throw new Error(\n `Cannot run the sizes-to-variants migration because index \"${index.to}\" on table \"${tableName}\" does not match the expected columns or uniqueness.`,\n )\n }\n } else {\n const unique = index.unique ? sql.raw('UNIQUE ') : sql.empty()\n const columnList = sql.join(\n index.columns.map((column) => sql.identifier(column)),\n sql.raw(', '),\n )\n\n await db.run(sql`\n CREATE ${unique}INDEX ${sql.identifier(index.to)}\n ON ${sql.identifier(tableName)} (${columnList})\n `)\n }\n\n if (sourceIndex && sourceIndex.name !== index.to) {\n await db.run(sql`DROP INDEX ${sql.identifier(sourceIndex.name)}`)\n }\n }\n\n payload.logger.info({\n msg: `sizes-to-variants (${direction}): renamed ${renamedCount} column(s) on \"${tableName}\"`,\n })\n }\n}\n\nasync function getColumnNames({\n db,\n tableName,\n}: {\n db: any\n tableName: string\n}): Promise<Set<string>> {\n const rows: { name: string }[] = await db.all(\n sql`SELECT name FROM pragma_table_info(${tableName})`,\n )\n\n return new Set(rows.map(({ name }) => name))\n}\n\nasync function getIndexes({\n db,\n tableName,\n}: {\n db: any\n tableName: string\n}): Promise<{ columns: string[]; name: string; unique: boolean }[]> {\n // `origin = 'c'` keeps only `CREATE INDEX` indexes, skipping SQLite's internal autoindexes.\n const rows: { column_name: string; index_name: string; is_unique: number; seqno: number }[] =\n await db.all(sql`\n SELECT\n il.name AS index_name,\n il.\"unique\" AS is_unique,\n ii.name AS column_name,\n ii.seqno AS seqno\n FROM pragma_index_list(${tableName}) AS il\n JOIN pragma_index_info(il.name) AS ii\n WHERE il.origin = 'c'\n ORDER BY il.name, ii.seqno\n `)\n\n const indexes = new Map<string, { columns: string[]; unique: boolean }>()\n\n for (const { column_name, index_name, is_unique } of rows) {\n const index = indexes.get(index_name) ?? { columns: [], unique: Boolean(is_unique) }\n\n index.columns.push(column_name)\n indexes.set(index_name, index)\n }\n\n return [...indexes].map(([name, index]) => ({ name, ...index }))\n}\n"],"names":["sql","assertNoSizesToVariantsColumnCollisions","getSizesToVariantsRenames","isGeneratedLegacyIndexName","migrateSqliteSizesToVariants","db","direction","payload","adapter","plan","plannedTables","tablePlan","existingColumns","getColumnNames","tableName","columns","push","indexes","columnsAfterRename","Set","renamedCount","from","to","has","delete","add","run","identifier","existingIndexes","getIndexes","index","every","column","destinationIndex","find","name","sourceIndex","undefined","legacyNameBase","join","indexName","unique","Error","raw","empty","columnList","map","logger","info","msg","rows","all","Map","column_name","index_name","is_unique","get","Boolean","set"],"mappings":"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"}