{"version":3,"file":"tasks.mjs","names":["duration: Duration","RECURRENCES: Readonly<TaskRecurrence[]>"],"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 { TemplateFilter } from '~/modules/templates';\nimport type { Task } from '~/modules/tasks';\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  createTaskBodyHelper,\n  createTaskBodyHelperFrom,\n  taskBodyHelperToJSON,\n  type TaskBodyHelper,\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    name: task.name,\n    description: task.description,\n    extendedId: task.extendedId,\n    template: task.template,\n    targets: task.targets,\n    recurrence: task.recurrence,\n    nextRun: task.nextRun,\n    enabled: task.enabled,\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 = new Date(),\n  updatedAt?: Date\n): TaskHelper {\n  const task = {\n    id,\n    name,\n    description,\n    namespaceId,\n    extendedId,\n    template: template ?? createTaskBodyHelper(),\n    targets,\n    recurrence,\n    recurrenceOffset,\n    nextRun,\n    enabled,\n    lastExtended,\n    lastRun,\n    createdAt,\n    updatedAt,\n    hash: '',\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    name: task.name,\n    description: task.description,\n    namespaceId: task.namespaceId,\n    extendedId: task.extendedId,\n    template: taskBodyHelperToJSON(task.template),\n    targets: task.targets,\n    recurrence: task.recurrence,\n    recurrenceOffset: task.recurrenceOffset,\n    nextRun: task.nextRun,\n    enabled: task.enabled,\n    lastExtended: task.lastExtended,\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';\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';\n\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":"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"}