@payloadcms/drizzle 4.0.0-canary.34 → 4.0.0-canary.36

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 (29) hide show
  1. package/package.json +3 -3
  2. package/dist/find/buildPolymorphicJoinQuery.spec.js +0 -384
  3. package/dist/find/buildPolymorphicJoinQuery.spec.js.map +0 -1
  4. package/dist/find/buildPolymorphicJoinWhere.spec.js +0 -805
  5. package/dist/find/buildPolymorphicJoinWhere.spec.js.map +0 -1
  6. package/dist/find/createPolymorphicJoinWherePlan.spec.js +0 -778
  7. package/dist/find/createPolymorphicJoinWherePlan.spec.js.map +0 -1
  8. package/dist/postgres/query/assertOperatorHandlerExtensionsInstalled.spec.js +0 -91
  9. package/dist/postgres/query/assertOperatorHandlerExtensionsInstalled.spec.js.map +0 -1
  10. package/dist/postgres/query/postgresUnaccent.spec.js +0 -71
  11. package/dist/postgres/query/postgresUnaccent.spec.js.map +0 -1
  12. package/dist/queries/buildOperatorConstraint.spec.js +0 -348
  13. package/dist/queries/buildOperatorConstraint.spec.js.map +0 -1
  14. package/dist/queries/validateOperatorHandlers.spec.js +0 -142
  15. package/dist/queries/validateOperatorHandlers.spec.js.map +0 -1
  16. package/dist/schema/buildRawSchema.spec.js +0 -290
  17. package/dist/schema/buildRawSchema.spec.js.map +0 -1
  18. package/dist/updateOne.spec.js +0 -84
  19. package/dist/updateOne.spec.js.map +0 -1
  20. package/dist/upsertRow/conditionalUpdate.spec.js +0 -61
  21. package/dist/upsertRow/conditionalUpdate.spec.js.map +0 -1
  22. package/dist/upsertRow/handleUpsertError.spec.js +0 -42
  23. package/dist/upsertRow/handleUpsertError.spec.js.map +0 -1
  24. package/dist/utilities/checkTruncatedIdentifiers.spec.js +0 -301
  25. package/dist/utilities/checkTruncatedIdentifiers.spec.js.map +0 -1
  26. package/dist/utilities/isValidStringID.spec.js +0 -15
  27. package/dist/utilities/isValidStringID.spec.js.map +0 -1
  28. package/dist/utilities/validateIdentifierLength.spec.js +0 -19
  29. package/dist/utilities/validateIdentifierLength.spec.js.map +0 -1
