import '../../globals.js';
/**
 * General TypeScript types that apply to PhET-iO features and architecture.
 *
 * @author Michael Kauzmann (PhET Interactive Simulations)
 * @author Sam Reid (PhET Interactive Simulations)
 */
import IntentionalAny from '../../phet-core/js/types/IntentionalAny.js';
export type PhetioID = string;
export type IOTypeName = string;
export type PhetioElementData = {
    initialState: PhetioElementState;
};
export type PhetioElement = {
    _metadata: PhetioElementMetadata;
    _data?: PhetioElementData;
};
export type PhetioElements = {
    [name: string]: PhetioElements;
} & PhetioElement;
export type Method = {
    returnType: string;
    parameterTypes: string[];
    documentation: string;
    invocableForReadOnlyElements?: boolean;
};
export type PhetioElementState = Record<string, IntentionalAny>;
export type PhetioState = Record<PhetioID, PhetioElementState>;
export type FullPhetioState = Record<PhetioID, PhetioElementState | 'DELETED'>;
export type Methods = Record<string, Method>;
export type CompositeStateSchemaAPI = Record<string, IOTypeName>;
export type StateSchemaAPI = string | CompositeStateSchemaAPI;
export type PhetioType = {
    methods: Methods;
    supertype?: string;
    typeName: IOTypeName;
    documentation?: string;
    events: string[];
    metadataDefaults?: Partial<PhetioElementMetadata>;
    dataDefaults?: Record<string, unknown>;
    methodOrder?: string[];
    stateSchema?: StateSchemaAPI;
    apiStateKeys?: (keyof CompositeStateSchemaAPI)[];
    parameterTypes?: string[];
};
export type PhetioTypes = Record<IOTypeName, PhetioType>;
export type PhetioOverrides = Record<string, Partial<PhetioElementMetadata>>;
export type PhetioAPIVersion = {
    major: number;
    minor: number;
};
export type AbstractPhetioAPI = {
    version: PhetioAPIVersion;
    phetioFullAPI?: boolean;
    sim: string;
    phetioTypes: PhetioTypes;
};
export type PhetioAPI = AbstractPhetioAPI & {
    phetioElements: PhetioElements;
};
export type FlattenedAPIPhetioElements = Record<PhetioID, PhetioElement>;
export type PhetioElementMetadata = {
    phetioState: boolean;
    phetioReadOnly: boolean;
    phetioEventType: string;
    phetioDocumentation: string;
    phetioHighFrequency: boolean;
    phetioPlayback: boolean;
    phetioFeatured?: boolean;
    phetioDynamicElement: boolean;
    phetioDesigned: boolean;
    phetioTypeName: IOTypeName;
    phetioIsArchetype: boolean;
    phetioArchetypePhetioID?: string | null;
    phetioDynamicElementName?: string | null;
};
export type PhetioElementMetadataValue = PhetioElementMetadata[keyof PhetioElementMetadata];
//# sourceMappingURL=phet-io-types.d.ts.map