Skip to content

Commit 3f25f3d

Browse files
Add support for 'nested' ReadonlyDates (#7)
1 parent 72504ae commit 3f25f3d

File tree

5 files changed

+31
-21
lines changed

5 files changed

+31
-21
lines changed

package-lock.json

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/eslint-plugin/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@lifetimes/eslint-plugin",
3-
"version": "2.2.0",
3+
"version": "2.2.1",
44
"author": "Marcus Armstrong <marcusdarmstrong@gmail.com>",
55
"homepage": "https://github.com/marcusdarmstrong/lifetimes",
66
"repository": "github:marcusdarmstrong/lifetimes",

packages/lifetimes/lifetimes.test.ts

+3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { test } from "node:test";
44
import { lazy, createElement } from "react";
55

66
import {
7+
type ReadonlyDate,
78
readOnly,
89
requestLocal,
910
unsafeSingleton,
@@ -210,6 +211,8 @@ test("readOnly", async (t) => {
210211
// @ts-expect-error: This is readonly, of course.
211212
date.setMonth(0);
212213
}, "cannot be modified");
214+
215+
readOnly(() => date) satisfies ReadonlyDate;
213216
});
214217

215218
await t.test("promises", () => {

packages/lifetimes/lifetimes.ts

+24-17
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,22 @@ const MUTABLE_MAP_METHODS = new Set<string | symbol>([
1414
"clear",
1515
]);
1616
const MUTABLE_DATE_METHODS = new Set<string | symbol>([
17-
"setDate",
18-
"setFullYear",
19-
"setHours",
17+
"setTime",
18+
"setYear",
2019
"setMilliseconds",
21-
"setMinutes",
22-
"setMonth",
20+
"setUTCMilliseconds",
2321
"setSeconds",
24-
"setTime",
22+
"setUTCSeconds",
23+
"setMinutes",
24+
"setUTCMinutes",
25+
"setHours",
26+
"setUTCHours",
27+
"setDate",
2528
"setUTCDate",
29+
"setMonth",
30+
"setUTCMonth",
31+
"setFullYear",
2632
"setUTCFullYear",
27-
"setUTCHours",
28-
"setYear",
2933
]);
3034

3135
function isReactObject(value: unknown): boolean {
@@ -102,6 +106,7 @@ export type ReadonlyDate = Readonly<
102106
Omit<
103107
Date,
104108
| "setTime"
109+
| "setYear"
105110
| "setMilliseconds"
106111
| "setUTCMilliseconds"
107112
| "setSeconds"
@@ -123,15 +128,17 @@ export type Immutable<T> = T extends (...args: infer Ks) => infer V
123128
? (...args: Ks) => V
124129
: T extends Date
125130
? ReadonlyDate
126-
: T extends Set<infer S>
127-
? ReadonlySet<Immutable<S>>
128-
: T extends Map<infer K, infer V>
129-
? ReadonlyMap<Immutable<K>, Immutable<V>>
130-
: T extends ReactElement<unknown>
131-
? T
132-
: {
133-
readonly [K in keyof T]: Immutable<T[K]>;
134-
};
131+
: T extends ReadonlyDate
132+
? ReadonlyDate
133+
: T extends Set<infer S>
134+
? ReadonlySet<Immutable<S>>
135+
: T extends Map<infer K, infer V>
136+
? ReadonlyMap<Immutable<K>, Immutable<V>>
137+
: T extends ReactElement<unknown>
138+
? T
139+
: {
140+
readonly [K in keyof T]: Immutable<T[K]>;
141+
};
135142

136143
function isCallable<T>(
137144
value: ReadOnlyInitializer<T>,

packages/lifetimes/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "lifetimes",
3-
"version": "2.2.0",
3+
"version": "2.2.1",
44
"description": "A utility for explicit specification and enforcement of module scope variable lifetimes",
55
"license": "MIT",
66
"author": "Marcus Armstrong <marcusdarmstrong@gmail.com>",

0 commit comments

Comments
 (0)