@payloadcms/drizzle 3.47.0-canary.3 → 3.47.0-canary.5
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/dist/updateOne.d.ts.map +1 -1
- package/dist/updateOne.js +73 -8
- package/dist/updateOne.js.map +1 -1
- package/package.json +4 -4
package/dist/updateOne.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updateOne.d.ts","sourceRoot":"","sources":["../src/updateOne.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"updateOne.d.ts","sourceRoot":"","sources":["../src/updateOne.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAkB,SAAS,EAAE,MAAM,SAAS,CAAA;AA+DxD,eAAO,MAAM,SAAS,EAAE,SAmIvB,CAAA"}
|
package/dist/updateOne.js
CHANGED
|
@@ -1,8 +1,34 @@
|
|
|
1
|
+
import { eq } from 'drizzle-orm';
|
|
1
2
|
import toSnakeCase from 'to-snake-case';
|
|
3
|
+
import { buildFindManyArgs } from './find/buildFindManyArgs.js';
|
|
2
4
|
import { buildQuery } from './queries/buildQuery.js';
|
|
3
5
|
import { selectDistinct } from './queries/selectDistinct.js';
|
|
6
|
+
import { transform } from './transform/read/index.js';
|
|
7
|
+
import { transformForWrite } from './transform/write/index.js';
|
|
4
8
|
import { upsertRow } from './upsertRow/index.js';
|
|
5
9
|
import { getTransaction } from './utilities/getTransaction.js';
|
|
10
|
+
/**
|
|
11
|
+
* Checks whether we should use the upsertRow function for the passed data and otherwise use a simple SQL SET call.
|
|
12
|
+
* We need to use upsertRow only when the data has arrays, blocks, hasMany select/text/number, localized fields, complex relationships.
|
|
13
|
+
*/ const shouldUseUpsertRow = ({ data, fields })=>{
|
|
14
|
+
for(const key in data){
|
|
15
|
+
const value = data[key];
|
|
16
|
+
const field = fields.find((each)=>each.name === key);
|
|
17
|
+
if (!field) {
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
if (field.type === 'array' || field.type === 'blocks' || (field.type === 'text' || field.type === 'relationship' || field.type === 'upload' || field.type === 'select' || field.type === 'number') && field.hasMany || (field.type === 'relationship' || field.type === 'upload') && Array.isArray(field.relationTo) || field.localized) {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
if ((field.type === 'group' || field.type === 'tab') && value && typeof value === 'object' && shouldUseUpsertRow({
|
|
24
|
+
data: value,
|
|
25
|
+
fields: field.flattenedFields
|
|
26
|
+
})) {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return false;
|
|
31
|
+
};
|
|
6
32
|
export const updateOne = async function updateOne({ id, collection: collectionSlug, data, joins: joinQuery, locale, options = {
|
|
7
33
|
upsert: false
|
|
8
34
|
}, req, returning, select, where: whereArg }) {
|
|
@@ -45,22 +71,61 @@ export const updateOne = async function updateOne({ id, collection: collectionSl
|
|
|
45
71
|
// - Document found, but returning === false
|
|
46
72
|
return null;
|
|
47
73
|
}
|
|
48
|
-
|
|
49
|
-
|
|
74
|
+
if (!idToUpdate || shouldUseUpsertRow({
|
|
75
|
+
data,
|
|
76
|
+
fields: collection.flattenedFields
|
|
77
|
+
})) {
|
|
78
|
+
const result = await upsertRow({
|
|
79
|
+
id: idToUpdate,
|
|
80
|
+
adapter: this,
|
|
81
|
+
data,
|
|
82
|
+
db,
|
|
83
|
+
fields: collection.flattenedFields,
|
|
84
|
+
ignoreResult: returning === false,
|
|
85
|
+
joinQuery,
|
|
86
|
+
operation: 'update',
|
|
87
|
+
req,
|
|
88
|
+
select,
|
|
89
|
+
tableName
|
|
90
|
+
});
|
|
91
|
+
if (returning === false) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
const { row } = transformForWrite({
|
|
50
97
|
adapter: this,
|
|
51
98
|
data,
|
|
52
|
-
db,
|
|
53
99
|
fields: collection.flattenedFields,
|
|
54
|
-
ignoreResult: returning === false,
|
|
55
|
-
joinQuery,
|
|
56
|
-
operation: 'update',
|
|
57
|
-
req,
|
|
58
|
-
select,
|
|
59
100
|
tableName
|
|
60
101
|
});
|
|
102
|
+
const drizzle = db;
|
|
103
|
+
await drizzle.update(this.tables[tableName]).set(row)// TODO: we can skip fetching idToUpdate here with using the incoming where
|
|
104
|
+
.where(eq(this.tables[tableName].id, idToUpdate));
|
|
61
105
|
if (returning === false) {
|
|
62
106
|
return null;
|
|
63
107
|
}
|
|
108
|
+
const findManyArgs = buildFindManyArgs({
|
|
109
|
+
adapter: this,
|
|
110
|
+
depth: 0,
|
|
111
|
+
fields: collection.flattenedFields,
|
|
112
|
+
joinQuery: false,
|
|
113
|
+
select,
|
|
114
|
+
tableName
|
|
115
|
+
});
|
|
116
|
+
findManyArgs.where = eq(this.tables[tableName].id, idToUpdate);
|
|
117
|
+
const doc = await db.query[tableName].findFirst(findManyArgs);
|
|
118
|
+
// //////////////////////////////////
|
|
119
|
+
// TRANSFORM DATA
|
|
120
|
+
// //////////////////////////////////
|
|
121
|
+
const result = transform({
|
|
122
|
+
adapter: this,
|
|
123
|
+
config: this.payload.config,
|
|
124
|
+
data: doc,
|
|
125
|
+
fields: collection.flattenedFields,
|
|
126
|
+
joinQuery: false,
|
|
127
|
+
tableName
|
|
128
|
+
});
|
|
64
129
|
return result;
|
|
65
130
|
};
|
|
66
131
|
|
package/dist/updateOne.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/updateOne.ts"],"sourcesContent":["import type { LibSQLDatabase } from 'drizzle-orm/libsql'\nimport type { UpdateOne } from 'payload'\n\nimport toSnakeCase from 'to-snake-case'\n\nimport type { DrizzleAdapter } from './types.js'\n\nimport { buildQuery } from './queries/buildQuery.js'\nimport { selectDistinct } from './queries/selectDistinct.js'\nimport { upsertRow } from './upsertRow/index.js'\nimport { getTransaction } from './utilities/getTransaction.js'\n\nexport const updateOne: UpdateOne = async function updateOne(\n this: DrizzleAdapter,\n {\n id,\n collection: collectionSlug,\n data,\n joins: joinQuery,\n locale,\n options = { upsert: false },\n req,\n returning,\n select,\n where: whereArg,\n },\n) {\n const db = await getTransaction(this, req)\n const collection = this.payload.collections[collectionSlug].config\n const tableName = this.tableNameMap.get(toSnakeCase(collection.slug))\n let idToUpdate = id\n\n if (!idToUpdate) {\n const { joins, selectFields, where } = buildQuery({\n adapter: this,\n fields: collection.flattenedFields,\n locale,\n tableName,\n where: whereArg,\n })\n\n // selectDistinct will only return if there are joins\n const selectDistinctResult = await selectDistinct({\n adapter: this,\n db,\n joins,\n query: ({ query }) => query.limit(1),\n selectFields,\n tableName,\n where,\n })\n\n if (selectDistinctResult?.[0]?.id) {\n idToUpdate = selectDistinctResult?.[0]?.id\n // If id wasn't passed but `where` without any joins, retrieve it with findFirst\n } else if (whereArg && !joins.length) {\n const table = this.tables[tableName]\n\n const docsToUpdate = await (db as LibSQLDatabase)\n .select({\n id: table.id,\n })\n .from(table)\n .where(where)\n .limit(1)\n idToUpdate = docsToUpdate?.[0]?.id\n }\n }\n\n if (!idToUpdate && !options.upsert) {\n // TODO: In 4.0, if returning === false, we should differentiate between:\n // - No document found to update\n // - Document found, but returning === false\n return null\n }\n\n const result = await upsertRow({\n
|
|
1
|
+
{"version":3,"sources":["../src/updateOne.ts"],"sourcesContent":["import type { LibSQLDatabase } from 'drizzle-orm/libsql'\nimport type { FlattenedField, UpdateOne } from 'payload'\n\nimport { eq } from 'drizzle-orm'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { DrizzleAdapter } from './types.js'\n\nimport { buildFindManyArgs } from './find/buildFindManyArgs.js'\nimport { buildQuery } from './queries/buildQuery.js'\nimport { selectDistinct } from './queries/selectDistinct.js'\nimport { transform } from './transform/read/index.js'\nimport { transformForWrite } from './transform/write/index.js'\nimport { upsertRow } from './upsertRow/index.js'\nimport { getTransaction } from './utilities/getTransaction.js'\n\n/**\n * Checks whether we should use the upsertRow function for the passed data and otherwise use a simple SQL SET call.\n * We need to use upsertRow only when the data has arrays, blocks, hasMany select/text/number, localized fields, complex relationships.\n */\nconst shouldUseUpsertRow = ({\n data,\n fields,\n}: {\n data: Record<string, unknown>\n fields: FlattenedField[]\n}) => {\n for (const key in data) {\n const value = data[key]\n const field = fields.find((each) => each.name === key)\n\n if (!field) {\n continue\n }\n\n if (\n field.type === 'array' ||\n field.type === 'blocks' ||\n ((field.type === 'text' ||\n field.type === 'relationship' ||\n field.type === 'upload' ||\n field.type === 'select' ||\n field.type === 'number') &&\n field.hasMany) ||\n ((field.type === 'relationship' || field.type === 'upload') &&\n Array.isArray(field.relationTo)) ||\n field.localized\n ) {\n return true\n }\n\n if (\n (field.type === 'group' || field.type === 'tab') &&\n value &&\n typeof value === 'object' &&\n shouldUseUpsertRow({ data: value as Record<string, unknown>, fields: field.flattenedFields })\n ) {\n return true\n }\n }\n\n return false\n}\n\nexport const updateOne: UpdateOne = async function updateOne(\n this: DrizzleAdapter,\n {\n id,\n collection: collectionSlug,\n data,\n joins: joinQuery,\n locale,\n options = { upsert: false },\n req,\n returning,\n select,\n where: whereArg,\n },\n) {\n const db = await getTransaction(this, req)\n const collection = this.payload.collections[collectionSlug].config\n const tableName = this.tableNameMap.get(toSnakeCase(collection.slug))\n let idToUpdate = id\n\n if (!idToUpdate) {\n const { joins, selectFields, where } = buildQuery({\n adapter: this,\n fields: collection.flattenedFields,\n locale,\n tableName,\n where: whereArg,\n })\n\n // selectDistinct will only return if there are joins\n const selectDistinctResult = await selectDistinct({\n adapter: this,\n db,\n joins,\n query: ({ query }) => query.limit(1),\n selectFields,\n tableName,\n where,\n })\n\n if (selectDistinctResult?.[0]?.id) {\n idToUpdate = selectDistinctResult?.[0]?.id\n // If id wasn't passed but `where` without any joins, retrieve it with findFirst\n } else if (whereArg && !joins.length) {\n const table = this.tables[tableName]\n\n const docsToUpdate = await (db as LibSQLDatabase)\n .select({\n id: table.id,\n })\n .from(table)\n .where(where)\n .limit(1)\n idToUpdate = docsToUpdate?.[0]?.id\n }\n }\n\n if (!idToUpdate && !options.upsert) {\n // TODO: In 4.0, if returning === false, we should differentiate between:\n // - No document found to update\n // - Document found, but returning === false\n return null\n }\n\n if (!idToUpdate || shouldUseUpsertRow({ data, fields: collection.flattenedFields })) {\n const result = await upsertRow({\n id: idToUpdate,\n adapter: this,\n data,\n db,\n fields: collection.flattenedFields,\n ignoreResult: returning === false,\n joinQuery,\n operation: 'update',\n req,\n select,\n tableName,\n })\n\n if (returning === false) {\n return null\n }\n\n return result\n }\n\n const { row } = transformForWrite({\n adapter: this,\n data,\n fields: collection.flattenedFields,\n tableName,\n })\n\n const drizzle = db as LibSQLDatabase\n await drizzle\n .update(this.tables[tableName])\n .set(row)\n // TODO: we can skip fetching idToUpdate here with using the incoming where\n .where(eq(this.tables[tableName].id, idToUpdate))\n\n if (returning === false) {\n return null\n }\n\n const findManyArgs = buildFindManyArgs({\n adapter: this,\n depth: 0,\n fields: collection.flattenedFields,\n joinQuery: false,\n select,\n tableName,\n })\n\n findManyArgs.where = eq(this.tables[tableName].id, idToUpdate)\n\n const doc = await db.query[tableName].findFirst(findManyArgs)\n\n // //////////////////////////////////\n // TRANSFORM DATA\n // //////////////////////////////////\n\n const result = transform({\n adapter: this,\n config: this.payload.config,\n data: doc,\n fields: collection.flattenedFields,\n joinQuery: false,\n tableName,\n })\n\n return result\n}\n"],"names":["eq","toSnakeCase","buildFindManyArgs","buildQuery","selectDistinct","transform","transformForWrite","upsertRow","getTransaction","shouldUseUpsertRow","data","fields","key","value","field","find","each","name","type","hasMany","Array","isArray","relationTo","localized","flattenedFields","updateOne","id","collection","collectionSlug","joins","joinQuery","locale","options","upsert","req","returning","select","where","whereArg","db","payload","collections","config","tableName","tableNameMap","get","slug","idToUpdate","selectFields","adapter","selectDistinctResult","query","limit","length","table","tables","docsToUpdate","from","result","ignoreResult","operation","row","drizzle","update","set","findManyArgs","depth","doc","findFirst"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@payloadcms/drizzle",
|
|
3
|
-
"version": "3.47.0-canary.
|
|
3
|
+
"version": "3.47.0-canary.5",
|
|
4
4
|
"description": "A library of shared functions used by different payload database adapters",
|
|
5
5
|
"homepage": "https://payloadcms.com",
|
|
6
6
|
"repository": {
|
|
@@ -54,11 +54,11 @@
|
|
|
54
54
|
"@libsql/client": "0.14.0",
|
|
55
55
|
"@types/pg": "8.10.2",
|
|
56
56
|
"@types/to-snake-case": "1.0.0",
|
|
57
|
-
"
|
|
58
|
-
"
|
|
57
|
+
"payload": "3.47.0-canary.5",
|
|
58
|
+
"@payloadcms/eslint-config": "3.28.0"
|
|
59
59
|
},
|
|
60
60
|
"peerDependencies": {
|
|
61
|
-
"payload": "3.47.0-canary.
|
|
61
|
+
"payload": "3.47.0-canary.5"
|
|
62
62
|
},
|
|
63
63
|
"scripts": {
|
|
64
64
|
"build": "pnpm build:swc && pnpm build:types",
|