@@ -1,142 +0,0 @@
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
@@ -1 +0,0 @@
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,290 +0,0 @@
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
@@ -1 +0,0 @@
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,84 +0,0 @@
1
- import { beforeEach, describe, expect, it, vi } from 'vitest';
2
- import { buildQuery } from './queries/buildQuery.js';
3
- import { selectDistinct } from './queries/selectDistinct.js';
4
- import { updateOne } from './updateOne.js';
5
- import { upsertRow } from './upsertRow/index.js';
6
- vi.mock('./queries/buildQuery.js', ()=>({
7
- buildQuery: vi.fn()
8
- }));
9
- vi.mock('./queries/selectDistinct.js', ()=>({
10
- selectDistinct: vi.fn()
11
- }));
12
- vi.mock('./upsertRow/index.js', ()=>({
13
- upsertRow: vi.fn()
14
- }));
15
- const conditionalWhere = {
16
- conditional: true
17
- };
18
- const adapter = {
19
- drizzle: {},
20
- payload: {
21
- collections: {
22
- users: {
23
- config: {
24
- flattenedFields: [],
25
- slug: 'users'
26
- }
27
- }
28
- }
29
- },
30
- sessions: {},
31
- tableNameMap: new Map([
32
- [
33
- 'users',
34
- 'users'
35
- ]
36
- ])
37
- };
38
- describe('updateOne', ()=>{
39
- beforeEach(()=>{
40
- vi.mocked(buildQuery).mockReturnValue({
41
- joins: [],
42
- selectFields: {},
43
- where: conditionalWhere
44
- });
45
- vi.mocked(selectDistinct).mockResolvedValue([
46
- {
47
- id: 1
48
- }
49
- ]);
50
- vi.mocked(upsertRow).mockResolvedValue({
51
- id: 1
52
- });
53
- });
54
- it('should apply the original condition to the selected update', async ()=>{
55
- await updateOne.call(adapter, {
56
- collection: 'users',
57
- data: {
58
- hash: 'updated-hash',
59
- salt: 'updated-salt'
60
- },
61
- select: {
62
- id: true
63
- },
64
- where: {
65
- hash: {
66
- equals: 'existing-hash'
67
- },
68
- id: {
69
- equals: 1
70
- },
71
- salt: {
72
- equals: 'existing-salt'
73
- }
74
- }
75
- });
76
- expect(selectDistinct).toHaveBeenCalledTimes(1);
77
- expect(upsertRow).toHaveBeenCalledWith(expect.objectContaining({
78
- id: 1,
79
- where: conditionalWhere
80
- }));
81
- });
82
- });
83
-
84
- //# sourceMappingURL=updateOne.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/updateOne.spec.ts"],"sourcesContent":["import type { DrizzleAdapter } from './types.js'\n\nimport { beforeEach, describe, expect, it, vi } from 'vitest'\n\nimport { buildQuery } from './queries/buildQuery.js'\nimport { selectDistinct } from './queries/selectDistinct.js'\nimport { updateOne } from './updateOne.js'\nimport { upsertRow } from './upsertRow/index.js'\n\nvi.mock('./queries/buildQuery.js', () => ({ buildQuery: vi.fn() }))\nvi.mock('./queries/selectDistinct.js', () => ({ selectDistinct: vi.fn() }))\nvi.mock('./upsertRow/index.js', () => ({ upsertRow: vi.fn() }))\n\nconst conditionalWhere = { conditional: true }\n\nconst adapter = {\n drizzle: {},\n payload: {\n collections: {\n users: {\n config: {\n flattenedFields: [],\n slug: 'users',\n },\n },\n },\n },\n sessions: {},\n tableNameMap: new Map([['users', 'users']]),\n} as unknown as DrizzleAdapter\n\ndescribe('updateOne', () => {\n beforeEach(() => {\n vi.mocked(buildQuery).mockReturnValue({\n joins: [],\n selectFields: {},\n where: conditionalWhere,\n } as ReturnType<typeof buildQuery>)\n vi.mocked(selectDistinct).mockResolvedValue([{ id: 1 }])\n vi.mocked(upsertRow).mockResolvedValue({ id: 1 })\n })\n\n it('should apply the original condition to the selected update', async () => {\n await updateOne.call(adapter, {\n collection: 'users',\n data: {\n hash: 'updated-hash',\n salt: 'updated-salt',\n },\n select: { id: true },\n where: {\n hash: { equals: 'existing-hash' },\n id: { equals: 1 },\n salt: { equals: 'existing-salt' },\n },\n })\n\n expect(selectDistinct).toHaveBeenCalledTimes(1)\n expect(upsertRow).toHaveBeenCalledWith(\n expect.objectContaining({\n id: 1,\n where: conditionalWhere,\n }),\n )\n })\n})\n"],"names":["beforeEach","describe","expect","it","vi","buildQuery","selectDistinct","updateOne","upsertRow","mock","fn","conditionalWhere","conditional","adapter","drizzle","payload","collections","users","config","flattenedFields","slug","sessions","tableNameMap","Map","mocked","mockReturnValue","joins","selectFields","where","mockResolvedValue","id","call","collection","data","hash","salt","select","equals","toHaveBeenCalledTimes","toHaveBeenCalledWith","objectContaining"],"mappings":"AAEA,SAASA,UAAU,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,EAAEC,EAAE,QAAQ,SAAQ;AAE7D,SAASC,UAAU,QAAQ,0BAAyB;AACpD,SAASC,cAAc,QAAQ,8BAA6B;AAC5D,SAASC,SAAS,QAAQ,iBAAgB;AAC1C,SAASC,SAAS,QAAQ,uBAAsB;AAEhDJ,GAAGK,IAAI,CAAC,2BAA2B,IAAO,CAAA;QAAEJ,YAAYD,GAAGM,EAAE;IAAG,CAAA;AAChEN,GAAGK,IAAI,CAAC,+BAA+B,IAAO,CAAA;QAAEH,gBAAgBF,GAAGM,EAAE;IAAG,CAAA;AACxEN,GAAGK,IAAI,CAAC,wBAAwB,IAAO,CAAA;QAAED,WAAWJ,GAAGM,EAAE;IAAG,CAAA;AAE5D,MAAMC,mBAAmB;IAAEC,aAAa;AAAK;AAE7C,MAAMC,UAAU;IACdC,SAAS,CAAC;IACVC,SAAS;QACPC,aAAa;YACXC,OAAO;gBACLC,QAAQ;oBACNC,iBAAiB,EAAE;oBACnBC,MAAM;gBACR;YACF;QACF;IACF;IACAC,UAAU,CAAC;IACXC,cAAc,IAAIC,IAAI;QAAC;YAAC;YAAS;SAAQ;KAAC;AAC5C;AAEAtB,SAAS,aAAa;IACpBD,WAAW;QACTI,GAAGoB,MAAM,CAACnB,YAAYoB,eAAe,CAAC;YACpCC,OAAO,EAAE;YACTC,cAAc,CAAC;YACfC,OAAOjB;QACT;QACAP,GAAGoB,MAAM,CAAClB,gBAAgBuB,iBAAiB,CAAC;YAAC;gBAAEC,IAAI;YAAE;SAAE;QACvD1B,GAAGoB,MAAM,CAAChB,WAAWqB,iBAAiB,CAAC;YAAEC,IAAI;QAAE;IACjD;IAEA3B,GAAG,8DAA8D;QAC/D,MAAMI,UAAUwB,IAAI,CAAClB,SAAS;YAC5BmB,YAAY;YACZC,MAAM;gBACJC,MAAM;gBACNC,MAAM;YACR;YACAC,QAAQ;gBAAEN,IAAI;YAAK;YACnBF,OAAO;gBACLM,MAAM;oBAAEG,QAAQ;gBAAgB;gBAChCP,IAAI;oBAAEO,QAAQ;gBAAE;gBAChBF,MAAM;oBAAEE,QAAQ;gBAAgB;YAClC;QACF;QAEAnC,OAAOI,gBAAgBgC,qBAAqB,CAAC;QAC7CpC,OAAOM,WAAW+B,oBAAoB,CACpCrC,OAAOsC,gBAAgB,CAAC;YACtBV,IAAI;YACJF,OAAOjB;QACT;IAEJ;AACF"}
@@ -1,61 +0,0 @@
1
- import { sql } from 'drizzle-orm';
2
- import { describe, expect, it, vi } from 'vitest';
3
- import { upsertRow } from './index.js';
4
- describe('upsertRow', ()=>{
5
- it('should update matching scalar fields with one conditional write', async ()=>{
6
- const where = sql`hash = ${'existing-hash'} and salt = ${'existing-salt'}`;
7
- const executeUpdate = vi.fn().mockResolvedValue(undefined);
8
- const setData = vi.fn(()=>({
9
- where: executeUpdate
10
- }));
11
- const update = vi.fn(()=>({
12
- set: setData
13
- }));
14
- const insert = vi.fn();
15
- const adapter = {
16
- insert,
17
- payload: {
18
- config: {}
19
- },
20
- readReplicasAfterWriteInterval: 2000,
21
- tables: {
22
- users: {
23
- id: sql`id`
24
- }
25
- },
26
- tableNameMap: new Map()
27
- };
28
- const fields = [
29
- {
30
- name: 'hash',
31
- type: 'text'
32
- },
33
- {
34
- name: 'salt',
35
- type: 'text'
36
- }
37
- ];
38
- await upsertRow({
39
- adapter,
40
- collectionSlug: 'users',
41
- data: {
42
- hash: 'updated-hash',
43
- salt: 'updated-salt'
44
- },
45
- db: {
46
- update
47
- },
48
- fields,
49
- ignoreResult: true,
50
- id: 1,
51
- operation: 'update',
52
- tableName: 'users',
53
- where
54
- });
55
- expect(insert).not.toHaveBeenCalled();
56
- expect(update).toHaveBeenCalledTimes(1);
57
- expect(executeUpdate).toHaveBeenCalledTimes(1);
58
- });
59
- });
60
-
61
- //# sourceMappingURL=conditionalUpdate.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/upsertRow/conditionalUpdate.spec.ts"],"sourcesContent":["import type { FlattenedField } from 'payload'\n\nimport { sql } from 'drizzle-orm'\nimport { describe, expect, it, vi } from 'vitest'\n\nimport type { DrizzleAdapter } from '../types.js'\n\nimport { upsertRow } from './index.js'\n\ndescribe('upsertRow', () => {\n it('should update matching scalar fields with one conditional write', async () => {\n const where = sql`hash = ${'existing-hash'} and salt = ${'existing-salt'}`\n const executeUpdate = vi.fn().mockResolvedValue(undefined)\n const setData = vi.fn(() => ({ where: executeUpdate }))\n const update = vi.fn(() => ({ set: setData }))\n const insert = vi.fn()\n const adapter = {\n insert,\n payload: { config: {} },\n readReplicasAfterWriteInterval: 2000,\n tables: { users: { id: sql`id` } },\n tableNameMap: new Map(),\n } as unknown as DrizzleAdapter\n const fields = [\n { name: 'hash', type: 'text' },\n { name: 'salt', type: 'text' },\n ] as FlattenedField[]\n\n await upsertRow({\n adapter,\n collectionSlug: 'users',\n data: {\n hash: 'updated-hash',\n salt: 'updated-salt',\n },\n db: { update } as unknown as DrizzleAdapter['drizzle'],\n fields,\n ignoreResult: true,\n id: 1,\n operation: 'update',\n tableName: 'users',\n where,\n })\n\n expect(insert).not.toHaveBeenCalled()\n expect(update).toHaveBeenCalledTimes(1)\n expect(executeUpdate).toHaveBeenCalledTimes(1)\n })\n})\n"],"names":["sql","describe","expect","it","vi","upsertRow","where","executeUpdate","fn","mockResolvedValue","undefined","setData","update","set","insert","adapter","payload","config","readReplicasAfterWriteInterval","tables","users","id","tableNameMap","Map","fields","name","type","collectionSlug","data","hash","salt","db","ignoreResult","operation","tableName","not","toHaveBeenCalled","toHaveBeenCalledTimes"],"mappings":"AAEA,SAASA,GAAG,QAAQ,cAAa;AACjC,SAASC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,EAAEC,EAAE,QAAQ,SAAQ;AAIjD,SAASC,SAAS,QAAQ,aAAY;AAEtCJ,SAAS,aAAa;IACpBE,GAAG,mEAAmE;QACpE,MAAMG,QAAQN,GAAG,CAAC,OAAO,EAAE,gBAAgB,YAAY,EAAE,gBAAgB,CAAC;QAC1E,MAAMO,gBAAgBH,GAAGI,EAAE,GAAGC,iBAAiB,CAACC;QAChD,MAAMC,UAAUP,GAAGI,EAAE,CAAC,IAAO,CAAA;gBAAEF,OAAOC;YAAc,CAAA;QACpD,MAAMK,SAASR,GAAGI,EAAE,CAAC,IAAO,CAAA;gBAAEK,KAAKF;YAAQ,CAAA;QAC3C,MAAMG,SAASV,GAAGI,EAAE;QACpB,MAAMO,UAAU;YACdD;YACAE,SAAS;gBAAEC,QAAQ,CAAC;YAAE;YACtBC,gCAAgC;YAChCC,QAAQ;gBAAEC,OAAO;oBAAEC,IAAIrB,GAAG,CAAC,EAAE,CAAC;gBAAC;YAAE;YACjCsB,cAAc,IAAIC;QACpB;QACA,MAAMC,SAAS;YACb;gBAAEC,MAAM;gBAAQC,MAAM;YAAO;YAC7B;gBAAED,MAAM;gBAAQC,MAAM;YAAO;SAC9B;QAED,MAAMrB,UAAU;YACdU;YACAY,gBAAgB;YAChBC,MAAM;gBACJC,MAAM;gBACNC,MAAM;YACR;YACAC,IAAI;gBAAEnB;YAAO;YACbY;YACAQ,cAAc;YACdX,IAAI;YACJY,WAAW;YACXC,WAAW;YACX5B;QACF;QAEAJ,OAAOY,QAAQqB,GAAG,CAACC,gBAAgB;QACnClC,OAAOU,QAAQyB,qBAAqB,CAAC;QACrCnC,OAAOK,eAAe8B,qBAAqB,CAAC;IAC9C;AACF"}