import { QueryHookPlugin, QueryResultContext } from '../index'; /** * Transformer function type */ export type TransformerFn = (data: T, context: QueryResultContext) => R | Promise; /** * Options for QueryResultTransformerPlugin */ export interface QueryResultTransformerOptions { /** * Transformers by entity/table name * Maps table name to transformer function * * @example * ```typescript * { * User: (user) => ({ * ...user, * fullName: `${user.firstName} ${user.lastName}`, * password: undefined // Remove sensitive data * }) * } * ``` */ transformers?: Record; /** * Global transformer applied to all results (optional) * Runs before entity-specific transformers */ globalTransformer?: TransformerFn; /** * Callback when a result is transformed (optional) * Triggered after transformation is complete * * @param context - Query result context * @param originalResult - Result before transformation * @param transformedResult - Result after transformation * * @example * ```typescript * onTransformed: (context, originalResult, transformedResult) => { * logger.info('Result transformed', { * tables: extractTablesFromBuilder(context.builder), * originalType: typeof originalResult, * transformedType: typeof transformedResult * }); * } * ``` */ onTransformed?: (context: QueryResultContext, originalResult: any, transformedResult: any) => void; /** * Callback when transformation fails (optional) * * @param context - Query result context * @param error - The error that occurred * * @example * ```typescript * onError: (context, error) => { * logger.error('Result transformation failed', { * error, * tables: extractTablesFromBuilder(context.builder) * }); * } * ``` */ onError?: (context: QueryResultContext, error: Error) => void; /** * Enable console logging for this plugin (default: false) */ enableLogging?: boolean; } /** * Plugin for transforming query results * Automatically converts DB results to DTOs/view models * * 🔄 Solves: Manual transformation of database results to DTOs * * **Common Use Cases:** * 1. Remove sensitive fields (passwords, tokens) * 2. Combine fields (firstName + lastName = fullName) * 3. Format dates, numbers * 4. Add computed properties * 5. Flatten nested objects * * @example * ```typescript * import { QueryResultTransformerPlugin } from 'typeorm-query-hooks/plugins/query-result-transformer'; * * registerPlugin(QueryResultTransformerPlugin({ * transformers: { * User: (user) => ({ * id: user.id, * fullName: `${user.firstName} ${user.lastName}`, * email: user.email, * // Remove sensitive data * password: undefined, * resetToken: undefined * }), * Product: (product) => ({ * ...product, * price: `$${product.price.toFixed(2)}`, * inStock: product.quantity > 0 * }) * }, * globalTransformer: (result) => { * // Add metadata to all results * if (Array.isArray(result)) { * return { * data: result, * count: result.length, * timestamp: new Date() * }; * } * return result; * }, * enableLogging: true * })); * ``` */ export declare function QueryResultTransformerPlugin(options: QueryResultTransformerOptions): QueryHookPlugin; //# sourceMappingURL=query-result-transformer.d.ts.map