import isPlainObject from "./helpers/isPlainObject.ts";
export interface FluxStandardAction< Type extends string = string, Payload = undefined, Meta = undefined,> { type: Type; payload?: Payload; error?: boolean; meta?: Meta;}
export interface ErrorFluxStandardAction< Type extends string = string, CustomError extends Error = Error, Meta = undefined,> extends FluxStandardAction<Type, CustomError, Meta> { error: true;}
export type FSA< Type extends string = string, Payload = undefined, Meta = undefined,> = FluxStandardAction<Type, Payload, Meta>;
export type ErrorFSA< CustomError extends Error = Error, Meta = undefined, Type extends string = string,> = ErrorFluxStandardAction<Type, CustomError, Meta>;
export interface FluxStandardActionWithPayload< Type extends string = string, Payload = undefined, Meta = undefined,> extends FluxStandardAction<Type, Payload, Meta> { payload: Payload;}export type FSAWithPayload< Type extends string = string, Payload = undefined, Meta = undefined,> = FluxStandardActionWithPayload<Type, Payload, Meta>;
export interface FluxStandardActionWithMeta< Type extends string = string, Payload = undefined, Meta = undefined,> extends FluxStandardAction<Type, Payload, Meta> { meta: Meta;}export type FSAWithMeta< Type extends string = string, Payload = undefined, Meta = undefined,> = FluxStandardActionWithMeta<Type, Payload, Meta>;
export type FluxStandardActionWithPayloadAndMeta< Type extends string = string, Payload = undefined, Meta = undefined,> = & FluxStandardActionWithPayload<Type, Payload, Meta> & FluxStandardActionWithMeta<Type, Payload, Meta>;export type FSAWithPayloadAndMeta< Type extends string = string, Payload = undefined, Meta = undefined,> = FluxStandardActionWithPayloadAndMeta<Type, Payload, Meta>;
export type FluxStandardActionAuto< Type extends string = string, Payload = undefined, Meta = undefined,> = Payload extends undefined ? (Meta extends undefined ? FluxStandardAction<Type, Payload, Meta> : FluxStandardActionWithMeta<Type, Payload, Meta>) : (Meta extends undefined ? FluxStandardActionWithPayload<Type, Payload, Meta> : FluxStandardActionWithPayloadAndMeta<Type, Payload, Meta>);export type FSAAuto< Type extends string = string, Payload = undefined, Meta = undefined,> = FluxStandardActionAuto<Type, Payload, Meta>;
export type ErrorFluxStandardActionWithPayload< Type extends string = string, CustomError extends Error = Error, Meta = undefined,> = & ErrorFluxStandardAction<Type, CustomError, Meta> & FluxStandardActionWithPayload<Type, CustomError, Meta>;export type ErrorFSAWithPayload< Type extends string = string, CustomError extends Error = Error, Meta = undefined,> = ErrorFluxStandardActionWithPayload<Type, CustomError, Meta>;
export type ErrorFluxStandardActionWithMeta< Type extends string = string, CustomError extends Error = Error, Meta = undefined,> = & ErrorFluxStandardAction<Type, CustomError, Meta> & FluxStandardActionWithMeta<Type, CustomError, Meta>;export type ErrorFSAWithMeta< Type extends string = string, CustomError extends Error = Error, Meta = undefined,> = ErrorFluxStandardActionWithMeta<Type, CustomError, Meta>;
export type ErrorFluxStandardActionWithPayloadAndMeta< Type extends string = string, CustomError extends Error = Error, Meta = undefined,> = & ErrorFluxStandardActionWithPayload<Type, CustomError, Meta> & ErrorFluxStandardActionWithMeta<Type, CustomError, Meta>;export type ErrorFSAWithPayloadAndMeta< Type extends string = string, CustomError extends Error = Error, Meta = undefined,> = ErrorFluxStandardActionWithPayloadAndMeta<Type, CustomError, Meta>;
export type ErrorFluxStandardActionAuto< Type extends string = string, CustomError extends Error = Error, Meta = undefined,> = Meta extends undefined ? ErrorFluxStandardActionWithPayload<Type, CustomError, Meta> : ErrorFluxStandardActionWithPayloadAndMeta<Type, CustomError, Meta>;export type ErrorFSAAuto< Type extends string = string, CustomError extends Error = Error, Meta = undefined,> = ErrorFluxStandardActionAuto<Type, CustomError, Meta>;
const allowedKeys = ["type", "payload", "error", "meta"];
function isValidKey(key: string): boolean { return allowedKeys.includes(key);}
function hasTypeProperty<T extends Object = Object>( params: T,): params is T & { type: unknown } { return Object.prototype.hasOwnProperty.call(params, "type");}
export function isFSA< Type extends string = string, Payload = undefined, Meta = undefined,>(action: unknown): action is FluxStandardAction<Type, Payload, Meta> { return ( isPlainObject(action) && hasTypeProperty(action) && typeof action.type === "string" && Object.keys(action).every(isValidKey) );}
export function isError< Type extends string = string, CustomError extends Error = Error, Meta = undefined,>(action: unknown): action is ErrorFluxStandardAction<Type, CustomError, Meta> { return isFSA(action) && action.error === true;}