@payloadcms/drizzle 4.0.0-internal.167c7cd → 4.0.0-internal.16f218d

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 (178) hide show
  1. package/dist/createTableName.d.ts.map +1 -1
  2. package/dist/createTableName.js +2 -7
  3. package/dist/createTableName.js.map +1 -1
  4. package/dist/exports/postgres.d.ts +3 -0
  5. package/dist/exports/postgres.d.ts.map +1 -1
  6. package/dist/exports/postgres.js +3 -0
  7. package/dist/exports/postgres.js.map +1 -1
  8. package/dist/exports/sqlite.d.ts +1 -0
  9. package/dist/exports/sqlite.d.ts.map +1 -1
  10. package/dist/exports/sqlite.js +1 -0
  11. package/dist/exports/sqlite.js.map +1 -1
  12. package/dist/find/buildPolymorphicJoinQuery.d.ts +39 -0
  13. package/dist/find/buildPolymorphicJoinQuery.d.ts.map +1 -0
  14. package/dist/find/buildPolymorphicJoinQuery.js +146 -0
  15. package/dist/find/buildPolymorphicJoinQuery.js.map +1 -0
  16. package/dist/find/buildPolymorphicJoinWhere.d.ts +20 -0
  17. package/dist/find/buildPolymorphicJoinWhere.d.ts.map +1 -0
  18. package/dist/find/buildPolymorphicJoinWhere.js +301 -0
  19. package/dist/find/buildPolymorphicJoinWhere.js.map +1 -0
  20. package/dist/find/createPolymorphicJoinWherePlan.d.ts +38 -0
  21. package/dist/find/createPolymorphicJoinWherePlan.d.ts.map +1 -0
  22. package/dist/find/createPolymorphicJoinWherePlan.js +200 -0
  23. package/dist/find/createPolymorphicJoinWherePlan.js.map +1 -0
  24. package/dist/find/traverseFields.d.ts.map +1 -1
  25. package/dist/find/traverseFields.js +20 -191
  26. package/dist/find/traverseFields.js.map +1 -1
  27. package/dist/index.d.ts +4 -10
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +2 -8
  30. package/dist/index.js.map +1 -1
  31. package/dist/migrate.d.ts.map +1 -1
  32. package/dist/migrate.js +41 -15
  33. package/dist/migrate.js.map +1 -1
  34. package/dist/migrateDown.d.ts +2 -1
  35. package/dist/migrateDown.d.ts.map +1 -1
  36. package/dist/migrateDown.js +17 -4
  37. package/dist/migrateDown.js.map +1 -1
  38. package/dist/migrateFresh.d.ts +4 -2
  39. package/dist/migrateFresh.d.ts.map +1 -1
  40. package/dist/migrateFresh.js +26 -9
  41. package/dist/migrateFresh.js.map +1 -1
  42. package/dist/migrateRefresh.d.ts +2 -1
  43. package/dist/migrateRefresh.d.ts.map +1 -1
  44. package/dist/migrateRefresh.js +20 -5
  45. package/dist/migrateRefresh.js.map +1 -1
  46. package/dist/migrateReset.d.ts +2 -1
  47. package/dist/migrateReset.d.ts.map +1 -1
  48. package/dist/migrateReset.js +18 -4
  49. package/dist/migrateReset.js.map +1 -1
  50. package/dist/migrateStatus.d.ts +2 -1
  51. package/dist/migrateStatus.d.ts.map +1 -1
  52. package/dist/migrateStatus.js +11 -6
  53. package/dist/migrateStatus.js.map +1 -1
  54. package/dist/postgres/createJSONQuery/index.js +3 -3
  55. package/dist/postgres/createJSONQuery/index.js.map +1 -1
  56. package/dist/postgres/init.d.ts.map +1 -1
  57. package/dist/postgres/init.js +6 -0
  58. package/dist/postgres/init.js.map +1 -1
  59. package/dist/postgres/predefinedMigrations/sizes-to-variants/index.d.ts +35 -0
  60. package/dist/postgres/predefinedMigrations/sizes-to-variants/index.d.ts.map +1 -0
  61. package/dist/postgres/predefinedMigrations/sizes-to-variants/index.js +185 -0
  62. package/dist/postgres/predefinedMigrations/sizes-to-variants/index.js.map +1 -0
  63. package/dist/postgres/predefinedMigrations/v2-v3/fetchAndResave/index.d.ts.map +1 -1
  64. package/dist/postgres/predefinedMigrations/v2-v3/fetchAndResave/index.js +8 -4
  65. package/dist/postgres/predefinedMigrations/v2-v3/fetchAndResave/index.js.map +1 -1
  66. package/dist/postgres/predefinedMigrations/v2-v3/index.js +1 -1
  67. package/dist/postgres/predefinedMigrations/v2-v3/index.js.map +1 -1
  68. package/dist/postgres/query/assertOperatorHandlerExtensionsInstalled.d.ts +15 -0
  69. package/dist/postgres/query/assertOperatorHandlerExtensionsInstalled.d.ts.map +1 -0
  70. package/dist/postgres/query/assertOperatorHandlerExtensionsInstalled.js +25 -0
  71. package/dist/postgres/query/assertOperatorHandlerExtensionsInstalled.js.map +1 -0
  72. package/dist/postgres/query/postgresUnaccent.d.ts +13 -0
  73. package/dist/postgres/query/postgresUnaccent.d.ts.map +1 -0
  74. package/dist/postgres/query/postgresUnaccent.js +40 -0
  75. package/dist/postgres/query/postgresUnaccent.js.map +1 -0
  76. package/dist/postgres/types.d.ts +13 -2
  77. package/dist/postgres/types.d.ts.map +1 -1
  78. package/dist/postgres/types.js.map +1 -1
  79. package/dist/queries/buildOperatorConstraint.d.ts +22 -0
  80. package/dist/queries/buildOperatorConstraint.d.ts.map +1 -0
  81. package/dist/queries/buildOperatorConstraint.js +63 -0
  82. package/dist/queries/buildOperatorConstraint.js.map +1 -0
  83. package/dist/queries/getTableColumnFromPath.d.ts +12 -3
  84. package/dist/queries/getTableColumnFromPath.d.ts.map +1 -1
  85. package/dist/queries/getTableColumnFromPath.js +59 -27
  86. package/dist/queries/getTableColumnFromPath.js.map +1 -1
  87. package/dist/queries/operatorMap.d.ts +7 -3
  88. package/dist/queries/operatorMap.d.ts.map +1 -1
  89. package/dist/queries/operatorMap.js.map +1 -1
  90. package/dist/queries/parseParams.d.ts.map +1 -1
  91. package/dist/queries/parseParams.js +262 -10
  92. package/dist/queries/parseParams.js.map +1 -1
  93. package/dist/queries/resolveRelationshipPath.d.ts +36 -0
  94. package/dist/queries/resolveRelationshipPath.d.ts.map +1 -0
  95. package/dist/queries/resolveRelationshipPath.js +66 -0
  96. package/dist/queries/resolveRelationshipPath.js.map +1 -0
  97. package/dist/queries/validateOperatorHandlers.d.ts +8 -0
  98. package/dist/queries/validateOperatorHandlers.d.ts.map +1 -0
  99. package/dist/queries/validateOperatorHandlers.js +30 -0
  100. package/dist/queries/validateOperatorHandlers.js.map +1 -0
  101. package/dist/schema/build.js +3 -3
  102. package/dist/schema/build.js.map +1 -1
  103. package/dist/sqlite/createJSONQuery/convertPathToJSONTraversal.js +3 -2
  104. package/dist/sqlite/createJSONQuery/convertPathToJSONTraversal.js.map +1 -1
  105. package/dist/sqlite/createJSONQuery/index.d.ts.map +1 -1
  106. package/dist/sqlite/createJSONQuery/index.js +6 -5
  107. package/dist/sqlite/createJSONQuery/index.js.map +1 -1
  108. package/dist/sqlite/execute.js.map +1 -1
  109. package/dist/sqlite/insert.d.ts.map +1 -1
  110. package/dist/sqlite/insert.js +4 -1
  111. package/dist/sqlite/insert.js.map +1 -1
  112. package/dist/sqlite/predefinedMigrations/sizes-to-variants/index.d.ts +15 -0
  113. package/dist/sqlite/predefinedMigrations/sizes-to-variants/index.d.ts.map +1 -0
  114. package/dist/sqlite/predefinedMigrations/sizes-to-variants/index.js +114 -0
  115. package/dist/sqlite/predefinedMigrations/sizes-to-variants/index.js.map +1 -0
  116. package/dist/transform/read/traverseFields.js.map +1 -1
  117. package/dist/transform/write/traverseFields.d.ts.map +1 -1
  118. package/dist/transform/write/traverseFields.js +8 -14
  119. package/dist/transform/write/traverseFields.js.map +1 -1
  120. package/dist/types.d.ts +50 -2
  121. package/dist/types.d.ts.map +1 -1
  122. package/dist/types.js.map +1 -1
  123. package/dist/updateOne.d.ts.map +1 -1
  124. package/dist/updateOne.js +41 -1
  125. package/dist/updateOne.js.map +1 -1
  126. package/dist/upsertRow/index.d.ts +1 -1
  127. package/dist/upsertRow/index.d.ts.map +1 -1
  128. package/dist/upsertRow/index.js +25 -5
  129. package/dist/upsertRow/index.js.map +1 -1
  130. package/dist/utilities/blocksToJsonMigrator.d.ts.map +1 -1
  131. package/dist/utilities/blocksToJsonMigrator.js +6 -17
  132. package/dist/utilities/blocksToJsonMigrator.js.map +1 -1
  133. package/dist/utilities/buildCreateMigration.d.ts.map +1 -1
  134. package/dist/utilities/buildCreateMigration.js +12 -8
  135. package/dist/utilities/buildCreateMigration.js.map +1 -1
  136. package/dist/utilities/buildDynamicPredefinedSizesToVariantsMigration.d.ts +15 -0
  137. package/dist/utilities/buildDynamicPredefinedSizesToVariantsMigration.d.ts.map +1 -0
  138. package/dist/utilities/buildDynamicPredefinedSizesToVariantsMigration.js +110 -0
  139. package/dist/utilities/buildDynamicPredefinedSizesToVariantsMigration.js.map +1 -0
  140. package/dist/utilities/buildForeignKeyName.d.ts.map +1 -1
  141. package/dist/utilities/buildForeignKeyName.js +3 -2
  142. package/dist/utilities/buildForeignKeyName.js.map +1 -1
  143. package/dist/utilities/buildIndexName.d.ts.map +1 -1
  144. package/dist/utilities/buildIndexName.js +3 -2
  145. package/dist/utilities/buildIndexName.js.map +1 -1
  146. package/dist/utilities/checkTruncatedIdentifiers.d.ts +13 -0
  147. package/dist/utilities/checkTruncatedIdentifiers.d.ts.map +1 -0
  148. package/dist/utilities/checkTruncatedIdentifiers.js +56 -0
  149. package/dist/utilities/checkTruncatedIdentifiers.js.map +1 -0
  150. package/dist/utilities/createSchemaGenerator.d.ts.map +1 -1
  151. package/dist/utilities/createSchemaGenerator.js +10 -12
  152. package/dist/utilities/createSchemaGenerator.js.map +1 -1
  153. package/dist/utilities/executeSchemaHooks.js +1 -1
  154. package/dist/utilities/executeSchemaHooks.js.map +1 -1
  155. package/dist/utilities/formatGeneratedFile.d.ts +10 -0
  156. package/dist/utilities/formatGeneratedFile.d.ts.map +1 -0
  157. package/dist/utilities/formatGeneratedFile.js +58 -0
  158. package/dist/utilities/formatGeneratedFile.js.map +1 -0
  159. package/dist/utilities/getSizesToVariantsRenames.d.ts +54 -0
  160. package/dist/utilities/getSizesToVariantsRenames.d.ts.map +1 -0
  161. package/dist/utilities/getSizesToVariantsRenames.js +251 -0
  162. package/dist/utilities/getSizesToVariantsRenames.js.map +1 -0
  163. package/dist/utilities/getTransaction.js.map +1 -1
  164. package/dist/utilities/parseJSONPathSegment.d.ts +9 -0
  165. package/dist/utilities/parseJSONPathSegment.d.ts.map +1 -0
  166. package/dist/utilities/parseJSONPathSegment.js +17 -0
  167. package/dist/utilities/parseJSONPathSegment.js.map +1 -0
  168. package/dist/utilities/validateIdentifierLength.d.ts +12 -0
  169. package/dist/utilities/validateIdentifierLength.d.ts.map +1 -0
  170. package/dist/utilities/validateIdentifierLength.js +18 -0
  171. package/dist/utilities/validateIdentifierLength.js.map +1 -0
  172. package/package.json +16 -19
  173. package/dist/schema/buildRawSchema.spec.js +0 -167
  174. package/dist/schema/buildRawSchema.spec.js.map +0 -1
  175. package/dist/upsertRow/handleUpsertError.spec.js +0 -42
  176. package/dist/upsertRow/handleUpsertError.spec.js.map +0 -1
  177. package/dist/utilities/isValidStringID.spec.js +0 -15
  178. package/dist/utilities/isValidStringID.spec.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/queries/resolveRelationshipPath.ts"],"sourcesContent":["import type { FlattenedField, RelationshipField, UploadField } from 'payload'\n\nimport type { DrizzleAdapter } from '../types.js'\n\ntype ResolvedRelationshipPath = {\n field: RelationshipField | UploadField\n isLocalized: boolean\n locale?: string\n path: string\n}\n\n/**\n * Adds a field to the path used by Drizzle's shared relationship, text, and number tables.\n * Array and block entries are stored with a numeric position, represented by `%` while querying.\n *\n * @example `blocks` becomes `blocks.%` and then `directors` becomes\n * `blocks.%.directors`.\n */\nexport function appendFieldToStoragePath({\n field,\n path = '',\n}: {\n field: FlattenedField\n path?: string\n}): string {\n const pathSegments = path ? [path.replace(/\\.$/, ''), field.name] : [field.name]\n\n if (field.type === 'array' || field.type === 'blocks') {\n pathSegments.push('%')\n }\n\n return pathSegments.join('.')\n}\n\n/**\n * Resolves a schema path to the relationship field and the path stored in the collection's shared\n * relationships table. This understands groups, tabs, arrays, blocks, and explicit locale\n * segments.\n *\n * @example `blocks.directors` resolves to the stored path `blocks.%.directors`.\n */\nexport function resolveRelationshipPath({\n adapter,\n fields,\n locale,\n parentIsLocalized,\n path,\n pathPrefix = '',\n}: {\n adapter: DrizzleAdapter\n fields: FlattenedField[]\n locale?: string\n parentIsLocalized: boolean\n path: string\n pathPrefix?: string\n}): null | ResolvedRelationshipPath {\n const localeCodes = adapter.payload.config.localization\n ? adapter.payload.config.localization.localeCodes\n : []\n const pathSegments = path.split('.')\n let currentField: FlattenedField | undefined\n let currentFields = fields\n let isLocalized = parentIsLocalized\n let resolvedPath = pathPrefix\n\n for (const segment of pathSegments) {\n const field = currentFields.find(({ name }) => name === segment)\n\n if (!field && isLocalized && localeCodes.includes(segment)) {\n locale = segment\n continue\n }\n\n if (!field) {\n return null\n }\n\n currentField = field\n resolvedPath = appendFieldToStoragePath({ field, path: resolvedPath })\n isLocalized = isLocalized || Boolean(field.localized)\n\n if ('flattenedFields' in field) {\n currentFields = field.flattenedFields\n } else if (field.type === 'blocks') {\n currentFields = field.blocks.flatMap((block) =>\n typeof block === 'string'\n ? adapter.payload.blocks[block].flattenedFields\n : block.flattenedFields,\n )\n } else {\n currentFields = []\n }\n }\n\n if (!currentField || (currentField.type !== 'relationship' && currentField.type !== 'upload')) {\n return null\n }\n\n return {\n field: currentField,\n isLocalized,\n locale,\n path: resolvedPath,\n }\n}\n"],"names":["appendFieldToStoragePath","field","path","pathSegments","replace","name","type","push","join","resolveRelationshipPath","adapter","fields","locale","parentIsLocalized","pathPrefix","localeCodes","payload","config","localization","split","currentField","currentFields","isLocalized","resolvedPath","segment","find","includes","Boolean","localized","flattenedFields","blocks","flatMap","block"],"mappings":"AAWA;;;;;;CAMC,GACD,OAAO,SAASA,yBAAyB,EACvCC,KAAK,EACLC,OAAO,EAAE,EAIV;IACC,MAAMC,eAAeD,OAAO;QAACA,KAAKE,OAAO,CAAC,OAAO;QAAKH,MAAMI,IAAI;KAAC,GAAG;QAACJ,MAAMI,IAAI;KAAC;IAEhF,IAAIJ,MAAMK,IAAI,KAAK,WAAWL,MAAMK,IAAI,KAAK,UAAU;QACrDH,aAAaI,IAAI,CAAC;IACpB;IAEA,OAAOJ,aAAaK,IAAI,CAAC;AAC3B;AAEA;;;;;;CAMC,GACD,OAAO,SAASC,wBAAwB,EACtCC,OAAO,EACPC,MAAM,EACNC,MAAM,EACNC,iBAAiB,EACjBX,IAAI,EACJY,aAAa,EAAE,EAQhB;IACC,MAAMC,cAAcL,QAAQM,OAAO,CAACC,MAAM,CAACC,YAAY,GACnDR,QAAQM,OAAO,CAACC,MAAM,CAACC,YAAY,CAACH,WAAW,GAC/C,EAAE;IACN,MAAMZ,eAAeD,KAAKiB,KAAK,CAAC;IAChC,IAAIC;IACJ,IAAIC,gBAAgBV;IACpB,IAAIW,cAAcT;IAClB,IAAIU,eAAeT;IAEnB,KAAK,MAAMU,WAAWrB,aAAc;QAClC,MAAMF,QAAQoB,cAAcI,IAAI,CAAC,CAAC,EAAEpB,IAAI,EAAE,GAAKA,SAASmB;QAExD,IAAI,CAACvB,SAASqB,eAAeP,YAAYW,QAAQ,CAACF,UAAU;YAC1DZ,SAASY;YACT;QACF;QAEA,IAAI,CAACvB,OAAO;YACV,OAAO;QACT;QAEAmB,eAAenB;QACfsB,eAAevB,yBAAyB;YAAEC;YAAOC,MAAMqB;QAAa;QACpED,cAAcA,eAAeK,QAAQ1B,MAAM2B,SAAS;QAEpD,IAAI,qBAAqB3B,OAAO;YAC9BoB,gBAAgBpB,MAAM4B,eAAe;QACvC,OAAO,IAAI5B,MAAMK,IAAI,KAAK,UAAU;YAClCe,gBAAgBpB,MAAM6B,MAAM,CAACC,OAAO,CAAC,CAACC,QACpC,OAAOA,UAAU,WACbtB,QAAQM,OAAO,CAACc,MAAM,CAACE,MAAM,CAACH,eAAe,GAC7CG,MAAMH,eAAe;QAE7B,OAAO;YACLR,gBAAgB,EAAE;QACpB;IACF;IAEA,IAAI,CAACD,gBAAiBA,aAAad,IAAI,KAAK,kBAAkBc,aAAad,IAAI,KAAK,UAAW;QAC7F,OAAO;IACT;IAEA,OAAO;QACLL,OAAOmB;QACPE;QACAV;QACAV,MAAMqB;IACR;AACF"}
