@qodalis/cli-cron 2.1.1 → 2.3.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.1.1",
3
+ "version": "2.3.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.1.1"
21
+ "@qodalis/cli-core": "2.3.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.1.1";
22
+ declare const LIBRARY_VERSION = "2.3.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.1.1";
22
+ declare const LIBRARY_VERSION = "2.3.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.1.1";
243
+ var LIBRARY_VERSION = "2.3.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":";;;;;;;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,GAA4BA,4BAAA;AAC5B,IAAA,IAAA,CAAA,QAAA,GAAiC,EAAE,IAAA,EAAMC,eAAA,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,EAAcC,0BAAA,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,EAAYA,0BAAA,CAAmB,KAAK,IAC/D,OAAA,CAAQ,MAAA,CAAO,WAAA,CAAY,UAAA,EAAYA,2BAAmB,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,EAAGA,0BAAA,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,GAAOC,sBAAA,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,WAAWA,sBAAA,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,WAAWA,sBAAA,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,IAAAC,oBAAA;AAAA,MACI,OAAA;AAAA,MACA,CAAA,CAAE,CAAA,CAAE,uCAAA,EAAyC,mLAAmL;AAAA,KACpO;AACA,IAAA,OAAA,CAAQ,OAAO,OAAA,EAAQ;AACvB,IAAAC,kBAAA,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,IAAAD,oBAAA;AAAA,MACI,OAAA;AAAA,MACA,CAAA,CAAE,CAAA,CAAE,0CAAA,EAA4C,mGAAmG;AAAA,KACvJ;AACA,IAAA,OAAA,CAAQ,OAAO,OAAA,EAAQ;AACvB,IAAAE,qBAAA,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.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.1';\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.3.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.1.1";
241
+ var LIBRARY_VERSION = "2.3.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":"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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.1';\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":";;;;;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.3.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"]}
@@ -2139,65 +2139,6 @@ var cron = (() => {
2139
2139
  }
2140
2140
  }
2141
2141
  };
