Skip to content

Releases: Studnicky/substrate

v7.0.1

Choose a tag to compare

@github-actions github-actions released this 17 Jul 01:59
Immutable release. Only release title and notes can be modified.
e77e9ff

@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 (CodeQL js/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. HTTP2Client tokenized as ["Client"], losing HTTP2).
    • @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

Choose a tag to compare

@github-actions github-actions released this 17 Jul 01:15
Immutable release. Only release title and notes can be modified.
69eb42f

@studnicky/batch

Patch Changes

  • d2b44b7: Domain error constructors route through @studnicky/errors's DomainErrorArgs.build() instead of hand-rolled super({code,message,retryable}) boilerplate. Fluent builders assemble their options object via @studnicky/types's PickDefined.from() instead of manual spread-ternary chains. @studnicky/fetch's config validators subclass @studnicky/config's ConfigValidation. @studnicky/eslint-config's duplicated rule-internal AST helpers are consolidated under rules/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's DomainErrorArgs.build() instead of hand-rolled super({code,message,retryable}) boilerplate. Fluent builders assemble their options object via @studnicky/types's PickDefined.from() instead of manual spread-ternary chains. @studnicky/fetch's config validators subclass @studnicky/config's ConfigValidation. @studnicky/eslint-config's duplicated rule-internal AST helpers are consolidated under rules/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's DomainErrorArgs.build() instead of hand-rolled super({code,message,retryable}) boilerplate. Fluent builders assemble their options object via @studnicky/types's PickDefined.from() instead of manual spread-ternary chains. @studnicky/fetch's config validators subclass @studnicky/config's ConfigValidation. @studnicky/eslint-config's duplicated rule-internal AST helpers are consolidated under rules/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's DomainErrorArgs.build() instead of hand-rolled super({code,message,retryable}) boilerplate. Fluent builders assemble their options object via @studnicky/types's PickDefined.from() instead of manual spread-ternary chains. @studnicky/fetch's config validators subclass @studnicky/config's ConfigValidation. @studnicky/eslint-config's duplicated rule-internal AST helpers are consolidated under rules/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's DomainErrorArgs.build() instead of hand-rolled super({code,message,retryable}) boilerplate. Fluent builders assemble their options object via @studnicky/types's PickDefined.from() instead of manual spread-ternary chains. @studnicky/fetch's config validators subclass @studnicky/config's ConfigValidation. @studnicky/eslint-config's duplicated rule-internal AST helpers are consolidated under rules/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's DomainErrorArgs.build() instead of hand-rolled super({code,message,retryable}) boilerplate. Fluent builders assemble their options object via @studnicky/types's PickDefined.from() instead of manual spread-ternary chains. @studnicky/fetch's config validators subclass @studnicky/config's ConfigValidation. @studnicky/eslint-config's duplicated rule-internal AST helpers are consolidated under rules/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/errors exports HookInvoker, 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 calls invoke(hookName, fn) from its own methods; a caller needing a different failure disposition than the default throw defines a small delegate subclass overriding onHookError. Also exports HookInvocationError, HookTimeoutError (thrown when an optional timeoutMs elapses before a hook settles), and ReentrantHookInvocationError (thrown when detectReentrancy catches a synchronous same-call-stack reentrant invoke).

    @studnicky/entity-store, @studnicky/file-lock, @studnicky/health-registry, and @studnicky/worker-pool route their lifecycle hooks through a record-and-continue HookInvoker delegate: a throwing hook override no longer aborts or corrupts an in-flight operation — the failure is recorded instead, inspectable via hookErrorCount/getHookErrors() (getHookErrorCount()/getHookErrors() on WorkerPool).

    @studnicky/logger's Logger composes a plain HookInvoker for onLog/onDropped/onChildCreate (unchanged throwing behavior) and separately guards onTransportError, recording its failures via hookErrorCount/getHookErrors() so a broken override can't abort fan-out to the remaining transports.

    @studnicky/retry and @studnicky/pipeline gain a hookTimeoutMs builder option (and matching Retry.create/Pipeline.create config field) bounding how long an async lifecycle hook may run before it's routed to onHookError with a HookTimeoutError cause. 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/types exports PickDefined.from(record), which strips undefined-valued keys from a record while narrowing each remaining value's type away from undefined — built for builders assembling an options object from a mix of required and optional fields.

    @studnicky/errors exports DomainErrorArgs.build(fields, options), wh...

