@payloadcms/drizzle 4.0.0-internal.fa345ef → 4.0.0-internal.fec2230

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 (196) 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 +2 -0
  5. package/dist/exports/postgres.d.ts.map +1 -1
  6. package/dist/exports/postgres.js +2 -0
  7. package/dist/exports/postgres.js.map +1 -1
  8. package/dist/find/buildFindManyArgs.d.ts.map +1 -1
  9. package/dist/find/findMany.d.ts.map +1 -1
  10. package/dist/find/traverseFields.d.ts.map +1 -1
  11. package/dist/index.d.ts +3 -2
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +1 -0
  14. package/dist/index.js.map +1 -1
  15. package/dist/migrate.d.ts.map +1 -1
  16. package/dist/migrate.js +35 -13
  17. package/dist/migrate.js.map +1 -1
  18. package/dist/migrateDown.d.ts +2 -1
  19. package/dist/migrateDown.d.ts.map +1 -1
  20. package/dist/migrateDown.js +12 -2
  21. package/dist/migrateDown.js.map +1 -1
  22. package/dist/migrateFresh.d.ts +4 -2
  23. package/dist/migrateFresh.d.ts.map +1 -1
  24. package/dist/migrateFresh.js +21 -7
  25. package/dist/migrateFresh.js.map +1 -1
  26. package/dist/migrateRefresh.d.ts +2 -1
  27. package/dist/migrateRefresh.d.ts.map +1 -1
  28. package/dist/migrateRefresh.js +14 -3
  29. package/dist/migrateRefresh.js.map +1 -1
  30. package/dist/migrateReset.d.ts +2 -1
  31. package/dist/migrateReset.d.ts.map +1 -1
  32. package/dist/migrateReset.js +12 -2
  33. package/dist/migrateReset.js.map +1 -1
  34. package/dist/migrateStatus.d.ts +2 -1
  35. package/dist/migrateStatus.d.ts.map +1 -1
  36. package/dist/migrateStatus.js +11 -6
  37. package/dist/migrateStatus.js.map +1 -1
  38. package/dist/postgres/createDatabase.d.ts.map +1 -1
  39. package/dist/postgres/createExtensions.d.ts.map +1 -1
  40. package/dist/postgres/createJSONQuery/index.d.ts.map +1 -1
  41. package/dist/postgres/init.d.ts.map +1 -1
  42. package/dist/postgres/init.js +6 -0
  43. package/dist/postgres/init.js.map +1 -1
  44. package/dist/postgres/predefinedMigrations/v2-v3/fetchAndResave/index.d.ts.map +1 -1
  45. package/dist/postgres/predefinedMigrations/v2-v3/fetchAndResave/traverseFields.d.ts.map +1 -1
  46. package/dist/postgres/predefinedMigrations/v2-v3/groupUpSQLStatements.d.ts.map +1 -1
  47. package/dist/postgres/predefinedMigrations/v2-v3/index.d.ts.map +1 -1
  48. package/dist/postgres/predefinedMigrations/v2-v3/index.js +1 -1
  49. package/dist/postgres/predefinedMigrations/v2-v3/index.js.map +1 -1
  50. package/dist/postgres/predefinedMigrations/v2-v3/migrateRelationships.d.ts.map +1 -1
  51. package/dist/postgres/predefinedMigrations/v2-v3/traverseFields.d.ts.map +1 -1
  52. package/dist/postgres/query/assertOperatorHandlerExtensionsInstalled.d.ts +15 -0
  53. package/dist/postgres/query/assertOperatorHandlerExtensionsInstalled.d.ts.map +1 -0
  54. package/dist/postgres/query/assertOperatorHandlerExtensionsInstalled.js +25 -0
  55. package/dist/postgres/query/assertOperatorHandlerExtensionsInstalled.js.map +1 -0
  56. package/dist/postgres/query/assertOperatorHandlerExtensionsInstalled.spec.js +91 -0
  57. package/dist/postgres/query/assertOperatorHandlerExtensionsInstalled.spec.js.map +1 -0
  58. package/dist/postgres/query/postgresUnaccent.d.ts +13 -0
  59. package/dist/postgres/query/postgresUnaccent.d.ts.map +1 -0
  60. package/dist/postgres/query/postgresUnaccent.js +40 -0
  61. package/dist/postgres/query/postgresUnaccent.js.map +1 -0
  62. package/dist/postgres/query/postgresUnaccent.spec.js +71 -0
  63. package/dist/postgres/query/postgresUnaccent.spec.js.map +1 -0
  64. package/dist/postgres/schema/buildDrizzleTable.d.ts.map +1 -1
  65. package/dist/postgres/schema/geometryColumn.d.ts +2 -2
  66. package/dist/postgres/schema/geometryColumn.d.ts.map +1 -1
  67. package/dist/postgres/types.d.ts +13 -2
  68. package/dist/postgres/types.d.ts.map +1 -1
  69. package/dist/postgres/types.js.map +1 -1
  70. package/dist/queries/addJoinTable.d.ts +1 -1
  71. package/dist/queries/addJoinTable.d.ts.map +1 -1
  72. package/dist/queries/buildOperatorConstraint.d.ts +22 -0
  73. package/dist/queries/buildOperatorConstraint.d.ts.map +1 -0
  74. package/dist/queries/buildOperatorConstraint.js +63 -0
  75. package/dist/queries/buildOperatorConstraint.js.map +1 -0
  76. package/dist/queries/buildOperatorConstraint.spec.js +348 -0
  77. package/dist/queries/buildOperatorConstraint.spec.js.map +1 -0
  78. package/dist/queries/buildOrderBy.d.ts +1 -1
  79. package/dist/queries/buildOrderBy.d.ts.map +1 -1
  80. package/dist/queries/buildQuery.d.ts.map +1 -1
  81. package/dist/queries/getTableAlias.d.ts.map +1 -1
  82. package/dist/queries/getTableColumnFromPath.d.ts +12 -3
  83. package/dist/queries/getTableColumnFromPath.d.ts.map +1 -1
  84. package/dist/queries/getTableColumnFromPath.js +50 -27
  85. package/dist/queries/getTableColumnFromPath.js.map +1 -1
  86. package/dist/queries/operatorMap.d.ts +7 -3
  87. package/dist/queries/operatorMap.d.ts.map +1 -1
  88. package/dist/queries/operatorMap.js.map +1 -1
  89. package/dist/queries/parseParams.d.ts.map +1 -1
  90. package/dist/queries/parseParams.js +203 -8
  91. package/dist/queries/parseParams.js.map +1 -1
  92. package/dist/queries/resolveRelationshipPath.d.ts +36 -0
  93. package/dist/queries/resolveRelationshipPath.d.ts.map +1 -0
  94. package/dist/queries/resolveRelationshipPath.js +66 -0
  95. package/dist/queries/resolveRelationshipPath.js.map +1 -0
  96. package/dist/queries/sanitizeQueryValue.d.ts.map +1 -1
  97. package/dist/queries/selectDistinct.d.ts.map +1 -1
  98. package/dist/queries/validateOperatorHandlers.d.ts +8 -0
  99. package/dist/queries/validateOperatorHandlers.d.ts.map +1 -0
  100. package/dist/queries/validateOperatorHandlers.js +30 -0
  101. package/dist/queries/validateOperatorHandlers.js.map +1 -0
  102. package/dist/queries/validateOperatorHandlers.spec.js +142 -0
  103. package/dist/queries/validateOperatorHandlers.spec.js.map +1 -0
  104. package/dist/schema/build.d.ts.map +1 -1
  105. package/dist/schema/buildDrizzleRelations.d.ts.map +1 -1
  106. package/dist/schema/buildRawSchema.d.ts.map +1 -1
  107. package/dist/schema/buildRawSchema.spec.js +290 -0
  108. package/dist/schema/buildRawSchema.spec.js.map +1 -0
  109. package/dist/schema/idToUUID.d.ts.map +1 -1
  110. package/dist/schema/traverseFields.d.ts.map +1 -1
  111. package/dist/schema/traverseFields.js +6 -5
  112. package/dist/schema/traverseFields.js.map +1 -1
  113. package/dist/schema/withDefault.d.ts.map +1 -1
  114. package/dist/sqlite/createJSONQuery/convertPathToJSONTraversal.d.ts.map +1 -1
  115. package/dist/sqlite/createJSONQuery/index.d.ts.map +1 -1
  116. package/dist/transform/read/hasManyNumber.d.ts.map +1 -1
  117. package/dist/transform/read/hasManyText.d.ts.map +1 -1
  118. package/dist/transform/read/index.d.ts.map +1 -1
  119. package/dist/transform/read/relationship.d.ts.map +1 -1
  120. package/dist/transform/read/traverseFields.d.ts.map +1 -1
  121. package/dist/transform/write/array.d.ts.map +1 -1
  122. package/dist/transform/write/blocks.d.ts.map +1 -1
  123. package/dist/transform/write/index.d.ts.map +1 -1
  124. package/dist/transform/write/numbers.d.ts.map +1 -1
  125. package/dist/transform/write/relationships.d.ts.map +1 -1
  126. package/dist/transform/write/selects.d.ts.map +1 -1
  127. package/dist/transform/write/texts.d.ts.map +1 -1
  128. package/dist/transform/write/traverseFields.d.ts.map +1 -1
  129. package/dist/transform/write/traverseFields.js +3 -0
  130. package/dist/transform/write/traverseFields.js.map +1 -1
  131. package/dist/types.d.ts +50 -2
  132. package/dist/types.d.ts.map +1 -1
  133. package/dist/types.js.map +1 -1
  134. package/dist/updateJobs.d.ts.map +1 -1
  135. package/dist/updateJobs.js +37 -0
  136. package/dist/updateJobs.js.map +1 -1
  137. package/dist/upsertRow/deleteExistingArrayRows.d.ts.map +1 -1
  138. package/dist/upsertRow/deleteExistingRowsByPath.d.ts.map +1 -1
  139. package/dist/upsertRow/handleUpsertError.d.ts.map +1 -1
  140. package/dist/upsertRow/index.d.ts.map +1 -1
  141. package/dist/upsertRow/insertArrays.d.ts.map +1 -1
  142. package/dist/upsertRow/insertArrays.js +2 -1
  143. package/dist/upsertRow/insertArrays.js.map +1 -1
  144. package/dist/upsertRow/shouldUseOptimizedUpsertRow.d.ts.map +1 -1
  145. package/dist/utilities/appendPrefixToKeys.d.ts.map +1 -1
  146. package/dist/utilities/blocksToJsonMigrator.d.ts.map +1 -1
  147. package/dist/utilities/buildCreateMigration.d.ts.map +1 -1
  148. package/dist/utilities/buildCreateMigration.js +12 -8
  149. package/dist/utilities/buildCreateMigration.js.map +1 -1
  150. package/dist/utilities/buildForeignKeyName.d.ts.map +1 -1
  151. package/dist/utilities/buildForeignKeyName.js +3 -2
  152. package/dist/utilities/buildForeignKeyName.js.map +1 -1
  153. package/dist/utilities/buildIndexName.d.ts.map +1 -1
  154. package/dist/utilities/buildIndexName.js +3 -2
  155. package/dist/utilities/buildIndexName.js.map +1 -1
  156. package/dist/utilities/checkTruncatedIdentifiers.d.ts +13 -0
  157. package/dist/utilities/checkTruncatedIdentifiers.d.ts.map +1 -0
  158. package/dist/utilities/checkTruncatedIdentifiers.js +56 -0
  159. package/dist/utilities/checkTruncatedIdentifiers.js.map +1 -0
  160. package/dist/utilities/checkTruncatedIdentifiers.spec.js +301 -0
  161. package/dist/utilities/checkTruncatedIdentifiers.spec.js.map +1 -0
  162. package/dist/utilities/createBlocksMap.d.ts.map +1 -1
  163. package/dist/utilities/createRelationshipMap.d.ts.map +1 -1
  164. package/dist/utilities/createSchemaGenerator.d.ts.map +1 -1
  165. package/dist/utilities/createSchemaGenerator.js +3 -0
  166. package/dist/utilities/createSchemaGenerator.js.map +1 -1
  167. package/dist/utilities/escapeSQLValue.d.ts.map +1 -1
  168. package/dist/utilities/executeSchemaHooks.d.ts.map +1 -1
  169. package/dist/utilities/extendDrizzleTable.d.ts.map +1 -1
  170. package/dist/utilities/getArrayRelationName.d.ts.map +1 -1
  171. package/dist/utilities/getCollectionIdType.d.ts.map +1 -1
  172. package/dist/utilities/getMigrationTemplate.d.ts.map +1 -1
  173. package/dist/utilities/getNameFromDrizzleTable.d.ts.map +1 -1
  174. package/dist/utilities/getPrimaryDb.d.ts +1 -1
  175. package/dist/utilities/getPrimaryDb.d.ts.map +1 -1
  176. package/dist/utilities/getTransaction.d.ts +1 -1
  177. package/dist/utilities/getTransaction.d.ts.map +1 -1
  178. package/dist/utilities/hasLocalesTable.d.ts.map +1 -1
  179. package/dist/utilities/isPolymorphicRelationship.d.ts.map +1 -1
  180. package/dist/utilities/isUUIDType.d.ts.map +1 -1
  181. package/dist/utilities/json.d.ts.map +1 -1
  182. package/dist/utilities/migrationTableExists.d.ts.map +1 -1
  183. package/dist/utilities/parseError.d.ts.map +1 -1
  184. package/dist/utilities/pushDevSchema.d.ts.map +1 -1
  185. package/dist/utilities/rawConstraint.d.ts.map +1 -1
  186. package/dist/utilities/sanitizePathSegment.d.ts.map +1 -1
  187. package/dist/utilities/validateExistingBlockIsIdentical.d.ts +1 -5
  188. package/dist/utilities/validateExistingBlockIsIdentical.d.ts.map +1 -1
  189. package/dist/utilities/validateExistingBlockIsIdentical.js.map +1 -1
  190. package/dist/utilities/validateIdentifierLength.d.ts +12 -0
  191. package/dist/utilities/validateIdentifierLength.d.ts.map +1 -0
  192. package/dist/utilities/validateIdentifierLength.js +18 -0
  193. package/dist/utilities/validateIdentifierLength.js.map +1 -0
  194. package/dist/utilities/validateIdentifierLength.spec.js +19 -0
  195. package/dist/utilities/validateIdentifierLength.spec.js.map +1 -0
  196. package/package.json +3 -3
