@payloadcms/db-mongodb 4.0.0-canary.35 → 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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/db-mongodb",
3
- "version": "4.0.0-canary.35",
3
+ "version": "4.0.0-canary.36",
4
4
  "description": "The officially supported MongoDB database adapter for Payload",
5
5
  "homepage": "https://payloadcms.com",
6
6
  "repository": {
@@ -54,10 +54,10 @@
54
54
  "mongodb": "7.5.0",
55
55
  "mongodb-memory-server": "10.1.4",
56
56
  "@payloadcms/eslint-config": "3.28.0",
57
- "payload": "4.0.0-canary.35"
57
+ "payload": "4.0.0-canary.36"
58
58
  },
59
59
  "peerDependencies": {
60
- "payload": "4.0.0-canary.35"
60
+ "payload": "4.0.0-canary.36"
61
61
  },
62
62
  "scripts": {
63
63
  "build": "pnpm build:types && pnpm build:swc",
@@ -1,49 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { buildSearchParam } from './buildSearchParams.js';
3
- const fields = [
4
- {
5
- name: 'title',
6
- type: 'text'
7
- }
8
- ];
9
- const payload = {
10
- config: {},
11
- collections: {},
12
- globals: {}
13
- };
14
- describe('buildSearchParam', ()=>{
15
- for (const operator of [
16
- 'contains',
17
- 'like',
18
- 'not_like'
19
- ]){
20
- it(`rejects object values for ${operator}`, async ()=>{
21
- await expect(buildSearchParam({
22
- fields,
23
- incomingPath: 'title',
24
- operator,
25
- parentIsLocalized: false,
26
- payload,
27
- val: {
28
- pattern: 'title'
29
- }
30
- })).rejects.toThrow(`Invalid value for "${operator}"`);
31
- });
32
- }
33
- it('rejects arrays containing object values', async ()=>{
34
- await expect(buildSearchParam({
35
- fields,
36
- incomingPath: 'title',
37
- operator: 'like',
38
- parentIsLocalized: false,
39
- payload,
40
- val: [
41
- {
42
- pattern: 'title'
43
- }
44
- ]
45
- })).rejects.toThrow('Invalid value for "like"');
46
- });
47
- });
48
-
49
- //# sourceMappingURL=buildSearchParams.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/queries/buildSearchParams.spec.ts"],"sourcesContent":["import type { FlattenedField, Payload } from 'payload'\n\nimport { describe, expect, it } from 'vitest'\n\nimport { buildSearchParam } from './buildSearchParams.js'\n\nconst fields = [{ name: 'title', type: 'text' }] as FlattenedField[]\n\nconst payload = {\n config: {},\n collections: {},\n globals: {},\n} as Payload\n\ndescribe('buildSearchParam', () => {\n for (const operator of ['contains', 'like', 'not_like'] as const) {\n it(`rejects object values for ${operator}`, async () => {\n await expect(\n buildSearchParam({\n fields,\n incomingPath: 'title',\n operator,\n parentIsLocalized: false,\n payload,\n val: { pattern: 'title' },\n }),\n ).rejects.toThrow(`Invalid value for \"${operator}\"`)\n })\n }\n\n it('rejects arrays containing object values', async () => {\n await expect(\n buildSearchParam({\n fields,\n incomingPath: 'title',\n operator: 'like',\n parentIsLocalized: false,\n payload,\n val: [{ pattern: 'title' }],\n }),\n ).rejects.toThrow('Invalid value for \"like\"')\n })\n})\n"],"names":["describe","expect","it","buildSearchParam","fields","name","type","payload","config","collections","globals","operator","incomingPath","parentIsLocalized","val","pattern","rejects","toThrow"],"mappings":"AAEA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,SAAQ;AAE7C,SAASC,gBAAgB,QAAQ,yBAAwB;AAEzD,MAAMC,SAAS;IAAC;QAAEC,MAAM;QAASC,MAAM;IAAO;CAAE;AAEhD,MAAMC,UAAU;IACdC,QAAQ,CAAC;IACTC,aAAa,CAAC;IACdC,SAAS,CAAC;AACZ;AAEAV,SAAS,oBAAoB;IAC3B,KAAK,MAAMW,YAAY;QAAC;QAAY;QAAQ;KAAW,CAAW;QAChET,GAAG,CAAC,0BAA0B,EAAES,UAAU,EAAE;YAC1C,MAAMV,OACJE,iBAAiB;gBACfC;gBACAQ,cAAc;gBACdD;gBACAE,mBAAmB;gBACnBN;gBACAO,KAAK;oBAAEC,SAAS;gBAAQ;YAC1B,IACAC,OAAO,CAACC,OAAO,CAAC,CAAC,mBAAmB,EAAEN,SAAS,CAAC,CAAC;QACrD;IACF;IAEAT,GAAG,2CAA2C;QAC5C,MAAMD,OACJE,iBAAiB;YACfC;YACAQ,cAAc;YACdD,UAAU;YACVE,mBAAmB;YACnBN;YACAO,KAAK;gBAAC;oBAAEC,SAAS;gBAAQ;aAAE;QAC7B,IACAC,OAAO,CAACC,OAAO,CAAC;IACpB;AACF"}
@@ -1,123 +0,0 @@
1
- import { describe, beforeAll, it, expect } from 'vitest';
2
- import { sanitizeConfig } from 'payload';
3
- import { buildSortParam } from './buildSortParam.js';
4
- let config;
5
- describe('builds sort params', ()=>{
6
- beforeAll(async ()=>{
7
- config = sanitizeConfig({
8
- localization: {
9
- defaultLocale: 'en',
10
- fallback: true,
11
- locales: [
12
- 'en',
13
- 'es'
14
- ]
15
- }
16
- });
17
- });
18
- it('adds a fallback on non-unique field', ()=>{
19
- const result = buildSortParam({
20
- config,
21
- parentIsLocalized: false,
22
- fields: [
23
- {
24
- name: 'title',
25
- type: 'text'
26
- },
27
- {
28
- name: 'order',
29
- type: 'number'
30
- }
31
- ],
32
- locale: 'en',
33
- sort: 'order',
34
- timestamps: true,
35
- adapter: {
36
- disableFallbackSort: false
37
- }
38
- });
39
- expect(result).toStrictEqual({
40
- order: 'asc',
41
- createdAt: 'desc'
42
- });
43
- });
44
- it('adds a fallback when sort isnt provided', ()=>{
45
- const result = buildSortParam({
46
- config,
47
- parentIsLocalized: false,
48
- fields: [
49
- {
50
- name: 'title',
51
- type: 'text'
52
- },
53
- {
54
- name: 'order',
55
- type: 'number'
56
- }
57
- ],
58
- locale: 'en',
59
- sort: undefined,
60
- timestamps: true,
61
- adapter: {
62
- disableFallbackSort: false
63
- }
64
- });
65
- expect(result).toStrictEqual({
66
- createdAt: 'desc'
67
- });
68
- });
69
- it('does not add a fallback on non-unique field when disableFallbackSort is true', ()=>{
70
- const result = buildSortParam({
71
- config,
72
- parentIsLocalized: false,
73
- fields: [
74
- {
75
- name: 'title',
76
- type: 'text'
77
- },
78
- {
79
- name: 'order',
80
- type: 'number'
81
- }
82
- ],
83
- locale: 'en',
84
- sort: 'order',
85
- timestamps: true,
86
- adapter: {
87
- disableFallbackSort: true
88
- }
89
- });
90
- expect(result).toStrictEqual({
91
- order: 'asc'
92
- });
93
- });
94
- // This test should be true even when disableFallbackSort is false
95
- it('does not add a fallback on unique field', ()=>{
96
- const result = buildSortParam({
97
- config,
98
- parentIsLocalized: false,
99
- fields: [
100
- {
101
- name: 'title',
102
- type: 'text'
103
- },
104
- {
105
- name: 'order',
106
- type: 'number',
107
- unique: true
108
- }
109
- ],
110
- locale: 'en',
111
- sort: 'order',
112
- timestamps: true,
113
- adapter: {
114
- disableFallbackSort: false
115
- }
116
- });
117
- expect(result).toStrictEqual({
118
- order: 'asc'
119
- });
120
- });
121
- });
122
-
123
- //# sourceMappingURL=buildSortParam.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/queries/buildSortParam.spec.ts"],"sourcesContent":["import type { Config, SanitizedConfig } from 'payload'\nimport { describe, beforeAll, it, expect } from 'vitest'\n\nimport { sanitizeConfig } from 'payload'\n\nimport { buildSortParam } from './buildSortParam.js'\nimport { MongooseAdapter } from '../index.js'\n\nlet config: SanitizedConfig\n\ndescribe('builds sort params', () => {\n beforeAll(async () => {\n config = sanitizeConfig({\n localization: {\n defaultLocale: 'en',\n fallback: true,\n locales: ['en', 'es'],\n },\n } as Config)\n })\n it('adds a fallback on non-unique field', () => {\n const result = buildSortParam({\n config,\n parentIsLocalized: false,\n fields: [\n {\n name: 'title',\n type: 'text',\n },\n {\n name: 'order',\n type: 'number',\n },\n ],\n locale: 'en',\n sort: 'order',\n timestamps: true,\n adapter: {\n disableFallbackSort: false,\n } as MongooseAdapter,\n })\n\n expect(result).toStrictEqual({ order: 'asc', createdAt: 'desc' })\n })\n\n it('adds a fallback when sort isnt provided', () => {\n const result = buildSortParam({\n config,\n parentIsLocalized: false,\n fields: [\n {\n name: 'title',\n type: 'text',\n },\n {\n name: 'order',\n type: 'number',\n },\n ],\n locale: 'en',\n sort: undefined,\n timestamps: true,\n adapter: {\n disableFallbackSort: false,\n } as MongooseAdapter,\n })\n\n expect(result).toStrictEqual({ createdAt: 'desc' })\n })\n\n it('does not add a fallback on non-unique field when disableFallbackSort is true', () => {\n const result = buildSortParam({\n config,\n parentIsLocalized: false,\n fields: [\n {\n name: 'title',\n type: 'text',\n },\n {\n name: 'order',\n type: 'number',\n },\n ],\n locale: 'en',\n sort: 'order',\n timestamps: true,\n adapter: {\n disableFallbackSort: true,\n } as MongooseAdapter,\n })\n\n expect(result).toStrictEqual({ order: 'asc' })\n })\n\n // This test should be true even when disableFallbackSort is false\n it('does not add a fallback on unique field', () => {\n const result = buildSortParam({\n config,\n parentIsLocalized: false,\n fields: [\n {\n name: 'title',\n type: 'text',\n },\n {\n name: 'order',\n type: 'number',\n unique: true, // Marking this field as unique\n },\n ],\n locale: 'en',\n sort: 'order',\n timestamps: true,\n adapter: {\n disableFallbackSort: false,\n } as MongooseAdapter,\n })\n\n expect(result).toStrictEqual({ order: 'asc' })\n })\n})\n"],"names":["describe","beforeAll","it","expect","sanitizeConfig","buildSortParam","config","localization","defaultLocale","fallback","locales","result","parentIsLocalized","fields","name","type","locale","sort","timestamps","adapter","disableFallbackSort","toStrictEqual","order","createdAt","undefined","unique"],"mappings":"AACA,SAASA,QAAQ,EAAEC,SAAS,EAAEC,EAAE,EAAEC,MAAM,QAAQ,SAAQ;AAExD,SAASC,cAAc,QAAQ,UAAS;AAExC,SAASC,cAAc,QAAQ,sBAAqB;AAGpD,IAAIC;AAEJN,SAAS,sBAAsB;IAC7BC,UAAU;QACRK,SAASF,eAAe;YACtBG,cAAc;gBACZC,eAAe;gBACfC,UAAU;gBACVC,SAAS;oBAAC;oBAAM;iBAAK;YACvB;QACF;IACF;IACAR,GAAG,uCAAuC;QACxC,MAAMS,SAASN,eAAe;YAC5BC;YACAM,mBAAmB;YACnBC,QAAQ;gBACN;oBACEC,MAAM;oBACNC,MAAM;gBACR;gBACA;oBACED,MAAM;oBACNC,MAAM;gBACR;aACD;YACDC,QAAQ;YACRC,MAAM;YACNC,YAAY;YACZC,SAAS;gBACPC,qBAAqB;YACvB;QACF;QAEAjB,OAAOQ,QAAQU,aAAa,CAAC;YAAEC,OAAO;YAAOC,WAAW;QAAO;IACjE;IAEArB,GAAG,2CAA2C;QAC5C,MAAMS,SAASN,eAAe;YAC5BC;YACAM,mBAAmB;YACnBC,QAAQ;gBACN;oBACEC,MAAM;oBACNC,MAAM;gBACR;gBACA;oBACED,MAAM;oBACNC,MAAM;gBACR;aACD;YACDC,QAAQ;YACRC,MAAMO;YACNN,YAAY;YACZC,SAAS;gBACPC,qBAAqB;YACvB;QACF;QAEAjB,OAAOQ,QAAQU,aAAa,CAAC;YAAEE,WAAW;QAAO;IACnD;IAEArB,GAAG,gFAAgF;QACjF,MAAMS,SAASN,eAAe;YAC5BC;YACAM,mBAAmB;YACnBC,QAAQ;gBACN;oBACEC,MAAM;oBACNC,MAAM;gBACR;gBACA;oBACED,MAAM;oBACNC,MAAM;gBACR;aACD;YACDC,QAAQ;YACRC,MAAM;YACNC,YAAY;YACZC,SAAS;gBACPC,qBAAqB;YACvB;QACF;QAEAjB,OAAOQ,QAAQU,aAAa,CAAC;YAAEC,OAAO;QAAM;IAC9C;IAEA,kEAAkE;IAClEpB,GAAG,2CAA2C;QAC5C,MAAMS,SAASN,eAAe;YAC5BC;YACAM,mBAAmB;YACnBC,QAAQ;gBACN;oBACEC,MAAM;oBACNC,MAAM;gBACR;gBACA;oBACED,MAAM;oBACNC,MAAM;oBACNU,QAAQ;gBACV;aACD;YACDT,QAAQ;YACRC,MAAM;YACNC,YAAY;YACZC,SAAS;gBACPC,qBAAqB;YACvB;QACF;QAEAjB,OAAOQ,QAAQU,aAAa,CAAC;YAAEC,OAAO;QAAM;IAC9C;AACF"}
@@ -1,215 +0,0 @@
1
- import { describe, beforeAll, it, expect } from 'vitest';
2
- import { flattenAllFields, sanitizeConfig } from 'payload';
3
- import { getLocalizedSortProperty } from './getLocalizedSortProperty.js';
4
- let config;
5
- describe('get localized sort property', ()=>{
6
- beforeAll(async ()=>{
7
- config = sanitizeConfig({
8
- localization: {
9
- defaultLocale: 'en',
10
- fallback: true,
11
- locales: [
12
- 'en',
13
- 'es'
14
- ]
15
- }
16
- });
17
- });
18
- it('passes through a non-localized sort property', ()=>{
19
- const result = getLocalizedSortProperty({
20
- config,
21
- parentIsLocalized: false,
22
- fields: [
23
- {
24
- name: 'title',
25
- type: 'text'
26
- }
27
- ],
28
- locale: 'en',
29
- segments: [
30
- 'title'
31
- ]
32
- });
33
- expect(result).toStrictEqual('title');
34
- });
35
- it('properly localizes an un-localized sort property', ()=>{
36
- const result = getLocalizedSortProperty({
37
- config,
38
- parentIsLocalized: false,
39
- fields: [
40
- {
41
- name: 'title',
42
- type: 'text',
43
- localized: true
44
- }
45
- ],
46
- locale: 'en',
47
- segments: [
48
- 'title'
49
- ]
50
- });
51
- expect(result).toStrictEqual('title.en');
52
- });
53
- it('keeps specifically asked-for localized sort properties', ()=>{
54
- const result = getLocalizedSortProperty({
55
- config,
56
- parentIsLocalized: false,
57
- fields: [
58
- {
59
- name: 'title',
60
- type: 'text',
61
- localized: true
62
- }
63
- ],
64
- locale: 'en',
65
- segments: [
66
- 'title',
67
- 'es'
68
- ]
69
- });
70
- expect(result).toStrictEqual('title.es');
71
- });
72
- it('properly localizes nested sort properties', ()=>{
73
- const result = getLocalizedSortProperty({
74
- config,
75
- parentIsLocalized: false,
76
- fields: flattenAllFields({
77
- fields: [
78
- {
79
- name: 'group',
80
- type: 'group',
81
- fields: [
82
- {
83
- name: 'title',
84
- type: 'text',
85
- localized: true
86
- }
87
- ]
88
- }
89
- ]
90
- }),
91
- locale: 'en',
92
- segments: [
93
- 'group',
94
- 'title'
95
- ]
96
- });
97
- expect(result).toStrictEqual('group.title.en');
98
- });
99
- it('keeps requested locale with nested sort properties', ()=>{
100
- const result = getLocalizedSortProperty({
101
- config,
102
- parentIsLocalized: false,
103
- fields: flattenAllFields({
104
- fields: [
105
- {
106
- name: 'group',
107
- type: 'group',
108
- fields: [
109
- {
110
- name: 'title',
111
- type: 'text',
112
- localized: true
113
- }
114
- ]
115
- }
116
- ]
117
- }),
118
- locale: 'en',
119
- segments: [
120
- 'group',
121
- 'title',
122
- 'es'
123
- ]
124
- });
125
- expect(result).toStrictEqual('group.title.es');
126
- });
127
- it('properly localizes field within row', ()=>{
128
- const result = getLocalizedSortProperty({
129
- config,
130
- parentIsLocalized: false,
131
- fields: flattenAllFields({
132
- fields: [
133
- {
134
- type: 'row',
135
- fields: [
136
- {
137
- name: 'title',
138
- type: 'text',
139
- localized: true
140
- }
141
- ]
142
- }
143
- ]
144
- }),
145
- locale: 'en',
146
- segments: [
147
- 'title'
148
- ]
149
- });
150
- expect(result).toStrictEqual('title.en');
151
- });
152
- it('properly localizes field within named tab', ()=>{
153
- const result = getLocalizedSortProperty({
154
- config,
155
- parentIsLocalized: false,
156
- fields: flattenAllFields({
157
- fields: [
158
- {
159
- type: 'tabs',
160
- tabs: [
161
- {
162
- name: 'tab',
163
- fields: [
164
- {
165
- name: 'title',
166
- type: 'text',
167
- localized: true
168
- }
169
- ]
170
- }
171
- ]
172
- }
173
- ]
174
- }),
175
- locale: 'en',
176
- segments: [
177
- 'tab',
178
- 'title'
179
- ]
180
- });
181
- expect(result).toStrictEqual('tab.title.en');
182
- });
183
- it('properly localizes field within unnamed tab', ()=>{
184
- const result = getLocalizedSortProperty({
185
- config,
186
- parentIsLocalized: false,
187
- fields: flattenAllFields({
188
- fields: [
189
- {
190
- type: 'tabs',
191
- tabs: [
192
- {
193
- fields: [
194
- {
195
- name: 'title',
196
- type: 'text',
197
- localized: true
198
- }
199
- ],
200
- label: 'Tab'
201
- }
202
- ]
203
- }
204
- ]
205
- }),
206
- locale: 'en',
207
- segments: [
208
- 'title'
209
- ]
210
- });
211
- expect(result).toStrictEqual('title.en');
212
- });
213
- });
214
-
215
- //# sourceMappingURL=getLocalizedSortProperty.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/queries/getLocalizedSortProperty.spec.ts"],"sourcesContent":["import { describe, beforeAll, it, expect } from 'vitest'\nimport type { Config, SanitizedConfig } from 'payload'\nimport { flattenAllFields, sanitizeConfig } from 'payload'\n\nimport { getLocalizedSortProperty } from './getLocalizedSortProperty.js'\n\nlet config: SanitizedConfig\n\ndescribe('get localized sort property', () => {\n beforeAll(async () => {\n config = sanitizeConfig({\n localization: {\n defaultLocale: 'en',\n fallback: true,\n locales: ['en', 'es'],\n },\n } as Config)\n })\n it('passes through a non-localized sort property', () => {\n const result = getLocalizedSortProperty({\n config,\n parentIsLocalized: false,\n fields: [\n {\n name: 'title',\n type: 'text',\n },\n ],\n locale: 'en',\n segments: ['title'],\n })\n\n expect(result).toStrictEqual('title')\n })\n\n it('properly localizes an un-localized sort property', () => {\n const result = getLocalizedSortProperty({\n config,\n parentIsLocalized: false,\n fields: [\n {\n name: 'title',\n type: 'text',\n localized: true,\n },\n ],\n locale: 'en',\n segments: ['title'],\n })\n\n expect(result).toStrictEqual('title.en')\n })\n\n it('keeps specifically asked-for localized sort properties', () => {\n const result = getLocalizedSortProperty({\n config,\n parentIsLocalized: false,\n fields: [\n {\n name: 'title',\n type: 'text',\n localized: true,\n },\n ],\n locale: 'en',\n segments: ['title', 'es'],\n })\n\n expect(result).toStrictEqual('title.es')\n })\n\n it('properly localizes nested sort properties', () => {\n const result = getLocalizedSortProperty({\n config,\n parentIsLocalized: false,\n fields: flattenAllFields({\n fields: [\n {\n name: 'group',\n type: 'group',\n fields: [\n {\n name: 'title',\n type: 'text',\n localized: true,\n },\n ],\n },\n ],\n }),\n locale: 'en',\n segments: ['group', 'title'],\n })\n\n expect(result).toStrictEqual('group.title.en')\n })\n\n it('keeps requested locale with nested sort properties', () => {\n const result = getLocalizedSortProperty({\n config,\n parentIsLocalized: false,\n fields: flattenAllFields({\n fields: [\n {\n name: 'group',\n type: 'group',\n fields: [\n {\n name: 'title',\n type: 'text',\n localized: true,\n },\n ],\n },\n ],\n }),\n locale: 'en',\n segments: ['group', 'title', 'es'],\n })\n\n expect(result).toStrictEqual('group.title.es')\n })\n\n it('properly localizes field within row', () => {\n const result = getLocalizedSortProperty({\n config,\n parentIsLocalized: false,\n fields: flattenAllFields({\n fields: [\n {\n type: 'row',\n fields: [\n {\n name: 'title',\n type: 'text',\n localized: true,\n },\n ],\n },\n ],\n }),\n locale: 'en',\n segments: ['title'],\n })\n\n expect(result).toStrictEqual('title.en')\n })\n\n it('properly localizes field within named tab', () => {\n const result = getLocalizedSortProperty({\n config,\n parentIsLocalized: false,\n fields: flattenAllFields({\n fields: [\n {\n type: 'tabs',\n tabs: [\n {\n name: 'tab',\n fields: [\n {\n name: 'title',\n type: 'text',\n localized: true,\n },\n ],\n },\n ],\n },\n ],\n }),\n locale: 'en',\n segments: ['tab', 'title'],\n })\n\n expect(result).toStrictEqual('tab.title.en')\n })\n\n it('properly localizes field within unnamed tab', () => {\n const result = getLocalizedSortProperty({\n config,\n parentIsLocalized: false,\n fields: flattenAllFields({\n fields: [\n {\n type: 'tabs',\n tabs: [\n {\n fields: [\n {\n name: 'title',\n type: 'text',\n localized: true,\n },\n ],\n label: 'Tab',\n },\n ],\n },\n ],\n }),\n locale: 'en',\n segments: ['title'],\n })\n\n expect(result).toStrictEqual('title.en')\n })\n})\n"],"names":["describe","beforeAll","it","expect","flattenAllFields","sanitizeConfig","getLocalizedSortProperty","config","localization","defaultLocale","fallback","locales","result","parentIsLocalized","fields","name","type","locale","segments","toStrictEqual","localized","tabs","label"],"mappings":"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"}
@@ -1,546 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { flattenAllFields } from 'payload';
3
- import { Types } from 'mongoose';
4
- import { transform } from './transform.js';
5
- const flattenRelationshipValues = (obj, prefix = '')=>{
6
- return Object.keys(obj).reduce((acc, key)=>{
7
- const fullKey = prefix ? `${prefix}.${key}` : key;
8
- const value = obj[key];
9
- if (value && typeof value === 'object' && !(value instanceof Types.ObjectId)) {
10
- Object.assign(acc, flattenRelationshipValues(value, fullKey));
11
- // skip relationTo and blockType
12
- } else if (!fullKey.endsWith('relationTo') && !fullKey.endsWith('blockType')) {
13
- acc[fullKey] = value;
14
- }
15
- return acc;
16
- }, {});
17
- };
18
- const relsFields = [
19
- {
20
- name: 'rel_1',
21
- type: 'relationship',
22
- relationTo: 'rels'
23
- },
24
- {
25
- name: 'rel_1_l',
26
- type: 'relationship',
27
- localized: true,
28
- relationTo: 'rels'
29
- },
30
- {
31
- name: 'rel_2',
32
- type: 'relationship',
33
- hasMany: true,
34
- relationTo: 'rels'
35
- },
36
- {
37
- name: 'rel_2_l',
38
- type: 'relationship',
39
- hasMany: true,
40
- localized: true,
41
- relationTo: 'rels'
42
- },
43
- {
44
- name: 'rel_3',
45
- type: 'relationship',
46
- relationTo: [
47
- 'rels'
48
- ]
49
- },
50
- {
51
- name: 'rel_3_l',
52
- type: 'relationship',
53
- localized: true,
54
- relationTo: [
55
- 'rels'
56
- ]
57
- },
58
- {
59
- name: 'rel_4',
60
- type: 'relationship',
61
- hasMany: true,
62
- relationTo: [
63
- 'rels'
64
- ]
65
- },
66
- {
67
- name: 'rel_4_l',
68
- type: 'relationship',
69
- hasMany: true,
70
- localized: true,
71
- relationTo: [
72
- 'rels'
73
- ]
74
- }
75
- ];
76
- const referenceBlockFields = [
77
- ...relsFields,
78
- {
79
- name: 'group',
80
- type: 'group',
81
- fields: relsFields
82
- },
83
- {
84
- name: 'array',
85
- type: 'array',
86
- fields: relsFields
87
- }
88
- ];
89
- const config = {
90
- blocks: [
91
- {
92
- slug: 'reference-block',
93
- fields: referenceBlockFields,
94
- flattenedFields: flattenAllFields({
95
- fields: referenceBlockFields
96
- })
97
- }
98
- ],
99
- collections: [
100
- {
101
- slug: 'docs',
102
- fields: [
103
- ...relsFields,
104
- {
105
- name: 'array',
106
- type: 'array',
107
- fields: [
108
- {
109
- name: 'array',
110
- type: 'array',
111
- fields: relsFields
112
- },
113
- {
114
- name: 'blocks',
115
- type: 'blocks',
116
- blocks: [
117
- {
118
- slug: 'block',
119
- fields: relsFields
120
- }
121
- ]
122
- },
123
- ...relsFields
124
- ]
125
- },
126
- {
127
- name: 'arrayLocalized',
128
- type: 'array',
129
- fields: [
130
- {
131
- name: 'array',
132
- type: 'array',
133
- fields: relsFields
134
- },
135
- {
136
- name: 'blocks',
137
- type: 'blocks',
138
- blocks: [
139
- {
140
- slug: 'block',
141
- fields: relsFields
142
- }
143
- ]
144
- },
145
- ...relsFields
146
- ],
147
- localized: true
148
- },
149
- {
150
- name: 'blocks',
151
- type: 'blocks',
152
- blocks: [
153
- {
154
- slug: 'block',
155
- fields: [
156
- ...relsFields,
157
- {
158
- name: 'group',
159
- type: 'group',
160
- fields: relsFields
161
- },
162
- {
163
- name: 'array',
164
- type: 'array',
165
- fields: relsFields
166
- }
167
- ]
168
- }
169
- ]
170
- },
171
- {
172
- name: 'referencedBlocks',
173
- type: 'blocks',
174
- blocks: [
175
- 'reference-block'
176
- ]
177
- },
178
- {
179
- name: 'group',
180
- type: 'group',
181
- fields: [
182
- ...relsFields,
183
- {
184
- name: 'array',
185
- type: 'array',
186
- fields: relsFields
187
- }
188
- ]
189
- },
190
- {
191
- name: 'groupLocalized',
192
- type: 'group',
193
- fields: [
194
- ...relsFields,
195
- {
196
- name: 'array',
197
- type: 'array',
198
- fields: relsFields
199
- }
200
- ],
201
- localized: true
202
- },
203
- {
204
- name: 'groupAndRow',
205
- type: 'group',
206
- fields: [
207
- {
208
- type: 'row',
209
- fields: [
210
- ...relsFields,
211
- {
212
- type: 'array',
213
- name: 'array',
214
- fields: relsFields
215
- }
216
- ]
217
- }
218
- ]
219
- },
220
- {
221
- type: 'tabs',
222
- tabs: [
223
- {
224
- name: 'tab',
225
- fields: relsFields
226
- },
227
- {
228
- name: 'tabLocalized',
229
- fields: relsFields,
230
- localized: true
231
- },
232
- {
233
- label: 'another',
234
- fields: [
235
- {
236
- type: 'tabs',
237
- tabs: [
238
- {
239
- name: 'nestedTab',
240
- fields: relsFields
241
- }
242
- ]
243
- }
244
- ]
245
- }
246
- ]
247
- }
248
- ]
249
- },
250
- {
251
- slug: 'rels',
252
- fields: []
253
- }
254
- ],
255
- localization: {
256
- defaultLocale: 'en',
257
- localeCodes: [
258
- 'en',
259
- 'es'
260
- ],
261
- locales: [
262
- {
263
- code: 'en',
264
- label: 'EN'
265
- },
266
- {
267
- code: 'es',
268
- label: 'ES'
269
- }
270
- ]
271
- }
272
- };
273
- const relsData = {
274
- rel_1: new Types.ObjectId().toHexString(),
275
- rel_1_l: {
276
- en: new Types.ObjectId().toHexString(),
277
- es: new Types.ObjectId().toHexString()
278
- },
279
- rel_2: [
280
- new Types.ObjectId().toHexString()
281
- ],
282
- rel_2_l: {
283
- en: [
284
- new Types.ObjectId().toHexString()
285
- ],
286
- es: [
287
- new Types.ObjectId().toHexString()
288
- ]
289
- },
290
- rel_3: {
291
- relationTo: 'rels',
292
- value: new Types.ObjectId().toHexString()
293
- },
294
- rel_3_l: {
295
- en: {
296
- relationTo: 'rels',
297
- value: new Types.ObjectId().toHexString()
298
- },
299
- es: {
300
- relationTo: 'rels',
301
- value: new Types.ObjectId().toHexString()
302
- }
303
- },
304
- rel_4: [
305
- {
306
- relationTo: 'rels',
307
- value: new Types.ObjectId().toHexString()
308
- }
309
- ],
310
- rel_4_l: {
311
- en: [
312
- {
313
- relationTo: 'rels',
314
- value: new Types.ObjectId().toHexString()
315
- }
316
- ],
317
- es: [
318
- {
319
- relationTo: 'rels',
320
- value: new Types.ObjectId().toHexString()
321
- }
322
- ]
323
- }
324
- };
325
- describe('transform', ()=>{
326
- it('should sanitize relationships', ()=>{
327
- const data = {
328
- ...relsData,
329
- array: [
330
- {
331
- ...relsData,
332
- array: [
333
- {
334
- ...relsData
335
- }
336
- ],
337
- blocks: [
338
- {
339
- blockType: 'block',
340
- ...relsData
341
- }
342
- ]
343
- }
344
- ],
345
- arrayLocalized: {
346
- en: [
347
- {
348
- ...relsData,
349
- array: [
350
- {
351
- ...relsData
352
- }
353
- ],
354
- blocks: [
355
- {
356
- blockType: 'block',
357
- ...relsData
358
- }
359
- ]
360
- }
361
- ],
362
- es: [
363
- {
364
- ...relsData,
365
- array: [
366
- {
367
- ...relsData
368
- }
369
- ],
370
- blocks: [
371
- {
372
- blockType: 'block',
373
- ...relsData
374
- }
375
- ]
376
- }
377
- ]
378
- },
379
- blocks: [
380
- {
381
- blockType: 'block',
382
- ...relsData,
383
- array: [
384
- {
385
- ...relsData
386
- }
387
- ],
388
- group: {
389
- ...relsData
390
- }
391
- }
392
- ],
393
- referencedBlocks: [
394
- {
395
- blockType: 'reference-block',
396
- array: [
397
- {
398
- ...relsData
399
- }
400
- ],
401
- group: {
402
- ...relsData
403
- },
404
- ...relsData
405
- }
406
- ],
407
- group: {
408
- ...relsData,
409
- array: [
410
- {
411
- ...relsData
412
- }
413
- ]
414
- },
415
- groupAndRow: {
416
- ...relsData,
417
- array: [
418
- {
419
- ...relsData
420
- }
421
- ]
422
- },
423
- groupLocalized: {
424
- en: {
425
- ...relsData,
426
- array: [
427
- {
428
- ...relsData
429
- }
430
- ]
431
- },
432
- es: {
433
- ...relsData,
434
- array: [
435
- {
436
- ...relsData
437
- }
438
- ]
439
- }
440
- },
441
- tab: {
442
- ...relsData
443
- },
444
- tabLocalized: {
445
- en: {
446
- ...relsData
447
- },
448
- es: {
449
- ...relsData
450
- }
451
- },
452
- nestedTab: {
453
- ...relsData
454
- }
455
- };
456
- const flattenValuesBefore = Object.values(flattenRelationshipValues(data));
457
- const mockAdapter = {
458
- payload: {
459
- config
460
- }
461
- };
462
- transform({
463
- adapter: mockAdapter,
464
- operation: 'write',
465
- data,
466
- fields: config.collections[0].fields
467
- });
468
- if ('updatedAt' in data) {
469
- delete data.updatedAt;
470
- }
471
- const flattenValuesAfter = Object.values(flattenRelationshipValues(data));
472
- flattenValuesAfter.forEach((value, i)=>{
473
- expect(value).toBeInstanceOf(Types.ObjectId);
474
- expect(flattenValuesBefore[i]).toBe(value.toHexString());
475
- });
476
- });
477
- it('should strip null elements from array and blocks fields on read', ()=>{
478
- const data = {
479
- _id: new Types.ObjectId(),
480
- array: [
481
- null,
482
- {
483
- rel_1: new Types.ObjectId()
484
- }
485
- ],
486
- arrayLocalized: {
487
- en: [
488
- null,
489
- {
490
- rel_1: new Types.ObjectId()
491
- }
492
- ]
493
- },
494
- blocks: [
495
- null,
496
- {
497
- blockType: 'block',
498
- rel_1: new Types.ObjectId()
499
- }
500
- ]
501
- };
502
- const mockAdapter = {
503
- allowAdditionalKeys: false,
504
- payload: {
505
- config
506
- }
507
- };
508
- expect(()=>transform({
509
- adapter: mockAdapter,
510
- operation: 'read',
511
- data,
512
- fields: config.collections[0].fields
513
- })).not.toThrow();
514
- expect(data.array).toHaveLength(1);
515
- expect(data.array[0]).toMatchObject({});
516
- expect(data.arrayLocalized.en).toHaveLength(1);
517
- expect(data.blocks).toHaveLength(1);
518
- expect(data.blocks[0].blockType).toBe('block');
519
- });
520
- it('should skip null entries in hasMany relationship arrays without coercing them', ()=>{
521
- const validId = new Types.ObjectId();
522
- const data = {
523
- _id: new Types.ObjectId(),
524
- rel_2: [
525
- null,
526
- validId
527
- ]
528
- };
529
- const mockAdapter = {
530
- allowAdditionalKeys: false,
531
- payload: {
532
- config
533
- }
534
- };
535
- expect(()=>transform({
536
- adapter: mockAdapter,
537
- operation: 'read',
538
- data,
539
- fields: config.collections[0].fields
540
- })).not.toThrow();
541
- expect(data.rel_2[0]).toBeNull();
542
- expect(data.rel_2[1]).toBe(validId.toHexString());
543
- });
544
- });
545
-
546
- //# sourceMappingURL=transform.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utilities/transform.spec.ts"],"sourcesContent":["import { describe, it, expect } from 'vitest'\nimport { flattenAllFields, type Field, type SanitizedConfig } from 'payload'\nimport { Types } from 'mongoose'\n\nimport { transform } from './transform.js'\nimport type { MongooseAdapter } from '../index.js'\n\nconst flattenRelationshipValues = (obj: Record<string, any>, prefix = ''): Record<string, any> => {\n return Object.keys(obj).reduce(\n (acc, key) => {\n const fullKey = prefix ? `${prefix}.${key}` : key\n const value = obj[key]\n\n if (value && typeof value === 'object' && !(value instanceof Types.ObjectId)) {\n Object.assign(acc, flattenRelationshipValues(value, fullKey))\n // skip relationTo and blockType\n } else if (!fullKey.endsWith('relationTo') && !fullKey.endsWith('blockType')) {\n acc[fullKey] = value\n }\n\n return acc\n },\n {} as Record<string, any>,\n )\n}\n\nconst relsFields: Field[] = [\n {\n name: 'rel_1',\n type: 'relationship',\n relationTo: 'rels',\n },\n {\n name: 'rel_1_l',\n type: 'relationship',\n localized: true,\n relationTo: 'rels',\n },\n {\n name: 'rel_2',\n type: 'relationship',\n hasMany: true,\n relationTo: 'rels',\n },\n {\n name: 'rel_2_l',\n type: 'relationship',\n hasMany: true,\n localized: true,\n relationTo: 'rels',\n },\n {\n name: 'rel_3',\n type: 'relationship',\n relationTo: ['rels'],\n },\n {\n name: 'rel_3_l',\n type: 'relationship',\n localized: true,\n relationTo: ['rels'],\n },\n {\n name: 'rel_4',\n type: 'relationship',\n hasMany: true,\n relationTo: ['rels'],\n },\n {\n name: 'rel_4_l',\n type: 'relationship',\n hasMany: true,\n localized: true,\n relationTo: ['rels'],\n },\n]\n\nconst referenceBlockFields: Field[] = [\n ...relsFields,\n {\n name: 'group',\n type: 'group',\n fields: relsFields,\n },\n {\n name: 'array',\n type: 'array',\n fields: relsFields,\n },\n]\n\nconst config = {\n blocks: [\n {\n slug: 'reference-block',\n fields: referenceBlockFields,\n flattenedFields: flattenAllFields({ fields: referenceBlockFields }),\n },\n ],\n collections: [\n {\n slug: 'docs',\n fields: [\n ...relsFields,\n {\n name: 'array',\n type: 'array',\n fields: [\n {\n name: 'array',\n type: 'array',\n fields: relsFields,\n },\n {\n name: 'blocks',\n type: 'blocks',\n blocks: [{ slug: 'block', fields: relsFields }],\n },\n ...relsFields,\n ],\n },\n {\n name: 'arrayLocalized',\n type: 'array',\n fields: [\n {\n name: 'array',\n type: 'array',\n fields: relsFields,\n },\n {\n name: 'blocks',\n type: 'blocks',\n blocks: [{ slug: 'block', fields: relsFields }],\n },\n ...relsFields,\n ],\n localized: true,\n },\n {\n name: 'blocks',\n type: 'blocks',\n blocks: [\n {\n slug: 'block',\n fields: [\n ...relsFields,\n {\n name: 'group',\n type: 'group',\n fields: relsFields,\n },\n {\n name: 'array',\n type: 'array',\n fields: relsFields,\n },\n ],\n },\n ],\n },\n {\n name: 'referencedBlocks',\n type: 'blocks',\n blocks: ['reference-block'],\n },\n {\n name: 'group',\n type: 'group',\n fields: [\n ...relsFields,\n {\n name: 'array',\n type: 'array',\n fields: relsFields,\n },\n ],\n },\n {\n name: 'groupLocalized',\n type: 'group',\n fields: [\n ...relsFields,\n {\n name: 'array',\n type: 'array',\n fields: relsFields,\n },\n ],\n localized: true,\n },\n {\n name: 'groupAndRow',\n type: 'group',\n fields: [\n {\n type: 'row',\n fields: [\n ...relsFields,\n {\n type: 'array',\n name: 'array',\n fields: relsFields,\n },\n ],\n },\n ],\n },\n {\n type: 'tabs',\n tabs: [\n {\n name: 'tab',\n fields: relsFields,\n },\n {\n name: 'tabLocalized',\n fields: relsFields,\n localized: true,\n },\n {\n label: 'another',\n fields: [\n {\n type: 'tabs',\n tabs: [\n {\n name: 'nestedTab',\n fields: relsFields,\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n {\n slug: 'rels',\n fields: [],\n },\n ],\n localization: {\n defaultLocale: 'en',\n localeCodes: ['en', 'es'],\n locales: [\n { code: 'en', label: 'EN' },\n { code: 'es', label: 'ES' },\n ],\n },\n} as SanitizedConfig\n\nconst relsData = {\n rel_1: new Types.ObjectId().toHexString(),\n rel_1_l: {\n en: new Types.ObjectId().toHexString(),\n es: new Types.ObjectId().toHexString(),\n },\n rel_2: [new Types.ObjectId().toHexString()],\n rel_2_l: {\n en: [new Types.ObjectId().toHexString()],\n es: [new Types.ObjectId().toHexString()],\n },\n rel_3: {\n relationTo: 'rels',\n value: new Types.ObjectId().toHexString(),\n },\n rel_3_l: {\n en: {\n relationTo: 'rels',\n value: new Types.ObjectId().toHexString(),\n },\n es: {\n relationTo: 'rels',\n value: new Types.ObjectId().toHexString(),\n },\n },\n rel_4: [\n {\n relationTo: 'rels',\n value: new Types.ObjectId().toHexString(),\n },\n ],\n rel_4_l: {\n en: [\n {\n relationTo: 'rels',\n value: new Types.ObjectId().toHexString(),\n },\n ],\n es: [\n {\n relationTo: 'rels',\n value: new Types.ObjectId().toHexString(),\n },\n ],\n },\n}\n\ndescribe('transform', () => {\n it('should sanitize relationships', () => {\n const data = {\n ...relsData,\n array: [\n {\n ...relsData,\n array: [{ ...relsData }],\n blocks: [\n {\n blockType: 'block',\n ...relsData,\n },\n ],\n },\n ],\n arrayLocalized: {\n en: [\n {\n ...relsData,\n array: [{ ...relsData }],\n blocks: [\n {\n blockType: 'block',\n ...relsData,\n },\n ],\n },\n ],\n es: [\n {\n ...relsData,\n array: [{ ...relsData }],\n blocks: [\n {\n blockType: 'block',\n ...relsData,\n },\n ],\n },\n ],\n },\n blocks: [\n {\n blockType: 'block',\n ...relsData,\n array: [{ ...relsData }],\n group: { ...relsData },\n },\n ],\n referencedBlocks: [\n {\n blockType: 'reference-block',\n array: [{ ...relsData }],\n group: { ...relsData },\n ...relsData,\n },\n ],\n group: {\n ...relsData,\n array: [{ ...relsData }],\n },\n groupAndRow: {\n ...relsData,\n array: [{ ...relsData }],\n },\n groupLocalized: {\n en: {\n ...relsData,\n array: [{ ...relsData }],\n },\n es: {\n ...relsData,\n array: [{ ...relsData }],\n },\n },\n tab: { ...relsData },\n tabLocalized: {\n en: { ...relsData },\n es: { ...relsData },\n },\n nestedTab: { ...relsData },\n }\n const flattenValuesBefore = Object.values(flattenRelationshipValues(data))\n\n const mockAdapter = {\n payload: {\n config,\n },\n } as MongooseAdapter\n\n transform({\n adapter: mockAdapter,\n operation: 'write',\n data,\n fields: config.collections[0].fields,\n })\n if ('updatedAt' in data) {\n delete data.updatedAt\n }\n\n const flattenValuesAfter = Object.values(flattenRelationshipValues(data))\n\n flattenValuesAfter.forEach((value, i) => {\n expect(value).toBeInstanceOf(Types.ObjectId)\n expect(flattenValuesBefore[i]).toBe(value.toHexString())\n })\n })\n\n it('should strip null elements from array and blocks fields on read', () => {\n const data: Record<string, any> = {\n _id: new Types.ObjectId(),\n array: [null, { rel_1: new Types.ObjectId() }],\n arrayLocalized: {\n en: [null, { rel_1: new Types.ObjectId() }],\n },\n blocks: [null, { blockType: 'block', rel_1: new Types.ObjectId() }],\n }\n\n const mockAdapter = {\n allowAdditionalKeys: false,\n payload: {\n config,\n },\n } as MongooseAdapter\n\n expect(() =>\n transform({\n adapter: mockAdapter,\n operation: 'read',\n data,\n fields: config.collections[0].fields,\n }),\n ).not.toThrow()\n\n expect(data.array).toHaveLength(1)\n expect(data.array[0]).toMatchObject({})\n expect(data.arrayLocalized.en).toHaveLength(1)\n expect(data.blocks).toHaveLength(1)\n expect(data.blocks[0].blockType).toBe('block')\n })\n\n it('should skip null entries in hasMany relationship arrays without coercing them', () => {\n const validId = new Types.ObjectId()\n const data: Record<string, any> = {\n _id: new Types.ObjectId(),\n rel_2: [null, validId],\n }\n\n const mockAdapter = {\n allowAdditionalKeys: false,\n payload: {\n config,\n },\n } as MongooseAdapter\n\n expect(() =>\n transform({\n adapter: mockAdapter,\n operation: 'read',\n data,\n fields: config.collections[0].fields,\n }),\n ).not.toThrow()\n\n expect(data.rel_2[0]).toBeNull()\n expect(data.rel_2[1]).toBe(validId.toHexString())\n })\n})\n"],"names":["describe","it","expect","flattenAllFields","Types","transform","flattenRelationshipValues","obj","prefix","Object","keys","reduce","acc","key","fullKey","value","ObjectId","assign","endsWith","relsFields","name","type","relationTo","localized","hasMany","referenceBlockFields","fields","config","blocks","slug","flattenedFields","collections","tabs","label","localization","defaultLocale","localeCodes","locales","code","relsData","rel_1","toHexString","rel_1_l","en","es","rel_2","rel_2_l","rel_3","rel_3_l","rel_4","rel_4_l","data","array","blockType","arrayLocalized","group","referencedBlocks","groupAndRow","groupLocalized","tab","tabLocalized","nestedTab","flattenValuesBefore","values","mockAdapter","payload","adapter","operation","updatedAt","flattenValuesAfter","forEach","i","toBeInstanceOf","toBe","_id","allowAdditionalKeys","not","toThrow","toHaveLength","toMatchObject","validId","toBeNull"],"mappings":"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"}