Releases: Studnicky/substrate
Release list
v7.0.1
@studnicky/batch
Patch Changes
- @studnicky/errors@7.0.1
- @studnicky/json@7.0.1
- @studnicky/types@7.0.1
@studnicky/boundary-kit
Patch Changes
- @studnicky/errors@7.0.1
- @studnicky/resilience@7.0.1
- @studnicky/retry@7.0.1
- @studnicky/throttle@7.0.1
- @studnicky/types@7.0.1
@studnicky/bounded-dispatcher
Patch Changes
- @studnicky/concurrency@7.0.1
- @studnicky/event-bus@7.0.1
- @studnicky/scheduler@7.0.1
- @studnicky/types@7.0.1
@studnicky/cache
Patch Changes
- @studnicky/errors@7.0.1
- @studnicky/json@7.0.1
- @studnicky/types@7.0.1
@studnicky/circular-buffer
Patch Changes
- @studnicky/errors@7.0.1
- @studnicky/json@7.0.1
- @studnicky/types@7.0.1
@studnicky/clock
Patch Changes
- @studnicky/errors@7.0.1
- @studnicky/json@7.0.1
- @studnicky/types@7.0.1
@studnicky/concurrency
Patch Changes
- @studnicky/circular-buffer@7.0.1
- @studnicky/errors@7.0.1
- @studnicky/json@7.0.1
- @studnicky/types@7.0.1
@studnicky/config
Patch Changes
- @studnicky/errors@7.0.1
- @studnicky/json@7.0.1
- @studnicky/types@7.0.1
@studnicky/context
Patch Changes
- @studnicky/errors@7.0.1
- @studnicky/json@7.0.1
- @studnicky/types@7.0.1
@studnicky/entity-store
Patch Changes
- @studnicky/errors@7.0.1
- @studnicky/json@7.0.1
- @studnicky/types@7.0.1
@studnicky/errors
Patch Changes
- @studnicky/types@7.0.1
@studnicky/eslint-config
Patch Changes
- 9e17c78:
descriptive-identifiers's camelCase tokenizer no longer uses a backtracking regex (/[A-Z]?[a-z]+|[A-Z]+(?=[A-Z][a-z]|$)/g), fixing a polynomial-time ReDoS (CodeQLjs/polynomial-redos, high severity) on an uppercase run immediately followed by a non-letter character that isn't the end of the identifier — e.g. a long run of capitals before a digit forced the engine to backtrack one character at a time at every starting position within the run. Replaced with a linear-time manual scan that produces identical tokens for real-world identifiers and, as a side effect, fixes a latent bug where the old regex silently dropped acronym tokens entirely in that same shape (e.g.HTTP2Clienttokenized as["Client"], losingHTTP2).- @studnicky/types@7.0.1
@studnicky/event-bus
Patch Changes
- @studnicky/circular-buffer@7.0.1
- @studnicky/errors@7.0.1
- @studnicky/json@7.0.1
- @studnicky/types@7.0.1
@studnicky/fetch
Patch Changes
- @studnicky/config@7.0.1
- @studnicky/errors@7.0.1
- @studnicky/json@7.0.1
- @studnicky/types@7.0.1
@studnicky/file-lock
Patch Changes
- @studnicky/errors@7.0.1
- @studnicky/json@7.0.1
- @studnicky/types@7.0.1
- @studnicky/virtual-fs@7.0.1
@studnicky/flag-evaluator
Patch Changes
- @studnicky/errors@7.0.1
- @studnicky/json@7.0.1
- @studnicky/types@7.0.1
@studnicky/fsm
Patch Changes
- @studnicky/circular-buffer@7.0.1
- @studnicky/errors@7.0.1
- @studnicky/json@7.0.1
- @studnicky/types@7.0.1
@studnicky/health-registry
Patch Changes
- @studnicky/errors@7.0.1
- @studnicky/json@7.0.1
- @studnicky/types@7.0.1
@studnicky/idempotency-guard
Patch Changes
- @studnicky/cache@7.0.1
- @studnicky/concurrency@7.0.1
- @studnicky/errors@7.0.1
- @studnicky/json@7.0.1
- @studnicky/types@7.0.1
@studnicky/json
Patch Changes
- @studnicky/errors@7.0.1
- @studnicky/types@7.0.1
@studnicky/keyed-rate-limiter
Patch Changes
- @studnicky/cache@7.0.1
- @studnicky/errors@7.0.1
- @studnicky/resilience@7.0.1
@studnicky/keyed-work-gate
Patch Changes
- @studnicky/concurrency@7.0.1
- @studnicky/mutex@7.0.1
- @studnicky/types@7.0.1
@studnicky/logger
Patch Changes
- @studnicky/errors@7.0.1
- @studnicky/json@7.0.1
- @studnicky/types@7.0.1
@studnicky/memoize
Patch Changes
- @studnicky/cache@7.0.1
- @studnicky/concurrency@7.0.1
- @studnicky/errors@7.0.1
@studnicky/mutex
Patch Changes
- @studnicky/config@7.0.1
- @studnicky/errors@7.0.1
- @studnicky/json@7.0.1
- @studnicky/types@7.0.1
@studnicky/paginator
Patch Changes
- @studnicky/errors@7.0.1
- @studnicky/fsm@7.0.1
- @studnicky/json@7.0.1
- @studnicky/types@7.0.1
@studnicky/pipeline
Patch Changes
- @studnicky/errors@7.0.1
- @studnicky/json@7.0.1
- @studnicky/types@7.0.1
@studnicky/predicates
Patch Changes
- @studnicky/cache@7.0.1
- @studnicky/json@7.0.1
@studnicky/process-kit
Patch Changes
- @studnicky/fsm@7.0.1
- @studnicky/scheduler@7.0.1
- @studnicky/signal@7.0.1
@studnicky/request-executor
Patch Changes
- @studnicky/context@7.0.1
- @studnicky/fetch@7.0.1
- @studnicky/retry@7.0.1
- @studnicky/signal@7.0.1
- @studnicky/timing@7.0.1
- @studnicky/types@7.0.1
@studnicky/resilience
Patch Changes
- @studnicky/errors@7.0.1
- @studnicky/json@7.0.1
- @studnicky/signal@7.0.1
- @studnicky/types@7.0.1
@studnicky/retry
Patch Changes
- @studnicky/config@7.0.1
- @studnicky/errors@7.0.1
- @studnicky/json@7.0.1
- @studnicky/logger@7.0.1
- @studnicky/timing@7.0.1
- @studnicky/types@7.0.1
@studnicky/sample-buffer
Patch Changes
- @studnicky/errors@7.0.1
- @studnicky/json@7.0.1
- @studnicky/types@7.0.1
@studnicky/scheduler
Patch Changes
- @studnicky/clock@7.0.1
- @studnicky/errors@7.0.1
- @studnicky/json@7.0.1
- @studnicky/types@7.0.1
@studnicky/signal
Patch Changes
- @studnicky/errors@7.0.1
@studnicky/sliding-window-limiter
Patch Changes
- @studnicky/circular-buffer@7.0.1
- @studnicky/errors@7.0.1
- @studnicky/json@7.0.1
- @studnicky/signal@7.0.1
- @studnicky/types@7.0.1
@studnicky/system
Patch Changes
- @studnicky/json@7.0.1
- @studnicky/types@7.0.1
@studnicky/throttle
Patch Changes
- @studnicky/circular-buffer@7.0.1
- @studnicky/config@7.0.1
- @studnicky/errors@7.0.1
- @studnicky/json@7.0.1
- @studnicky/sample-buffer@7.0.1
- @studnicky/signal@7.0.1
- @studnicky/types@7.0.1
@studnicky/timing
Patch Changes
- @studnicky/config@7.0.1
- @studnicky/errors@7.0.1
- @studnicky/json@7.0.1
- @studnicky/types@7.0.1
@studnicky/virtual-fs
Patch Changes
- @studnicky/clock@7.0.1
- @studnicky/errors@7.0.1
- @studnicky/json@7.0.1
- @studnicky/types@7.0.1
@studnicky/visible-range
Patch Changes
- @studnicky/errors@7.0.1
- @studnicky/json@7.0.1
- @studnicky/types@7.0.1
@studnicky/worker-pool
Patch Changes
- @studnicky/batch@7.0.1
- @studnicky/errors@7.0.1
- @studnicky/json@7.0.1
- @studnicky/signal@7.0.1
- @studnicky/system@7.0.1
- @studnicky/types@7.0.1
v7.0.0
@studnicky/batch
Patch Changes
- d2b44b7: Domain error constructors route through
@studnicky/errors'sDomainErrorArgs.build()instead of hand-rolledsuper({code,message,retryable})boilerplate. Fluent builders assemble their options object via@studnicky/types'sPickDefined.from()instead of manual spread-ternary chains.@studnicky/fetch's config validators subclass@studnicky/config'sConfigValidation.@studnicky/eslint-config's duplicated rule-internal AST helpers are consolidated underrules/shared/. No public API or behavior changes. - Updated dependencies [d2b44b7]
- Updated dependencies [d2b44b7]
- @studnicky/types@7.0.0
- @studnicky/errors@7.0.0
- @studnicky/json@7.0.0
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
@studnicky/boundary-kit
Patch Changes
- d2b44b7: Domain error constructors route through
@studnicky/errors'sDomainErrorArgs.build()instead of hand-rolledsuper({code,message,retryable})boilerplate. Fluent builders assemble their options object via@studnicky/types'sPickDefined.from()instead of manual spread-ternary chains.@studnicky/fetch's config validators subclass@studnicky/config'sConfigValidation.@studnicky/eslint-config's duplicated rule-internal AST helpers are consolidated underrules/shared/. No public API or behavior changes. - Updated dependencies [d2b44b7]
- Updated dependencies [d2b44b7]
- Updated dependencies [d2b44b7]
- @studnicky/types@7.0.0
- @studnicky/errors@7.0.0
- @studnicky/retry@7.0.0
- @studnicky/resilience@7.0.0
- @studnicky/throttle@7.0.0
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
@studnicky/bounded-dispatcher
Patch Changes
- d2b44b7: Domain error constructors route through
@studnicky/errors'sDomainErrorArgs.build()instead of hand-rolledsuper({code,message,retryable})boilerplate. Fluent builders assemble their options object via@studnicky/types'sPickDefined.from()instead of manual spread-ternary chains.@studnicky/fetch's config validators subclass@studnicky/config'sConfigValidation.@studnicky/eslint-config's duplicated rule-internal AST helpers are consolidated underrules/shared/. No public API or behavior changes. - Updated dependencies [d2b44b7]
- Updated dependencies [d2b44b7]
- @studnicky/types@7.0.0
- @studnicky/concurrency@7.0.0
- @studnicky/event-bus@7.0.0
- @studnicky/scheduler@7.0.0
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
@studnicky/cache
Patch Changes
- Updated dependencies [d2b44b7]
- Updated dependencies [d2b44b7]
- @studnicky/types@7.0.0
- @studnicky/errors@7.0.0
- @studnicky/json@7.0.0
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
@studnicky/circular-buffer
Patch Changes
- d2b44b7: Domain error constructors route through
@studnicky/errors'sDomainErrorArgs.build()instead of hand-rolledsuper({code,message,retryable})boilerplate. Fluent builders assemble their options object via@studnicky/types'sPickDefined.from()instead of manual spread-ternary chains.@studnicky/fetch's config validators subclass@studnicky/config'sConfigValidation.@studnicky/eslint-config's duplicated rule-internal AST helpers are consolidated underrules/shared/. No public API or behavior changes. - Updated dependencies [d2b44b7]
- Updated dependencies [d2b44b7]
- @studnicky/types@7.0.0
- @studnicky/errors@7.0.0
- @studnicky/json@7.0.0
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
@studnicky/clock
Patch Changes
- d2b44b7: Domain error constructors route through
@studnicky/errors'sDomainErrorArgs.build()instead of hand-rolledsuper({code,message,retryable})boilerplate. Fluent builders assemble their options object via@studnicky/types'sPickDefined.from()instead of manual spread-ternary chains.@studnicky/fetch's config validators subclass@studnicky/config'sConfigValidation.@studnicky/eslint-config's duplicated rule-internal AST helpers are consolidated underrules/shared/. No public API or behavior changes. - Updated dependencies [d2b44b7]
- Updated dependencies [d2b44b7]
- @studnicky/types@7.0.0
- @studnicky/errors@7.0.0
- @studnicky/json@7.0.0
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
@studnicky/concurrency
Patch Changes
- d2b44b7: Domain error constructors route through
@studnicky/errors'sDomainErrorArgs.build()instead of hand-rolledsuper({code,message,retryable})boilerplate. Fluent builders assemble their options object via@studnicky/types'sPickDefined.from()instead of manual spread-ternary chains.@studnicky/fetch's config validators subclass@studnicky/config'sConfigValidation.@studnicky/eslint-config's duplicated rule-internal AST helpers are consolidated underrules/shared/. No public API or behavior changes. - Updated dependencies [d2b44b7]
- Updated dependencies [d2b44b7]
- Updated dependencies [d2b44b7]
- @studnicky/types@7.0.0
- @studnicky/errors@7.0.0
- @studnicky/circular-buffer@7.0.0
- @studnicky/json@7.0.0
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
@studnicky/config
Patch Changes
- Updated dependencies [d2b44b7]
- Updated dependencies [d2b44b7]
- @studnicky/types@7.0.0
- @studnicky/errors@7.0.0
- @studnicky/json@7.0.0
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
@studnicky/context
Patch Changes
- Updated dependencies [d2b44b7]
- Updated dependencies [d2b44b7]
- @studnicky/types@7.0.0
- @studnicky/errors@7.0.0
- @studnicky/json@7.0.0
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
@studnicky/entity-store
Minor Changes
-
d2b44b7:
@studnicky/errorsexportsHookInvoker, a composable delegate for safely invoking consumer-supplied lifecycle hooks — synchronous or asynchronous, without forcing async contagion on a synchronous caller and without letting a broken hook produce an unhandled rejection. A class composes it as a field (never extends it directly) and callsinvoke(hookName, fn)from its own methods; a caller needing a different failure disposition than the default throw defines a small delegate subclass overridingonHookError. Also exportsHookInvocationError,HookTimeoutError(thrown when an optionaltimeoutMselapses before a hook settles), andReentrantHookInvocationError(thrown whendetectReentrancycatches a synchronous same-call-stack reentrantinvoke).@studnicky/entity-store,@studnicky/file-lock,@studnicky/health-registry, and@studnicky/worker-poolroute their lifecycle hooks through a record-and-continueHookInvokerdelegate: a throwing hook override no longer aborts or corrupts an in-flight operation — the failure is recorded instead, inspectable viahookErrorCount/getHookErrors()(getHookErrorCount()/getHookErrors()onWorkerPool).@studnicky/logger'sLoggercomposes a plainHookInvokerforonLog/onDropped/onChildCreate(unchanged throwing behavior) and separately guardsonTransportError, recording its failures viahookErrorCount/getHookErrors()so a broken override can't abort fan-out to the remaining transports.@studnicky/retryand@studnicky/pipelinegain ahookTimeoutMsbuilder option (and matchingRetry.create/Pipeline.createconfig field) bounding how long an async lifecycle hook may run before it's routed toonHookErrorwith aHookTimeoutErrorcause. Left unset, a hook may take arbitrarily long, matching prior behavior.
Patch Changes
- Updated dependencies [d2b44b7]
- Updated dependencies [d2b44b7]
- @studnicky/types@7.0.0
- @studnicky/errors@7.0.0
- @studnicky/json@7.0.0
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
@studnicky/errors
Minor Changes
-
d2b44b7:
@studnicky/typesexportsPickDefined.from(record), which stripsundefined-valued keys from a record while narrowing each remaining value's type away fromundefined— built for builders assembling an options object from a mix of required and optional fields.@studnicky/errorsexportsDomainErrorArgs.build(fields, options), wh...
v6.0.0
Added
@studnicky/eslint-config: newfolder-content-shaperule enforces thatinterfaces/folders holdinterfacedeclarations (runtime contracts),types/folders holdtypealias declarations (data shapes), and other folders keep data constants (regex, enums, frozen collections — not runtime functions) grouped under aconstants/folder (orfixtures/for test/example data). Merges the formerfolder-declaration-shape,constants-folder-required, andentity-namespacerules. Regex literals (/pattern/flagssyntax, ornew RegExp('pattern', ...)with an inlined string pattern) are zero-tolerance — a single inline regex is flagged, unlike the 2+ threshold for other constants, since a regex pattern is a data constant exactly like an enum value and must never be declared inline.@studnicky/eslint-config: new hexagonal-architecture layer-boundary rule category for consuming applications —layer-import-boundary(enforces a configurable layer allow-matrix on imports),domain-purity(forbids impure imports/calls inside a configurable domain layer),adapter-only-import(restricts concrete third-party dependencies to a configurable adapters layer), andknown-types-outside-adapters(bansany/unknowntypes everywhere outside a configurable adapters layer — adapters are the only layer permitted to hold untyped intake data; their job is converting it to known shapes).hash-private-fieldsgains an optional, layer-scoped// external-contract: <reason>directive-comment exemption for intake/hook-body fields whose underscore-prefixed names are dictated by a fixed external contract.HexagonalSuite.create(...)wires all four rules from one shared layers/sourceRoot configuration.@studnicky/eslint-config: newwhole-canonical-typesrule bans derivingPartial<X>/Pick<X, K>/Omit<X, K>from any canonical, codebase-owned named type or interface. A partial type masks the real data shape; consumers must always be aware of every property a canonical shape carries. There is no directive-comment exemption for this rule — genuinely different shapes must be defined explicitly, in full.@studnicky/eslint-config: newtype-alias-invariantsrule merges the formertype-alias-must-end-type,no-readonly-in-data-type,no-type-aliasing,types-derived-from-schema, andno-prefer-existing-typerules into one sharedTSTypeAliasDeclaration/TSInterfaceDeclarationvisitor with five independently toggleable checks. Types imported from external (node_modules) packages are automatically exempt from the schema-derivation check via real type-checker resolution, not manual directives.@studnicky/eslint-config: domain-grouped suite/preset configs —entitySuite,hygieneSuite,v8Suite(plainLinter.Configobjects), andHexagonalSuite.create(...)(a factory, since its rules share layer configuration) — for one-import consumption instead of wiring every rule individually.
Changed
@studnicky/eslint-config: every rule id previously framed as a prohibition (no-*) is renamed to a positive framing, so a rule's name states what it enforces rather than what it forbids:no-any-unknown-outside-adapters→known-types-outside-adapters,no-bind-apply-call→direct-invocation-only,no-concat-in-loops→array-concat-outside-loops(@studnicky/v8),no-export-alias→canonical-export-names,no-freestanding-verb-noun→static-method-verbs,no-partial-canonical-type→whole-canonical-types,no-project-internal-acronyms→descriptive-identifiers,no-spread-in-loops→array-spread-outside-loops(@studnicky/v8),no-suppression-comments→clean-diagnostics,no-this-alias→lexical-this-only,no-trivial-shim→inline-trivial-logic,no-underscore-private→hash-private-fields. Rule behavior andmessageIds are unchanged — only the rule id, exported symbol, and filename changed. Breaking for any consumer referencing these rule ids directly.@studnicky/eslint-config:static-method-verbs(formerlyno-freestanding-verb-noun) no longer detects violations by matching a hardcoded list of English verb-prefix names; it now uses real structural (and optionally type-aware) AST analysis via a configurablemode: 'any' | 'structural' | 'typed'option (default'structural').single-export's error-class detection now resolves the superclass through the TypeScript type checker instead of checking whether its name ends in"Error".@studnicky/eslint-config:type-alias-invariants's checks now sequence so contradictory advice on the same declaration can't fire together — a verdict that recommends deleting a declaration entirely (noAliasing's naked/primitive/generic-forwarding aliases,noPreferExisting's exact/near/subsumed duplicates of an imported type) suppressesmustEndType's "rename it" advice andderivedFromSchema's "move it into an entity" advice on that same node, since renaming or entity-ifying a declaration that should be deleted is contradictory guidance. ThesubsumedMatchmessage no longer recommendsPick<X, K>as a fix, since that would directly violatewhole-canonical-types.
Fixed
- Relocated 40
type/interfacedeclarations across 11 packages (batch,clock,errors,fetch,json,logger,retry,scheduler,throttle,timing,visible-range) to the folder matching their actual declaration form, per the newfolder-content-shaperule. @studnicky/request-executornow importsClientConfigType/RequestContextType/ResponseContextTypefrom@studnicky/fetch/typesinstead of the now-stale@studnicky/fetch/interfacessubpath.- Converted 60 freestanding module-scope functions across
@studnicky/eslint-config's own rule source,errors,retry,throttle,config,logger, and 13 demo example scripts to static class methods, closing the real violationsstatic-method-verbs' (formerlyno-freestanding-verb-noun) naming-heuristic previously missed. - Resolved all
derivedFromSchema/type-alias-invariantsviolations surfaced by enabling full enforcement repo-wide: converted inline type-literal aliases into JSON-Schema-derived entity namespaces (renamed*TypeEntity→*Entity, since the namespace itself is the entity and already contains.Type) acrossbatch,boundary-kit,circular-buffer,concurrency,config,entity-store,errors,fetch,flag-evaluator,health-registry,idempotency-guard,json,logger,mutex,resilience,retry,sample-buffer,scheduler,system,throttle,timing,virtual-fs,visible-range, and 17 smaller packages, or added honest// json-schema-uninexpressible: <reason>directives where a shape is genuinely inexpressible (function types, generics,unknown, class instances, opaque handles). - Resolved all 39
whole-canonical-typesviolations surfaced by enabling the new rule repo-wide: dropped redundantPartial<X>wrappers whereXwas already fully optional, and defined explicit fully-spelled-out types where a genuine subset was needed, acrossbatch,boundary-kit,circular-buffer,eslint-config,fetch,file-lock,request-executor,retry,sample-buffer,virtual-fs, andvisible-range.
v5.1.1
Changed
- Documentation now distinguishes passive observer hooks from in-band behavioral hooks, removes stale package-count/version drift, and aligns the GitHub Pages package pages plus affected package READMEs with the shipped hook semantics.
Fixed
@studnicky/fsmEffectInterpreter#drain()now always clears its internal draining flag, so a throwing observer or effect-path hook no longer wedges subsequentsend()calls into silent no-ops.- Passive observer hooks across the shipped primitives no longer replace committed results, committed state transitions, or canonical domain errors when those hooks throw; the affected packages now keep the real operation outcome authoritative and are covered by regression tests.
v5.1.0
Added
- 15 new packages:
@studnicky/boundary-kit,@studnicky/bounded-dispatcher,@studnicky/entity-store,@studnicky/flag-evaluator,@studnicky/health-registry,@studnicky/idempotency-guard,@studnicky/keyed-rate-limiter,@studnicky/keyed-work-gate,@studnicky/memoize,@studnicky/paginator,@studnicky/process-kit,@studnicky/request-executor,@studnicky/sliding-window-limiter,@studnicky/visible-range, and@studnicky/worker-pool. See each package's own README for its API. ClampedConfigsoft-correction clamping utility in@studnicky/config, mirroringConfigValidation's static hook idiom.Delay.sleep()/Delay.value()in@studnicky/scheduler— virtual-time-aware delay helpers composingClockandScheduler.InterpreterHistoryin@studnicky/fsm— a bounded recorder of anEffectInterpreter's own transitions, composingCircularBuffer.- 15 new custom ESLint rules (31 → 46 total):
all-types-are-entities,constants-folder-required,interface-suffix,interfaces-compose-named-types,no-project-internal-acronyms,no-underscore-private,types-derived-from-schema,v8/array-from-map-callback,v8/conditional-property-assignment,v8/dynamic-property-access,v8/inline-arrow-functions,v8/inline-functions,v8/max-switch-cases,v8/memoize-array-length,v8/object-spread. - Documentation pages for all 15 new packages and all 15 new ESLint rules, plus homepage cards for both.
Fixed
SchemaValidator.compile()is now idempotent for a schema$idalready registered on the shared Ajv instance, instead of throwing on re-registration.- Several shipped classes that delegate a composed primitive's lifecycle hook to their own same-named hook (
KeyedRateLimiter,IdempotencyGuard,Memoize,Paginator) now correctly chain throughsuper.<hook>()before their own logic, so the composition remains sound if the base hook ever gains real behavior or a consumer subclasses further. - Rewrote the Pattern Composition guide, which described Boundary Kit, Coordination Kit, and Process Kit as "documentation-only, no package exists" — all three now ship as real packages.
- Mermaid diagrams on the architecture page previously rendered as empty, contentless elements for any reader or crawler without JavaScript; both now carry a text-equivalent fallback.
- Corrected three new packages that were versioned to match the existing lockstep release version instead of their own first release.
v5.0.0
Changed
@studnicky/eslint-configtightens the structural export rules.@studnicky/no-export-aliasnow forbids any non-index re-export path, including direct re-exports, star re-exports, and import-then-export forwarding for both value and type bindings.@studnicky/single-exportnow recognizes restricted topology both as directories and fractal filename suffixes, requires constant modules to export onlySCREAMING_SNAKE_CASEsymbols, and narrows enum exemptions to enum-and-constant-only files.@studnicky/no-suppression-commentsnow also rejects coverage suppression markers includingc8 ignore,c8-ignore, andistanbul ignore entirely.- Breaking:
@studnicky/fetchrenames its exported constant objects toDEFAULT_DISPATCHER_CONFIG,POOL_HEALTH, andVALIDATION_LIMITS. - Breaking:
@studnicky/loggerrenames its exported log-level constants toLOG_LEVELandLOG_LEVEL_MAP.
v4.0.0
Changed
- Breaking:
@studnicky/retryreplaces theretryInterceptorpipeline with a protectedonRetryScheduled(context)lifecycle hook. SubclassRetryand override it to setcontext.delayMs(using a shippedBackoffStrategy), setcontext.abortto stop retrying, or mutatecontext.stateacross attempts (the hook may be async). Removed: theretryInterceptorconfig field and builder method, theRetryInterceptorTypetype, and theisRetryInterceptorguard. The package no longer depends on@studnicky/pipeline. - Breaking:
@studnicky/batchreplaces thebatchConcurrentfunction and itshooksoptions object with aBatchclass exposing protected lifecycle hooks (onBatchStart,onItemStart,onItemSuccess,onItemError,onItemSettled,onConcurrencySaturated,onBatchComplete). Construct withBatch.create(maxConcurrent?)and subclass to observe. Removed:batchConcurrent,BatchHooksInterface, andBatchOptionsInterface.
v3.0.0
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.
v2.0.0
Changed
@studnicky/eslint-configis now a standard ESLint plugin rather than a config factory. Register thepluginandv8Pluginexports under the@studnickyand@studnicky/v8namespaces in your flat config and enable rules directly. Breaking: thecreateEslintConfigfactory and theEslintConfigOptionsTypetype are removed, and the package no longer carries a runtime dependency on@studnicky/config.
v1.3.0
Changed
@studnicky/fetchis now isomorphic: requests run over the runtime's nativefetchin both the browser and Node, with the interceptor pipeline, timeout, request builder, and URL utilities working identically in each. The undici connection-pool dispatcher is a Node-only enhancement — disabled by default and selected by export condition; enabling it in a browser throws a clear error. Adds a live in-browser runnable demo and corrects the prior "Node-only" documentation.