This project uses [tsd](https://github.com/SamVerschueren/tsd) to test the built definition files (`*.d.ts`).
-Type tests are located in the `test-dts` directory. To run the dts tests, run `yarn test-dts`. Note that the type test requires all relevant `*.d.ts` files to be built first (and the script does it for you). Once the `d.ts` files are built and up-to-date, the tests can be re-run by simply running `./node_modules/.bin/tsd`.
+Type tests are located in the `test-dts` directory. To run the dts tests, run `yarn test-dts`. Note that the type test requires all relevant `*.d.ts` files to be built first (and the script does it for you). Once the `d.ts` files are built and up-to-date, the tests can be re-run by simply running `yarn test-dts`.
## Financial Contribution
)
}
+type Primitive = string | number | boolean | bigint | symbol | undefined | null
+type Builtin = Primitive | Function | Date | Error | RegExp
+type DeepReadonly<T> = T extends Builtin
+ ? T
+ : T extends Map<infer K, infer V>
+ ? ReadonlyMap<DeepReadonly<K>, DeepReadonly<V>>
+ : T extends ReadonlyMap<infer K, infer V>
+ ? ReadonlyMap<DeepReadonly<K>, DeepReadonly<V>>
+ : T extends WeakMap<infer K, infer V>
+ ? WeakMap<DeepReadonly<K>, DeepReadonly<V>>
+ : T extends Set<infer U>
+ ? ReadonlySet<DeepReadonly<U>>
+ : T extends ReadonlySet<infer U>
+ ? ReadonlySet<DeepReadonly<U>>
+ : T extends WeakSet<infer U>
+ ? WeakSet<DeepReadonly<U>>
+ : T extends Promise<infer U>
+ ? Promise<DeepReadonly<U>>
+ : T extends {}
+ ? { readonly [K in keyof T]: DeepReadonly<T[K]> }
+ : Readonly<T>
+
export function readonly<T extends object>(
target: T
-): Readonly<UnwrapNestedRefs<T>> {
+): DeepReadonly<UnwrapNestedRefs<T>> {
return createReactiveObject(
target,
true,
--- /dev/null
+import { readonly, describe, expectError } from './index'\r
+\r
+describe('should support DeepReadonly', () => {\r
+ const r = readonly({ obj: { k: 'v' } })\r
+ // @ts-expect-error\r
+ expectError((r.obj = {}))\r
+ // @ts-expect-error\r
+ expectError((r.obj.k = 'x'))\r
+})\r