{"version":3,"file":"cron.mjs","sources":["../../src/services/cron.ts"],"sourcesContent":["import { Job, Spec } from 'node-schedule';\nimport { isFunction } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\n\ninterface JobSpec {\n  job: Job;\n  options: Spec;\n  name: string | null;\n}\n\ntype TaskFn = ({ strapi }: { strapi: Core.Strapi }, ...args: unknown[]) => Promise<unknown>;\n\ntype Task =\n  | TaskFn\n  | {\n      task: TaskFn;\n      options: Spec;\n    };\n\ninterface Tasks {\n  [key: string]: Task;\n}\n\nconst createCronService = () => {\n  let jobsSpecs: JobSpec[] = [];\n  let running = false;\n\n  return {\n    add(tasks: Tasks = {}) {\n      for (const taskExpression of Object.keys(tasks)) {\n        const taskValue = tasks[taskExpression];\n\n        let fn: TaskFn;\n        let options: Spec;\n        let taskName: string | null;\n        if (isFunction(taskValue)) {\n          // don't use task name if key is the rule\n          taskName = null;\n          fn = taskValue.bind(tasks);\n          options = taskExpression;\n        } else if (isFunction(taskValue.task)) {\n          // set task name if key is not the rule\n          taskName = taskExpression;\n          fn = taskValue.task.bind(taskValue);\n          options = taskValue.options;\n        } else {\n          throw new Error(\n            `Could not schedule a cron job for \"${taskExpression}\": no function found.`\n          );\n        }\n\n        const fnWithStrapi = (...args: unknown[]) => fn({ strapi }, ...args);\n\n        // const job = new Job(null, fnWithStrapi);\n        const job = new Job(fnWithStrapi);\n        jobsSpecs.push({ job, options, name: taskName });\n\n        if (running) {\n          job.schedule(options);\n        }\n      }\n      return this;\n    },\n\n    remove(name: string) {\n      if (!name) throw new Error('You must provide a name to remove a cron job.');\n      const matchingJobsSpecs = jobsSpecs.filter(({ name: jobSpecName }, index) => {\n        if (jobSpecName === name) {\n          jobsSpecs.splice(index, 1);\n          return true;\n        }\n        return false;\n      });\n      matchingJobsSpecs.forEach(({ job }) => job.cancel());\n      return this;\n    },\n\n    start() {\n      jobsSpecs.forEach(({ job, options }) => job.schedule(options));\n      running = true;\n      return this;\n    },\n\n    stop() {\n      jobsSpecs.forEach(({ job }) => job.cancel());\n      running = false;\n      return this;\n    },\n\n    destroy() {\n      this.stop();\n      jobsSpecs = [];\n      return this;\n    },\n    jobs: jobsSpecs,\n  };\n};\n\nexport default createCronService;\n"],"names":["createCronService","jobsSpecs","running","add","tasks","taskExpression","Object","keys","taskValue","fn","options","taskName","isFunction","bind","task","Error","fnWithStrapi","args","strapi","job","Job","push","name","schedule","remove","matchingJobsSpecs","filter","jobSpecName","index","splice","forEach","cancel","start","stop","destroy","jobs"],"mappings":"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"}