{"version":3,"file":"Machine.cjs","sources":["../src/Machine.ts"],"sourcesContent":["import reduceGuards, { GuardDefs, GuardDefUnion } from '@bemedev/x-guard';\n\nimport type {\n  ExtractFunction,\n  ExtractFunctionProps,\n  MarchineArgs,\n  NextFunction,\n  NextFunctionAsync,\n  PropsExtractorPromise,\n  PropsExtractorTransition,\n} from './Machine.types';\n\nimport {\n  isAsync,\n  isFinalState,\n  isFinalStateDefinition,\n  isPromiseState,\n  isPromiseStateDefinition,\n  isReadonlyArray,\n  isSimpleStateDefinition,\n} from './helpers';\n\nimport type {\n  Config,\n  ConfigDef,\n  ConfigTypes,\n  Guards,\n  GuardUnion,\n  NoExtraKeysConfigDef,\n  Options,\n  PromiseStateDefinition,\n  SAS,\n  SRCDefinition,\n  StateDefinition,\n  StateFunction,\n  TransformConfigDef,\n  TransitionDefinition,\n  Undy,\n} from './types';\n\n/**\n * @class Class representing a machine function\n *\n * Implements syntax of {@link XState https://xstate.js.org/docs/guides/states.html#state-nodes}\n */\nclass Machine<\n  const C extends Config = Config,\n  const T extends ConfigTypes<C> = ConfigTypes<C>,\n> {\n  // #region Props\n  #states: StateDefinition<T['events'], T['context'], T['data']>[] = [];\n  #initial: string;\n  #config: C;\n  readonly __types: T;\n  #options: Options<C, T> = {};\n  #errors: string[] = [];\n  #unFreezeArgs!: boolean;\n\n  #defaultData!: StateFunction<T['context'], T['events'], T['data']>;\n\n  // #endregion\n\n  // #region Getters\n  /**\n   * @deprecated\n   * Use internally to get the config\n   *\n   */\n  /* v8 ignore next 3 */\n  get __config() {\n    return this.#config;\n  }\n\n  /**\n   * @deprecated\n   * Use internally to get the config\n   * v8 ignore next 3\n   */\n  /* v8 ignore next 3 */\n  get __options() {\n    return this.#options;\n  }\n\n  get errors() {\n    return this.#errors;\n  }\n\n  get hasErrors() {\n    return this.errors.length > 0;\n  }\n\n  get safe() {\n    if (this.hasErrors) {\n      console.error('errors =>', this.#errors);\n      throw new Error(this.#errors[0]);\n    }\n    return this;\n  }\n\n  get async() {\n    return isAsync(this.#config);\n  }\n  // #endregion\n\n  // #region Building states\n  #assignGuardsUnion = (\n    values: readonly GuardUnion[],\n    guards: Required<Options<C, T>>['guards'],\n  ): GuardDefUnion<Undy<T['events']>, T['context']>[] => {\n    return values.reduce(\n      (acc: GuardDefUnion<Undy<T['events']>, T['context']>[], value) => {\n        if (typeof value === 'string') {\n          const guard = (guards as any)[value];\n          acc.push(guard);\n        } else {\n          const _guards = this.#assignGuards(value, guards);\n          if (_guards) acc.push(_guards as any);\n        }\n        return acc;\n      },\n      [],\n    );\n  };\n\n  #assignGuards = (\n    values?: Guards,\n    guards?: Options<C, T>['guards'],\n  ): GuardDefs<Undy<T['events']>, T['context']> | undefined => {\n    if (!values) return;\n    if (!guards) {\n      this.#errors.push('No guards provided');\n      return;\n    }\n\n    if (typeof values === 'string') {\n      const guard = (guards as any)[values];\n      if (!guard) {\n        this.#errors.push(`Guard \"${values}\" is not provided`);\n        return;\n      }\n      return guard;\n    }\n\n    if ('and' in values) {\n      const _and = values.and;\n      const and = this.#assignGuardsUnion(_and, guards);\n      return { and };\n    }\n\n    if ('or' in values) {\n      const _or = values.or;\n      const or = this.#assignGuardsUnion(_or, guards);\n      return { or };\n    }\n    return this.#assignGuardsUnion(values as any, guards);\n  };\n\n  #extractActions = (\n    strings?: SAS,\n    actions?: Options<C, T>['actions'],\n  ): StateFunction<T['context'], T['events'], void>[] => {\n    const functions: StateFunction<T['context'], T['events'], void>[] = [];\n    if (!strings) return functions;\n\n    if (isReadonlyArray(strings)) {\n      const _actions = strings\n        .map(str => this.#extractActions(str, actions))\n        .flat();\n      functions.push(..._actions);\n    } else {\n      const action = (actions as any)?.[strings];\n\n      if (!action) {\n        this.#errors.push(`Action ${strings} is not provided`);\n      } else {\n        functions.push(action);\n      }\n    }\n    return functions;\n  };\n\n  #extractFunction = ({\n    options,\n    source,\n    __keys,\n  }: ExtractFunctionProps<C, T>): ExtractFunction<\n    T['context'],\n    T['events']\n  > => {\n    return transition => {\n      if (!transition) {\n        return {\n          source,\n          actions: [],\n          // target: source,\n        };\n      }\n      if (typeof transition === 'string') {\n        const target = transition;\n        const check = __keys.includes(target);\n        if (!check) {\n          this.#errors.push(`State \"${target}\" is not defined`);\n        }\n\n        if (source === transition) {\n          this.#errors.push(`Cannot transit to himself : ${target}`);\n        }\n        return {\n          source,\n          actions: [],\n          target,\n        };\n      }\n\n      const target = transition.target;\n      const check = target && __keys.includes(target);\n      if (!check) {\n        this.#errors.push(`State \"${target}\" is not defined`);\n      }\n\n      if (source === target) {\n        this.#errors.push(`Cannot transit to himself : ${target}`);\n      }\n\n      const description = transition.description;\n      const actions = this.#extractActions(\n        transition.actions,\n        options?.actions,\n      );\n      const conds = this.#assignGuards(transition.cond, options?.guards);\n      const cond = reduceGuards(conds);\n\n      return {\n        source,\n        actions,\n        cond,\n        target,\n        description,\n      };\n    };\n  };\n\n  #extractTransitions = ({\n    source,\n    always,\n    options,\n    __keys,\n  }: PropsExtractorTransition<C, T>): TransitionDefinition<\n    T['context'],\n    T['events']\n  >[] => {\n    const functions: TransitionDefinition<T['context'], T['events']>[] =\n      [];\n    const extractor = this.#extractFunction({\n      source,\n      __keys,\n      options,\n    });\n\n    if (isReadonlyArray(always)) {\n      functions.push(...always.map(extractor));\n    } else {\n      functions.push(extractor(always));\n    }\n    return functions;\n  };\n\n  #extractPromise = (\n    value: string,\n    promises?: Options<C, T>['promises'],\n  ):\n    | StateFunction<T['context'], T['events'], Promise<any>>\n    | undefined => {\n    const action = (promises as any)?.[value];\n    if (!action) {\n      this.#errors.push(`Promise ${value} is not provided`);\n    }\n\n    return action;\n  };\n\n  #extractPromises<R = any>({\n    source,\n    __keys,\n    promises,\n    options,\n  }: PropsExtractorPromise<C, T>): SRCDefinition<\n    T['events'],\n    T['context'],\n    R\n  >[] {\n    const _promises: SRCDefinition<T['events'], T['context'], R>[] = [];\n    if (isReadonlyArray(promises)) {\n      const _actions = promises\n        .map(promises => {\n          const args = {\n            source,\n            __keys,\n            promises,\n            options,\n          } as any;\n          return this.#extractPromises(args);\n        })\n        .flat();\n\n      _promises.push(..._actions);\n    } else {\n      const _finally = this.#extractActions(\n        promises.finally,\n        options?.actions,\n      );\n      const value = promises.src;\n\n      const src = this.#extractPromise(promises.src, options?.promises);\n\n      const argsThen = {\n        __keys,\n        always: promises.then,\n        source,\n        options,\n      } as any;\n\n      const then = this.#extractTransitions(argsThen);\n\n      const argsCatch = {\n        __keys,\n        always: promises.catch,\n        source,\n        options,\n      } as any;\n\n      const _catch = this.#extractTransitions(argsCatch);\n\n      if (!src) {\n        this.#errors.push(`Promise \"${promises.src}\" is not defined`);\n      }\n\n      _promises.push({\n        catch: _catch,\n        finally: _finally,\n        src,\n        then,\n        value,\n      });\n    }\n    return _promises;\n  }\n\n  readonly #buildStates = (config: C, options?: Options<C, T>) => {\n    // #region Props\n    const initial = config.initial;\n    const states: StateDefinition<T['events'], T['context']>[] = [];\n    const __states = Object.entries(config.states);\n    const __keys = Object.keys(config.states);\n    // #endregion\n\n    if (__states.length < 1) {\n      this.#errors.push('No states');\n    }\n\n    if (!__keys.includes(initial)) {\n      this.#errors.push(`No initial state : ${initial}`);\n    }\n\n    this.#defaultData = (options as any)?.datas?.[config.data];\n    if (!this.#defaultData) {\n      this.#errors.push(`At least one data function must be provided`);\n    }\n\n    for (const [value, state] of __states) {\n      const entry = this.#extractActions(state.entry, options?.actions);\n      if (isFinalState(state)) {\n        const data = (options as any)?.datas?.[state.data];\n\n        if (!data) {\n          this.#errors.push(`Data \"${state.data}\" is not provided`);\n        } else {\n          states.push({\n            value,\n            entry,\n            data,\n          });\n        }\n      } else if (isPromiseState(state)) {\n        const source = value;\n\n        const promises = this.#extractPromises({\n          source,\n          promises: state.invoke,\n          options,\n          __keys,\n        } as any);\n\n        states.push({\n          entry,\n          invoke: promises,\n          value,\n        });\n      } else {\n        const source = value;\n        const always = this.#extractTransitions({\n          source,\n          always: state.always,\n          options,\n          __keys,\n        });\n\n        const exit = this.#extractActions(state.exit, options?.actions);\n\n        states.push({\n          value,\n          entry,\n          exit,\n          transitions: always,\n        });\n      }\n    }\n    return states;\n  };\n  // #endregion\n\n  constructor(config: C, types: T) {\n    // #region Initialize props\n    this.#config = config;\n    this.__types = types;\n    this.#initial = config.initial;\n    this.#addOptions(this.#options);\n    // #endregion\n  }\n\n  /**\n   * Use internally to get the props\n   */\n  get props(): Omit<MarchineArgs<C, T>, 'context'> {\n    return {\n      _states: this.#states,\n      initial: this.#initial,\n      config: this.#config,\n      options: this.#options,\n    } as any;\n  }\n\n  get clone() {\n    const out = new Machine(this.#config, this.__types) as unknown as this;\n    if (this.#options) out.#addOptions(this.#options);\n    return out;\n  }\n\n  #searchState = (state: string) => {\n    const _state = this.#states.find(s => s.value === state);\n    return _state!;\n  };\n\n  /**\n   * Returns the next state\n   *\n   * Warning: This function is not pure, only use a inline context\n   */\n  readonly next: NextFunction<T['events'], T['context'], T['data']> = ({\n    events,\n    state,\n    context,\n  }) => {\n    const current = this.#searchState(state);\n\n    let data: T['data'] | undefined = undefined;\n    const _events = this.#unFreezeArgs\n      ? events\n      : (Object.freeze(events) as any);\n    let hasNext = false;\n    let target: string | undefined = undefined;\n\n    if (isFinalStateDefinition(current)) {\n      current.entry.forEach(entry => entry(context, _events));\n      data = current.data(context, _events);\n    } else if (isSimpleStateDefinition(current)) {\n      current.entry.forEach(entry => entry(context, _events));\n\n      target = this.#runTransitions(current.transitions, context, _events);\n      current.exit.forEach(entry => entry(context, _events));\n      hasNext = target !== undefined;\n      data = this.#defaultData(context, _events);\n    }\n\n    return { state: target, context, data, hasNext };\n  };\n\n  /**\n   * Returns the next state\n   *\n   * Warning: This function is not pure, only use a inline context\n   */\n  readonly nextAsync: NextFunctionAsync<\n    T['events'],\n    T['context'],\n    T['data']\n  > = async ({ events, state, context }) => {\n    const current = this.#searchState(state);\n    let data: T['data'] | undefined = undefined;\n    const _events = this.#unFreezeArgs ? events : Object.freeze(events);\n    let target: string | undefined = undefined;\n\n    let hasNext = true;\n    if (isPromiseStateDefinition(current)) {\n      target = await this.#resolveStatePromise(current, context, _events);\n    } else {\n      const {\n        data: _data,\n        hasNext: _hasNext,\n        state: _state,\n      } = this.next({\n        context,\n        events,\n        state,\n      });\n\n      data = _data;\n      hasNext = _hasNext;\n      target = _state;\n    }\n    return { state: target, context, data, hasNext };\n  };\n\n  #runTransitions(\n    transitions: TransitionDefinition<T['context'], T['events']>[],\n    context: T['context'],\n    _events: any,\n  ) {\n    let target: string | undefined = undefined;\n    for (const transition of transitions) {\n      const _cond = transition.cond;\n      if (_cond) {\n        const check = _cond(context, _events);\n        if (!check) continue;\n      }\n      transition.actions.forEach(action => action(context, _events));\n\n      target = transition.target;\n      break;\n    }\n    return target;\n  }\n\n  #resolveStatePromise = async (\n    current: PromiseStateDefinition<T['events'], T['context'], any>,\n    context: T['context'],\n    events: any,\n  ): Promise<string | undefined> => {\n    current.entry.forEach(entry => entry(context, events));\n    let target: string | undefined = undefined;\n\n    await Promise.all(\n      current.invoke.map(async promise => {\n        const { src, catch: _catch, then, finally: _finally } = promise;\n        if (src) {\n          await src(context, events)\n            .then(awaited => {\n              target = this.#runTransitions(then, context, awaited);\n            })\n            .catch(reason => {\n              target = this.#runTransitions(_catch, context, reason);\n            })\n            .finally(() => {\n              _finally.forEach(entry => entry(context, events));\n            });\n        }\n      }),\n    );\n    return target;\n  };\n\n  #addOptions = (options: Options<C, T>) => {\n    this.#options = options;\n    this.#unFreezeArgs = options.unFreezeArgs ?? false;\n    this.#states = this.#buildStates(this.#config, options);\n  };\n\n  provideOptions = (options: Options<C, T>) => {\n    const out = this.clone;\n    out.#errors = [];\n    out.#addOptions(options);\n    return out;\n  };\n}\n\nexport { type Machine };\n\nexport type AnyMachine = {\n  __config: any;\n  __types: {\n    context: any;\n    events: any;\n    data: any;\n    promises?: any;\n  };\n  async: boolean;\n};\n\nexport type CreateLogic_F = <\n  const C2 extends\n    NoExtraKeysConfigDef<ConfigDef> = NoExtraKeysConfigDef<ConfigDef>,\n  const C extends Config & TransformConfigDef<C2> = Config &\n    TransformConfigDef<C2>,\n  const T extends ConfigTypes<C> & { context: object } = ConfigTypes<C> & {\n    context: object;\n  },\n>(\n  config: C & { __tsSchema?: NoExtraKeysConfigDef<C2> },\n  types: T,\n) => Machine<C, T>;\n\nexport const createLogic: CreateLogic_F = (config, types) => {\n  const _machine = new Machine(config, types) as any;\n  return _machine;\n};\n"],"names":["isAsync","isReadonlyArray","isFinalState","isPromiseState","isFinalStateDefinition","isSimpleStateDefinition","isPromiseStateDefinition"],"mappings":"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"}