{"version":3,"file":"index.mjs","sources":["../../src/lifecycles/index.ts"],"sourcesContent":["import { strict as assert } from 'assert';\n\nimport * as subscriberUtils from './subscribers';\n\nimport type { Action, Event, Params, Subscriber } from './types';\nimport type { Database } from '..';\n\nexport type * from './types';\n\nexport type State = Record<string, unknown>;\nexport type States = Map<Subscriber, State>;\n\nexport interface Properties {\n  params: Params;\n  result?: unknown;\n}\n\nexport interface LifecycleProvider {\n  subscribe(subscriber: Subscriber): () => void;\n  clear(): void;\n  run(action: Action, uid: string, properties: Properties, states?: States): Promise<States>;\n  createEvent(action: Action, uid: string, properties: Properties, state: State): Event;\n  disable(): void;\n  enable(): void;\n}\n\nexport const createLifecyclesProvider = (db: Database): LifecycleProvider => {\n  let subscribers = [\n    subscriberUtils.timestampsLifecyclesSubscriber,\n    subscriberUtils.modelsLifecyclesSubscriber,\n  ];\n\n  let isLifecycleHooksDisabled = false;\n\n  return {\n    subscribe(subscriber) {\n      assert(\n        subscriberUtils.isValidSubscriber(subscriber),\n        'Invalid subscriber. Expected function or object'\n      );\n\n      subscribers.push(subscriber);\n\n      return () => subscribers.splice(subscribers.indexOf(subscriber), 1);\n    },\n\n    clear() {\n      subscribers = [];\n    },\n\n    disable() {\n      isLifecycleHooksDisabled = true;\n    },\n\n    enable() {\n      isLifecycleHooksDisabled = false;\n    },\n\n    createEvent(action, uid, properties, state): Event {\n      const model = db.metadata.get(uid);\n\n      return {\n        action,\n        model,\n        state,\n        ...properties,\n      };\n    },\n\n    /**\n     * @param {string} action\n     * @param {string} uid\n     * @param {{ params?: any, result?: any }} properties\n     * @param {Map<any, any>} states\n     */\n    async run(action, uid, properties, states = new Map()) {\n      if (isLifecycleHooksDisabled) return states;\n      for (let i = 0; i < subscribers.length; i += 1) {\n        const subscriber = subscribers[i];\n        if (typeof subscriber === 'function') {\n          const state = states.get(subscriber) || {};\n          const event = this.createEvent(action, uid, properties, state);\n          await subscriber(event);\n          if (event.state) {\n            states.set(subscriber, event.state || state);\n          }\n          continue;\n        }\n\n        const hasAction = action in subscriber;\n        const hasModel = !subscriber.models || subscriber.models.includes(uid);\n\n        if (hasAction && hasModel) {\n          const state = states.get(subscriber) || {};\n          const event = this.createEvent(action, uid, properties, state);\n\n          await subscriber[action]?.(event);\n          if (event.state) {\n            states.set(subscriber, event.state);\n          }\n        }\n      }\n\n      return states;\n    },\n  };\n};\n"],"names":["createLifecyclesProvider","db","subscribers","subscriberUtils","isLifecycleHooksDisabled","subscribe","subscriber","assert","push","splice","indexOf","clear","disable","enable","createEvent","action","uid","properties","state","model","metadata","get","run","states","Map","i","length","event","set","hasAction","hasModel","models","includes"],"mappings":"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"}