@qodalis/cli-cron 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qodalis/cli-cron",
3
- "version": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "Schedule commands to run on a repeating interval",
5
5
  "author": "Qodalis Solutions",
6
6
  "license": "MIT",
@@ -18,7 +18,7 @@
18
18
  "umd": "./umd/index.global.js",
19
19
  "unpkg": "./umd/index.global.js",
20
20
  "dependencies": {
21
- "@qodalis/cli-core": "2.0.0"
21
+ "@qodalis/cli-core": "2.1.0"
22
22
  },
23
23
  "sideEffects": false,
24
24
  "main": "./public-api.js",
package/public-api.d.mts CHANGED
@@ -19,7 +19,7 @@ declare class CliCronCommandProcessor implements ICliCommandProcessor {
19
19
  declare function parseInterval(input: string): number | null;
20
20
  declare function formatInterval(ms: number): string;
21
21
 
22
- declare const LIBRARY_VERSION = "2.0.0";
22
+ declare const LIBRARY_VERSION = "2.1.0";
23
23
  declare const API_VERSION = 2;
24
24
 
25
25
  declare const cronModule: ICliModule;
package/public-api.d.ts CHANGED
@@ -19,7 +19,7 @@ declare class CliCronCommandProcessor implements ICliCommandProcessor {
19
19
  declare function parseInterval(input: string): number | null;
20
20
  declare function formatInterval(ms: number): string;
21
21
 
22
- declare const LIBRARY_VERSION = "2.0.0";
22
+ declare const LIBRARY_VERSION = "2.1.0";
23
23
  declare const API_VERSION = 2;
24
24
 
25
25
  declare const cronModule: ICliModule;
package/public-api.js CHANGED
@@ -240,7 +240,7 @@ var CliCronCommandProcessor = class {
240
240
  };
241
241
 
242
242
  // src/lib/version.ts
243
- var LIBRARY_VERSION = "2.0.0";
243
+ var LIBRARY_VERSION = "2.1.0";
244
244
  var API_VERSION = 2;
245
245
 
246
246
  // src/public-api.ts
package/public-api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../packages/plugins/cron/src/lib/cron-utils.ts","../../packages/plugins/cron/src/lib/processors/cli-cron-command-processor.ts","../../packages/plugins/cron/src/lib/version.ts","../../packages/plugins/cron/src/public-api.ts"],"names":["DefaultLibraryAuthor","CliIcon","CliForegroundColor","joinShellWords","writeWrapped","writeUsage","writeExamples"],"mappings":"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","file":"public-api.js","sourcesContent":["const MIN_INTERVAL_MS = 10_000; // 10 seconds minimum\n\nexport function parseInterval(input: string): number | null {\n if (!input.trim()) return null;\n if (/^\\d+$/.test(input.trim())) {\n const ms = parseInt(input.trim(), 10) * 1000;\n return ms >= MIN_INTERVAL_MS ? ms : null;\n }\n const pattern = /^(?:(\\d+)h)?(?:(\\d+)m)?(?:(\\d+)s)?$/;\n const match = input.trim().match(pattern);\n if (!match || match[0] === '') return null;\n const h = parseInt(match[1] ?? '0', 10);\n const m = parseInt(match[2] ?? '0', 10);\n const s = parseInt(match[3] ?? '0', 10);\n const total = h * 3_600_000 + m * 60_000 + s * 1_000;\n return total >= MIN_INTERVAL_MS ? total : null;\n}\n\nexport function formatInterval(ms: number): string {\n const h = Math.floor(ms / 3_600_000);\n const m = Math.floor((ms % 3_600_000) / 60_000);\n const s = Math.floor((ms % 60_000) / 1_000);\n const parts: string[] = [];\n if (h > 0) parts.push(`${h}h`);\n if (m > 0) parts.push(`${m}m`);\n if (s > 0) parts.push(`${s}s`);\n return parts.join(' ') || '0s';\n}\n","import {\n ICliCommandProcessor,\n ICliExecutionContext,\n CliProcessCommand,\n ICliCommandAuthor,\n CliProcessorMetadata,\n CliIcon,\n CliStateConfiguration,\n DefaultLibraryAuthor,\n CliForegroundColor,\n ICliCommandChildProcessor,\n writeExamples,\n writeUsage,\n writeWrapped,\n joinShellWords,\n} from '@qodalis/cli-core';\nimport { parseInterval, formatInterval } from '../cron-utils';\n\ninterface CronJob {\n id: string;\n name: string;\n command: string;\n intervalMs: number;\n enabled: boolean;\n runCount: number;\n lastRun?: number;\n}\n\ninterface CronState {\n jobs: CronJob[];\n}\n\n/** The text after the first `count` shell words, as typed (quotes kept). */\nfunction textAfterWords(text: string, count: number): string {\n const word = /\\s*(?:\\\\.|\"(?:[^\"\\\\]|\\\\.)*\"|'[^']*'|[^\\s\"'\\\\]|[\"'\\\\])+/y;\n for (let i = 0; i < count; i++) {\n if (!word.exec(text)) return '';\n }\n return text.slice(word.lastIndex).trim();\n}\n\nexport class CliCronCommandProcessor implements ICliCommandProcessor {\n command = 'cron';\n description = 'Schedule commands to run on a repeating interval';\n author: ICliCommandAuthor = DefaultLibraryAuthor;\n metadata: CliProcessorMetadata = { icon: CliIcon.Clock };\n\n stateConfiguration: CliStateConfiguration = {\n storeName: 'cron',\n initialState: { jobs: [] } as CronState,\n };\n\n private timers = new Map<string, ReturnType<typeof setInterval>>();\n\n processors: ICliCommandChildProcessor[] = [\n {\n command: 'add',\n description: 'Add a cron job: cron add <name> <interval> <command>',\n acceptsRawInput: true,\n valueRequired: true,\n processCommand: async (cmd: CliProcessCommand, context: ICliExecutionContext) => {\n const parts = cmd.positionals ?? [];\n if (parts.length < 3) {\n context.writer.writeError('Usage: cron add <name> <interval> <command>');\n context.writer.writeln(' Example: cron add ping 5m echo heartbeat');\n return;\n }\n // The command: one quoted argument, or else the rest as typed\n const [name, intervalStr, ...cmdParts] = parts;\n const command =\n cmdParts.length === 1\n ? cmdParts[0]\n : textAfterWords(cmd.value ?? '', 2) || cmdParts.join(' ');\n const intervalMs = parseInterval(intervalStr);\n if (!intervalMs) {\n context.writer.writeError(`Invalid interval \"${intervalStr}\". Min 10s. Examples: 10s, 5m, 1h`);\n return;\n }\n const state = context.state.getState<CronState>();\n if (state.jobs.find((j) => j.name === name)) {\n context.writer.writeError(`Job \"${name}\" already exists. Remove it first: cron remove ${name}`);\n return;\n }\n const job: CronJob = {\n id: `cron_${Date.now()}`,\n name,\n command,\n intervalMs,\n enabled: true,\n runCount: 0,\n };\n await context.state.update((saved) => ({\n jobs: [...((saved['jobs'] as CronJob[]) ?? []), job],\n }));\n this.startJob(job, context);\n context.writer.writeSuccess(\n `Job \"${name}\" added — runs every ${formatInterval(intervalMs)}: ${command}`,\n );\n },\n },\n {\n command: 'list',\n description: 'List all cron jobs',\n aliases: ['ls'],\n processCommand: async (_: CliProcessCommand, context: ICliExecutionContext) => {\n const { jobs } = context.state.getState<CronState>();\n if (!jobs.length) {\n context.writer.writeInfo('No cron jobs. Use: cron add <name> <interval> <command>');\n return;\n }\n context.writer.writeln(context.writer.wrapInColor('Cron Jobs:', CliForegroundColor.Yellow));\n for (const job of jobs) {\n const status = job.enabled\n ? context.writer.wrapInColor('enabled ', CliForegroundColor.Green)\n : context.writer.wrapInColor('disabled', CliForegroundColor.Red);\n context.writer.writeln(\n ` ${context.writer.wrapInColor(job.name.padEnd(12), CliForegroundColor.Cyan)}` +\n `[${status}] every ${formatInterval(job.intervalMs)} \\u2192 ${job.command} (ran ${job.runCount}x)`,\n );\n }\n },\n },\n {\n command: 'remove',\n description: 'Remove a cron job: cron remove <name>',\n aliases: ['rm', 'delete'],\n acceptsRawInput: true,\n valueRequired: true,\n processCommand: async (cmd: CliProcessCommand, context: ICliExecutionContext) => {\n const name = joinShellWords(cmd.value ?? '');\n const state = context.state.getState<CronState>();\n const idx = state.jobs.findIndex((j) => j.name === name);\n if (idx === -1) {\n context.writer.writeError(`Job \"${name}\" not found`);\n return;\n }\n const job = state.jobs[idx];\n this.stopJob(job.id);\n await context.state.update((saved) => ({\n jobs: ((saved['jobs'] as CronJob[]) ?? []).filter((j) => j.name !== name),\n }));\n context.writer.writeSuccess(`Job \"${name}\" removed`);\n },\n },\n {\n command: 'enable',\n description: 'Enable a paused cron job',\n acceptsRawInput: true,\n valueRequired: true,\n processCommand: async (cmd: CliProcessCommand, context: ICliExecutionContext) => {\n await this.setEnabled(joinShellWords(cmd.value ?? ''), true, context);\n },\n },\n {\n command: 'disable',\n description: 'Pause a cron job without removing it',\n acceptsRawInput: true,\n valueRequired: true,\n processCommand: async (cmd: CliProcessCommand, context: ICliExecutionContext) => {\n await this.setEnabled(joinShellWords(cmd.value ?? ''), false, context);\n },\n },\n ];\n\n async initialize(context: ICliExecutionContext): Promise<void> {\n const { jobs } = context.state.getState<CronState>();\n for (const job of jobs.filter((j) => j.enabled)) {\n this.startJob(job, context);\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.cron.help.run_command_again_again', 'Run a command again and again at a fixed interval while the terminal is open. Jobs are saved: they start again when the terminal starts, and can be paused without removing them.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['cron add <name> <interval> <command>', t.t('cli.cron.help.add_job', 'Add a job')],\n ['cron list', t.t('cli.cron.help.jobs_interval_status_run', 'Jobs with interval, status and run count (ls)')],\n ['cron disable <name>', t.t('cli.cron.help.pause_job', 'Pause a job')],\n ['cron enable <name>', t.t('cli.cron.help.resume_paused_job', 'Resume a paused job')],\n ['cron remove <name>', t.t('cli.cron.help.remove_job_rm_delete', 'Remove a job (rm, delete)')],\n ]);\n context.writer.writeln();\n writeWrapped(\n context,\n t.t('cli.cron.help.intervals_seconds_30_hours', 'Intervals: seconds (30), or hours, minutes and seconds (1h, 5m, 1h30m, 90s); at least 10 seconds.'),\n );\n context.writer.writeln();\n writeExamples(context, [\n ['cron add ping 5m echo heartbeat', t.t('cli.cron.help.every_5_minutes', 'Every 5 minutes')],\n ['cron add backup 1h30m server jobs trigger backup', t.t('cli.cron.help.every_hour_half', 'Every hour and a half')],\n ['cron disable ping', t.t('cli.cron.help.pause', 'Pause it')],\n ]);\n }\n\n async processCommand(_: CliProcessCommand, context: ICliExecutionContext): Promise<void> {\n const { jobs } = context.state.getState<CronState>();\n context.writer.writeln(`${jobs.length} job(s). Sub-commands: add, list, remove, enable, disable`);\n }\n\n private startJob(job: CronJob, context: ICliExecutionContext): void {\n if (this.timers.has(job.id)) return; // already running\n const timer = setInterval(async () => {\n if (!job.enabled) return;\n try {\n await context.executor.executeCommand(job.command, context);\n job.runCount++;\n job.lastRun = Date.now();\n const state = context.state.getState<CronState>();\n const updated = state.jobs.map((j) =>\n j.id === job.id ? { ...j, runCount: job.runCount, lastRun: job.lastRun } : j,\n );\n context.state.updateState({ jobs: updated });\n } catch (e) {\n context.logger.error(`Cron job \"${job.name}\" failed:`, e);\n }\n }, job.intervalMs);\n this.timers.set(job.id, timer);\n }\n\n private stopJob(id: string): void {\n const timer = this.timers.get(id);\n if (timer) {\n clearInterval(timer);\n this.timers.delete(id);\n }\n }\n\n private async setEnabled(name: string, enabled: boolean, context: ICliExecutionContext): Promise<void> {\n const state = context.state.getState<CronState>();\n const jobIdx = state.jobs.findIndex((j) => j.name === name);\n if (jobIdx === -1) {\n context.writer.writeError(`Job \"${name}\" not found`);\n return;\n }\n const job = state.jobs[jobIdx];\n job.enabled = enabled;\n if (enabled) {\n this.startJob(job, context);\n } else {\n this.stopJob(job.id);\n }\n await context.state.update((saved) => ({\n jobs: ((saved['jobs'] as CronJob[]) ?? []).map((j) =>\n j.name === name ? { ...j, enabled } : j,\n ),\n }));\n context.writer.writeSuccess(`Job \"${name}\" ${enabled ? 'enabled' : 'disabled'}`);\n }\n}\n","\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0';\nexport const API_VERSION = 2;\n ","/*\n * Public API Surface of cron\n */\n\nexport * from './lib/processors/cli-cron-command-processor';\nexport * from './lib/cron-utils';\nexport * from './lib/version';\n\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliCronCommandProcessor } from './lib/processors/cli-cron-command-processor';\nimport { API_VERSION } from './lib/version';\n\nexport const cronModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-cron',\n processors: [new CliCronCommandProcessor()],\n translations: {\n es: { 'cli.cron.description': 'Programar comandos para ejecución periódica' },\n fr: { 'cli.cron.description': 'Planifier des commandes à exécution périodique' },\n de: { 'cli.cron.description': 'Befehle für regelmäßige Ausführung planen' },\n pt: { 'cli.cron.description': 'Agendar comandos para execução periódica' },\n it: { 'cli.cron.description': 'Pianificare comandi a esecuzione periodica' },\n ja: { 'cli.cron.description': 'コマンドの定期実行をスケジュール' },\n ko: { 'cli.cron.description': '명령어를 주기적으로 실행하도록 예약' },\n zh: { 'cli.cron.description': '定时重复执行命令' },\n ru: { 'cli.cron.description': 'Планирование периодического выполнения команд' },\n ro: { 'cli.cron.description': 'Programează comenzi pentru execuție periodică' },\n },\n};\n"]}
1
+ {"version":3,"sources":["../../packages/plugins/cron/src/lib/cron-utils.ts","../../packages/plugins/cron/src/lib/processors/cli-cron-command-processor.ts","../../packages/plugins/cron/src/lib/version.ts","../../packages/plugins/cron/src/public-api.ts"],"names":["DefaultLibraryAuthor","CliIcon","CliForegroundColor","joinShellWords","writeWrapped","writeUsage","writeExamples"],"mappings":"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","file":"public-api.js","sourcesContent":["const MIN_INTERVAL_MS = 10_000; // 10 seconds minimum\n\nexport function parseInterval(input: string): number | null {\n if (!input.trim()) return null;\n if (/^\\d+$/.test(input.trim())) {\n const ms = parseInt(input.trim(), 10) * 1000;\n return ms >= MIN_INTERVAL_MS ? ms : null;\n }\n const pattern = /^(?:(\\d+)h)?(?:(\\d+)m)?(?:(\\d+)s)?$/;\n const match = input.trim().match(pattern);\n if (!match || match[0] === '') return null;\n const h = parseInt(match[1] ?? '0', 10);\n const m = parseInt(match[2] ?? '0', 10);\n const s = parseInt(match[3] ?? '0', 10);\n const total = h * 3_600_000 + m * 60_000 + s * 1_000;\n return total >= MIN_INTERVAL_MS ? total : null;\n}\n\nexport function formatInterval(ms: number): string {\n const h = Math.floor(ms / 3_600_000);\n const m = Math.floor((ms % 3_600_000) / 60_000);\n const s = Math.floor((ms % 60_000) / 1_000);\n const parts: string[] = [];\n if (h > 0) parts.push(`${h}h`);\n if (m > 0) parts.push(`${m}m`);\n if (s > 0) parts.push(`${s}s`);\n return parts.join(' ') || '0s';\n}\n","import {\n ICliCommandProcessor,\n ICliExecutionContext,\n CliProcessCommand,\n ICliCommandAuthor,\n CliProcessorMetadata,\n CliIcon,\n CliStateConfiguration,\n DefaultLibraryAuthor,\n CliForegroundColor,\n ICliCommandChildProcessor,\n writeExamples,\n writeUsage,\n writeWrapped,\n joinShellWords,\n} from '@qodalis/cli-core';\nimport { parseInterval, formatInterval } from '../cron-utils';\n\ninterface CronJob {\n id: string;\n name: string;\n command: string;\n intervalMs: number;\n enabled: boolean;\n runCount: number;\n lastRun?: number;\n}\n\ninterface CronState {\n jobs: CronJob[];\n}\n\n/** The text after the first `count` shell words, as typed (quotes kept). */\nfunction textAfterWords(text: string, count: number): string {\n const word = /\\s*(?:\\\\.|\"(?:[^\"\\\\]|\\\\.)*\"|'[^']*'|[^\\s\"'\\\\]|[\"'\\\\])+/y;\n for (let i = 0; i < count; i++) {\n if (!word.exec(text)) return '';\n }\n return text.slice(word.lastIndex).trim();\n}\n\nexport class CliCronCommandProcessor implements ICliCommandProcessor {\n command = 'cron';\n description = 'Schedule commands to run on a repeating interval';\n author: ICliCommandAuthor = DefaultLibraryAuthor;\n metadata: CliProcessorMetadata = { icon: CliIcon.Clock };\n\n stateConfiguration: CliStateConfiguration = {\n storeName: 'cron',\n initialState: { jobs: [] } as CronState,\n };\n\n private timers = new Map<string, ReturnType<typeof setInterval>>();\n\n processors: ICliCommandChildProcessor[] = [\n {\n command: 'add',\n description: 'Add a cron job: cron add <name> <interval> <command>',\n acceptsRawInput: true,\n valueRequired: true,\n processCommand: async (cmd: CliProcessCommand, context: ICliExecutionContext) => {\n const parts = cmd.positionals ?? [];\n if (parts.length < 3) {\n context.writer.writeError('Usage: cron add <name> <interval> <command>');\n context.writer.writeln(' Example: cron add ping 5m echo heartbeat');\n return;\n }\n // The command: one quoted argument, or else the rest as typed\n const [name, intervalStr, ...cmdParts] = parts;\n const command =\n cmdParts.length === 1\n ? cmdParts[0]\n : textAfterWords(cmd.value ?? '', 2) || cmdParts.join(' ');\n const intervalMs = parseInterval(intervalStr);\n if (!intervalMs) {\n context.writer.writeError(`Invalid interval \"${intervalStr}\". Min 10s. Examples: 10s, 5m, 1h`);\n return;\n }\n const state = context.state.getState<CronState>();\n if (state.jobs.find((j) => j.name === name)) {\n context.writer.writeError(`Job \"${name}\" already exists. Remove it first: cron remove ${name}`);\n return;\n }\n const job: CronJob = {\n id: `cron_${Date.now()}`,\n name,\n command,\n intervalMs,\n enabled: true,\n runCount: 0,\n };\n await context.state.update((saved) => ({\n jobs: [...((saved['jobs'] as CronJob[]) ?? []), job],\n }));\n this.startJob(job, context);\n context.writer.writeSuccess(\n `Job \"${name}\" added — runs every ${formatInterval(intervalMs)}: ${command}`,\n );\n },\n },\n {\n command: 'list',\n description: 'List all cron jobs',\n aliases: ['ls'],\n processCommand: async (_: CliProcessCommand, context: ICliExecutionContext) => {\n const { jobs } = context.state.getState<CronState>();\n if (!jobs.length) {\n context.writer.writeInfo('No cron jobs. Use: cron add <name> <interval> <command>');\n return;\n }\n context.writer.writeln(context.writer.wrapInColor('Cron Jobs:', CliForegroundColor.Yellow));\n for (const job of jobs) {\n const status = job.enabled\n ? context.writer.wrapInColor('enabled ', CliForegroundColor.Green)\n : context.writer.wrapInColor('disabled', CliForegroundColor.Red);\n context.writer.writeln(\n ` ${context.writer.wrapInColor(job.name.padEnd(12), CliForegroundColor.Cyan)}` +\n `[${status}] every ${formatInterval(job.intervalMs)} \\u2192 ${job.command} (ran ${job.runCount}x)`,\n );\n }\n },\n },\n {\n command: 'remove',\n description: 'Remove a cron job: cron remove <name>',\n aliases: ['rm', 'delete'],\n acceptsRawInput: true,\n valueRequired: true,\n processCommand: async (cmd: CliProcessCommand, context: ICliExecutionContext) => {\n const name = joinShellWords(cmd.value ?? '');\n const state = context.state.getState<CronState>();\n const idx = state.jobs.findIndex((j) => j.name === name);\n if (idx === -1) {\n context.writer.writeError(`Job \"${name}\" not found`);\n return;\n }\n const job = state.jobs[idx];\n this.stopJob(job.id);\n await context.state.update((saved) => ({\n jobs: ((saved['jobs'] as CronJob[]) ?? []).filter((j) => j.name !== name),\n }));\n context.writer.writeSuccess(`Job \"${name}\" removed`);\n },\n },\n {\n command: 'enable',\n description: 'Enable a paused cron job',\n acceptsRawInput: true,\n valueRequired: true,\n processCommand: async (cmd: CliProcessCommand, context: ICliExecutionContext) => {\n await this.setEnabled(joinShellWords(cmd.value ?? ''), true, context);\n },\n },\n {\n command: 'disable',\n description: 'Pause a cron job without removing it',\n acceptsRawInput: true,\n valueRequired: true,\n processCommand: async (cmd: CliProcessCommand, context: ICliExecutionContext) => {\n await this.setEnabled(joinShellWords(cmd.value ?? ''), false, context);\n },\n },\n ];\n\n async initialize(context: ICliExecutionContext): Promise<void> {\n const { jobs } = context.state.getState<CronState>();\n for (const job of jobs.filter((j) => j.enabled)) {\n this.startJob(job, context);\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.cron.help.run_command_again_again', 'Run a command again and again at a fixed interval while the terminal is open. Jobs are saved: they start again when the terminal starts, and can be paused without removing them.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['cron add <name> <interval> <command>', t.t('cli.cron.help.add_job', 'Add a job')],\n ['cron list', t.t('cli.cron.help.jobs_interval_status_run', 'Jobs with interval, status and run count (ls)')],\n ['cron disable <name>', t.t('cli.cron.help.pause_job', 'Pause a job')],\n ['cron enable <name>', t.t('cli.cron.help.resume_paused_job', 'Resume a paused job')],\n ['cron remove <name>', t.t('cli.cron.help.remove_job_rm_delete', 'Remove a job (rm, delete)')],\n ]);\n context.writer.writeln();\n writeWrapped(\n context,\n t.t('cli.cron.help.intervals_seconds_30_hours', 'Intervals: seconds (30), or hours, minutes and seconds (1h, 5m, 1h30m, 90s); at least 10 seconds.'),\n );\n context.writer.writeln();\n writeExamples(context, [\n ['cron add ping 5m echo heartbeat', t.t('cli.cron.help.every_5_minutes', 'Every 5 minutes')],\n ['cron add backup 1h30m server jobs trigger backup', t.t('cli.cron.help.every_hour_half', 'Every hour and a half')],\n ['cron disable ping', t.t('cli.cron.help.pause', 'Pause it')],\n ]);\n }\n\n async processCommand(_: CliProcessCommand, context: ICliExecutionContext): Promise<void> {\n const { jobs } = context.state.getState<CronState>();\n context.writer.writeln(`${jobs.length} job(s). Sub-commands: add, list, remove, enable, disable`);\n }\n\n private startJob(job: CronJob, context: ICliExecutionContext): void {\n if (this.timers.has(job.id)) return; // already running\n const timer = setInterval(async () => {\n if (!job.enabled) return;\n try {\n await context.executor.executeCommand(job.command, context);\n job.runCount++;\n job.lastRun = Date.now();\n const state = context.state.getState<CronState>();\n const updated = state.jobs.map((j) =>\n j.id === job.id ? { ...j, runCount: job.runCount, lastRun: job.lastRun } : j,\n );\n context.state.updateState({ jobs: updated });\n } catch (e) {\n context.logger.error(`Cron job \"${job.name}\" failed:`, e);\n }\n }, job.intervalMs);\n this.timers.set(job.id, timer);\n }\n\n private stopJob(id: string): void {\n const timer = this.timers.get(id);\n if (timer) {\n clearInterval(timer);\n this.timers.delete(id);\n }\n }\n\n private async setEnabled(name: string, enabled: boolean, context: ICliExecutionContext): Promise<void> {\n const state = context.state.getState<CronState>();\n const jobIdx = state.jobs.findIndex((j) => j.name === name);\n if (jobIdx === -1) {\n context.writer.writeError(`Job \"${name}\" not found`);\n return;\n }\n const job = state.jobs[jobIdx];\n job.enabled = enabled;\n if (enabled) {\n this.startJob(job, context);\n } else {\n this.stopJob(job.id);\n }\n await context.state.update((saved) => ({\n jobs: ((saved['jobs'] as CronJob[]) ?? []).map((j) =>\n j.name === name ? { ...j, enabled } : j,\n ),\n }));\n context.writer.writeSuccess(`Job \"${name}\" ${enabled ? 'enabled' : 'disabled'}`);\n }\n}\n","\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.1.0';\nexport const API_VERSION = 2;\n ","/*\n * Public API Surface of cron\n */\n\nexport * from './lib/processors/cli-cron-command-processor';\nexport * from './lib/cron-utils';\nexport * from './lib/version';\n\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliCronCommandProcessor } from './lib/processors/cli-cron-command-processor';\nimport { API_VERSION } from './lib/version';\n\nexport const cronModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-cron',\n processors: [new CliCronCommandProcessor()],\n translations: {\n es: { 'cli.cron.description': 'Programar comandos para ejecución periódica' },\n fr: { 'cli.cron.description': 'Planifier des commandes à exécution périodique' },\n de: { 'cli.cron.description': 'Befehle für regelmäßige Ausführung planen' },\n pt: { 'cli.cron.description': 'Agendar comandos para execução periódica' },\n it: { 'cli.cron.description': 'Pianificare comandi a esecuzione periodica' },\n ja: { 'cli.cron.description': 'コマンドの定期実行をスケジュール' },\n ko: { 'cli.cron.description': '명령어를 주기적으로 실행하도록 예약' },\n zh: { 'cli.cron.description': '定时重复执行命令' },\n ru: { 'cli.cron.description': 'Планирование периодического выполнения команд' },\n ro: { 'cli.cron.description': 'Programează comenzi pentru execuție periodică' },\n },\n};\n"]}
package/public-api.mjs CHANGED
@@ -238,7 +238,7 @@ var CliCronCommandProcessor = class {
238
238
  };
239
239
 
240
240
  // src/lib/version.ts
241
- var LIBRARY_VERSION = "2.0.0";
241
+ var LIBRARY_VERSION = "2.1.0";
242
242
  var API_VERSION = 2;
243
243
 
244
244
  // src/public-api.ts
@@ -1 +1 @@
1
- {"version":3,"sources":["../../packages/plugins/cron/src/lib/cron-utils.ts","../../packages/plugins/cron/src/lib/processors/cli-cron-command-processor.ts","../../packages/plugins/cron/src/lib/version.ts","../../packages/plugins/cron/src/public-api.ts"],"names":[],"mappings":";;;;;AAAA,IAAM,eAAA,GAAkB,GAAA;AAEjB,SAAS,cAAc,KAAA,EAA8B;AACxD,EAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAK,EAAG,OAAO,IAAA;AAC1B,EAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,CAAA,EAAG;AAC5B,IAAA,MAAM,KAAK,QAAA,CAAS,KAAA,CAAM,IAAA,EAAK,EAAG,EAAE,CAAA,GAAI,GAAA;AACxC,IAAA,OAAO,EAAA,IAAM,kBAAkB,EAAA,GAAK,IAAA;AAAA,EACxC;AACA,EAAA,MAAM,OAAA,GAAU,qCAAA;AAChB,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,EAAK,CAAE,MAAM,OAAO,CAAA;AACxC,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,CAAC,CAAA,KAAM,IAAI,OAAO,IAAA;AACtC,EAAA,MAAM,IAAI,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,IAAK,KAAK,EAAE,CAAA;AACtC,EAAA,MAAM,IAAI,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,IAAK,KAAK,EAAE,CAAA;AACtC,EAAA,MAAM,IAAI,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,IAAK,KAAK,EAAE,CAAA;AACtC,EAAA,MAAM,KAAA,GAAQ,CAAA,GAAI,IAAA,GAAY,CAAA,GAAI,MAAS,CAAA,GAAI,GAAA;AAC/C,EAAA,OAAO,KAAA,IAAS,kBAAkB,KAAA,GAAQ,IAAA;AAC9C;AAEO,SAAS,eAAe,EAAA,EAAoB;AAC/C,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,IAAS,CAAA;AACnC,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAO,EAAA,GAAK,OAAa,GAAM,CAAA;AAC9C,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAO,EAAA,GAAK,MAAU,GAAK,CAAA;AAC1C,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,IAAI,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA,CAAA,CAAG,CAAA;AAC7B,EAAA,IAAI,IAAI,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA,CAAA,CAAG,CAAA;AAC7B,EAAA,IAAI,IAAI,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA,CAAA,CAAG,CAAA;AAC7B,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,IAAK,IAAA;AAC9B;;;ACMA,SAAS,cAAA,CAAe,MAAc,KAAA,EAAuB;AACzD,EAAA,MAAM,IAAA,GAAO,yDAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC5B,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,IAAI,GAAG,OAAO,EAAA;AAAA,EACjC;AACA,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAS,EAAE,IAAA,EAAK;AAC3C;AAEO,IAAM,0BAAN,MAA8D;AAAA,EAA9D,WAAA,GAAA;AACH,IAAA,IAAA,CAAA,OAAA,GAAU,MAAA;AACV,IAAA,IAAA,CAAA,WAAA,GAAc,kDAAA;AACd,IAAA,IAAA,CAAA,MAAA,GAA4B,oBAAA;AAC5B,IAAA,IAAA,CAAA,QAAA,GAAiC,EAAE,IAAA,EAAM,OAAA,CAAQ,KAAA,EAAM;AAEvD,IAAA,IAAA,CAAA,kBAAA,GAA4C;AAAA,MACxC,SAAA,EAAW,MAAA;AAAA,MACX,YAAA,EAAc,EAAE,IAAA,EAAM,EAAC;AAAE,KAC7B;AAEA,IAAA,IAAA,CAAQ,MAAA,uBAAa,GAAA,EAA4C;AAEjE,IAAA,IAAA,CAAA,UAAA,GAA0C;AAAA,MACtC;AAAA,QACI,OAAA,EAAS,KAAA;AAAA,QACT,WAAA,EAAa,sDAAA;AAAA,QACb,eAAA,EAAiB,IAAA;AAAA,QACjB,aAAA,EAAe,IAAA;AAAA,QACf,cAAA,EAAgB,OAAO,GAAA,EAAwB,OAAA,KAAkC;AAC7E,UAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,WAAA,IAAe,EAAC;AAClC,UAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AAClB,YAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,6CAA6C,CAAA;AACvE,YAAA,OAAA,CAAQ,MAAA,CAAO,QAAQ,4CAA4C,CAAA;AACnE,YAAA;AAAA,UACJ;AAEA,UAAA,MAAM,CAAC,IAAA,EAAM,WAAA,EAAa,GAAG,QAAQ,CAAA,GAAI,KAAA;AACzC,UAAA,MAAM,OAAA,GACF,QAAA,CAAS,MAAA,KAAW,CAAA,GACd,SAAS,CAAC,CAAA,GACV,cAAA,CAAe,GAAA,CAAI,SAAS,EAAA,EAAI,CAAC,CAAA,IAAK,QAAA,CAAS,KAAK,GAAG,CAAA;AACjE,UAAA,MAAM,UAAA,GAAa,cAAc,WAAW,CAAA;AAC5C,UAAA,IAAI,CAAC,UAAA,EAAY;AACb,YAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,CAAA,kBAAA,EAAqB,WAAW,CAAA,iCAAA,CAAmC,CAAA;AAC7F,YAAA;AAAA,UACJ;AACA,UAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,QAAA,EAAoB;AAChD,UAAA,IAAI,KAAA,CAAM,KAAK,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,IAAI,CAAA,EAAG;AACzC,YAAA,OAAA,CAAQ,OAAO,UAAA,CAAW,CAAA,KAAA,EAAQ,IAAI,CAAA,+CAAA,EAAkD,IAAI,CAAA,CAAE,CAAA;AAC9F,YAAA;AAAA,UACJ;AACA,UAAA,MAAM,GAAA,GAAe;AAAA,YACjB,EAAA,EAAI,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA,YACtB,IAAA;AAAA,YACA,OAAA;AAAA,YACA,UAAA;AAAA,YACA,OAAA,EAAS,IAAA;AAAA,YACT,QAAA,EAAU;AAAA,WACd;AACA,UAAA,MAAM,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,KAAA,MAAW;AAAA,YACnC,IAAA,EAAM,CAAC,GAAK,KAAA,CAAM,MAAM,CAAA,IAAmB,IAAK,GAAG;AAAA,WACvD,CAAE,CAAA;AACF,UAAA,IAAA,CAAK,QAAA,CAAS,KAAK,OAAO,CAAA;AAC1B,UAAA,OAAA,CAAQ,MAAA,CAAO,YAAA;AAAA,YACX,QAAQ,IAAI,CAAA,0BAAA,EAAwB,eAAe,UAAU,CAAC,KAAK,OAAO,CAAA;AAAA,WAC9E;AAAA,QACJ;AAAA,OACJ;AAAA,MACA;AAAA,QACI,OAAA,EAAS,MAAA;AAAA,QACT,WAAA,EAAa,oBAAA;AAAA,QACb,OAAA,EAAS,CAAC,IAAI,CAAA;AAAA,QACd,cAAA,EAAgB,OAAO,CAAA,EAAsB,OAAA,KAAkC;AAC3E,UAAA,MAAM,EAAE,IAAA,EAAK,GAAI,OAAA,CAAQ,MAAM,QAAA,EAAoB;AACnD,UAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AACd,YAAA,OAAA,CAAQ,MAAA,CAAO,UAAU,yDAAyD,CAAA;AAClF,YAAA;AAAA,UACJ;AACA,UAAA,OAAA,CAAQ,MAAA,CAAO,QAAQ,OAAA,CAAQ,MAAA,CAAO,YAAY,YAAA,EAAc,kBAAA,CAAmB,MAAM,CAAC,CAAA;AAC1F,UAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACpB,YAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,GACb,OAAA,CAAQ,OAAO,WAAA,CAAY,UAAA,EAAY,kBAAA,CAAmB,KAAK,IAC/D,OAAA,CAAQ,MAAA,CAAO,WAAA,CAAY,UAAA,EAAY,mBAAmB,GAAG,CAAA;AACnE,YAAA,OAAA,CAAQ,MAAA,CAAO,OAAA;AAAA,cACX,CAAA,EAAA,EAAK,OAAA,CAAQ,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,KAAK,MAAA,CAAO,EAAE,CAAA,EAAG,kBAAA,CAAmB,IAAI,CAAC,IACzE,MAAM,CAAA,SAAA,EAAY,cAAA,CAAe,GAAA,CAAI,UAAU,CAAC,YAAY,GAAA,CAAI,OAAO,CAAA,OAAA,EAAU,GAAA,CAAI,QAAQ,CAAA,EAAA;AAAA,aACrG;AAAA,UACJ;AAAA,QACJ;AAAA,OACJ;AAAA,MACA;AAAA,QACI,OAAA,EAAS,QAAA;AAAA,QACT,WAAA,EAAa,uCAAA;AAAA,QACb,OAAA,EAAS,CAAC,IAAA,EAAM,QAAQ,CAAA;AAAA,QACxB,eAAA,EAAiB,IAAA;AAAA,QACjB,aAAA,EAAe,IAAA;AAAA,QACf,cAAA,EAAgB,OAAO,GAAA,EAAwB,OAAA,KAAkC;AAC7E,UAAA,MAAM,IAAA,GAAO,cAAA,CAAe,GAAA,CAAI,KAAA,IAAS,EAAE,CAAA;AAC3C,UAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,QAAA,EAAoB;AAChD,UAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AACvD,UAAA,IAAI,QAAQ,EAAA,EAAI;AACZ,YAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,CAAA,KAAA,EAAQ,IAAI,CAAA,WAAA,CAAa,CAAA;AACnD,YAAA;AAAA,UACJ;AACA,UAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAC1B,UAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,EAAE,CAAA;AACnB,UAAA,MAAM,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,KAAA,MAAW;AAAA,YACnC,IAAA,EAAA,CAAQ,KAAA,CAAM,MAAM,CAAA,IAAmB,EAAC,EAAG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,IAAI;AAAA,WAC5E,CAAE,CAAA;AACF,UAAA,OAAA,CAAQ,MAAA,CAAO,YAAA,CAAa,CAAA,KAAA,EAAQ,IAAI,CAAA,SAAA,CAAW,CAAA;AAAA,QACvD;AAAA,OACJ;AAAA,MACA;AAAA,QACI,OAAA,EAAS,QAAA;AAAA,QACT,WAAA,EAAa,0BAAA;AAAA,QACb,eAAA,EAAiB,IAAA;AAAA,QACjB,aAAA,EAAe,IAAA;AAAA,QACf,cAAA,EAAgB,OAAO,GAAA,EAAwB,OAAA,KAAkC;AAC7E,UAAA,MAAM,IAAA,CAAK,WAAW,cAAA,CAAe,GAAA,CAAI,SAAS,EAAE,CAAA,EAAG,MAAM,OAAO,CAAA;AAAA,QACxE;AAAA,OACJ;AAAA,MACA;AAAA,QACI,OAAA,EAAS,SAAA;AAAA,QACT,WAAA,EAAa,sCAAA;AAAA,QACb,eAAA,EAAiB,IAAA;AAAA,QACjB,aAAA,EAAe,IAAA;AAAA,QACf,cAAA,EAAgB,OAAO,GAAA,EAAwB,OAAA,KAAkC;AAC7E,UAAA,MAAM,IAAA,CAAK,WAAW,cAAA,CAAe,GAAA,CAAI,SAAS,EAAE,CAAA,EAAG,OAAO,OAAO,CAAA;AAAA,QACzE;AAAA;AACJ,KACJ;AAAA,EAAA;AAAA,EAEA,MAAM,WAAW,OAAA,EAA8C;AAC3D,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,OAAA,CAAQ,MAAM,QAAA,EAAoB;AACnD,IAAA,KAAA,MAAW,OAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA,EAAG;AAC7C,MAAA,IAAA,CAAK,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,IAC9B;AAAA,EACJ;AAAA,EAEA,iBAAiB,OAAA,EAAqC;AAClD,IAAA,MAAM,IAAI,OAAA,CAAQ,UAAA;AAClB,IAAA,YAAA;AAAA,MACI,OAAA;AAAA,MACA,CAAA,CAAE,CAAA,CAAE,uCAAA,EAAyC,mLAAmL;AAAA,KACpO;AACA,IAAA,OAAA,CAAQ,OAAO,OAAA,EAAQ;AACvB,IAAA,UAAA,CAAW,OAAA,EAAS;AAAA,MAChB,CAAC,sCAAA,EAAwC,CAAA,CAAE,CAAA,CAAE,uBAAA,EAAyB,WAAW,CAAC,CAAA;AAAA,MAClF,CAAC,WAAA,EAAa,CAAA,CAAE,CAAA,CAAE,wCAAA,EAA0C,+CAA+C,CAAC,CAAA;AAAA,MAC5G,CAAC,qBAAA,EAAuB,CAAA,CAAE,CAAA,CAAE,yBAAA,EAA2B,aAAa,CAAC,CAAA;AAAA,MACrE,CAAC,oBAAA,EAAsB,CAAA,CAAE,CAAA,CAAE,iCAAA,EAAmC,qBAAqB,CAAC,CAAA;AAAA,MACpF,CAAC,oBAAA,EAAsB,CAAA,CAAE,CAAA,CAAE,oCAAA,EAAsC,2BAA2B,CAAC;AAAA,KAChG,CAAA;AACD,IAAA,OAAA,CAAQ,OAAO,OAAA,EAAQ;AACvB,IAAA,YAAA;AAAA,MACI,OAAA;AAAA,MACA,CAAA,CAAE,CAAA,CAAE,0CAAA,EAA4C,mGAAmG;AAAA,KACvJ;AACA,IAAA,OAAA,CAAQ,OAAO,OAAA,EAAQ;AACvB,IAAA,aAAA,CAAc,OAAA,EAAS;AAAA,MACnB,CAAC,iCAAA,EAAmC,CAAA,CAAE,CAAA,CAAE,+BAAA,EAAiC,iBAAiB,CAAC,CAAA;AAAA,MAC3F,CAAC,kDAAA,EAAoD,CAAA,CAAE,CAAA,CAAE,+BAAA,EAAiC,uBAAuB,CAAC,CAAA;AAAA,MAClH,CAAC,mBAAA,EAAqB,CAAA,CAAE,CAAA,CAAE,qBAAA,EAAuB,UAAU,CAAC;AAAA,KAC/D,CAAA;AAAA,EACL;AAAA,EAEA,MAAM,cAAA,CAAe,CAAA,EAAsB,OAAA,EAA8C;AACrF,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,OAAA,CAAQ,MAAM,QAAA,EAAoB;AACnD,IAAA,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,yDAAA,CAA2D,CAAA;AAAA,EACpG;AAAA,EAEQ,QAAA,CAAS,KAAc,OAAA,EAAqC;AAChE,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA,EAAG;AAC7B,IAAA,MAAM,KAAA,GAAQ,YAAY,YAAY;AAClC,MAAA,IAAI,CAAC,IAAI,OAAA,EAAS;AAClB,MAAA,IAAI;AACA,QAAA,MAAM,OAAA,CAAQ,QAAA,CAAS,cAAA,CAAe,GAAA,CAAI,SAAS,OAAO,CAAA;AAC1D,QAAA,GAAA,CAAI,QAAA,EAAA;AACJ,QAAA,GAAA,CAAI,OAAA,GAAU,KAAK,GAAA,EAAI;AACvB,QAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,QAAA,EAAoB;AAChD,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,GAAA;AAAA,UAAI,CAAC,CAAA,KAC5B,CAAA,CAAE,EAAA,KAAO,IAAI,EAAA,GAAK,EAAE,GAAG,CAAA,EAAG,UAAU,GAAA,CAAI,QAAA,EAAU,OAAA,EAAS,GAAA,CAAI,SAAQ,GAAI;AAAA,SAC/E;AACA,QAAA,OAAA,CAAQ,KAAA,CAAM,WAAA,CAAY,EAAE,IAAA,EAAM,SAAS,CAAA;AAAA,MAC/C,SAAS,CAAA,EAAG;AACR,QAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,CAAA,UAAA,EAAa,GAAA,CAAI,IAAI,aAAa,CAAC,CAAA;AAAA,MAC5D;AAAA,IACJ,CAAA,EAAG,IAAI,UAAU,CAAA;AACjB,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,KAAK,CAAA;AAAA,EACjC;AAAA,EAEQ,QAAQ,EAAA,EAAkB;AAC9B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAChC,IAAA,IAAI,KAAA,EAAO;AACP,MAAA,aAAA,CAAc,KAAK,CAAA;AACnB,MAAA,IAAA,CAAK,MAAA,CAAO,OAAO,EAAE,CAAA;AAAA,IACzB;AAAA,EACJ;AAAA,EAEA,MAAc,UAAA,CAAW,IAAA,EAAc,OAAA,EAAkB,OAAA,EAA8C;AACnG,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,QAAA,EAAoB;AAChD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AAC1D,IAAA,IAAI,WAAW,EAAA,EAAI;AACf,MAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,CAAA,KAAA,EAAQ,IAAI,CAAA,WAAA,CAAa,CAAA;AACnD,MAAA;AAAA,IACJ;AACA,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AAC7B,IAAA,GAAA,CAAI,OAAA,GAAU,OAAA;AACd,IAAA,IAAI,OAAA,EAAS;AACT,MAAA,IAAA,CAAK,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,IAC9B,CAAA,MAAO;AACH,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,IACvB;AACA,IAAA,MAAM,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,KAAA,MAAW;AAAA,MACnC,IAAA,EAAA,CAAQ,KAAA,CAAM,MAAM,CAAA,IAAmB,EAAC,EAAG,GAAA;AAAA,QAAI,CAAC,MAC5C,CAAA,CAAE,IAAA,KAAS,OAAO,EAAE,GAAG,CAAA,EAAG,OAAA,EAAQ,GAAI;AAAA;AAC1C,KACJ,CAAE,CAAA;AACF,IAAA,OAAA,CAAQ,MAAA,CAAO,aAAa,CAAA,KAAA,EAAQ,IAAI,KAAK,OAAA,GAAU,SAAA,GAAY,UAAU,CAAA,CAAE,CAAA;AAAA,EACnF;AACJ;;;AC1PO,IAAM,eAAA,GAAkB;AACxB,IAAM,WAAA,GAAc;;;ACSpB,IAAM,UAAA,GAAyB;AAAA,EAClC,UAAA,EAAY,WAAA;AAAA,EACZ,IAAA,EAAM,mBAAA;AAAA,EACN,UAAA,EAAY,CAAC,IAAI,uBAAA,EAAyB,CAAA;AAAA,EAC1C,YAAA,EAAc;AAAA,IACV,EAAA,EAAI,EAAE,sBAAA,EAAwB,mDAAA,EAA8C;AAAA,IAC5E,EAAA,EAAI,EAAE,sBAAA,EAAwB,yDAAA,EAAiD;AAAA,IAC/E,EAAA,EAAI,EAAE,sBAAA,EAAwB,uDAAA,EAA4C;AAAA,IAC1E,EAAA,EAAI,EAAE,sBAAA,EAAwB,mDAAA,EAA2C;AAAA,IACzE,EAAA,EAAI,EAAE,sBAAA,EAAwB,4CAAA,EAA6C;AAAA,IAC3E,EAAA,EAAI,EAAE,sBAAA,EAAwB,kGAAA,EAAmB;AAAA,IACjD,EAAA,EAAI,EAAE,sBAAA,EAAwB,qGAAA,EAAsB;AAAA,IACpD,EAAA,EAAI,EAAE,sBAAA,EAAwB,kDAAA,EAAW;AAAA,IACzC,EAAA,EAAI,EAAE,sBAAA,EAAwB,iQAAA,EAAgD;AAAA,IAC9E,EAAA,EAAI,EAAE,sBAAA,EAAwB,8DAAA;AAAgD;AAEtF","file":"public-api.mjs","sourcesContent":["const MIN_INTERVAL_MS = 10_000; // 10 seconds minimum\n\nexport function parseInterval(input: string): number | null {\n if (!input.trim()) return null;\n if (/^\\d+$/.test(input.trim())) {\n const ms = parseInt(input.trim(), 10) * 1000;\n return ms >= MIN_INTERVAL_MS ? ms : null;\n }\n const pattern = /^(?:(\\d+)h)?(?:(\\d+)m)?(?:(\\d+)s)?$/;\n const match = input.trim().match(pattern);\n if (!match || match[0] === '') return null;\n const h = parseInt(match[1] ?? '0', 10);\n const m = parseInt(match[2] ?? '0', 10);\n const s = parseInt(match[3] ?? '0', 10);\n const total = h * 3_600_000 + m * 60_000 + s * 1_000;\n return total >= MIN_INTERVAL_MS ? total : null;\n}\n\nexport function formatInterval(ms: number): string {\n const h = Math.floor(ms / 3_600_000);\n const m = Math.floor((ms % 3_600_000) / 60_000);\n const s = Math.floor((ms % 60_000) / 1_000);\n const parts: string[] = [];\n if (h > 0) parts.push(`${h}h`);\n if (m > 0) parts.push(`${m}m`);\n if (s > 0) parts.push(`${s}s`);\n return parts.join(' ') || '0s';\n}\n","import {\n ICliCommandProcessor,\n ICliExecutionContext,\n CliProcessCommand,\n ICliCommandAuthor,\n CliProcessorMetadata,\n CliIcon,\n CliStateConfiguration,\n DefaultLibraryAuthor,\n CliForegroundColor,\n ICliCommandChildProcessor,\n writeExamples,\n writeUsage,\n writeWrapped,\n joinShellWords,\n} from '@qodalis/cli-core';\nimport { parseInterval, formatInterval } from '../cron-utils';\n\ninterface CronJob {\n id: string;\n name: string;\n command: string;\n intervalMs: number;\n enabled: boolean;\n runCount: number;\n lastRun?: number;\n}\n\ninterface CronState {\n jobs: CronJob[];\n}\n\n/** The text after the first `count` shell words, as typed (quotes kept). */\nfunction textAfterWords(text: string, count: number): string {\n const word = /\\s*(?:\\\\.|\"(?:[^\"\\\\]|\\\\.)*\"|'[^']*'|[^\\s\"'\\\\]|[\"'\\\\])+/y;\n for (let i = 0; i < count; i++) {\n if (!word.exec(text)) return '';\n }\n return text.slice(word.lastIndex).trim();\n}\n\nexport class CliCronCommandProcessor implements ICliCommandProcessor {\n command = 'cron';\n description = 'Schedule commands to run on a repeating interval';\n author: ICliCommandAuthor = DefaultLibraryAuthor;\n metadata: CliProcessorMetadata = { icon: CliIcon.Clock };\n\n stateConfiguration: CliStateConfiguration = {\n storeName: 'cron',\n initialState: { jobs: [] } as CronState,\n };\n\n private timers = new Map<string, ReturnType<typeof setInterval>>();\n\n processors: ICliCommandChildProcessor[] = [\n {\n command: 'add',\n description: 'Add a cron job: cron add <name> <interval> <command>',\n acceptsRawInput: true,\n valueRequired: true,\n processCommand: async (cmd: CliProcessCommand, context: ICliExecutionContext) => {\n const parts = cmd.positionals ?? [];\n if (parts.length < 3) {\n context.writer.writeError('Usage: cron add <name> <interval> <command>');\n context.writer.writeln(' Example: cron add ping 5m echo heartbeat');\n return;\n }\n // The command: one quoted argument, or else the rest as typed\n const [name, intervalStr, ...cmdParts] = parts;\n const command =\n cmdParts.length === 1\n ? cmdParts[0]\n : textAfterWords(cmd.value ?? '', 2) || cmdParts.join(' ');\n const intervalMs = parseInterval(intervalStr);\n if (!intervalMs) {\n context.writer.writeError(`Invalid interval \"${intervalStr}\". Min 10s. Examples: 10s, 5m, 1h`);\n return;\n }\n const state = context.state.getState<CronState>();\n if (state.jobs.find((j) => j.name === name)) {\n context.writer.writeError(`Job \"${name}\" already exists. Remove it first: cron remove ${name}`);\n return;\n }\n const job: CronJob = {\n id: `cron_${Date.now()}`,\n name,\n command,\n intervalMs,\n enabled: true,\n runCount: 0,\n };\n await context.state.update((saved) => ({\n jobs: [...((saved['jobs'] as CronJob[]) ?? []), job],\n }));\n this.startJob(job, context);\n context.writer.writeSuccess(\n `Job \"${name}\" added — runs every ${formatInterval(intervalMs)}: ${command}`,\n );\n },\n },\n {\n command: 'list',\n description: 'List all cron jobs',\n aliases: ['ls'],\n processCommand: async (_: CliProcessCommand, context: ICliExecutionContext) => {\n const { jobs } = context.state.getState<CronState>();\n if (!jobs.length) {\n context.writer.writeInfo('No cron jobs. Use: cron add <name> <interval> <command>');\n return;\n }\n context.writer.writeln(context.writer.wrapInColor('Cron Jobs:', CliForegroundColor.Yellow));\n for (const job of jobs) {\n const status = job.enabled\n ? context.writer.wrapInColor('enabled ', CliForegroundColor.Green)\n : context.writer.wrapInColor('disabled', CliForegroundColor.Red);\n context.writer.writeln(\n ` ${context.writer.wrapInColor(job.name.padEnd(12), CliForegroundColor.Cyan)}` +\n `[${status}] every ${formatInterval(job.intervalMs)} \\u2192 ${job.command} (ran ${job.runCount}x)`,\n );\n }\n },\n },\n {\n command: 'remove',\n description: 'Remove a cron job: cron remove <name>',\n aliases: ['rm', 'delete'],\n acceptsRawInput: true,\n valueRequired: true,\n processCommand: async (cmd: CliProcessCommand, context: ICliExecutionContext) => {\n const name = joinShellWords(cmd.value ?? '');\n const state = context.state.getState<CronState>();\n const idx = state.jobs.findIndex((j) => j.name === name);\n if (idx === -1) {\n context.writer.writeError(`Job \"${name}\" not found`);\n return;\n }\n const job = state.jobs[idx];\n this.stopJob(job.id);\n await context.state.update((saved) => ({\n jobs: ((saved['jobs'] as CronJob[]) ?? []).filter((j) => j.name !== name),\n }));\n context.writer.writeSuccess(`Job \"${name}\" removed`);\n },\n },\n {\n command: 'enable',\n description: 'Enable a paused cron job',\n acceptsRawInput: true,\n valueRequired: true,\n processCommand: async (cmd: CliProcessCommand, context: ICliExecutionContext) => {\n await this.setEnabled(joinShellWords(cmd.value ?? ''), true, context);\n },\n },\n {\n command: 'disable',\n description: 'Pause a cron job without removing it',\n acceptsRawInput: true,\n valueRequired: true,\n processCommand: async (cmd: CliProcessCommand, context: ICliExecutionContext) => {\n await this.setEnabled(joinShellWords(cmd.value ?? ''), false, context);\n },\n },\n ];\n\n async initialize(context: ICliExecutionContext): Promise<void> {\n const { jobs } = context.state.getState<CronState>();\n for (const job of jobs.filter((j) => j.enabled)) {\n this.startJob(job, context);\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.cron.help.run_command_again_again', 'Run a command again and again at a fixed interval while the terminal is open. Jobs are saved: they start again when the terminal starts, and can be paused without removing them.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['cron add <name> <interval> <command>', t.t('cli.cron.help.add_job', 'Add a job')],\n ['cron list', t.t('cli.cron.help.jobs_interval_status_run', 'Jobs with interval, status and run count (ls)')],\n ['cron disable <name>', t.t('cli.cron.help.pause_job', 'Pause a job')],\n ['cron enable <name>', t.t('cli.cron.help.resume_paused_job', 'Resume a paused job')],\n ['cron remove <name>', t.t('cli.cron.help.remove_job_rm_delete', 'Remove a job (rm, delete)')],\n ]);\n context.writer.writeln();\n writeWrapped(\n context,\n t.t('cli.cron.help.intervals_seconds_30_hours', 'Intervals: seconds (30), or hours, minutes and seconds (1h, 5m, 1h30m, 90s); at least 10 seconds.'),\n );\n context.writer.writeln();\n writeExamples(context, [\n ['cron add ping 5m echo heartbeat', t.t('cli.cron.help.every_5_minutes', 'Every 5 minutes')],\n ['cron add backup 1h30m server jobs trigger backup', t.t('cli.cron.help.every_hour_half', 'Every hour and a half')],\n ['cron disable ping', t.t('cli.cron.help.pause', 'Pause it')],\n ]);\n }\n\n async processCommand(_: CliProcessCommand, context: ICliExecutionContext): Promise<void> {\n const { jobs } = context.state.getState<CronState>();\n context.writer.writeln(`${jobs.length} job(s). Sub-commands: add, list, remove, enable, disable`);\n }\n\n private startJob(job: CronJob, context: ICliExecutionContext): void {\n if (this.timers.has(job.id)) return; // already running\n const timer = setInterval(async () => {\n if (!job.enabled) return;\n try {\n await context.executor.executeCommand(job.command, context);\n job.runCount++;\n job.lastRun = Date.now();\n const state = context.state.getState<CronState>();\n const updated = state.jobs.map((j) =>\n j.id === job.id ? { ...j, runCount: job.runCount, lastRun: job.lastRun } : j,\n );\n context.state.updateState({ jobs: updated });\n } catch (e) {\n context.logger.error(`Cron job \"${job.name}\" failed:`, e);\n }\n }, job.intervalMs);\n this.timers.set(job.id, timer);\n }\n\n private stopJob(id: string): void {\n const timer = this.timers.get(id);\n if (timer) {\n clearInterval(timer);\n this.timers.delete(id);\n }\n }\n\n private async setEnabled(name: string, enabled: boolean, context: ICliExecutionContext): Promise<void> {\n const state = context.state.getState<CronState>();\n const jobIdx = state.jobs.findIndex((j) => j.name === name);\n if (jobIdx === -1) {\n context.writer.writeError(`Job \"${name}\" not found`);\n return;\n }\n const job = state.jobs[jobIdx];\n job.enabled = enabled;\n if (enabled) {\n this.startJob(job, context);\n } else {\n this.stopJob(job.id);\n }\n await context.state.update((saved) => ({\n jobs: ((saved['jobs'] as CronJob[]) ?? []).map((j) =>\n j.name === name ? { ...j, enabled } : j,\n ),\n }));\n context.writer.writeSuccess(`Job \"${name}\" ${enabled ? 'enabled' : 'disabled'}`);\n }\n}\n","\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0';\nexport const API_VERSION = 2;\n ","/*\n * Public API Surface of cron\n */\n\nexport * from './lib/processors/cli-cron-command-processor';\nexport * from './lib/cron-utils';\nexport * from './lib/version';\n\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliCronCommandProcessor } from './lib/processors/cli-cron-command-processor';\nimport { API_VERSION } from './lib/version';\n\nexport const cronModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-cron',\n processors: [new CliCronCommandProcessor()],\n translations: {\n es: { 'cli.cron.description': 'Programar comandos para ejecución periódica' },\n fr: { 'cli.cron.description': 'Planifier des commandes à exécution périodique' },\n de: { 'cli.cron.description': 'Befehle für regelmäßige Ausführung planen' },\n pt: { 'cli.cron.description': 'Agendar comandos para execução periódica' },\n it: { 'cli.cron.description': 'Pianificare comandi a esecuzione periodica' },\n ja: { 'cli.cron.description': 'コマンドの定期実行をスケジュール' },\n ko: { 'cli.cron.description': '명령어를 주기적으로 실행하도록 예약' },\n zh: { 'cli.cron.description': '定时重复执行命令' },\n ru: { 'cli.cron.description': 'Планирование периодического выполнения команд' },\n ro: { 'cli.cron.description': 'Programează comenzi pentru execuție periodică' },\n },\n};\n"]}
1
+ {"version":3,"sources":["../../packages/plugins/cron/src/lib/cron-utils.ts","../../packages/plugins/cron/src/lib/processors/cli-cron-command-processor.ts","../../packages/plugins/cron/src/lib/version.ts","../../packages/plugins/cron/src/public-api.ts"],"names":[],"mappings":"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","file":"public-api.mjs","sourcesContent":["const MIN_INTERVAL_MS = 10_000; // 10 seconds minimum\n\nexport function parseInterval(input: string): number | null {\n if (!input.trim()) return null;\n if (/^\\d+$/.test(input.trim())) {\n const ms = parseInt(input.trim(), 10) * 1000;\n return ms >= MIN_INTERVAL_MS ? ms : null;\n }\n const pattern = /^(?:(\\d+)h)?(?:(\\d+)m)?(?:(\\d+)s)?$/;\n const match = input.trim().match(pattern);\n if (!match || match[0] === '') return null;\n const h = parseInt(match[1] ?? '0', 10);\n const m = parseInt(match[2] ?? '0', 10);\n const s = parseInt(match[3] ?? '0', 10);\n const total = h * 3_600_000 + m * 60_000 + s * 1_000;\n return total >= MIN_INTERVAL_MS ? total : null;\n}\n\nexport function formatInterval(ms: number): string {\n const h = Math.floor(ms / 3_600_000);\n const m = Math.floor((ms % 3_600_000) / 60_000);\n const s = Math.floor((ms % 60_000) / 1_000);\n const parts: string[] = [];\n if (h > 0) parts.push(`${h}h`);\n if (m > 0) parts.push(`${m}m`);\n if (s > 0) parts.push(`${s}s`);\n return parts.join(' ') || '0s';\n}\n","import {\n ICliCommandProcessor,\n ICliExecutionContext,\n CliProcessCommand,\n ICliCommandAuthor,\n CliProcessorMetadata,\n CliIcon,\n CliStateConfiguration,\n DefaultLibraryAuthor,\n CliForegroundColor,\n ICliCommandChildProcessor,\n writeExamples,\n writeUsage,\n writeWrapped,\n joinShellWords,\n} from '@qodalis/cli-core';\nimport { parseInterval, formatInterval } from '../cron-utils';\n\ninterface CronJob {\n id: string;\n name: string;\n command: string;\n intervalMs: number;\n enabled: boolean;\n runCount: number;\n lastRun?: number;\n}\n\ninterface CronState {\n jobs: CronJob[];\n}\n\n/** The text after the first `count` shell words, as typed (quotes kept). */\nfunction textAfterWords(text: string, count: number): string {\n const word = /\\s*(?:\\\\.|\"(?:[^\"\\\\]|\\\\.)*\"|'[^']*'|[^\\s\"'\\\\]|[\"'\\\\])+/y;\n for (let i = 0; i < count; i++) {\n if (!word.exec(text)) return '';\n }\n return text.slice(word.lastIndex).trim();\n}\n\nexport class CliCronCommandProcessor implements ICliCommandProcessor {\n command = 'cron';\n description = 'Schedule commands to run on a repeating interval';\n author: ICliCommandAuthor = DefaultLibraryAuthor;\n metadata: CliProcessorMetadata = { icon: CliIcon.Clock };\n\n stateConfiguration: CliStateConfiguration = {\n storeName: 'cron',\n initialState: { jobs: [] } as CronState,\n };\n\n private timers = new Map<string, ReturnType<typeof setInterval>>();\n\n processors: ICliCommandChildProcessor[] = [\n {\n command: 'add',\n description: 'Add a cron job: cron add <name> <interval> <command>',\n acceptsRawInput: true,\n valueRequired: true,\n processCommand: async (cmd: CliProcessCommand, context: ICliExecutionContext) => {\n const parts = cmd.positionals ?? [];\n if (parts.length < 3) {\n context.writer.writeError('Usage: cron add <name> <interval> <command>');\n context.writer.writeln(' Example: cron add ping 5m echo heartbeat');\n return;\n }\n // The command: one quoted argument, or else the rest as typed\n const [name, intervalStr, ...cmdParts] = parts;\n const command =\n cmdParts.length === 1\n ? cmdParts[0]\n : textAfterWords(cmd.value ?? '', 2) || cmdParts.join(' ');\n const intervalMs = parseInterval(intervalStr);\n if (!intervalMs) {\n context.writer.writeError(`Invalid interval \"${intervalStr}\". Min 10s. Examples: 10s, 5m, 1h`);\n return;\n }\n const state = context.state.getState<CronState>();\n if (state.jobs.find((j) => j.name === name)) {\n context.writer.writeError(`Job \"${name}\" already exists. Remove it first: cron remove ${name}`);\n return;\n }\n const job: CronJob = {\n id: `cron_${Date.now()}`,\n name,\n command,\n intervalMs,\n enabled: true,\n runCount: 0,\n };\n await context.state.update((saved) => ({\n jobs: [...((saved['jobs'] as CronJob[]) ?? []), job],\n }));\n this.startJob(job, context);\n context.writer.writeSuccess(\n `Job \"${name}\" added — runs every ${formatInterval(intervalMs)}: ${command}`,\n );\n },\n },\n {\n command: 'list',\n description: 'List all cron jobs',\n aliases: ['ls'],\n processCommand: async (_: CliProcessCommand, context: ICliExecutionContext) => {\n const { jobs } = context.state.getState<CronState>();\n if (!jobs.length) {\n context.writer.writeInfo('No cron jobs. Use: cron add <name> <interval> <command>');\n return;\n }\n context.writer.writeln(context.writer.wrapInColor('Cron Jobs:', CliForegroundColor.Yellow));\n for (const job of jobs) {\n const status = job.enabled\n ? context.writer.wrapInColor('enabled ', CliForegroundColor.Green)\n : context.writer.wrapInColor('disabled', CliForegroundColor.Red);\n context.writer.writeln(\n ` ${context.writer.wrapInColor(job.name.padEnd(12), CliForegroundColor.Cyan)}` +\n `[${status}] every ${formatInterval(job.intervalMs)} \\u2192 ${job.command} (ran ${job.runCount}x)`,\n );\n }\n },\n },\n {\n command: 'remove',\n description: 'Remove a cron job: cron remove <name>',\n aliases: ['rm', 'delete'],\n acceptsRawInput: true,\n valueRequired: true,\n processCommand: async (cmd: CliProcessCommand, context: ICliExecutionContext) => {\n const name = joinShellWords(cmd.value ?? '');\n const state = context.state.getState<CronState>();\n const idx = state.jobs.findIndex((j) => j.name === name);\n if (idx === -1) {\n context.writer.writeError(`Job \"${name}\" not found`);\n return;\n }\n const job = state.jobs[idx];\n this.stopJob(job.id);\n await context.state.update((saved) => ({\n jobs: ((saved['jobs'] as CronJob[]) ?? []).filter((j) => j.name !== name),\n }));\n context.writer.writeSuccess(`Job \"${name}\" removed`);\n },\n },\n {\n command: 'enable',\n description: 'Enable a paused cron job',\n acceptsRawInput: true,\n valueRequired: true,\n processCommand: async (cmd: CliProcessCommand, context: ICliExecutionContext) => {\n await this.setEnabled(joinShellWords(cmd.value ?? ''), true, context);\n },\n },\n {\n command: 'disable',\n description: 'Pause a cron job without removing it',\n acceptsRawInput: true,\n valueRequired: true,\n processCommand: async (cmd: CliProcessCommand, context: ICliExecutionContext) => {\n await this.setEnabled(joinShellWords(cmd.value ?? ''), false, context);\n },\n },\n ];\n\n async initialize(context: ICliExecutionContext): Promise<void> {\n const { jobs } = context.state.getState<CronState>();\n for (const job of jobs.filter((j) => j.enabled)) {\n this.startJob(job, context);\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.cron.help.run_command_again_again', 'Run a command again and again at a fixed interval while the terminal is open. Jobs are saved: they start again when the terminal starts, and can be paused without removing them.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['cron add <name> <interval> <command>', t.t('cli.cron.help.add_job', 'Add a job')],\n ['cron list', t.t('cli.cron.help.jobs_interval_status_run', 'Jobs with interval, status and run count (ls)')],\n ['cron disable <name>', t.t('cli.cron.help.pause_job', 'Pause a job')],\n ['cron enable <name>', t.t('cli.cron.help.resume_paused_job', 'Resume a paused job')],\n ['cron remove <name>', t.t('cli.cron.help.remove_job_rm_delete', 'Remove a job (rm, delete)')],\n ]);\n context.writer.writeln();\n writeWrapped(\n context,\n t.t('cli.cron.help.intervals_seconds_30_hours', 'Intervals: seconds (30), or hours, minutes and seconds (1h, 5m, 1h30m, 90s); at least 10 seconds.'),\n );\n context.writer.writeln();\n writeExamples(context, [\n ['cron add ping 5m echo heartbeat', t.t('cli.cron.help.every_5_minutes', 'Every 5 minutes')],\n ['cron add backup 1h30m server jobs trigger backup', t.t('cli.cron.help.every_hour_half', 'Every hour and a half')],\n ['cron disable ping', t.t('cli.cron.help.pause', 'Pause it')],\n ]);\n }\n\n async processCommand(_: CliProcessCommand, context: ICliExecutionContext): Promise<void> {\n const { jobs } = context.state.getState<CronState>();\n context.writer.writeln(`${jobs.length} job(s). Sub-commands: add, list, remove, enable, disable`);\n }\n\n private startJob(job: CronJob, context: ICliExecutionContext): void {\n if (this.timers.has(job.id)) return; // already running\n const timer = setInterval(async () => {\n if (!job.enabled) return;\n try {\n await context.executor.executeCommand(job.command, context);\n job.runCount++;\n job.lastRun = Date.now();\n const state = context.state.getState<CronState>();\n const updated = state.jobs.map((j) =>\n j.id === job.id ? { ...j, runCount: job.runCount, lastRun: job.lastRun } : j,\n );\n context.state.updateState({ jobs: updated });\n } catch (e) {\n context.logger.error(`Cron job \"${job.name}\" failed:`, e);\n }\n }, job.intervalMs);\n this.timers.set(job.id, timer);\n }\n\n private stopJob(id: string): void {\n const timer = this.timers.get(id);\n if (timer) {\n clearInterval(timer);\n this.timers.delete(id);\n }\n }\n\n private async setEnabled(name: string, enabled: boolean, context: ICliExecutionContext): Promise<void> {\n const state = context.state.getState<CronState>();\n const jobIdx = state.jobs.findIndex((j) => j.name === name);\n if (jobIdx === -1) {\n context.writer.writeError(`Job \"${name}\" not found`);\n return;\n }\n const job = state.jobs[jobIdx];\n job.enabled = enabled;\n if (enabled) {\n this.startJob(job, context);\n } else {\n this.stopJob(job.id);\n }\n await context.state.update((saved) => ({\n jobs: ((saved['jobs'] as CronJob[]) ?? []).map((j) =>\n j.name === name ? { ...j, enabled } : j,\n ),\n }));\n context.writer.writeSuccess(`Job \"${name}\" ${enabled ? 'enabled' : 'disabled'}`);\n }\n}\n","\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.1.0';\nexport const API_VERSION = 2;\n ","/*\n * Public API Surface of cron\n */\n\nexport * from './lib/processors/cli-cron-command-processor';\nexport * from './lib/cron-utils';\nexport * from './lib/version';\n\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliCronCommandProcessor } from './lib/processors/cli-cron-command-processor';\nimport { API_VERSION } from './lib/version';\n\nexport const cronModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-cron',\n processors: [new CliCronCommandProcessor()],\n translations: {\n es: { 'cli.cron.description': 'Programar comandos para ejecución periódica' },\n fr: { 'cli.cron.description': 'Planifier des commandes à exécution périodique' },\n de: { 'cli.cron.description': 'Befehle für regelmäßige Ausführung planen' },\n pt: { 'cli.cron.description': 'Agendar comandos para execução periódica' },\n it: { 'cli.cron.description': 'Pianificare comandi a esecuzione periodica' },\n ja: { 'cli.cron.description': 'コマンドの定期実行をスケジュール' },\n ko: { 'cli.cron.description': '명령어를 주기적으로 실행하도록 예약' },\n zh: { 'cli.cron.description': '定时重复执行命令' },\n ru: { 'cli.cron.description': 'Планирование периодического выполнения команд' },\n ro: { 'cli.cron.description': 'Programează comenzi pentru execuție periodică' },\n },\n};\n"]}