@gabrielbryk/jq-ts 1.4.0 → 1.5.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/dist/index.d.mts CHANGED
@@ -377,10 +377,26 @@ declare const resolveLimits: (config?: LimitsConfig) => ResolvedLimits;
377
377
  */
378
378
  declare class LimitTracker {
379
379
  private readonly limits;
380
+ private readonly nowSeconds?;
380
381
  private steps;
381
382
  private depth;
382
383
  private outputs;
383
- constructor(limits: ResolvedLimits);
384
+ /**
385
+ * @param limits - Resolved execution limits.
386
+ * @param nowSeconds - The wall-clock instant exposed to the `now` builtin, as
387
+ * seconds since the Unix epoch (may be fractional). When `undefined`, the
388
+ * `now` builtin throws rather than reading the host clock — jq-ts never
389
+ * reads the real clock on its own, so date programs stay deterministic
390
+ * unless the caller injects a clock via `options.now`.
391
+ */
392
+ constructor(limits: ResolvedLimits, nowSeconds?: number | undefined);
393
+ /**
394
+ * Returns the injected wall-clock instant (seconds since the Unix epoch) for
395
+ * the `now` builtin.
396
+ * @param span - The source span for error reporting.
397
+ * @throws {RuntimeError} If no clock was injected (`options.now` was unset).
398
+ */
399
+ now(span: Span): number;
384
400
  /**
385
401
  * Records a single execution step (AST node visit).
386
402
  * @param span - The source span for error reporting.
@@ -430,6 +446,13 @@ interface EvalOptions {
430
446
  * Keys are variable names without the '$' prefix.
431
447
  */
432
448
  vars?: Record<string, Value>;
449
+ /**
450
+ * The wall-clock instant the `now` builtin resolves to — a `Date` or seconds
451
+ * since the Unix epoch. When omitted, `now` throws (jq-ts never reads the
452
+ * host clock on its own). Pure date builtins (`gmtime`, `strftime`, `todate`,
453
+ * …) are unaffected.
454
+ */
455
+ now?: Date | number;
433
456
  }
434
457
  //#endregion
435
458
  //#region src/eval/dispatch.d.ts
@@ -446,6 +469,15 @@ interface EvalOptions$1 {
446
469
  * Keys are variable names without the '$' prefix.
447
470
  */
448
471
  vars?: Record<string, Value>;
472
+ /**
473
+ * The wall-clock instant the `now` builtin resolves to. Accepts a `Date` or
474
+ * a number of seconds since the Unix epoch (may be fractional). When omitted,
475
+ * `now` throws — jq-ts never reads the host clock on its own, so date
476
+ * programs stay deterministic unless a clock is explicitly injected. Pure
477
+ * date builtins that take an explicit epoch (`gmtime`, `strftime`, `todate`,
478
+ * …) work regardless of this option.
479
+ */
480
+ now?: Date | number;
449
481
  }
