@thangnv-dev/time-common 0.0.1

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.
@@ -0,0 +1,8 @@
1
+ import 'temporal-polyfill/global';
2
+ export interface Clock {
3
+ getTime(): Temporal.Instant;
4
+ }
5
+ export declare class SystemClock implements Clock {
6
+ getTime(): Temporal.Instant;
7
+ }
8
+ //# sourceMappingURL=clock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clock.d.ts","sourceRoot":"","sources":["../src/clock.ts"],"names":[],"mappings":"AAAA,OAAO,0BAA0B,CAAA;AAEjC,MAAM,WAAW,KAAK;IACpB,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAA;CAC5B;AAED,qBAAa,WAAY,YAAW,KAAK;IACvC,OAAO,IAAI,QAAQ,CAAC,OAAO;CAG5B"}
package/dist/clock.js ADDED
@@ -0,0 +1,7 @@
1
+ import 'temporal-polyfill/global';
2
+ export class SystemClock {
3
+ getTime() {
4
+ return Temporal.Now.instant();
5
+ }
6
+ }
7
+ //# sourceMappingURL=clock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clock.js","sourceRoot":"","sources":["../src/clock.ts"],"names":[],"mappings":"AAAA,OAAO,0BAA0B,CAAA;AAMjC,MAAM,OAAO,WAAW;IACtB,OAAO;QACL,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;IAC/B,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ export type { Clock } from './clock.js';
2
+ export { SystemClock } from './clock.js';
3
+ export type { Timer, TimerHandle } from './timer.js';
4
+ export { SystemTimer } from './timer.js';
5
+ export { TimeTravelClock } from './time-travel-clock.js';
6
+ export { TimeTravelTimer } from './time-travel-timer.js';
7
+ export { TimeTravelTime } from './time-travel-time.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { SystemClock } from './clock.js';
2
+ export { SystemTimer } from './timer.js';
3
+ export { TimeTravelClock } from './time-travel-clock.js';
4
+ export { TimeTravelTimer } from './time-travel-timer.js';
5
+ export { TimeTravelTime } from './time-travel-time.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAExC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,10 @@
1
+ import 'temporal-polyfill/global';
2
+ import type { Clock } from './clock.js';
3
+ export declare class TimeTravelClock implements Clock {
4
+ private now;
5
+ constructor(start?: Temporal.Instant);
6
+ getTime(): Temporal.Instant;
7
+ advance(duration: Temporal.Duration): void;
8
+ advanceTo(instant: Temporal.Instant): void;
9
+ }
10
+ //# sourceMappingURL=time-travel-clock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-travel-clock.d.ts","sourceRoot":"","sources":["../src/time-travel-clock.ts"],"names":[],"mappings":"AAAA,OAAO,0BAA0B,CAAA;AAEjC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAIvC,qBAAa,eAAgB,YAAW,KAAK;IAC3C,OAAO,CAAC,GAAG,CAAkB;gBAEjB,KAAK,CAAC,EAAE,QAAQ,CAAC,OAAO;IAIpC,OAAO,IAAI,QAAQ,CAAC,OAAO;IAI3B,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI;IAW1C,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,GAAG,IAAI;CAU3C"}
@@ -0,0 +1,33 @@
1
+ import 'temporal-polyfill/global';
2
+ import { StandardError } from '@thangnv-dev/error-common';
3
+ const TIME_PACKAGE = '@thangnv-dev/time-common';
4
+ export class TimeTravelClock {
5
+ now;
6
+ constructor(start) {
7
+ this.now = start ?? Temporal.Instant.from('1970-01-01T00:00:00Z');
8
+ }
9
+ getTime() {
10
+ return this.now;
11
+ }
12
+ advance(duration) {
13
+ if (Temporal.Duration.from(duration).sign < 0) {
14
+ throw new StandardError({
15
+ package: TIME_PACKAGE,
16
+ code: 'NEGATIVE_DURATION',
17
+ message: 'Cannot advance by a negative duration',
18
+ });
19
+ }
20
+ this.now = this.now.add(duration);
21
+ }
22
+ advanceTo(instant) {
23
+ if (Temporal.Instant.compare(instant, this.now) < 0) {
24
+ throw new StandardError({
25
+ package: TIME_PACKAGE,
26
+ code: 'TIME_TRAVEL_BACKWARD',
27
+ message: 'Cannot advance to an instant before the current time',
28
+ });
29
+ }
30
+ this.now = instant;
31
+ }
32
+ }
33
+ //# sourceMappingURL=time-travel-clock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-travel-clock.js","sourceRoot":"","sources":["../src/time-travel-clock.ts"],"names":[],"mappings":"AAAA,OAAO,0BAA0B,CAAA;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAGzD,MAAM,YAAY,GAAG,0BAA0B,CAAA;AAE/C,MAAM,OAAO,eAAe;IAClB,GAAG,CAAkB;IAE7B,YAAY,KAAwB;QAClC,IAAI,CAAC,GAAG,GAAG,KAAK,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;IACnE,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,GAAG,CAAA;IACjB,CAAC;IAED,OAAO,CAAC,QAA2B;QACjC,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,aAAa,CAAC;gBACtB,OAAO,EAAE,YAAY;gBACrB,IAAI,EAAE,mBAAmB;gBACzB,OAAO,EAAE,uCAAuC;aACjD,CAAC,CAAA;QACJ,CAAC;QACD,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IACnC,CAAC;IAED,SAAS,CAAC,OAAyB;QACjC,IAAI,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,aAAa,CAAC;gBACtB,OAAO,EAAE,YAAY;gBACrB,IAAI,EAAE,sBAAsB;gBAC5B,OAAO,EAAE,sDAAsD;aAChE,CAAC,CAAA;QACJ,CAAC;QACD,IAAI,CAAC,GAAG,GAAG,OAAO,CAAA;IACpB,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import 'temporal-polyfill/global';
2
+ import { TimeTravelClock } from './time-travel-clock.js';
3
+ import { TimeTravelTimer } from './time-travel-timer.js';
4
+ export declare class TimeTravelTime {
5
+ readonly clock: TimeTravelClock;
6
+ readonly timer: TimeTravelTimer;
7
+ constructor(start?: Temporal.Instant);
8
+ advance(duration: Temporal.Duration): void;
9
+ advanceTo(instant: Temporal.Instant): void;
10
+ }
11
+ //# sourceMappingURL=time-travel-time.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-travel-time.d.ts","sourceRoot":"","sources":["../src/time-travel-time.ts"],"names":[],"mappings":"AAAA,OAAO,0BAA0B,CAAA;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAExD,qBAAa,cAAc;IACzB,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAA;IAC/B,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAA;gBAEnB,KAAK,CAAC,EAAE,QAAQ,CAAC,OAAO;IAKpC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI;IAI1C,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,GAAG,IAAI;CAG3C"}
@@ -0,0 +1,18 @@
1
+ import 'temporal-polyfill/global';
2
+ import { TimeTravelClock } from './time-travel-clock.js';
3
+ import { TimeTravelTimer } from './time-travel-timer.js';
4
+ export class TimeTravelTime {
5
+ clock;
6
+ timer;
7
+ constructor(start) {
8
+ this.clock = new TimeTravelClock(start);
9
+ this.timer = new TimeTravelTimer(this.clock);
10
+ }
11
+ advance(duration) {
12
+ this.timer.advance(duration);
13
+ }
14
+ advanceTo(instant) {
15
+ this.timer.advanceTo(instant);
16
+ }
17
+ }
18
+ //# sourceMappingURL=time-travel-time.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-travel-time.js","sourceRoot":"","sources":["../src/time-travel-time.ts"],"names":[],"mappings":"AAAA,OAAO,0BAA0B,CAAA;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAExD,MAAM,OAAO,cAAc;IAChB,KAAK,CAAiB;IACtB,KAAK,CAAiB;IAE/B,YAAY,KAAwB;QAClC,IAAI,CAAC,KAAK,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,CAAA;QACvC,IAAI,CAAC,KAAK,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC9C,CAAC;IAED,OAAO,CAAC,QAA2B;QACjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC9B,CAAC;IAED,SAAS,CAAC,OAAyB;QACjC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;IAC/B,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ import 'temporal-polyfill/global';
2
+ import type { Timer, TimerHandle } from './timer.js';
3
+ import { TimeTravelClock } from './time-travel-clock.js';
4
+ export declare class TimeTravelTimer implements Timer {
5
+ private readonly clock;
6
+ private readonly queue;
7
+ private nextId;
8
+ constructor(clock: TimeTravelClock);
9
+ setTimeout(fn: () => void, delay: Temporal.Duration): TimerHandle;
10
+ setInterval(fn: () => void, interval: Temporal.Duration): TimerHandle;
11
+ clearTimeout(handle: TimerHandle): void;
12
+ clearInterval(handle: TimerHandle): void;
13
+ advance(duration: Temporal.Duration): void;
14
+ advanceTo(instant: Temporal.Instant): void;
15
+ private advanceToInstant;
16
+ private cleanup;
17
+ }
18
+ //# sourceMappingURL=time-travel-timer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-travel-timer.d.ts","sourceRoot":"","sources":["../src/time-travel-timer.ts"],"names":[],"mappings":"AAAA,OAAO,0BAA0B,CAAA;AACjC,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAUxD,qBAAa,eAAgB,YAAW,KAAK;IAC3C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiB;IACvC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0B;IAChD,OAAO,CAAC,MAAM,CAAI;gBAEN,KAAK,EAAE,eAAe;IAIlC,UAAU,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,QAAQ,GAAG,WAAW;IAYjE,WAAW,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,GAAG,WAAW;IAYrE,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAKvC,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAIxC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI;IAK1C,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,GAAG,IAAI;IAI1C,OAAO,CAAC,gBAAgB;IA6BxB,OAAO,CAAC,OAAO;CAShB"}
@@ -0,0 +1,80 @@
1
+ import 'temporal-polyfill/global';
2
+ export class TimeTravelTimer {
3
+ clock;
4
+ queue = [];
5
+ nextId = 1;
6
+ constructor(clock) {
7
+ this.clock = clock;
8
+ }
9
+ setTimeout(fn, delay) {
10
+ const id = this.nextId++;
11
+ this.queue.push({
12
+ id,
13
+ fireAt: this.clock.getTime().add(delay),
14
+ fn,
15
+ interval: null,
16
+ canceled: false,
17
+ });
18
+ return { __brand: 'TimerHandle', id };
19
+ }
20
+ setInterval(fn, interval) {
21
+ const id = this.nextId++;
22
+ this.queue.push({
23
+ id,
24
+ fireAt: this.clock.getTime().add(interval),
25
+ fn,
26
+ interval,
27
+ canceled: false,
28
+ });
29
+ return { __brand: 'TimerHandle', id };
30
+ }
31
+ clearTimeout(handle) {
32
+ const entry = this.queue.find((e) => e.id === handle.id);
33
+ if (entry)
34
+ entry.canceled = true;
35
+ }
36
+ clearInterval(handle) {
37
+ this.clearTimeout(handle);
38
+ }
39
+ advance(duration) {
40
+ const target = this.clock.getTime().add(duration);
41
+ this.advanceToInstant(target);
42
+ }
43
+ advanceTo(instant) {
44
+ this.advanceToInstant(instant);
45
+ }
46
+ advanceToInstant(target) {
47
+ for (;;) {
48
+ const next = this.queue
49
+ .filter((e) => !e.canceled && Temporal.Instant.compare(e.fireAt, target) <= 0)
50
+ .sort((a, b) => Temporal.Instant.compare(a.fireAt, b.fireAt));
51
+ if (next.length === 0)
52
+ break;
53
+ const entry = next[0];
54
+ this.clock.advanceTo(entry.fireAt);
55
+ if (entry.canceled)
56
+ continue;
57
+ if (entry.interval) {
58
+ entry.fireAt = entry.fireAt.add(entry.interval);
59
+ }
60
+ else {
61
+ entry.canceled = true;
62
+ }
63
+ entry.fn();
64
+ }
65
+ if (Temporal.Instant.compare(target, this.clock.getTime()) > 0) {
66
+ this.clock.advanceTo(target);
67
+ }
68
+ this.cleanup();
69
+ }
70
+ cleanup() {
71
+ let write = 0;
72
+ for (let read = 0; read < this.queue.length; read++) {
73
+ if (!this.queue[read].canceled) {
74
+ this.queue[write++] = this.queue[read];
75
+ }
76
+ }
77
+ this.queue.length = write;
78
+ }
79
+ }
80
+ //# sourceMappingURL=time-travel-timer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-travel-timer.js","sourceRoot":"","sources":["../src/time-travel-timer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import 'temporal-polyfill/global';
2
+ export type TimerHandle = {
3
+ readonly __brand: 'TimerHandle';
4
+ readonly id: number;
5
+ };
6
+ export interface Timer {
7
+ setTimeout(fn: () => void, delay: Temporal.Duration): TimerHandle;
8
+ setInterval(fn: () => void, interval: Temporal.Duration): TimerHandle;
9
+ clearTimeout(handle: TimerHandle): void;
10
+ clearInterval(handle: TimerHandle): void;
11
+ }
12
+ export declare class SystemTimer implements Timer {
13
+ setTimeout(fn: () => void, delay: Temporal.Duration): TimerHandle;
14
+ setInterval(fn: () => void, interval: Temporal.Duration): TimerHandle;
15
+ clearTimeout(handle: TimerHandle): void;
16
+ clearInterval(handle: TimerHandle): void;
17
+ }
18
+ //# sourceMappingURL=timer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timer.d.ts","sourceRoot":"","sources":["../src/timer.ts"],"names":[],"mappings":"AAAA,OAAO,0BAA0B,CAAA;AAEjC,MAAM,MAAM,WAAW,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAA;AAElF,MAAM,WAAW,KAAK;IACpB,UAAU,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,QAAQ,GAAG,WAAW,CAAA;IACjE,WAAW,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,GAAG,WAAW,CAAA;IACrE,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAA;IACvC,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAA;CACzC;AAMD,qBAAa,WAAY,YAAW,KAAK;IACvC,UAAU,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,QAAQ,GAAG,WAAW;IAKjE,WAAW,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,GAAG,WAAW;IAKrE,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAIvC,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;CAGzC"}
package/dist/timer.js ADDED
@@ -0,0 +1,21 @@
1
+ import 'temporal-polyfill/global';
2
+ function durationToMs(duration) {
3
+ return Math.max(0, Math.ceil(duration.total({ unit: 'milliseconds' })));
4
+ }
5
+ export class SystemTimer {
6
+ setTimeout(fn, delay) {
7
+ const id = globalThis.setTimeout(fn, durationToMs(delay));
8
+ return { __brand: 'TimerHandle', id: Number(id) };
9
+ }
10
+ setInterval(fn, interval) {
11
+ const id = globalThis.setInterval(fn, durationToMs(interval));
12
+ return { __brand: 'TimerHandle', id: Number(id) };
13
+ }
14
+ clearTimeout(handle) {
15
+ globalThis.clearTimeout(handle.id);
16
+ }
17
+ clearInterval(handle) {
18
+ globalThis.clearInterval(handle.id);
19
+ }
20
+ }
21
+ //# sourceMappingURL=timer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timer.js","sourceRoot":"","sources":["../src/timer.ts"],"names":[],"mappings":"AAAA,OAAO,0BAA0B,CAAA;AAWjC,SAAS,YAAY,CAAC,QAA2B;IAC/C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,CAAA;AACzE,CAAC;AAED,MAAM,OAAO,WAAW;IACtB,UAAU,CAAC,EAAc,EAAE,KAAwB;QACjD,MAAM,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,EAAE,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAA;QACzD,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EAAiB,CAAA;IAClE,CAAC;IAED,WAAW,CAAC,EAAc,EAAE,QAA2B;QACrD,MAAM,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,EAAE,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAA;QAC7D,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EAAiB,CAAA;IAClE,CAAC;IAED,YAAY,CAAC,MAAmB;QAC9B,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACpC,CAAC;IAED,aAAa,CAAC,MAAmB;QAC/B,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACrC,CAAC;CACF"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@thangnv-dev/time-common",
3
+ "version": "0.0.1",
4
+ "private": false,
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "type": "module",
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "default": "./dist/index.js"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist"
19
+ ],
20
+ "scripts": {
21
+ "build": "tsc -p tsconfig.build.json",
22
+ "lint": "eslint .",
23
+ "typecheck": "tsc --noEmit",
24
+ "test": "vitest run"
25
+ },
26
+ "dependencies": {
27
+ "@thangnv-dev/error-common": "workspace:^"
28
+ },
29
+ "devDependencies": {
30
+ "@typescript-eslint/eslint-plugin": "^8.56.0",
31
+ "@typescript-eslint/parser": "^8.56.0",
32
+ "eslint": "^10.0.0",
33
+ "typescript": "^5.9.3",
34
+ "vitest": "^4.0.18"
35
+ },
36
+ "peerDependencies": {
37
+ "temporal-polyfill": "*"
38
+ }
39
+ }