@@ -13,6 +13,7 @@ import type {
1313 BeforeOperationHook ,
1414 BeforeValidateHook ,
1515 Collection ,
16+ DataFromCollectionSlug ,
1617 RequiredDataFromCollectionSlug ,
1718 SelectFromCollectionSlug ,
1819} from '../config/types.js'
@@ -21,6 +22,7 @@ import { ensureUsernameOrEmail } from '../../auth/ensureUsernameOrEmail.js'
2122import executeAccess from '../../auth/executeAccess.js'
2223import { sendVerificationEmail } from '../../auth/sendVerificationEmail.js'
2324import { registerLocalStrategy } from '../../auth/strategies/local/register.js'
25+ import { getDuplicateDocumentData } from '../../duplicateDocument/index.js'
2426import { afterChange } from '../../fields/hooks/afterChange/index.js'
2527import { afterRead } from '../../fields/hooks/afterRead/index.js'
2628import { beforeChange } from '../../fields/hooks/beforeChange/index.js'
@@ -43,6 +45,7 @@ export type Arguments<TSlug extends CollectionSlug> = {
4345 disableTransaction ?: boolean
4446 disableVerificationEmail ?: boolean
4547 draft ?: boolean
48+ duplicateFromID ?: DataFromCollectionSlug < TSlug > [ 'id' ]
4649 overrideAccess ?: boolean
4750 overwriteExistingFiles ?: boolean
4851 populate ?: PopulateType
@@ -97,6 +100,7 @@ export const createOperation = async <
97100 depth,
98101 disableVerificationEmail,
99102 draft = false ,
103+ duplicateFromID,
100104 overrideAccess,
101105 overwriteExistingFiles = false ,
102106 populate,
@@ -115,6 +119,23 @@ export const createOperation = async <
115119
116120 const shouldSaveDraft = Boolean ( draft && collectionConfig . versions . drafts )
117121
122+ let duplicatedFromDocWithLocales : JsonObject = { }
123+ let duplicatedFromDoc : JsonObject = { }
124+
125+ if ( duplicateFromID ) {
126+ const duplicateResult = await getDuplicateDocumentData ( {
127+ id : duplicateFromID ,
128+ collectionConfig,
129+ draftArg : shouldSaveDraft ,
130+ overrideAccess,
131+ req,
132+ shouldSaveDraft,
133+ } )
134+
135+ duplicatedFromDoc = duplicateResult . duplicatedFromDoc
136+ duplicatedFromDocWithLocales = duplicateResult . duplicatedFromDocWithLocales
137+ }
138+
118139 // /////////////////////////////////////
119140 // Access
120141 // /////////////////////////////////////
@@ -131,7 +152,9 @@ export const createOperation = async <
131152 collection,
132153 config,
133154 data,
155+ isDuplicating : Boolean ( duplicateFromID ) ,
134156 operation : 'create' ,
157+ originalDoc : duplicatedFromDoc ,
135158 overwriteExistingFiles,
136159 req,
137160 throwOnMissingFile :
@@ -148,7 +171,7 @@ export const createOperation = async <
148171 collection : collectionConfig ,
149172 context : req . context ,
150173 data,
151- doc : { } ,
174+ doc : duplicatedFromDoc ,
152175 global : null ,
153176 operation : 'create' ,
154177 overrideAccess,
@@ -169,6 +192,7 @@ export const createOperation = async <
169192 context : req . context ,
170193 data,
171194 operation : 'create' ,
195+ originalDoc : duplicatedFromDoc ,
172196 req,
173197 } ) ) || data
174198 } ,
@@ -188,6 +212,7 @@ export const createOperation = async <
188212 context : req . context ,
189213 data,
190214 operation : 'create' ,
215+ originalDoc : duplicatedFromDoc ,
191216 req,
192217 } ) ) || data
193218 } , Promise . resolve ( ) )
@@ -200,8 +225,8 @@ export const createOperation = async <
200225 collection : collectionConfig ,
201226 context : req . context ,
202227 data,
203- doc : { } ,
204- docWithLocales : { } ,
228+ doc : duplicatedFromDoc ,
229+ docWithLocales : duplicatedFromDocWithLocales ,
205230 global : null ,
206231 operation : 'create' ,
207232 req,
0 commit comments