450
482
  /**
451
483
  * Runs a jq AST against an input value.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/span.ts","../src/ast.ts","../src/parser.ts","../src/validate.ts","../src/limits.ts","../src/value.ts","../src/eval/types.ts","../src/eval/dispatch.ts","../src/errors.ts","../src/compat.ts","../src/index.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/span.ts","../src/ast.ts","../src/parser.ts","../src/validate.ts","../src/limits.ts","../src/value.ts","../src/eval/types.ts","../src/eval/dispatch.ts","../src/errors.ts","../src/compat.ts","../src/index.ts"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -3346,6 +3346,540 @@ const mathBuiltins = [
3346
3346
  }
3347
3347
  ];
3348
3348
  //#endregion
3349
+ //#region src/builtins/dates.ts
3350
+ /**
3351
+ * Date/time builtins matching the jq binary (jq 1.7+/1.8).
3352
+ *
3353
+ * jq represents time in two forms:
3354
+ * - a number of seconds since the Unix epoch (possibly fractional), and
3355
+ * - a "broken down time": an 8-element array
3356
+ * [ year, month(0-11), mday, hour, minute, second,
3357
+ * weekday(0-6, Sun=0), yearday(0-365) ].
3358
+ * The second slot carries the fractional part of the input, and `year` is
3359
+ * the full year (NOT year-1900). This mirrors `1425599507 | gmtime ==
3360
+ * [2015,2,5,23,51,47,4,63]`.
3361
+ *
3362
+ * `now` is the only clock-dependent builtin; it reads the instant injected via
3363
+ * `options.now` and throws when none was supplied (jq-ts never reads the host
3364
+ * clock on its own). Every other builtin here is a pure function of its input.
3365
+ *
3366
+ * Known deviation: `strftime`'s `%s` specifier is computed as the UTC epoch of
3367
+ * the broken-down time, whereas glibc's `%s` uses the host timezone. jq-ts
3368
+ * favors determinism/portability here; every other specifier matches jq.
3369
+ */
3370
+ const WEEKDAY_ABBR = [
3371
+ "Sun",
3372
+ "Mon",
3373
+ "Tue",
3374
+ "Wed",
3375
+ "Thu",
3376
+ "Fri",
3377
+ "Sat"
3378
+ ];
3379
+ const WEEKDAY_FULL = [
3380
+ "Sunday",
3381
+ "Monday",
3382
+ "Tuesday",
3383
+ "Wednesday",
3384
+ "Thursday",
3385
+ "Friday",
3386
+ "Saturday"
3387
+ ];
3388
+ const MONTH_ABBR = [
3389
+ "Jan",
3390
+ "Feb",
3391
+ "Mar",
3392
+ "Apr",
3393
+ "May",
3394
+ "Jun",
3395
+ "Jul",
3396
+ "Aug",
3397
+ "Sep",
3398
+ "Oct",
3399
+ "Nov",
3400
+ "Dec"
3401
+ ];
3402
+ const MONTH_FULL = [
3403
+ "January",
3404
+ "February",
3405
+ "March",
3406
+ "April",
3407
+ "May",
3408
+ "June",
3409
+ "July",
3410
+ "August",
3411
+ "September",
3412
+ "October",
3413
+ "November",
3414
+ "December"
3415
+ ];
3416
+ const MS_PER_DAY = 864e5;
3417
+ /**
3418
+ * `Date.UTC` / `new Date(y, …)` map years 0–99 to 1900–1999 (a legacy JS
3419
+ * quirk). jq uses the literal year, so these helpers correct it via
3420
+ * `setUTCFullYear` / `setFullYear`, which accept the true year.
3421
+ */
3422
+ const utcMillis = (year, mon, mday, hour = 0, min = 0, sec = 0) => {
3423
+ const ms = Date.UTC(year, mon, mday, hour, min, sec);
3424
+ if (year >= 0 && year <= 99) {
3425
+ const d = new Date(ms);
3426
+ d.setUTCFullYear(year);
3427
+ return d.getTime();
3428
+ }
3429
+ return ms;
3430
+ };
3431
+ const localMillis = (year, mon, mday, hour = 0, min = 0, sec = 0) => {
3432
+ const d = new Date(year, mon, mday, hour, min, sec);
3433
+ if (year >= 0 && year <= 99) d.setFullYear(year);
3434
+ return d.getTime();
3435
+ };
3436
+ const pad = (value, width, fill = "0") => String(Math.trunc(value)).padStart(width, fill);
3437
+ const requireNumber = (input, fn, span) => {
3438
+ if (typeof input !== "number") throw new RuntimeError(`${fn}() requires numeric inputs`, span);
3439
+ return input;
3440
+ };
3441
+ const requireString = (input, fn, span) => {
3442
+ if (typeof input !== "string") throw new RuntimeError(`${fn} requires a string, got ${describeType(input)}`, span);
3443
+ return input;
3444
+ };
3445
+ /** Day-of-year (0-based), computed with date-only UTC math so DST can't skew it. */
3446
+ const yearDay = (year, mon, mday) => Math.round((utcMillis(year, mon, mday) - utcMillis(year, 0, 1)) / MS_PER_DAY);
3447
+ /** Converts epoch seconds into broken-down time fields (UTC or local). */
3448
+ const fieldsFromEpoch = (epochSeconds, utc) => {
3449
+ const whole = Math.floor(epochSeconds);
3450
+ const frac = epochSeconds - whole;
3451
+ const d = /* @__PURE__ */ new Date(whole * 1e3);
3452
+ const year = utc ? d.getUTCFullYear() : d.getFullYear();
3453
+ const mon = utc ? d.getUTCMonth() : d.getMonth();
3454
+ const mday = utc ? d.getUTCDate() : d.getDate();
3455
+ const hour = utc ? d.getUTCHours() : d.getHours();
3456
+ const min = utc ? d.getUTCMinutes() : d.getMinutes();
3457
+ const sec = utc ? d.getUTCSeconds() : d.getSeconds();
3458
+ const wday = utc ? d.getUTCDay() : d.getDay();
3459
+ return {
3460
+ year,
3461
+ mon,
3462
+ mday,
3463
+ hour,
3464
+ min,
3465
+ sec: sec + frac,
3466
+ wday,
3467
+ yday: yearDay(year, mon, mday)
3468
+ };
3469
+ };
3470
+ const fieldsToArray = (f) => [
3471
+ f.year,
3472
+ f.mon,
3473
+ f.mday,
3474
+ f.hour,
3475
+ f.min,
3476
+ f.sec,
3477
+ f.wday,
3478
+ f.yday
3479
+ ];
3480
+ /**
3481
+ * Parses a jq broken-down time array into fields. Missing trailing slots
3482
+ * default to 0 (jq is lenient: `[1,2,3] | mktime` works); present-but-non-number
3483
+ * slots are an error. wday/yday are derived from the calendar date when absent.
3484
+ */
3485
+ const fieldsFromArray = (input, fn, span) => {
3486
+ if (!Array.isArray(input)) throw new RuntimeError(`${fn} requires array inputs`, span);
3487
+ const at = (index) => {
3488
+ if (index >= input.length) return 0;
3489
+ const raw = input[index];
3490
+ if (typeof raw !== "number") throw new RuntimeError(`${fn} requires an array of numbers`, span);
3491
+ return raw;
3492
+ };
3493
+ const year = at(0);
3494
+ const mon = at(1);
3495
+ const mday = at(2);
3496
+ return {
3497
+ year,
3498
+ mon,
3499
+ mday,
3500
+ hour: at(3),
3501
+ min: at(4),
3502
+ sec: at(5),
3503
+ wday: input.length > 6 && typeof input[6] === "number" ? input[6] : new Date(utcMillis(year, mon, mday)).getUTCDay(),
3504
+ yday: input.length > 7 && typeof input[7] === "number" ? input[7] : yearDay(year, mon, mday)
3505
+ };
3506
+ };
3507
+ /** Converts broken-down time fields back into epoch seconds (mktime). */
3508
+ const epochFromFields = (f, utc) => {
3509
+ const wholeSec = Math.floor(f.sec);
3510
+ const frac = f.sec - wholeSec;
3511
+ return (utc ? utcMillis(f.year, f.mon, f.mday, f.hour, f.min, wholeSec) : localMillis(f.year, f.mon, f.mday, f.hour, f.min, wholeSec)) / 1e3 + frac;
3512
+ };
3513
+ /** ISO-8601 week-numbering year and week (for %G / %V). */
3514
+ const isoWeek = (year, mon, mday) => {
3515
+ const date = new Date(utcMillis(year, mon, mday));
3516
+ const dayNum = (date.getUTCDay() + 6) % 7;
3517
+ date.setUTCDate(date.getUTCDate() - dayNum + 3);
3518
+ const isoYear = date.getUTCFullYear();
3519
+ const firstThursday = new Date(utcMillis(isoYear, 0, 4));
3520
+ const firstDayNum = (firstThursday.getUTCDay() + 6) % 7;
3521
+ firstThursday.setUTCDate(firstThursday.getUTCDate() - firstDayNum + 3);
3522
+ return {
3523
+ year: isoYear,
3524
+ week: 1 + Math.round((date.getTime() - firstThursday.getTime()) / (7 * MS_PER_DAY))
3525
+ };
3526
+ };
3527
+ const localOffsetString = (f) => {
3528
+ const offsetMin = -new Date(localMillis(f.year, f.mon, f.mday, f.hour, f.min, Math.floor(f.sec))).getTimezoneOffset();
3529
+ const sign = offsetMin >= 0 ? "+" : "-";
3530
+ const abs = Math.abs(offsetMin);
3531
+ return `${sign}${pad(Math.floor(abs / 60), 2)}${pad(abs % 60, 2)}`;
3532
+ };
3533
+ /** Best-effort local timezone abbreviation via Intl, falling back to the offset. */
3534
+ const localTzAbbr = (f) => {
3535
+ try {
3536
+ const tz = new Intl.DateTimeFormat("en-US", { timeZoneName: "short" }).formatToParts(new Date(localMillis(f.year, f.mon, f.mday, f.hour, f.min, Math.floor(f.sec)))).find((p) => p.type === "timeZoneName")?.value;
3537
+ if (tz) return tz;
3538
+ } catch {}
3539
+ return localOffsetString(f);
3540
+ };
3541
+ /** Formats broken-down time with a C `strftime`-style format. */
3542
+ const formatStrftime = (f, fmt, utc) => {
3543
+ const hour12 = f.hour % 12 === 0 ? 12 : f.hour % 12;
3544
+ let out = "";
3545
+ for (let i = 0; i < fmt.length; i++) {
3546
+ if (fmt[i] !== "%") {
3547
+ out += fmt[i];
3548
+ continue;
3549
+ }
3550
+ i++;
3551
+ const spec = fmt[i];
3552
+ switch (spec) {
3553
+ case "Y":
3554
+ out += String(f.year);
3555
+ break;
3556
+ case "C":
3557
+ out += pad(Math.floor(f.year / 100), 2);
3558
+ break;
3559
+ case "y":
3560
+ out += pad((f.year % 100 + 100) % 100, 2);
3561
+ break;
3562
+ case "m":
3563
+ out += pad(f.mon + 1, 2);
3564
+ break;
3565
+ case "d":
3566
+ out += pad(f.mday, 2);
3567
+ break;
3568
+ case "e":
3569
+ out += pad(f.mday, 2, " ");
3570
+ break;
3571
+ case "H":
3572
+ out += pad(f.hour, 2);
3573
+ break;
3574
+ case "k":
3575
+ out += pad(f.hour, 2, " ");
3576
+ break;
3577
+ case "I":
3578
+ out += pad(hour12, 2);
3579
+ break;
3580
+ case "l":
3581
+ out += pad(hour12, 2, " ");
3582
+ break;
3583
+ case "M":
3584
+ out += pad(f.min, 2);
3585
+ break;
3586
+ case "S":
3587
+ out += pad(Math.floor(f.sec), 2);
3588
+ break;
3589
+ case "p":
3590
+ out += f.hour < 12 ? "AM" : "PM";
3591
+ break;
3592
+ case "P":
3593
+ out += f.hour < 12 ? "am" : "pm";
3594
+ break;
3595
+ case "j":
3596
+ out += pad(f.yday + 1, 3);
3597
+ break;
3598
+ case "a":
3599
+ out += WEEKDAY_ABBR[(f.wday % 7 + 7) % 7];
3600
+ break;
3601
+ case "A":
3602
+ out += WEEKDAY_FULL[(f.wday % 7 + 7) % 7];
3603
+ break;
3604
+ case "b":
3605
+ case "h":
3606
+ out += MONTH_ABBR[(f.mon % 12 + 12) % 12];
3607
+ break;
3608
+ case "B":
3609
+ out += MONTH_FULL[(f.mon % 12 + 12) % 12];
3610
+ break;
3611
+ case "u":
3612
+ out += String(f.wday === 0 ? 7 : f.wday);
3613
+ break;
3614
+ case "w":
3615
+ out += String(f.wday);
3616
+ break;
3617
+ case "V":
3618
+ out += pad(isoWeek(f.year, f.mon, f.mday).week, 2);
3619
+ break;
3620
+ case "G":
3621
+ out += String(isoWeek(f.year, f.mon, f.mday).year);
3622
+ break;
3623
+ case "Z":
3624
+ out += utc ? "GMT" : localTzAbbr(f);
3625
+ break;
3626
+ case "z":
3627
+ out += utc ? "+0000" : localOffsetString(f);
3628
+ break;
3629
+ case "s":
3630
+ out += String(Math.floor(epochFromFields(f, true)));
3631
+ break;
3632
+ case "T":
3633
+ out += `${pad(f.hour, 2)}:${pad(f.min, 2)}:${pad(Math.floor(f.sec), 2)}`;
3634
+ break;
3635
+ case "R":
3636
+ out += `${pad(f.hour, 2)}:${pad(f.min, 2)}`;
3637
+ break;
3638
+ case "F":
3639
+ out += `${String(f.year)}-${pad(f.mon + 1, 2)}-${pad(f.mday, 2)}`;
3640
+ break;
3641
+ case "D":
3642
+ out += `${pad(f.mon + 1, 2)}/${pad(f.mday, 2)}/${pad((f.year % 100 + 100) % 100, 2)}`;
3643
+ break;
3644
+ case "n":
3645
+ out += "\n";
3646
+ break;
3647
+ case "t":
3648
+ out += " ";
3649
+ break;
3650
+ case "%":
3651
+ out += "%";
3652
+ break;
3653
+ case void 0:
3654
+ out += "%";
3655
+ break;
3656
+ default:
3657
+ out += `%${spec}`;
3658
+ break;
3659
+ }
3660
+ }
3661
+ return out;
3662
+ };
3663
+ /** Parses a string into broken-down time fields using a C `strptime`-style format. */
3664
+ const parseStrptime = (input, fmt, span) => {
3665
+ let s = 0;
3666
+ let year = 1900;
3667
+ let mon = 0;
3668
+ let mday = 1;
3669
+ let hour = 0;
3670
+ let min = 0;
3671
+ let sec = 0;
3672
+ const fail = () => {
3673
+ throw new RuntimeError(`date "${input}" does not match format "${fmt}"`, span);
3674
+ };
3675
+ const readInt = (maxLen) => {
3676
+ const start = s;
3677
+ if (input[s] === "+" || input[s] === "-") s++;
3678
+ let digits = 0;
3679
+ while (s < input.length && digits < maxLen && /[0-9]/.test(input[s])) {
3680
+ s++;
3681
+ digits++;
3682
+ }
3683
+ if (digits === 0) fail();
3684
+ return parseInt(input.slice(start, s), 10);
3685
+ };
3686
+ const matchName = (names) => {
3687
+ const lower = input.slice(s).toLowerCase();
3688
+ let best = -1;
3689
+ let bestLen = 0;
3690
+ names.forEach((name, index) => {
3691
+ const n = name.toLowerCase();
3692
+ if (lower.startsWith(n) && n.length > bestLen) {
3693
+ best = index;
3694
+ bestLen = n.length;
3695
+ }
3696
+ });
3697
+ if (best < 0) fail();
3698
+ s += bestLen;
3699
+ return best;
3700
+ };
3701
+ for (let i = 0; i < fmt.length; i++) {
3702
+ if (fmt[i] !== "%") {
3703
+ if (/\s/.test(fmt[i])) while (s < input.length && /\s/.test(input[s])) s++;
3704
+ else {
3705
+ if (input[s] !== fmt[i]) fail();
3706
+ s++;
3707
+ }
3708
+ continue;
3709
+ }
3710
+ i++;
3711
+ switch (fmt[i]) {
3712
+ case "Y":
3713
+ year = readInt(4);
3714
+ break;
3715
+ case "y": {
3716
+ const yy = readInt(2);
3717
+ year = yy < 69 ? 2e3 + yy : 1900 + yy;
3718
+ break;
3719
+ }
3720
+ case "C":
3721
+ year = readInt(2) * 100;
3722
+ break;
3723
+ case "m":
3724
+ mon = readInt(2) - 1;
3725
+ break;
3726
+ case "d":
3727
+ case "e":
3728
+ while (s < input.length && input[s] === " ") s++;
3729
+ mday = readInt(2);
3730
+ break;
3731
+ case "H":
3732
+ case "k":
3733
+ case "I":
3734
+ case "l":
3735
+ while (s < input.length && input[s] === " ") s++;
3736
+ hour = readInt(2);
3737
+ break;
3738
+ case "M":
3739
+ min = readInt(2);
3740
+ break;
3741
+ case "S":
3742
+ sec = readInt(2);
3743
+ break;
3744
+ case "j":
3745
+ readInt(3);
3746
+ break;
3747
+ case "b":
3748
+ case "B":
3749
+ case "h":
3750
+ mon = matchName([...MONTH_ABBR, ...MONTH_FULL]) % 12;
3751
+ break;
3752
+ case "a":
3753
+ case "A":
3754
+ matchName([...WEEKDAY_ABBR, ...WEEKDAY_FULL]);
3755
+ break;
3756
+ case "p":
3757
+ case "P": {
3758
+ const ampm = input.slice(s, s + 2).toUpperCase();
3759
+ if (ampm === "AM") {
3760
+ if (hour === 12) hour = 0;
3761
+ s += 2;
3762
+ } else if (ampm === "PM") {
3763
+ if (hour < 12) hour += 12;
3764
+ s += 2;
3765
+ } else fail();
3766
+ break;
3767
+ }
3768
+ case "z":
3769
+ if (input[s] === "Z") s++;
3770
+ else {
3771
+ if (input[s] === "+" || input[s] === "-") s++;
3772
+ s += 2;
3773
+ if (input[s] === ":") s++;
3774
+ s += 2;
3775
+ }
3776
+ break;
3777
+ case "Z":
3778
+ while (s < input.length && /[A-Za-z]/.test(input[s])) s++;
3779
+ break;
3780
+ case "n":
3781
+ case "t":
3782
+ while (s < input.length && /\s/.test(input[s])) s++;
3783
+ break;
3784
+ case "%":
3785
+ if (input[s] !== "%") fail();
3786
+ s++;
3787
+ break;
3788
+ default: fail();
3789
+ }
3790
+ }
3791
+ return fieldsFromEpoch(utcMillis(year, mon, mday, hour, min, sec) / 1e3, true);
3792
+ };
3793
+ /** Resolves strftime input that may be either an epoch number or a broken-down array. */
3794
+ const fieldsForFormat = (input, fn, span, utc) => typeof input === "number" ? fieldsFromEpoch(input, utc) : fieldsFromArray(input, fn, span);
3795
+ const readFormat = (value, fn, span) => {
3796
+ if (typeof value !== "string") throw new RuntimeError(`${fn}/1 requires a string format`, span);
3797
+ return value;
3798
+ };
3799
+ const ISO8601 = "%Y-%m-%dT%H:%M:%SZ";
3800
+ const dateBuiltins = [
3801
+ {
3802
+ name: "now",
3803
+ arity: 0,
3804
+ apply: function* (_input, _args, _env, tracker, _eval, span) {
3805
+ yield emit$1(tracker.now(span), span, tracker);
3806
+ }
3807
+ },
3808
+ {
3809
+ name: "gmtime",
3810
+ arity: 0,
3811
+ apply: function* (input, _args, _env, tracker, _eval, span) {
3812
+ yield emit$1(fieldsToArray(fieldsFromEpoch(requireNumber(input, "gmtime", span), true)), span, tracker);
3813
+ }
3814
+ },
3815
+ {
3816
+ name: "localtime",
3817
+ arity: 0,
3818
+ apply: function* (input, _args, _env, tracker, _eval, span) {
3819
+ yield emit$1(fieldsToArray(fieldsFromEpoch(requireNumber(input, "localtime", span), false)), span, tracker);
3820
+ }
3821
+ },
3822
+ {
3823
+ name: "mktime",
3824
+ arity: 0,
3825
+ apply: function* (input, _args, _env, tracker, _eval, span) {
3826
+ yield emit$1(epochFromFields(fieldsFromArray(input, "mktime", span), true), span, tracker);
3827
+ }
3828
+ },
3829
+ {
3830
+ name: "strftime",
3831
+ arity: 1,
3832
+ apply: function* (input, args, env, tracker, evaluate, span) {
3833
+ const fields = fieldsForFormat(input, "strftime", span, true);
3834
+ for (const fmt of evaluate(args[0], input, env, tracker)) yield emit$1(formatStrftime(fields, readFormat(fmt, "strftime", span), true), span, tracker);
3835
+ }
3836
+ },
3837
+ {
3838
+ name: "strflocaltime",
3839
+ arity: 1,
3840
+ apply: function* (input, args, env, tracker, evaluate, span) {
3841
+ const fields = fieldsForFormat(input, "strflocaltime", span, false);
3842
+ for (const fmt of evaluate(args[0], input, env, tracker)) yield emit$1(formatStrftime(fields, readFormat(fmt, "strflocaltime", span), false), span, tracker);
3843
+ }
3844
+ },
3845
+ {
3846
+ name: "strptime",
3847
+ arity: 1,
3848
+ apply: function* (input, args, env, tracker, evaluate, span) {
3849
+ const str = requireString(input, "strptime", span);
3850
+ for (const fmt of evaluate(args[0], input, env, tracker)) yield emit$1(fieldsToArray(parseStrptime(str, readFormat(fmt, "strptime", span), span)), span, tracker);
3851
+ }
3852
+ },
3853
+ {
3854
+ name: "todate",
3855
+ arity: 0,
3856
+ apply: function* (input, _args, _env, tracker, _eval, span) {
3857
+ yield emit$1(formatStrftime(fieldsFromEpoch(requireNumber(input, "todate", span), true), ISO8601, true), span, tracker);
3858
+ }
3859
+ },
3860
+ {
3861
+ name: "todateiso8601",
3862
+ arity: 0,
3863
+ apply: function* (input, _args, _env, tracker, _eval, span) {
3864
+ yield emit$1(formatStrftime(fieldsFromEpoch(requireNumber(input, "todateiso8601", span), true), ISO8601, true), span, tracker);
3865
+ }
3866
+ },
3867
+ {
3868
+ name: "fromdate",
3869
+ arity: 0,
3870
+ apply: function* (input, _args, _env, tracker, _eval, span) {
3871
+ yield emit$1(epochFromFields(parseStrptime(requireString(input, "fromdate", span), ISO8601, span), true), span, tracker);
3872
+ }
3873
+ },
3874
+ {
3875
+ name: "fromdateiso8601",
3876
+ arity: 0,
3877
+ apply: function* (input, _args, _env, tracker, _eval, span) {
3878
+ yield emit$1(epochFromFields(parseStrptime(requireString(input, "fromdateiso8601", span), ISO8601, span), true), span, tracker);
3879
+ }
3880
+ }
3881
+ ];
3882
+ //#endregion
3349
3883
  //#region src/builtins/index.ts
