import { ConfigArg, Permission } from '@vendure/common/lib/generated-types'; import { ID } from '@vendure/common/lib/shared-types'; import { RequestContext } from '../../api/common/request-context'; import { ConfigArgs, ConfigArgValues, ConfigurableOperationDef, ConfigurableOperationDefOptions } from '../../common/configurable-operation'; import { VendureEntity } from '../../entity/base/base.entity'; /** * @description * A function which performs the duplication of an entity. * * @docsPage EntityDuplicator * @docsCategory configuration * @since 2.2.0 */ export type DuplicateEntityFn = (input: { ctx: RequestContext; entityName: string; id: ID; args: ConfigArgValues; }) => Promise; /** * @description * Configuration for creating a new EntityDuplicator. * * @docsPage EntityDuplicator * @docsCategory configuration * @since 2.2.0 */ export interface EntityDuplicatorConfig extends ConfigurableOperationDefOptions { /** * @description * The permissions required in order to execute this duplicator. If an array is passed, * then the administrator must have at least one of the permissions in the array. */ requiresPermission: Array | Permission | string; /** * @description * The entities for which this duplicator is able to duplicate. */ forEntities: string[]; /** * @description * The function which performs the duplication. * * @example * ```ts * duplicate: async input => { * const { ctx, id, args } = input; * * // perform the duplication logic here * * return newEntity; * } * ``` */ duplicate: DuplicateEntityFn; } /** * @description * An EntityDuplicator is used to define the logic for duplicating entities when the `duplicateEntity` mutation is called. * This allows you to add support for duplication of both core and custom entities. * * @example * ```ts title=src/config/custom-collection-duplicator.ts * import { Collection, LanguageCode, Permission * EntityDuplicator, TransactionalConnection, CollectionService } from '\@vendure/core'; * * let collectionService: CollectionService; * let connection: TransactionalConnection; * * // This is just an example - we already ship with a built-in duplicator for Collections. * const customCollectionDuplicator = new EntityDuplicator({ * code: 'custom-collection-duplicator', * description: [{ languageCode: LanguageCode.en, value: 'Custom collection duplicator' }], * args: { * throwError: { * type: 'boolean', * defaultValue: false, * }, * }, * forEntities: ['Collection'], * requiresPermission: [Permission.UpdateCollection], * init(injector) { * collectionService = injector.get(CollectionService); * connection = injector.get(TransactionalConnection); * }, * duplicate: async input => { * const { ctx, id, args } = input; * * const original = await connection.getEntityOrThrow(ctx, Collection, id, { * relations: { * assets: true, * featuredAsset: true, * }, * }); * const newCollection = await collectionService.create(ctx, { * isPrivate: original.isPrivate, * customFields: original.customFields, * assetIds: original.assets.map(a => a.id), * featuredAssetId: original.featuredAsset?.id, * parentId: original.parentId, * filters: original.filters.map(f => ({ * code: f.code, * arguments: f.args, * })), * inheritFilters: original.inheritFilters, * translations: original.translations.map(t => ({ * languageCode: t.languageCode, * name: `${t.name} (copy)`, * slug: `${t.slug}-copy`, * description: t.description, * customFields: t.customFields, * })), * }); * * if (args.throwError) { * // If an error is thrown at any point during the duplication process, the entire * // transaction will get automatically rolled back, and the mutation will return * // an ErrorResponse containing the error message. * throw new Error('Dummy error'); * } * * return newCollection; * }, * }); * ``` * * The duplicator then gets passed to your VendureConfig object: * * ```ts title=src/vendure-config.ts * import { VendureConfig, defaultEntityDuplicators } from '\@vendure/core'; * import { customCollectionDuplicator } from './config/custom-collection-duplicator'; * * export const config: VendureConfig = { * // ... * entityOptions: { * entityDuplicators: [ * ...defaultEntityDuplicators, * customCollectionDuplicator, * ], * }, * }; * ``` * * @docsPage EntityDuplicator * @docsWeight 0 * @docsCategory configuration * @since 2.2.0 */ export declare class EntityDuplicator extends ConfigurableOperationDef { private _forEntities; private _requiresPermission; private duplicateFn; /** @internal */ canDuplicate(entityName: string): boolean; /** @internal */ get forEntities(): string[]; /** @internal */ get requiresPermission(): Permission[]; constructor(config: EntityDuplicatorConfig); duplicate(input: { ctx: RequestContext; entityName: string; id: ID; args: ConfigArg[]; }): Promise; }