@c9up/chronos 0.1.9 → 0.1.11
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/README.md +143 -7
- package/dist/DateTime.d.ts.map +1 -1
- package/dist/DateTime.js +74 -15
- package/dist/DateTime.js.map +1 -1
- package/dist/Interval.d.ts +1 -1
- package/dist/Interval.d.ts.map +1 -1
- package/dist/Interval.js +34 -21
- package/dist/Interval.js.map +1 -1
- package/dist/native/generated.d.ts +41 -0
- package/dist/native/generated.d.ts.map +1 -0
- package/dist/native/generated.js +7 -0
- package/dist/native/generated.js.map +1 -0
- package/dist/native.d.ts +11 -40
- package/dist/native.d.ts.map +1 -1
- package/dist/native.js.map +1 -1
- package/index.darwin-arm64.node +0 -0
- package/index.darwin-x64.node +0 -0
- package/index.linux-arm64-gnu.node +0 -0
- package/index.linux-x64-gnu.node +0 -0
- package/index.win32-x64-msvc.node +0 -0
- package/package.json +3 -2
- package/scripts/build-napi-types.mjs +68 -0
- package/scripts/generate-napi-types.mjs +153 -0
- package/src/DateTime.ts +80 -15
- package/src/Interval.ts +39 -22
- package/src/native/generated.ts +87 -0
- package/src/native.ts +11 -39
package/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# @c9up/chronos
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Dates, durations, intervals and recurrence rules for Node.js — a small immutable API over a Rust N-API core.
|
|
4
4
|
|
|
5
|
-
Part of **[Ream](https://github.com/C9up/ream)
|
|
5
|
+
Part of **[Ream](https://github.com/C9up/ream)**, and usable on its own: chronos depends on nothing else in the ecosystem.
|
|
6
6
|
|
|
7
7
|
## Installation
|
|
8
8
|
|
|
@@ -10,18 +10,154 @@ Part of **[Ream](https://github.com/C9up/ream)** — a Rust-powered, AdonisJS-co
|
|
|
10
10
|
pnpm add @c9up/chronos
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
The Rust binary is required — there is no JavaScript fallback.
|
|
14
|
+
|
|
15
|
+
## DateTime
|
|
16
|
+
|
|
17
|
+
Immutable. Every method that would change an instant returns a new one, and the
|
|
18
|
+
zone travels with it.
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
import { DateTime, at } from '@c9up/chronos'
|
|
22
|
+
|
|
23
|
+
const d = DateTime.from('2026-06-05T14:30:00Z')
|
|
24
|
+
|
|
25
|
+
d.plus(1, 'month').toISO() // 2026-07-05T14:30:00.000Z
|
|
26
|
+
d.setZone('Europe/Zurich')
|
|
27
|
+
.toZonedISO() // 2026-06-05T16:30:00+02:00
|
|
28
|
+
d.format('DD/MM/YYYY HH:mm') // 05/06/2026 14:30
|
|
29
|
+
d.startOf('month').toISO() // 2026-06-01T00:00:00.000Z
|
|
30
|
+
d.diff('2026-01-01', 'day') // 155.604 (a minus b, fractional)
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
`at()` is the same thing, shorter: `at('2026-06-05')`.
|
|
34
|
+
|
|
35
|
+
Built from whatever you have:
|
|
36
|
+
`from` · `now` · `fromMillis` · `fromSeconds` · `fromUnix` · `fromJSDate` ·
|
|
37
|
+
`fromObject` · `fromRFC2822` · `fromSQL` · `fromHTTP`.
|
|
38
|
+
|
|
39
|
+
Read out as `toISO` · `toZonedISO` · `toDate` · `toMillis` · `toSeconds` ·
|
|
40
|
+
`format` · `toLocaleString` · `toRelative`, compared with `equals` · `isBefore` ·
|
|
41
|
+
`isAfter` · `isSameDay` · `hasSame` · `isWithin`, and moved with `plus` ·
|
|
42
|
+
`minus` · `startOf` · `endOf` · `setZone` · `toUTC`.
|
|
43
|
+
|
|
44
|
+
### A date that does not exist is refused
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
DateTime.from('2026-02-30')
|
|
48
|
+
// Invalid date '2026-02-30': February 2026 has 28 days, so there is no day 30.
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
`new Date('2026-02-30')` answers March 2nd. Those overflow semantics are right
|
|
52
|
+
for arithmetic and wrong for reading input, where the same slide turns a typo
|
|
53
|
+
into a fact. Only the *written* date is checked, so an offset that legitimately
|
|
54
|
+
moves the UTC day still works:
|
|
55
|
+
|
|
56
|
+
```ts
|
|
57
|
+
DateTime.from('2026-08-10T23:00:00-05:00').toISO() // 2026-08-11T04:00:00.000Z
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Arithmetic still slides, because there the slide is the point — and it clamps
|
|
61
|
+
to the month rather than overflowing past it:
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
DateTime.from('2026-01-31').plus(1, 'month').toISO() // 2026-02-28T00:00:00.000Z
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Calendar parts
|
|
68
|
+
|
|
69
|
+
```ts
|
|
70
|
+
DateTime.from('2026-06-05').calendar
|
|
71
|
+
// { year: 2026, month: 6, day: 5, weekday: 5, weekNumber: 23, weekYear: 2026,
|
|
72
|
+
// ordinal: 156, quarter: 2, daysInMonth: 30, daysInYear: 365,
|
|
73
|
+
// isLeapYear: false, ... }
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Each is also a getter: `d.quarter`, `d.weekNumber`, `d.daysInMonth`, and so on.
|
|
77
|
+
|
|
78
|
+
## Duration
|
|
79
|
+
|
|
80
|
+
```ts
|
|
81
|
+
import { Duration } from '@c9up/chronos'
|
|
82
|
+
|
|
83
|
+
Duration.fromObject({ hours: 2, minutes: 30 }).toHuman() // 2 hours, 30 minutes
|
|
84
|
+
Duration.fromISO('PT90M').as('hours') // 1.5
|
|
85
|
+
Duration.fromObject({ minutes: 90 }).normalize().toObject()
|
|
86
|
+
// { years: 0, months: 0, weeks: 0, days: 0, hours: 1, minutes: 30, ... }
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
`plus` · `minus` · `negate` · `normalize` · `shiftTo` · `as` · `get`, out as
|
|
90
|
+
`toISO` · `toFormat` · `toHuman` · `toObject`.
|
|
91
|
+
|
|
92
|
+
## Interval
|
|
93
|
+
|
|
94
|
+
A half-open span, `start` included and `end` excluded.
|
|
95
|
+
|
|
96
|
+
```ts
|
|
97
|
+
import { Interval, DateTime } from '@c9up/chronos'
|
|
98
|
+
|
|
99
|
+
const june = Interval.fromDateTimes(
|
|
100
|
+
DateTime.from('2026-06-01'),
|
|
101
|
+
DateTime.from('2026-07-01'),
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
june.length('days') // 30
|
|
105
|
+
june.contains(DateTime.from('2026-06-15')) // true
|
|
106
|
+
june.splitBy({ amount: 1, unit: 'week' }) // 5 intervals
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Set operations: `overlaps` · `engulfs` · `intersection` · `union` ·
|
|
110
|
+
`abutsStart` · `abutsEnd` · `splitBy` · `splitAt`.
|
|
111
|
+
|
|
112
|
+
Units are accepted singular or plural, and an unknown one is refused rather
|
|
113
|
+
than quietly measured in milliseconds.
|
|
114
|
+
|
|
115
|
+
## Recurrence (RFC 5545)
|
|
116
|
+
|
|
117
|
+
```ts
|
|
118
|
+
import { expandRRule, toRRuleString } from '@c9up/chronos'
|
|
119
|
+
|
|
120
|
+
expandRRule('2026-06-01T09:00:00Z', { freq: 'WEEKLY', byDay: ['MO', 'WE'], count: 4 })
|
|
121
|
+
// 2026-06-01T09:00:00.000Z, 2026-06-03T09:00:00.000Z,
|
|
122
|
+
// 2026-06-08T09:00:00.000Z, 2026-06-10T09:00:00.000Z
|
|
123
|
+
|
|
124
|
+
toRRuleString({ freq: 'MONTHLY', byMonthDay: [1, 15] })
|
|
125
|
+
// FREQ=MONTHLY;BYMONTHDAY=1,15
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
A rule takes `freq` · `interval` · `wkst` · `byDay` · `byMonthDay` · `byMonth` ·
|
|
129
|
+
`byWeekNo` · `byYearDay` · `bySetPos` · `byHour` · `byMinute` · `bySecond`, and
|
|
130
|
+
ends on `count` or `until`.
|
|
131
|
+
|
|
132
|
+
## Ranges
|
|
133
|
+
|
|
134
|
+
For the cases where a plain `{ start, end }` pair is enough:
|
|
135
|
+
|
|
136
|
+
```ts
|
|
137
|
+
import { inRange, containsRange, overlapsRange, analyzeRange } from '@c9up/chronos'
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
`analyzeRange` names the relation between two ranges rather than reducing it to
|
|
141
|
+
a boolean.
|
|
142
|
+
|
|
143
|
+
## With Atlas
|
|
144
|
+
|
|
145
|
+
`@c9up/chronos/atlas` carries the adapter that hydrates a column into a
|
|
146
|
+
`DateTime` and prepares one for the database.
|
|
14
147
|
|
|
15
148
|
```ts
|
|
16
|
-
import {
|
|
149
|
+
import { Column } from '@c9up/atlas'
|
|
150
|
+
import { dateTimeAtlasAdapter } from '@c9up/chronos/atlas'
|
|
17
151
|
|
|
18
|
-
|
|
152
|
+
class Order {
|
|
153
|
+
@Column({ adapter: dateTimeAtlasAdapter }) declare placedAt: DateTime
|
|
154
|
+
}
|
|
19
155
|
```
|
|
20
156
|
|
|
21
157
|
## Entry points
|
|
22
158
|
|
|
23
|
-
- `@c9up/chronos` —
|
|
24
|
-
- `@c9up/chronos/atlas` — Atlas
|
|
159
|
+
- `@c9up/chronos` — `DateTime`, `Duration`, `Interval`, recurrence, ranges, the `Chronos` facade
|
|
160
|
+
- `@c9up/chronos/atlas` — the Atlas column adapter
|
|
25
161
|
|
|
26
162
|
## License
|
|
27
163
|
|
package/dist/DateTime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateTime.d.ts","sourceRoot":"","sources":["../src/DateTime.ts"],"names":[],"mappings":"AAeA,MAAM,MAAM,QAAQ,GACjB,QAAQ,GACR,QAAQ,GACR,MAAM,GACN,KAAK,GACL,MAAM,GACN,OAAO,GACP,MAAM,CAAC;AACV,MAAM,MAAM,SAAS,GAClB,QAAQ,GACR,QAAQ,GACR,MAAM,GACN,KAAK,GACL,MAAM,GACN,OAAO,GACP,MAAM,CAAC;AACV,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,IAAI,GAAG,QAAQ,CAAC;AACjD,MAAM,WAAW,SAAS;IACzB,KAAK,EAAE,SAAS,CAAC;IACjB,GAAG,EAAE,SAAS,CAAC;CACf;AACD,MAAM,WAAW,mBAAmB;IACnC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;CACvB;AACD,MAAM,WAAW,aAAa;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CACjB;AACD,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"DateTime.d.ts","sourceRoot":"","sources":["../src/DateTime.ts"],"names":[],"mappings":"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"}
|
package/dist/DateTime.js
CHANGED
|
@@ -13,11 +13,83 @@
|
|
|
13
13
|
import { nativeChronos } from "./native.js";
|
|
14
14
|
import { normalizeIso } from "./utils.js";
|
|
15
15
|
// ─── Internal helpers ────────────────────────────────────────
|
|
16
|
+
const MONTH_NAMES = [
|
|
17
|
+
"January",
|
|
18
|
+
"February",
|
|
19
|
+
"March",
|
|
20
|
+
"April",
|
|
21
|
+
"May",
|
|
22
|
+
"June",
|
|
23
|
+
"July",
|
|
24
|
+
"August",
|
|
25
|
+
"September",
|
|
26
|
+
"October",
|
|
27
|
+
"November",
|
|
28
|
+
"December",
|
|
29
|
+
];
|
|
30
|
+
function isLeapYearOf(year) {
|
|
31
|
+
return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
|
|
32
|
+
}
|
|
33
|
+
function daysPerMonthOf(year) {
|
|
34
|
+
return [
|
|
35
|
+
31,
|
|
36
|
+
isLeapYearOf(year) ? 29 : 28,
|
|
37
|
+
31,
|
|
38
|
+
30,
|
|
39
|
+
31,
|
|
40
|
+
30,
|
|
41
|
+
31,
|
|
42
|
+
31,
|
|
43
|
+
30,
|
|
44
|
+
31,
|
|
45
|
+
30,
|
|
46
|
+
31,
|
|
47
|
+
];
|
|
48
|
+
}
|
|
49
|
+
function daysInMonthOf(year, month) {
|
|
50
|
+
return daysPerMonthOf(year)[month - 1];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Refuse a calendar date that does not exist, instead of sliding to the next
|
|
54
|
+
* one that does.
|
|
55
|
+
*
|
|
56
|
+
* `new Date('2026-02-30')` answers 2026-03-02: the overflow semantics are right
|
|
57
|
+
* for arithmetic — adding a month to January 31st has to land somewhere — and
|
|
58
|
+
* wrong for reading input, where the same slide turns a typo into a fact. The
|
|
59
|
+
* inconsistency was the dangerous part: '2026-13-45' threw while '2026-02-30'
|
|
60
|
+
* came back as a date, so a caller wrapping this in try/catch had covered the
|
|
61
|
+
* loud half and left the half that writes something false to the database.
|
|
62
|
+
*
|
|
63
|
+
* `fromObject` has always refused the same input; this is that check on the
|
|
64
|
+
* door that was missing it. Only the written date is examined, never the
|
|
65
|
+
* instant it resolves to, so an offset that legitimately moves the UTC day
|
|
66
|
+
* ('2026-08-10T23:00:00-05:00' → the 11th) is untouched.
|
|
67
|
+
*/
|
|
68
|
+
const CALENDAR_DATE = /^(\d{4})-(\d{2})-(\d{2})(?=$|[T ])/;
|
|
69
|
+
function assertCalendarDateExists(raw) {
|
|
70
|
+
const match = CALENDAR_DATE.exec(raw);
|
|
71
|
+
// Anything else — RFC 2822, a bare year, a basic-format string — is left to
|
|
72
|
+
// `Date`, which already refuses what it cannot read.
|
|
73
|
+
if (!match)
|
|
74
|
+
return;
|
|
75
|
+
const year = Number(match[1]);
|
|
76
|
+
const month = Number(match[2]);
|
|
77
|
+
const day = Number(match[3]);
|
|
78
|
+
if (month < 1 || month > 12) {
|
|
79
|
+
throw new Error(`Invalid date '${raw}': there is no month ${month}.`);
|
|
80
|
+
}
|
|
81
|
+
const lastDay = daysInMonthOf(year, month);
|
|
82
|
+
if (day < 1 || day > lastDay) {
|
|
83
|
+
throw new Error(`Invalid date '${raw}': ${MONTH_NAMES[month - 1]} ${year} has ${lastDay} days, so there is no day ${day}.`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
16
86
|
function toIso(value) {
|
|
17
87
|
if (value instanceof DateTime)
|
|
18
88
|
return value.toISO();
|
|
19
89
|
if (value instanceof Date)
|
|
20
90
|
return normalizeIso(value.toISOString());
|
|
91
|
+
if (typeof value === "string")
|
|
92
|
+
assertCalendarDateExists(value);
|
|
21
93
|
return normalizeIso(new Date(value).toISOString());
|
|
22
94
|
}
|
|
23
95
|
function toMs(value) {
|
|
@@ -86,21 +158,8 @@ function calendarPartsFromIso(iso) {
|
|
|
86
158
|
const minute = Number(isoMatch[5]);
|
|
87
159
|
const second = Number(isoMatch[6]);
|
|
88
160
|
const millisecond = isoMatch[7] != null ? Math.round(Number(`0.${isoMatch[7]}`) * 1000) : 0;
|
|
89
|
-
const isLeapYear = (year
|
|
90
|
-
const daysPerMonth =
|
|
91
|
-
31,
|
|
92
|
-
isLeapYear ? 29 : 28,
|
|
93
|
-
31,
|
|
94
|
-
30,
|
|
95
|
-
31,
|
|
96
|
-
30,
|
|
97
|
-
31,
|
|
98
|
-
31,
|
|
99
|
-
30,
|
|
100
|
-
31,
|
|
101
|
-
30,
|
|
102
|
-
31,
|
|
103
|
-
];
|
|
161
|
+
const isLeapYear = isLeapYearOf(year);
|
|
162
|
+
const daysPerMonth = daysPerMonthOf(year);
|
|
104
163
|
const daysInMonth = daysPerMonth[month - 1];
|
|
105
164
|
const daysInYear = isLeapYear ? 366 : 365;
|
|
106
165
|
let ordinal = day;
|
package/dist/DateTime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateTime.js","sourceRoot":"","sources":["../src/DateTime.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DateTime.js","sourceRoot":"","sources":["../src/DateTime.ts"],"names":[],"mappings":"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"}
|
package/dist/Interval.d.ts
CHANGED
|
@@ -28,7 +28,7 @@ export declare class Interval {
|
|
|
28
28
|
get start(): DateTime;
|
|
29
29
|
get end(): DateTime;
|
|
30
30
|
/** Length in the given unit (approximate for calendar units). */
|
|
31
|
-
length(unit?: DurationUnit): number;
|
|
31
|
+
length(unit?: DurationUnit | DateUnit): number;
|
|
32
32
|
/** Duration object between start and end. */
|
|
33
33
|
toDuration(): Duration;
|
|
34
34
|
/** Does this interval contain the given instant? Half-open: `[start, end)`. */
|
package/dist/Interval.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Interval.d.ts","sourceRoot":"","sources":["../src/Interval.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,KAAK,SAAS,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"Interval.d.ts","sourceRoot":"","sources":["../src/Interval.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,KAAK,SAAS,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAsC5D,qBAAa,QAAQ;;IAIpB;;;;;OAKG;IACH,OAAO;IAUP,oEAAoE;IACpE,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,GAAG,QAAQ;IAIhE,6CAA6C;IAC7C,MAAM,CAAC,KAAK,CACX,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,QAAQ,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,GACrD,QAAQ;IAgBX,IAAI,KAAK,IAAI,QAAQ,CAEpB;IACD,IAAI,GAAG,IAAI,QAAQ,CAElB;IAED,iEAAiE;IACjE,MAAM,CAAC,IAAI,GAAE,YAAY,GAAG,QAAyB,GAAG,MAAM;IAK9D,6CAA6C;IAC7C,UAAU,IAAI,QAAQ;IAMtB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO;IAKhC,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO;IAIhC,yDAAyD;IACzD,OAAO,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO;IAI/B,4CAA4C;IAC5C,OAAO,IAAI,OAAO;IAMlB,2CAA2C;IAC3C,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO;IAOlC,gDAAgD;IAChD,OAAO,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO;IAOjC,2EAA2E;IAC3E,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO;IAIpC,sDAAsD;IACtD,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO;IAIlC,2DAA2D;IAC3D,YAAY,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ,GAAG,IAAI;IAU9C,uFAAuF;IACvF,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ,GAAG,IAAI;IAoBvC,mFAAmF;IACnF,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,GAAG,QAAQ,EAAE;IAuB5E,6EAA6E;IAC7E,OAAO,CAAC,GAAG,GAAG,EAAE,SAAS,EAAE,GAAG,QAAQ,EAAE;IAuBxC,QAAQ,IAAI,MAAM;IAIlB,MAAM,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE;CAGxC"}
|
package/dist/Interval.js
CHANGED
|
@@ -9,6 +9,38 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { DateTime } from "./DateTime.js";
|
|
11
11
|
import { Duration } from "./Duration.js";
|
|
12
|
+
/**
|
|
13
|
+
* Milliseconds in one unit, refusing a unit it does not know.
|
|
14
|
+
*
|
|
15
|
+
* Singular and plural both resolve, as they do upstream in Luxon: the rest of
|
|
16
|
+
* chronos spells units in the singular (`plus(1, "day")`) while durations
|
|
17
|
+
* spell them in the plural (`{ days: 1 }`), and a reader moving between the
|
|
18
|
+
* two should not have to remember which door they are at.
|
|
19
|
+
*
|
|
20
|
+
* The table used to answer `1` for anything it did not recognise, so
|
|
21
|
+
* `length("day")` returned 345600000 — milliseconds, presented as days — and
|
|
22
|
+
* `splitBy` turned an unknown unit into a one-millisecond step, which on a
|
|
23
|
+
* four-day interval is 345 million sub-intervals. Both were silent. An unknown
|
|
24
|
+
* unit is a mistake in the calling code and says so now.
|
|
25
|
+
*/
|
|
26
|
+
const MS_PER_UNIT = {
|
|
27
|
+
year: 365.25 * 86400000,
|
|
28
|
+
month: 30 * 86400000,
|
|
29
|
+
week: 7 * 86400000,
|
|
30
|
+
day: 86400000,
|
|
31
|
+
hour: 3600000,
|
|
32
|
+
minute: 60000,
|
|
33
|
+
second: 1000,
|
|
34
|
+
millisecond: 1,
|
|
35
|
+
};
|
|
36
|
+
function msPerUnit(unit, caller) {
|
|
37
|
+
// Plural is the durations spelling; singular is the DateTime one.
|
|
38
|
+
const ms = MS_PER_UNIT[unit.endsWith("s") ? unit.slice(0, -1) : unit];
|
|
39
|
+
if (ms === undefined) {
|
|
40
|
+
throw new Error(`${caller}: '${unit}' is not a unit. Use one of ${Object.keys(MS_PER_UNIT).join(", ")} (plural accepted).`);
|
|
41
|
+
}
|
|
42
|
+
return ms;
|
|
43
|
+
}
|
|
12
44
|
export class Interval {
|
|
13
45
|
#start;
|
|
14
46
|
#end;
|
|
@@ -51,17 +83,7 @@ export class Interval {
|
|
|
51
83
|
/** Length in the given unit (approximate for calendar units). */
|
|
52
84
|
length(unit = "milliseconds") {
|
|
53
85
|
const ms = this.#end.toMillis() - this.#start.toMillis();
|
|
54
|
-
|
|
55
|
-
years: 365.25 * 86400000,
|
|
56
|
-
months: 30 * 86400000,
|
|
57
|
-
weeks: 7 * 86400000,
|
|
58
|
-
days: 86400000,
|
|
59
|
-
hours: 3600000,
|
|
60
|
-
minutes: 60000,
|
|
61
|
-
seconds: 1000,
|
|
62
|
-
milliseconds: 1,
|
|
63
|
-
};
|
|
64
|
-
return ms / (MS_PER[unit] ?? 1);
|
|
86
|
+
return ms / msPerUnit(unit, "Interval.length");
|
|
65
87
|
}
|
|
66
88
|
/** Duration object between start and end. */
|
|
67
89
|
toDuration() {
|
|
@@ -124,17 +146,8 @@ export class Interval {
|
|
|
124
146
|
// ─── Split ──────────────────────────────────────────────
|
|
125
147
|
/** Split this interval into N sub-intervals of roughly equal `duration` length. */
|
|
126
148
|
splitBy(duration) {
|
|
127
|
-
const unitMs = {
|
|
128
|
-
year: 365.25 * 86400000,
|
|
129
|
-
month: 30 * 86400000,
|
|
130
|
-
week: 7 * 86400000,
|
|
131
|
-
day: 86400000,
|
|
132
|
-
hour: 3600000,
|
|
133
|
-
minute: 60000,
|
|
134
|
-
second: 1000,
|
|
135
|
-
};
|
|
136
149
|
const stepMs = "amount" in duration
|
|
137
|
-
? duration.amount * (
|
|
150
|
+
? duration.amount * msPerUnit(duration.unit, "Interval.splitBy")
|
|
138
151
|
: duration.as("milliseconds");
|
|
139
152
|
if (stepMs <= 0)
|
|
140
153
|
throw new Error("splitBy duration must be positive");
|
package/dist/Interval.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Interval.js","sourceRoot":"","sources":["../src/Interval.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAkB,QAAQ,EAAiB,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAqB,MAAM,eAAe,CAAC;AAE5D,MAAM,OAAO,QAAQ;IACX,MAAM,CAAW;IACjB,IAAI,CAAW;IAExB;;;;;OAKG;IACH,YAAoB,KAAe,EAAE,GAAa;QACjD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,2DAA2D;IAE3D,oEAAoE;IACpE,MAAM,CAAC,aAAa,CAAC,KAAgB,EAAE,GAAc;QACpD,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,6CAA6C;IAC7C,MAAM,CAAC,KAAK,CACX,KAAgB,EAChB,QAAuD;QAEvD,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,sEAAsE;QACtE,wEAAwE;QACxE,6DAA6D;QAC7D,MAAM,CAAC,GACN,QAAQ,IAAI,QAAQ;YACnB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAgB,CAAC;YACpD,CAAC,CAAC,QAAQ,CAAC,UAAU,CACnB,CAAC,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CACtD,CAAC;QACL,OAAO,IAAI,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED,2DAA2D;IAE3D,IAAI,KAAK;QACR,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IACD,IAAI,GAAG;QACN,OAAO,IAAI,CAAC,IAAI,CAAC;IAClB,CAAC;IAED,iEAAiE;IACjE,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"Interval.js","sourceRoot":"","sources":["../src/Interval.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export interface CalendarPartsNapi {
|
|
2
|
+
year: number;
|
|
3
|
+
month: number;
|
|
4
|
+
day: number;
|
|
5
|
+
hour: number;
|
|
6
|
+
minute: number;
|
|
7
|
+
second: number;
|
|
8
|
+
millisecond: number;
|
|
9
|
+
weekday: number;
|
|
10
|
+
weekNumber: number;
|
|
11
|
+
weekYear: number;
|
|
12
|
+
ordinal: number;
|
|
13
|
+
quarter: number;
|
|
14
|
+
daysInMonth: number;
|
|
15
|
+
daysInYear: number;
|
|
16
|
+
isLeapYear: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface ZonedOutputNapi {
|
|
19
|
+
iso: string;
|
|
20
|
+
offsetMinutes: number;
|
|
21
|
+
zoneName: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function add(iso: string, amount: number, unit: string): string;
|
|
24
|
+
export declare function diff(aIso: string, bIso: string, unit: string): number;
|
|
25
|
+
export declare function startOf(iso: string, unit: string): string;
|
|
26
|
+
export declare function endOf(iso: string, unit: string): string;
|
|
27
|
+
export declare function format(iso: string, pattern: string): string;
|
|
28
|
+
export declare function calendarParts(iso: string): CalendarPartsNapi;
|
|
29
|
+
export declare function validateTimezone(zone: string): string;
|
|
30
|
+
export declare function toZone(utcIso: string, zone: string): ZonedOutputNapi;
|
|
31
|
+
export declare function addInZone(utcIso: string, amount: number, unit: string, zone: string): string;
|
|
32
|
+
export declare function startOfInZone(utcIso: string, unit: string, zone: string): string;
|
|
33
|
+
export declare function endOfInZone(utcIso: string, unit: string, zone: string): string;
|
|
34
|
+
export declare function diffInZone(aUtc: string, bUtc: string, unit: string, zone: string): number;
|
|
35
|
+
export declare function zoneOffset(utcIso: string, zone: string): number;
|
|
36
|
+
export declare function fromLocal(naiveIso: string, zone: string): string;
|
|
37
|
+
export declare function parseRfc2822(input: string): string;
|
|
38
|
+
export declare function parseSql(input: string): string;
|
|
39
|
+
export declare function parseHttp(input: string): string;
|
|
40
|
+
export declare function rruleExpand(startIso: string, rrule: string, limit: number): Array<string>;
|
|
41
|
+
//# sourceMappingURL=generated.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generated.d.ts","sourceRoot":"","sources":["../../src/native/generated.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// GENERATED FROM THE RUST — do not edit.
|
|
2
|
+
//
|
|
3
|
+
// Produced by scripts/generate-napi-types.mjs from napi-derive's type-def
|
|
4
|
+
// output. Editing this file by hand puts it back where it started: a
|
|
5
|
+
// description that can disagree with the code it describes.
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=generated.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generated.js","sourceRoot":"","sources":["../../src/native/generated.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,EAAE;AACF,0EAA0E;AAC1E,qEAAqE;AACrE,4DAA4D"}
|
package/dist/native.d.ts
CHANGED
|
@@ -5,45 +5,16 @@
|
|
|
5
5
|
* immediately. Chronos operations (timezone, DST, RFC 5545) are too complex
|
|
6
6
|
* for a pure-TS fallback.
|
|
7
7
|
*/
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
};
|
|
20
|
-
addInZone(utcIso: string, amount: number, unit: string, zone: string): string;
|
|
21
|
-
startOfInZone(utcIso: string, unit: string, zone: string): string;
|
|
22
|
-
endOfInZone(utcIso: string, unit: string, zone: string): string;
|
|
23
|
-
diffInZone(aUtc: string, bUtc: string, unit: string, zone: string): number;
|
|
24
|
-
zoneOffset(utcIso: string, zone: string): number;
|
|
25
|
-
fromLocal(naiveIso: string, zone: string): string;
|
|
26
|
-
parseRfc2822(input: string): string;
|
|
27
|
-
parseSql(input: string): string;
|
|
28
|
-
parseHttp(input: string): string;
|
|
29
|
-
rruleExpand(startIso: string, rrule: string, limit: number): string[];
|
|
30
|
-
calendarParts(iso: string): {
|
|
31
|
-
year: number;
|
|
32
|
-
month: number;
|
|
33
|
-
day: number;
|
|
34
|
-
hour: number;
|
|
35
|
-
minute: number;
|
|
36
|
-
second: number;
|
|
37
|
-
millisecond: number;
|
|
38
|
-
weekday: number;
|
|
39
|
-
weekNumber: number;
|
|
40
|
-
weekYear: number;
|
|
41
|
-
ordinal: number;
|
|
42
|
-
quarter: number;
|
|
43
|
-
daysInMonth: number;
|
|
44
|
-
daysInYear: number;
|
|
45
|
-
isLeapYear: boolean;
|
|
46
|
-
};
|
|
47
|
-
}
|
|
8
|
+
/**
|
|
9
|
+
* The engine's surface, as the Rust declares it.
|
|
10
|
+
*
|
|
11
|
+
* Derived from `./native/generated.js` — written by `pnpm build:napi-types`
|
|
12
|
+
* from napi-derive's own `type-def` output — rather than restated here, where
|
|
13
|
+
* nothing would notice a `pub fn` gaining a parameter or changing its return.
|
|
14
|
+
*
|
|
15
|
+
* The WASM build is held to the same shape below, so the two engines cannot
|
|
16
|
+
* quietly diverge either: the browser glue has to export what the Rust does.
|
|
17
|
+
*/
|
|
18
|
+
export type NativeChronos = typeof import("./native/generated.js");
|
|
48
19
|
export declare function nativeChronos(): NativeChronos;
|
|
49
20
|
//# sourceMappingURL=native.d.ts.map
|
package/dist/native.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH
|
|
1
|
+
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;GASG;AACH,MAAM,MAAM,aAAa,GAAG,cAAc,uBAAuB,CAAC,CAAC;AAuEnE,wBAAgB,aAAa,IAAI,aAAa,CAW7C"}
|
package/dist/native.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.js","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"native.js","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"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"}
|
package/index.darwin-arm64.node
CHANGED
|
Binary file
|
package/index.darwin-x64.node
CHANGED
|
Binary file
|
|
Binary file
|
package/index.linux-x64-gnu.node
CHANGED
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@c9up/chronos",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.11",
|
|
4
4
|
"description": "Chronos — advanced date/time and recurrence engine (TypeScript + Rust N-API)",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -44,7 +44,8 @@
|
|
|
44
44
|
"scripts": {
|
|
45
45
|
"build": "tsc -p tsconfig.build.json",
|
|
46
46
|
"build:rust": "cargo build --release",
|
|
47
|
-
"build:napi": "cargo build --release && node scripts/copy-napi.mjs",
|
|
47
|
+
"build:napi": "cargo build --release && pnpm build:napi-types && node scripts/copy-napi.mjs",
|
|
48
|
+
"build:napi-types": "node scripts/build-napi-types.mjs",
|
|
48
49
|
"test": "vitest run",
|
|
49
50
|
"test:rust": "cargo test",
|
|
50
51
|
"test:napi": "node scripts/verify-napi.mjs",
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Regenerate `src/native/generated.ts` from the Rust.
|
|
4
|
+
*
|
|
5
|
+
* Node rather than a shell script because this runs inside `build:napi`, and
|
|
6
|
+
* that runs on the Windows prebuild runner too: a bash `mktemp` there hands
|
|
7
|
+
* cargo a `/tmp/...` path the native proc-macro cannot write to, so the
|
|
8
|
+
* type-def file comes back empty and the build fails for no visible reason.
|
|
9
|
+
*
|
|
10
|
+
* One crate at a time on purpose: napi-derive APPENDS to `TYPE_DEF_TMP_PATH`
|
|
11
|
+
* while cargo compiles, and a parallel build interleaves the writes —
|
|
12
|
+
* definitions go missing, silently, and the generated file comes out short.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { execFileSync } from 'node:child_process'
|
|
16
|
+
import { createRequire } from 'node:module'
|
|
17
|
+
import { mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
|
|
18
|
+
import { tmpdir } from 'node:os'
|
|
19
|
+
import { dirname, join } from 'node:path'
|
|
20
|
+
import { fileURLToPath } from 'node:url'
|
|
21
|
+
|
|
22
|
+
const CRATES = ['chronos-engine-napi']
|
|
23
|
+
|
|
24
|
+
const packageRoot = join(dirname(fileURLToPath(import.meta.url)), '..')
|
|
25
|
+
const output = join('src', 'native', 'generated.ts')
|
|
26
|
+
const scratch = mkdtempSync(join(tmpdir(), 'napi-types-'))
|
|
27
|
+
|
|
28
|
+
try {
|
|
29
|
+
const lines = []
|
|
30
|
+
for (const crate of CRATES) {
|
|
31
|
+
const perCrate = join(scratch, `${crate}.jsonl`)
|
|
32
|
+
writeFileSync(perCrate, '')
|
|
33
|
+
execFileSync('cargo', ['build', '-p', crate], {
|
|
34
|
+
cwd: packageRoot,
|
|
35
|
+
env: { ...process.env, TYPE_DEF_TMP_PATH: perCrate },
|
|
36
|
+
stdio: ['ignore', 'ignore', 'inherit'],
|
|
37
|
+
})
|
|
38
|
+
const emitted = readFileSync(perCrate, 'utf8').split('\n').filter(Boolean)
|
|
39
|
+
if (emitted.length === 0) {
|
|
40
|
+
throw new Error(
|
|
41
|
+
`[napi-types] ${crate} emitted nothing — is napi-derive's "type-def" feature on?`,
|
|
42
|
+
)
|
|
43
|
+
}
|
|
44
|
+
lines.push(...emitted)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const combined = join(scratch, 'combined.jsonl')
|
|
48
|
+
writeFileSync(combined, `${lines.join('\n')}\n`)
|
|
49
|
+
|
|
50
|
+
execFileSync(
|
|
51
|
+
process.execPath,
|
|
52
|
+
[join('scripts', 'generate-napi-types.mjs'), combined, output],
|
|
53
|
+
{ cwd: packageRoot, stdio: 'inherit' },
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
// Formatted here rather than excluded from the linter: the file is checked
|
|
57
|
+
// in, so it should read like the rest of the tree — and formatting it at
|
|
58
|
+
// generation means it never shows up as a diff someone has to fix by hand.
|
|
59
|
+
// Resolved through the package entry rather than `node_modules/.bin`, whose
|
|
60
|
+
// shim is a shell script the Windows runner cannot execute directly.
|
|
61
|
+
const biome = createRequire(import.meta.url).resolve('@biomejs/biome/bin/biome')
|
|
62
|
+
execFileSync(process.execPath, [biome, 'format', '--write', output], {
|
|
63
|
+
cwd: packageRoot,
|
|
64
|
+
stdio: ['ignore', 'ignore', 'inherit'],
|
|
65
|
+
})
|
|
66
|
+
} finally {
|
|
67
|
+
rmSync(scratch, { recursive: true, force: true })
|
|
68
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Generate the TypeScript surface of the native module FROM the Rust.
|
|
4
|
+
*
|
|
5
|
+
* `napi-derive`'s `type-def` feature emits one JSON line per exported item
|
|
6
|
+
* while cargo compiles. Those lines are the source of truth: they are derived
|
|
7
|
+
* from the `#[napi]` items themselves, so a signature cannot drift from the
|
|
8
|
+
* Rust without this file changing.
|
|
9
|
+
*
|
|
10
|
+
* Hand-written interfaces are what this replaces, and they do drift — nothing
|
|
11
|
+
* on the TypeScript side notices when a `pub fn` gains a parameter or stops
|
|
12
|
+
* being `async`.
|
|
13
|
+
*
|
|
14
|
+
* One thing napi-rs cannot infer: the shape of a `JsFunction` callback. It
|
|
15
|
+
* emits `(...args: any[]) => any`. Any such parameter is refined below, by
|
|
16
|
+
* name, and the script fails if a refinement no longer matches anything — so
|
|
17
|
+
* the table cannot rot either.
|
|
18
|
+
*
|
|
19
|
+
* TYPE_DEF_TMP_PATH=<file> cargo build -p <crate>
|
|
20
|
+
* node scripts/generate-napi-types.mjs <file> <out.d.ts>
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import { readFileSync, writeFileSync } from 'node:fs'
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Callback signatures napi-rs erases to `any`, restored here.
|
|
27
|
+
*
|
|
28
|
+
* Keyed by `<owner>.<method>`; the value replaces the whole parameter. Every
|
|
29
|
+
* entry must match, or the script fails: a stale refinement is how a hand
|
|
30
|
+
* annotation quietly stops describing the Rust.
|
|
31
|
+
*
|
|
32
|
+
* Empty while this crate exposes no `JsFunction` parameter — add an entry the
|
|
33
|
+
* day one appears, rather than letting an `any` through.
|
|
34
|
+
*/
|
|
35
|
+
const CALLBACK_REFINEMENTS = {}
|
|
36
|
+
|
|
37
|
+
const [input, output] = process.argv.slice(2)
|
|
38
|
+
if (!input || !output) {
|
|
39
|
+
console.error('usage: generate-napi-types.mjs <type-def file> <out.d.ts>')
|
|
40
|
+
process.exit(2)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const entries = readFileSync(input, 'utf8')
|
|
44
|
+
.split('\n')
|
|
45
|
+
.map((l) => l.trim())
|
|
46
|
+
.filter(Boolean)
|
|
47
|
+
.map((l) => JSON.parse(l))
|
|
48
|
+
|
|
49
|
+
const used = new Set()
|
|
50
|
+
|
|
51
|
+
/** Apply the refinements that belong to `owner`, tracking which ones matched. */
|
|
52
|
+
function refine(owner, body) {
|
|
53
|
+
let out = body
|
|
54
|
+
for (const [key, { from, to }] of Object.entries(CALLBACK_REFINEMENTS)) {
|
|
55
|
+
const [entryOwner] = key.split('.')
|
|
56
|
+
if (entryOwner !== owner) continue
|
|
57
|
+
if (out.includes(from)) {
|
|
58
|
+
out = out.replace(from, to)
|
|
59
|
+
used.add(key)
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return out
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* JSDoc as emitted by napi-derive, indented to sit above its member.
|
|
67
|
+
*
|
|
68
|
+
* `*` followed by `/` inside the text closes the comment early — a Rust doc
|
|
69
|
+
* example holding a cron expression (`0 */5 * * *`) is enough to do it, and
|
|
70
|
+
* the generated file then fails to parse. Escaped rather than stripped, so the
|
|
71
|
+
* example still reads correctly.
|
|
72
|
+
*/
|
|
73
|
+
function docBlock(doc, indent = '') {
|
|
74
|
+
if (!doc) return ''
|
|
75
|
+
// Escape every `*/` EXCEPT the one that closes the block. A Rust doc example
|
|
76
|
+
// holding a cron expression (`0 */5 * * *`) closes the comment early
|
|
77
|
+
// otherwise, and the generated file stops parsing — but escaping the closer
|
|
78
|
+
// too breaks it just as thoroughly, whether the block spans one line or many.
|
|
79
|
+
const closer = doc.lastIndexOf('*/')
|
|
80
|
+
const escaped =
|
|
81
|
+
closer === -1
|
|
82
|
+
? doc
|
|
83
|
+
: doc.slice(0, closer).replaceAll('*/', '*\\/') + doc.slice(closer)
|
|
84
|
+
return (
|
|
85
|
+
escaped
|
|
86
|
+
.split('\n')
|
|
87
|
+
.filter((l) => l.length > 0)
|
|
88
|
+
.map((l) => `${indent}${l}`)
|
|
89
|
+
.join('\n') + '\n'
|
|
90
|
+
)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const interfaces = entries.filter((e) => e.kind === 'interface')
|
|
94
|
+
const structs = entries.filter((e) => e.kind === 'struct')
|
|
95
|
+
const impls = new Map(entries.filter((e) => e.kind === 'impl').map((e) => [e.name, e]))
|
|
96
|
+
const fns = entries.filter((e) => e.kind === 'fn')
|
|
97
|
+
|
|
98
|
+
const out = [
|
|
99
|
+
'// GENERATED FROM THE RUST — do not edit.',
|
|
100
|
+
'//',
|
|
101
|
+
"// Produced by scripts/generate-napi-types.mjs from napi-derive's type-def",
|
|
102
|
+
'// output. Editing this file by hand puts it back where it started: a',
|
|
103
|
+
'// description that can disagree with the code it describes.',
|
|
104
|
+
'',
|
|
105
|
+
]
|
|
106
|
+
|
|
107
|
+
for (const iface of interfaces) {
|
|
108
|
+
out.push(docBlock(iface.js_doc))
|
|
109
|
+
out.push(`export interface ${iface.name} {`)
|
|
110
|
+
for (const line of iface.def.split('\n')) {
|
|
111
|
+
out.push(line ? ` ${line.trim()}` : '')
|
|
112
|
+
}
|
|
113
|
+
out.push('}', '')
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
for (const struct of structs) {
|
|
117
|
+
const impl = impls.get(struct.name)
|
|
118
|
+
out.push(docBlock(struct.js_doc))
|
|
119
|
+
out.push(`export declare class ${struct.name} {`)
|
|
120
|
+
if (impl) {
|
|
121
|
+
for (const line of refine(struct.name, impl.def).split('\n')) {
|
|
122
|
+
out.push(line ? ` ${line.trim()}` : '')
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
out.push('}', '')
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
for (const fn of fns) {
|
|
129
|
+
out.push(docBlock(fn.js_doc))
|
|
130
|
+
// napi-derive emits the whole declaration for a function, unlike a struct
|
|
131
|
+
// where `def` holds only the members.
|
|
132
|
+
const declaration = fn.def.trim()
|
|
133
|
+
out.push(
|
|
134
|
+
declaration.startsWith('export declare function')
|
|
135
|
+
? `${declaration};`
|
|
136
|
+
: `export declare function ${fn.name}${declaration};`,
|
|
137
|
+
'',
|
|
138
|
+
)
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const stale = Object.keys(CALLBACK_REFINEMENTS).filter((k) => !used.has(k))
|
|
142
|
+
if (stale.length > 0) {
|
|
143
|
+
console.error(
|
|
144
|
+
`[napi-types] refinement(s) that matched nothing: ${stale.join(', ')}\n` +
|
|
145
|
+
'[napi-types] the Rust changed under them — update or remove the entry.',
|
|
146
|
+
)
|
|
147
|
+
process.exit(1)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
writeFileSync(output, out.join('\n'))
|
|
151
|
+
console.log(
|
|
152
|
+
`[napi-types] ${output} — ${interfaces.length} interface(s), ${structs.length} class(es), ${fns.length} function(s)`,
|
|
153
|
+
)
|
package/src/DateTime.ts
CHANGED
|
@@ -67,9 +67,87 @@ export interface CalendarParts {
|
|
|
67
67
|
|
|
68
68
|
// ─── Internal helpers ────────────────────────────────────────
|
|
69
69
|
|
|
70
|
+
const MONTH_NAMES = [
|
|
71
|
+
"January",
|
|
72
|
+
"February",
|
|
73
|
+
"March",
|
|
74
|
+
"April",
|
|
75
|
+
"May",
|
|
76
|
+
"June",
|
|
77
|
+
"July",
|
|
78
|
+
"August",
|
|
79
|
+
"September",
|
|
80
|
+
"October",
|
|
81
|
+
"November",
|
|
82
|
+
"December",
|
|
83
|
+
];
|
|
84
|
+
|
|
85
|
+
function isLeapYearOf(year: number): boolean {
|
|
86
|
+
return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function daysPerMonthOf(year: number): number[] {
|
|
90
|
+
return [
|
|
91
|
+
31,
|
|
92
|
+
isLeapYearOf(year) ? 29 : 28,
|
|
93
|
+
31,
|
|
94
|
+
30,
|
|
95
|
+
31,
|
|
96
|
+
30,
|
|
97
|
+
31,
|
|
98
|
+
31,
|
|
99
|
+
30,
|
|
100
|
+
31,
|
|
101
|
+
30,
|
|
102
|
+
31,
|
|
103
|
+
];
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function daysInMonthOf(year: number, month: number): number {
|
|
107
|
+
return daysPerMonthOf(year)[month - 1];
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Refuse a calendar date that does not exist, instead of sliding to the next
|
|
112
|
+
* one that does.
|
|
113
|
+
*
|
|
114
|
+
* `new Date('2026-02-30')` answers 2026-03-02: the overflow semantics are right
|
|
115
|
+
* for arithmetic — adding a month to January 31st has to land somewhere — and
|
|
116
|
+
* wrong for reading input, where the same slide turns a typo into a fact. The
|
|
117
|
+
* inconsistency was the dangerous part: '2026-13-45' threw while '2026-02-30'
|
|
118
|
+
* came back as a date, so a caller wrapping this in try/catch had covered the
|
|
119
|
+
* loud half and left the half that writes something false to the database.
|
|
120
|
+
*
|
|
121
|
+
* `fromObject` has always refused the same input; this is that check on the
|
|
122
|
+
* door that was missing it. Only the written date is examined, never the
|
|
123
|
+
* instant it resolves to, so an offset that legitimately moves the UTC day
|
|
124
|
+
* ('2026-08-10T23:00:00-05:00' → the 11th) is untouched.
|
|
125
|
+
*/
|
|
126
|
+
const CALENDAR_DATE = /^(\d{4})-(\d{2})-(\d{2})(?=$|[T ])/;
|
|
127
|
+
|
|
128
|
+
function assertCalendarDateExists(raw: string): void {
|
|
129
|
+
const match = CALENDAR_DATE.exec(raw);
|
|
130
|
+
// Anything else — RFC 2822, a bare year, a basic-format string — is left to
|
|
131
|
+
// `Date`, which already refuses what it cannot read.
|
|
132
|
+
if (!match) return;
|
|
133
|
+
const year = Number(match[1]);
|
|
134
|
+
const month = Number(match[2]);
|
|
135
|
+
const day = Number(match[3]);
|
|
136
|
+
if (month < 1 || month > 12) {
|
|
137
|
+
throw new Error(`Invalid date '${raw}': there is no month ${month}.`);
|
|
138
|
+
}
|
|
139
|
+
const lastDay = daysInMonthOf(year, month);
|
|
140
|
+
if (day < 1 || day > lastDay) {
|
|
141
|
+
throw new Error(
|
|
142
|
+
`Invalid date '${raw}': ${MONTH_NAMES[month - 1]} ${year} has ${lastDay} days, so there is no day ${day}.`,
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
70
147
|
function toIso(value: DateInput): string {
|
|
71
148
|
if (value instanceof DateTime) return value.toISO();
|
|
72
149
|
if (value instanceof Date) return normalizeIso(value.toISOString());
|
|
150
|
+
if (typeof value === "string") assertCalendarDateExists(value);
|
|
73
151
|
return normalizeIso(new Date(value).toISOString());
|
|
74
152
|
}
|
|
75
153
|
|
|
@@ -143,21 +221,8 @@ function calendarPartsFromIso(iso: string): CalendarParts {
|
|
|
143
221
|
const second = Number(isoMatch[6]);
|
|
144
222
|
const millisecond =
|
|
145
223
|
isoMatch[7] != null ? Math.round(Number(`0.${isoMatch[7]}`) * 1000) : 0;
|
|
146
|
-
const isLeapYear = (year
|
|
147
|
-
const daysPerMonth =
|
|
148
|
-
31,
|
|
149
|
-
isLeapYear ? 29 : 28,
|
|
150
|
-
31,
|
|
151
|
-
30,
|
|
152
|
-
31,
|
|
153
|
-
30,
|
|
154
|
-
31,
|
|
155
|
-
31,
|
|
156
|
-
30,
|
|
157
|
-
31,
|
|
158
|
-
30,
|
|
159
|
-
31,
|
|
160
|
-
];
|
|
224
|
+
const isLeapYear = isLeapYearOf(year);
|
|
225
|
+
const daysPerMonth = daysPerMonthOf(year);
|
|
161
226
|
const daysInMonth = daysPerMonth[month - 1];
|
|
162
227
|
const daysInYear = isLeapYear ? 366 : 365;
|
|
163
228
|
let ordinal = day;
|
package/src/Interval.ts
CHANGED
|
@@ -10,6 +10,42 @@
|
|
|
10
10
|
import { type DateInput, DateTime, type DateUnit } from "./DateTime.js";
|
|
11
11
|
import { Duration, type DurationUnit } from "./Duration.js";
|
|
12
12
|
|
|
13
|
+
/**
|
|
14
|
+
* Milliseconds in one unit, refusing a unit it does not know.
|
|
15
|
+
*
|
|
16
|
+
* Singular and plural both resolve, as they do upstream in Luxon: the rest of
|
|
17
|
+
* chronos spells units in the singular (`plus(1, "day")`) while durations
|
|
18
|
+
* spell them in the plural (`{ days: 1 }`), and a reader moving between the
|
|
19
|
+
* two should not have to remember which door they are at.
|
|
20
|
+
*
|
|
21
|
+
* The table used to answer `1` for anything it did not recognise, so
|
|
22
|
+
* `length("day")` returned 345600000 — milliseconds, presented as days — and
|
|
23
|
+
* `splitBy` turned an unknown unit into a one-millisecond step, which on a
|
|
24
|
+
* four-day interval is 345 million sub-intervals. Both were silent. An unknown
|
|
25
|
+
* unit is a mistake in the calling code and says so now.
|
|
26
|
+
*/
|
|
27
|
+
const MS_PER_UNIT: Record<string, number> = {
|
|
28
|
+
year: 365.25 * 86400000,
|
|
29
|
+
month: 30 * 86400000,
|
|
30
|
+
week: 7 * 86400000,
|
|
31
|
+
day: 86400000,
|
|
32
|
+
hour: 3600000,
|
|
33
|
+
minute: 60000,
|
|
34
|
+
second: 1000,
|
|
35
|
+
millisecond: 1,
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
function msPerUnit(unit: string, caller: string): number {
|
|
39
|
+
// Plural is the durations spelling; singular is the DateTime one.
|
|
40
|
+
const ms = MS_PER_UNIT[unit.endsWith("s") ? unit.slice(0, -1) : unit];
|
|
41
|
+
if (ms === undefined) {
|
|
42
|
+
throw new Error(
|
|
43
|
+
`${caller}: '${unit}' is not a unit. Use one of ${Object.keys(MS_PER_UNIT).join(", ")} (plural accepted).`,
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
return ms;
|
|
47
|
+
}
|
|
48
|
+
|
|
13
49
|
export class Interval {
|
|
14
50
|
readonly #start: DateTime;
|
|
15
51
|
readonly #end: DateTime;
|
|
@@ -63,19 +99,9 @@ export class Interval {
|
|
|
63
99
|
}
|
|
64
100
|
|
|
65
101
|
/** Length in the given unit (approximate for calendar units). */
|
|
66
|
-
length(unit: DurationUnit = "milliseconds"): number {
|
|
102
|
+
length(unit: DurationUnit | DateUnit = "milliseconds"): number {
|
|
67
103
|
const ms = this.#end.toMillis() - this.#start.toMillis();
|
|
68
|
-
|
|
69
|
-
years: 365.25 * 86400000,
|
|
70
|
-
months: 30 * 86400000,
|
|
71
|
-
weeks: 7 * 86400000,
|
|
72
|
-
days: 86400000,
|
|
73
|
-
hours: 3600000,
|
|
74
|
-
minutes: 60000,
|
|
75
|
-
seconds: 1000,
|
|
76
|
-
milliseconds: 1,
|
|
77
|
-
};
|
|
78
|
-
return ms / (MS_PER[unit] ?? 1);
|
|
104
|
+
return ms / msPerUnit(unit, "Interval.length");
|
|
79
105
|
}
|
|
80
106
|
|
|
81
107
|
/** Duration object between start and end. */
|
|
@@ -168,18 +194,9 @@ export class Interval {
|
|
|
168
194
|
|
|
169
195
|
/** Split this interval into N sub-intervals of roughly equal `duration` length. */
|
|
170
196
|
splitBy(duration: Duration | { amount: number; unit: DateUnit }): Interval[] {
|
|
171
|
-
const unitMs: Record<string, number> = {
|
|
172
|
-
year: 365.25 * 86400000,
|
|
173
|
-
month: 30 * 86400000,
|
|
174
|
-
week: 7 * 86400000,
|
|
175
|
-
day: 86400000,
|
|
176
|
-
hour: 3600000,
|
|
177
|
-
minute: 60000,
|
|
178
|
-
second: 1000,
|
|
179
|
-
};
|
|
180
197
|
const stepMs =
|
|
181
198
|
"amount" in duration
|
|
182
|
-
? duration.amount * (
|
|
199
|
+
? duration.amount * msPerUnit(duration.unit, "Interval.splitBy")
|
|
183
200
|
: duration.as("milliseconds");
|
|
184
201
|
if (stepMs <= 0) throw new Error("splitBy duration must be positive");
|
|
185
202
|
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// GENERATED FROM THE RUST — do not edit.
|
|
2
|
+
//
|
|
3
|
+
// Produced by scripts/generate-napi-types.mjs from napi-derive's type-def
|
|
4
|
+
// output. Editing this file by hand puts it back where it started: a
|
|
5
|
+
// description that can disagree with the code it describes.
|
|
6
|
+
|
|
7
|
+
export interface CalendarPartsNapi {
|
|
8
|
+
year: number;
|
|
9
|
+
month: number;
|
|
10
|
+
day: number;
|
|
11
|
+
hour: number;
|
|
12
|
+
minute: number;
|
|
13
|
+
second: number;
|
|
14
|
+
millisecond: number;
|
|
15
|
+
weekday: number;
|
|
16
|
+
weekNumber: number;
|
|
17
|
+
weekYear: number;
|
|
18
|
+
ordinal: number;
|
|
19
|
+
quarter: number;
|
|
20
|
+
daysInMonth: number;
|
|
21
|
+
daysInYear: number;
|
|
22
|
+
isLeapYear: boolean;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface ZonedOutputNapi {
|
|
26
|
+
iso: string;
|
|
27
|
+
offsetMinutes: number;
|
|
28
|
+
zoneName: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export declare function add(iso: string, amount: number, unit: string): string;
|
|
32
|
+
|
|
33
|
+
export declare function diff(aIso: string, bIso: string, unit: string): number;
|
|
34
|
+
|
|
35
|
+
export declare function startOf(iso: string, unit: string): string;
|
|
36
|
+
|
|
37
|
+
export declare function endOf(iso: string, unit: string): string;
|
|
38
|
+
|
|
39
|
+
export declare function format(iso: string, pattern: string): string;
|
|
40
|
+
|
|
41
|
+
export declare function calendarParts(iso: string): CalendarPartsNapi;
|
|
42
|
+
|
|
43
|
+
export declare function validateTimezone(zone: string): string;
|
|
44
|
+
|
|
45
|
+
export declare function toZone(utcIso: string, zone: string): ZonedOutputNapi;
|
|
46
|
+
|
|
47
|
+
export declare function addInZone(
|
|
48
|
+
utcIso: string,
|
|
49
|
+
amount: number,
|
|
50
|
+
unit: string,
|
|
51
|
+
zone: string,
|
|
52
|
+
): string;
|
|
53
|
+
|
|
54
|
+
export declare function startOfInZone(
|
|
55
|
+
utcIso: string,
|
|
56
|
+
unit: string,
|
|
57
|
+
zone: string,
|
|
58
|
+
): string;
|
|
59
|
+
|
|
60
|
+
export declare function endOfInZone(
|
|
61
|
+
utcIso: string,
|
|
62
|
+
unit: string,
|
|
63
|
+
zone: string,
|
|
64
|
+
): string;
|
|
65
|
+
|
|
66
|
+
export declare function diffInZone(
|
|
67
|
+
aUtc: string,
|
|
68
|
+
bUtc: string,
|
|
69
|
+
unit: string,
|
|
70
|
+
zone: string,
|
|
71
|
+
): number;
|
|
72
|
+
|
|
73
|
+
export declare function zoneOffset(utcIso: string, zone: string): number;
|
|
74
|
+
|
|
75
|
+
export declare function fromLocal(naiveIso: string, zone: string): string;
|
|
76
|
+
|
|
77
|
+
export declare function parseRfc2822(input: string): string;
|
|
78
|
+
|
|
79
|
+
export declare function parseSql(input: string): string;
|
|
80
|
+
|
|
81
|
+
export declare function parseHttp(input: string): string;
|
|
82
|
+
|
|
83
|
+
export declare function rruleExpand(
|
|
84
|
+
startIso: string,
|
|
85
|
+
rrule: string,
|
|
86
|
+
limit: number,
|
|
87
|
+
): Array<string>;
|
package/src/native.ts
CHANGED
|
@@ -6,45 +6,17 @@
|
|
|
6
6
|
* for a pure-TS fallback.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
addInZone(utcIso: string, amount: number, unit: string, zone: string): string;
|
|
21
|
-
startOfInZone(utcIso: string, unit: string, zone: string): string;
|
|
22
|
-
endOfInZone(utcIso: string, unit: string, zone: string): string;
|
|
23
|
-
diffInZone(aUtc: string, bUtc: string, unit: string, zone: string): number;
|
|
24
|
-
zoneOffset(utcIso: string, zone: string): number;
|
|
25
|
-
fromLocal(naiveIso: string, zone: string): string;
|
|
26
|
-
parseRfc2822(input: string): string;
|
|
27
|
-
parseSql(input: string): string;
|
|
28
|
-
parseHttp(input: string): string;
|
|
29
|
-
rruleExpand(startIso: string, rrule: string, limit: number): string[];
|
|
30
|
-
calendarParts(iso: string): {
|
|
31
|
-
year: number;
|
|
32
|
-
month: number;
|
|
33
|
-
day: number;
|
|
34
|
-
hour: number;
|
|
35
|
-
minute: number;
|
|
36
|
-
second: number;
|
|
37
|
-
millisecond: number;
|
|
38
|
-
weekday: number;
|
|
39
|
-
weekNumber: number;
|
|
40
|
-
weekYear: number;
|
|
41
|
-
ordinal: number;
|
|
42
|
-
quarter: number;
|
|
43
|
-
daysInMonth: number;
|
|
44
|
-
daysInYear: number;
|
|
45
|
-
isLeapYear: boolean;
|
|
46
|
-
};
|
|
47
|
-
}
|
|
9
|
+
/**
|
|
10
|
+
* The engine's surface, as the Rust declares it.
|
|
11
|
+
*
|
|
12
|
+
* Derived from `./native/generated.js` — written by `pnpm build:napi-types`
|
|
13
|
+
* from napi-derive's own `type-def` output — rather than restated here, where
|
|
14
|
+
* nothing would notice a `pub fn` gaining a parameter or changing its return.
|
|
15
|
+
*
|
|
16
|
+
* The WASM build is held to the same shape below, so the two engines cannot
|
|
17
|
+
* quietly diverge either: the browser glue has to export what the Rust does.
|
|
18
|
+
*/
|
|
19
|
+
export type NativeChronos = typeof import("./native/generated.js");
|
|
48
20
|
|
|
49
21
|
let native: NativeChronos | undefined;
|
|
50
22
|
let loadError: unknown;
|