3350
3884
  const registerAllBuiltins = () => {
3351
3885
  registerBuiltins(stdBuiltins);
@@ -3355,6 +3889,7 @@ const registerAllBuiltins = () => {
3355
3889
  registerBuiltins(pathBuiltins);
3356
3890
  registerBuiltins(iteratorBuiltins);
3357
3891
  registerBuiltins(mathBuiltins);
3892
+ registerBuiltins(dateBuiltins);
3358
3893
  };
3359
3894
  //#endregion
3360
3895
  //#region src/builtins.ts
@@ -3511,8 +4046,27 @@ var LimitTracker = class {
3511
4046
  steps = 0;
3512
4047
  depth = 0;
3513
4048
  outputs = 0;
3514
- constructor(limits) {
4049
+ /**
4050
+ * @param limits - Resolved execution limits.
4051
+ * @param nowSeconds - The wall-clock instant exposed to the `now` builtin, as
4052
+ * seconds since the Unix epoch (may be fractional). When `undefined`, the
4053
+ * `now` builtin throws rather than reading the host clock — jq-ts never
4054
+ * reads the real clock on its own, so date programs stay deterministic
4055
+ * unless the caller injects a clock via `options.now`.
4056
+ */
4057
+ constructor(limits, nowSeconds) {
3515
4058
  this.limits = limits;
4059
+ this.nowSeconds = nowSeconds;
4060
+ }
4061
+ /**
4062
+ * Returns the injected wall-clock instant (seconds since the Unix epoch) for
4063
+ * the `now` builtin.
4064
+ * @param span - The source span for error reporting.
4065
+ * @throws {RuntimeError} If no clock was injected (`options.now` was unset).
4066
+ */
4067
+ now(span) {
4068
+ if (this.nowSeconds === void 0) throw new RuntimeError("now/0 requires an injected clock; pass options.now (a Date or epoch seconds)", span);
4069
+ return this.nowSeconds;
3516
4070
  }
3517
4071
  /**
3518
4072
  * Records a single execution step (AST node visit).
@@ -4078,6 +4632,13 @@ const evalLabel = function* (node, input, env, tracker, evaluate) {
4078
4632
  //#endregion
4079
4633
  //#region src/eval/dispatch.ts
4080
4634
  /**
4635
+ * Normalizes the `now` option to seconds since the Unix epoch.
4636
+ */
4637
+ const resolveNowSeconds = (now) => {
4638
+ if (now === void 0) return void 0;
4639
+ return now instanceof Date ? now.getTime() / 1e3 : now;
4640
+ };
4641
+ /**
4081
4642
  * Runs a jq AST against an input value.
4082
4643
  *
4083
4644
  * @param ast - The parsed AST.
@@ -4086,7 +4647,7 @@ const evalLabel = function* (node, input, env, tracker, evaluate) {
4086
4647
  * @returns An array of all values yielded by the filter.
4087
4648
  */
4088
4649
  const runAst = (ast, input, options = {}) => {
4089
- const tracker = new LimitTracker(resolveLimits(options.limits));
4650
+ const tracker = new LimitTracker(resolveLimits(options.limits), resolveNowSeconds(options.now));
4090
4651
  const env = [{
4091
4652
  vars: new Map(Object.entries(options.vars ?? {})),
4092
4653
  funcs: /* @__PURE__ */ new Map()
@@ -4372,7 +4933,6 @@ const classifyError = (err) => {
4372
4933
  return "unsupported-syntax";
4373
4934
  };
4374
4935
  const isIntentionalExclusion = (message) => [
4375
- "now",
4376
4936
  "input",
4377
4937
  "inputs",
4378
4938
  "env"