Read more

v6.0.0

Choose a tag to compare

@github-actions github-actions released this 16 Jul 01:39
Immutable release. Only release title and notes can be modified.
e1db4f7

Added

  • @studnicky/eslint-config: new folder-content-shape rule enforces that interfaces/ folders hold interface declarations (runtime contracts), types/ folders hold type alias declarations (data shapes), and other folders keep data constants (regex, enums, frozen collections — not runtime functions) grouped under a constants/ folder (or fixtures/ for test/example data). Merges the former folder-declaration-shape, constants-folder-required, and entity-namespace rules. Regex literals (/pattern/flags syntax, or new 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), and known-types-outside-adapters (bans any/unknown types 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-fields gains 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: new whole-canonical-types rule bans deriving Partial<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: new type-alias-invariants rule merges the former type-alias-must-end-type, no-readonly-in-data-type, no-type-aliasing, types-derived-from-schema, and no-prefer-existing-type rules into one shared TSTypeAliasDeclaration/TSInterfaceDeclaration visitor 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 (plain Linter.Config objects), and HexagonalSuite.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-adaptersknown-types-outside-adapters, no-bind-apply-calldirect-invocation-only, no-concat-in-loopsarray-concat-outside-loops (@studnicky/v8), no-export-aliascanonical-export-names, no-freestanding-verb-nounstatic-method-verbs, no-partial-canonical-typewhole-canonical-types, no-project-internal-acronymsdescriptive-identifiers, no-spread-in-loopsarray-spread-outside-loops (@studnicky/v8), no-suppression-commentsclean-diagnostics, no-this-aliaslexical-this-only, no-trivial-shiminline-trivial-logic, no-underscore-privatehash-private-fields. Rule behavior and messageIds 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 (formerly no-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 configurable mode: '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) suppresses mustEndType's "rename it" advice and derivedFromSchema'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. The subsumedMatch message no longer recommends Pick<X, K> as a fix, since that would directly violate whole-canonical-types.

Fixed

  • Relocated 40 type/interface declarations 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 new folder-content-shape rule.
  • @studnicky/request-executor now imports ClientConfigType/RequestContextType/ResponseContextType from @studnicky/fetch/types instead of the now-stale @studnicky/fetch/interfaces subpath.
  • 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 violations static-method-verbs' (formerly no-freestanding-verb-noun) naming-heuristic previously missed.
  • Resolved all derivedFromSchema/type-alias-invariants violations 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) across batch, 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-types violations surfaced by enabling the new rule repo-wide: dropped redundant Partial<X> wrappers where X was already fully optional, and defined explicit fully-spelled-out types where a genuine subset was needed, across batch, boundary-kit, circular-buffer, eslint-config, fetch, file-lock, request-executor, retry, sample-buffer, virtual-fs, and visible-range.

v5.1.1

Choose a tag to compare

@github-actions github-actions released this 09 Jul 13:47
Immutable release. Only release title and notes can be modified.

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/fsm EffectInterpreter#drain() now always clears its internal draining flag, so a throwing observer or effect-path hook no longer wedges subsequent send() 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

Choose a tag to compare

@github-actions github-actions released this 09 Jul 07:02
Immutable release. Only release title and notes can be modified.
9e2b961

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.
  • ClampedConfig soft-correction clamping utility in @studnicky/config, mirroring ConfigValidation's static hook idiom.
  • Delay.sleep()/Delay.value() in @studnicky/scheduler — virtual-time-aware delay helpers composing Clock and Scheduler.
  • InterpreterHistory in @studnicky/fsm — a bounded recorder of an EffectInterpreter's own transitions, composing CircularBuffer.
  • 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 $id already 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 through super.<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

Choose a tag to compare

@github-actions github-actions released this 08 Jul 16:30
Immutable release. Only release title and notes can be modified.

Changed

  • @studnicky/eslint-config tightens the structural export rules. @studnicky/no-export-alias now 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-export now recognizes restricted topology both as directories and fractal filename suffixes, requires constant modules to export only SCREAMING_SNAKE_CASE symbols, and narrows enum exemptions to enum-and-constant-only files. @studnicky/no-suppression-comments now also rejects coverage suppression markers including c8 ignore, c8-ignore, and istanbul ignore entirely.
  • Breaking: @studnicky/fetch renames its exported constant objects to DEFAULT_DISPATCHER_CONFIG, POOL_HEALTH, and VALIDATION_LIMITS.
  • Breaking: @studnicky/logger renames its exported log-level constants to LOG_LEVEL and LOG_LEVEL_MAP.

v4.0.0

Choose a tag to compare

@github-actions github-actions released this 28 Jun 22:28
Immutable release. Only release title and notes can be modified.
5889ac7

Changed

  • Breaking: @studnicky/retry replaces the retryInterceptor pipeline with a protected onRetryScheduled(context) lifecycle hook. Subclass Retry and override it to set context.delayMs (using a shipped BackoffStrategy), set context.abort to stop retrying, or mutate context.state across attempts (the hook may be async). Removed: the retryInterceptor config field and builder method, the RetryInterceptorType type, and the isRetryInterceptor guard. The package no longer depends on @studnicky/pipeline.
  • Breaking: @studnicky/batch replaces the batchConcurrent function and its hooks options object with a Batch class exposing protected lifecycle hooks (onBatchStart, onItemStart, onItemSuccess, onItemError, onItemSettled, onConcurrencySaturated, onBatchComplete). Construct with Batch.create(maxConcurrent?) and subclass to observe. Removed: batchConcurrent, BatchHooksInterface, and BatchOptionsInterface.

v3.0.0

Choose a tag to compare

@github-actions github-actions released this 26 Jun 14:49
Immutable release. Only release title and notes can be modified.
92595ba

Added

  • @studnicky/no-readonly-in-data-type ESLint rule (autofixable, type-checker driven): forbids readonly modifiers baked into exported type alias data definitions. Detection is proven through the type system with no name matching — generic transformation types (mapped types like DeepReadonlyType, conditional types like DeepMergeType) 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 the readonly modifiers.

Changed

  • Breaking: Exported data type aliases across the toolkit no longer carry readonly modifiers. A type describes shape, not access policy; consumers declare immutability at the use site (readonly, Readonly<T>, DeepReadonlyType<T>). This includes @studnicky/types JsonValueType and the *Type option/result shapes across the primitives. interface contracts and all use-site readonly (parameters, class fields, Readonly<T> references) are unchanged.
  • Breaking: @studnicky/fetch replaces the request/response interceptor mechanism with protected override lifecycle hooks. Subclass FetchClient and override onRequest(context) / onResponse(context) to transform the outgoing request or incoming response. Removed: the requestInterceptor/responseInterceptor config fields and builder methods, InterceptorManager, and the RequestInterceptorType/ResponseInterceptorType exports; the context types are now RequestContextType / ResponseContextType. The package no longer depends on @studnicky/pipeline.
  • @studnicky/interface-must-be-contract is 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 as interface Box<T> { v: T }. The fix rewrites a data-shape interface to a type alias, preserving export/declare modifiers, generics, and extends (as an intersection), and is skipped for declaration-merged or globally-augmented interfaces.

v2.0.0

Choose a tag to compare

@github-actions github-actions released this 26 Jun 03:23
Immutable release. Only release title and notes can be modified.
1ac2ab4

Changed

  • @studnicky/eslint-config is now a standard ESLint plugin rather than a config factory. Register the plugin and v8Plugin exports under the @studnicky and @studnicky/v8 namespaces in your flat config and enable rules directly. Breaking: the createEslintConfig factory and the EslintConfigOptionsType type are removed, and the package no longer carries a runtime dependency on @studnicky/config.

v1.3.0

Choose a tag to compare

@github-actions github-actions released this 25 Jun 05:47
Immutable release. Only release title and notes can be modified.
0cc79e9

Changed

  • @studnicky/fetch is now isomorphic: requests run over the runtime's native fetch in 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.