{"version":3,"file":"cron.mjs","sources":["../../src/services/cron.ts"],"sourcesContent":["import { Job, Spec } from 'node-schedule';\nimport { isFunction } from 'lodash/fp';\nimport type { Strapi } from '@strapi/types';\n\ninterface JobSpec {\n  job: Job;\n  options: Spec;\n  name: string | null;\n}\n\ntype TaskFn = ({ strapi }: { strapi: 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":[],"mappings":";;AAuBA,MAAM,oBAAoB,MAAM;AAC9B,MAAI,YAAuB,CAAA;AAC3B,MAAI,UAAU;AAEP,SAAA;AAAA,IACL,IAAI,QAAe,IAAI;AACrB,iBAAW,kBAAkB,OAAO,KAAK,KAAK,GAAG;AACzC,cAAA,YAAY,MAAM,cAAc;AAElC,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA,WAAW,SAAS,GAAG;AAEd,qBAAA;AACN,eAAA,UAAU,KAAK,KAAK;AACf,oBAAA;AAAA,QACD,WAAA,WAAW,UAAU,IAAI,GAAG;AAE1B,qBAAA;AACN,eAAA,UAAU,KAAK,KAAK,SAAS;AAClC,oBAAU,UAAU;AAAA,QAAA,OACf;AACL,gBAAM,IAAI;AAAA,YACR,sCAAsC,cAAc;AAAA,UAAA;AAAA,QAExD;AAEM,cAAA,eAAe,IAAI,SAAoB,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI;AAG7D,cAAA,MAAM,IAAI,IAAI,YAAY;AAChC,kBAAU,KAAK,EAAE,KAAK,SAAS,MAAM,UAAU;AAE/C,YAAI,SAAS;AACX,cAAI,SAAS,OAAO;AAAA,QACtB;AAAA,MACF;AACO,aAAA;AAAA,IACT;AAAA,IAEA,OAAO,MAAc;AACnB,UAAI,CAAC;AAAY,cAAA,IAAI,MAAM,+CAA+C;AACpE,YAAA,oBAAoB,UAAU,OAAO,CAAC,EAAE,MAAM,eAAe,UAAU;AAC3E,YAAI,gBAAgB,MAAM;AACd,oBAAA,OAAO,OAAO,CAAC;AAClB,iBAAA;AAAA,QACT;AACO,eAAA;AAAA,MAAA,CACR;AACD,wBAAkB,QAAQ,CAAC,EAAE,IAAU,MAAA,IAAI,QAAQ;AAC5C,aAAA;AAAA,IACT;AAAA,IAEA,QAAQ;AACI,gBAAA,QAAQ,CAAC,EAAE,KAAK,QAAc,MAAA,IAAI,SAAS,OAAO,CAAC;AACnD,gBAAA;AACH,aAAA;AAAA,IACT;AAAA,IAEA,OAAO;AACL,gBAAU,QAAQ,CAAC,EAAE,IAAU,MAAA,IAAI,QAAQ;AACjC,gBAAA;AACH,aAAA;AAAA,IACT;AAAA,IAEA,UAAU;AACR,WAAK,KAAK;AACV,kBAAY,CAAA;AACL,aAAA;AAAA,IACT;AAAA,IACA,MAAM;AAAA,EAAA;AAEV;"}