import type { DescMessage, MessageShape, MessageValidType } from '@bufbuild/protobuf';
import { type ReflectMessage } from '@bufbuild/protobuf/reflect';
import type { MessageInit, MessagePopulationOptions, PopulatedMessage } from './types';
/**
 * Create a new message instance.
 *
 * This is similar to `create` from `@bufbuild/protobuf`, with the difference that it handles JS dates and converts them to `Timestamp`.
 */
export declare function initMessage<Desc extends DescMessage>(schema: Desc, init?: MessageInit<MessageShape<Desc>>): MessageShape<Desc>;
/**
 * Create a deep copy of the message and populate it and/or convert `Timestamp` fields into JS `Date`.
 *
 * This method may be slow because of the cloning.
 * If you don't worry about modifying the original message, you can use `populateInPlace` instead.
 */
export declare function populate<Desc extends DescMessage, Options extends MessagePopulationOptions>(schema: Desc, message: MessageShape<Desc>, options?: Options): PopulatedMessage<Options['validTypes'] extends false ? MessageShape<Desc> : MessageValidType<Desc>, Options>;
/**
 * Deep populate the message and/or convert `Timestamp` fields into JS `Date`.
 *
 * This method is more performant, but mutates the original message.
 */
export declare function populateInPlace<Desc extends DescMessage, Options extends MessagePopulationOptions>(schema: Desc, message: MessageShape<Desc> | ReflectMessage, options?: Options): PopulatedMessage<Options['validTypes'] extends false ? MessageShape<Desc> : MessageValidType<Desc>, Options>;