@@ -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"}
@@ -0,0 +1,142 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { validateOperatorHandlers } from './validateOperatorHandlers.js';
3
+ const transformHandler = (overrides = {})=>({
4
+ name: 'transform',
5
+ operators: [
6
+ 'contains'
7
+ ],
8
+ transformOperands: ({ column, value })=>({
9
+ column,
10
+ value
11
+ }),
12
+ ...overrides
13
+ });
14
+ const replacementHandler = (overrides = {})=>({
15
+ name: 'replace',
16
+ operators: [
17
+ 'contains'
18
+ ],
19
+ build: ()=>null,
20
+ ...overrides
21
+ });
22
+ describe('validateOperatorHandlers', ()=>{
23
+ it('does not throw when zero handlers are configured', ()=>{
24
+ expect(()=>validateOperatorHandlers([])).not.toThrow();
25
+ });
26
+ it('does not throw for any number of non-conflicting operand-transform handlers', ()=>{
27
+ expect(()=>validateOperatorHandlers([
28
+ transformHandler({
29
+ name: 'a'
30
+ }),
31
+ transformHandler({
32
+ name: 'b'
33
+ }),
34
+ transformHandler({
35
+ name: 'c'
36
+ })
37
+ ])).not.toThrow();
38
+ });
39
+ it('throws when two build handlers list the same resolved operator, naming both handlers and the operator', ()=>{
40
+ expect(()=>validateOperatorHandlers([
41
+ replacementHandler({
42
+ name: 'handler-a',
43
+ operators: [
44
+ 'contains'
45
+ ]
46
+ }),
47
+ replacementHandler({
48
+ name: 'handler-b',
49
+ operators: [
50
+ 'contains'
51
+ ]
52
+ })
53
+ ])).toThrow(/handler-a/);
54
+ expect(()=>validateOperatorHandlers([
55
+ replacementHandler({
56
+ name: 'handler-a',
57
+ operators: [
58
+ 'contains'
59
+ ]
60
+ }),
61
+ replacementHandler({
62
+ name: 'handler-b',
63
+ operators: [
64
+ 'contains'
65
+ ]
66
+ })
67
+ ])).toThrow(/handler-b/);
68
+ expect(()=>validateOperatorHandlers([
69
+ replacementHandler({
70
+ name: 'handler-a',
71
+ operators: [
72
+ 'contains'
73
+ ]
74
+ }),
75
+ replacementHandler({
76
+ name: 'handler-b',
77
+ operators: [
78
+ 'contains'
79
+ ]
80
+ })
81
+ ])).toThrow(/contains/);
82
+ });
83
+ it('does not throw when two build handlers target the same operator but declare disjoint fieldTypes', ()=>{
84
+ expect(()=>validateOperatorHandlers([
85
+ replacementHandler({
86
+ name: 'text',
87
+ operators: [
88
+ 'contains'
89
+ ],
90
+ fieldTypes: [
91
+ 'text'
92
+ ]
93
+ }),
94
+ replacementHandler({
95
+ name: 'number',
96
+ operators: [
97
+ 'contains'
98
+ ],
99
+ fieldTypes: [
100
+ 'number'
101
+ ]
102
+ })
103
+ ])).not.toThrow();
104
+ });
105
+ it('throws when two build handlers target the same operator and at least one declares no fieldTypes', ()=>{
106
+ expect(()=>validateOperatorHandlers([
107
+ replacementHandler({
108
+ name: 'unrestricted',
109
+ operators: [
110
+ 'contains'
111
+ ]
112
+ }),
113
+ replacementHandler({
114
+ name: 'text',
115
+ operators: [
116
+ 'contains'
117
+ ],
118
+ fieldTypes: [
119
+ 'text'
120
+ ]
121
+ })
122
+ ])).toThrow();
123
+ });
124
+ it('throws when a handler object defines both build and transformOperands', ()=>{
125
+ const malformed = {
126
+ name: 'malformed',
127
+ operators: [
128
+ 'contains'
129
+ ],
130
+ build: ()=>null,
131
+ transformOperands: ({ column, value })=>({
132
+ column,
133
+ value
134
+ })
135
+ };
136
+ expect(()=>validateOperatorHandlers([
137
+ malformed
138
+ ])).toThrow(/malformed/);
139
+ });
140
+ });
141
+
142
+ //# sourceMappingURL=validateOperatorHandlers.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/queries/validateOperatorHandlers.spec.ts"],"sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport type { DrizzleOperatorHandler } from '../types.js'\n\nimport { validateOperatorHandlers } from './validateOperatorHandlers.js'\n\nconst transformHandler = (\n overrides: Partial<DrizzleOperatorHandler> = {},\n): DrizzleOperatorHandler =>\n ({\n name: 'transform',\n operators: ['contains'],\n transformOperands: ({ column, value }) => ({ column, value }),\n ...overrides,\n }) as DrizzleOperatorHandler\n\nconst replacementHandler = (\n overrides: Partial<DrizzleOperatorHandler> = {},\n): DrizzleOperatorHandler =>\n ({\n name: 'replace',\n operators: ['contains'],\n build: () => null as any,\n ...overrides,\n }) as DrizzleOperatorHandler\n\ndescribe('validateOperatorHandlers', () => {\n it('does not throw when zero handlers are configured', () => {\n expect(() => validateOperatorHandlers([])).not.toThrow()\n })\n\n it('does not throw for any number of non-conflicting operand-transform handlers', () => {\n expect(() =>\n validateOperatorHandlers([\n transformHandler({ name: 'a' }),\n transformHandler({ name: 'b' }),\n transformHandler({ name: 'c' }),\n ]),\n ).not.toThrow()\n })\n\n it('throws when two build handlers list the same resolved operator, naming both handlers and the operator', () => {\n expect(() =>\n validateOperatorHandlers([\n replacementHandler({ name: 'handler-a', operators: ['contains'] }),\n replacementHandler({ name: 'handler-b', operators: ['contains'] }),\n ]),\n ).toThrow(/handler-a/)\n\n expect(() =>\n validateOperatorHandlers([\n replacementHandler({ name: 'handler-a', operators: ['contains'] }),\n replacementHandler({ name: 'handler-b', operators: ['contains'] }),\n ]),\n ).toThrow(/handler-b/)\n\n expect(() =>\n validateOperatorHandlers([\n replacementHandler({ name: 'handler-a', operators: ['contains'] }),\n replacementHandler({ name: 'handler-b', operators: ['contains'] }),\n ]),\n ).toThrow(/contains/)\n })\n\n it('does not throw when two build handlers target the same operator but declare disjoint fieldTypes', () => {\n expect(() =>\n validateOperatorHandlers([\n replacementHandler({ name: 'text', operators: ['contains'], fieldTypes: ['text'] }),\n replacementHandler({ name: 'number', operators: ['contains'], fieldTypes: ['number'] }),\n ]),\n ).not.toThrow()\n })\n\n it('throws when two build handlers target the same operator and at least one declares no fieldTypes', () => {\n expect(() =>\n validateOperatorHandlers([\n replacementHandler({ name: 'unrestricted', operators: ['contains'] }),\n replacementHandler({ name: 'text', operators: ['contains'], fieldTypes: ['text'] }),\n ]),\n ).toThrow()\n })\n\n it('throws when a handler object defines both build and transformOperands', () => {\n const malformed = {\n name: 'malformed',\n operators: ['contains'],\n build: () => null as any,\n transformOperands: ({ column, value }: any) => ({ column, value }),\n } as unknown as DrizzleOperatorHandler\n\n expect(() => validateOperatorHandlers([malformed])).toThrow(/malformed/)\n })\n})\n"],"names":["describe","expect","it","validateOperatorHandlers","transformHandler","overrides","name","operators","transformOperands","column","value","replacementHandler","build","not","toThrow","fieldTypes","malformed"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,SAAQ;AAI7C,SAASC,wBAAwB,QAAQ,gCAA+B;AAExE,MAAMC,mBAAmB,CACvBC,YAA6C,CAAC,CAAC,GAE9C,CAAA;QACCC,MAAM;QACNC,WAAW;YAAC;SAAW;QACvBC,mBAAmB,CAAC,EAAEC,MAAM,EAAEC,KAAK,EAAE,GAAM,CAAA;gBAAED;gBAAQC;YAAM,CAAA;QAC3D,GAAGL,SAAS;IACd,CAAA;AAEF,MAAMM,qBAAqB,CACzBN,YAA6C,CAAC,CAAC,GAE9C,CAAA;QACCC,MAAM;QACNC,WAAW;YAAC;SAAW;QACvBK,OAAO,IAAM;QACb,GAAGP,SAAS;IACd,CAAA;AAEFL,SAAS,4BAA4B;IACnCE,GAAG,oDAAoD;QACrDD,OAAO,IAAME,yBAAyB,EAAE,GAAGU,GAAG,CAACC,OAAO;IACxD;IAEAZ,GAAG,+EAA+E;QAChFD,OAAO,IACLE,yBAAyB;gBACvBC,iBAAiB;oBAAEE,MAAM;gBAAI;gBAC7BF,iBAAiB;oBAAEE,MAAM;gBAAI;gBAC7BF,iBAAiB;oBAAEE,MAAM;gBAAI;aAC9B,GACDO,GAAG,CAACC,OAAO;IACf;IAEAZ,GAAG,yGAAyG;QAC1GD,OAAO,IACLE,yBAAyB;gBACvBQ,mBAAmB;oBAAEL,MAAM;oBAAaC,WAAW;wBAAC;qBAAW;gBAAC;gBAChEI,mBAAmB;oBAAEL,MAAM;oBAAaC,WAAW;wBAAC;qBAAW;gBAAC;aACjE,GACDO,OAAO,CAAC;QAEVb,OAAO,IACLE,yBAAyB;gBACvBQ,mBAAmB;oBAAEL,MAAM;oBAAaC,WAAW;wBAAC;qBAAW;gBAAC;gBAChEI,mBAAmB;oBAAEL,MAAM;oBAAaC,WAAW;wBAAC;qBAAW;gBAAC;aACjE,GACDO,OAAO,CAAC;QAEVb,OAAO,IACLE,yBAAyB;gBACvBQ,mBAAmB;oBAAEL,MAAM;oBAAaC,WAAW;wBAAC;qBAAW;gBAAC;gBAChEI,mBAAmB;oBAAEL,MAAM;oBAAaC,WAAW;wBAAC;qBAAW;gBAAC;aACjE,GACDO,OAAO,CAAC;IACZ;IAEAZ,GAAG,mGAAmG;QACpGD,OAAO,IACLE,yBAAyB;gBACvBQ,mBAAmB;oBAAEL,MAAM;oBAAQC,WAAW;wBAAC;qBAAW;oBAAEQ,YAAY;wBAAC;qBAAO;gBAAC;gBACjFJ,mBAAmB;oBAAEL,MAAM;oBAAUC,WAAW;wBAAC;qBAAW;oBAAEQ,YAAY;wBAAC;qBAAS;gBAAC;aACtF,GACDF,GAAG,CAACC,OAAO;IACf;IAEAZ,GAAG,mGAAmG;QACpGD,OAAO,IACLE,yBAAyB;gBACvBQ,mBAAmB;oBAAEL,MAAM;oBAAgBC,WAAW;wBAAC;qBAAW;gBAAC;gBACnEI,mBAAmB;oBAAEL,MAAM;oBAAQC,WAAW;wBAAC;qBAAW;oBAAEQ,YAAY;wBAAC;qBAAO;gBAAC;aAClF,GACDD,OAAO;IACX;IAEAZ,GAAG,yEAAyE;QAC1E,MAAMc,YAAY;YAChBV,MAAM;YACNC,WAAW;gBAAC;aAAW;YACvBK,OAAO,IAAM;YACbJ,mBAAmB,CAAC,EAAEC,MAAM,EAAEC,KAAK,EAAO,GAAM,CAAA;oBAAED;oBAAQC;gBAAM,CAAA;QAClE;QAEAT,OAAO,IAAME,yBAAyB;gBAACa;aAAU,GAAGF,OAAO,CAAC;IAC9D;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/schema/build.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAA;AAKrE,OAAO,KAAK,EACV,cAAc,EACd,MAAM,EACN,SAAS,EACT,aAAa,EACb,QAAQ,EAGR,WAAW,EACX,WAAW,EACZ,MAAM,aAAa,CAAA;AAQpB,KAAK,IAAI,GAAG;IACV,OAAO,EAAE,cAAc,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACvC;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IAC/C;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IACtC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC1C,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,eAAe,CAAC,EAAE,sBAAsB,EAAE,CAAA;IAC1C,cAAc,EAAE,OAAO,CAAA;IACvB,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,aAAa,EAAE,OAAO,CAAA;IACtB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC/B,oBAAoB,CAAC,EAAE,WAAW,CAAA;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,uBAAuB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACrC,WAAW,EAAE,WAAW,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,EAAE,OAAO,CAAA;IACjB;;;OAGG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAA;CACtC,CAAA;AAED,KAAK,MAAM,GAAG;IACZ,2BAA2B,EAAE,OAAO,CAAA;IACpC,yBAAyB,EAAE,OAAO,CAAA;IAClC,6BAA6B,EAAE,OAAO,CAAA;IACtC,kBAAkB,EAAE,OAAO,GAAG,OAAO,CAAA;IACrC,gBAAgB,EAAE,OAAO,GAAG,OAAO,CAAA;IACnC,gBAAgB,EAAE,WAAW,CAAA;CAC9B,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,uXAsBxB,IAAI,KAAG,MAisBT,CAAA"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/schema/build.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAA;AAKrE,OAAO,KAAK,EACV,cAAc,EACd,MAAM,EACN,SAAS,EACT,aAAa,EACb,QAAQ,EAGR,WAAW,EACX,WAAW,EACZ,MAAM,aAAa,CAAA;AAQpB,KAAK,IAAI,GAAG;IACV,OAAO,EAAE,cAAc,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACvC;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IAC/C;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IACtC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC1C,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,eAAe,CAAC,EAAE,sBAAsB,EAAE,CAAA;IAC1C,cAAc,EAAE,OAAO,CAAA;IACvB,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,aAAa,EAAE,OAAO,CAAA;IACtB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC/B,oBAAoB,CAAC,EAAE,WAAW,CAAA;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,uBAAuB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACrC,WAAW,EAAE,WAAW,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,EAAE,OAAO,CAAA;IACjB;;;OAGG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAA;CACtC,CAAA;AAED,KAAK,MAAM,GAAG;IACZ,2BAA2B,EAAE,OAAO,CAAA;IACpC,yBAAyB,EAAE,OAAO,CAAA;IAClC,6BAA6B,EAAE,OAAO,CAAA;IACtC,kBAAkB,EAAE,OAAO,GAAG,OAAO,CAAA;IACrC,gBAAgB,EAAE,OAAO,GAAG,OAAO,CAAA;IACnC,gBAAgB,EAAE,WAAW,CAAA;CAC9B,CAAA;AAED,eAAO,MAAM,UAAU,0XAsBpB,IAAI,KAAG,MAisBT,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"buildDrizzleRelations.d.ts","sourceRoot":"","sources":["../../src/schema/buildDrizzleRelations.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,eAAO,MAAM,qBAAqB,GAAI,aAAa;IAAE,OAAO,EAAE,cAAc,CAAA;CAAE,SAmC7E,CAAA"}
1
+ {"version":3,"file":"buildDrizzleRelations.d.ts","sourceRoot":"","sources":["../../src/schema/buildDrizzleRelations.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,eAAO,MAAM,qBAAqB,gBAAiB;IAAE,OAAO,EAAE,cAAc,CAAA;CAAE,SAmC7E,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"buildRawSchema.d.ts","sourceRoot":"","sources":["../../src/schema/buildRawSchema.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAY,WAAW,EAAE,MAAM,aAAa,CAAA;AAMxE;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,2BAG5B;IACD,OAAO,EAAE,cAAc,CAAA;IACvB,WAAW,EAAE,WAAW,CAAA;CACzB,SAoHA,CAAA"}
1
+ {"version":3,"file":"buildRawSchema.d.ts","sourceRoot":"","sources":["../../src/schema/buildRawSchema.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAY,WAAW,EAAE,MAAM,aAAa,CAAA;AAMxE;;GAEG;AACH,eAAO,MAAM,cAAc,8BAGxB;IACD,OAAO,EAAE,cAAc,CAAA;IACvB,WAAW,EAAE,WAAW,CAAA;CACzB,SAoHA,CAAA"}
@@ -0,0 +1,290 @@
1
+ import { sanitizeConfig } from 'payload';
2
+ import { describe, expect, it, vi } from 'vitest';
3
+ import { setColumnID } from '../postgres/schema/setColumnID.js';
4
+ import { checkTruncatedIdentifiers } from '../utilities/checkTruncatedIdentifiers.js';
5
+ import { buildRawSchema } from './buildRawSchema.js';
6
+ const headlineBlock = {
7
+ slug: 'headline',
8
+ fields: [
9
+ {
10
+ name: 'title',
11
+ type: 'text'
12
+ }
13
+ ]
14
+ };
15
+ const createContainerBlock = (slug)=>({
16
+ slug,
17
+ fields: [
18
+ {
19
+ name: 'content',
20
+ type: 'blocks',
21
+ blocks: [
22
+ 'headline'
23
+ ]
24
+ }
25
+ ]
26
+ });
27
+ const createAdapter = (config, warn = ()=>{})=>({
28
+ blocksAsJSON: false,
29
+ fieldConstraints: {},
30
+ idType: 'serial',
31
+ localesSuffix: '_locales',
32
+ payload: {
33
+ blocks: Object.fromEntries(config.blocks.map((block)=>[
34
+ block.slug,
35
+ block
36
+ ])),
37
+ collections: Object.fromEntries(config.collections.map((collection)=>[
38
+ collection.slug,
39
+ {
40
+ config: collection,
41
+ customIDType: undefined
42
+ }
43
+ ])),
44
+ config,
45
+ logger: {
46
+ warn
47
+ }
48
+ },
49
+ rawRelations: {},
50
+ rawTables: {},
51
+ tableNameMap: new Map(),
52
+ versionsSuffix: '_versions'
53
+ });
54
+ describe('buildRawSchema', ()=>{
55
+ it('should create suffixed block tables for different schemas with the same slug', async ()=>{
56
+ const config = sanitizeConfig({
57
+ collections: [
58
+ {
59
+ slug: 'pages',
60
+ fields: [
61
+ {
62
+ name: 'primaryContent',
63
+ type: 'blocks',
64
+ localized: true,
65
+ blocks: [
66
+ {
67
+ slug: 'content',
68
+ fields: [
69
+ {
70
+ name: 'title',
71
+ type: 'text'
72
+ }
73
+ ]
74
+ }
75
+ ]
76
+ },
77
+ {
78
+ name: 'secondaryContent',
79
+ type: 'blocks',
80
+ localized: true,
81
+ blocks: [
82
+ {
83
+ slug: 'content',
84
+ fields: [
85
+ {
86
+ name: 'description',
87
+ type: 'textarea'
88
+ }
89
+ ]
90
+ }
91
+ ]
92
+ }
93
+ ]
94
+ }
95
+ ],
96
+ localization: {
97
+ defaultLocale: 'en',
98
+ locales: [
99
+ 'en',
100
+ 'de'
101
+ ]
102
+ }
103
+ });
104
+ const adapter = createAdapter(config);
105
+ buildRawSchema({
106
+ adapter,
107
+ setColumnID
108
+ });
109
+ expect(adapter.rawTables.pages_blocks_content.columns.title).toBeDefined();
110
+ expect(adapter.rawTables.pages_blocks_content.columns._locale).toBeDefined();
111
+ expect(adapter.rawTables.pages_blocks_content_2.columns.description).toBeDefined();
112
+ expect(adapter.rawTables.pages_blocks_content_2.columns._locale).toBeDefined();
113
+ });
114
+ it('should not create duplicate suffixed block tables for identical reused blocks under localized ancestors', async ()=>{
115
+ const layoutBlocks = [
116
+ createContainerBlock('container'),
117
+ createContainerBlock('container50')
118
+ ];
119
+ const config = sanitizeConfig({
120
+ blocks: [
121
+ headlineBlock
122
+ ],
123
+ collections: [
124
+ {
125
+ slug: 'pages',
126
+ fields: [
127
+ {
128
+ name: 'layout',
129
+ type: 'blocks',
130
+ localized: true,
131
+ blocks: layoutBlocks
132
+ }
133
+ ]
134
+ },
135
+ {
136
+ slug: 'posts',
137
+ fields: [
138
+ {
139
+ name: 'layout',
140
+ type: 'blocks',
141
+ localized: true,
142
+ blocks: layoutBlocks
143
+ }
144
+ ]
145
+ }
146
+ ],
147
+ localization: {
148
+ defaultLocale: 'en',
149
+ locales: [
150
+ 'en',
151
+ 'de'
152
+ ]
153
+ }
154
+ });
155
+ const adapter = createAdapter(config);
156
+ buildRawSchema({
157
+ adapter,
158
+ setColumnID
159
+ });
160
+ expect(adapter.rawTables.pages_blocks_headline).toBeDefined();
161
+ expect(adapter.rawTables.pages_blocks_headline.columns._locale).toBeDefined();
162
+ expect(adapter.rawTables.pages_blocks_headline_2).toBeUndefined();
163
+ expect(adapter.rawTables.pages_blocks_headline_2_locales).toBeUndefined();
164
+ expect(adapter.rawTables.posts_blocks_headline).toBeDefined();
165
+ expect(adapter.rawTables.posts_blocks_headline.columns._locale).toBeDefined();
166
+ expect(adapter.rawTables.posts_blocks_headline_2).toBeUndefined();
167
+ expect(adapter.rawTables.posts_blocks_headline_2_locales).toBeUndefined();
168
+ });
169
+ it('should warn when a localized field pushes the _locales companion table past 63 chars', async ()=>{
170
+ // Base table name (61 chars) is under the limit, but `${base}_locales` (69) overflows it.
171
+ const longSlug = `localized_collection_${'x'.repeat(40)}`;
172
+ const config = sanitizeConfig({
173
+ collections: [
174
+ {
175
+ slug: longSlug,
176
+ fields: [
177
+ {
178
+ name: 'title',
179
+ type: 'text',
180
+ localized: true
181
+ }
182
+ ],
183
+ timestamps: false,
184
+ versions: false
185
+ }
186
+ ],
187
+ localization: {
188
+ defaultLocale: 'en',
189
+ locales: [
190
+ 'en',
191
+ 'de'
192
+ ]
193
+ }
194
+ });
195
+ const warn = vi.fn();
196
+ const adapter = createAdapter(config, warn);
197
+ buildRawSchema({
198
+ adapter,
199
+ setColumnID
200
+ });
201
+ expect(adapter.rawTables[`${longSlug}_locales`]).toBeDefined();
202
+ expect(()=>checkTruncatedIdentifiers({
203
+ adapter,
204
+ logWarnings: true
205
+ })).not.toThrow();
206
+ expect(warn).toHaveBeenCalledTimes(1);
207
+ expect(warn.mock.calls[0][0]).toContain(`${longSlug}_locales`);
208
+ });
209
+ it('should not warn when the _locales companion table fits within 63 chars', async ()=>{
210
+ const config = sanitizeConfig({
211
+ collections: [
212
+ {
213
+ slug: 'short_localized',
214
+ fields: [
215
+ {
216
+ name: 'title',
217
+ type: 'text',
218
+ localized: true
219
+ }
220
+ ],
221
+ timestamps: false,
222
+ versions: false
223
+ }
224
+ ],
225
+ localization: {
226
+ defaultLocale: 'en',
227
+ locales: [
228
+ 'en',
229
+ 'de'
230
+ ]
231
+ }
232
+ });
233
+ const warn = vi.fn();
234
+ const adapter = createAdapter(config, warn);
235
+ buildRawSchema({
236
+ adapter,
237
+ setColumnID
238
+ });
239
+ expect(adapter.rawTables.short_localized_locales).toBeDefined();
240
+ checkTruncatedIdentifiers({
241
+ adapter,
242
+ logWarnings: true
243
+ });
244
+ expect(warn).not.toHaveBeenCalled();
245
+ });
246
+ it('should warn about raw inline sub-table index and foreign key names that exceed 63 chars', async ()=>{
247
+ // Array sub-tables assign structural index/FK names inline (not via buildIndexName/
248
+ // buildForeignKeyName), so a long-but-valid array table name still overflows them.
249
+ const arrayFieldName = 'a'.repeat(58);
250
+ const config = sanitizeConfig({
251
+ collections: [
252
+ {
253
+ slug: 'p',
254
+ fields: [
255
+ {
256
+ name: arrayFieldName,
257
+ type: 'array',
258
+ fields: [
259
+ {
260
+ name: 'title',
261
+ type: 'text'
262
+ }
263
+ ]
264
+ }
265
+ ],
266
+ timestamps: false,
267
+ versions: false
268
+ }
269
+ ]
270
+ });
271
+ const warn = vi.fn();
272
+ const adapter = createAdapter(config, warn);
273
+ buildRawSchema({
274
+ adapter,
275
+ setColumnID
276
+ });
277
+ const arrayTable = `p_${arrayFieldName}`;
278
+ checkTruncatedIdentifiers({
279
+ adapter,
280
+ logWarnings: true
281
+ });
282
+ expect(arrayTable.length).toBeLessThanOrEqual(63);
283
+ expect(warn).toHaveBeenCalledTimes(1);
284
+ const message = warn.mock.calls[0][0];
285
+ expect(message).toContain(`${arrayTable}_order_idx`);
286
+ expect(message).toContain(`${arrayTable}_parent_id_fk`);
287
+ });
288
+ });
289
+
290
+ //# sourceMappingURL=buildRawSchema.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/schema/buildRawSchema.spec.ts"],"sourcesContent":["import type { Block, Config, SanitizedConfig } from 'payload'\nimport { sanitizeConfig } from 'payload'\nimport { describe, expect, it, vi } from 'vitest'\n\nimport { setColumnID } from '../postgres/schema/setColumnID.js'\nimport type { DrizzleAdapter } from '../types.js'\nimport { checkTruncatedIdentifiers } from '../utilities/checkTruncatedIdentifiers.js'\nimport { buildRawSchema } from './buildRawSchema.js'\n\nconst headlineBlock: Block = {\n slug: 'headline',\n fields: [\n {\n name: 'title',\n type: 'text',\n },\n ],\n}\n\nconst createContainerBlock = (slug: string): Block => ({\n slug,\n fields: [\n {\n name: 'content',\n type: 'blocks',\n blocks: ['headline'],\n },\n ],\n})\n\nconst createAdapter = (\n config: SanitizedConfig,\n warn: (...args: any[]) => void = () => {},\n): DrizzleAdapter =>\n ({\n blocksAsJSON: false,\n fieldConstraints: {},\n idType: 'serial',\n localesSuffix: '_locales',\n payload: {\n blocks: Object.fromEntries(config.blocks.map((block) => [block.slug, block])),\n collections: Object.fromEntries(\n config.collections.map((collection) => [\n collection.slug,\n {\n config: collection,\n customIDType: undefined,\n },\n ]),\n ),\n config,\n logger: { warn },\n },\n rawRelations: {},\n rawTables: {},\n tableNameMap: new Map(),\n versionsSuffix: '_versions',\n }) as unknown as DrizzleAdapter\n\ndescribe('buildRawSchema', () => {\n it('should create suffixed block tables for different schemas with the same slug', async () => {\n const config = sanitizeConfig({\n collections: [\n {\n slug: 'pages',\n fields: [\n {\n name: 'primaryContent',\n type: 'blocks',\n localized: true,\n blocks: [\n {\n slug: 'content',\n fields: [\n {\n name: 'title',\n type: 'text',\n },\n ],\n },\n ],\n },\n {\n name: 'secondaryContent',\n type: 'blocks',\n localized: true,\n blocks: [\n {\n slug: 'content',\n fields: [\n {\n name: 'description',\n type: 'textarea',\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n localization: {\n defaultLocale: 'en',\n locales: ['en', 'de'],\n },\n } as Config)\n\n const adapter = createAdapter(config)\n\n buildRawSchema({\n adapter,\n setColumnID,\n })\n\n expect(adapter.rawTables.pages_blocks_content.columns.title).toBeDefined()\n expect(adapter.rawTables.pages_blocks_content.columns._locale).toBeDefined()\n expect(adapter.rawTables.pages_blocks_content_2.columns.description).toBeDefined()\n expect(adapter.rawTables.pages_blocks_content_2.columns._locale).toBeDefined()\n })\n\n it('should not create duplicate suffixed block tables for identical reused blocks under localized ancestors', async () => {\n const layoutBlocks = [createContainerBlock('container'), createContainerBlock('container50')]\n\n const config = sanitizeConfig({\n blocks: [headlineBlock],\n collections: [\n {\n slug: 'pages',\n fields: [\n {\n name: 'layout',\n type: 'blocks',\n localized: true,\n blocks: layoutBlocks,\n },\n ],\n },\n {\n slug: 'posts',\n fields: [\n {\n name: 'layout',\n type: 'blocks',\n localized: true,\n blocks: layoutBlocks,\n },\n ],\n },\n ],\n localization: {\n defaultLocale: 'en',\n locales: ['en', 'de'],\n },\n } as Config)\n\n const adapter = createAdapter(config)\n\n buildRawSchema({\n adapter,\n setColumnID,\n })\n\n expect(adapter.rawTables.pages_blocks_headline).toBeDefined()\n expect(adapter.rawTables.pages_blocks_headline.columns._locale).toBeDefined()\n expect(adapter.rawTables.pages_blocks_headline_2).toBeUndefined()\n expect(adapter.rawTables.pages_blocks_headline_2_locales).toBeUndefined()\n expect(adapter.rawTables.posts_blocks_headline).toBeDefined()\n expect(adapter.rawTables.posts_blocks_headline.columns._locale).toBeDefined()\n expect(adapter.rawTables.posts_blocks_headline_2).toBeUndefined()\n expect(adapter.rawTables.posts_blocks_headline_2_locales).toBeUndefined()\n })\n\n it('should warn when a localized field pushes the _locales companion table past 63 chars', async () => {\n // Base table name (61 chars) is under the limit, but `${base}_locales` (69) overflows it.\n const longSlug = `localized_collection_${'x'.repeat(40)}`\n\n const config = sanitizeConfig({\n collections: [\n {\n slug: longSlug,\n fields: [\n {\n name: 'title',\n type: 'text',\n localized: true,\n },\n ],\n timestamps: false,\n versions: false,\n },\n ],\n localization: {\n defaultLocale: 'en',\n locales: ['en', 'de'],\n },\n } as Config)\n\n const warn = vi.fn()\n const adapter = createAdapter(config, warn)\n\n buildRawSchema({ adapter, setColumnID })\n\n expect(adapter.rawTables[`${longSlug}_locales`]).toBeDefined()\n\n expect(() => checkTruncatedIdentifiers({ adapter, logWarnings: true })).not.toThrow()\n expect(warn).toHaveBeenCalledTimes(1)\n expect(warn.mock.calls[0][0]).toContain(`${longSlug}_locales`)\n })\n\n it('should not warn when the _locales companion table fits within 63 chars', async () => {\n const config = sanitizeConfig({\n collections: [\n {\n slug: 'short_localized',\n fields: [\n {\n name: 'title',\n type: 'text',\n localized: true,\n },\n ],\n timestamps: false,\n versions: false,\n },\n ],\n localization: {\n defaultLocale: 'en',\n locales: ['en', 'de'],\n },\n } as Config)\n\n const warn = vi.fn()\n const adapter = createAdapter(config, warn)\n\n buildRawSchema({ adapter, setColumnID })\n\n expect(adapter.rawTables.short_localized_locales).toBeDefined()\n\n checkTruncatedIdentifiers({ adapter, logWarnings: true })\n\n expect(warn).not.toHaveBeenCalled()\n })\n\n it('should warn about raw inline sub-table index and foreign key names that exceed 63 chars', async () => {\n // Array sub-tables assign structural index/FK names inline (not via buildIndexName/\n // buildForeignKeyName), so a long-but-valid array table name still overflows them.\n const arrayFieldName = 'a'.repeat(58)\n\n const config = sanitizeConfig({\n collections: [\n {\n slug: 'p',\n fields: [\n {\n name: arrayFieldName,\n type: 'array',\n fields: [{ name: 'title', type: 'text' }],\n },\n ],\n timestamps: false,\n versions: false,\n },\n ],\n } as Config)\n\n const warn = vi.fn()\n const adapter = createAdapter(config, warn)\n\n buildRawSchema({ adapter, setColumnID })\n\n const arrayTable = `p_${arrayFieldName}`\n\n checkTruncatedIdentifiers({ adapter, logWarnings: true })\n\n expect(arrayTable.length).toBeLessThanOrEqual(63)\n expect(warn).toHaveBeenCalledTimes(1)\n\n const message: string = warn.mock.calls[0][0]\n\n expect(message).toContain(`${arrayTable}_order_idx`)\n expect(message).toContain(`${arrayTable}_parent_id_fk`)\n })\n})\n"],"names":["sanitizeConfig","describe","expect","it","vi","setColumnID","checkTruncatedIdentifiers","buildRawSchema","headlineBlock","slug","fields","name","type","createContainerBlock","blocks","createAdapter","config","warn","blocksAsJSON","fieldConstraints","idType","localesSuffix","payload","Object","fromEntries","map","block","collections","collection","customIDType","undefined","logger","rawRelations","rawTables","tableNameMap","Map","versionsSuffix","localized","localization","defaultLocale","locales","adapter","pages_blocks_content","columns","title","toBeDefined","_locale","pages_blocks_content_2","description","layoutBlocks","pages_blocks_headline","pages_blocks_headline_2","toBeUndefined","pages_blocks_headline_2_locales","posts_blocks_headline","posts_blocks_headline_2","posts_blocks_headline_2_locales","longSlug","repeat","timestamps","versions","fn","logWarnings","not","toThrow","toHaveBeenCalledTimes","mock","calls","toContain","short_localized_locales","toHaveBeenCalled","arrayFieldName","arrayTable","length","toBeLessThanOrEqual","message"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"idToUUID.d.ts","sourceRoot":"","sources":["../../src/schema/idToUUID.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7C,eAAO,MAAM,QAAQ,GAAI,QAAQ,cAAc,EAAE,KAAG,cAAc,EAU9D,CAAA"}
1
+ {"version":3,"file":"idToUUID.d.ts","sourceRoot":"","sources":["../../src/schema/idToUUID.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7C,eAAO,MAAM,QAAQ,WAAY,cAAc,EAAE,KAAG,cAAc,EAU9D,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/schema/traverseFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAW7C,OAAO,KAAK,EACV,cAAc,EACd,MAAM,EACN,SAAS,EAET,QAAQ,EAER,WAAW,EACX,WAAW,EACZ,MAAM,aAAa,CAAA;AAgBpB,KAAK,IAAI,GAAG;IACV,OAAO,EAAE,cAAc,CAAA;IACvB,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAClC,cAAc,EAAE,OAAO,CAAA;IACvB,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IACjC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACzC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IACxC,YAAY,EAAE,MAAM,CAAA;IACpB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC1B,gBAAgB,EAAE,WAAW,CAAA;IAC7B,oBAAoB,CAAC,EAAE,WAAW,CAAA;IAClC,kBAAkB,EAAE,MAAM,CAAA;IAC1B,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,WAAW,CAAA;IACxB,mBAAmB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAChC,QAAQ,EAAE,OAAO,CAAA;IACjB;;;OAGG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAA;CACtC,CAAA;AAED,KAAK,MAAM,GAAG;IACZ,iBAAiB,EAAE,OAAO,CAAA;IAC1B,2BAA2B,EAAE,OAAO,CAAA;IACpC,yBAAyB,EAAE,OAAO,CAAA;IAClC,6BAA6B,EAAE,OAAO,CAAA;IACtC,kBAAkB,EAAE,OAAO,GAAG,OAAO,CAAA;IACrC,gBAAgB,EAAE,OAAO,GAAG,OAAO,CAAA;CACpC,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,mZA0B5B,IAAI,KAAG,MAq7BT,CAAA"}
1
+ {"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/schema/traverseFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAW7C,OAAO,KAAK,EACV,cAAc,EACd,MAAM,EACN,SAAS,EAET,QAAQ,EAER,WAAW,EACX,WAAW,EACZ,MAAM,aAAa,CAAA;AAgBpB,KAAK,IAAI,GAAG;IACV,OAAO,EAAE,cAAc,CAAA;IACvB,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAClC,cAAc,EAAE,OAAO,CAAA;IACvB,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IACjC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACzC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IACxC,YAAY,EAAE,MAAM,CAAA;IACpB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC1B,gBAAgB,EAAE,WAAW,CAAA;IAC7B,oBAAoB,CAAC,EAAE,WAAW,CAAA;IAClC,kBAAkB,EAAE,MAAM,CAAA;IAC1B,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,WAAW,CAAA;IACxB,mBAAmB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAChC,QAAQ,EAAE,OAAO,CAAA;IACjB;;;OAGG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAA;CACtC,CAAA;AAED,KAAK,MAAM,GAAG;IACZ,iBAAiB,EAAE,OAAO,CAAA;IAC1B,2BAA2B,EAAE,OAAO,CAAA;IACpC,yBAAyB,EAAE,OAAO,CAAA;IAClC,6BAA6B,EAAE,OAAO,CAAA;IACtC,kBAAkB,EAAE,OAAO,GAAG,OAAO,CAAA;IACrC,gBAAgB,EAAE,OAAO,GAAG,OAAO,CAAA;CACpC,CAAA;AAED,eAAO,MAAM,cAAc,sZA0BxB,IAAI,KAAG,MAs7BT,CAAA"}
@@ -269,12 +269,13 @@ export const traverseFields = ({ adapter, blocksTableNameMap, columnPrefix, colu
269
269
  throwValidationError,
270
270
  versionsCustomName: versions
271
271
  });
272
+ const isLocalizedBlockTable = Boolean(isFieldLocalized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock || forceLocalized;
272
273
  if (typeof blocksTableNameMap[blockTableName] === 'undefined') {
273
274
  blocksTableNameMap[blockTableName] = 1;
274
275
  } else if (!adapter.rawTables[blockTableName] || !validateExistingBlockIsIdentical({
275
276
  block,
276
- localized: field.localized,
277
- rootTableName,
277
+ localized: isLocalizedBlockTable,
278
+ parentIsLocalized,
278
279
  table: adapter.rawTables[blockTableName],
279
280
  tableLocales: adapter.rawTables[`${blockTableName}${adapter.localesSuffix}`]
280
281
  })) {
@@ -335,8 +336,7 @@ export const traverseFields = ({ adapter, blocksTableNameMap, columnPrefix, colu
335
336
  onDelete: 'cascade'
336
337
  }
337
338
  };
338
- const isLocalized = Boolean(isFieldLocalized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock || forceLocalized;
339
- if (isLocalized) {
339
+ if (isLocalizedBlockTable) {
340
340
  baseColumns._locale = {
341
341
  name: '_locale',
342
342
  type: 'enum',
@@ -367,7 +367,7 @@ export const traverseFields = ({ adapter, blocksTableNameMap, columnPrefix, colu
367
367
  setColumnID,
368
368
  tableName: blockTableName,
369
369
  versions,
370
- withinLocalizedArrayOrBlock: isLocalized
370
+ withinLocalizedArrayOrBlock: isLocalizedBlockTable
371
371
  });
372
372
  if (subHasLocalizedManyNumberField) {
373
373
  hasLocalizedManyNumberField = subHasLocalizedManyNumberField;
@@ -462,6 +462,7 @@ export const traverseFields = ({ adapter, blocksTableNameMap, columnPrefix, colu
462
462
  }
463
463
  case 'code':
464
464
  case 'email':
465
+ case 'slug':
465
466
  case 'textarea':
466
467
  {
467
468
  targetTable[fieldName] = withDefault({