{"version":3,"file":"tasks.mjs","names":[],"sources":["../../src/helpers/tasks/editor/body.ts","../../src/helpers/tasks/editor/index.ts","../../src/helpers/tasks/recurrence.ts","../../src/helpers/tasks/index.ts"],"sourcesContent":["import type { Task } from '~/modules/tasks';\nimport type { TemplateFilter } from '~/modules/templates';\n\nimport {\n  createTaskLayoutHelperFrom,\n  taskLayoutHelperToJSON,\n  type TaskLayoutHelper,\n} from '../../templates/editor/layouts';\n\nexport interface TaskBodyHelper {\n  readonly version: number;\n  filters: Map<string, TemplateFilter>;\n  index: string;\n  dateField?: string;\n  inserts: TaskLayoutHelper[];\n}\n\nexport function createTaskBodyHelper(\n  index: string = '',\n  dateField: string = '',\n  inserts: TaskLayoutHelper[] = [],\n  filters: TemplateFilter[] = []\n): TaskBodyHelper {\n  return {\n    version: 2,\n    dateField,\n    inserts,\n    filters: new Map(filters?.map((filter) => [filter.name, filter]) ?? []),\n    index,\n  };\n}\n\nexport function createTaskBodyHelperFrom(\n  template: Task['template']\n): TaskBodyHelper {\n  return createTaskBodyHelper(\n    template.index,\n    template.dateField,\n    template.inserts?.map((lay) => createTaskLayoutHelperFrom(lay)) ?? [],\n    template.filters\n  );\n}\n\nexport function taskBodyHelperToJSON(\n  template: TaskBodyHelper\n): Task['template'] {\n  return {\n    version: template.version,\n    index: template.index,\n    inserts: template.inserts.map((lay) => taskLayoutHelperToJSON(lay)),\n    dateField: template.dateField,\n    filters: Array.from(template.filters.values()),\n  };\n}\n\nexport function addLayoutOfHelper(\n  body: TaskBodyHelper,\n  layout: TaskLayoutHelper\n): TaskBodyHelper {\n  if (body.inserts.some((lay) => lay.id === layout.id)) {\n    throw new Error(`Layout \"${layout.id}\" already exists`);\n  }\n  body.inserts.splice(layout.at, 0, layout);\n  return body;\n}\n\nexport function removeLayoutOfHelper(\n  body: TaskBodyHelper,\n  layout: TaskLayoutHelper\n): TaskBodyHelper {\n  const template = body;\n  template.inserts = body.inserts.filter((lay) => lay.id !== layout.id);\n  return body;\n}\n\nexport function updateLayoutOfHelper(\n  body: TaskBodyHelper,\n  oldLayout: TaskLayoutHelper,\n  newLayout: TaskLayoutHelper\n): TaskBodyHelper {\n  const index = body.inserts.findIndex((lay) => lay.id === oldLayout.id);\n  if (index < 0) {\n    throw new Error(`Layout \"${oldLayout.id}\" not found`);\n  }\n  const template = body;\n  template.inserts[index] = newLayout;\n  return body;\n}\n","import objectHash from 'object-hash';\n\nimport type { Task } from '~/modules/tasks';\nimport type {\n  InputTask,\n  LastExtended,\n  TaskRecurrence,\n  TaskRecurrenceOffset,\n} from '~/modules/tasks/types';\n\nimport type { TemplateBodyHelper } from '../../templates/editor/body';\nimport type { AnyLayoutHelper } from '../../templates/editor/layouts';\nimport {\n  type TaskBodyHelper,\n  createTaskBodyHelper,\n  createTaskBodyHelperFrom,\n  taskBodyHelperToJSON,\n} from './body';\n\nexport interface TaskHelper {\n  readonly id: string;\n  name: string;\n  description: string;\n  namespaceId: string;\n  extendedId: string;\n  template: TaskBodyHelper;\n  targets: string[];\n  recurrence: TaskRecurrence;\n  recurrenceOffset: TaskRecurrenceOffset;\n  nextRun: Date;\n  enabled: boolean;\n  readonly lastExtended?: LastExtended | null;\n  readonly lastRun?: Date;\n  readonly createdAt: Date;\n  readonly updatedAt?: Date;\n  readonly hash: string;\n}\n\nfunction hashTask(task: TaskHelper | Task): string {\n  return objectHash({\n    description: task.description,\n    enabled: task.enabled,\n    extendedId: task.extendedId,\n    name: task.name,\n    nextRun: task.nextRun,\n    recurrence: task.recurrence,\n    targets: task.targets,\n    template: task.template,\n  });\n}\n\nexport function createTaskHelper(\n  name = '',\n  description = '',\n  namespaceId = '',\n  extendedId = '',\n  template?: TaskBodyHelper,\n  targets: string[] = [],\n  recurrence: TaskRecurrence = 'DAILY',\n  recurrenceOffset: TaskRecurrenceOffset = {},\n  nextRun: Date = new Date(),\n  enabled = true,\n  lastExtended?: LastExtended,\n  lastRun?: Date,\n  id = '',\n  createdAt: Date = new Date(),\n  updatedAt?: Date\n): TaskHelper {\n  const task = {\n    createdAt,\n    description,\n    enabled,\n    extendedId,\n    hash: '',\n    id,\n    lastExtended,\n    lastRun,\n    name,\n    namespaceId,\n    nextRun,\n    recurrence,\n    recurrenceOffset,\n    targets,\n    template: template ?? createTaskBodyHelper(),\n    updatedAt,\n  };\n\n  task.hash = hashTask(task);\n\n  return task;\n}\n\nexport function createTaskHelperFrom(task: Task): TaskHelper {\n  return createTaskHelper(\n    task.name,\n    task.description,\n    task.namespaceId,\n    task.extendedId,\n    createTaskBodyHelperFrom(task.template),\n    task.targets,\n    task.recurrence,\n    task.recurrenceOffset,\n    task.nextRun,\n    task.enabled,\n    task.lastExtended ?? undefined,\n    task.lastRun,\n    task.id,\n    task.createdAt,\n    task.updatedAt\n  );\n}\n\nexport function taskHelperToJSON(task: TaskHelper): InputTask {\n  return {\n    description: task.description,\n    enabled: task.enabled,\n    extendedId: task.extendedId,\n    lastExtended: task.lastExtended,\n    name: task.name,\n    namespaceId: task.namespaceId,\n    nextRun: task.nextRun,\n    recurrence: task.recurrence,\n    recurrenceOffset: task.recurrenceOffset,\n    targets: task.targets,\n    template: taskBodyHelperToJSON(task.template),\n  };\n}\n\nexport function hasTaskChanged(task: TaskHelper): boolean {\n  return task.hash !== hashTask(task);\n}\n\nexport function getLayoutsOfHelpers(\n  taskBody: TaskBodyHelper,\n  templateBody: TemplateBodyHelper\n): (AnyLayoutHelper & { readonly: boolean })[] {\n  const layouts = templateBody.layouts.map((lay) => ({\n    ...lay,\n    readonly: true,\n  }));\n  for (const { at, ...layout } of taskBody.inserts) {\n    layouts.splice(at, 0, { ...layout, readonly: false });\n  }\n  return layouts;\n}\n\nexport {\n  type TaskBodyHelper,\n  createTaskBodyHelper,\n  createTaskBodyHelperFrom,\n  addLayoutOfHelper,\n  removeLayoutOfHelper,\n  updateLayoutOfHelper,\n} from './body';\n","import { add, type Duration } from 'date-fns';\n\nimport type { TaskRecurrence } from '~/modules/tasks';\n\n/**\n * Calculate next run date for the task\n *\n * @param initial Initial date of the task\n * @param recurrence The task recurrence\n *\n * @deprecated Please use the `recurrence` module\n * @see {@link getNextDateFromRecurrence}\n *\n * @returns The new date of the task\n */\nexport function calcNextDateFromRecurrence(\n  initial: Date,\n  recurrence: TaskRecurrence\n): Date {\n  const duration: Duration = {};\n\n  switch (recurrence) {\n    case 'DAILY':\n      duration.days = 1;\n      break;\n    case 'WEEKLY':\n      duration.weeks = 1;\n      break;\n    case 'MONTHLY':\n      duration.months = 1;\n      break;\n    case 'QUARTERLY':\n      duration.months = 3;\n      break;\n    case 'BIENNIAL':\n      duration.months = 6;\n      break;\n    case 'YEARLY':\n      duration.years = 1;\n      break;\n    default:\n      throw new Error('Recurrence not found');\n  }\n\n  return add(initial, duration);\n}\n\nexport const RECURRENCES: Readonly<TaskRecurrence[]> = [\n  'DAILY',\n  'WEEKLY',\n  'MONTHLY',\n  'QUARTERLY',\n  'BIENNIAL',\n  'YEARLY',\n] as const;\n\nexport const isRecurrence = (value: string): value is TaskRecurrence =>\n  (RECURRENCES as string[]).includes(value);\n","import { assignDependencies } from '~/helpers/permissions/decorator';\nimport { getTask, upsertTask, type Task } from '~/modules/tasks';\n\nexport * from './editor';\nexport * from './recurrence';\n\n/**\n * Change enable state of a task\n *\n * @param taskOrId Task or Task's id\n * @param enabled New state\n *\n * @returns Updated task\n */\nexport async function changeTaskEnableState(\n  taskOrId: Omit<Task, 'template'> | string,\n  enabled: boolean\n): Promise<Task> {\n  const base = await getTask(taskOrId);\n\n  const task = await upsertTask({\n    id: base.id,\n    name: base.name,\n    description: base.description,\n    extendedId: base.extendedId,\n    namespaceId: base.namespaceId,\n    nextRun: base.nextRun,\n    recurrence: base.recurrence,\n    recurrenceOffset: base.recurrenceOffset,\n    targets: base.targets,\n    template: base.template,\n    lastExtended: base.lastExtended,\n    enabled,\n  });\n\n  return task;\n}\nassignDependencies(changeTaskEnableState, [getTask, upsertTask]);\n"],"mappings":";;;;;;;;;;;AAiBA,SAAgB,qBACd,QAAgB,IAChB,YAAoB,IACpB,UAA8B,CAAC,GAC/B,UAA4B,CAAC,GACb;;CAChB,OAAO;EACL,SAAS;EACT;EACA;EACA,SAAS,IAAI,sEAAI,QAAS,KAAK,WAAW,CAAC,OAAO,MAAM,MAAM,CAAC,wDAAK,CAAC,CAAC;EACtE;CACF;AACF;AAEA,SAAgB,yBACd,UACgB;;CAChB,OAAO,qBACL,SAAS,OACT,SAAS,yDACT,SAAS,+EAAS,KAAK,QAAQ,2BAA2B,GAAG,CAAC,0EAAK,CAAC,GACpE,SAAS,OACX;AACF;AAEA,SAAgB,qBACd,UACkB;CAClB,OAAO;EACL,SAAS,SAAS;EAClB,OAAO,SAAS;EAChB,SAAS,SAAS,QAAQ,KAAK,QAAQ,uBAAuB,GAAG,CAAC;EAClE,WAAW,SAAS;EACpB,SAAS,MAAM,KAAK,SAAS,QAAQ,OAAO,CAAC;CAC/C;AACF;AAEA,SAAgB,kBACd,MACA,QACgB;CAChB,IAAI,KAAK,QAAQ,MAAM,QAAQ,IAAI,OAAO,OAAO,EAAE,GACjD,MAAM,IAAI,MAAM,WAAW,OAAO,GAAG,iBAAiB;CAExD,KAAK,QAAQ,OAAO,OAAO,IAAI,GAAG,MAAM;CACxC,OAAO;AACT;AAEA,SAAgB,qBACd,MACA,QACgB;CAChB,MAAM,WAAW;CACjB,SAAS,UAAU,KAAK,QAAQ,QAAQ,QAAQ,IAAI,OAAO,OAAO,EAAE;CACpE,OAAO;AACT;AAEA,SAAgB,qBACd,MACA,WACA,WACgB;CAChB,MAAM,QAAQ,KAAK,QAAQ,WAAW,QAAQ,IAAI,OAAO,UAAU,EAAE;CACrE,IAAI,QAAQ,GACV,MAAM,IAAI,MAAM,WAAW,UAAU,GAAG,YAAY;CAEtD,MAAM,WAAW;CACjB,SAAS,QAAQ,SAAS;CAC1B,OAAO;AACT;;;;mBCqDe;AAtGf,SAAS,SAAS,MAAiC;CACjD,OAAO,WAAW;EAChB,aAAa,KAAK;EAClB,SAAS,KAAK;EACd,YAAY,KAAK;EACjB,MAAM,KAAK;EACX,SAAS,KAAK;EACd,YAAY,KAAK;EACjB,SAAS,KAAK;EACd,UAAU,KAAK;CACjB,CAAC;AACH;AAEA,SAAgB,iBACd,OAAO,IACP,cAAc,IACd,cAAc,IACd,aAAa,IACb,UACA,UAAoB,CAAC,GACrB,aAA6B,SAC7B,mBAAyC,CAAC,GAC1C,0BAAgB,IAAI,KAAK,GACzB,UAAU,MACV,cACA,SACA,KAAK,IACL,4BAAkB,IAAI,KAAK,GAC3B,WACY;CACZ,MAAM,OAAO;EACX;EACA;EACA;EACA;EACA,MAAM;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,UAAU,sDAAY,qBAAqB;EAC3C;CACF;CAEA,KAAK,OAAO,SAAS,IAAI;CAEzB,OAAO;AACT;AAEA,SAAgB,qBAAqB,MAAwB;;CAC3D,OAAO,iBACL,KAAK,MACL,KAAK,aACL,KAAK,aACL,KAAK,YACL,yBAAyB,KAAK,QAAQ,GACtC,KAAK,SACL,KAAK,YACL,KAAK,kBACL,KAAK,SACL,KAAK,+BACL,KAAK,+EAAgB,QACrB,KAAK,SACL,KAAK,IACL,KAAK,WACL,KAAK,SACP;AACF;AAEA,SAAgB,iBAAiB,MAA6B;CAC5D,OAAO;EACL,aAAa,KAAK;EAClB,SAAS,KAAK;EACd,YAAY,KAAK;EACjB,cAAc,KAAK;EACnB,MAAM,KAAK;EACX,aAAa,KAAK;EAClB,SAAS,KAAK;EACd,YAAY,KAAK;EACjB,kBAAkB,KAAK;EACvB,SAAS,KAAK;EACd,UAAU,qBAAqB,KAAK,QAAQ;CAC9C;AACF;AAEA,SAAgB,eAAe,MAA2B;CACxD,OAAO,KAAK,SAAS,SAAS,IAAI;AACpC;AAEA,SAAgB,oBACd,UACA,cAC6C;CAC7C,MAAM,UAAU,aAAa,QAAQ,KAAK,0CACrC,YACH,UAAU,MACZ,CAAE;CACF,KAAK,cAA2B,SAAS,SAAS;MAAvC,EAAE,aAAO;EAClB,QAAQ,OAAO,IAAI,qCAAQ,eAAQ,UAAU,OAAM,CAAC;CACtD;CACA,OAAO;AACT;;;;;;;;;;;;;;;ACjIA,SAAgB,2BACd,SACA,YACM;CACN,MAAM,WAAqB,CAAC;CAE5B,QAAQ,YAAR;EACE,KAAK;GACH,SAAS,OAAO;GAChB;EACF,KAAK;GACH,SAAS,QAAQ;GACjB;EACF,KAAK;GACH,SAAS,SAAS;GAClB;EACF,KAAK;GACH,SAAS,SAAS;GAClB;EACF,KAAK;GACH,SAAS,SAAS;GAClB;EACF,KAAK;GACH,SAAS,QAAQ;GACjB;EACF,SACE,MAAM,IAAI,MAAM,sBAAsB;CAC1C;CAEA,OAAO,IAAI,SAAS,QAAQ;AAC9B;AAEA,MAAa,cAA0C;CACrD;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAa,gBAAgB,UAC1B,YAAyB,SAAS,KAAK;;;;;;;;;;;;AC3C1C,SAAsB,sBACpB,IACA;;;;uDADA,UACA,SACe;EACf,MAAM,OAAO,MAAM,QAAQ,QAAQ;EAiBnC,OAAO,MAfY,WAAW;GAC5B,IAAI,KAAK;GACT,MAAM,KAAK;GACX,aAAa,KAAK;GAClB,YAAY,KAAK;GACjB,aAAa,KAAK;GAClB,SAAS,KAAK;GACd,YAAY,KAAK;GACjB,kBAAkB,KAAK;GACvB,SAAS,KAAK;GACd,UAAU,KAAK;GACf,cAAc,KAAK;GACnB;EACF,CAAC;CAGH;;;AACA,mBAAmB,uBAAuB,CAAC,SAAS,UAAU,CAAC"}