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