{"version":3,"sources":["../src/croniq.ts","../package.json","../src/cli.ts"],"names":["MONTH_NAMES","DOW_NAMES","DOW_LABELS","MONTH_LABELS","MACROS","LIMIT","resolveName","token","spec","lower","idx","parseField","raw","normalize","v","values","out","part","rangePart","stepPart","step","lo","hi","a","b","bound","localAccessor","d","utcAccessor","Cron","expression","options","trimmed","parts","secRaw","minRaw","hourRaw","domRaw","monthRaw","dowRaw","sec","min","hour","dom","month","dow","dm","dw","date","from","count","cursor","i","probe","dir","secMax","unit","t","iter","two","time","everyMin","everyHour","listText","dowText","m","capitalize","sorted","parse","isValid","package_default","HELP","parseFlags","argv","f","fmt","main","cmd","expr","ok","cron","e","runs"],"mappings":";aAcA,IAAMA,CAAAA,CAAc,CAAC,KAAA,CAAO,KAAA,CAAO,MAAO,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,MAAO,KAAA,CAAO,KAAK,EACjGC,CAAAA,CAAY,CAAC,MAAO,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,KAAK,EAC5DC,CAAAA,CAAa,CAAC,SAAU,QAAA,CAAU,SAAA,CAAW,YAAa,UAAA,CAAY,QAAA,CAAU,UAAU,CAAA,CAC1FC,CAAAA,CAAe,CACnB,UAAW,UAAA,CAAY,OAAA,CAAS,OAAA,CAAS,KAAA,CAAO,MAAA,CAChD,MAAA,CAAQ,SAAU,WAAA,CAAa,SAAA,CAAW,UAAA,CAAY,UACxD,CAAA,CAEMC,CAAAA,CAAiC,CACrC,SAAA,CAAW,WAAA,CACX,YAAa,WAAA,CACb,UAAA,CAAY,YACZ,SAAA,CAAW,WAAA,CACX,QAAA,CAAU,WAAA,CACV,WAAA,CAAa,WAAA,CACb,UAAW,WACb,CAAA,CAUMC,EAAQ,GAAA,CAEd,SAASC,EAAYC,CAAAA,CAAeC,CAAAA,CAAyB,CAC3D,IAAMC,CAAAA,CAAQF,CAAAA,CAAM,aAAY,CAChC,GAAIC,EAAK,KAAA,CAAO,CACd,IAAME,CAAAA,CAAMF,CAAAA,CAAK,KAAA,CAAM,OAAA,CAAQC,CAAK,CAAA,CACpC,GAAIC,CAAAA,GAAQ,EAAA,CAAI,OAAOA,CAAAA,EAAOF,CAAAA,CAAK,IAAA,GAAS,QAAU,CAAA,CAAI,CAAA,CAC5D,CACA,GAAI,CAAC,OAAA,CAAQ,KAAKD,CAAK,CAAA,CACrB,MAAM,IAAI,WAAA,CAAY,0BAA0BA,CAAK,CAAA,KAAA,EAAQC,CAAAA,CAAK,IAAI,CAAA,MAAA,CAAQ,CAAA,CAEhF,OAAO,MAAA,CAAOD,CAAK,CACrB,CAEA,SAASI,EAAWC,CAAAA,CAAaJ,CAAAA,CAA4D,CAC3F,IAAMK,CAAAA,CAAaC,CAAAA,EAAuBN,EAAK,IAAA,GAAS,WAAA,EAAeM,IAAM,CAAA,CAAI,CAAA,CAAIA,EAErF,GAAIF,CAAAA,GAAQ,GAAA,EAAOA,CAAAA,GAAQ,GAAA,CAAK,CAC9B,IAAMG,CAAAA,CAAmB,EAAC,CAC1B,IAAA,IAASD,CAAAA,CAAIN,CAAAA,CAAK,IAAKM,CAAAA,EAAKN,CAAAA,CAAK,GAAA,CAAKM,CAAAA,EAAAA,CAAKC,CAAAA,CAAO,IAAA,CAAKD,CAAC,CAAA,CACxD,OAAO,CAAE,MAAA,CAAAC,CAAAA,CAAQ,WAAY,KAAM,CACrC,CAEA,IAAMC,CAAAA,CAAM,IAAI,IAChB,IAAA,IAAWC,CAAAA,IAAQL,CAAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAG,CACjC,GAAM,CAACM,CAAAA,CAAWC,CAAQ,CAAA,CAAIF,CAAAA,CAAK,MAAM,GAAG,CAAA,CACtCG,EAAOD,CAAAA,GAAa,MAAA,CAAY,EAAI,MAAA,CAAOA,CAAQ,CAAA,CACzD,GAAI,CAAC,MAAA,CAAO,UAAUC,CAAI,CAAA,EAAKA,CAAAA,CAAO,CAAA,CACpC,MAAM,IAAI,YAAY,CAAA,sBAAA,EAAyBD,CAAQ,CAAA,KAAA,EAAQX,CAAAA,CAAK,IAAI,CAAA,MAAA,CAAQ,EAGlF,IAAIa,CAAAA,CACAC,EACJ,GAAIJ,CAAAA,GAAc,IAChBG,CAAAA,CAAKb,CAAAA,CAAK,GAAA,CACVc,CAAAA,CAAKd,CAAAA,CAAK,GAAA,CAAA,KAAA,GACDU,EAAU,QAAA,CAAS,GAAG,EAAG,CAClC,GAAM,CAACK,CAAAA,CAAGC,CAAC,CAAA,CAAIN,CAAAA,CAAU,KAAA,CAAM,GAAG,EAClCG,CAAAA,CAAKf,CAAAA,CAAYiB,EAAGf,CAAI,CAAA,CACxBc,EAAKhB,CAAAA,CAAYkB,CAAAA,CAAGhB,CAAI,EAC1B,CAAA,KACEa,CAAAA,CAAKf,EAAYY,CAAAA,CAAWV,CAAI,CAAA,CAChCc,CAAAA,CAAKH,CAAAA,GAAa,MAAA,CAAYE,EAAKb,CAAAA,CAAK,GAAA,CAG1C,IAAA,IAAWiB,CAAAA,IAAS,CAACJ,CAAAA,CAAIC,CAAE,CAAA,CACzB,GAAIG,EAAQjB,CAAAA,CAAK,GAAA,EAAOiB,EAAQjB,CAAAA,CAAK,MAAA,CACnC,MAAM,IAAI,UAAA,CACR,CAAA,cAAA,EAAiBiB,CAAK,CAAA,eAAA,EAAkBjB,CAAAA,CAAK,GAAG,CAAA,CAAA,EAAIA,CAAAA,CAAK,MAAM,CAAA,KAAA,EAAQA,CAAAA,CAAK,IAAI,CAAA,MAAA,CAClF,CAAA,CAGJ,GAAIa,EAAKC,CAAAA,CACP,MAAM,IAAI,UAAA,CAAW,CAAA,oBAAA,EAAuBD,CAAE,CAAA,OAAA,EAAUC,CAAE,CAAA,IAAA,EAAOd,CAAAA,CAAK,IAAI,CAAA,MAAA,CAAQ,EAEpF,IAAA,IAASM,CAAAA,CAAIO,CAAAA,CAAIP,CAAAA,EAAKQ,CAAAA,CAAIR,CAAAA,EAAKM,EAAMJ,CAAAA,CAAI,GAAA,CAAIH,CAAAA,CAAUC,CAAC,CAAC,EAC3D,CAEA,OAAO,CAAE,OAAQ,CAAC,GAAGE,CAAG,CAAA,CAAE,IAAA,CAAK,CAACO,CAAAA,CAAGC,CAAAA,GAAMD,CAAAA,CAAIC,CAAC,CAAA,CAAG,UAAA,CAAY,IAAK,CACpE,CAiBA,IAAME,CAAAA,CAA0B,CAC9B,IAAA,CAAOC,CAAAA,EAAMA,CAAAA,CAAE,WAAA,GACf,MAAA,CAASA,CAAAA,EAAMA,EAAE,QAAA,EAAS,CAC1B,KAAOA,CAAAA,EAAMA,CAAAA,CAAE,OAAA,EAAQ,CACvB,KAAA,CAAQA,CAAAA,EAAMA,EAAE,QAAA,EAAS,CACzB,OAAA,CAAUA,CAAAA,EAAMA,CAAAA,CAAE,UAAA,GAClB,OAAA,CAAUA,CAAAA,EAAMA,CAAAA,CAAE,UAAA,EAAW,CAC7B,GAAA,CAAMA,GAAMA,CAAAA,CAAE,MAAA,GACd,SAAA,CAAW,CAACA,EAAGb,CAAAA,GAAG,CAAQa,CAAAA,CAAE,QAAA,CAASb,CAAC,EAAA,CAAA,CACtC,QAAS,CAACa,CAAAA,CAAGb,CAAAA,GAAG,CAAQa,CAAAA,CAAE,OAAA,CAAQb,CAAC,EAAA,CAAA,CACnC,QAAA,CAAU,CAACa,CAAAA,CAAGb,CAAAA,GAAG,CAAQa,EAAE,QAAA,CAASb,CAAC,IACrC,UAAA,CAAY,CAACa,EAAGb,CAAAA,GAAG,CAAQa,CAAAA,CAAE,UAAA,CAAWb,CAAC,EAAA,CAAA,CACzC,WAAY,CAACa,CAAAA,CAAGb,CAAAA,GAAG,CAAQa,CAAAA,CAAE,UAAA,CAAWb,CAAC,EAAA,CAC3C,CAAA,CAEMc,CAAAA,CAAwB,CAC5B,IAAA,CAAOD,CAAAA,EAAMA,EAAE,cAAA,EAAe,CAC9B,OAASA,CAAAA,EAAMA,CAAAA,CAAE,aAAY,CAC7B,IAAA,CAAOA,CAAAA,EAAMA,CAAAA,CAAE,UAAA,EAAW,CAC1B,MAAQA,CAAAA,EAAMA,CAAAA,CAAE,aAAY,CAC5B,OAAA,CAAUA,GAAMA,CAAAA,CAAE,aAAA,EAAc,CAChC,OAAA,CAAUA,CAAAA,EAAMA,CAAAA,CAAE,eAAc,CAChC,GAAA,CAAMA,GAAMA,CAAAA,CAAE,SAAA,GACd,SAAA,CAAW,CAACA,CAAAA,CAAGb,CAAAA,GAAG,CAAQa,CAAAA,CAAE,YAAYb,CAAC,EAAA,CAAA,CACzC,OAAA,CAAS,CAACa,CAAAA,CAAGb,CAAAA,GAAG,CAAQa,CAAAA,CAAE,UAAA,CAAWb,CAAC,EAAA,CAAA,CACtC,QAAA,CAAU,CAACa,EAAGb,CAAAA,GAAG,CAAQa,EAAE,WAAA,CAAYb,CAAC,IACxC,UAAA,CAAY,CAACa,CAAAA,CAAGb,CAAAA,GAAG,CAAQa,CAAAA,CAAE,cAAcb,CAAC,EAAA,CAAA,CAC5C,WAAY,CAACa,CAAAA,CAAGb,IAAG,CAAQa,CAAAA,CAAE,aAAA,CAAcb,CAAC,EAAA,CAC9C,CAAA,CAGae,EAAN,KAAW,CACP,WACA,UAAA,CACA,OAAA,CACA,QACA,KAAA,CACA,WAAA,CACA,MAAA,CACA,UAAA,CAEA,GAAA,CACQ,aAAA,CACA,cACA,GAAA,CAEjB,WAAA,CAAYC,CAAAA,CAAoBC,CAAAA,CAAuB,EAAC,CAAG,CACzD,IAAA,CAAK,GAAA,CAAMA,CAAAA,CAAQ,GAAA,EAAO,KAAA,CAC1B,IAAMC,EAAUF,CAAAA,CAAW,IAAA,GAErBG,CAAAA,CAAAA,CADW7B,CAAAA,CAAO4B,EAAQ,WAAA,EAAa,CAAA,EAAKA,CAAAA,EAC3B,KAAA,CAAM,KAAK,EAElC,GAAIC,CAAAA,CAAM,SAAW,CAAA,EAAKA,CAAAA,CAAM,SAAW,CAAA,CACzC,MAAM,IAAI,WAAA,CACR,CAAA,oCAAA,EAAuCA,CAAAA,CAAM,MAAM,CAAA,KAAA,EAAQH,CAAU,GACvE,CAAA,CAGF,IAAA,CAAK,WAAaG,CAAAA,CAAM,MAAA,GAAW,CAAA,CACnC,GAAM,CAACC,CAAAA,CAAQC,EAAQC,CAAAA,CAASC,CAAAA,CAAQC,CAAAA,CAAUC,CAAM,CAAA,CAAI,IAAA,CAAK,WAC5DN,CAAAA,CACA,CAAC,GAAA,CAAK,GAAGA,CAAK,CAAA,CAEbO,EAAM7B,CAAAA,CAAWuB,CAAAA,CAAQ,CAAE,IAAA,CAAM,QAAA,CAAU,IAAK,CAAA,CAAG,GAAA,CAAK,EAAA,CAAI,MAAA,CAAQ,EAAG,CAAC,EACxEO,CAAAA,CAAM9B,CAAAA,CAAWwB,CAAAA,CAAQ,CAAE,IAAA,CAAM,QAAA,CAAU,IAAK,CAAA,CAAG,GAAA,CAAK,EAAA,CAAI,MAAA,CAAQ,EAAG,CAAC,EACxEO,CAAAA,CAAO/B,CAAAA,CAAWyB,EAAS,CAAE,IAAA,CAAM,OAAQ,GAAA,CAAK,CAAA,CAAG,GAAA,CAAK,EAAA,CAAI,MAAA,CAAQ,EAAG,CAAC,CAAA,CACxEO,CAAAA,CAAMhC,CAAAA,CAAW0B,CAAAA,CAAQ,CAAE,IAAA,CAAM,aAAc,GAAA,CAAK,CAAA,CAAG,GAAA,CAAK,EAAA,CAAI,MAAA,CAAQ,EAAG,CAAC,CAAA,CAC5EO,CAAAA,CAAQjC,EAAW2B,CAAAA,CAAU,CAAE,KAAM,OAAA,CAAS,GAAA,CAAK,CAAA,CAAG,GAAA,CAAK,EAAA,CAAI,MAAA,CAAQ,GAAI,KAAA,CAAOtC,CAAY,CAAC,CAAA,CAC/F6C,CAAAA,CAAMlC,EAAW4B,CAAAA,CAAQ,CAAE,IAAA,CAAM,WAAA,CAAa,GAAA,CAAK,CAAA,CAAG,IAAK,CAAA,CAAG,MAAA,CAAQ,EAAG,KAAA,CAAOtC,CAAU,CAAC,CAAA,CAEjG,IAAA,CAAK,OAAA,CAAUuC,CAAAA,CAAI,MAAA,CACnB,IAAA,CAAK,QAAUC,CAAAA,CAAI,MAAA,CACnB,IAAA,CAAK,KAAA,CAAQC,CAAAA,CAAK,MAAA,CAClB,KAAK,WAAA,CAAcC,CAAAA,CAAI,MAAA,CACvB,IAAA,CAAK,MAAA,CAASC,CAAAA,CAAM,OACpB,IAAA,CAAK,UAAA,CAAaC,EAAI,MAAA,CACtB,IAAA,CAAK,cAAgBF,CAAAA,CAAI,UAAA,CACzB,IAAA,CAAK,aAAA,CAAgBE,CAAAA,CAAI,UAAA,CACzB,KAAK,UAAA,CAAab,CAAAA,CAClB,IAAA,CAAK,GAAA,CAAM,CACT,GAAI,KAAK,UAAA,CAAa,CAAE,OAAA,CAASE,CAAO,CAAA,CAAI,GAC5C,MAAA,CAAQC,CAAAA,CACR,KAAMC,CAAAA,CACN,UAAA,CAAYC,EACZ,KAAA,CAAOC,CAAAA,CACP,SAAA,CAAWC,CACb,EACF,CAEQ,KAAgB,CACtB,OAAO,IAAA,CAAK,GAAA,CAAMX,CAAAA,CAAcF,CAClC,CAEQ,UAAA,CAAWC,CAAAA,CAASJ,CAAAA,CAAsB,CAChD,IAAMuB,CAAAA,CAAK,KAAK,WAAA,CAAY,QAAA,CAASvB,EAAE,IAAA,CAAKI,CAAC,CAAC,CAAA,CACxCoB,CAAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAA,CAASxB,CAAAA,CAAE,IAAII,CAAC,CAAC,EAC5C,OAAI,IAAA,CAAK,eAAiB,IAAA,CAAK,aAAA,CAAsBmB,CAAAA,EAAMC,CAAAA,CACvD,IAAA,CAAK,aAAA,CAAsBD,EAC3B,IAAA,CAAK,aAAA,CAAsBC,EACxB,IACT,CAGA,QAAQC,CAAAA,CAAa,IAAI,IAAA,CAAiB,CACxC,IAAMzB,CAAAA,CAAI,KAAK,GAAA,EAAI,CAInB,OAHI,CAAC,IAAA,CAAK,MAAA,CAAO,SAASA,CAAAA,CAAE,MAAA,CAAOyB,CAAI,CAAA,CAAI,CAAC,CAAA,EACxC,CAAC,IAAA,CAAK,UAAA,CAAWA,EAAMzB,CAAC,CAAA,EACxB,CAAC,IAAA,CAAK,KAAA,CAAM,QAAA,CAASA,CAAAA,CAAE,KAAA,CAAMyB,CAAI,CAAC,CAAA,EAClC,CAAC,IAAA,CAAK,OAAA,CAAQ,QAAA,CAASzB,CAAAA,CAAE,QAAQyB,CAAI,CAAC,CAAA,CAAU,KAAA,CAChD,IAAA,CAAK,UAAA,CAAmB,KAAK,OAAA,CAAQ,QAAA,CAASzB,EAAE,OAAA,CAAQyB,CAAI,CAAC,CAAA,CAC1DzB,CAAAA,CAAE,OAAA,CAAQyB,CAAI,CAAA,GAAM,CAC7B,CAGA,IAAA,CAAKC,CAAAA,CAAa,IAAI,IAAA,CAAc,CAClC,OAAO,KAAK,IAAA,CAAKA,CAAAA,CAAM,CAAC,CAC1B,CAGA,IAAA,CAAKA,EAAa,IAAI,IAAA,CAAc,CAClC,OAAO,IAAA,CAAK,KAAKA,CAAAA,CAAM,EAAE,CAC3B,CAGA,KAAA,CAAMC,CAAAA,CAAeD,EAAa,IAAI,IAAA,CAAgB,CACpD,IAAMjC,CAAAA,CAAc,EAAC,CACjBmC,CAAAA,CAASF,CAAAA,CACb,IAAA,IAASG,CAAAA,CAAI,CAAA,CAAGA,EAAIF,CAAAA,CAAOE,CAAAA,EAAAA,CACzBD,EAAS,IAAA,CAAK,IAAA,CAAKA,CAAM,CAAA,CACzBnC,CAAAA,CAAI,IAAA,CAAKmC,CAAM,CAAA,CAEjB,OAAOnC,CACT,CAGA,KAAA,CAAMkC,CAAAA,CAAeD,CAAAA,CAAa,IAAI,IAAA,CAAgB,CACpD,IAAMjC,CAAAA,CAAc,EAAC,CACjBmC,CAAAA,CAASF,CAAAA,CACb,QAASG,CAAAA,CAAI,CAAA,CAAGA,EAAIF,CAAAA,CAAOE,CAAAA,EAAAA,CACzBD,EAAS,IAAA,CAAK,IAAA,CAAKA,CAAM,CAAA,CACzBnC,CAAAA,CAAI,IAAA,CAAKmC,CAAM,CAAA,CAEjB,OAAOnC,CACT,CAEQ,WAAA,CAAYW,EAASJ,CAAAA,CAAqB,CAEhD,IAAM8B,CAAAA,CAAQ,IAAI,IAAA,CAAK1B,EAAE,OAAA,EAAS,EAClC,OAAAJ,CAAAA,CAAE,QAAQ8B,CAAAA,CAAO,CAAC,CAAA,CAClB9B,CAAAA,CAAE,SAAA,CAAU8B,CAAAA,CAAO9B,EAAE,MAAA,CAAO8B,CAAK,CAAA,CAAI,CAAC,CAAA,CACtC9B,CAAAA,CAAE,QAAQ8B,CAAAA,CAAO,CAAC,CAAA,CACX9B,CAAAA,CAAE,IAAA,CAAK8B,CAAK,CACrB,CAEQ,IAAA,CAAKJ,EAAYK,CAAAA,CAAmB,CAC1C,IAAM/B,CAAAA,CAAI,IAAA,CAAK,GAAA,EAAI,CACbgC,CAAAA,CAAS,IAAA,CAAK,WAAa,EAAA,CAAK,CAAA,CAChCC,EAAO,IAAA,CAAK,UAAA,CAAa,IAAO,GAAA,CAGlCC,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAMR,CAAAA,CAAK,OAAA,GAAYO,CAAI,CAAA,CAAIA,EAAOF,CAAAA,CAAME,CAAAA,CACnD7B,EAAI,IAAI,IAAA,CAAK8B,CAAC,CAAA,CACf,IAAA,CAAK,UAAA,EAAYlC,EAAE,UAAA,CAAWI,CAAAA,CAAG,CAAC,CAAA,CAEvC,IAAA,IAAS+B,CAAAA,CAAO,EAAGA,CAAAA,CAAOrD,CAAAA,CAAOqD,CAAAA,EAAAA,CAAQ,CACvC,GAAI,CAAC,KAAK,MAAA,CAAO,QAAA,CAASnC,EAAE,MAAA,CAAOI,CAAC,EAAI,CAAC,CAAA,CAAG,CACtC2B,CAAAA,GAAQ,CAAA,EACV/B,CAAAA,CAAE,QAAQI,CAAAA,CAAG,CAAC,CAAA,CACdJ,CAAAA,CAAE,QAAA,CAASI,CAAAA,CAAG,CAAC,CAAA,CACfJ,CAAAA,CAAE,UAAA,CAAWI,CAAAA,CAAG,CAAC,CAAA,CACjBJ,EAAE,UAAA,CAAWI,CAAAA,CAAG,CAAC,CAAA,CACjBJ,CAAAA,CAAE,UAAUI,CAAAA,CAAGJ,CAAAA,CAAE,MAAA,CAAOI,CAAC,CAAA,CAAI,CAAC,IAE9BJ,CAAAA,CAAE,OAAA,CAAQI,CAAAA,CAAG,CAAC,CAAA,CACdJ,CAAAA,CAAE,UAAUI,CAAAA,CAAGJ,CAAAA,CAAE,MAAA,CAAOI,CAAC,CAAA,CAAI,CAAC,EAC9BJ,CAAAA,CAAE,OAAA,CAAQI,EAAG,IAAA,CAAK,WAAA,CAAYA,EAAGJ,CAAC,CAAC,CAAA,CACnCA,CAAAA,CAAE,QAAA,CAASI,CAAAA,CAAG,EAAE,CAAA,CAChBJ,CAAAA,CAAE,WAAWI,CAAAA,CAAG,EAAE,EAClBJ,CAAAA,CAAE,UAAA,CAAWI,CAAAA,CAAG4B,CAAM,CAAA,CAAA,CAExB,QACF,CACA,GAAI,CAAC,KAAK,UAAA,CAAW5B,CAAAA,CAAGJ,CAAC,CAAA,CAAG,CACtB+B,CAAAA,GAAQ,CAAA,EACV/B,CAAAA,CAAE,QAAA,CAASI,EAAG,CAAC,CAAA,CACfJ,CAAAA,CAAE,UAAA,CAAWI,CAAAA,CAAG,CAAC,EACjBJ,CAAAA,CAAE,UAAA,CAAWI,CAAAA,CAAG,CAAC,CAAA,CACjBJ,CAAAA,CAAE,QAAQI,CAAAA,CAAGJ,CAAAA,CAAE,KAAKI,CAAC,CAAA,CAAI,CAAC,CAAA,GAE1BJ,CAAAA,CAAE,QAAA,CAASI,CAAAA,CAAG,EAAE,CAAA,CAChBJ,EAAE,UAAA,CAAWI,CAAAA,CAAG,EAAE,CAAA,CAClBJ,CAAAA,CAAE,WAAWI,CAAAA,CAAG4B,CAAM,CAAA,CACtBhC,CAAAA,CAAE,OAAA,CAAQI,CAAAA,CAAGJ,EAAE,IAAA,CAAKI,CAAC,EAAI,CAAC,CAAA,CAAA,CAE5B,QACF,CACA,GAAI,CAAC,IAAA,CAAK,KAAA,CAAM,QAAA,CAASJ,EAAE,KAAA,CAAMI,CAAC,CAAC,CAAA,CAAG,CAChC2B,CAAAA,GAAQ,GACV/B,CAAAA,CAAE,UAAA,CAAWI,CAAAA,CAAG,CAAC,CAAA,CACjBJ,CAAAA,CAAE,WAAWI,CAAAA,CAAG,CAAC,EACjBJ,CAAAA,CAAE,QAAA,CAASI,EAAGJ,CAAAA,CAAE,KAAA,CAAMI,CAAC,CAAA,CAAI,CAAC,CAAA,GAE5BJ,EAAE,UAAA,CAAWI,CAAAA,CAAG,EAAE,CAAA,CAClBJ,CAAAA,CAAE,WAAWI,CAAAA,CAAG4B,CAAM,CAAA,CACtBhC,CAAAA,CAAE,QAAA,CAASI,CAAAA,CAAGJ,EAAE,KAAA,CAAMI,CAAC,EAAI,CAAC,CAAA,CAAA,CAE9B,QACF,CACA,GAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,QAAA,CAASJ,EAAE,OAAA,CAAQI,CAAC,CAAC,CAAA,CAAG,CACpC2B,CAAAA,GAAQ,GACV/B,CAAAA,CAAE,UAAA,CAAWI,CAAAA,CAAG,CAAC,CAAA,CACjBJ,CAAAA,CAAE,WAAWI,CAAAA,CAAGJ,CAAAA,CAAE,QAAQI,CAAC,CAAA,CAAI,CAAC,CAAA,GAEhCJ,CAAAA,CAAE,UAAA,CAAWI,CAAAA,CAAG4B,CAAM,CAAA,CACtBhC,EAAE,UAAA,CAAWI,CAAAA,CAAGJ,CAAAA,CAAE,OAAA,CAAQI,CAAC,CAAA,CAAI,CAAC,CAAA,CAAA,CAElC,QACF,CACA,GAAI,IAAA,CAAK,UAAA,EAAc,CAAC,IAAA,CAAK,OAAA,CAAQ,SAASJ,CAAAA,CAAE,OAAA,CAAQI,CAAC,CAAC,CAAA,CAAG,CAC3DJ,CAAAA,CAAE,UAAA,CAAWI,CAAAA,CAAGJ,EAAE,OAAA,CAAQI,CAAC,CAAA,CAAI2B,CAAG,CAAA,CAClC,QACF,CACA,OAAO,IAAI,IAAA,CAAK3B,CAAAA,CAAE,OAAA,EAAS,CAC7B,CACA,MAAM,IAAI,UAAA,CAAW,CAAA,oCAAA,EAAuC,KAAK,UAAU,CAAA,eAAA,CAAiB,CAC9F,CAGA,QAAA,EAAmB,CACjB,IAAMJ,CAAAA,CAAI,IAAA,CAAK,IACToC,CAAAA,CAAO,CAAA,EAAc,EAAE,QAAA,EAAS,CAAE,QAAA,CAAS,CAAA,CAAG,GAAG,CAAA,CAEnDC,EACEC,CAAAA,CAAWtC,CAAAA,CAAE,SAAW,GAAA,CACxBuC,CAAAA,CAAYvC,EAAE,IAAA,GAAS,GAAA,CACzB,IAAA,CAAK,UAAA,EAAcA,CAAAA,CAAE,OAAA,GAAY,KAAOsC,CAAAA,CAC1CD,CAAAA,CAAO,cAAA,CACEC,CAAAA,EAAYC,CAAAA,CACrBF,CAAAA,CAAO,eACE,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAW,CAAA,EAAK,IAAA,CAAK,KAAA,CAAM,SAAW,CAAA,CAC5DA,CAAAA,CAAO,MAAMD,CAAAA,CAAI,IAAA,CAAK,MAAM,CAAC,CAAW,CAAC,CAAA,CAAA,EAAIA,CAAAA,CAAI,IAAA,CAAK,QAAQ,CAAC,CAAW,CAAC,CAAA,CAAA,CAClEG,CAAAA,EAAa,KAAK,OAAA,CAAQ,MAAA,GAAW,CAAA,CAC9CF,CAAAA,CAAO,CAAA,GAAA,EAAM,IAAA,CAAK,QAAQ,CAAC,CAAC,2BACnBrC,CAAAA,CAAE,MAAA,CAAO,WAAW,IAAI,CAAA,CACjCqC,CAAAA,CAAO,CAAA,MAAA,EAASrC,CAAAA,CAAE,MAAA,CAAO,MAAM,CAAC,CAAC,CAAA,QAAA,CAAA,CAEjCqC,CAAAA,CAAO,CAAA,UAAA,EAAaG,CAAAA,CAAS,KAAK,OAAO,CAAC,CAAA,WAAA,EAAcA,CAAAA,CAAS,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAG9E,IAAM9B,EAAQ,CAAC2B,CAAI,EAEnB,OAAI,IAAA,CAAK,aAAA,EACP3B,CAAAA,CAAM,IAAA,CAAK+B,CAAAA,CAAQ,KAAK,UAAU,CAAC,EAEjC,IAAA,CAAK,aAAA,EACP/B,EAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB8B,CAAAA,CAAS,IAAA,CAAK,WAAW,CAAC,EAAE,CAAA,CAExDxC,CAAAA,CAAE,QAAU,GAAA,EACdU,CAAAA,CAAM,KAAK,CAAA,GAAA,EAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAKgC,CAAAA,EAAM9D,CAAAA,CAAa8D,EAAI,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,EAAE,CAAA,CAGpEC,CAAAA,CAAWjC,CAAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CACpC,CACF,CAAA,CAEA,SAAS8B,CAAAA,CAAShD,CAAAA,CAA0B,CAC1C,OAAIA,CAAAA,CAAO,MAAA,GAAW,CAAA,CAAU,MAAA,CAAOA,CAAAA,CAAO,CAAC,CAAC,CAAA,CAC5CA,CAAAA,CAAO,MAAA,GAAW,CAAA,CAAU,CAAA,EAAGA,EAAO,CAAC,CAAC,CAAA,KAAA,EAAQA,CAAAA,CAAO,CAAC,CAAC,GACtDA,CAAAA,CAAO,KAAA,CAAM,EAAG,EAAE,CAAA,CAAE,KAAK,IAAI,CAAA,CAAI,QAAA,CAAWA,CAAAA,CAAOA,CAAAA,CAAO,MAAA,CAAS,CAAC,CAC7E,CAEA,SAASiD,CAAAA,CAAQjD,CAAAA,CAA0B,CAEzC,IAAMoD,CAAAA,CAAS,CAAC,GAAGpD,CAAM,CAAA,CAAE,IAAA,CAAK,CAACQ,CAAAA,CAAGC,CAAAA,GAAMD,EAAIC,CAAC,CAAA,CAE/C,OADmB2C,CAAAA,CAAO,KAAA,CAAM,CAACrD,CAAAA,CAAG,CAAA,GAAM,CAAA,GAAM,GAAKA,CAAAA,GAAOqD,CAAAA,CAAO,EAAI,CAAC,CAAA,CAAe,CAAC,CAAA,EACtEA,CAAAA,CAAO,MAAA,CAAS,CAAA,CACzB,CAAA,EAAGjE,CAAAA,CAAWiE,EAAO,CAAC,CAAW,CAAC,CAAA,SAAA,EAAYjE,CAAAA,CAAWiE,EAAOA,CAAAA,CAAO,MAAA,CAAS,CAAC,CAAW,CAAC,CAAA,CAAA,CAE/FA,EAAO,GAAA,CAAKxC,CAAAA,EAAMzB,CAAAA,CAAWyB,CAAC,CAAC,CAAA,CAAE,KAAK,IAAI,CACnD,CAEA,SAASuC,CAAAA,CAAW,CAAA,CAAmB,CACrC,OAAO,CAAA,CAAE,OAAO,CAAC,CAAA,CAAE,aAAY,CAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAC9C,CAeO,SAASE,CAAAA,CAAMtC,CAAAA,CAAoBC,CAAAA,CAA6B,CACrE,OAAO,IAAIF,EAAKC,CAAAA,CAAYC,CAAO,CACrC,CAGO,SAASsC,CAAAA,CAAQvC,EAAoBC,CAAAA,CAAgC,CAC1E,GAAI,CACF,OAAA,IAAIF,EAAKC,CAAAA,CAAYC,CAAO,CAAA,CACrB,CAAA,CACT,CAAA,KAAQ,CACN,OAAO,MACT,CACF,CC1aA,IAAAuC,CAAAA,CAAA,CAEE,OAAA,CAAW,OAkEb,CAAA,CCvDA,IAAMC,CAAAA,CAAO,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,6EAAA,CAAA,CAyBb,SAASC,CAAAA,CAAWC,CAAAA,CAAuB,CACzC,IAAMC,EAAW,CAAE,UAAA,CAAY,EAAC,CAAG,KAAA,CAAO,IAAA,CAAM,IAAK,KAAA,CAAO,GAAA,CAAK,KAAM,CAAA,CACvE,IAAA,IAAStB,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIqB,CAAAA,CAAK,MAAA,CAAQrB,CAAAA,EAAAA,CAAK,CACpC,IAAM7B,CAAAA,CAAIkD,EAAKrB,CAAC,CAAA,CACZ7B,CAAAA,GAAM,IAAA,EAAQA,CAAAA,GAAM,SAAA,CAAWmD,CAAAA,CAAE,KAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAG,MAAA,CAAOD,CAAAA,CAAK,EAAErB,CAAC,CAAC,CAAA,EAAK,CAAC,CAAA,CACtE7B,CAAAA,GAAM,OAAA,CAASmD,CAAAA,CAAE,GAAA,CAAM,IAAA,CACvBnD,CAAAA,GAAM,OAAA,CAASmD,CAAAA,CAAE,GAAA,CAAM,IAAA,CACtBnD,EAAE,UAAA,CAAW,GAAG,CAAA,EAAGmD,CAAAA,CAAE,UAAA,CAAW,IAAA,CAAKnD,CAAC,EAClD,CACA,OAAOmD,CACT,CAEA,SAASC,CAAAA,CAAIhD,EAAS+C,CAAAA,CAAkB,CACtC,OAAIA,CAAAA,CAAE,GAAA,CAAY/C,CAAAA,CAAE,WAAA,EAAY,CACzB+C,CAAAA,CAAE,GAAA,CAAM/C,CAAAA,CAAE,WAAA,EAAY,CAAIA,CAAAA,CAAE,UACrC,CAEA,SAASiD,CAAAA,EAAe,CACtB,IAAMH,CAAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CACjC,GAAIA,CAAAA,CAAK,SAAW,CAAA,EAAKA,CAAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAKA,CAAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,CACpE,OAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAMF,CAAAA,CAAO;AAAA,CAAI,CAAA,CACzBE,EAAK,MAAA,GAAW,CAAA,CAAI,EAAI,CAAA,CAEjC,GAAIA,EAAK,CAAC,CAAA,GAAM,MAAQA,CAAAA,CAAK,CAAC,IAAM,WAAA,CAClC,OAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,CAAA,OAAA,EAAUH,EAAI,OAAO;AAAA,CAAI,CAAA,CACvC,EAGT,IAAMI,CAAAA,CAAIF,EAAWC,CAAI,CAAA,CAEnBI,CAAAA,CADM,IAAI,GAAA,CAAI,CAAC,WAAY,MAAA,CAAQ,MAAA,CAAQ,OAAO,CAAC,CAAA,CACzC,GAAA,CAAIH,EAAE,UAAA,CAAW,CAAC,CAAA,EAAK,EAAE,CAAA,CAAIA,CAAAA,CAAE,WAAW,CAAC,CAAA,CAAK,OAC1DI,CAAAA,CAAOD,CAAAA,GAAQ,OAASH,CAAAA,CAAE,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA,CAAIA,CAAAA,CAAE,WAAW,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,CAErF,GAAI,CAACI,CAAAA,CACH,OAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA;AAAA,CAAkD,CAAA,CAChE,CAAA,CAGT,GAAID,CAAAA,GAAQ,OAAA,CAAS,CACnB,IAAME,CAAAA,CAAKV,CAAAA,CAAQS,CAAAA,CAAMJ,CAAAA,CAAE,GAAA,CAAM,CAAE,GAAA,CAAK,IAAK,CAAA,CAAI,MAAS,CAAA,CAC1D,OAAKK,GAAI,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,SAAA,EAAYD,CAAI,CAAA;AAAA,CAAoC,CAAA,CAC3EC,CAAAA,CAAK,CAAA,CAAI,CAClB,CAEA,IAAIC,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAOZ,CAAAA,CAAMU,CAAAA,CAAMJ,CAAAA,CAAE,GAAA,CAAM,CAAE,GAAA,CAAK,CAAA,CAAK,CAAA,CAAI,KAAA,CAAS,EACtD,CAAA,MAASO,CAAAA,CAAG,CACV,OAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,QAAA,EAAYA,CAAAA,CAAY,OAAO;AAAA,CAAI,CAAA,CACjD,CACT,CAEA,OAAQJ,CAAAA,EACN,KAAK,UAAA,CACH,OAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAMG,CAAAA,CAAK,UAAS,CAAI;AAAA,CAAI,CAAA,CACpC,CAAA,CACT,KAAK,MAAA,CACH,OAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAML,CAAAA,CAAIK,CAAAA,CAAK,IAAA,EAAK,CAAGN,CAAC,CAAA,CAAI;AAAA,CAAI,CAAA,CACxC,CAAA,CACT,KAAK,MAAA,CAAQ,CACX,IAAMQ,CAAAA,CAAOF,CAAAA,CAAK,KAAA,CAAMN,CAAAA,CAAE,KAAA,EAAS,CAAC,EACpC,OAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAMQ,CAAAA,CAAK,GAAA,CAAKvD,CAAAA,EAAMgD,EAAIhD,CAAAA,CAAG+C,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK;AAAA,CAAI,CAAA,CAAI;AAAA,CAAI,CAAA,CAC1D,CACT,CACA,QAAS,CAEP,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAGM,CAAAA,CAAK,QAAA,EAAU;;AAAA;AAAA,CAAkB,CAAA,CACzD,IAAME,CAAAA,CAAOF,CAAAA,CAAK,MAAMN,CAAAA,CAAE,KAAA,EAAS,CAAC,CAAA,CACpC,OAAA,OAAA,CAAQ,OAAO,KAAA,CAAMQ,CAAAA,CAAK,IAAKvD,CAAAA,EAAM,IAAA,CAAOgD,EAAIhD,CAAAA,CAAG+C,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK;AAAA,CAAI,CAAA,CAAI;AAAA,CAAI,CAAA,CACjE,CACT,CACF,CACF,CAEA,OAAA,CAAQ,IAAA,CAAKE,GAAM,CAAA","file":"cli.cjs","sourcesContent":["/**\n * croniq — a tiny, zero-dependency cron expression toolkit.\n *\n * Parse standard 5-field (and 6-field \"with seconds\") cron expressions, then\n * compute the next/previous run times and a human-readable description. The\n * time arithmetic uses field-jumping (not minute-by-minute scanning), so even\n * sparse schedules resolve quickly.\n */\n\nexport interface CronOptions {\n  /** Interpret and emit times in UTC instead of local time. Default: `false`. */\n  utc?: boolean;\n}\n\nconst MONTH_NAMES = [\"jan\", \"feb\", \"mar\", \"apr\", \"may\", \"jun\", \"jul\", \"aug\", \"sep\", \"oct\", \"nov\", \"dec\"];\nconst DOW_NAMES = [\"sun\", \"mon\", \"tue\", \"wed\", \"thu\", \"fri\", \"sat\"];\nconst DOW_LABELS = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"];\nconst MONTH_LABELS = [\n  \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n  \"July\", \"August\", \"September\", \"October\", \"November\", \"December\",\n];\n\nconst MACROS: Record<string, string> = {\n  \"@yearly\": \"0 0 1 1 *\",\n  \"@annually\": \"0 0 1 1 *\",\n  \"@monthly\": \"0 0 1 * *\",\n  \"@weekly\": \"0 0 * * 0\",\n  \"@daily\": \"0 0 * * *\",\n  \"@midnight\": \"0 0 * * *\",\n  \"@hourly\": \"0 * * * *\",\n};\n\ninterface FieldSpec {\n  name: string;\n  min: number;\n  max: number; // value used to generate \"*\"\n  accept: number; // highest accepted literal (dow accepts 7)\n  names?: string[];\n}\n\nconst LIMIT = 500_000; // safety bound for field-jump loops\n\nfunction resolveName(token: string, spec: FieldSpec): number {\n  const lower = token.toLowerCase();\n  if (spec.names) {\n    const idx = spec.names.indexOf(lower);\n    if (idx !== -1) return idx + (spec.name === \"month\" ? 1 : 0);\n  }\n  if (!/^\\d+$/.test(token)) {\n    throw new SyntaxError(`croniq: invalid value \"${token}\" in ${spec.name} field`);\n  }\n  return Number(token);\n}\n\nfunction parseField(raw: string, spec: FieldSpec): { values: number[]; restricted: boolean } {\n  const normalize = (v: number): number => (spec.name === \"dayOfWeek\" && v === 7 ? 0 : v);\n\n  if (raw === \"*\" || raw === \"?\") {\n    const values: number[] = [];\n    for (let v = spec.min; v <= spec.max; v++) values.push(v);\n    return { values, restricted: false };\n  }\n\n  const out = new Set<number>();\n  for (const part of raw.split(\",\")) {\n    const [rangePart, stepPart] = part.split(\"/\") as [string, string | undefined];\n    const step = stepPart === undefined ? 1 : Number(stepPart);\n    if (!Number.isInteger(step) || step < 1) {\n      throw new SyntaxError(`croniq: invalid step \"${stepPart}\" in ${spec.name} field`);\n    }\n\n    let lo: number;\n    let hi: number;\n    if (rangePart === \"*\") {\n      lo = spec.min;\n      hi = spec.max;\n    } else if (rangePart.includes(\"-\")) {\n      const [a, b] = rangePart.split(\"-\") as [string, string];\n      lo = resolveName(a, spec);\n      hi = resolveName(b, spec);\n    } else {\n      lo = resolveName(rangePart, spec);\n      hi = stepPart === undefined ? lo : spec.max;\n    }\n\n    for (const bound of [lo, hi]) {\n      if (bound < spec.min || bound > spec.accept) {\n        throw new RangeError(\n          `croniq: value ${bound} out of range (${spec.min}-${spec.accept}) in ${spec.name} field`,\n        );\n      }\n    }\n    if (lo > hi) {\n      throw new RangeError(`croniq: range start ${lo} > end ${hi} in ${spec.name} field`);\n    }\n    for (let v = lo; v <= hi; v += step) out.add(normalize(v));\n  }\n\n  return { values: [...out].sort((a, b) => a - b), restricted: true };\n}\n\ninterface Accessor {\n  year(d: Date): number;\n  month0(d: Date): number; // 0-based\n  date(d: Date): number;\n  hours(d: Date): number;\n  minutes(d: Date): number;\n  seconds(d: Date): number;\n  dow(d: Date): number;\n  setMonth0(d: Date, v: number): void;\n  setDate(d: Date, v: number): void;\n  setHours(d: Date, v: number): void;\n  setMinutes(d: Date, v: number): void;\n  setSeconds(d: Date, v: number): void;\n}\n\nconst localAccessor: Accessor = {\n  year: (d) => d.getFullYear(),\n  month0: (d) => d.getMonth(),\n  date: (d) => d.getDate(),\n  hours: (d) => d.getHours(),\n  minutes: (d) => d.getMinutes(),\n  seconds: (d) => d.getSeconds(),\n  dow: (d) => d.getDay(),\n  setMonth0: (d, v) => void d.setMonth(v),\n  setDate: (d, v) => void d.setDate(v),\n  setHours: (d, v) => void d.setHours(v),\n  setMinutes: (d, v) => void d.setMinutes(v),\n  setSeconds: (d, v) => void d.setSeconds(v),\n};\n\nconst utcAccessor: Accessor = {\n  year: (d) => d.getUTCFullYear(),\n  month0: (d) => d.getUTCMonth(),\n  date: (d) => d.getUTCDate(),\n  hours: (d) => d.getUTCHours(),\n  minutes: (d) => d.getUTCMinutes(),\n  seconds: (d) => d.getUTCSeconds(),\n  dow: (d) => d.getUTCDay(),\n  setMonth0: (d, v) => void d.setUTCMonth(v),\n  setDate: (d, v) => void d.setUTCDate(v),\n  setHours: (d, v) => void d.setUTCHours(v),\n  setMinutes: (d, v) => void d.setUTCMinutes(v),\n  setSeconds: (d, v) => void d.setUTCSeconds(v),\n};\n\n/** A parsed cron expression. Create one with {@link parse} (or `new Cron(...)`). */\nexport class Cron {\n  readonly expression: string;\n  readonly hasSeconds: boolean;\n  readonly seconds: number[];\n  readonly minutes: number[];\n  readonly hours: number[];\n  readonly daysOfMonth: number[];\n  readonly months: number[];\n  readonly daysOfWeek: number[];\n  /** Raw field tokens (after macro expansion), for description. */\n  readonly raw: { seconds?: string; minute: string; hour: string; dayOfMonth: string; month: string; dayOfWeek: string };\n  private readonly domRestricted: boolean;\n  private readonly dowRestricted: boolean;\n  private readonly utc: boolean;\n\n  constructor(expression: string, options: CronOptions = {}) {\n    this.utc = options.utc ?? false;\n    const trimmed = expression.trim();\n    const expanded = MACROS[trimmed.toLowerCase()] ?? trimmed;\n    const parts = expanded.split(/\\s+/);\n\n    if (parts.length !== 5 && parts.length !== 6) {\n      throw new SyntaxError(\n        `croniq: expected 5 or 6 fields, got ${parts.length} in \"${expression}\"`,\n      );\n    }\n\n    this.hasSeconds = parts.length === 6;\n    const [secRaw, minRaw, hourRaw, domRaw, monthRaw, dowRaw] = this.hasSeconds\n      ? (parts as [string, string, string, string, string, string])\n      : ([\"0\", ...parts] as unknown as [string, string, string, string, string, string]);\n\n    const sec = parseField(secRaw, { name: \"second\", min: 0, max: 59, accept: 59 });\n    const min = parseField(minRaw, { name: \"minute\", min: 0, max: 59, accept: 59 });\n    const hour = parseField(hourRaw, { name: \"hour\", min: 0, max: 23, accept: 23 });\n    const dom = parseField(domRaw, { name: \"dayOfMonth\", min: 1, max: 31, accept: 31 });\n    const month = parseField(monthRaw, { name: \"month\", min: 1, max: 12, accept: 12, names: MONTH_NAMES });\n    const dow = parseField(dowRaw, { name: \"dayOfWeek\", min: 0, max: 6, accept: 7, names: DOW_NAMES });\n\n    this.seconds = sec.values;\n    this.minutes = min.values;\n    this.hours = hour.values;\n    this.daysOfMonth = dom.values;\n    this.months = month.values;\n    this.daysOfWeek = dow.values;\n    this.domRestricted = dom.restricted;\n    this.dowRestricted = dow.restricted;\n    this.expression = trimmed;\n    this.raw = {\n      ...(this.hasSeconds ? { seconds: secRaw } : {}),\n      minute: minRaw,\n      hour: hourRaw,\n      dayOfMonth: domRaw,\n      month: monthRaw,\n      dayOfWeek: dowRaw,\n    };\n  }\n\n  private acc(): Accessor {\n    return this.utc ? utcAccessor : localAccessor;\n  }\n\n  private dayMatches(d: Date, a: Accessor): boolean {\n    const dm = this.daysOfMonth.includes(a.date(d));\n    const dw = this.daysOfWeek.includes(a.dow(d));\n    if (this.domRestricted && this.dowRestricted) return dm || dw;\n    if (this.domRestricted) return dm;\n    if (this.dowRestricted) return dw;\n    return true;\n  }\n\n  /** Does `date` satisfy this expression (to minute, or second, precision)? */\n  matches(date: Date = new Date()): boolean {\n    const a = this.acc();\n    if (!this.months.includes(a.month0(date) + 1)) return false;\n    if (!this.dayMatches(date, a)) return false;\n    if (!this.hours.includes(a.hours(date))) return false;\n    if (!this.minutes.includes(a.minutes(date))) return false;\n    if (this.hasSeconds) return this.seconds.includes(a.seconds(date));\n    return a.seconds(date) === 0;\n  }\n\n  /** The next run time strictly after `from` (default: now). Throws if none within ~bounds. */\n  next(from: Date = new Date()): Date {\n    return this.step(from, 1);\n  }\n\n  /** The previous run time strictly before `from` (default: now). */\n  prev(from: Date = new Date()): Date {\n    return this.step(from, -1);\n  }\n\n  /** The next `count` run times after `from`. */\n  nextN(count: number, from: Date = new Date()): Date[] {\n    const out: Date[] = [];\n    let cursor = from;\n    for (let i = 0; i < count; i++) {\n      cursor = this.next(cursor);\n      out.push(cursor);\n    }\n    return out;\n  }\n\n  /** The previous `count` run times before `from`. */\n  prevN(count: number, from: Date = new Date()): Date[] {\n    const out: Date[] = [];\n    let cursor = from;\n    for (let i = 0; i < count; i++) {\n      cursor = this.prev(cursor);\n      out.push(cursor);\n    }\n    return out;\n  }\n\n  private daysInMonth(d: Date, a: Accessor): number {\n    // Day 0 of next month = last day of this month.\n    const probe = new Date(d.getTime());\n    a.setDate(probe, 1);\n    a.setMonth0(probe, a.month0(probe) + 1);\n    a.setDate(probe, 0);\n    return a.date(probe);\n  }\n\n  private step(from: Date, dir: 1 | -1): Date {\n    const a = this.acc();\n    const secMax = this.hasSeconds ? 59 : 0;\n    const unit = this.hasSeconds ? 1000 : 60_000;\n\n    // Start strictly past `from`, snapped to the resolution boundary.\n    let t = Math.floor(from.getTime() / unit) * unit + dir * unit;\n    const d = new Date(t);\n    if (!this.hasSeconds) a.setSeconds(d, 0);\n\n    for (let iter = 0; iter < LIMIT; iter++) {\n      if (!this.months.includes(a.month0(d) + 1)) {\n        if (dir === 1) {\n          a.setDate(d, 1);\n          a.setHours(d, 0);\n          a.setMinutes(d, 0);\n          a.setSeconds(d, 0);\n          a.setMonth0(d, a.month0(d) + 1);\n        } else {\n          a.setDate(d, 1);\n          a.setMonth0(d, a.month0(d) - 1);\n          a.setDate(d, this.daysInMonth(d, a));\n          a.setHours(d, 23);\n          a.setMinutes(d, 59);\n          a.setSeconds(d, secMax);\n        }\n        continue;\n      }\n      if (!this.dayMatches(d, a)) {\n        if (dir === 1) {\n          a.setHours(d, 0);\n          a.setMinutes(d, 0);\n          a.setSeconds(d, 0);\n          a.setDate(d, a.date(d) + 1);\n        } else {\n          a.setHours(d, 23);\n          a.setMinutes(d, 59);\n          a.setSeconds(d, secMax);\n          a.setDate(d, a.date(d) - 1);\n        }\n        continue;\n      }\n      if (!this.hours.includes(a.hours(d))) {\n        if (dir === 1) {\n          a.setMinutes(d, 0);\n          a.setSeconds(d, 0);\n          a.setHours(d, a.hours(d) + 1);\n        } else {\n          a.setMinutes(d, 59);\n          a.setSeconds(d, secMax);\n          a.setHours(d, a.hours(d) - 1);\n        }\n        continue;\n      }\n      if (!this.minutes.includes(a.minutes(d))) {\n        if (dir === 1) {\n          a.setSeconds(d, 0);\n          a.setMinutes(d, a.minutes(d) + 1);\n        } else {\n          a.setSeconds(d, secMax);\n          a.setMinutes(d, a.minutes(d) - 1);\n        }\n        continue;\n      }\n      if (this.hasSeconds && !this.seconds.includes(a.seconds(d))) {\n        a.setSeconds(d, a.seconds(d) + dir);\n        continue;\n      }\n      return new Date(d.getTime());\n    }\n    throw new RangeError(`croniq: no matching time found for \"${this.expression}\" within bounds`);\n  }\n\n  /** A human-readable English description, e.g. \"At 09:00, Monday through Friday\". */\n  describe(): string {\n    const a = this.raw;\n    const two = (n: number) => n.toString().padStart(2, \"0\");\n\n    let time: string;\n    const everyMin = a.minute === \"*\";\n    const everyHour = a.hour === \"*\";\n    if (this.hasSeconds && a.seconds === \"*\" && everyMin) {\n      time = \"every second\";\n    } else if (everyMin && everyHour) {\n      time = \"every minute\";\n    } else if (this.minutes.length === 1 && this.hours.length === 1) {\n      time = `at ${two(this.hours[0] as number)}:${two(this.minutes[0] as number)}`;\n    } else if (everyHour && this.minutes.length === 1) {\n      time = `at ${this.minutes[0]} minutes past every hour`;\n    } else if (a.minute.startsWith(\"*/\")) {\n      time = `every ${a.minute.slice(2)} minutes`;\n    } else {\n      time = `at minute ${listText(this.minutes)} past hour ${listText(this.hours)}`;\n    }\n\n    const parts = [time];\n\n    if (this.dowRestricted) {\n      parts.push(dowText(this.daysOfWeek));\n    }\n    if (this.domRestricted) {\n      parts.push(`on day-of-month ${listText(this.daysOfMonth)}`);\n    }\n    if (a.month !== \"*\") {\n      parts.push(`in ${this.months.map((m) => MONTH_LABELS[m - 1]).join(\", \")}`);\n    }\n\n    return capitalize(parts.join(\", \"));\n  }\n}\n\nfunction listText(values: number[]): string {\n  if (values.length === 1) return String(values[0]);\n  if (values.length === 2) return `${values[0]} and ${values[1]}`;\n  return values.slice(0, -1).join(\", \") + \", and \" + values[values.length - 1];\n}\n\nfunction dowText(values: number[]): string {\n  // Detect a contiguous run for nicer \"X through Y\" phrasing.\n  const sorted = [...values].sort((a, b) => a - b);\n  const contiguous = sorted.every((v, i) => i === 0 || v === (sorted[i - 1] as number) + 1);\n  if (contiguous && sorted.length > 2) {\n    return `${DOW_LABELS[sorted[0] as number]} through ${DOW_LABELS[sorted[sorted.length - 1] as number]}`;\n  }\n  return sorted.map((d) => DOW_LABELS[d]).join(\", \");\n}\n\nfunction capitalize(s: string): string {\n  return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\n/**\n * Parse a cron expression into a {@link Cron} you can query.\n *\n * ```ts\n * const cron = parse(\"0 9 * * 1-5\");      // 09:00 on weekdays\n * cron.next();                            // → next weekday 09:00\n * cron.describe();                        // \"At 09:00, Monday through Friday\"\n * ```\n *\n * Supports 5 fields (min hour dom month dow) or 6 (with a leading seconds\n * field), ranges (`1-5`), lists (`1,3,5`), steps (`*​/15`), names (`JAN`,\n * `MON`), `?`, and macros (`@daily`, `@hourly`, …).\n */\nexport function parse(expression: string, options?: CronOptions): Cron {\n  return new Cron(expression, options);\n}\n\n/** Returns `true` if `expression` is a valid cron expression. */\nexport function isValid(expression: string, options?: CronOptions): boolean {\n  try {\n    new Cron(expression, options);\n    return true;\n  } catch {\n    return false;\n  }\n}\n","{\n  \"name\": \"@didrod2539/croniq\",\n  \"version\": \"0.2.0\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"description\": \"Tiny, zero-dependency cron toolkit: parse cron expressions, compute next/previous run times (field-jumping, fast), validate, and describe them in plain English. Works in Node, Deno, Bun and the browser.\",\n  \"type\": \"module\",\n  \"main\": \"./dist/index.js\",\n  \"module\": \"./dist/index.js\",\n  \"types\": \"./dist/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"require\": \"./dist/index.cjs\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"sideEffects\": false,\n  \"engines\": {\n    \"node\": \">=18\"\n  },\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"test\": \"vitest run\",\n    \"test:watch\": \"vitest\",\n    \"coverage\": \"vitest run --coverage\",\n    \"typecheck\": \"tsc --noEmit\",\n    \"lint\": \"tsc --noEmit\",\n    \"prepublishOnly\": \"npm run build\"\n  },\n  \"keywords\": [\n    \"cron\",\n    \"crontab\",\n    \"cron-parser\",\n    \"schedule\",\n    \"scheduler\",\n    \"cron-expression\",\n    \"next-run\",\n    \"cron-validate\",\n    \"cron-description\",\n    \"interval\",\n    \"zero-dependency\",\n    \"cli\"\n  ],\n  \"author\": \"didrod205 (https://github.com/didrod205)\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/didrod205/croniq.git\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/didrod205/croniq/issues\"\n  },\n  \"homepage\": \"https://github.com/didrod205/croniq#readme\",\n  \"devDependencies\": {\n    \"@types/node\": \"^22.19.19\",\n    \"@vitest/coverage-v8\": \"^2.1.8\",\n    \"tsup\": \"^8.3.5\",\n    \"typescript\": \"^5.7.2\",\n    \"vitest\": \"^2.1.8\"\n  },\n  \"bin\": {\n    \"croniq\": \"./dist/cli.js\"\n  }\n}\n","#!/usr/bin/env node\n/**\n * croniq CLI — understand a cron expression in your terminal. Zero-dependency.\n *\n *   croniq \"0 9 * * 1\"                  # describe + next runs\n *   croniq next \"every 15 min\" -n 5     # the next 5 run times\n *   croniq describe \"0 0 1 * *\"         # plain-English description\n *   croniq valid \"61 * * * *\"           # exit 1 if invalid\n */\n\nimport { Cron, isValid, parse } from \"./index.js\";\nimport pkg from \"../package.json\";\n\nconst HELP = `croniq — parse, describe and compute runs for cron expressions.\n\nUsage:\n  croniq <expression>            Describe it and show the next few runs\n  croniq describe <expression>   Plain-English description only\n  croniq next <expression>       Next run time(s) (use -n for more)\n  croniq prev <expression>       Previous run time\n  croniq valid <expression>      Exit 0 if valid, 1 if not\n\nOptions:\n  -n, --count <n>   How many runs to list (default 5 for \\`next\\`)\n      --utc         Interpret/print times in UTC\n      --iso         Print times as ISO 8601\n  -h, --help        Show this help\n  -v, --version     Show version\n\nSupports standard 5-field cron (with ranges, steps, lists, names). All local.`;\n\ninterface Flags {\n  positional: string[];\n  count: number | null;\n  utc: boolean;\n  iso: boolean;\n}\n\nfunction parseFlags(argv: string[]): Flags {\n  const f: Flags = { positional: [], count: null, utc: false, iso: false };\n  for (let i = 0; i < argv.length; i++) {\n    const a = argv[i]!;\n    if (a === \"-n\" || a === \"--count\") f.count = Math.max(1, Number(argv[++i]) || 1);\n    else if (a === \"--utc\") f.utc = true;\n    else if (a === \"--iso\") f.iso = true;\n    else if (!a.startsWith(\"-\")) f.positional.push(a);\n  }\n  return f;\n}\n\nfunction fmt(d: Date, f: Flags): string {\n  if (f.iso) return d.toISOString();\n  return f.utc ? d.toUTCString() : d.toString();\n}\n\nfunction main(): number {\n  const argv = process.argv.slice(2);\n  if (argv.length === 0 || argv.includes(\"-h\") || argv.includes(\"--help\")) {\n    process.stdout.write(HELP + \"\\n\");\n    return argv.length === 0 ? 2 : 0;\n  }\n  if (argv[0] === \"-v\" || argv[0] === \"--version\") {\n    process.stdout.write(`croniq ${pkg.version}\\n`);\n    return 0;\n  }\n\n  const f = parseFlags(argv);\n  const sub = new Set([\"describe\", \"next\", \"prev\", \"valid\"]);\n  const cmd = sub.has(f.positional[0] ?? \"\") ? f.positional[0]! : \"show\";\n  const expr = cmd === \"show\" ? f.positional.join(\" \") : f.positional.slice(1).join(\" \");\n\n  if (!expr) {\n    process.stderr.write(\"croniq: provide a cron expression. See --help.\\n\");\n    return 2;\n  }\n\n  if (cmd === \"valid\") {\n    const ok = isValid(expr, f.utc ? { utc: true } : undefined);\n    if (!ok) process.stderr.write(`croniq: \"${expr}\" is not a valid cron expression\\n`);\n    return ok ? 0 : 1;\n  }\n\n  let cron: Cron;\n  try {\n    cron = parse(expr, f.utc ? { utc: true } : undefined);\n  } catch (e) {\n    process.stderr.write(`croniq: ${(e as Error).message}\\n`);\n    return 1;\n  }\n\n  switch (cmd) {\n    case \"describe\":\n      process.stdout.write(cron.describe() + \"\\n\");\n      return 0;\n    case \"prev\":\n      process.stdout.write(fmt(cron.prev(), f) + \"\\n\");\n      return 0;\n    case \"next\": {\n      const runs = cron.nextN(f.count ?? 5);\n      process.stdout.write(runs.map((d) => fmt(d, f)).join(\"\\n\") + \"\\n\");\n      return 0;\n    }\n    default: {\n      // show: description + next N runs\n      process.stdout.write(`${cron.describe()}\\n\\nNext runs:\\n`);\n      const runs = cron.nextN(f.count ?? 5);\n      process.stdout.write(runs.map((d) => \"  \" + fmt(d, f)).join(\"\\n\") + \"\\n\");\n      return 0;\n    }\n  }\n}\n\nprocess.exit(main());\n"]}