2142
- function writeColumns(context, rows, formatLeft, formatRight) {
2143
- const width = Math.max(...rows.map(([left]) => left.length)) + 2;
2144
- for (const [left, right] of rows) {
2145
- context.writer.writeln(
2146
- ` ${formatLeft(left.padEnd(width))}${formatRight(right)}`
2147
- );
2148
- }
2149
- }
2150
- function writeUsage(context, rows) {
2151
- const { writer, translator } = context;
2152
- writer.writeln(`\u{1F4CB} ${translator.t("cli.common.usage", "Usage:")}`);
2153
- writeColumns(
2154
- context,
2155
- rows,
2156
- (cmd) => writer.wrapInColor(
2157
- cmd,
2158
- "\x1B[36m"
2159
- /* Cyan */
2160
- ),
2161
- (text) => text
2162
- );
2163
- }
2164
- function writeExamples(context, rows) {
2165
- const { writer, translator } = context;
2166
- writer.writeln(`\u{1F4DD} ${translator.t("cli.common.examples", "Examples:")}`);
2167
- writeColumns(
2168
- context,
2169
- rows,
2170
- (cmd) => cmd,
2171
- (comment) => writer.wrapInColor(
2172
- `# ${comment}`,
2173
- "\x1B[32m"
2174
- /* Green */
2175
- )
2176
- );
2177
- }
2178
- function writeWrapped(context, text, indent = 0) {
2179
- const cols = context.terminal?.cols ?? 80;
2180
- const width = Math.max(20, Math.min(cols - 1, 100) - indent);
2181
- const pad = " ".repeat(indent);
2182
- let line = "";
2183
- for (const word of text.split(/\s+/).filter(Boolean)) {
2184
- if (line && visibleLength2(line) + 1 + visibleLength2(word) > width) {
2185
- context.writer.writeln(pad + line);
2186
- line = word;
2187
- } else {
2188
- line = line ? `${line} ${word}` : word;
2189
- }
2190
- }
2191
- if (line) context.writer.writeln(pad + line);
2192
- }
2193
- function visibleLength2(text) {
2194
- return text.replace(/\x1b\[[0-9;]*m/g, "").length;
2195
- }
2196
- var bootCliModule = async (module2) => {
2197
- if (typeof window !== "undefined" && window.__cliModuleRegistry) {
2198
- await window.__cliModuleRegistry.register(module2);
2199
- }
2200
- };
2201
2142
  var DefaultThemes = {
2202
2143
  default: {
2203
2144
  background: "#070b14",
@@ -2222,6 +2163,31 @@ var cron = (() => {
2222
2163
  brightCyan: "#a5f3fc",
2223
2164
  brightWhite: "#f1f5f9"
2224
2165
  },
2166
+ // Soft grey paper and slate text; every color reads at 4.5:1 or more on the background
2167
+ light: {
2168
+ background: "#f7f8fa",
2169
+ foreground: "#334155",
2170
+ cursor: "#4f46e5",
2171
+ cursorAccent: "#f7f8fa",
2172
+ selectionBackground: "#d9def7",
2173
+ selectionForeground: "#1e293b",
2174
+ black: "#334155",
2175
+ red: "#c93c37",
2176
+ green: "#2c7a4b",
2177
+ yellow: "#946200",
2178
+ blue: "#3d5bd9",
2179
+ magenta: "#8b3fc7",
2180
+ cyan: "#0e7586",
2181
+ white: "#5b6577",
2182
+ brightBlack: "#667085",
2183
+ brightRed: "#b42a25",
2184
+ brightGreen: "#1f6a3d",
2185
+ brightYellow: "#7a5100",
2186
+ brightBlue: "#2f47bd",
2187
+ brightMagenta: "#7431ad",
2188
+ brightCyan: "#0a6170",
2189
+ brightWhite: "#1e293b"
2190
+ },
2225
2191
  classic: {
2226
2192
  background: "#0c0c0c",
2227
2193
  foreground: "#cccccc",
@@ -2833,6 +2799,96 @@ var cron = (() => {
2833
2799
  }
2834
2800
  };
2835
2801
  DefaultThemes.yellow = DefaultThemes.highContrastLight;
2802
+ var CliPanelPalettes = Object.freeze({
2803
+ dark: Object.freeze({
2804
+ background: "#070b14",
2805
+ headerBackground: "#0f1623",
2806
+ border: "#1e293b",
2807
+ text: "#e2e8f0",
2808
+ textSecondary: "#94a3b8",
2809
+ accent: "#818cf8",
2810
+ hoverBackground: "rgba(129, 140, 248, 0.12)",
2811
+ activeBackground: "rgba(129, 140, 248, 0.22)",
2812
+ danger: "#f87171",
2813
+ shadow: "rgba(0, 0, 0, 0.45)"
2814
+ }),
2815
+ // Soft grey paper instead of pure white, slate text rather than black: easier on the eyes
2816
+ light: Object.freeze({
2817
+ background: "#f7f8fa",
2818
+ headerBackground: "#eceff3",
2819
+ border: "#d9dee6",
2820
+ text: "#1e293b",
2821
+ textSecondary: "#5b6577",
2822
+ accent: "#4f46e5",
2823
+ hoverBackground: "rgba(30, 41, 59, 0.06)",
2824
+ activeBackground: "rgba(79, 70, 229, 0.12)",
2825
+ danger: "#c93c37",
2826
+ shadow: "rgba(15, 23, 42, 0.12)"
2827
+ })
2828
+ });
2829
+ var PALETTE_TERMINALS = {
2830
+ dark: DefaultThemes.default,
2831
+ light: DefaultThemes.light
2832
+ };
2833
+ function writeColumns(context, rows, formatLeft, formatRight) {
2834
+ const width = Math.max(...rows.map(([left]) => left.length)) + 2;
2835
+ for (const [left, right] of rows) {
2836
+ context.writer.writeln(
2837
+ ` ${formatLeft(left.padEnd(width))}${formatRight(right)}`
2838
+ );
2839
+ }
2840
+ }
2841
+ function writeUsage(context, rows) {
2842
+ const { writer, translator } = context;
2843
+ writer.writeln(`\u{1F4CB} ${translator.t("cli.common.usage", "Usage:")}`);
2844
+ writeColumns(
2845
+ context,
2846
+ rows,
2847
+ (cmd) => writer.wrapInColor(
2848
+ cmd,
2849
+ "\x1B[36m"
2850
+ /* Cyan */
2851
+ ),
2852
+ (text) => text
2853
+ );
2854
+ }
2855
+ function writeExamples(context, rows) {
2856
+ const { writer, translator } = context;
2857
+ writer.writeln(`\u{1F4DD} ${translator.t("cli.common.examples", "Examples:")}`);
2858
+ writeColumns(
2859
+ context,
2860
+ rows,
2861
+ (cmd) => cmd,
2862
+ (comment) => writer.wrapInColor(
2863
+ `# ${comment}`,
2864
+ "\x1B[32m"
2865
+ /* Green */
2866
+ )
2867
+ );
2868
+ }
2869
+ function writeWrapped(context, text, indent = 0) {
2870
+ const cols = context.terminal?.cols ?? 80;
2871
+ const width = Math.max(20, Math.min(cols - 1, 100) - indent);
2872
+ const pad = " ".repeat(indent);
2873
+ let line = "";
2874
+ for (const word of text.split(/\s+/).filter(Boolean)) {
2875
+ if (line && visibleLength2(line) + 1 + visibleLength2(word) > width) {
2876
+ context.writer.writeln(pad + line);
2877
+ line = word;
2878
+ } else {
2879
+ line = line ? `${line} ${word}` : word;
2880
+ }
2881
+ }
2882
+ if (line) context.writer.writeln(pad + line);
2883
+ }
2884
+ function visibleLength2(text) {
2885
+ return text.replace(/\x1b\[[0-9;]*m/g, "").length;
2886
+ }
2887
+ var bootCliModule = async (module2) => {
2888
+ if (typeof window !== "undefined" && window.__cliModuleRegistry) {
2889
+ await window.__cliModuleRegistry.register(module2);
2890
+ }
2891
+ };
2836
2892
  var DefaultThemeInfos = {
2837
2893
  default: {
2838
2894
  theme: DefaultThemes.default,
@@ -2840,6 +2896,12 @@ var cron = (() => {
2840
2896
  tags: ["built-in"],
2841
2897
  description: "Dark indigo theme with soft pastels"
2842
2898
  },
2899
+ light: {
2900
+ theme: DefaultThemes.light,
2901
+ category: "light",
2902
+ tags: ["built-in"],
2903
+ description: "Light counterpart of the default theme"
2904
+ },
2843
2905
  classic: {
2844
2906
  theme: DefaultThemes.classic,
2845
2907
  category: "dark",