v3.0.0
Immutable
release. Only release title and notes can be modified.
Added
@studnicky/no-readonly-in-data-typeESLint rule (autofixable, type-checker driven): forbidsreadonlymodifiers baked into exportedtypealias data definitions. Detection is proven through the type system with no name matching — generic transformation types (mapped types likeDeepReadonlyType, conditional types likeDeepMergeType) resolve to types with no concrete readonly members and are never flagged, and a type that merely references a readonly type is left alone. The fix removes thereadonlymodifiers.
Changed
- Breaking: Exported data
typealiases across the toolkit no longer carryreadonlymodifiers. Atypedescribes shape, not access policy; consumers declare immutability at the use site (readonly,Readonly<T>,DeepReadonlyType<T>). This includes@studnicky/typesJsonValueTypeand the*Typeoption/result shapes across the primitives.interfacecontracts and all use-sitereadonly(parameters, class fields,Readonly<T>references) are unchanged. - Breaking:
@studnicky/fetchreplaces the request/response interceptor mechanism with protected override lifecycle hooks. SubclassFetchClientand overrideonRequest(context)/onResponse(context)to transform the outgoing request or incoming response. Removed: therequestInterceptor/responseInterceptorconfig fields and builder methods,InterceptorManager, and theRequestInterceptorType/ResponseInterceptorTypeexports; the context types are nowRequestContextType/ResponseContextType. The package no longer depends on@studnicky/pipeline. @studnicky/interface-must-be-contractis now type-checker driven and autofixable. It resolves each member's type through the checker and flags an interface only when every member is JSON-serializable — including generic type-parameter bodies such asinterface Box<T> { v: T }. The fix rewrites a data-shape interface to atypealias, preservingexport/declaremodifiers, generics, andextends(as an intersection), and is skipped for declaration-merged or globally-augmented interfaces.