@@ -0,0 +1,8 @@
1
+ import type { DrizzleOperatorHandler } from '../types.js';
2
+ /**
3
+ * Validates operator-handler configuration before any request runs: rejects a handler that
4
+ * defines both `build` and `transformOperands`, and rejects two replacement handlers whose
5
+ * `operators` and `fieldTypes` both overlap for the same resolved operator.
6
+ */
7
+ export declare const validateOperatorHandlers: (operatorHandlers: DrizzleOperatorHandler[]) => void;
8
+ //# sourceMappingURL=validateOperatorHandlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateOperatorHandlers.d.ts","sourceRoot":"","sources":["../../src/queries/validateOperatorHandlers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAqC,MAAM,aAAa,CAAA;AAc5F;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,qBAAsB,sBAAsB,EAAE,KAAG,IA+BrF,CAAA"}
@@ -0,0 +1,30 @@
1
+ import { APIError } from 'payload';
2
+ const isReplacementHandler = (handler)=>typeof handler.build === 'function';
3
+ const fieldTypesOverlap = (a, b)=>!a.fieldTypes || !b.fieldTypes || a.fieldTypes.some((fieldType)=>b.fieldTypes.includes(fieldType));
4
+ /**
5
+ * Validates operator-handler configuration before any request runs: rejects a handler that
6
+ * defines both `build` and `transformOperands`, and rejects two replacement handlers whose
7
+ * `operators` and `fieldTypes` both overlap for the same resolved operator.
8
+ */ export const validateOperatorHandlers = (operatorHandlers)=>{
9
+ for (const handler of operatorHandlers){
10
+ if (typeof handler.build === 'function' && typeof handler.transformOperands === 'function') {
11
+ throw new APIError(`Operator handler "${handler.name}" cannot define both "build" and "transformOperands". Use "transformOperands" to adjust operands, or "build" to replace the comparison entirely.`);
12
+ }
13
+ }
14
+ const replacementHandlers = operatorHandlers.filter(isReplacementHandler);
15
+ for(let i = 0; i < replacementHandlers.length; i++){
16
+ for(let j = i + 1; j < replacementHandlers.length; j++){
17
+ const handlerA = replacementHandlers[i];
18
+ const handlerB = replacementHandlers[j];
19
+ const sharedOperators = handlerA.operators.filter((operator)=>handlerB.operators.includes(operator));
20
+ if (!sharedOperators.length) {
21
+ continue;
22
+ }
23
+ if (fieldTypesOverlap(handlerA, handlerB)) {
24
+ throw new APIError(`Operator handlers "${handlerA.name}" and "${handlerB.name}" both replace the "${sharedOperators.join('", "')}" operator for overlapping field types. Only one replacement handler may match a given resolved operator and field type.`);
25
+ }
26
+ }
27
+ }
28
+ };
29
+
30
+ //# sourceMappingURL=validateOperatorHandlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/queries/validateOperatorHandlers.ts"],"sourcesContent":["import { APIError } from 'payload'\n\nimport type { DrizzleOperatorHandler, DrizzleOperatorReplacementHandler } from '../types.js'\n\nconst isReplacementHandler = (\n handler: DrizzleOperatorHandler,\n): handler is DrizzleOperatorReplacementHandler => typeof handler.build === 'function'\n\nconst fieldTypesOverlap = (\n a: DrizzleOperatorReplacementHandler,\n b: DrizzleOperatorReplacementHandler,\n): boolean =>\n !a.fieldTypes ||\n !b.fieldTypes ||\n a.fieldTypes.some((fieldType) => b.fieldTypes.includes(fieldType))\n\n/**\n * Validates operator-handler configuration before any request runs: rejects a handler that\n * defines both `build` and `transformOperands`, and rejects two replacement handlers whose\n * `operators` and `fieldTypes` both overlap for the same resolved operator.\n */\nexport const validateOperatorHandlers = (operatorHandlers: DrizzleOperatorHandler[]): void => {\n for (const handler of operatorHandlers) {\n if (typeof handler.build === 'function' && typeof handler.transformOperands === 'function') {\n throw new APIError(\n `Operator handler \"${handler.name}\" cannot define both \"build\" and \"transformOperands\". Use \"transformOperands\" to adjust operands, or \"build\" to replace the comparison entirely.`,\n )\n }\n }\n\n const replacementHandlers = operatorHandlers.filter(isReplacementHandler)\n\n for (let i = 0; i < replacementHandlers.length; i++) {\n for (let j = i + 1; j < replacementHandlers.length; j++) {\n const handlerA = replacementHandlers[i]\n const handlerB = replacementHandlers[j]\n\n const sharedOperators = handlerA.operators.filter((operator) =>\n handlerB.operators.includes(operator),\n )\n\n if (!sharedOperators.length) {\n continue\n }\n\n if (fieldTypesOverlap(handlerA, handlerB)) {\n throw new APIError(\n `Operator handlers \"${handlerA.name}\" and \"${handlerB.name}\" both replace the \"${sharedOperators.join('\", \"')}\" operator for overlapping field types. Only one replacement handler may match a given resolved operator and field type.`,\n )\n }\n }\n }\n}\n"],"names":["APIError","isReplacementHandler","handler","build","fieldTypesOverlap","a","b","fieldTypes","some","fieldType","includes","validateOperatorHandlers","operatorHandlers","transformOperands","name","replacementHandlers","filter","i","length","j","handlerA","handlerB","sharedOperators","operators","operator","join"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,UAAS;AAIlC,MAAMC,uBAAuB,CAC3BC,UACiD,OAAOA,QAAQC,KAAK,KAAK;AAE5E,MAAMC,oBAAoB,CACxBC,GACAC,IAEA,CAACD,EAAEE,UAAU,IACb,CAACD,EAAEC,UAAU,IACbF,EAAEE,UAAU,CAACC,IAAI,CAAC,CAACC,YAAcH,EAAEC,UAAU,CAACG,QAAQ,CAACD;AAEzD;;;;CAIC,GACD,OAAO,MAAME,2BAA2B,CAACC;IACvC,KAAK,MAAMV,WAAWU,iBAAkB;QACtC,IAAI,OAAOV,QAAQC,KAAK,KAAK,cAAc,OAAOD,QAAQW,iBAAiB,KAAK,YAAY;YAC1F,MAAM,IAAIb,SACR,CAAC,kBAAkB,EAAEE,QAAQY,IAAI,CAAC,gJAAgJ,CAAC;QAEvL;IACF;IAEA,MAAMC,sBAAsBH,iBAAiBI,MAAM,CAACf;IAEpD,IAAK,IAAIgB,IAAI,GAAGA,IAAIF,oBAAoBG,MAAM,EAAED,IAAK;QACnD,IAAK,IAAIE,IAAIF,IAAI,GAAGE,IAAIJ,oBAAoBG,MAAM,EAAEC,IAAK;YACvD,MAAMC,WAAWL,mBAAmB,CAACE,EAAE;YACvC,MAAMI,WAAWN,mBAAmB,CAACI,EAAE;YAEvC,MAAMG,kBAAkBF,SAASG,SAAS,CAACP,MAAM,CAAC,CAACQ,WACjDH,SAASE,SAAS,CAACb,QAAQ,CAACc;YAG9B,IAAI,CAACF,gBAAgBJ,MAAM,EAAE;gBAC3B;YACF;YAEA,IAAId,kBAAkBgB,UAAUC,WAAW;gBACzC,MAAM,IAAIrB,SACR,CAAC,mBAAmB,EAAEoB,SAASN,IAAI,CAAC,OAAO,EAAEO,SAASP,IAAI,CAAC,oBAAoB,EAAEQ,gBAAgBG,IAAI,CAAC,QAAQ,wHAAwH,CAAC;YAE3O;QACF;IACF;AACF,EAAC"}
@@ -110,13 +110,13 @@ export const buildTable = ({ adapter, baseColumns = {}, baseForeignKeys = {}, ba
110
110
  };
111
111
  localesIndexes._localeParent = {
112
112
  name: buildIndexName({
113
- name: `${localeTableName}_locale_parent_id_unique`,
113
+ name: `${localeTableName}_parent_id_locale_unique`,
114
114
  adapter,
115
115
  appendSuffix: false
116
116
  }),
117
117
  on: [
118
- '_locale',
119
- '_parentID'
118
+ '_parentID',
119
+ '_locale'
120
120
  ],
121
121
  unique: true
122
122
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/schema/build.ts"],"sourcesContent":["import type { FlattenedField, SanitizedCompoundIndex } from 'payload'\n\nimport { InvalidConfiguration } from 'payload'\nimport toSnakeCase from 'to-snake-case'\n\nimport type {\n DrizzleAdapter,\n IDType,\n RawColumn,\n RawForeignKey,\n RawIndex,\n RawRelation,\n RawTable,\n RelationMap,\n SetColumnID,\n} from '../types.js'\n\nimport { createTableName } from '../createTableName.js'\nimport { buildForeignKeyName } from '../utilities/buildForeignKeyName.js'\nimport { buildIndexName } from '../utilities/buildIndexName.js'\nimport { isUUIDType } from '../utilities/isUUIDType.js'\nimport { traverseFields } from './traverseFields.js'\n\ntype Args = {\n adapter: DrizzleAdapter\n baseColumns?: Record<string, RawColumn>\n /**\n * After table is created, run these functions to add extra config to the table\n * ie. indexes, multiple columns, etc\n */\n baseForeignKeys?: Record<string, RawForeignKey>\n /**\n * After table is created, run these functions to add extra config to the table\n * ie. indexes, multiple columns, etc\n */\n baseIndexes?: Record<string, RawIndex>\n blocksTableNameMap: Record<string, number>\n buildNumbers?: boolean\n buildRelationships?: boolean\n compoundIndexes?: SanitizedCompoundIndex[]\n disableNotNull: boolean\n disableRelsTableUnique?: boolean\n disableUnique: boolean\n fields: FlattenedField[]\n parentIsLocalized: boolean\n rootRelationships?: Set<string>\n rootRelationsToBuild?: RelationMap\n rootTableIDColType?: IDType\n rootTableName?: string\n rootUniqueRelationships?: Set<string>\n setColumnID: SetColumnID\n tableName: string\n timestamps?: boolean\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 hasLocalizedManyNumberField: boolean\n hasLocalizedManyTextField: boolean\n hasLocalizedRelationshipField: boolean\n hasManyNumberField: 'index' | boolean\n hasManyTextField: 'index' | boolean\n relationsToBuild: RelationMap\n}\n\nexport const buildTable = ({\n adapter,\n baseColumns = {},\n baseForeignKeys = {},\n baseIndexes = {},\n blocksTableNameMap,\n compoundIndexes,\n disableNotNull,\n disableRelsTableUnique = false,\n disableUnique = false,\n fields,\n parentIsLocalized,\n rootRelationships,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName: incomingRootTableName,\n rootUniqueRelationships,\n setColumnID,\n tableName,\n timestamps,\n versions,\n withinLocalizedArrayOrBlock,\n}: Args): Result => {\n const isRoot = !incomingRootTableName\n const rootTableName = incomingRootTableName || tableName\n const columns: Record<string, RawColumn> = baseColumns\n const indexes: Record<string, RawIndex> = baseIndexes\n\n const localesColumns: Record<string, RawColumn> = {}\n const localesIndexes: Record<string, RawIndex> = {}\n let localesTable: RawTable\n let textsTable: RawTable\n let numbersTable: RawTable\n\n // Relationships to the base collection\n const relationships: Set<string> = rootRelationships || new Set()\n\n // Unique relationships to the base collection\n const uniqueRelationships: Set<string> = rootUniqueRelationships || new Set()\n\n let relationshipsTable: RawTable\n\n // Drizzle relations\n const relationsToBuild: RelationMap = new Map()\n\n const idColType: IDType = setColumnID({ adapter, columns, fields })\n\n const {\n hasLocalizedField,\n hasLocalizedManyNumberField,\n hasLocalizedManyTextField,\n hasLocalizedRelationshipField,\n hasManyNumberField,\n hasManyTextField,\n } = traverseFields({\n adapter,\n blocksTableNameMap,\n columns,\n disableNotNull,\n disableRelsTableUnique,\n disableUnique,\n fields,\n indexes,\n localesColumns,\n localesIndexes,\n newTableName: tableName,\n parentIsLocalized,\n parentTableName: tableName,\n relationships,\n relationsToBuild,\n rootRelationsToBuild: rootRelationsToBuild || relationsToBuild,\n rootTableIDColType: rootTableIDColType || idColType,\n rootTableName,\n setColumnID,\n uniqueRelationships,\n versions,\n withinLocalizedArrayOrBlock,\n })\n\n // split the relationsToBuild by localized and non-localized\n const localizedRelations = new Map()\n const nonLocalizedRelations = new Map()\n\n relationsToBuild.forEach(({ type, localized, relationName, target }, key) => {\n const map = localized ? localizedRelations : nonLocalizedRelations\n map.set(key, { type, relationName, target })\n })\n\n if (timestamps) {\n columns.createdAt = {\n name: 'created_at',\n type: 'timestamp',\n defaultNow: true,\n mode: 'string',\n notNull: true,\n precision: 3,\n withTimezone: true,\n }\n\n columns.updatedAt = {\n name: 'updated_at',\n type: 'timestamp',\n defaultNow: true,\n mode: 'string',\n notNull: true,\n precision: 3,\n withTimezone: true,\n }\n }\n\n const table: RawTable = {\n name: tableName,\n columns,\n foreignKeys: baseForeignKeys,\n indexes,\n }\n\n adapter.rawTables[tableName] = table\n\n if (hasLocalizedField || localizedRelations.size) {\n const localeTableName = `${tableName}${adapter.localesSuffix}`\n adapter.rawTables[localeTableName] = localesTable\n\n localesColumns.id = {\n name: 'id',\n type: 'serial',\n primaryKey: true,\n }\n\n localesColumns._locale = {\n name: '_locale',\n type: 'enum',\n locale: true,\n notNull: true,\n }\n\n localesColumns._parentID = {\n name: '_parent_id',\n type: idColType,\n notNull: true,\n }\n\n localesIndexes._localeParent = {\n name: buildIndexName({\n name: `${localeTableName}_locale_parent_id_unique`,\n adapter,\n appendSuffix: false,\n }),\n on: ['_locale', '_parentID'],\n unique: true,\n }\n\n localesTable = {\n name: localeTableName,\n columns: localesColumns,\n foreignKeys: {\n _parentIdFk: {\n name: buildForeignKeyName({ name: `${localeTableName}_parent_id`, adapter }),\n columns: ['_parentID'],\n foreignColumns: [\n {\n name: 'id',\n table: tableName,\n },\n ],\n onDelete: 'cascade',\n },\n },\n indexes: localesIndexes,\n }\n\n adapter.rawTables[localeTableName] = localesTable\n\n const localeRelations: Record<string, RawRelation> = {\n _parentID: {\n type: 'one',\n fields: [\n {\n name: '_parentID',\n table: localeTableName,\n },\n ],\n references: ['id'],\n relationName: '_locales',\n to: tableName,\n },\n }\n\n localizedRelations.forEach(({ type, target }, key) => {\n if (type === 'one') {\n localeRelations[key] = {\n type: 'one',\n fields: [\n {\n name: key,\n table: localeTableName,\n },\n ],\n references: ['id'],\n relationName: key,\n to: target,\n }\n }\n if (type === 'many') {\n localeRelations[key] = {\n type: 'many',\n relationName: key,\n to: target,\n }\n }\n })\n adapter.rawRelations[localeTableName] = localeRelations\n }\n\n if (compoundIndexes) {\n for (const index of compoundIndexes) {\n let someLocalized: boolean | null = null\n const columns: string[] = []\n\n const getTableToUse = () => {\n if (someLocalized) {\n return localesTable\n }\n\n return table\n }\n\n for (const { path, pathHasLocalized } of index.fields) {\n if (someLocalized === null) {\n someLocalized = pathHasLocalized\n }\n\n if (someLocalized !== pathHasLocalized) {\n throw new InvalidConfiguration(\n `Compound indexes within localized and non localized fields are not supported in SQL. Expected ${path} to be ${someLocalized ? 'non' : ''} localized.`,\n )\n }\n\n const columnPath = path.replaceAll('.', '_')\n\n if (!getTableToUse().columns[columnPath]) {\n throw new InvalidConfiguration(\n `Column ${columnPath} for compound index on ${path} was not found in the ${getTableToUse().name} table.`,\n )\n }\n\n columns.push(columnPath)\n }\n\n if (someLocalized) {\n columns.push('_locale')\n }\n\n let name = columns.join('_')\n // truncate against the limit, buildIndexName will handle collisions\n if (name.length > 63) {\n name = 'compound_index'\n }\n\n const indexName = buildIndexName({ name, adapter })\n\n getTableToUse().indexes[indexName] = {\n name: indexName,\n on: columns,\n unique: disableUnique ? false : index.unique,\n }\n }\n }\n\n if (isRoot) {\n if (hasManyTextField) {\n const textsTableName = `${rootTableName}_texts`\n adapter.rawTables[textsTableName] = textsTable\n\n const columns: Record<string, RawColumn> = {\n id: {\n name: 'id',\n type: 'serial',\n primaryKey: true,\n },\n order: {\n name: 'order',\n type: 'integer',\n notNull: true,\n },\n parent: {\n name: 'parent_id',\n type: idColType,\n notNull: true,\n },\n path: {\n name: 'path',\n type: 'varchar',\n\n notNull: true,\n },\n text: {\n name: 'text',\n type: 'varchar',\n },\n }\n\n if (hasLocalizedManyTextField) {\n columns.locale = {\n name: 'locale',\n type: 'enum',\n locale: true,\n }\n }\n\n const textsTableIndexes: Record<string, RawIndex> = {\n orderParentIdx: {\n name: buildIndexName({\n name: `${textsTableName}_order_parent`,\n adapter,\n appendSuffix: false,\n }),\n on: ['order', 'parent'],\n },\n }\n\n if (hasManyTextField === 'index') {\n textsTableIndexes.text_idx = {\n name: buildIndexName({ name: `${textsTableName}_text`, adapter }),\n on: 'text',\n }\n }\n\n if (hasLocalizedManyTextField) {\n textsTableIndexes.localeParent = {\n name: buildIndexName({\n name: `${textsTableName}_locale_parent`,\n adapter,\n appendSuffix: false,\n }),\n on: ['locale', 'parent'],\n }\n }\n\n textsTable = {\n name: textsTableName,\n columns,\n foreignKeys: {\n parentFk: {\n name: buildForeignKeyName({ name: `${textsTableName}_parent`, adapter }),\n columns: ['parent'],\n foreignColumns: [\n {\n name: 'id',\n table: tableName,\n },\n ],\n onDelete: 'cascade',\n },\n },\n indexes: textsTableIndexes,\n }\n\n adapter.rawTables[textsTableName] = textsTable\n\n adapter.rawRelations[textsTableName] = {\n parent: {\n type: 'one',\n fields: [\n {\n name: 'parent',\n table: textsTableName,\n },\n ],\n references: ['id'],\n relationName: '_texts',\n to: tableName,\n },\n }\n }\n\n if (hasManyNumberField) {\n const numbersTableName = `${rootTableName}_numbers`\n adapter.rawTables[numbersTableName] = numbersTable\n const columns: Record<string, RawColumn> = {\n id: {\n name: 'id',\n type: 'serial',\n primaryKey: true,\n },\n number: {\n name: 'number',\n type: 'numeric',\n },\n order: {\n name: 'order',\n type: 'integer',\n notNull: true,\n },\n parent: {\n name: 'parent_id',\n type: idColType,\n notNull: true,\n },\n path: {\n name: 'path',\n type: 'varchar',\n notNull: true,\n },\n }\n\n if (hasLocalizedManyNumberField) {\n columns.locale = {\n name: 'locale',\n type: 'enum',\n locale: true,\n }\n }\n\n const numbersTableIndexes: Record<string, RawIndex> = {\n orderParentIdx: {\n name: buildIndexName({ name: `${numbersTableName}_order_parent`, adapter }),\n on: ['order', 'parent'],\n },\n }\n\n if (hasManyNumberField === 'index') {\n numbersTableIndexes.numberIdx = {\n name: buildIndexName({ name: `${numbersTableName}_number`, adapter }),\n on: 'number',\n }\n }\n\n if (hasLocalizedManyNumberField) {\n numbersTableIndexes.localeParent = {\n name: buildIndexName({\n name: `${numbersTableName}_locale_parent`,\n adapter,\n appendSuffix: false,\n }),\n on: ['locale', 'parent'],\n }\n }\n\n numbersTable = {\n name: numbersTableName,\n columns,\n foreignKeys: {\n parentFk: {\n name: buildForeignKeyName({ name: `${numbersTableName}_parent`, adapter }),\n columns: ['parent'],\n foreignColumns: [\n {\n name: 'id',\n table: tableName,\n },\n ],\n onDelete: 'cascade',\n },\n },\n indexes: numbersTableIndexes,\n }\n\n adapter.rawTables[numbersTableName] = numbersTable\n\n adapter.rawRelations[numbersTableName] = {\n parent: {\n type: 'one',\n fields: [\n {\n name: 'parent',\n table: numbersTableName,\n },\n ],\n references: ['id'],\n relationName: '_numbers',\n to: tableName,\n },\n }\n }\n\n if (relationships.size) {\n const relationshipColumns: Record<string, RawColumn> = {\n id: {\n name: 'id',\n type: 'serial',\n primaryKey: true,\n },\n order: {\n name: 'order',\n type: 'integer',\n },\n parent: {\n name: 'parent_id',\n type: idColType,\n notNull: true,\n },\n path: {\n name: 'path',\n type: 'varchar',\n notNull: true,\n },\n }\n\n if (hasLocalizedRelationshipField) {\n relationshipColumns.locale = {\n name: 'locale',\n type: 'enum',\n locale: true,\n }\n }\n\n const relationshipsTableName = `${tableName}${adapter.relationshipsSuffix}`\n\n const relationshipIndexes: Record<string, RawIndex> = {\n order: {\n name: buildIndexName({ name: `${relationshipsTableName}_order`, adapter }),\n on: 'order',\n },\n parentIdx: {\n name: buildIndexName({ name: `${relationshipsTableName}_parent`, adapter }),\n on: 'parent',\n },\n pathIdx: {\n name: buildIndexName({ name: `${relationshipsTableName}_path`, adapter }),\n on: 'path',\n },\n }\n\n if (hasLocalizedRelationshipField) {\n relationshipIndexes.localeIdx = {\n name: buildIndexName({ name: `${relationshipsTableName}_locale`, adapter }),\n on: 'locale',\n }\n }\n\n const relationshipForeignKeys: Record<string, RawForeignKey> = {\n parentFk: {\n name: buildForeignKeyName({ name: `${relationshipsTableName}_parent`, adapter }),\n columns: ['parent'],\n foreignColumns: [\n {\n name: 'id',\n table: tableName,\n },\n ],\n onDelete: 'cascade',\n },\n }\n\n relationships.forEach((relationTo) => {\n const relationshipConfig = adapter.payload.collections[relationTo].config\n const formattedRelationTo = createTableName({\n adapter,\n config: relationshipConfig,\n throwValidationError: true,\n })\n let colType: 'integer' | 'numeric' | 'uuid' | 'varchar' = isUUIDType(adapter.idType)\n ? 'uuid'\n : 'integer'\n const relatedCollectionCustomIDType =\n adapter.payload.collections[relationshipConfig.slug]?.customIDType\n\n if (relatedCollectionCustomIDType === 'number') {\n colType = 'numeric'\n }\n if (relatedCollectionCustomIDType === 'text') {\n colType = 'varchar'\n }\n\n const colName = `${relationTo}ID`\n\n relationshipColumns[colName] = {\n name: `${formattedRelationTo}_id`,\n type: colType,\n }\n\n relationshipForeignKeys[`${relationTo}IdFk`] = {\n name: buildForeignKeyName({\n name: `${relationshipsTableName}_${toSnakeCase(relationTo)}`,\n adapter,\n }),\n columns: [colName],\n foreignColumns: [\n {\n name: 'id',\n table: formattedRelationTo,\n },\n ],\n onDelete: 'cascade',\n }\n\n const indexColumns = [colName]\n\n const unique = !disableUnique && uniqueRelationships.has(relationTo)\n\n if (unique) {\n indexColumns.push('path')\n }\n if (hasLocalizedRelationshipField) {\n indexColumns.push('locale')\n }\n\n const indexName = buildIndexName({\n name: `${relationshipsTableName}_${formattedRelationTo}_id`,\n adapter,\n })\n\n relationshipIndexes[indexName] = {\n name: indexName,\n on: indexColumns,\n unique,\n }\n })\n\n relationshipsTable = {\n name: relationshipsTableName,\n columns: relationshipColumns,\n foreignKeys: relationshipForeignKeys,\n indexes: relationshipIndexes,\n }\n\n adapter.rawTables[relationshipsTableName] = relationshipsTable\n\n const relationshipsTableRelations: Record<string, RawRelation> = {\n parent: {\n type: 'one',\n fields: [\n {\n name: 'parent',\n table: relationshipsTableName,\n },\n ],\n references: ['id'],\n relationName: '_rels',\n to: tableName,\n },\n }\n\n relationships.forEach((relationTo) => {\n const relatedTableName = createTableName({\n adapter,\n config: adapter.payload.collections[relationTo].config,\n throwValidationError: true,\n })\n const idColumnName = `${relationTo}ID`\n\n relationshipsTableRelations[idColumnName] = {\n type: 'one',\n fields: [\n {\n name: idColumnName,\n table: relationshipsTableName,\n },\n ],\n references: ['id'],\n relationName: relationTo,\n to: relatedTableName,\n }\n })\n adapter.rawRelations[relationshipsTableName] = relationshipsTableRelations\n }\n }\n\n const tableRelations: Record<string, RawRelation> = {}\n\n nonLocalizedRelations.forEach(({ type, relationName, target }, key) => {\n if (type === 'one') {\n tableRelations[key] = {\n type: 'one',\n fields: [\n {\n name: key,\n table: tableName,\n },\n ],\n references: ['id'],\n relationName: key,\n to: target,\n }\n }\n if (type === 'many') {\n tableRelations[key] = {\n type: 'many',\n relationName: relationName || key,\n to: target,\n }\n }\n })\n\n if (hasLocalizedField) {\n tableRelations._locales = {\n type: 'many',\n relationName: '_locales',\n to: localesTable.name,\n }\n }\n\n if (isRoot && textsTable) {\n tableRelations._texts = {\n type: 'many',\n relationName: '_texts',\n to: textsTable.name,\n }\n }\n\n if (isRoot && numbersTable) {\n tableRelations._numbers = {\n type: 'many',\n relationName: '_numbers',\n to: numbersTable.name,\n }\n }\n\n if (relationships.size && relationshipsTable) {\n tableRelations._rels = {\n type: 'many',\n relationName: '_rels',\n to: relationshipsTable.name,\n }\n }\n\n adapter.rawRelations[tableName] = tableRelations\n\n return {\n hasLocalizedManyNumberField,\n hasLocalizedManyTextField,\n hasLocalizedRelationshipField,\n hasManyNumberField,\n hasManyTextField,\n relationsToBuild,\n }\n}\n"],"names":["InvalidConfiguration","toSnakeCase","createTableName","buildForeignKeyName","buildIndexName","isUUIDType","traverseFields","buildTable","adapter","baseColumns","baseForeignKeys","baseIndexes","blocksTableNameMap","compoundIndexes","disableNotNull","disableRelsTableUnique","disableUnique","fields","parentIsLocalized","rootRelationships","rootRelationsToBuild","rootTableIDColType","rootTableName","incomingRootTableName","rootUniqueRelationships","setColumnID","tableName","timestamps","versions","withinLocalizedArrayOrBlock","isRoot","columns","indexes","localesColumns","localesIndexes","localesTable","textsTable","numbersTable","relationships","Set","uniqueRelationships","relationshipsTable","relationsToBuild","Map","idColType","hasLocalizedField","hasLocalizedManyNumberField","hasLocalizedManyTextField","hasLocalizedRelationshipField","hasManyNumberField","hasManyTextField","newTableName","parentTableName","localizedRelations","nonLocalizedRelations","forEach","type","localized","relationName","target","key","map","set","createdAt","name","defaultNow","mode","notNull","precision","withTimezone","updatedAt","table","foreignKeys","rawTables","size","localeTableName","localesSuffix","id","primaryKey","_locale","locale","_parentID","_localeParent","appendSuffix","on","unique","_parentIdFk","foreignColumns","onDelete","localeRelations","references","to","rawRelations","index","someLocalized","getTableToUse","path","pathHasLocalized","columnPath","replaceAll","push","join","length","indexName","textsTableName","order","parent","text","textsTableIndexes","orderParentIdx","text_idx","localeParent","parentFk","numbersTableName","number","numbersTableIndexes","numberIdx","relationshipColumns","relationshipsTableName","relationshipsSuffix","relationshipIndexes","parentIdx","pathIdx","localeIdx","relationshipForeignKeys","relationTo","relationshipConfig","payload","collections","config","formattedRelationTo","throwValidationError","colType","idType","relatedCollectionCustomIDType","slug","customIDType","colName","indexColumns","has","relationshipsTableRelations","relatedTableName","idColumnName","tableRelations","_locales","_texts","_numbers","_rels"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/schema/build.ts"],"sourcesContent":["import type { FlattenedField, SanitizedCompoundIndex } from 'payload'\n\nimport { InvalidConfiguration } from 'payload'\nimport toSnakeCase from 'to-snake-case'\n\nimport type {\n DrizzleAdapter,\n IDType,\n RawColumn,\n RawForeignKey,\n RawIndex,\n RawRelation,\n RawTable,\n RelationMap,\n SetColumnID,\n} from '../types.js'\n\nimport { createTableName } from '../createTableName.js'\nimport { buildForeignKeyName } from '../utilities/buildForeignKeyName.js'\nimport { buildIndexName } from '../utilities/buildIndexName.js'\nimport { isUUIDType } from '../utilities/isUUIDType.js'\nimport { traverseFields } from './traverseFields.js'\n\ntype Args = {\n adapter: DrizzleAdapter\n baseColumns?: Record<string, RawColumn>\n /**\n * After table is created, run these functions to add extra config to the table\n * ie. indexes, multiple columns, etc\n */\n baseForeignKeys?: Record<string, RawForeignKey>\n /**\n * After table is created, run these functions to add extra config to the table\n * ie. indexes, multiple columns, etc\n */\n baseIndexes?: Record<string, RawIndex>\n blocksTableNameMap: Record<string, number>\n buildNumbers?: boolean\n buildRelationships?: boolean\n compoundIndexes?: SanitizedCompoundIndex[]\n disableNotNull: boolean\n disableRelsTableUnique?: boolean\n disableUnique: boolean\n fields: FlattenedField[]\n parentIsLocalized: boolean\n rootRelationships?: Set<string>\n rootRelationsToBuild?: RelationMap\n rootTableIDColType?: IDType\n rootTableName?: string\n rootUniqueRelationships?: Set<string>\n setColumnID: SetColumnID\n tableName: string\n timestamps?: boolean\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 hasLocalizedManyNumberField: boolean\n hasLocalizedManyTextField: boolean\n hasLocalizedRelationshipField: boolean\n hasManyNumberField: 'index' | boolean\n hasManyTextField: 'index' | boolean\n relationsToBuild: RelationMap\n}\n\nexport const buildTable = ({\n adapter,\n baseColumns = {},\n baseForeignKeys = {},\n baseIndexes = {},\n blocksTableNameMap,\n compoundIndexes,\n disableNotNull,\n disableRelsTableUnique = false,\n disableUnique = false,\n fields,\n parentIsLocalized,\n rootRelationships,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName: incomingRootTableName,\n rootUniqueRelationships,\n setColumnID,\n tableName,\n timestamps,\n versions,\n withinLocalizedArrayOrBlock,\n}: Args): Result => {\n const isRoot = !incomingRootTableName\n const rootTableName = incomingRootTableName || tableName\n const columns: Record<string, RawColumn> = baseColumns\n const indexes: Record<string, RawIndex> = baseIndexes\n\n const localesColumns: Record<string, RawColumn> = {}\n const localesIndexes: Record<string, RawIndex> = {}\n let localesTable: RawTable\n let textsTable: RawTable\n let numbersTable: RawTable\n\n // Relationships to the base collection\n const relationships: Set<string> = rootRelationships || new Set()\n\n // Unique relationships to the base collection\n const uniqueRelationships: Set<string> = rootUniqueRelationships || new Set()\n\n let relationshipsTable: RawTable\n\n // Drizzle relations\n const relationsToBuild: RelationMap = new Map()\n\n const idColType: IDType = setColumnID({ adapter, columns, fields })\n\n const {\n hasLocalizedField,\n hasLocalizedManyNumberField,\n hasLocalizedManyTextField,\n hasLocalizedRelationshipField,\n hasManyNumberField,\n hasManyTextField,\n } = traverseFields({\n adapter,\n blocksTableNameMap,\n columns,\n disableNotNull,\n disableRelsTableUnique,\n disableUnique,\n fields,\n indexes,\n localesColumns,\n localesIndexes,\n newTableName: tableName,\n parentIsLocalized,\n parentTableName: tableName,\n relationships,\n relationsToBuild,\n rootRelationsToBuild: rootRelationsToBuild || relationsToBuild,\n rootTableIDColType: rootTableIDColType || idColType,\n rootTableName,\n setColumnID,\n uniqueRelationships,\n versions,\n withinLocalizedArrayOrBlock,\n })\n\n // split the relationsToBuild by localized and non-localized\n const localizedRelations = new Map()\n const nonLocalizedRelations = new Map()\n\n relationsToBuild.forEach(({ type, localized, relationName, target }, key) => {\n const map = localized ? localizedRelations : nonLocalizedRelations\n map.set(key, { type, relationName, target })\n })\n\n if (timestamps) {\n columns.createdAt = {\n name: 'created_at',\n type: 'timestamp',\n defaultNow: true,\n mode: 'string',\n notNull: true,\n precision: 3,\n withTimezone: true,\n }\n\n columns.updatedAt = {\n name: 'updated_at',\n type: 'timestamp',\n defaultNow: true,\n mode: 'string',\n notNull: true,\n precision: 3,\n withTimezone: true,\n }\n }\n\n const table: RawTable = {\n name: tableName,\n columns,\n foreignKeys: baseForeignKeys,\n indexes,\n }\n\n adapter.rawTables[tableName] = table\n\n if (hasLocalizedField || localizedRelations.size) {\n const localeTableName = `${tableName}${adapter.localesSuffix}`\n adapter.rawTables[localeTableName] = localesTable\n\n localesColumns.id = {\n name: 'id',\n type: 'serial',\n primaryKey: true,\n }\n\n localesColumns._locale = {\n name: '_locale',\n type: 'enum',\n locale: true,\n notNull: true,\n }\n\n localesColumns._parentID = {\n name: '_parent_id',\n type: idColType,\n notNull: true,\n }\n\n localesIndexes._localeParent = {\n name: buildIndexName({\n name: `${localeTableName}_parent_id_locale_unique`,\n adapter,\n appendSuffix: false,\n }),\n on: ['_parentID', '_locale'],\n unique: true,\n }\n\n localesTable = {\n name: localeTableName,\n columns: localesColumns,\n foreignKeys: {\n _parentIdFk: {\n name: buildForeignKeyName({ name: `${localeTableName}_parent_id`, adapter }),\n columns: ['_parentID'],\n foreignColumns: [\n {\n name: 'id',\n table: tableName,\n },\n ],\n onDelete: 'cascade',\n },\n },\n indexes: localesIndexes,\n }\n\n adapter.rawTables[localeTableName] = localesTable\n\n const localeRelations: Record<string, RawRelation> = {\n _parentID: {\n type: 'one',\n fields: [\n {\n name: '_parentID',\n table: localeTableName,\n },\n ],\n references: ['id'],\n relationName: '_locales',\n to: tableName,\n },\n }\n\n localizedRelations.forEach(({ type, target }, key) => {\n if (type === 'one') {\n localeRelations[key] = {\n type: 'one',\n fields: [\n {\n name: key,\n table: localeTableName,\n },\n ],\n references: ['id'],\n relationName: key,\n to: target,\n }\n }\n if (type === 'many') {\n localeRelations[key] = {\n type: 'many',\n relationName: key,\n to: target,\n }\n }\n })\n adapter.rawRelations[localeTableName] = localeRelations\n }\n\n if (compoundIndexes) {\n for (const index of compoundIndexes) {\n let someLocalized: boolean | null = null\n const columns: string[] = []\n\n const getTableToUse = () => {\n if (someLocalized) {\n return localesTable\n }\n\n return table\n }\n\n for (const { path, pathHasLocalized } of index.fields) {\n if (someLocalized === null) {\n someLocalized = pathHasLocalized\n }\n\n if (someLocalized !== pathHasLocalized) {\n throw new InvalidConfiguration(\n `Compound indexes within localized and non localized fields are not supported in SQL. Expected ${path} to be ${someLocalized ? 'non' : ''} localized.`,\n )\n }\n\n const columnPath = path.replaceAll('.', '_')\n\n if (!getTableToUse().columns[columnPath]) {\n throw new InvalidConfiguration(\n `Column ${columnPath} for compound index on ${path} was not found in the ${getTableToUse().name} table.`,\n )\n }\n\n columns.push(columnPath)\n }\n\n if (someLocalized) {\n columns.push('_locale')\n }\n\n let name = columns.join('_')\n // truncate against the limit, buildIndexName will handle collisions\n if (name.length > 63) {\n name = 'compound_index'\n }\n\n const indexName = buildIndexName({ name, adapter })\n\n getTableToUse().indexes[indexName] = {\n name: indexName,\n on: columns,\n unique: disableUnique ? false : index.unique,\n }\n }\n }\n\n if (isRoot) {\n if (hasManyTextField) {\n const textsTableName = `${rootTableName}_texts`\n adapter.rawTables[textsTableName] = textsTable\n\n const columns: Record<string, RawColumn> = {\n id: {\n name: 'id',\n type: 'serial',\n primaryKey: true,\n },\n order: {\n name: 'order',\n type: 'integer',\n notNull: true,\n },\n parent: {\n name: 'parent_id',\n type: idColType,\n notNull: true,\n },\n path: {\n name: 'path',\n type: 'varchar',\n\n notNull: true,\n },\n text: {\n name: 'text',\n type: 'varchar',\n },\n }\n\n if (hasLocalizedManyTextField) {\n columns.locale = {\n name: 'locale',\n type: 'enum',\n locale: true,\n }\n }\n\n const textsTableIndexes: Record<string, RawIndex> = {\n orderParentIdx: {\n name: buildIndexName({\n name: `${textsTableName}_order_parent`,\n adapter,\n appendSuffix: false,\n }),\n on: ['order', 'parent'],\n },\n }\n\n if (hasManyTextField === 'index') {\n textsTableIndexes.text_idx = {\n name: buildIndexName({ name: `${textsTableName}_text`, adapter }),\n on: 'text',\n }\n }\n\n if (hasLocalizedManyTextField) {\n textsTableIndexes.localeParent = {\n name: buildIndexName({\n name: `${textsTableName}_locale_parent`,\n adapter,\n appendSuffix: false,\n }),\n on: ['locale', 'parent'],\n }\n }\n\n textsTable = {\n name: textsTableName,\n columns,\n foreignKeys: {\n parentFk: {\n name: buildForeignKeyName({ name: `${textsTableName}_parent`, adapter }),\n columns: ['parent'],\n foreignColumns: [\n {\n name: 'id',\n table: tableName,\n },\n ],\n onDelete: 'cascade',\n },\n },\n indexes: textsTableIndexes,\n }\n\n adapter.rawTables[textsTableName] = textsTable\n\n adapter.rawRelations[textsTableName] = {\n parent: {\n type: 'one',\n fields: [\n {\n name: 'parent',\n table: textsTableName,\n },\n ],\n references: ['id'],\n relationName: '_texts',\n to: tableName,\n },\n }\n }\n\n if (hasManyNumberField) {\n const numbersTableName = `${rootTableName}_numbers`\n adapter.rawTables[numbersTableName] = numbersTable\n const columns: Record<string, RawColumn> = {\n id: {\n name: 'id',\n type: 'serial',\n primaryKey: true,\n },\n number: {\n name: 'number',\n type: 'numeric',\n },\n order: {\n name: 'order',\n type: 'integer',\n notNull: true,\n },\n parent: {\n name: 'parent_id',\n type: idColType,\n notNull: true,\n },\n path: {\n name: 'path',\n type: 'varchar',\n notNull: true,\n },\n }\n\n if (hasLocalizedManyNumberField) {\n columns.locale = {\n name: 'locale',\n type: 'enum',\n locale: true,\n }\n }\n\n const numbersTableIndexes: Record<string, RawIndex> = {\n orderParentIdx: {\n name: buildIndexName({ name: `${numbersTableName}_order_parent`, adapter }),\n on: ['order', 'parent'],\n },\n }\n\n if (hasManyNumberField === 'index') {\n numbersTableIndexes.numberIdx = {\n name: buildIndexName({ name: `${numbersTableName}_number`, adapter }),\n on: 'number',\n }\n }\n\n if (hasLocalizedManyNumberField) {\n numbersTableIndexes.localeParent = {\n name: buildIndexName({\n name: `${numbersTableName}_locale_parent`,\n adapter,\n appendSuffix: false,\n }),\n on: ['locale', 'parent'],\n }\n }\n\n numbersTable = {\n name: numbersTableName,\n columns,\n foreignKeys: {\n parentFk: {\n name: buildForeignKeyName({ name: `${numbersTableName}_parent`, adapter }),\n columns: ['parent'],\n foreignColumns: [\n {\n name: 'id',\n table: tableName,\n },\n ],\n onDelete: 'cascade',\n },\n },\n indexes: numbersTableIndexes,\n }\n\n adapter.rawTables[numbersTableName] = numbersTable\n\n adapter.rawRelations[numbersTableName] = {\n parent: {\n type: 'one',\n fields: [\n {\n name: 'parent',\n table: numbersTableName,\n },\n ],\n references: ['id'],\n relationName: '_numbers',\n to: tableName,\n },\n }\n }\n\n if (relationships.size) {\n const relationshipColumns: Record<string, RawColumn> = {\n id: {\n name: 'id',\n type: 'serial',\n primaryKey: true,\n },\n order: {\n name: 'order',\n type: 'integer',\n },\n parent: {\n name: 'parent_id',\n type: idColType,\n notNull: true,\n },\n path: {\n name: 'path',\n type: 'varchar',\n notNull: true,\n },\n }\n\n if (hasLocalizedRelationshipField) {\n relationshipColumns.locale = {\n name: 'locale',\n type: 'enum',\n locale: true,\n }\n }\n\n const relationshipsTableName = `${tableName}${adapter.relationshipsSuffix}`\n\n const relationshipIndexes: Record<string, RawIndex> = {\n order: {\n name: buildIndexName({ name: `${relationshipsTableName}_order`, adapter }),\n on: 'order',\n },\n parentIdx: {\n name: buildIndexName({ name: `${relationshipsTableName}_parent`, adapter }),\n on: 'parent',\n },\n pathIdx: {\n name: buildIndexName({ name: `${relationshipsTableName}_path`, adapter }),\n on: 'path',\n },\n }\n\n if (hasLocalizedRelationshipField) {\n relationshipIndexes.localeIdx = {\n name: buildIndexName({ name: `${relationshipsTableName}_locale`, adapter }),\n on: 'locale',\n }\n }\n\n const relationshipForeignKeys: Record<string, RawForeignKey> = {\n parentFk: {\n name: buildForeignKeyName({ name: `${relationshipsTableName}_parent`, adapter }),\n columns: ['parent'],\n foreignColumns: [\n {\n name: 'id',\n table: tableName,\n },\n ],\n onDelete: 'cascade',\n },\n }\n\n relationships.forEach((relationTo) => {\n const relationshipConfig = adapter.payload.collections[relationTo].config\n const formattedRelationTo = createTableName({\n adapter,\n config: relationshipConfig,\n throwValidationError: true,\n })\n let colType: 'integer' | 'numeric' | 'uuid' | 'varchar' = isUUIDType(adapter.idType)\n ? 'uuid'\n : 'integer'\n const relatedCollectionCustomIDType =\n adapter.payload.collections[relationshipConfig.slug]?.customIDType\n\n if (relatedCollectionCustomIDType === 'number') {\n colType = 'numeric'\n }\n if (relatedCollectionCustomIDType === 'text') {\n colType = 'varchar'\n }\n\n const colName = `${relationTo}ID`\n\n relationshipColumns[colName] = {\n name: `${formattedRelationTo}_id`,\n type: colType,\n }\n\n relationshipForeignKeys[`${relationTo}IdFk`] = {\n name: buildForeignKeyName({\n name: `${relationshipsTableName}_${toSnakeCase(relationTo)}`,\n adapter,\n }),\n columns: [colName],\n foreignColumns: [\n {\n name: 'id',\n table: formattedRelationTo,\n },\n ],\n onDelete: 'cascade',\n }\n\n const indexColumns = [colName]\n\n const unique = !disableUnique && uniqueRelationships.has(relationTo)\n\n if (unique) {\n indexColumns.push('path')\n }\n if (hasLocalizedRelationshipField) {\n indexColumns.push('locale')\n }\n\n const indexName = buildIndexName({\n name: `${relationshipsTableName}_${formattedRelationTo}_id`,\n adapter,\n })\n\n relationshipIndexes[indexName] = {\n name: indexName,\n on: indexColumns,\n unique,\n }\n })\n\n relationshipsTable = {\n name: relationshipsTableName,\n columns: relationshipColumns,\n foreignKeys: relationshipForeignKeys,\n indexes: relationshipIndexes,\n }\n\n adapter.rawTables[relationshipsTableName] = relationshipsTable\n\n const relationshipsTableRelations: Record<string, RawRelation> = {\n parent: {\n type: 'one',\n fields: [\n {\n name: 'parent',\n table: relationshipsTableName,\n },\n ],\n references: ['id'],\n relationName: '_rels',\n to: tableName,\n },\n }\n\n relationships.forEach((relationTo) => {\n const relatedTableName = createTableName({\n adapter,\n config: adapter.payload.collections[relationTo].config,\n throwValidationError: true,\n })\n const idColumnName = `${relationTo}ID`\n\n relationshipsTableRelations[idColumnName] = {\n type: 'one',\n fields: [\n {\n name: idColumnName,\n table: relationshipsTableName,\n },\n ],\n references: ['id'],\n relationName: relationTo,\n to: relatedTableName,\n }\n })\n adapter.rawRelations[relationshipsTableName] = relationshipsTableRelations\n }\n }\n\n const tableRelations: Record<string, RawRelation> = {}\n\n nonLocalizedRelations.forEach(({ type, relationName, target }, key) => {\n if (type === 'one') {\n tableRelations[key] = {\n type: 'one',\n fields: [\n {\n name: key,\n table: tableName,\n },\n ],\n references: ['id'],\n relationName: key,\n to: target,\n }\n }\n if (type === 'many') {\n tableRelations[key] = {\n type: 'many',\n relationName: relationName || key,\n to: target,\n }\n }\n })\n\n if (hasLocalizedField) {\n tableRelations._locales = {\n type: 'many',\n relationName: '_locales',\n to: localesTable.name,\n }\n }\n\n if (isRoot && textsTable) {\n tableRelations._texts = {\n type: 'many',\n relationName: '_texts',\n to: textsTable.name,\n }\n }\n\n if (isRoot && numbersTable) {\n tableRelations._numbers = {\n type: 'many',\n relationName: '_numbers',\n to: numbersTable.name,\n }\n }\n\n if (relationships.size && relationshipsTable) {\n tableRelations._rels = {\n type: 'many',\n relationName: '_rels',\n to: relationshipsTable.name,\n }\n }\n\n adapter.rawRelations[tableName] = tableRelations\n\n return {\n hasLocalizedManyNumberField,\n hasLocalizedManyTextField,\n hasLocalizedRelationshipField,\n hasManyNumberField,\n hasManyTextField,\n relationsToBuild,\n }\n}\n"],"names":["InvalidConfiguration","toSnakeCase","createTableName","buildForeignKeyName","buildIndexName","isUUIDType","traverseFields","buildTable","adapter","baseColumns","baseForeignKeys","baseIndexes","blocksTableNameMap","compoundIndexes","disableNotNull","disableRelsTableUnique","disableUnique","fields","parentIsLocalized","rootRelationships","rootRelationsToBuild","rootTableIDColType","rootTableName","incomingRootTableName","rootUniqueRelationships","setColumnID","tableName","timestamps","versions","withinLocalizedArrayOrBlock","isRoot","columns","indexes","localesColumns","localesIndexes","localesTable","textsTable","numbersTable","relationships","Set","uniqueRelationships","relationshipsTable","relationsToBuild","Map","idColType","hasLocalizedField","hasLocalizedManyNumberField","hasLocalizedManyTextField","hasLocalizedRelationshipField","hasManyNumberField","hasManyTextField","newTableName","parentTableName","localizedRelations","nonLocalizedRelations","forEach","type","localized","relationName","target","key","map","set","createdAt","name","defaultNow","mode","notNull","precision","withTimezone","updatedAt","table","foreignKeys","rawTables","size","localeTableName","localesSuffix","id","primaryKey","_locale","locale","_parentID","_localeParent","appendSuffix","on","unique","_parentIdFk","foreignColumns","onDelete","localeRelations","references","to","rawRelations","index","someLocalized","getTableToUse","path","pathHasLocalized","columnPath","replaceAll","push","join","length","indexName","textsTableName","order","parent","text","textsTableIndexes","orderParentIdx","text_idx","localeParent","parentFk","numbersTableName","number","numbersTableIndexes","numberIdx","relationshipColumns","relationshipsTableName","relationshipsSuffix","relationshipIndexes","parentIdx","pathIdx","localeIdx","relationshipForeignKeys","relationTo","relationshipConfig","payload","collections","config","formattedRelationTo","throwValidationError","colType","idType","relatedCollectionCustomIDType","slug","customIDType","colName","indexColumns","has","relationshipsTableRelations","relatedTableName","idColumnName","tableRelations","_locales","_texts","_numbers","_rels"],"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,"sources":["../../src/sqlite/execute.ts"],"sourcesContent":["import { sql } from 'drizzle-orm'\n\nimport type { Execute } from './types.js'\n\nexport const execute: Execute<any> = function execute({ db, drizzle, raw, sql: statement }) {\n const executeFrom = (db ?? drizzle)\n\n if (raw) {\n const result = executeFrom.run(sql.raw(raw))\n return result\n } else {\n const result = executeFrom.run(statement)\n return result\n }\n}\n"],"names":["sql","execute","db","drizzle","raw","statement","executeFrom","result","run"],"mappings":"AAAA,SAASA,GAAG,QAAQ,cAAa;AAIjC,OAAO,MAAMC,UAAwB,SAASA,QAAQ,EAAEC,EAAE,EAAEC,OAAO,EAAEC,GAAG,EAAEJ,KAAKK,SAAS,EAAE;IACxF,MAAMC,cAAeJ,MAAMC;IAE3B,IAAIC,KAAK;QACP,MAAMG,SAASD,YAAYE,GAAG,CAACR,IAAII,GAAG,CAACA;QACvC,OAAOG;IACT,OAAO;QACL,MAAMA,SAASD,YAAYE,GAAG,CAACH;QAC/B,OAAOE;IACT;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/sqlite/execute.ts"],"sourcesContent":["import { sql } from 'drizzle-orm'\n\nimport type { Execute } from './types.js'\n\nexport const execute: Execute<any> = function execute({ db, drizzle, raw, sql: statement }) {\n const executeFrom = db ?? drizzle\n\n if (raw) {\n const result = executeFrom.run(sql.raw(raw))\n return result\n } else {\n const result = executeFrom.run(statement)\n return result\n }\n}\n"],"names":["sql","execute","db","drizzle","raw","statement","executeFrom","result","run"],"mappings":"AAAA,SAASA,GAAG,QAAQ,cAAa;AAIjC,OAAO,MAAMC,UAAwB,SAASA,QAAQ,EAAEC,EAAE,EAAEC,OAAO,EAAEC,GAAG,EAAEJ,KAAKK,SAAS,EAAE;IACxF,MAAMC,cAAcJ,MAAMC;IAE1B,IAAIC,KAAK;QACP,MAAMG,SAASD,YAAYE,GAAG,CAACR,IAAII,GAAG,CAACA;QACvC,OAAOG;IACT,OAAO;QACL,MAAMA,SAASD,YAAYE,GAAG,CAACH;QAC/B,OAAOE;IACT;AACF,EAAC"}
@@ -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,MAoCpB,CAAA"}
@@ -1,9 +1,12 @@
1
+ import { getTableColumns } from 'drizzle-orm';
1
2
  export const insert = async function({ db, 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){
@@ -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, 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 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":["getTableColumns","insert","db","onConflictDoUpdate","tableName","values","table","tables","limitedBoundParameters","Array","isArray","results","colsPerRow","Math","max","Object","keys","length","maxParams","maxRowsPerBatch","floor","i","batch","slice","batchResult","returning","push","result"],"mappings":"AAAA,SAASA,eAAe,QAAQ,cAAa;AAI7C,OAAO,MAAMC,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,+FAA+F;QAC/F,0FAA0F;QAC1F,MAAMC,aAAaC,KAAKC,GAAG,CAAC,GAAGC,OAAOC,IAAI,CAAChB,gBAAgBM,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,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"}
@@ -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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"}