diff --git a/AGENTS.md b/AGENTS.md index 2345c7bd6..84ac3fd1c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -331,7 +331,7 @@ Where each kind of documentation belongs: | ------------------------------------------------ | ----------------------------------------- | | API shape and invariants | JSDoc on `module.f.*` exports or `types.ts` | | Architectural choices, *why this / why not that* | the relevant `README.md` | -| What changed in a release | `CHANGELOG.md` (short, see §8.3) | +| What changed in a release | `changelog/` (short, see §8.3) | | Rationale, measurements, alternatives considered | the PR description | --- @@ -1219,11 +1219,17 @@ Ensure all of the checks in [§2](#2-everyday-workflow) pass. ### 8.3 CHANGELOG -To add a CHANGELOG entry, first open the PR to obtain its number, then add the -entry at the **top** of `## Unreleased` in [./CHANGELOG.md](./CHANGELOG.md) using -the real PR number. Follow the same `Topic: short description [#NNN](url)` style -as existing entries. New entries always go above existing ones. CHANGELOG entries -are created after the PR exists because they reference the PR number. +The changelog is the [./changelog/](./changelog/) directory, one file per +released version plus [./changelog/unreleased/](./changelog/unreleased/) holding +one file per unreleased PR — see +[changelog/README.md](./changelog/README.md) for the layout. + +To add a CHANGELOG entry, first open the PR to obtain its number, then create +`changelog/unreleased/.md` named by that number. A PR never edits another +PR's file, so two PRs can never conflict. Follow the same +`Topic: short description [#NNN](url)` style as existing entries. A PR with +several entries puts them all in its one file, most important first. CHANGELOG +entries are created after the PR exists because they reference the PR number. Only add CHANGELOG entries for code changes — PRs that only touch `todo/`, `AGENTS.md`, or other documentation files do not need one. @@ -1238,13 +1244,16 @@ Only add CHANGELOG entries for code changes — PRs that only touch `todo/`, the pull request (`/pull/NNN`). Do not link to — or name in plain text — an issue or `todo/` file: issue files are deleted when the work is done, so those references rot and mean nothing to a reader of the published package. -- These two rules govern **new** entries. Don't rewrite a released section as a - side effect of an unrelated PR — a feature PR touches its own entry and nothing - else. A deliberate cleanup pass over past sections is a legitimate PR of its - own (this convention arrived as one), and no released text is lost when it - happens: each entry keeps its PR link, and the full prior wording stays in the - PR and in git history. Where an entry predates the convention and its PR cannot - be identified, leave it unlinked rather than guessing one. +- **A file holds list items only.** No heading — the version or PR number is the + file name — and no Markdown beyond paragraphs, list items, inline code, bold, + and links, so the website can render entries with a small self-hosted parser. +- These rules govern **new** entries. Don't rewrite a released version's file as + a side effect of an unrelated PR — a feature PR touches its own file and + nothing else. A deliberate cleanup pass over past releases is a legitimate PR + of its own (this convention arrived as one), and no released text is lost when + it happens: each entry keeps its PR link, and the full prior wording stays in + the PR and in git history. Where an entry predates the convention and its PR + cannot be identified, leave it unlinked rather than guessing one. ### 8.4 Breaking changes and versioning @@ -1259,11 +1268,11 @@ Only add CHANGELOG entries for code changes — PRs that only touch `todo/`, keeping a compatibility shim. - **The project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html), and the CHANGELOG decides which number moves.** A `**BREAKING CHANGES:**` entry - in `## Unreleased` means the release shipping it cannot be a patch. The package - is still pre-1.0, where the leading `0.` is pinned and the *minor* position - plays the role the major one plays after 1.0: + anywhere in `changelog/unreleased/` means the release shipping it cannot be a + patch. The package is still pre-1.0, where the leading `0.` is pinned and the + *minor* position plays the role the major one plays after 1.0: - | `## Unreleased` contains | Pre-1.0 — `0.Y.Z` | 1.0 and later — `X.Y.Z` | + | `changelog/unreleased/` contains | Pre-1.0 — `0.Y.Z` | 1.0 and later — `X.Y.Z` | | ------------------------------------------- | ----------------- | ----------------------- | | at least one `**BREAKING CHANGES:**` entry | `0.(Y+1).0` | `(X+1).0.0` | | new features, nothing breaking | `0.Y.(Z+1)` | `X.(Y+1).0` | @@ -1286,6 +1295,7 @@ Only add CHANGELOG entries for code changes — PRs that only touch `todo/`, predate this convention and took a minor bump for feature-only releases too (`0.35.0`, `0.33.0`); they are published, so leave their numbers alone. - Releasing is its own commit: the version lives in `package.json` (`"version"`) - — `deno.json` holds tasks and formatting only. When it's bumped, create a new - `## X.Y.Z` section in `CHANGELOG.md` immediately after `## Unreleased` and move - all entries from `## Unreleased` into it, leaving `## Unreleased` empty. + — `deno.json` holds tasks and formatting only. When it's bumped, concatenate + every `changelog/unreleased/*.md` in descending PR-number order into a new + `changelog/X.Y.Z.md` and delete the entry files, leaving + `changelog/unreleased/` with only its `.gitkeep`. diff --git a/CHANGELOG.md b/CHANGELOG.md index adfbeaad0..73e036759 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,2081 +1,5 @@ # Changelog -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), -and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - -While the package is pre-1.0, the minor position carries the meaning the major -one will carry after 1.0: `0.Y` is bumped **only** by a release containing -`**BREAKING CHANGES:**`, and every other release — new features included — is a -patch bump. So `0.Y` is the API-compatibility boundary, which is also the -boundary `^0.Y.Z` and `~0.Y.Z` ranges already enforce: a patch upgrade is always -safe, and crossing `0.Y` always means reading the entries below. Releases through -`0.41.0` predate this convention and used a minor bump for feature-only releases -as well. - -New entries are at most a few lines and link only to their pull request. A few -older entries predate that convention and have no PR link — they are kept as -history. - -## Unreleased - -- `types/rtti/ts`: the runtime printer supports recursive schemas — it - converts through `fjs/types/rtti/data` (new `dataToTs`), so a recursive - schema prints as `type = ` definitions plus an entry - expression instead of overflowing the stack; output is the data form's - canonical form, a struct key admitting `undefined` prints optional - (mirroring `Ts<>`), and a rule name that cannot name a type alias (reserved - word — strict-mode ones included, predefined type name, non-identifier) - gets a generated identifier - [#1547](https://github.com/functionalscript/functionalscript/pull/1547). -- **BREAKING CHANGES:** `types/ts`: a `Printer.struct` field (`StructField`) - takes an optional third element marking the key optional (`"key"?: type`). - Callers and contextually-typed implementations are unaffected; an external - `Printer` implementation annotating the parameter as - `readonly (readonly [string, string])[]` must widen it to - `readonly StructField[]` - [#1547](https://github.com/functionalscript/functionalscript/pull/1547). -- `types/sorted_list`: the two merge tail policies are now named `keepTail` and - `dropTail` instead of sharing one shadowed name; internal only - [#1546](https://github.com/functionalscript/functionalscript/pull/1546) -- `types/bit_vec`: `tryListToVec`/`tryU8ListToVec` reuse the shared balanced - fold, at the same cost as the accumulator they replace - [#1548](https://github.com/functionalscript/functionalscript/pull/1548) -- `common/monoid`: `fold` reduces as a balanced tree instead of a left fold — - `bigint.product` drops from O(n²) to O(n log n), `string.concat` pays a little - for the one combinator, `number.sum` may round differently. New - `foldAbsorbing` stops at the first element reaching an absorbing value - [#1548](https://github.com/functionalscript/functionalscript/pull/1548) -- Every module-level `@import` tag lives in its module's leading JSDoc block - (125 files swept), so emitted declaration headers list their type imports - in one place - [#1545](https://github.com/functionalscript/functionalscript/pull/1545) -- `djs/serializer`: `stringify`'s `constSerialize` drops a defensive throw for - a `refs` lookup that can never miss — `consts` only ever holds values - `getConstants` already found an entry for - [#1544](https://github.com/functionalscript/functionalscript/pull/1544) -- `types/uint8array`: `toVec` attempts the conversion instead of precomputing a - byte-count bound; behavior and error message unchanged - [#1543](https://github.com/functionalscript/functionalscript/pull/1543) -- `media/json/schema`: `toJsonSchema` supports recursive schemas — it converts - through `fjs/types/rtti/data` (new `dataToJsonSchema`) and emits named - recursion as `$defs`/`$ref`; output is canonical, so `anyOf` members and - object keys follow the data form's normalized order, and a non-empty tuple - prefix emits `minItems` - [#1542](https://github.com/functionalscript/functionalscript/pull/1542). -- `types/rtti/data`: rule and property lookups are own-property only, so a - name shadowing an `Object.prototype` member (`toString`, …) is a missing - definition for `validate`/`subset` and an ordinary extra key when validating - values; `subset` and `toData`'s coverage collapse now terminate on unions - mixing rest-based and property-based object recursion - [#1542](https://github.com/functionalscript/functionalscript/pull/1542). -- `basen/base64`: `decode` drops an overflow check in its padded branch that - could never trigger — `head`'s length is always a multiple of 6, so the - largest value `stringToVec` can return without overflowing already lands - at or under `maxLength` once the trimmed last chunk is added back - [#1541](https://github.com/functionalscript/functionalscript/pull/1541) -- `types/object`: new `structurallySame`, plus `assertStructurallySame` in - `fjs/asserts` — structural comparison for proofs - [#1538](https://github.com/functionalscript/functionalscript/pull/1538) -- RTTI: new `fjs/types/rtti/data` module — a function-free, serializable, - canonical data form for schemas with `toData`, `cmp`, `equal`, `subset`, and a - data-driven `validate` - [#1539](https://github.com/functionalscript/functionalscript/pull/1539). -- **BREAKING CHANGES:** the last documented public typedefs authored in `.mjs` - move to sibling `types.ts` files — `ParseContext`/`djsResult` to - `fjs/djs/transpiler/types.ts` and `Step` to - `fjs/protocol/mcp/stdio/types.ts` — so their documentation survives - declaration emit; importers must use the `types.ts` specifier for these types - [#1530](https://github.com/functionalscript/functionalscript/pull/1530) -- `text/utf16`: `u16` now rejects non-integers, so a fractional word is - reported invalid (`0xFFFFFFFF`) instead of being misclassified by the - surrogate/BMP range checks — which only partition the integers in - `0x0000`–`0xFFFF`. That closes the only path into - `utf16ByteToCodePointOp`'s trailing fallback arm, which is removed along - with its `isHighSurrogate` recheck - [#1540](https://github.com/functionalscript/functionalscript/pull/1540) -- `media/json/parser`: `endArray`/`endObject` no longer branch on `state.top` - and `tokenToValue` drops its defensive default arm — the parser's state - machine already guarantees these invariants, so the dead branches are gone - instead of tested - [#1536](https://github.com/functionalscript/functionalscript/pull/1536) -- `text/code_point`: new `eofFlush` factory builds the end-of-input step - `decoder` takes. The UTF-8 and UTF-16 decoders derive their eof ops from it - instead of each writing the flush out, so "leftover state becomes exactly one - error unit" is stated once - [#1537](https://github.com/functionalscript/functionalscript/pull/1537) -- `media/type`: the magic-byte signatures are declared once. `detect` now folds - its bytes through the same eliminator the streaming detector uses, instead of - matching a second, hand-mirrored copy of the same table, so a `Vec` of - sub-byte length reads the way `detectStream` already read it - [#1533](https://github.com/functionalscript/functionalscript/pull/1533) -- `fjs/cas`, `fjs/cas/evo` and `fjs/emergent_testing` compose through the raw - `step` / `mapStep` / `historyStep` combinators instead of the fluent `Eff` - wrapper, which keeps its module but now has no consumers. Behavior is - unchanged - [#1534](https://github.com/functionalscript/functionalscript/pull/1534) -- **BREAKING CHANGES:** `fjs/bnf/ll1`'s matcher runs as an explicit-stack - machine over a cursor into the shared input, so long or deeply nested input - no longer overflows the JS call stack and matching is no longer quadratic. - The `MatchRule` type described the recursive matcher and is removed; match - results are unchanged - [#1531](https://github.com/functionalscript/functionalscript/pull/1531) -- `types/bigfloat`: `decToBin` no longer returns a 54-bit mantissa when - rounding carries out of the top bit; the result is always the 53-bit - IEEE-754 significand - [#1527](https://github.com/functionalscript/functionalscript/pull/1527) -- Emitted declarations keep their documentation headers: 24 modules lost - `@module` to declaration emit and 4 never had one; all 127 module - declarations now carry it, and every `types.ts` / `proof.*` prose header - now leads its emitted declaration - [#1526](https://github.com/functionalscript/functionalscript/pull/1526) -- `fjs/media/json/schema`'s emitted declaration is exact: an explicit `@type` - naming the recursive schema by `typeof` replaces the `@type {const}` cast - that collapsed `not` to `/*elided*/ any` and five sibling fields to `any` - [#1526](https://github.com/functionalscript/functionalscript/pull/1526) -- **BREAKING CHANGES:** the npm package ships no `.js` files: the empty - `types.js` stubs and compiled test files are gone. Import types only with - fully erased `import type`, and use `fjs/emergent_testing/all.test.mjs` as - the external-runner entry - [#1520](https://github.com/functionalscript/functionalscript/pull/1520) -- The `fjs/emergent_testing/scenarios` fixtures, which never ran in CI, are - deleted; `fjs/emergent_testing/scenarios.md` records how to recreate them. - `types.ts` is now the only authored TypeScript - [#1520](https://github.com/functionalscript/functionalscript/pull/1520) -- `fjs/djs/parser`'s `proof` covers `endObject`'s defensive non-object-top - guard directly, the same way it already covers `pushKey` and `endArray`'s - equivalent unreachable branches - [#1525](https://github.com/functionalscript/functionalscript/pull/1525) -- `fjs/text/ascii` owns the hex-digit codec: `hexDigitValue`, - `hexDigitCodePoint`, and the `a-f` / `A-F` ranges. The JSON serializer and - both tokenizers use it instead of rederiving the offsets; the DJS tokenizer - no longer decodes a non-hex code point to a garbage digit - [#1522](https://github.com/functionalscript/functionalscript/pull/1522) -- `fjs/types/result` exports `okThen`, the pure `Result` bind — `mapOk`'s - monad sibling and the pure twin of `fjs/effects`' `okStep`. Its two error - types are unioned, so a chain that widens its error needs no rewrapping - [#1519](https://github.com/functionalscript/functionalscript/pull/1519) -- **BREAKING CHANGES:** BNF EOF is the semantic symbol `-1`, not `2^24 - 1`: - `fullRange` is `0 .. 2^24 - 2`, and the parser backends synthesize one - logical EOF after the physical input. Serialized ranges that ended at the - old EOF must be regenerated - [#1516](https://github.com/functionalscript/functionalscript/pull/1516) -- `fjs/protocol/json_rpc` `dispatch` looks up handlers by own property. - An `Object.prototype` method name arriving as `method` no longer throws - or emits a malformed response; it answers `-32601` like any other - unknown method - [#1514](https://github.com/functionalscript/functionalscript/pull/1514) - -## 0.44.0 - -- **BREAKING CHANGES:** `fjs/ci/deno` no longer exports `coverageInclude`. - The Deno CI job runs `deno task cov`, so `deno.json` owns the coverage - filter, matching how the Node jobs leave `npm run cov` to `package.json` - [#1512](https://github.com/functionalscript/functionalscript/pull/1512) -- `npm run cov` names its test entrypoint instead of relying on - `node --test` default discovery, which silently reported no tests on some - Node versions. The dead `.f.ts` extension is dropped from the Node and - Deno coverage filters - [#1512](https://github.com/functionalscript/functionalscript/pull/1512) -- **BREAKING CHANGES:** `fjs/djs/examples/input.f.ts` and - `fjs/djs/examples/m.f.ts` migrate to `.f.mjs`. Being `.mjs` they now - ship in the tarball, which `.f.ts` did not - [#1505](https://github.com/functionalscript/functionalscript/pull/1505) -- **BREAKING CHANGES:** `fjs/types/nominal/proof.f.ts` migrates to - `.f.mjs`. Its two `unique symbol` brands move to `types.ts`, exported - as `_SymbolKeyBranded` and `_SymbolIntersectionBranded` - [#1505](https://github.com/functionalscript/functionalscript/pull/1505) -- **BREAKING CHANGES:** `fjs/types/ts/proof.f.ts` migrates to `.f.mjs`. - Its `declare const` index-signature block moves to `types.ts`, - non-exported, so no public type changes - [#1505](https://github.com/functionalscript/functionalscript/pull/1505) -- **BREAKING CHANGES:** `fjs/emergent_testing/example.f.ts` migrates - from authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) — the - four typed consts become JSDoc `@type` annotations - [#1505](https://github.com/functionalscript/functionalscript/pull/1505) -- **BREAKING CHANGES:** `fjs/types/rtti/validate/proof.f.ts` migrates to - `.f.mjs` — 23 compile-time round-trips stay function-local as JSDoc - `@typedef`s and are not emitted - [#1505](https://github.com/functionalscript/functionalscript/pull/1505) -- **BREAKING CHANGES:** `fjs/types/rtti/parse/proof.f.ts` migrates to - `.f.mjs` — compile-time round-trips stay function-local as JSDoc - `@typedef`s and are not emitted - [#1505](https://github.com/functionalscript/functionalscript/pull/1505) -- **BREAKING CHANGES:** `fjs/emergent_testing/proof.f.ts` migrates to - `.f.mjs`. Six module-local types become `_`-prefixed `@typedef`s, as a - JSDoc `@typedef` has no non-exported form - [#1505](https://github.com/functionalscript/functionalscript/pull/1505) -- **BREAKING CHANGES:** `fjs/effects/node/proof.f.ts` migrates to - `.f.mjs` — explicit generic instantiations become checked `@type` - declarations, as JSDoc has no call-site form - [#1505](https://github.com/functionalscript/functionalscript/pull/1505) -- **BREAKING CHANGES:** `fjs/js/tokenizer/proof.f.ts` migrates to - `.f.mjs` — typed consts become JSDoc `@type` annotations - [#1505](https://github.com/functionalscript/functionalscript/pull/1505) -- **BREAKING CHANGES:** `fjs/media/json/parser/proof.f.ts` migrates to - `.f.mjs` — the typed const becomes a JSDoc `@type` annotation - [#1505](https://github.com/functionalscript/functionalscript/pull/1505) -- **BREAKING CHANGES:** `todo/proof.f.ts` migrates to `.f.mjs`. The - `TemplateType` alias is renamed `_TemplateType`: it was never exported, - but a JSDoc `@typedef` has no non-exported form - [#1505](https://github.com/functionalscript/functionalscript/pull/1505) -- **BREAKING CHANGES:** `fjs/media/json/tokenizer/proof.f.ts` migrates - from authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) — the - typed `tokenizeString` const becomes a JSDoc `@type` annotation, and - the `JsonToken` type import becomes an `@import` - [#1504](https://github.com/functionalscript/functionalscript/pull/1504) -- **BREAKING CHANGES:** `fjs/media/json/proof.f.ts` migrates from - authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) — two nested - `as unknown as null` double-casts become nested inline `@type` casts - [#1504](https://github.com/functionalscript/functionalscript/pull/1504) -- **BREAKING CHANGES:** `fjs/effects/proof.f.ts` and - `fjs/effects/eff/proof.f.ts` migrate from authored TypeScript to - JSDoc-typed JavaScript (`.f.mjs`) — explicit generic instantiations - (`match(...)`, `do_('add')`, `pure([])`, `okStep(...)`, - `error(...)`) become inline `@type` casts, per convention; - `assertPure`'s generic function becomes a `@template`/`@param` block; - the local `AddOp`/`AnyOp` types are renamed `_AddOp`/`_AnyOp` (neither - was previously exported, but a JSDoc `@typedef` has no non-exported - form). `fjs/effects/eff/proof.f.mjs` updates its import of - `assertPure` accordingly - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/text/utf8/proof.f.ts` migrates from - authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) — no type - annotations to convert - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/text/utf16/proof.f.ts` migrates from - authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/ci/proof.f.ts` migrates from authored - TypeScript to JSDoc-typed JavaScript (`.f.mjs`) - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/types/btree/remove/proof.f.ts` migrates - from authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/types/btree/set/proof.f.ts` migrates from - authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/cli/proof.f.ts` migrates from authored - TypeScript to JSDoc-typed JavaScript (`.f.mjs`) - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/ci/nix/proof.f.ts` migrates from authored - TypeScript to JSDoc-typed JavaScript (`.f.mjs`) - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/types/range_map/proof.f.ts` migrates from - authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/types/list/proof.f.ts` migrates from - authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/types/btree/find/proof.f.ts` migrates from - authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/types/btree/proof.f.ts` migrates from - authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/types/byte_set/proof.f.ts` migrates from - authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/effects/memory/proof.f.ts` migrates from - authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) — the local - `MemoryState` type is renamed `_MemoryState` (it was never exported, but - a JSDoc `@typedef` has no non-exported form) - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/types/sorted_set/proof.f.ts` migrates from - authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/text/proof.f.ts` migrates from authored - TypeScript to JSDoc-typed JavaScript (`.f.mjs`) - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/types/sorted_list/proof.f.ts` migrates from - authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/website/proof.f.ts` migrates from authored - TypeScript to JSDoc-typed JavaScript (`.f.mjs`) — no type annotations - to convert - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/types/bit_vec/proof.f.ts` migrates from - authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/types/bigint/proof.f.ts` migrates from - authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) — the local - `Benchmark` type is renamed `_Benchmark` (it was never exported, but - a JSDoc `@typedef` has no non-exported form) - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/fsc/proof.f.ts` migrates from authored - TypeScript to JSDoc-typed JavaScript (`.f.mjs`) - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/dev/update/proof.f.ts` migrates from - authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/djs/ast/proof.f.ts` migrates from authored - TypeScript to JSDoc-typed JavaScript (`.f.mjs`) — no type annotations - to convert - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/crypto/sha2/proof.f.ts` migrates from - authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/crypto/pow/proof.f.ts` migrates from - authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/text/code_point/proof.f.ts` migrates from - authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/types/array/proof.f.ts` migrates from - authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/types/function/operator/proof.f.ts` migrates - from authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/common/monoid/proof.f.ts` migrates from - authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/text/sgr/proof.f.ts` migrates from authored - TypeScript to JSDoc-typed JavaScript (`.f.mjs`) - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/text/ascii/proof.f.ts` migrates from authored - TypeScript to JSDoc-typed JavaScript (`.f.mjs`) — no type annotations to - convert - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/module.ts` (the `fjs` CLI entry point) migrates - to `fjs/module.mjs`, per the `module.ts -> module.mjs` stage-1 mapping. - `package.json`'s `bin.fjs` now points directly at the authored `.mjs` - (dropping the compiled-`.js` indirection, since `.mjs` already ships in - the npm package) and its `test`/`start`/`ci-update`/`dev-update`/ - `index-html` scripts, and `deno.json`'s `fjs` task, are updated - accordingly - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/effects/node/module.ts` (the Node.js effect - runner — `runEffect`, `run`) migrates from authored TypeScript to - JSDoc-typed JavaScript, per the `module.ts -> module.mjs` stage-1 - mapping — the local `Server`, `Readable`, `IncomingMessage`, - `ServerResponse`, `RequestListener`, `EffectToPromise`, and - `FrameworkRegister` types are renamed `_Server`, `_Readable`, - `_IncomingMessage`, `_ServerResponse`, `_RequestListener`, - `_EffectToPromise`, `_FrameworkRegister` (none were previously - exported, but a JSDoc `@typedef` has no non-exported form; the - `_`-prefix also avoids a same-name collision with the differently-shaped - public `Server`/`IncomingMessage`/`ServerResponse`/`RequestListener` - types in the sibling `fjs/effects/node/types.ts`). - Importers must use the `.mjs` specifier. Updates `fjs/module.ts` and - `fjs/emergent_testing/all.test.ts` accordingly. Also fixes two stale - `fjs/mcp/module.f.ts` / `fjs/protocol/mcp/module.f.ts` doc-comment - references (left over from earlier commits in this PR) to their - current `.f.mjs` paths - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/effects/node/memory/module.ts` and `proof` - migrate from authored TypeScript to JSDoc-typed JavaScript, per the - `module.ts -> module.mjs` stage-1 mapping — no local complex types to - split (`MemoryOperationMap`/`Uuid` are only used internally). - Importers must use the `.mjs` specifier. Updates - `fjs/effects/node/module.ts` accordingly - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/effects/module.ts` (`asyncRun`) and - `fjs/types/result/module.ts` (`tryCatch`, `asyncTryCatch`) migrate - from authored TypeScript to JSDoc-typed JavaScript, per the - `module.ts -> module.mjs` stage-1 mapping (these are plain `.ts` - implementation modules, not `.f.ts`). Importers must use the `.mjs` - specifier. Updates `fjs/effects/node/module.ts`, - `fjs/effects/node/memory/module.ts`, and - `fjs/effects/node/memory/proof.ts` accordingly - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/module` and `proof` (the top-level - FunctionalScript compiler entry point and command dispatcher) migrate - from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript - (`.f.mjs`) — no local complex types to split. Importers must use the - `.f.mjs` specifier. Updates `fjs/module.ts`'s import accordingly - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/mcp/cas/module` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — the local - `Meta` type is renamed `_Meta` (it was never exported, but a JSDoc - `@typedef` has no non-exported form). Importers must use the `.f.mjs` - specifier. Updates `fjs/mcp/module.f.ts` accordingly - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/mcp/evo/module` and `proof` migrate from - authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — - no local types to split (`evoToolRegistry` is the only export beyond - the four rtti schema consts). Importers must use the `.f.mjs` - specifier. Updates `fjs/mcp/module.f.ts` accordingly - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/protocol/mcp/module` and `proof` migrate - from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), - moving `Implementation`, `ServerCapabilities`, `InitializeParams`, - `InitializeResult`, `TextContent`, `BlobResource`, `EmbeddedResource`, - `ContentItem`, `Tool`, `ToolsListParams`, `ToolsListResult`, - `ToolsCallParams`, `ToolsCallResult`, `McpHandlers`, `ToolEntry`, - `Handle`, `Uninitialized`, `Initializing`, `InitializedState`, - `McpSessionState`, and `McpConfig` into a sibling `types.ts` — - importers must use the `.f.mjs` specifier for the runtime values and - the `types.ts` specifier for the types. Updates `fjs/mcp/evo/module.f.ts`, - `fjs/mcp/evo/proof.f.ts`, `fjs/mcp/module.f.ts`, `fjs/mcp/cas/module.f.ts`, - and `fjs/mcp/proof.f.ts` accordingly - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/media/json/schema/module` and `proof` - migrate from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript - (`.f.mjs`) — `Unknown` stays as a JSDoc typedef in the module (no - separate `types.ts`, no external importers of the type); the local - `UnknownConst` type is renamed `_UnknownConst` (it was never exported, - but a JSDoc `@typedef` has no non-exported form). Importers must use - the `.f.mjs` specifier. Updates `fjs/protocol/mcp/module.f.ts` - accordingly - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/mcp/module` and `proof` migrate from - authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — - no local complex types to split (`casMcpHandlers`, `casConfig`, and - `casMcpServer` are the only exports). Importers must use the `.f.mjs` - specifier. Updates `fjs/module.f.ts` accordingly - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/djs/module` and `proof` migrate from - authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — - `Object`, `Array`, `Primitive`, and `Unknown` no longer re-export from - the module; importers must use `fjs/djs/types.ts` directly (this - completes the extraction started when those types moved out of - `fjs/djs/module.f.ts` earlier in this PR). Updates - `fjs/types/rtti/validate/proof.f.ts`, `fjs/types/rtti/parse/proof.f.ts`, - `fjs/media/json/schema/module.f.ts`, and `fjs/module.f.ts` accordingly - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/djs/transpiler/module` and `proof` migrate - from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) - — `ParseContext` and `djsResult` stay as JSDoc typedefs in the module - (no separate `types.ts`, no external importers of the types). Importers - must use the `.f.mjs` specifier. Updates `fjs/djs/module.f.ts` - accordingly - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/djs/parser/module` and `proof` migrate from - authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), - moving `ParseError` into a sibling `types.ts` — importers must use the - `.f.mjs` specifier for the runtime value and the `types.ts` specifier - for the type. Updates `fjs/djs/transpiler/module.f.ts` accordingly - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/djs/tokenizer/module` and `proof` migrate - from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), - moving `DjsToken` and `DjsTokenWithMetadata` into a sibling `types.ts` - — importers must use the `.f.mjs` specifier for the runtime values and - the `types.ts` specifier for the types. Updates - `fjs/djs/parser/module.f.ts`, `fjs/djs/parser/proof.f.ts`, and - `fjs/djs/transpiler/module.f.ts` accordingly - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/djs/serializer/module` and `proof` migrate - from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) - — `MapEntries`, `RefCounter`, `Refs`, `GetConstsState`, and `RefLookup` - stay as `_`-prefixed JSDoc typedefs in the module (no separate - `types.ts`, no external importers of the types). Importers must use the - `.f.mjs` specifier. Updates `fjs/djs/module.f.ts`, - `fjs/djs/tokenizer/module.f.ts`, and six proof files - (`fjs/djs/ast`, `fjs/djs/parser`, `fjs/djs/tokenizer`, - `fjs/djs/transpiler`, `fjs/js/tokenizer`, `fjs/media/json/tokenizer`) - accordingly - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/protocol/json_rpc/module`'s `id` schema const - is renamed to `_id` — it crosses into the sibling `types.ts` (as - `typeof _id`) but was never meant to be a public runtime export, so the - `_` prefix marks it private-by-convention like the equivalent case in - `fjs/media/revision/module`'s `_lock`. `fjs/media/module`'s CHANGELOG - entry below is corrected: it no longer claims `fjs/media/proof.f.ts` - stays TypeScript, since this PR migrates it (see the next entry). Also - adds the required `@module` header to four `types.ts` files added - earlier in this PR that were missing one (`fjs/cas/evo/types.ts`, - `fjs/media/types.ts`, `fjs/media/revision/types.ts`, - `fjs/protocol/json_rpc/types.ts`) - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/media/proof.f.ts` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — no local - types to split - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/djs/ast/module` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), moving - `AstModule`, `AstConst`, `AstModuleRef`, `AstArray`, `AstObject`, and - `AstBody` into a sibling `types.ts` — importers must use the `.f.mjs` - specifier for the runtime value and the `types.ts` specifier for the - types. `fjs/djs`'s own recursive `Primitive`/`Object`/`Array`/`Unknown` - types move out of `fjs/djs/module.f.ts` into a new sibling - `fjs/djs/types.ts` (hand-authored, following the pattern - `fjs/media/json/types.ts` established), with `fjs/djs/module.f.ts` - re-exporting them — `fjs/djs/module.f.ts` itself stays TypeScript for - now, since it still depends on `fjs/djs/serializer` and - `fjs/djs/transpiler`, neither yet migrated. Updates - `fjs/djs/ast/proof.f.ts`, `fjs/djs/parser/module.f.ts`, and - `fjs/djs/transpiler/module.f.ts` accordingly - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/cas/evo/module` and `proof` migrate from - authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), - moving `Hash`, `Subject`, `RevisionData`, `SubjectState`, `Cache`, and - `Evo` into a sibling `types.ts` — importers must use the `.f.mjs` - specifier for the runtime values and the `types.ts` specifier for the - types. Updates `fjs/mcp/evo/module`, `fjs/mcp/evo/proof.f.ts`, - `fjs/mcp/module`, `fjs/mcp/cas/module`, and `fjs/mcp/proof.f.ts` - accordingly - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/protocol/mcp/stdio/module` and `proof` migrate - from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — - `Step` stays as a JSDoc typedef in the module (no separate `types.ts`, no - external importers of the type). Importers must use the `.f.mjs` - specifier. Updates `fjs/mcp/module` and `fjs/mcp/proof.f.ts` accordingly - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/media/revision/module` and `proof` migrate - from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), - moving `LockMap`, `Revision`, and `RevisionError` into a sibling - `types.ts` — importers must use the `.f.mjs` specifier for the runtime - values and the `types.ts` specifier for the types. Updates - `fjs/cas/evo/module`, `fjs/cas/evo/proof.f.ts`, `fjs/mcp/cas/module`, - `fjs/mcp/proof.f.ts`, and `fjs/media/proof.f.ts` accordingly - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/protocol/json_rpc/module` and `proof` migrate - from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), - moving `Id`, `Request`, `RpcError`, `Response`, `Handler`, and `Handlers` - into a sibling `types.ts` — importers must use the `.f.mjs` specifier for - the runtime values and the `types.ts` specifier for the types. Updates - `fjs/protocol/mcp/module`, `fjs/protocol/mcp/stdio/module`, - `fjs/protocol/mcp/stdio/proof.f.ts`, and `fjs/mcp/proof.f.ts` accordingly - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/media/module` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), moving - `DialectEntry` into a sibling `types.ts` — importers must use the - `.f.mjs` specifier for the runtime value and the `types.ts` specifier - for the type. Updates `fjs/media/revision/module` and - `fjs/mcp/cas/module` accordingly - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/fsm/module` and `proof` migrate from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — `Grammar` stays - as a JSDoc typedef in the module (no separate `types.ts`, no external - importers of the type). Importers must use the `.f.mjs` specifier - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- **BREAKING CHANGES:** `fjs/dev/package_json/module` and `proof` migrate - from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — - `PackageJson` and `JsonTextError` stay as JSDoc typedefs in the module - (no separate `types.ts`, no external importers of the types). Importers - must use the `.f.mjs` specifier - [#1503](https://github.com/functionalscript/functionalscript/pull/1503) -- `nanvm-lib` operator behaviour is described once, as data, in - `fjs/nanvm/module.f.mjs`: the JavaScript proof and the generated - Rust tests both read it, so a case is written once instead of twice - [#1489](https://github.com/functionalscript/functionalscript/pull/1489) -- **BREAKING CHANGES:** `fjs/bnf/proof` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — no local - types to split. Importers must use the `.f.mjs` specifier - [#1501](https://github.com/functionalscript/functionalscript/pull/1501) -- **BREAKING CHANGES:** `fjs/media/json/module` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), moving - `Entry`, `_Entries`, and `_MapEntries` into the sibling `types.ts` — - importers must use the `.f.mjs` specifier for the runtime value and - the `types.ts` specifier for the types. This pulls in four more - files that depend on it directly or transitively: `fjs/bnf/testlib`, - `fjs/bnf/data/proof`, `fjs/bnf/descent/proof`, and `fjs/bnf/ll1/proof` - all migrate to `.f.mjs` as well, with no local types to split - [#1501](https://github.com/functionalscript/functionalscript/pull/1501) -- **BREAKING CHANGES:** `fjs/media/json/parser` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) under the - stage-1 TypeScript-to-mjs migration, splitting `_JsonObject`, - `_JsonArray`, `_JsonStack`, `_StateParse`, and `_JsonState` into a - sibling `types.ts` — importers must use the `.f.mjs` specifier for the - runtime value and the `types.ts` specifier for the types. `proof.f.ts` - stays TypeScript for now (it depends on `fjs/media/json/module.f.ts`, - still unmigrated) - [#1499](https://github.com/functionalscript/functionalscript/pull/1499) -- **BREAKING CHANGES:** the JSON rtti schemas `primitive`, `unknown`, - `object`, and `array` move from `fjs/media/json/module.f.ts` to a new - JSDoc-typed `fjs/media/json/rtti/module.f.mjs`, and the `Primitive`, - `Unknown`, `Object`, and `Array` types to a sibling - `fjs/media/json/types.ts` — importers must use the `rtti/module.f.mjs` - specifier for the schemas and the `types.ts` specifier for the types. - `fjs/media/json/module.f.ts` stays TypeScript and no longer re-exports - either - [#1498](https://github.com/functionalscript/functionalscript/pull/1498) -- **BREAKING CHANGES:** `fjs/fsc/json.f.ts` and `fjs/fsc/bnf.f.ts` migrate - from authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) — no - local types to split, both use only `Rule`/`TerminalRange` from - `fjs/bnf/types.ts`. Importers must use the `.f.mjs` specifier - [#1494](https://github.com/functionalscript/functionalscript/pull/1494) -- **BREAKING CHANGES:** `fjs/media/json/tokenizer` migrates from - authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), - splitting `JsonToken` and the internal `_ScanState`/`_ScanInput` - types into a sibling `types.ts` — importers must use the `.f.mjs` - specifier for runtime values and the `types.ts` specifier for types. - `proof.f.ts` stays TypeScript for now (it depends on - `djs/serializer/module.f.ts`, still unmigrated) - [#1494](https://github.com/functionalscript/functionalscript/pull/1494) -- **BREAKING CHANGES:** `fjs/js/tokenizer/module.f.ts` migrates from - authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), - splitting `StringToken`, `NumberToken`, `BigIntToken`, `ErrorToken`, - `WhitespaceToken`, `NewLineToken`, `IdToken`, `CommentToken`, - `EofToken`, `JsToken`, `TokenMetadata`, `JsTokenWithMetadata`, and a - large set of internal state-machine types into a sibling `types.ts` — - importers must use the `.f.mjs` specifier for runtime values and the - `types.ts` specifier for types. `proof.f.ts` stays TypeScript for now - (it depends on `djs/serializer/module.f.ts`, still unmigrated) - [#1494](https://github.com/functionalscript/functionalscript/pull/1494) -- **BREAKING CHANGES:** `fjs/emergent_testing/module.f.ts` migrates from - authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), - splitting `TestFn`, `TestEntry`, `TestSet`, `Path`, `Reporter`, and the - internal `_TestState`/`_TestAndPath` types into a sibling `types.ts` — - importers must use the `.f.mjs` specifier for runtime values and the - `types.ts` specifier for types. `proof.f.ts` stays TypeScript for now - (it depends on `media/json/module.f.ts`, still unmigrated) - [#1494](https://github.com/functionalscript/functionalscript/pull/1494) -- **BREAKING CHANGES:** `fjs/cas/cli` migrates from authored TypeScript - (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — no local types to - split. `proof.f.ts` migrates alongside it. Importers must use the - `.f.mjs` specifier - [#1494](https://github.com/functionalscript/functionalscript/pull/1494) -- **BREAKING CHANGES:** `fjs/cas` migrates from authored TypeScript - (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting `Cas`, - `FileCas`, and `FileCasOperation` into a sibling `types.ts` — - importers must use the `.f.mjs` specifier for runtime values and the - `types.ts` specifier for types. `proof.f.ts` migrates alongside it - [#1494](https://github.com/functionalscript/functionalscript/pull/1494) -- **BREAKING CHANGES:** `fjs/dev` migrates from authored TypeScript - (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting `Module`, - `ModuleMap`, and `LoadModuleOperations` into a sibling `types.ts` — - importers must use the `.f.mjs` specifier for runtime values and the - `types.ts` specifier for types. `proof.f.ts` migrates alongside it - [#1494](https://github.com/functionalscript/functionalscript/pull/1494) -- **BREAKING CHANGES:** `fjs/effects/node/virtual` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting - `Dir`, `State`, and `JsModule` into a sibling `types.ts`, and narrowing - the previously-exported `Entity` to the internal `_Entity` — importers - must use the `.f.mjs` specifier for runtime values and the `types.ts` - specifier for types. `proof.f.ts` migrates alongside it - [#1494](https://github.com/functionalscript/functionalscript/pull/1494) -- **BREAKING CHANGES:** `fjs/media/type` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting - `DetectState`, `DetectMeta`, and the internal `_Signature`/`_MagicState`/ - `_Utf8Detect` types into a sibling `types.ts` — importers must use the - `.f.mjs` specifier for runtime values and the `types.ts` specifier for - types. `proof.f.ts` migrates alongside it - [#1493](https://github.com/functionalscript/functionalscript/pull/1493) -- **BREAKING CHANGES:** `fjs/ci/module.f.ts` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting - the `Setup` type into a sibling `types.ts` — importers must use the - `.f.mjs` specifier for runtime values and the `types.ts` specifier - for types. `proof.f.ts` stays TypeScript for now - [#1493](https://github.com/functionalscript/functionalscript/pull/1493) -- **BREAKING CHANGES:** `fjs/ci/node` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — no local - types to split. `proof.f.ts` migrates alongside it. Importers must - use the `.f.mjs` specifier - [#1493](https://github.com/functionalscript/functionalscript/pull/1493) -- **BREAKING CHANGES:** `fjs/ci/nix` migrates from authored TypeScript - (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting the - `NixJob` type into a sibling `types.ts` — importers must use the - `.f.mjs` specifier for runtime values and the `types.ts` specifier - for types. `proof.f.ts` stays TypeScript for now - [#1493](https://github.com/functionalscript/functionalscript/pull/1493) -- **BREAKING CHANGES:** `fjs/cli` migrates from authored TypeScript - (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting its - type-level API into a sibling `types.ts` — importers must use the - `.f.mjs` specifier for runtime values and the `types.ts` specifier - for types. `proof.f.ts` stays TypeScript for now - [#1491](https://github.com/functionalscript/functionalscript/pull/1491) -- **BREAKING CHANGES:** `fjs/website` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — importers - must use the `.f.mjs` specifier. `proof.f.ts` stays TypeScript for - now - [#1491](https://github.com/functionalscript/functionalscript/pull/1491) -- **BREAKING CHANGES:** `fjs/dev/update` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — importers - must use the `.f.mjs` specifier. `proof.f.ts` stays TypeScript for - now - [#1491](https://github.com/functionalscript/functionalscript/pull/1491) -- **BREAKING CHANGES:** `fjs/text/sgr` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting - its type-level API into a sibling `types.ts` — importers must use - the `.f.mjs` specifier for runtime values and the `types.ts` - specifier for types. `proof.f.ts` stays TypeScript for now - [#1488](https://github.com/functionalscript/functionalscript/pull/1488) -- **BREAKING CHANGES:** `fjs/effects/node/module.f.ts` migrates from - authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), - splitting its type-level API into a sibling `types.ts` — importers - must use the `.f.mjs` specifier for runtime values and the - `types.ts` specifier for types. Updates 26 dependents across the - repo; `proof.f.ts` stays TypeScript for now - [#1488](https://github.com/functionalscript/functionalscript/pull/1488) -- **BREAKING CHANGES:** `fjs/effects/eff` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting - the `Eff` type into a sibling `types.ts` — importers must use the - `.f.mjs` specifier for runtime values and the `types.ts` specifier - for types. `proof.f.ts` stays TypeScript for now - [#1488](https://github.com/functionalscript/functionalscript/pull/1488) -- **BREAKING CHANGES:** `fjs/effects/mock` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting - its type-level API into a sibling `types.ts` — importers must use - the `.f.mjs` specifier for runtime values and the `types.ts` - specifier for types - [#1488](https://github.com/functionalscript/functionalscript/pull/1488) -- **BREAKING CHANGES:** `fjs/effects/memory` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting - its type-level API into a sibling `types.ts` — importers must use - the `.f.mjs` specifier for runtime values and the `types.ts` - specifier for types. `proof.f.ts` stays TypeScript for now - [#1488](https://github.com/functionalscript/functionalscript/pull/1488) -- **BREAKING CHANGES:** `fjs/effects/list` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting - its type-level API into a sibling `types.ts` — importers must use - the `.f.mjs` specifier for runtime values and the `types.ts` - specifier for types - [#1487](https://github.com/functionalscript/functionalscript/pull/1487) -- **BREAKING CHANGES:** `fjs/effects/module.f.ts` migrates from - authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), - splitting its type-level API into a sibling `types.ts` — importers - must use the `.f.mjs` specifier for runtime values and the - `types.ts` specifier for types. Updates all 30+ dependents across - the repo; `proof.f.ts` stays TypeScript for now - [#1487](https://github.com/functionalscript/functionalscript/pull/1487) -- **BREAKING CHANGES:** `fjs/bnf/descent` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting - its type-level API into a sibling `types.ts` — importers must use - the `.f.mjs` specifier for runtime values and the `types.ts` - specifier for types. `proof.f.ts` stays TypeScript for now - [#1487](https://github.com/functionalscript/functionalscript/pull/1487) -- **BREAKING CHANGES:** `fjs/bnf/ll1` migrates from authored TypeScript - (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting its - type-level API into a sibling `types.ts` — importers must use the - `.f.mjs` specifier for runtime values and the `types.ts` specifier - for types. `proof.f.ts` stays TypeScript for now - [#1487](https://github.com/functionalscript/functionalscript/pull/1487) -- **BREAKING CHANGES:** `fjs/bnf/data` migrates from authored TypeScript - (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting its - type-level API into a sibling `types.ts` — importers must use the - `.f.mjs` specifier for runtime values and the `types.ts` specifier - for types. `proof.f.ts` stays TypeScript for now - [#1487](https://github.com/functionalscript/functionalscript/pull/1487) -- **BREAKING CHANGES:** `fjs/bnf/token_symbol` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting - the `Encoding` type into a sibling `types.ts` — importers must use - the `.f.mjs` specifier for runtime values and the `types.ts` - specifier for types - [#1486](https://github.com/functionalscript/functionalscript/pull/1486) -- **BREAKING CHANGES:** `fjs/crypto/vdf` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting - the `Sloth` type into a sibling `types.ts` — importers must use the - `.f.mjs` specifier for runtime values and the `types.ts` specifier - for types - [#1486](https://github.com/functionalscript/functionalscript/pull/1486) -- **BREAKING CHANGES:** `fjs/bnf/module.f.ts` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting - its type-level API into a sibling `types.ts` — importers must use the - `.f.mjs` specifier for runtime values and the `types.ts` specifier - for types. `proof.f.ts` and `testlib.f.ts` stay TypeScript for now - [#1485](https://github.com/functionalscript/functionalscript/pull/1485) -- **BREAKING CHANGES:** `fjs/media/nix` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting - the `Expression` type (and its private helper types) into a sibling - `types.ts` — importers must use the `.f.mjs` specifier for runtime - values and the `types.ts` specifier for types - [#1485](https://github.com/functionalscript/functionalscript/pull/1485) -- **BREAKING CHANGES:** `fjs/ci/rust` migrates from authored TypeScript - (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — importers must use - the `.f.mjs` specifier - [#1485](https://github.com/functionalscript/functionalscript/pull/1485) -- **BREAKING CHANGES:** `fjs/ci/deno` migrates from authored TypeScript - (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — importers must use - the `.f.mjs` specifier - [#1485](https://github.com/functionalscript/functionalscript/pull/1485) -- **BREAKING CHANGES:** `fjs/ci/bun` migrates from authored TypeScript - (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — importers must use - the `.f.mjs` specifier - [#1485](https://github.com/functionalscript/functionalscript/pull/1485) -- **BREAKING CHANGES:** `fjs/ci/common` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting - its type-level API (`Os`, `Architecture`, `Image`, `Step`, `Job`, - `Jobs`, `GitHubAction`, `StepType`, `MetaStep`) into a sibling - `types.ts` — importers must use the `.f.mjs` specifier for runtime - values and the `types.ts` specifier for types - [#1485](https://github.com/functionalscript/functionalscript/pull/1485) -- **BREAKING CHANGES:** `fjs/types/rtti/parse/module.f.ts` migrates from - authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), - splitting its `Result`/`Parse` types into a sibling `types.ts` — - importers must use the `.f.mjs` specifier for runtime values and the - `types.ts` specifier for types. `proof.f.ts` stays TypeScript for - now: it has a type-only dependency on the not-yet-migrated `fjs/djs` - [#1485](https://github.com/functionalscript/functionalscript/pull/1485) -- **BREAKING CHANGES:** `fjs/types/rtti/validate/module.f.ts` migrates - from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript - (`.f.mjs`) — importers must use the `.f.mjs` specifier for runtime - values and `fjs/types/rtti/common/types.ts` for the re-exported - types. `proof.f.ts` stays TypeScript for now: it has a type-only - dependency on the not-yet-migrated `fjs/djs` - [#1485](https://github.com/functionalscript/functionalscript/pull/1485) -- **BREAKING CHANGES:** `fjs/types/rtti/common` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting - its type-level API into a sibling `types.ts` — importers must use the - `.f.mjs` specifier for runtime values and the `types.ts` specifier - for types - [#1485](https://github.com/functionalscript/functionalscript/pull/1485) -- **BREAKING CHANGES:** `fjs/types/rtti/ts` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting - its `Ts` type-transformer API into a sibling `types.ts` — importers - must use the `.f.mjs` specifier for the `printer` runtime value and - the `types.ts` specifier for types - [#1485](https://github.com/functionalscript/functionalscript/pull/1485) -- **BREAKING CHANGES:** `fjs/types/rtti` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting - its type-level API into a sibling `types.ts` — importers must use the - `.f.mjs` specifier for runtime values and the `types.ts` specifier - for types - [#1485](https://github.com/functionalscript/functionalscript/pull/1485) -- **BREAKING CHANGES:** `fjs/crypto/sign` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting - the `All` type into a sibling `types.ts` — importers must use the - `.f.mjs` specifier for runtime values and the `types.ts` specifier - for the type - [#1485](https://github.com/functionalscript/functionalscript/pull/1485) -- **BREAKING CHANGES:** `fjs/media/html` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting - the `Element`/`Node` types into a sibling `types.ts` — importers must - use the `.f.mjs` specifier for runtime values and the `types.ts` - specifier for types - [#1485](https://github.com/functionalscript/functionalscript/pull/1485) -- **BREAKING CHANGES:** `fjs/sul` migrates from authored TypeScript - (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting the - `EncodeState`/`Encode` types into a sibling `types.ts` — importers - must use the `.f.mjs` specifier for runtime values and the `types.ts` - specifier for types - [#1485](https://github.com/functionalscript/functionalscript/pull/1485) -- **BREAKING CHANGES:** `fjs/types/object`, `fjs/sul/level/literal`, - `fjs/sul/id`, `fjs/sul/level/hash`, `fjs/types/string_set`, and the - `module.f.ts` of `fjs/types/sorted_set` and `fjs/types/byte_set` - migrate to `.f.mjs`, splitting their public types into a sibling - `types.ts` — importers must use the `.f.mjs` specifier for runtime - values and the `types.ts` specifier for types - [#1484](https://github.com/functionalscript/functionalscript/pull/1484) -- **BREAKING CHANGES:** `fjs/crypto/hmac`, `fjs/path`, and - `fjs/media/json/serializer` migrate from authored TypeScript - (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) under the stage-1 - TypeScript-to-mjs migration — importers must use the `.f.mjs` - specifier - [#1484](https://github.com/functionalscript/functionalscript/pull/1484) -- **BREAKING CHANGES:** every public type exported by an authored `.f.mjs` - module moves to a sibling `types.ts` (31 modules, including `asserts`, - `types/list`, `types/bit_vec`, `types/result`, `text`, `crypto/sha2`) — - importers of these types must use the `types.ts` specifier. The runtime-empty - `fjs/types/option/module.f.mjs` becomes `fjs/types/option/types.ts` - [#1483](https://github.com/functionalscript/functionalscript/pull/1483) -- `fjs/types/nullable/proof.f.ts`, `fjs/types/range/proof.f.ts`, - `fjs/types/function/proof.f.ts`, `fjs/types/result/proof.f.ts`, and - `fjs/types/function/compare/proof.f.ts` migrate to `proof.f.mjs` under - the stage-1 TypeScript-to-mjs migration; no other module imports a proof - file, so this is not a breaking change - [#1480](https://github.com/functionalscript/functionalscript/pull/1480) -- **BREAKING CHANGES:** `fjs/text/utf8`, `fjs/text` (top module), and - `fjs/types/uint8array` migrate from authored TypeScript (`.f.ts`) to - JSDoc-typed JavaScript (`.f.mjs`) under the stage-1 TypeScript-to-mjs - migration — importers must use the `.f.mjs` specifier - [#1480](https://github.com/functionalscript/functionalscript/pull/1480) -- **BREAKING CHANGES:** `fjs/ci/config`, `fjs/text/ascii`, and `fjs/fsc` - migrate from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript - (`.f.mjs`) under the stage-1 TypeScript-to-mjs migration — importers - must use the `.f.mjs` specifier - [#1479](https://github.com/functionalscript/functionalscript/pull/1479) -- **BREAKING CHANGES:** `fjs/types/patricia_trie`, `fjs/types/sorted_list`, - `fjs/types/range_map`, `fjs/types/range_set`, `fjs/crypto/pow`, - `fjs/types/bigfloat`, `fjs/types/prime_field`, and `fjs/crypto/secp` - migrate from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript - (`.f.mjs`) under the stage-1 TypeScript-to-mjs migration — importers - must use the `.f.mjs` specifier - [#1478](https://github.com/functionalscript/functionalscript/pull/1478) -- **BREAKING CHANGES:** `fjs/types/number` and `fjs/types/nibble_set` migrate - from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) - under the stage-1 TypeScript-to-mjs migration — importers must use the - `.f.mjs` specifier - [#1477](https://github.com/functionalscript/functionalscript/pull/1477) -- **BREAKING CHANGES:** `fjs/types/map` migrates from authored TypeScript - (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) under the stage-1 - TypeScript-to-mjs migration — importers must use the `.f.mjs` specifier - [#1476](https://github.com/functionalscript/functionalscript/pull/1476) -- **BREAKING CHANGES:** `fjs/types/btree` migrates from authored TypeScript - (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) under the stage-1 - TypeScript-to-mjs migration — importers must use the `.f.mjs` specifier - [#1475](https://github.com/functionalscript/functionalscript/pull/1475) -- **BREAKING CHANGES:** `fjs/crypto/sha2` migrates from authored TypeScript - (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) under the stage-1 - TypeScript-to-mjs migration — importers must use the `.f.mjs` specifier - [#1472](https://github.com/functionalscript/functionalscript/pull/1472) -- **BREAKING CHANGES:** `fjs/types/btree/set` and `fjs/types/btree/remove` - migrate from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript - (`.f.mjs`) under the stage-1 TypeScript-to-mjs migration — importers must use - the `.f.mjs` specifier - [#1471](https://github.com/functionalscript/functionalscript/pull/1471) -- **BREAKING CHANGES:** `fjs/types/btree/find` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) under the - stage-1 TypeScript-to-mjs migration — importers must use the `.f.mjs` - specifier; implementation-only typedefs (`FirstLeaf1`, `FirstBranch3`, - `FirstLeaf2`, `FirstBranch5`, `PathItem3`, `PathItem5`) are renamed to - their private `_`-prefixed forms - [#1470](https://github.com/functionalscript/functionalscript/pull/1470) -- **BREAKING CHANGES:** `fjs/types/btree/types` migrates from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) under the - stage-1 TypeScript-to-mjs migration — importers must use the `.f.mjs` - specifier - [#1469](https://github.com/functionalscript/functionalscript/pull/1469) -- **BREAKING CHANGES:** `fjs/text/utf16` migrates from authored TypeScript - (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) under the stage-1 - TypeScript-to-mjs migration — importers must use the `.f.mjs` specifier; - implementation-only typedefs in `fjs/bnf/data` are renamed to their private - `_`-prefixed forms to match the established convention - [#1468](https://github.com/functionalscript/functionalscript/pull/1468) -- **BREAKING CHANGES:** `fjs/types/range` and `fjs/text/code_point` migrate from - authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) under the - stage-1 TypeScript-to-mjs migration — importers must use the `.f.mjs` - specifier - [#1464](https://github.com/functionalscript/functionalscript/pull/1464) -- **BREAKING CHANGES:** `fjs/basen`, `fjs/basen/base64`, and `fjs/basen/cbase32` - migrate from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript - (`.f.mjs`) under the stage-1 TypeScript-to-mjs migration — importers must use - the `.f.mjs` specifier - [#1464](https://github.com/functionalscript/functionalscript/pull/1464) -- **BREAKING CHANGES:** the `fjs/base_n` module moves to `fjs/basen`, next to the - encodings built on it — importers must use the `fjs/basen/module.f.mjs` - specifier - [#1464](https://github.com/functionalscript/functionalscript/pull/1464) -- **BREAKING CHANGES:** `fjs/asn.1` migrates from authored TypeScript (`.f.ts`) - to JSDoc-typed JavaScript (`.f.mjs`) under the stage-1 TypeScript-to-mjs - migration — importers must use the `.f.mjs` specifier - [#1464](https://github.com/functionalscript/functionalscript/pull/1464) -- **BREAKING CHANGES:** `fjs/basen/base128` migrates from authored TypeScript - (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) under the stage-1 - TypeScript-to-mjs migration — importers must use the `.f.mjs` specifier - [#1463](https://github.com/functionalscript/functionalscript/pull/1463) -- **BREAKING CHANGES:** Implementation-only JSDoc typedefs in the migrated - `fjs/types/array` and `fjs/types/bit_vec` modules are renamed to their private - `_`-prefixed forms. Public declarations keep the same expanded types - [#1462](https://github.com/functionalscript/functionalscript/pull/1462) -- **BREAKING CHANGES:** `fjs/types/bit_vec` migrates from authored TypeScript - (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) under the stage-1 - TypeScript-to-mjs migration — importers must use the `.f.mjs` specifier - [#1460](https://github.com/functionalscript/functionalscript/pull/1460) -- **BREAKING CHANGES:** `fjs/types/list`, `fjs/types/result`, - `fjs/common/monoid`, `fjs/types/bigint`, and `fjs/types/nominal` migrate from - authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) under the - stage-1 TypeScript-to-mjs migration — importers must use the `.f.mjs` - specifier - [#1458](https://github.com/functionalscript/functionalscript/pull/1458) -- **BREAKING CHANGES:** `fjs/types/function/compare` and - `fjs/types/function/operator` migrate from authored TypeScript (`.f.ts`) to - JSDoc-typed JavaScript (`.f.mjs`) under the stage-1 TypeScript-to-mjs - migration — importers must use the `.f.mjs` specifier - [#1456](https://github.com/functionalscript/functionalscript/pull/1456) -- **BREAKING CHANGES:** `fjs/types/array`, `fjs/types/function`, - `fjs/types/nullable`, and `fjs/types/option` migrate from authored - TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) under the stage-1 - TypeScript-to-mjs migration — importers must use the `.f.mjs` specifier; - `fjs/types/array`'s fixed-arity type exports (`Array1`..`Array16`, - `Index1`..`Index16`, `Tuple2`, `Tuple3`, `isArray2`) are replaced by the - generic `Tuple`, `Index`, and `isTuple(n)` - [#1454](https://github.com/functionalscript/functionalscript/pull/1454) -- `ci`: generated workflows invoke the CLI by full command name (`fjs test`, - `functionalscript@ test`) instead of the `t` alias - [#1450](https://github.com/functionalscript/functionalscript/pull/1450) - -## 0.43.1 - -- `vnd.fjs.revision` gains optional flat subject-to-content lock maps; Evo - validates and canonicalizes their hashes, and revision JSON is serialized - canonically for stable CAS addresses [#1447](https://github.com/functionalscript/functionalscript/pull/1447) - -## 0.43.0 - -- **BREAKING CHANGES:** `fjs/types/object`: `StringMap` takes one type - argument, the open-key-set record; a finite key set is `RequiredMap` or - `OptionalMap`. `Map` is removed — it was `StringMap` - [#1442](https://github.com/functionalscript/functionalscript/pull/1442) - -## 0.42.0 - -- `fjs/media/json`: `stringSerialize` escapes in FunctionalScript instead of - calling the host's `JSON.stringify`, matching it exactly down to `\uXXXX` for - unpaired surrogates; `fjs/text/utf16` gains `codePointToString` - [#1438](https://github.com/functionalscript/functionalscript/pull/1438) -- `fjs/djs`: the parser no longer spends a call-stack frame per container — - the same lazy `drop(1)` pop that #1435 fixed in `fjs/media/json` - [#1436](https://github.com/functionalscript/functionalscript/pull/1436) -- `fjs/media/json`: `parse` no longer overflows the call stack on documents - with ~5000 or more sibling containers; the parser stack is popped eagerly - instead of through a lazy `drop(1)` chain - [#1435](https://github.com/functionalscript/functionalscript/pull/1435) -- **BREAKING CHANGES:** `fjs/media/json` no longer exports `parseNative`. Parse - JSON with the total `parse` — `unwrap(parse(text))` — and narrow the result - with an rtti schema instead of an `as` cast - [#1433](https://github.com/functionalscript/functionalscript/pull/1433) -- `nanvm-lib`: add native-JS multiplication proofs matching the Rust coercion - cases [#1429](https://github.com/functionalscript/functionalscript/pull/1429) -- **BREAKING CHANGES:** `fjs/media` `detect` takes the dialects to recognize — - `detect(dialects)(bytes)`. `dialectEntry(schema, extraValidate?)` builds an - entry, `fjs/media/revision` exports `revisionDialect`, and no dialect is - hardcoded any more - [#1428](https://github.com/functionalscript/functionalscript/pull/1428) -- **BREAKING CHANGES:** `fjs/media/json` `parse` is now the total - `(text: string) => Result` built on this module's own - tokenizer and parser; the throwing `JSON.parse` export is renamed - `parseNative` - [#1428](https://github.com/functionalscript/functionalscript/pull/1428) -- Test and coverage tooling recognizes authored `.f.mjs` FunctionalScript - modules: proof discovery loads them, and `npm run cov`, `deno task cov`, and - the generated Deno CI step include `module.f.mjs` alongside `module.f.ts` - [#1422](https://github.com/functionalscript/functionalscript/pull/1422) - -## 0.41.0 - -- `fjs/effects`: `match` resolves a command's handler with an own-property - lookup, so a `command` naming an `Object.prototype` member (`constructor`, - `toString`, …) throws instead of dispatching to the inherited function - [#1421](https://github.com/functionalscript/functionalscript/pull/1421) -- **BREAKING CHANGES:** `Evo.list` and the `evo_list` MCP tool take an optional - `archived?: true` filter and list active subjects by default — those with at - least one current head that is not archived — instead of every subject - [#1415](https://github.com/functionalscript/functionalscript/pull/1415) - -## 0.40.0 - -- **BREAKING CHANGES:** remove the Playwright integration, which ran proofs in a - Node worker rather than in a browser: no `@playwright/test` dependency, no - `playwright` CI job, engine, test context, or scenario runner - [#1414](https://github.com/functionalscript/functionalscript/pull/1414) -- **BREAKING CHANGES:** `fjs/bnf/descent`: match results are now the record - `{ ast, success, idx, failure? }` instead of a tuple. `failure` is present only - on a failed match and holds the furthest position a terminal was rejected at - plus the terminals expected there — a failed result's own index rewinds and - cannot locate an error - [#1412](https://github.com/functionalscript/functionalscript/pull/1412) -- **BREAKING CHANGES:** `@playwright/test` moves to `1.59.1` to match the pinned - Nixpkgs snapshot, which now provides the `playwright` CI job's browsers — the - job runs in a generated Nix flake instead of installing them - [#1409](https://github.com/functionalscript/functionalscript/pull/1409) -- `fjs/ci`: generate one self-contained `nix/generated//flake.nix` per - canonical Node job, pinning an exact Nixpkgs commit; `npm run ci-update` - writes them without running Nix - [#1398](https://github.com/functionalscript/functionalscript/pull/1398) -- **BREAKING CHANGES:** `range_map`'s exported `get` and `fromRange` take the - map/default-value first and the queried number/range last. Add - `fjs/types/range_set`, a boolean-valued `range_map` wrapper - [#1402](https://github.com/functionalscript/functionalscript/pull/1402) -- **BREAKING CHANGES:** decouple the FJS MCP server from CAS: generic MCP - moves `fjs/mcp/` → `fjs/protocol/mcp/`, JSON-RPC moves - `fjs/media/json/rpc/` → `fjs/protocol/json_rpc/`, and the CAS tool registry - moves `fjs/cas/mcp/` → `fjs/mcp/cas/` (with `fjs/cas/evo/mcp/` → - `fjs/mcp/evo/`); the server's new composition root lives at `fjs/mcp/` - [#1401](https://github.com/functionalscript/functionalscript/pull/1401) -- `fjs/media/nix`: add a minimal checked Nix eDSL and deterministic chunk serializer - [#1397](https://github.com/functionalscript/functionalscript/pull/1397) -- `fjs/effects/node`: **BREAKING CHANGES:** detect Deno as the new `'deno'` - `Engine` variant and make external tests on Node 22–25 use the inline - `expectFailure` compatibility strategy - [#1393](https://github.com/functionalscript/functionalscript/pull/1393) -- `package.json`: drop `npm-check-updates` from `npm run update` entirely — it - now only reinstalls/relocks; `package.json` devDependency bumps are manual - for now - [#1392](https://github.com/functionalscript/functionalscript/pull/1392) -- `package.json`: pin `@playwright/test` exactly (`=1.62.0`) and exclude it from - `npm run update`'s `npm-check-updates` pass, so the pinned test runner version - survives routine dependency updates - [#1391](https://github.com/functionalscript/functionalscript/pull/1391) - -## 0.39.0 - -- `fjs/cas/evo`: **BREAKING CHANGES:** add `revision(hash)` and the - `evo_revision` MCP tool — one revision, decoded, validated, and with hashes - canonicalized. `AddRevision` is renamed `RevisionData` and gains an optional - `generation` field, so a read value can be added back unchanged - [#1379](https://github.com/functionalscript/functionalscript/pull/1379) -- `fjs/effects`: add `mapStep` and the matching `Eff.map` — the functor map of - the effect monad, for the `step(e, x => pure(f(x)))` idiom. Neither widens the - operation set, since a pure projection issues no commands - [#1374](https://github.com/functionalscript/functionalscript/pull/1374) -- `fjs/effects`: **BREAKING CHANGES:** make `foldStep` and `forEachStep` step - variants — `foldStep(items, init, f)` / `forEachStep(items, f)`, with `items` - an `Effect>`, so the effect leads as in `step` and `historyStep` - [#1373](https://github.com/functionalscript/functionalscript/pull/1373) -- `fjs/types/list`: add `tryFold` and the `Accumulator` type, the - `try*`/`Nullable` sibling of `fold`; `bit_vec`'s early-exit fold driver moves - onto it [#1370](https://github.com/functionalscript/functionalscript/pull/1370) -- `fjs/effects`: **BREAKING CHANGES:** give `Do` named fields — - `{ command, payload, continuation }` replaces the numeric keys `0` / `1` / `2` - [#1368](https://github.com/functionalscript/functionalscript/pull/1368) -- `fjs/effects`: **BREAKING CHANGES:** remove `decode` and `Decoded`; - `typeof e === 'function'` already discriminates. Add - `runPure(e): Option` for callers that only want a pure effect's value - [#1368](https://github.com/functionalscript/functionalscript/pull/1368) -- `fjs/effects`: **BREAKING CHANGES:** replace `Frame` / `frameStep` with - `History`, `history`, and `historyStep` — a flat, newest-first tuple - instead of a nested chain, so `historyStep` composes at any depth - [#1367](https://github.com/functionalscript/functionalscript/pull/1367) -- `fjs/effects`: **BREAKING CHANGES:** remove the `lazy` constructor — `Pure`'s - thunk is a discriminator, not a suspension, so `lazy` was the identity - function. Use `pure(v)`, or a `Do` node for work deferred to a runner - [#1360](https://github.com/functionalscript/functionalscript/pull/1360) -- `fjs/effects/eff`: `Eff.step(f)` now also passes every prior value in the - chain to `f`, most recent first (`f(t, ...history)`), via a new `P` type - parameter on `Eff` that accumulates one element per `.step` call - [#1360](https://github.com/functionalscript/functionalscript/pull/1360) -- `fjs/effects`: add `frameStep` and `Frame` — `frameStep` captures the - call it makes as `{ result, param }` instead of discarding the parameter - [#1361](https://github.com/functionalscript/functionalscript/pull/1361) -- `fjs/effects`: **BREAKING CHANGE:** an `Effect` is now the raw value — a - `Pure` thunk or a `Do` node — instead of a `{ value, step }` wrapper. - Composition moves to the external `step(e, f)`; `eff(value)` is added for - method chaining - [#1354](https://github.com/functionalscript/functionalscript/pull/1354) -- `fjs/ci`: **BREAKING CHANGE:** drop the trailing `git reset --hard && git - clean -fdx` step from the generated jobs (a no-op on ephemeral runners) and - remove the `clean` helper from `fjs/ci/common/module.f.ts` - [#1353](https://github.com/functionalscript/functionalscript/pull/1353) -- `fjs/ci`: generated CI guards against stale committed generated files — the - Node 26 job runs `npm run ci-update` after `npm ci` and fails when the - committed tree no longer matches the generator's output - [#1346](https://github.com/functionalscript/functionalscript/pull/1346) - -## 0.38.0 - -- `fs/` → `fjs/`: **BREAKING CHANGE:** rename the top-level source directory, so - every published import path changes (`functionalscript/fs/…` → - `functionalscript/fjs/…`). `fs` collided with Node's built-in `fs` module - [#1316](https://github.com/functionalscript/functionalscript/pull/1316) -- `fs/media/revision`, `fs/cas/evo`: **BREAKING CHANGES:** make `snapshot` and - `generation` required in `revisionSchema`, so a revision blob is interpretable - in isolation; `addRevision` now resolves and writes both fields explicitly - [#1314](https://github.com/functionalscript/functionalscript/pull/1314) -- `fs/types/range`, `fs/bnf`: **BREAKING CHANGE:** `contains(a, b)` takes two - positional arguments instead of a `Range` tuple; `eof` becomes - `oneEncode(mask)`, and the redundant `max` constant is removed - [#1308](https://github.com/functionalscript/functionalscript/pull/1308) -- `bnf/descent`: fix `RangeError: Maximum call stack size exceeded` on - realistic-size input — the matcher is now an explicit-stack machine with - unchanged semantics and O(1) JS call-stack depth - [#1303](https://github.com/functionalscript/functionalscript/pull/1303) -- `types/uint8array`: `listToVec` now throws the descriptive - `"the array is too big"` on overflow instead of a generic `assert` failure, - matching its sibling `toVec` - [#1286](https://github.com/functionalscript/functionalscript/pull/1286) - -## 0.37.0 - -- `fs/media/revision`: add the `vnd.fjs.revision` dialect — a BLOB format for - one step in the evolution of a mutable object over the immutable CAS store. - Pure format only, wired into `fs/media`'s `detect` and `cas_get` - [#1265](https://github.com/functionalscript/functionalscript/pull/1265) -- `text/utf8`: dedup the lead-byte classifier in `utf8ByteToCodePointOp` — both - dispatch copies become one `restart(prefix)` helper. Pure refactor - [#1258](https://github.com/functionalscript/functionalscript/pull/1258) -- `fs/`: **BREAKING CHANGE:** regroup top-level directories by concern — - `base64`/`base128`/`cbase32` → `fs/basen/`, `types/monoid` → `fs/common/`, - `json`/`html` → `fs/media/`, and the `fjs` CLI moves to the package root - [#1251](https://github.com/functionalscript/functionalscript/pull/1251) -- `cas/mcp`: **BREAKING CHANGE:** align the `cas_get` response with the MCP - resource-contents shape — `mime_type` → `mimeType`, `url` → `uri`, and the - inline payload moves from `content` to `text` / `blob` - [#1248](https://github.com/functionalscript/functionalscript/pull/1248) -- `nanvm-lib`: fix `BigInt` `Sub` returning the wrong sign when both operands - share a sign and `|lhs| < |rhs|` — `Add` and `Sub` now share one - `add_signed` dispatch parameterized by the effective right-hand sign - [#1220](https://github.com/functionalscript/functionalscript/pull/1220) - -## 0.36.0 - -- `cas/mcp`: **BREAKING CHANGE:** remove `type:'url'` from `cas_add` — no - purely-TypeScript check closes every symlink/TOCTOU variant on a - client-supplied path. Large content goes through the `cas` CLI instead - [#1236](https://github.com/functionalscript/functionalscript/pull/1236) -- `fsc`: use `assertEq` instead of a hand-written `if/throw` in a proof case — - an inline `if/throw` is itself a permanently-uncovered branch. Documented as - an `AGENTS.md` testing rule - [#1234](https://github.com/functionalscript/functionalscript/pull/1234) -- `base64`: fix `encode` silently producing a string for an over-`maxLength` - vector — the explicit padding step is dropped, since `baseN`'s `vecToString` - already left-pads a trailing partial chunk - [#1229](https://github.com/functionalscript/functionalscript/pull/1229) -- `fs/effects`: add the `okStep` / `mapOk` step adapters — collapses the - hand-written "error passes through, ok continues" check that recurred at five - `Effect>` call sites - [#1228](https://github.com/functionalscript/functionalscript/pull/1228) -- `js/tokenizer`: reject unescaped control characters in string literals, as - RFC 8259 §7 requires — fixed once in the shared scanner, so `fs/json`, - `fs/djs`, and `fs/js` all match `JSON.parse` - [#1218](https://github.com/functionalscript/functionalscript/pull/1218) -- `path`: export `isProperPrefix` from `fs/path/module.f.ts` — moves the pure - segment-based containment predicate out of the virtual FS `rename` handler - [#1210](https://github.com/functionalscript/functionalscript/pull/1210) - -## 0.35.2 - -- `crypto/sha2`: fix `append`'s O(n²) block-extraction loop — rewritten as a - fold over `chunkList`, with the config-invariant partial applications hoisted. - A 320,000-byte input drops from 3444 ms to 116 ms - [#1203](https://github.com/functionalscript/functionalscript/pull/1203) - -## 0.35.1 - -- `base_n`: fix `vecToString`'s O(n²) blowup on large inputs (used by - `base64.encode` and `cbase32`) — a balanced recursive split replaces the - per-chunk `popFront`, giving true O(n log n) - [#1202](https://github.com/functionalscript/functionalscript/pull/1202) - -## 0.35.0 - -- `mcp/stdio`: bound the internal-error fallback — a caller-controlled `id` can - push even the `-32603` response past `maxLength`, so `writeResponse` retries - once more with a fixed `id: null` - [#1201](https://github.com/functionalscript/functionalscript/pull/1201) -- `cas/mcp`: `cas_add` now returns a clean `isError` result instead of crashing - the server when inline content is malformed or exceeds the 128 KiB limit - [#1198](https://github.com/functionalscript/functionalscript/pull/1198) -- `README`: update Getting Started for the full `fjs` CLI (`test`, `compile`, - `run`, `cas`, `mcp`, `ci`); add CAS and MCP Server sections - [#1198](https://github.com/functionalscript/functionalscript/pull/1198) -- `text`: add `tryUtf8`, the `Nullable`-returning sibling of `utf8` — reports - `null` instead of throwing when a string's UTF-8 encoding would exceed - `maxLength`; `utf8` is derived from it - [#1196](https://github.com/functionalscript/functionalscript/pull/1196) -- `types/bit_vec` / `base64`: enforce `maxLength` when folding a list into a - `Vec`; add `tryU8ListToVec`, plus `unwrap` / `mapUnwrap` in `types/nullable` - to derive each throwing variant from its `try*` counterpart - [#1195](https://github.com/functionalscript/functionalscript/pull/1195) -- `types/bit_vec` / `base_n`: make many-into-one bit-vector concatenation - O(n log n) — the binary-counter accumulator is extracted into a shared - `unpackListToVec`, used by `listToVec`, `u8ListToVec`, and `stringToVec` - [#1192](https://github.com/functionalscript/functionalscript/pull/1192) - -## 0.34.0 - -- `text` / `mime`: separate text-ness from well-formedness in the detector — new - `isTextCodePoint` excludes control characters, so valid-but-control blobs are - no longer mislabelled as `text/plain` - [#1183](https://github.com/functionalscript/functionalscript/pull/1183) -- **BREAKING CHANGES:** `text`: move the Unicode code-point predicates into - `fs/text/code_point/module.f.ts`; `isValidCodePoint` is no longer exported - from `fs/text/utf8/module.f.ts` - [#1182](https://github.com/functionalscript/functionalscript/pull/1182) -- `cas/mcp`: make metadata-only `cas_get` size-independent — the read stream is - folded through the new `fs/mime` `detectStream` state machine instead of being - drained into one `Vec` - [#1181](https://github.com/functionalscript/functionalscript/pull/1181) -- **BREAKING CHANGE:** `bnf`: split the backends out of `fs/bnf/data`, leaving it - as the pure serializable IR — LL(1) moves to `fs/bnf/ll1` and recursive descent - to `fs/bnf/descent` - [#1179](https://github.com/functionalscript/functionalscript/pull/1179) -- `cas`: extract `casAddFile` — streams a file through `cas.write()` and returns - the content hash; the CLI `cas add` and MCP `cas_add` both delegate to it - [#1158](https://github.com/functionalscript/functionalscript/pull/1158) -- `cas`: move the CLI command handlers into `fs/cas/cli/module.f.ts`, mirroring - `fs/cas/mcp/`; `fs/cas/module.f.ts` keeps only shared types and primitives - [#1157](https://github.com/functionalscript/functionalscript/pull/1157) -- `fs/html`: replace `escapeCharCode`'s four-arm `switch` with an `escapeTable` - lookup and a single fallback — the escape set is now data - [#1145](https://github.com/functionalscript/functionalscript/pull/1145) -- `cas`: reimplement `casUpload` on top of `fileCas.write()`, inheriting lease - GC, dedup-on-publish, and `stat` size verification; the source is deleted only - after a successful write - [#1153](https://github.com/functionalscript/functionalscript/pull/1153) -- `cas`: implement the lock-free staging upload — `fileCas.write` streams each - chunk to a leased `_stage/` file while hashing, then publishes by `rename`. - Adds the `createExclusive`, `writeBytes`, and `stat` effects - [#1149](https://github.com/functionalscript/functionalscript/pull/1149) - -## 0.33.0 - -- Remove `kvStore` - [#1143](https://github.com/functionalscript/functionalscript/pull/1143) -- `types/bigint`: drop the power-of-two `divUpE2` / `roundUpE2` helpers — - `divUp8` / `roundUp8` are now derived from `divUp(8n)` / `roundUp(8n)` - [#1131](https://github.com/functionalscript/functionalscript/pull/1131) -- `effects/node/virtual`: change the `Entity` file type from `Vec` to - `readonly Vec[]` so the virtual filesystem can store files larger than - `maxLengthBytes` as chunks - [#1130](https://github.com/functionalscript/functionalscript/pull/1130) - -## 0.32.4 - -- `cas`: add `cas upload ` — a streaming move-hash-move pipeline that - hashes in 128 KiB chunks without loading the file into memory, then renames - the staged file to its sharded CAS location - [#1127](https://github.com/functionalscript/functionalscript/pull/1127) - -## 0.32.3 - -- `cas/mcp`: temporary fix for large files — `cas_get` no longer crashes on - files larger than `readFile`'s size limit - [#1124](https://github.com/functionalscript/functionalscript/pull/1124) -- `fs/cas/mcp`: clearer setup instructions for Claude CLI and Codex in the - README [#1123](https://github.com/functionalscript/functionalscript/pull/1123) - -## 0.32.2 - -- `cas/mcp`: restrict `cas_add` with `type: 'url'` to paths under - `~/cas_upload/`, rejecting `..` — MCP clients can no longer exfiltrate - arbitrary files - [#1122](https://github.com/functionalscript/functionalscript/pull/1122) - -## 0.32.1 - -- `effects/node`: limit `ReadFile` to Bun's `bigint` size constraint - (131,072 bytes) for cross-runtime compatibility; add `maxLength` and - `maxLengthBytes` constants - [#1121](https://github.com/functionalscript/functionalscript/pull/1121) -- `mcp`: extract the declarative tool-registry pattern into reusable builders - (`ToolEntry`, `toolEntry`, `fromRegistry`, `errorResult`), removing ~100 lines - of dispatch boilerplate per MCP server - [#1119](https://github.com/functionalscript/functionalscript/pull/1119) -- `cas/mcp`: refactor tool definitions from a hardcoded array plus `switch` to a - data-driven registry, so adding a tool is additive - [#1118](https://github.com/functionalscript/functionalscript/pull/1118) - -## 0.32.0 - -- **BREAKING CHANGE:** the MCP server as a top-level CLI command - [#1115](https://github.com/functionalscript/functionalscript/pull/1115) - -## 0.31.1 - -- `effects/node`: normalize the home directory path on Windows using `toPosix`, - so `home` always uses forward slashes - [#1108](https://github.com/functionalscript/functionalscript/pull/1108) - -## 0.31.0 - -- `cas/mcp`: unify `cas_add`/`cas_add_url` and `cas_get`/`cas_get_meta` into - three tools — `cas_add` gains `type:'url'`, `cas_get` gains `content?: - boolean` and always returns metadata - [#1106](https://github.com/functionalscript/functionalscript/pull/1106) -- `cas/mcp`: add `cas_add_url` and `cas_get_meta` to avoid token-heavy binary - transfers; `casMcpHandlers` accepts an optional `toUrl` resolver - [#1102](https://github.com/functionalscript/functionalscript/pull/1102) -- `cas/mcp`: smart text/binary encoding — `cas_add` accepts an optional `type` - (`'text'` default or `'base64'`); `cas_get` returns - `{ content, type, mime_type }` after two-phase MIME detection - [#1104](https://github.com/functionalscript/functionalscript/pull/1104) -- `base_n`: extract a shared `Vec ↔ string` bit-codec factory, - `baseN(bits, alphabet, normalize?)`, and rewrite `base64` and `cbase32` - through it while each keeps its own padding - [#1097](https://github.com/functionalscript/functionalscript/pull/1097) -- `cli`: `Command.handler` now also accepts a nested `Commands` array, and - `dispatch` recurses into it — subcommand groups such as `fjs cas mcp` need no - custom dispatch - [#1093](https://github.com/functionalscript/functionalscript/pull/1093) -- `cas/mcp`: switch content encoding to standard RFC 4648 base64; hashes stay - cBase32 for canonical identity - [#1081](https://github.com/functionalscript/functionalscript/pull/1081) -- `json`: `stringify` now skips object properties with `undefined` values, - matching `JSON.stringify` - [#1080](https://github.com/functionalscript/functionalscript/pull/1080) -- `base64`: add `fs/base64/module.f.ts` with RFC 4648 `encode` / `decode` for - byte-aligned `Vec` values, returning `null` on malformed input - [#1079](https://github.com/functionalscript/functionalscript/pull/1079) -- `mcp`: add a stdio transport for JSON-RPC / MCP servers — `stdioTransport` - drives the read→parse→dispatch→write loop as a recursive effect over a new - byte-level `read` effect - [#1072](https://github.com/functionalscript/functionalscript/pull/1072) -- `json/parser`: reject trailing commas, matching strict `JSON.parse` (it - previously accepted `[1,]` and `{"a":1,}`) - [#1072](https://github.com/functionalscript/functionalscript/pull/1072) -- `html`: replace the four raw hex code points in `escapeCharCode` with the - named constants from `fs/text/ascii`. Pure refactor - [#1064](https://github.com/functionalscript/functionalscript/pull/1064) -- `djs/serializer`: hoist the "value is referenced more than once" predicate into - a single module-scope `sharedRef(refs)(v)` helper. Pure refactor - [#1057](https://github.com/functionalscript/functionalscript/pull/1057) -- `types/object`: introduce `StringMap` — one conditional type covering - both infinite and finite key sets — plus `definedEntries`; applied across 17 - sites in 11 files - [#1055](https://github.com/functionalscript/functionalscript/pull/1055) -- `effects/node`: add `readUtf8File` / `writeUtf8File` next to the - `readFile` / `writeFile` effects, and migrate the open-coded UTF-8 sandwiches - in `djs/transpiler`, `djs`, and `ci` - [#1052](https://github.com/functionalscript/functionalscript/pull/1052) -- `effects/node`: drop the private `Io` indirection from the node effect runner - — the handler table is inlined into a module-level `asyncRun`. Pure refactor - [#1051](https://github.com/functionalscript/functionalscript/pull/1051) -- `fjs`: add a `proof.f.ts` covering the CLI command handlers via the virtual - Node-effect interpreter - [#1047](https://github.com/functionalscript/functionalscript/pull/1047) -- `effects/node/virtual`: add proofs for the `await` handler, the `fetch` - not-found branch, and the `import_` invalid-path branch - [#1046](https://github.com/functionalscript/functionalscript/pull/1046) -- `asn.1`: extract a private generic `decodeAll(step)` and rewrite - `decodeObjectIdentifier` and `decodeSequence` through it. Pure refactor - [#1041](https://github.com/functionalscript/functionalscript/pull/1041) -- `types/bigfloat`: factor the abs/sign/`multiply` envelope of `round53` and - `decToBin` into a private `withSign` combinator. Pure refactor - [#1022](https://github.com/functionalscript/functionalscript/pull/1022) -- `types/bigfloat`: collapse the `increaseMantissa` / `decreaseMantissa` mirror - into a single `normalizeMantissa` factory. Pure refactor - [#1021](https://github.com/functionalscript/functionalscript/pull/1021) -- `text/utf8`: define the UTF-8 tag/payload-mask constants and the - `contByte` / `contPayload` helpers once at module scope. Pure refactor - [#1020](https://github.com/functionalscript/functionalscript/pull/1020) -- `types/bigint`: export `divUp8` / `roundUp8` (bits → bytes, rounding up) and - reuse them in `crypto/sign` and `asn.1` - [#1018](https://github.com/functionalscript/functionalscript/pull/1018) -- `types/sorted_list`: export `intersect` and `dropTail`; `types/sorted_set` - delegates `intersect` to them, mirroring `union` - [#1017](https://github.com/functionalscript/functionalscript/pull/1017) -- `cas`: drop the private 2-char `split` helper and reuse `splitAt(2)` from - `fs/types/string` for the shard path - [#1014](https://github.com/functionalscript/functionalscript/pull/1014) -- `types/bigint`: add shift-based `divUpE2(e)` / `roundUpE2(e)`, retype - `divUp` / `roundUp`, and migrate `asn.1` and `crypto/sign` onto them - [#1012](https://github.com/functionalscript/functionalscript/pull/1012) -- `effects/memory`: add typed `create` / `read` / `write` memory operations, a - `Map`-backed Node interpreter, and virtual-memory composition - [#1008](https://github.com/functionalscript/functionalscript/pull/1008) -- `json/rpc`: add JSON-RPC spec links to the JSDoc and destructure the - `decodeRequest` result in `dispatch` - [#1002](https://github.com/functionalscript/functionalscript/pull/1002) - -## 0.30.0 - -- `ci`: **BREAKING CHANGE:** split generated workflows into lightweight platform - jobs and canonical Ubuntu ARM jobs, set read-only workflow permissions, and - expand Rust checks to release tests and release Clippy - [#997](https://github.com/functionalscript/functionalscript/pull/997) - -## 0.29.1 - -- `package`: relax the npm `engines.node` requirement from `>=24` to `>=22` - [#987](https://github.com/functionalscript/functionalscript/pull/987) -- `types/prime_field`: make `quadRes(0n)` return `true`, compute Euler's - exponent from `p - 1`, and document the `p === 2n` behavior - [#986](https://github.com/functionalscript/functionalscript/pull/986) - -## 0.29.0 - -- add `bun.lock` and `deno.lock` to source control and pin exact devDependency - versions, so CI installs are reproducible via `--frozen` - [#985](https://github.com/functionalscript/functionalscript/pull/985) - -## 0.28.0 - -- abandon JSR publishing: remove `deno.json`, `fs/dev/index/`, `fs/dev/version/`, - the `index` script, and every `deno publish` step - [#984](https://github.com/functionalscript/functionalscript/pull/984) - -## 0.26.0 - -- `fjs`: add `fjs ci` / `fjs i` as first-class commands for the standard CI - workflow generator - [#975](https://github.com/functionalscript/functionalscript/pull/975) -- `cli`: change `Command.handler` to take `NodeProgramOptions` instead of - `readonly string[]`; `dispatch` forwards the full options with `args` trimmed - [#973](https://github.com/functionalscript/functionalscript/pull/973) -- `fjs`: `fjs r` now looks up `main` instead of `default` on the imported module - [#972](https://github.com/functionalscript/functionalscript/pull/972) -- `cli`: add `fs/cli/module.f.ts` — `Command` / `Commands` types and a `dispatch` - function with auto-generated help; replaces the `switch`-based dispatch in - `fjs` and `cas` - [#971](https://github.com/functionalscript/functionalscript/pull/971) - -## 0.25.0 - -- `ci`: auto-detect Rust by checking for `Cargo.toml` at the repo root, removing - the manual `rust: boolean` flag from `Setup` - [#969](https://github.com/functionalscript/functionalscript/pull/969) -- `ci`: split `npm test` into explicit steps (`npx tsc`, `npm test`, - `node --test`, `npm run cov`); add the `cov` script and remove `fst` - [#969](https://github.com/functionalscript/functionalscript/pull/969) -- `bnf`: hoist the `commaJoin0Plus` delimited-list combinator into - `fs/bnf/module.f.ts` and collapse three byte-identical local copies onto it - [#964](https://github.com/functionalscript/functionalscript/pull/964) -- `types/rtti/ts`: add `README.md` documenting the TS2589 depth-overflow problem - for recursive `Ts`, the `any` fast-path and `WithOut` solutions, and the - three remaining `as any` casts - [#961](https://github.com/functionalscript/functionalscript/pull/961) -- `types/rtti/ts`: use a unique symbol key for `WithOut`'s phantom field instead - of the string `$out`, so `WithOut` is valid for any `Out` - [#960](https://github.com/functionalscript/functionalscript/pull/960) -- `types/rtti/ts`: add the `WithOut` phantom type and `$out` branch to - `Ts` — a pre-computed output type short-circuits the schema walk, fixing - TS2589 for recursive struct schemas - [#959](https://github.com/functionalscript/functionalscript/pull/959) -- `json/schema`: redesign the `unknown` rtti schema using `WithOut`, splitting it - into `unknownConst` and `unknownThunk` so `Ts` is the single - source of truth - [#959](https://github.com/functionalscript/functionalscript/pull/959) -- `types/rtti`: remove unnecessary `as any` from all `verror` / `prependPath` - returns in `validate`, `parse`, and `common`; document the root cause of the - remaining casts - [#959](https://github.com/functionalscript/functionalscript/pull/959) -- `json/schema`: add `toJsonSchema(rtti)` — converts any rtti `Type` to a JSON - Schema draft 2020-12 object - [#957](https://github.com/functionalscript/functionalscript/pull/957) -- `crypto/sha2`: collapse `bigSigma` / `smallSigma` into one `sigma(third)` - factory parameterised by the third XOR operand. No API change - [#954](https://github.com/functionalscript/functionalscript/pull/954) -- `json/rpc`: add a pure JSON-RPC 2.0 layer — rtti schemas for the envelopes, a - `decodeRequest` decoder, and a pure `dispatch(handlers)(value)` - [#950](https://github.com/functionalscript/functionalscript/pull/950) -- `json`: add rtti schemas (`primitive`, `unknown`, `object`, `array`) and derive - `Primitive` and `Unknown` from them via `Ts<>` - [#950](https://github.com/functionalscript/functionalscript/pull/950) -- `types/rtti`: decouple rtti from djs — `Primitive`, `Unknown`, `Array`, and - `Object` are now defined locally - [#950](https://github.com/functionalscript/functionalscript/pull/950) -- `types/rtti/ts`: `Ts` fast-path — `unknown extends T ? Unknown` - short-circuits when `T` is `any`, preventing TS2589 distribution - [#950](https://github.com/functionalscript/functionalscript/pull/950) -- `crypto/vdf`: add a Sloth verifiable delay function over a fixed 3072-bit safe - prime; extends `types/prime_field` with `reduce` / `quadRes` and a standalone - `modSqrt` helper - [#937](https://github.com/functionalscript/functionalscript/pull/937) - -## 0.24.0 - -- **breaking** `effects`: hoist `fs/types/effects` → `fs/effects` and fold - `fs/io` into `fs/effects/node/module.ts`; callers use the runner's `run(p)` / - `runEffect(p)` entry points - [#943](https://github.com/functionalscript/functionalscript/pull/943) -- **breaking** `emergent_testing`: remove `fs/emergent_testing/module.ts`; the - external-runner entry is now the self-contained - `fs/emergent_testing/all.test.ts` - [#943](https://github.com/functionalscript/functionalscript/pull/943) - -## 0.23.0 - -- **breaking** `io`: encapsulate `io` behind the entry points — `effectRun` is - renamed to `run`, and the new `runEffect(p)` resolves the exit code without - calling `process.exit` - [#942](https://github.com/functionalscript/functionalscript/pull/942) -- **breaking** `function/compare`: add generic `min` / `max` next to `cmp` and - retire the duplicated pairs in `function/operator` and `types/bigint` - [#940](https://github.com/functionalscript/functionalscript/pull/940) - -## 0.22.0 - -- **breaking** `emergent_testing`: rename `fs/emergent-testing` → - `fs/emergent_testing`, matching the snake_case module-naming convention - [#924](https://github.com/functionalscript/functionalscript/pull/924) -- `asserts`: add the missing `./fs/asserts/module.f.ts` entry to `deno.json` - exports [#924](https://github.com/functionalscript/functionalscript/pull/924) - -## 0.21.0 - -- **breaking** `tf`: rename `fs/dev/tf` → `fs/emergent-testing`; the public - exports and the external-runner entry import change accordingly - [#923](https://github.com/functionalscript/functionalscript/pull/923) -- `asserts`: extract `assert`, `assertEq`, `todo`, and `Assert` from - `fs/dev/module.f.ts` into a standalone `fs/asserts/module.f.ts` - [#923](https://github.com/functionalscript/functionalscript/pull/923) -- `types/nullable`: add `fromUndefined(v)` — names the JS-host ↔ - FunctionalScript `undefined`→`null` boundary in one helper - [#919](https://github.com/functionalscript/functionalscript/pull/919) -- `effects/node`: add `errorExit(s)` — the canonical "write an error line to - stderr, yield exit code 1" `NodeOp` program; replaces seven inline copies - [#917](https://github.com/functionalscript/functionalscript/pull/917) - -## 0.20.0 - -- `tf`: widen the load gate to all `.f.ts`/`.f.js` plus vanilla - `proof.{ts,js,mts,mjs}`; `v.proof !== undefined` is the sole gate, enabling - co-located white-box proofs - [#893](https://github.com/functionalscript/functionalscript/pull/893) -- `tf`: discover proofs by an exported `proof` property instead of - `Module.default`; convert all 81 proof files - [#889](https://github.com/functionalscript/functionalscript/pull/889) -- `text`: extract the shared streaming code-point decoder skeleton and the - `errorMask` constant from `utf8`/`utf16` into a new `fs/text/code_point` - [#860](https://github.com/functionalscript/functionalscript/pull/860) -- DJS serializer: factor out `buildSerialize(refLookup)` so both serializers - share the value→string core, and remove the in-place mutation from `addRef` - and the ref-counter flag - [#832](https://github.com/functionalscript/functionalscript/pull/832) -- `effects`: add the `foldStep` / `forEachStep` combinators — sequential - state-threading and void-accumulator siblings of `all` - [#885](https://github.com/functionalscript/functionalscript/pull/885) -- `tf`: rename all `test.f.ts` / `test.f.js` → `proof.f.ts` / `proof.f.js` - (80 files) [#883](https://github.com/functionalscript/functionalscript/pull/883) -- `tf`: fix `sandbox` timing accuracy — `p instanceof Promise ? await p : p` - instead of the `awaitPromise` boxing handler, so spurious microtasks no longer - inflate durations - [#883](https://github.com/functionalscript/functionalscript/pull/883) -- `tf`: async test function support — `registerModule` and `sandbox` now await - async test functions; adds the `Await` effect type and `awaitPromise` - [#882](https://github.com/functionalscript/functionalscript/pull/882) -- `io`: `effectRun` now calls `process.exit` internally, fixing `fjs t` always - exiting 0 regardless of test failures - [#882](https://github.com/functionalscript/functionalscript/pull/882) -- `tf`: move `isTest` to `dev/module.f.ts`, consolidating the predicate used by - both `loadFile` and `runModuleMap` - [#882](https://github.com/functionalscript/functionalscript/pull/882) -- `tf`: prefix scenario temporary files with `_` so git ignores them, and add - `fjs` as a scenario runner alongside node/bun/deno/playwright - [#882](https://github.com/functionalscript/functionalscript/pull/882) -- `io`: extract the `wrapInlineTest(register)` factory shared by - `bunTestContext` and `playwrightTestContext`. Behaviour-preserving - [#880](https://github.com/functionalscript/functionalscript/pull/880) - -## 0.19.0 - -- `tf`: drop Node 22 — remove `--experimental-strip-types`, bump - `engines.node` to `>=24`, add `.node-version`, remove the `node22` CI job - [#872](https://github.com/functionalscript/functionalscript/pull/872) -- `tf`: restore the Playwright bridge as `playwrightTestContext`, detected via - the `PLAYWRIGHT_TEST` environment variable - [#872](https://github.com/functionalscript/functionalscript/pull/872) -- `tf`: add the `Engine` type, `bunTestContext`, `inlineTest`, and - `inlineContext` — fixes Bun's `ERR_NOT_IMPLEMENTED` on nested `t.test()` - [#872](https://github.com/functionalscript/functionalscript/pull/872) -- `tf`: add scenario tests in `fs/dev/tf/scenarios/` with a `run.sh` covering - node/bun/deno/playwright - [#872](https://github.com/functionalscript/functionalscript/pull/872) -- `tf`: add `registerModule`, `registerModuleMap`, and `register` — a pure - Effects layer for registering tests with external frameworks - [#872](https://github.com/functionalscript/functionalscript/pull/872) -- `bit_vec`: make list concatenation a `BitOrder` member (`order.listToVec`) and - drop the free `listToVec` factory - [#865](https://github.com/functionalscript/functionalscript/pull/865) - -## 0.18.0 - -- `rtti`: `parse` now mirrors `validate`'s container factories, and the shared - container guards and types move into the `common` kernel - [#853](https://github.com/functionalscript/functionalscript/pull/853) -- `tf`: add the `fmtImport` output format (`import("./f.ts").path()`), `null` - call markers in paths, `file` on `Reporter.pass`, and relative module keys - [#851](https://github.com/functionalscript/functionalscript/pull/851) -- `tf`: `Reporter.test` owns execution; `parseTestSet` is uncurried and - `defaultTest` exported; `Sandbox` drops out of the `runModuleMap` constraints - [#844](https://github.com/functionalscript/functionalscript/pull/844) -- `types`: extract the shared `bsearch` helper used by `sorted_list.find` and - `range_map.get`, and move the curried `Cmp` alias to `function/compare` - [#845](https://github.com/functionalscript/functionalscript/pull/845) -- `tf`: export `runModuleMap` and add the experimental `run2` in `module.ts` - [#843](https://github.com/functionalscript/functionalscript/pull/843) -- `tf`: extract `runModule` / `runModuleMap`, flatten the `walk` signature, and - filter before reduce - [#842](https://github.com/functionalscript/functionalscript/pull/842) -- `tf`: virtual tests via `JsModule` plus a pass-through `sandbox`; `Reporter` - and `Program` become generic - [#840](https://github.com/functionalscript/functionalscript/pull/840) -- Effects: Node: Virtual: new file type — `JsModule` - [#834](https://github.com/functionalscript/functionalscript/pull/834) -- `tf`: extract the `Reporter` interface; `test` takes a `Reporter` and returns a - `NodeProgram`, moving the `isGitHub` branching out of the walker - [#831](https://github.com/functionalscript/functionalscript/pull/831) -- `fjs`: convert `main` to `NodeProgram`, dispatching sub-commands by returning - Effects directly and dropping the `Io` dependency - [#830](https://github.com/functionalscript/functionalscript/pull/830) -- `tf`: convert `main` to `NodeProgram` — replaces the `Io` dependency with - `loadModuleMap2`, the `sandbox` effect, and `csiWrite` - [#828](https://github.com/functionalscript/functionalscript/pull/828) -- `tf`: eliminate the double `sandbox` call for throw-tests; `parseTestSet` - returns `TestEntry = { fn, throws }`. Adds the no-type-predicate rule to - `AGENTS.md` [#827](https://github.com/functionalscript/functionalscript/pull/827) -- `uint8array`: mark the module deprecated — use `utf8` / `utf8ToString` from - `fs/text` and `bit_vec` directly - [#823](https://github.com/functionalscript/functionalscript/pull/823) -- `tf`: remove the unused `anyLog` helper - [#823](https://github.com/functionalscript/functionalscript/pull/823) -- Effects: retire the `Log` / `Error` / `Console` operation types; `log` and - `error` are now helpers built on `write` - [#822](https://github.com/functionalscript/functionalscript/pull/822) -- Effects: add the `Write` effect (`write(stream, data)`) and `WriteConsoles` to - `NodeOp`; add `std` to `NodeProgramOptions` and `csiWrite` to `fs/text/sgr` - [#816](https://github.com/functionalscript/functionalscript/pull/816) -- IO: add `write(stream, data)` to `Io` with backpressure via `stream.write()` - plus `once(stream, 'drain')` - [#821](https://github.com/functionalscript/functionalscript/pull/821) - -## 0.17.0 - -- Effects: replace `NodeProgram`'s two positional parameters with - `NodeProgramOptions` — `{ args, env }` - [#814](https://github.com/functionalscript/functionalscript/pull/814) -- `tf`: remove the `Input` intermediary type; `test` takes `Io` directly - [#813](https://github.com/functionalscript/functionalscript/pull/813) -- `fjs`: convert the `run`/`r` command from `asyncImport`/`await` to the - `import_` effect - [#812](https://github.com/functionalscript/functionalscript/pull/812) -- DJS transpiler: replace `Fs`/`readFileSync` with the `ReadFile` effect; tests - use the virtual effect runner and `fs/io/virtual` is deleted - [#811](https://github.com/functionalscript/functionalscript/pull/811) -- IO: expose `sandbox` on the `Io` interface; the test framework replaces - `measure` + `tryCatch` with it, eliminating state threading - [#809](https://github.com/functionalscript/functionalscript/pull/809) -- Effects: add the `sandbox` operation — runs a sync function with try/catch and - `performance.now()` timing in one atomic operation - [#808](https://github.com/functionalscript/functionalscript/pull/808) -- Docs: add the required JSDoc `@module` header to every `module.f.ts` that was - missing one [#804](https://github.com/functionalscript/functionalscript/pull/804) - -## 0.16.1 - -- Effects: add the `now` operation returning epoch nanoseconds as `bigint`; the - virtual runner exposes `epochNs` for deterministic tests - [#803](https://github.com/functionalscript/functionalscript/pull/803) - -## 0.16.0 - -- RTTI `Ts<>`: optional field inference; CI derives `Step` / `Job` / - `GitHubAction` from RTTI schemas - [#798](https://github.com/functionalscript/functionalscript/pull/798) -- RTTI: extract the shared kernel (error shape, primitive checks, `match` - recognizer) from `validate`/`parse` into a new `rtti/common` module - [#797](https://github.com/functionalscript/functionalscript/pull/797) -- NodeProgram: move `Env` to `fs/types/effects/node` and add it as the second - parameter [#795](https://github.com/functionalscript/functionalscript/pull/795) - -## 0.15.0 - -- Effects: unify `do_`/`doRest` and `Func`/`RestFunc` into a single - rest-parameter form; operation payload types are now uniformly tuples - [#794](https://github.com/functionalscript/functionalscript/pull/794) -- Test framework: parse non-default exports, so a test file can spread its tests - across multiple named exports - [#790](https://github.com/functionalscript/functionalscript/pull/790) - -## 0.14.1 - -- CI: add a `ci(rust: boolean)` function to conditionally include Rust steps - [#780](https://github.com/functionalscript/functionalscript/pull/780) -- RTTI: fix `NaN` handling in const validation by using `Object.is` instead of - `===` [#777](https://github.com/functionalscript/functionalscript/pull/777) - -## 0.14.0 - -- Restructure [#773](https://github.com/functionalscript/functionalscript/pull/773) -- Test framework: detect pass-on-throw tests by the enclosing `throw` key, - supporting function references and grouped tests - [#769](https://github.com/functionalscript/functionalscript/pull/769) -- CI: centralize tool versions, split into per-tool modules, add a Playwright - browser cache [#764](https://github.com/functionalscript/functionalscript/pull/764) -- Refactor `StateScan` to swap the input and state parameter order - [#763](https://github.com/functionalscript/functionalscript/pull/763) -- SUL: first three levels. BitVec: chunking functions - [#757](https://github.com/functionalscript/functionalscript/pull/757) -- RTTI: parse (deserializer) - [#760](https://github.com/functionalscript/functionalscript/pull/760) - -## 0.13.0 - -- RTTI: `print(mut?: true)` - [#754](https://github.com/functionalscript/functionalscript/pull/754) - -## 0.12.9 - -- RTTI: TS: generating simple TypeScript definitions from RTTI - [#751](https://github.com/functionalscript/functionalscript/pull/751) -- Io: improve `exec` - [#752](https://github.com/functionalscript/functionalscript/pull/752) - -## 0.12.8 - -- Effects: exec: stdin - [#750](https://github.com/functionalscript/functionalscript/pull/750) - -## 0.12.7 - -- bitVec: `chunkList()` - [#749](https://github.com/functionalscript/functionalscript/pull/749) - -## 0.12.6 - -- Effects: Exec [#748](https://github.com/functionalscript/functionalscript/pull/748) - -## 0.12.5 - -- Effects: Rm [#747](https://github.com/functionalscript/functionalscript/pull/747) - -## 0.12.2 - -- RTTI: Or [#737](https://github.com/functionalscript/functionalscript/pull/737) - -## 0.12.1 - -- RTTI: type simplification for TypeScript - [#736](https://github.com/functionalscript/functionalscript/pull/736) - -## 0.12.0 - -- RTTI: new design - [#734](https://github.com/functionalscript/functionalscript/pull/734) - -## 0.11.11 - -- RTTI: the first version - [#733](https://github.com/functionalscript/functionalscript/pull/733) - -## 0.11.10 - -- BitVec: improve `u8ListToVec` - [#732](https://github.com/functionalscript/functionalscript/pull/732) - -## 0.11.9 - -- BitVec: another significant performance improvement for `u8List` - [#731](https://github.com/functionalscript/functionalscript/pull/731) -- BitVec: `BitOrder.cmp` - [#729](https://github.com/functionalscript/functionalscript/pull/729) - -## 0.11.8 - -- BitVec: improve performance of `u8List` - [#728](https://github.com/functionalscript/functionalscript/pull/728) - -## 0.11.7 - -- BitVec: improve performance of `u8ListToVec` - [#727](https://github.com/functionalscript/functionalscript/pull/727) - -## 0.11.6 - -- Effects: HTTP: `createServer`: a universal request listener - [#726](https://github.com/functionalscript/functionalscript/pull/726) - -## 0.11.5 - -- Effects: the `forever` command - [#725](https://github.com/functionalscript/functionalscript/pull/725) - -## 0.11.4 - -- Effects: `createServer`: `IncomingMessage` and `ServerResponse` - [#724](https://github.com/functionalscript/functionalscript/pull/724) - -## 0.11.3 - -- Effects: HTTPS: `listen` - [#722](https://github.com/functionalscript/functionalscript/pull/722) - -## 0.11.2 - -- Effects: HTTPS: `createServer` and `listen` - [#716](https://github.com/functionalscript/functionalscript/pull/716) - -## 0.11.1 - -- Effects: the `both` function - [#710](https://github.com/functionalscript/functionalscript/pull/710) - -## 0.11.0 - -- Effects: refactoring: fluent native, operation set - [#708](https://github.com/functionalscript/functionalscript/pull/708) -- Effects: bug: `all` should return `Effect<..., readonly T[]>` - [#707](https://github.com/functionalscript/functionalscript/pull/707) -- Effects: generic `all` - [#704](https://github.com/functionalscript/functionalscript/pull/704) - -## 0.10.3 - -- Effects: no more `map`s - [#699](https://github.com/functionalscript/functionalscript/pull/699) - -## 0.10.2 - -- Effects: a new simplified `Effect` type, plus a `fluent` object for fluent - programming [#698](https://github.com/functionalscript/functionalscript/pull/698) - -## 0.10.1 - -- FJS: running Node programs - [#696](https://github.com/functionalscript/functionalscript/pull/696) - -## 0.10.0 - -- IO: effects by default - [#695](https://github.com/functionalscript/functionalscript/pull/695) -- CI: cache for Playwright - [#691](https://github.com/functionalscript/functionalscript/pull/691) -- Add module-level JSDoc headers across many modules - [#690](https://github.com/functionalscript/functionalscript/pull/690) - -## 0.9.3 - -- Base128: bug fix - [#688](https://github.com/functionalscript/functionalscript/pull/688) -- Effect: `fetch` [#684](https://github.com/functionalscript/functionalscript/pull/684) -- ASN.1: unsupported tags. New module: Base128 - [#682](https://github.com/functionalscript/functionalscript/pull/682) -- ASN.1: integer, boolean, sequence, set - [#679](https://github.com/functionalscript/functionalscript/pull/679) -- ASN.1: basic encoding/decoding - [#678](https://github.com/functionalscript/functionalscript/pull/678) - -## 0.9.2 - -- Effect: Node: add `Dirent` to the `readdir` result - [#676](https://github.com/functionalscript/functionalscript/pull/676) -- Effect: move `IO` related functions to `./io` - [#675](https://github.com/functionalscript/functionalscript/pull/675) -- Effect: remove one type parameter from operations - [#674](https://github.com/functionalscript/functionalscript/pull/674) -- CAS: read/write/list implementation - [#673](https://github.com/functionalscript/functionalscript/pull/673) -- Effect: `readdir` without the recursive flag - [#671](https://github.com/functionalscript/functionalscript/pull/671) -- Connect IO and Effect - [#670](https://github.com/functionalscript/functionalscript/pull/670) -- Effect: generating the website using Effects - [#666](https://github.com/functionalscript/functionalscript/pull/666) -- Effect: Node: stderr - [#665](https://github.com/functionalscript/functionalscript/pull/665) -- Effect: `flatMap` => `pipe` - [#664](https://github.com/functionalscript/functionalscript/pull/664) -- Effect: Node: `readdir` - [#663](https://github.com/functionalscript/functionalscript/pull/663) -- Effect: Mock [#658](https://github.com/functionalscript/functionalscript/pull/658) -- Effect: `map` and `flatMap` - [#657](https://github.com/functionalscript/functionalscript/pull/657) -- Effect: bind [#656](https://github.com/functionalscript/functionalscript/pull/656) -- Effect: `do_` and other helpers - [#654](https://github.com/functionalscript/functionalscript/pull/654) - -## 0.9.0 - -- Replace legacy `fsc`/`fst` usage with the `fjs` CLI - [#619](https://github.com/functionalscript/functionalscript/pull/619) -- Add the `fjs` CLI - [#618](https://github.com/functionalscript/functionalscript/pull/618) -- Move the prime field module from `crypto/` to `types/` - [#602](https://github.com/functionalscript/functionalscript/pull/602) -- Digital signatures - [#599](https://github.com/functionalscript/functionalscript/pull/599) - -## 0.8.1 - -- 64-bit SHA2 padding is fixed - [#595](https://github.com/functionalscript/functionalscript/pull/595) -- A compact version of Bit Vector - [#575](https://github.com/functionalscript/functionalscript/pull/575) -- Running tests in browsers - [#572](https://github.com/functionalscript/functionalscript/pull/572) -- Generating a GitHub CI file - [#569](https://github.com/functionalscript/functionalscript/pull/569) -- New `Nominal` type that prohibits `<` operations in TypeScript - [#567](https://github.com/functionalscript/functionalscript/pull/567) - -## 0.8.0 - -- Switch to the MIT License - [#557](https://github.com/functionalscript/functionalscript/pull/557), - [#559](https://github.com/functionalscript/functionalscript/pull/559) - -## 0.7.0 - -- New automatic test runner for `Node.js`, `Deno`, and `Bun` - [#518](https://github.com/functionalscript/functionalscript/pull/518) - -## 0.6.11 - -- Support for Deno Test and Coverage - -## 0.6.10 - -- Trailing comma and identifier properties - [#484](https://github.com/functionalscript/functionalscript/pull/484) -- Property names as identifiers - [#466](https://github.com/functionalscript/functionalscript/pull/466) -- Add the file name and symbol position to parser and transpiler errors - [#493](https://github.com/functionalscript/functionalscript/pull/493) - -## 0.6.9 - -- Import, const, comments, `undefined`, and `bigint` - -## 0.6.8 - -- `fsc` can serialize as tree - [#442](https://github.com/functionalscript/functionalscript/pull/442) - -## 0.6.7 - -- `fsc` can parse json - [#434](https://github.com/functionalscript/functionalscript/pull/434) - -## 0.6.2 - -- Tests can run from a directory - [#425](https://github.com/functionalscript/functionalscript/pull/425) - -## 0.6.0 - -- The FunctionalScript JSR package includes `module.ts` files - [#423](https://github.com/functionalscript/functionalscript/pull/423) -- Dropped support for Node 16, Node 18 and Deno 1 - -## 0.5.0 - -- `fsc` added as an executable into the npm package - [#396](https://github.com/functionalscript/functionalscript/pull/396) - -## 0.4.3 - -- Implementation of HMAC - [#371](https://github.com/functionalscript/functionalscript/pull/371) - -## 0.4.2 - -- Faster `types/big_int/log2` algorithm for WebKit (Bun and Safari) - [#368](https://github.com/functionalscript/functionalscript/pull/368) - -## 0.4.1 - -- Faster `types/big_int/log2` algorithm - [#365](https://github.com/functionalscript/functionalscript/pull/365) - -## 0.4.0 - -- COM and CommonJS modules are retired - [#367](https://github.com/functionalscript/functionalscript/pull/367) - -## 0.3.13 - -- First LL(1) parser - [#356](https://github.com/functionalscript/functionalscript/pull/356) - -## 0.3.12 - -- BNF types and the `RangeMapOp` interface - [#355](https://github.com/functionalscript/functionalscript/pull/355) - -## 0.3.9 - -- Improved `types/bigint/log2` algorithm - [#346](https://github.com/functionalscript/functionalscript/pull/346) - -## 0.3.8 - -- SHA2 that works on bit vectors - [#345](https://github.com/functionalscript/functionalscript/pull/345) - -## 0.3.7 - -- Monoid [#343](https://github.com/functionalscript/functionalscript/pull/343) - -## 0.3.6 - -- Export `html.Node` - [#342](https://github.com/functionalscript/functionalscript/pull/342) - -## 0.3.5 - -- Fix for Node <= v20 - [#341](https://github.com/functionalscript/functionalscript/pull/341) -- A main module - [#340](https://github.com/functionalscript/functionalscript/pull/340) - -## 0.3.0 - -- Switching to TypeScript file - [#330](https://github.com/functionalscript/functionalscript/pull/330) -- DJS: add serializer - [#326](https://github.com/functionalscript/functionalscript/pull/326) - -## 0.2.6 - -- Refactoring of a vector of bits - [#328](https://github.com/functionalscript/functionalscript/pull/328) - -## 0.2.5 - -- New `crypto/` directory - [#327](https://github.com/functionalscript/functionalscript/pull/327) -- Simplified HTML - [#327](https://github.com/functionalscript/functionalscript/pull/327) -- djs: add `undefined` and comments - [#325](https://github.com/functionalscript/functionalscript/pull/325) - -## 0.2.3 - -- BitVec and documentation update - [#322](https://github.com/functionalscript/functionalscript/pull/322) - -## 0.1.608 +The changelog is the [`changelog/`](./changelog/) directory: one file per +released version, plus `changelog/unreleased/` holding one file per pull request +that is not released yet. See [changelog/README.md](./changelog/README.md). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index bfd68ddb8..61afdfa87 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -120,8 +120,9 @@ For tool details and package-consumer setup for Claude and Codex, see The full workflow is in [AGENTS.md §2](./AGENTS.md#2-everyday-workflow) and [AGENTS.md §8](./AGENTS.md#8-pull-requests). In short: one feature or improvement per pull request, every check above passing, the `todo/` issue deleted in the -same pull request, and — for code changes — a [CHANGELOG.md](./CHANGELOG.md) -entry added with the real pull request number once the pull request exists. +same pull request, and — for code changes — a changelog entry added as +`changelog/unreleased/.md`, named by the real pull request number once the +pull request exists (see [changelog/README.md](./changelog/README.md)). ## OpenAI Codex environment diff --git a/changelog/0.1.608.md b/changelog/0.1.608.md new file mode 100644 index 000000000..e69de29bb diff --git a/changelog/0.10.0.md b/changelog/0.10.0.md new file mode 100644 index 000000000..01a7f8d7c --- /dev/null +++ b/changelog/0.10.0.md @@ -0,0 +1,6 @@ +- IO: effects by default + [#695](https://github.com/functionalscript/functionalscript/pull/695) +- CI: cache for Playwright + [#691](https://github.com/functionalscript/functionalscript/pull/691) +- Add module-level JSDoc headers across many modules + [#690](https://github.com/functionalscript/functionalscript/pull/690) diff --git a/changelog/0.10.1.md b/changelog/0.10.1.md new file mode 100644 index 000000000..090585f7f --- /dev/null +++ b/changelog/0.10.1.md @@ -0,0 +1,2 @@ +- FJS: running Node programs + [#696](https://github.com/functionalscript/functionalscript/pull/696) diff --git a/changelog/0.10.2.md b/changelog/0.10.2.md new file mode 100644 index 000000000..677586821 --- /dev/null +++ b/changelog/0.10.2.md @@ -0,0 +1,2 @@ +- Effects: a new simplified `Effect` type, plus a `fluent` object for fluent + programming [#698](https://github.com/functionalscript/functionalscript/pull/698) diff --git a/changelog/0.10.3.md b/changelog/0.10.3.md new file mode 100644 index 000000000..ae4f00196 --- /dev/null +++ b/changelog/0.10.3.md @@ -0,0 +1,2 @@ +- Effects: no more `map`s + [#699](https://github.com/functionalscript/functionalscript/pull/699) diff --git a/changelog/0.11.0.md b/changelog/0.11.0.md new file mode 100644 index 000000000..4f730ee1d --- /dev/null +++ b/changelog/0.11.0.md @@ -0,0 +1,6 @@ +- Effects: refactoring: fluent native, operation set + [#708](https://github.com/functionalscript/functionalscript/pull/708) +- Effects: bug: `all` should return `Effect<..., readonly T[]>` + [#707](https://github.com/functionalscript/functionalscript/pull/707) +- Effects: generic `all` + [#704](https://github.com/functionalscript/functionalscript/pull/704) diff --git a/changelog/0.11.1.md b/changelog/0.11.1.md new file mode 100644 index 000000000..dc0d364d0 --- /dev/null +++ b/changelog/0.11.1.md @@ -0,0 +1,2 @@ +- Effects: the `both` function + [#710](https://github.com/functionalscript/functionalscript/pull/710) diff --git a/changelog/0.11.10.md b/changelog/0.11.10.md new file mode 100644 index 000000000..a99ca43ce --- /dev/null +++ b/changelog/0.11.10.md @@ -0,0 +1,2 @@ +- BitVec: improve `u8ListToVec` + [#732](https://github.com/functionalscript/functionalscript/pull/732) diff --git a/changelog/0.11.11.md b/changelog/0.11.11.md new file mode 100644 index 000000000..c811e1efc --- /dev/null +++ b/changelog/0.11.11.md @@ -0,0 +1,2 @@ +- RTTI: the first version + [#733](https://github.com/functionalscript/functionalscript/pull/733) diff --git a/changelog/0.11.2.md b/changelog/0.11.2.md new file mode 100644 index 000000000..2e7c12f7e --- /dev/null +++ b/changelog/0.11.2.md @@ -0,0 +1,2 @@ +- Effects: HTTPS: `createServer` and `listen` + [#716](https://github.com/functionalscript/functionalscript/pull/716) diff --git a/changelog/0.11.3.md b/changelog/0.11.3.md new file mode 100644 index 000000000..a999a2d9f --- /dev/null +++ b/changelog/0.11.3.md @@ -0,0 +1,2 @@ +- Effects: HTTPS: `listen` + [#722](https://github.com/functionalscript/functionalscript/pull/722) diff --git a/changelog/0.11.4.md b/changelog/0.11.4.md new file mode 100644 index 000000000..002f41c28 --- /dev/null +++ b/changelog/0.11.4.md @@ -0,0 +1,2 @@ +- Effects: `createServer`: `IncomingMessage` and `ServerResponse` + [#724](https://github.com/functionalscript/functionalscript/pull/724) diff --git a/changelog/0.11.5.md b/changelog/0.11.5.md new file mode 100644 index 000000000..78cd9c2ee --- /dev/null +++ b/changelog/0.11.5.md @@ -0,0 +1,2 @@ +- Effects: the `forever` command + [#725](https://github.com/functionalscript/functionalscript/pull/725) diff --git a/changelog/0.11.6.md b/changelog/0.11.6.md new file mode 100644 index 000000000..40a37ff10 --- /dev/null +++ b/changelog/0.11.6.md @@ -0,0 +1,2 @@ +- Effects: HTTP: `createServer`: a universal request listener + [#726](https://github.com/functionalscript/functionalscript/pull/726) diff --git a/changelog/0.11.7.md b/changelog/0.11.7.md new file mode 100644 index 000000000..0290ba3da --- /dev/null +++ b/changelog/0.11.7.md @@ -0,0 +1,2 @@ +- BitVec: improve performance of `u8ListToVec` + [#727](https://github.com/functionalscript/functionalscript/pull/727) diff --git a/changelog/0.11.8.md b/changelog/0.11.8.md new file mode 100644 index 000000000..43bc9162c --- /dev/null +++ b/changelog/0.11.8.md @@ -0,0 +1,2 @@ +- BitVec: improve performance of `u8List` + [#728](https://github.com/functionalscript/functionalscript/pull/728) diff --git a/changelog/0.11.9.md b/changelog/0.11.9.md new file mode 100644 index 000000000..6d026c683 --- /dev/null +++ b/changelog/0.11.9.md @@ -0,0 +1,4 @@ +- BitVec: another significant performance improvement for `u8List` + [#731](https://github.com/functionalscript/functionalscript/pull/731) +- BitVec: `BitOrder.cmp` + [#729](https://github.com/functionalscript/functionalscript/pull/729) diff --git a/changelog/0.12.0.md b/changelog/0.12.0.md new file mode 100644 index 000000000..cdf8cf499 --- /dev/null +++ b/changelog/0.12.0.md @@ -0,0 +1,2 @@ +- RTTI: new design + [#734](https://github.com/functionalscript/functionalscript/pull/734) diff --git a/changelog/0.12.1.md b/changelog/0.12.1.md new file mode 100644 index 000000000..7d5ed0097 --- /dev/null +++ b/changelog/0.12.1.md @@ -0,0 +1,2 @@ +- RTTI: type simplification for TypeScript + [#736](https://github.com/functionalscript/functionalscript/pull/736) diff --git a/changelog/0.12.2.md b/changelog/0.12.2.md new file mode 100644 index 000000000..3be43fa93 --- /dev/null +++ b/changelog/0.12.2.md @@ -0,0 +1 @@ +- RTTI: Or [#737](https://github.com/functionalscript/functionalscript/pull/737) diff --git a/changelog/0.12.5.md b/changelog/0.12.5.md new file mode 100644 index 000000000..001d953f8 --- /dev/null +++ b/changelog/0.12.5.md @@ -0,0 +1 @@ +- Effects: Rm [#747](https://github.com/functionalscript/functionalscript/pull/747) diff --git a/changelog/0.12.6.md b/changelog/0.12.6.md new file mode 100644 index 000000000..e5865c4bf --- /dev/null +++ b/changelog/0.12.6.md @@ -0,0 +1 @@ +- Effects: Exec [#748](https://github.com/functionalscript/functionalscript/pull/748) diff --git a/changelog/0.12.7.md b/changelog/0.12.7.md new file mode 100644 index 000000000..5f9fb212f --- /dev/null +++ b/changelog/0.12.7.md @@ -0,0 +1,2 @@ +- bitVec: `chunkList()` + [#749](https://github.com/functionalscript/functionalscript/pull/749) diff --git a/changelog/0.12.8.md b/changelog/0.12.8.md new file mode 100644 index 000000000..087056158 --- /dev/null +++ b/changelog/0.12.8.md @@ -0,0 +1,2 @@ +- Effects: exec: stdin + [#750](https://github.com/functionalscript/functionalscript/pull/750) diff --git a/changelog/0.12.9.md b/changelog/0.12.9.md new file mode 100644 index 000000000..da43d2fdc --- /dev/null +++ b/changelog/0.12.9.md @@ -0,0 +1,4 @@ +- RTTI: TS: generating simple TypeScript definitions from RTTI + [#751](https://github.com/functionalscript/functionalscript/pull/751) +- Io: improve `exec` + [#752](https://github.com/functionalscript/functionalscript/pull/752) diff --git a/changelog/0.13.0.md b/changelog/0.13.0.md new file mode 100644 index 000000000..246d2512e --- /dev/null +++ b/changelog/0.13.0.md @@ -0,0 +1,2 @@ +- RTTI: `print(mut?: true)` + [#754](https://github.com/functionalscript/functionalscript/pull/754) diff --git a/changelog/0.14.0.md b/changelog/0.14.0.md new file mode 100644 index 000000000..51e1991fb --- /dev/null +++ b/changelog/0.14.0.md @@ -0,0 +1,12 @@ +- Restructure [#773](https://github.com/functionalscript/functionalscript/pull/773) +- Test framework: detect pass-on-throw tests by the enclosing `throw` key, + supporting function references and grouped tests + [#769](https://github.com/functionalscript/functionalscript/pull/769) +- CI: centralize tool versions, split into per-tool modules, add a Playwright + browser cache [#764](https://github.com/functionalscript/functionalscript/pull/764) +- Refactor `StateScan` to swap the input and state parameter order + [#763](https://github.com/functionalscript/functionalscript/pull/763) +- SUL: first three levels. BitVec: chunking functions + [#757](https://github.com/functionalscript/functionalscript/pull/757) +- RTTI: parse (deserializer) + [#760](https://github.com/functionalscript/functionalscript/pull/760) diff --git a/changelog/0.14.1.md b/changelog/0.14.1.md new file mode 100644 index 000000000..9b378b2a8 --- /dev/null +++ b/changelog/0.14.1.md @@ -0,0 +1,4 @@ +- CI: add a `ci(rust: boolean)` function to conditionally include Rust steps + [#780](https://github.com/functionalscript/functionalscript/pull/780) +- RTTI: fix `NaN` handling in const validation by using `Object.is` instead of + `===` [#777](https://github.com/functionalscript/functionalscript/pull/777) diff --git a/changelog/0.15.0.md b/changelog/0.15.0.md new file mode 100644 index 000000000..d15bd7480 --- /dev/null +++ b/changelog/0.15.0.md @@ -0,0 +1,6 @@ +- Effects: unify `do_`/`doRest` and `Func`/`RestFunc` into a single + rest-parameter form; operation payload types are now uniformly tuples + [#794](https://github.com/functionalscript/functionalscript/pull/794) +- Test framework: parse non-default exports, so a test file can spread its tests + across multiple named exports + [#790](https://github.com/functionalscript/functionalscript/pull/790) diff --git a/changelog/0.16.0.md b/changelog/0.16.0.md new file mode 100644 index 000000000..4e84e8d8d --- /dev/null +++ b/changelog/0.16.0.md @@ -0,0 +1,8 @@ +- RTTI `Ts<>`: optional field inference; CI derives `Step` / `Job` / + `GitHubAction` from RTTI schemas + [#798](https://github.com/functionalscript/functionalscript/pull/798) +- RTTI: extract the shared kernel (error shape, primitive checks, `match` + recognizer) from `validate`/`parse` into a new `rtti/common` module + [#797](https://github.com/functionalscript/functionalscript/pull/797) +- NodeProgram: move `Env` to `fs/types/effects/node` and add it as the second + parameter [#795](https://github.com/functionalscript/functionalscript/pull/795) diff --git a/changelog/0.16.1.md b/changelog/0.16.1.md new file mode 100644 index 000000000..5ebb7c3ca --- /dev/null +++ b/changelog/0.16.1.md @@ -0,0 +1,3 @@ +- Effects: add the `now` operation returning epoch nanoseconds as `bigint`; the + virtual runner exposes `epochNs` for deterministic tests + [#803](https://github.com/functionalscript/functionalscript/pull/803) diff --git a/changelog/0.17.0.md b/changelog/0.17.0.md new file mode 100644 index 000000000..2340dd40f --- /dev/null +++ b/changelog/0.17.0.md @@ -0,0 +1,19 @@ +- Effects: replace `NodeProgram`'s two positional parameters with + `NodeProgramOptions` — `{ args, env }` + [#814](https://github.com/functionalscript/functionalscript/pull/814) +- `tf`: remove the `Input` intermediary type; `test` takes `Io` directly + [#813](https://github.com/functionalscript/functionalscript/pull/813) +- `fjs`: convert the `run`/`r` command from `asyncImport`/`await` to the + `import_` effect + [#812](https://github.com/functionalscript/functionalscript/pull/812) +- DJS transpiler: replace `Fs`/`readFileSync` with the `ReadFile` effect; tests + use the virtual effect runner and `fs/io/virtual` is deleted + [#811](https://github.com/functionalscript/functionalscript/pull/811) +- IO: expose `sandbox` on the `Io` interface; the test framework replaces + `measure` + `tryCatch` with it, eliminating state threading + [#809](https://github.com/functionalscript/functionalscript/pull/809) +- Effects: add the `sandbox` operation — runs a sync function with try/catch and + `performance.now()` timing in one atomic operation + [#808](https://github.com/functionalscript/functionalscript/pull/808) +- Docs: add the required JSDoc `@module` header to every `module.f.ts` that was + missing one [#804](https://github.com/functionalscript/functionalscript/pull/804) diff --git a/changelog/0.18.0.md b/changelog/0.18.0.md new file mode 100644 index 000000000..0c6a256d2 --- /dev/null +++ b/changelog/0.18.0.md @@ -0,0 +1,48 @@ +- `rtti`: `parse` now mirrors `validate`'s container factories, and the shared + container guards and types move into the `common` kernel + [#853](https://github.com/functionalscript/functionalscript/pull/853) +- `tf`: add the `fmtImport` output format (`import("./f.ts").path()`), `null` + call markers in paths, `file` on `Reporter.pass`, and relative module keys + [#851](https://github.com/functionalscript/functionalscript/pull/851) +- `tf`: `Reporter.test` owns execution; `parseTestSet` is uncurried and + `defaultTest` exported; `Sandbox` drops out of the `runModuleMap` constraints + [#844](https://github.com/functionalscript/functionalscript/pull/844) +- `types`: extract the shared `bsearch` helper used by `sorted_list.find` and + `range_map.get`, and move the curried `Cmp` alias to `function/compare` + [#845](https://github.com/functionalscript/functionalscript/pull/845) +- `tf`: export `runModuleMap` and add the experimental `run2` in `module.ts` + [#843](https://github.com/functionalscript/functionalscript/pull/843) +- `tf`: extract `runModule` / `runModuleMap`, flatten the `walk` signature, and + filter before reduce + [#842](https://github.com/functionalscript/functionalscript/pull/842) +- `tf`: virtual tests via `JsModule` plus a pass-through `sandbox`; `Reporter` + and `Program` become generic + [#840](https://github.com/functionalscript/functionalscript/pull/840) +- Effects: Node: Virtual: new file type — `JsModule` + [#834](https://github.com/functionalscript/functionalscript/pull/834) +- `tf`: extract the `Reporter` interface; `test` takes a `Reporter` and returns a + `NodeProgram`, moving the `isGitHub` branching out of the walker + [#831](https://github.com/functionalscript/functionalscript/pull/831) +- `fjs`: convert `main` to `NodeProgram`, dispatching sub-commands by returning + Effects directly and dropping the `Io` dependency + [#830](https://github.com/functionalscript/functionalscript/pull/830) +- `tf`: convert `main` to `NodeProgram` — replaces the `Io` dependency with + `loadModuleMap2`, the `sandbox` effect, and `csiWrite` + [#828](https://github.com/functionalscript/functionalscript/pull/828) +- `tf`: eliminate the double `sandbox` call for throw-tests; `parseTestSet` + returns `TestEntry = { fn, throws }`. Adds the no-type-predicate rule to + `AGENTS.md` [#827](https://github.com/functionalscript/functionalscript/pull/827) +- `uint8array`: mark the module deprecated — use `utf8` / `utf8ToString` from + `fs/text` and `bit_vec` directly + [#823](https://github.com/functionalscript/functionalscript/pull/823) +- `tf`: remove the unused `anyLog` helper + [#823](https://github.com/functionalscript/functionalscript/pull/823) +- Effects: retire the `Log` / `Error` / `Console` operation types; `log` and + `error` are now helpers built on `write` + [#822](https://github.com/functionalscript/functionalscript/pull/822) +- Effects: add the `Write` effect (`write(stream, data)`) and `WriteConsoles` to + `NodeOp`; add `std` to `NodeProgramOptions` and `csiWrite` to `fs/text/sgr` + [#816](https://github.com/functionalscript/functionalscript/pull/816) +- IO: add `write(stream, data)` to `Io` with backpressure via `stream.write()` + plus `once(stream, 'drain')` + [#821](https://github.com/functionalscript/functionalscript/pull/821) diff --git a/changelog/0.19.0.md b/changelog/0.19.0.md new file mode 100644 index 000000000..95eaf3baa --- /dev/null +++ b/changelog/0.19.0.md @@ -0,0 +1,18 @@ +- `tf`: drop Node 22 — remove `--experimental-strip-types`, bump + `engines.node` to `>=24`, add `.node-version`, remove the `node22` CI job + [#872](https://github.com/functionalscript/functionalscript/pull/872) +- `tf`: restore the Playwright bridge as `playwrightTestContext`, detected via + the `PLAYWRIGHT_TEST` environment variable + [#872](https://github.com/functionalscript/functionalscript/pull/872) +- `tf`: add the `Engine` type, `bunTestContext`, `inlineTest`, and + `inlineContext` — fixes Bun's `ERR_NOT_IMPLEMENTED` on nested `t.test()` + [#872](https://github.com/functionalscript/functionalscript/pull/872) +- `tf`: add scenario tests in `fs/dev/tf/scenarios/` with a `run.sh` covering + node/bun/deno/playwright + [#872](https://github.com/functionalscript/functionalscript/pull/872) +- `tf`: add `registerModule`, `registerModuleMap`, and `register` — a pure + Effects layer for registering tests with external frameworks + [#872](https://github.com/functionalscript/functionalscript/pull/872) +- `bit_vec`: make list concatenation a `BitOrder` member (`order.listToVec`) and + drop the free `listToVec` factory + [#865](https://github.com/functionalscript/functionalscript/pull/865) diff --git a/changelog/0.2.3.md b/changelog/0.2.3.md new file mode 100644 index 000000000..7fc12daa9 --- /dev/null +++ b/changelog/0.2.3.md @@ -0,0 +1,2 @@ +- BitVec and documentation update + [#322](https://github.com/functionalscript/functionalscript/pull/322) diff --git a/changelog/0.2.5.md b/changelog/0.2.5.md new file mode 100644 index 000000000..70d0e2db3 --- /dev/null +++ b/changelog/0.2.5.md @@ -0,0 +1,6 @@ +- New `crypto/` directory + [#327](https://github.com/functionalscript/functionalscript/pull/327) +- Simplified HTML + [#327](https://github.com/functionalscript/functionalscript/pull/327) +- djs: add `undefined` and comments + [#325](https://github.com/functionalscript/functionalscript/pull/325) diff --git a/changelog/0.2.6.md b/changelog/0.2.6.md new file mode 100644 index 000000000..13a950e75 --- /dev/null +++ b/changelog/0.2.6.md @@ -0,0 +1,2 @@ +- Refactoring of a vector of bits + [#328](https://github.com/functionalscript/functionalscript/pull/328) diff --git a/changelog/0.20.0.md b/changelog/0.20.0.md new file mode 100644 index 000000000..767496476 --- /dev/null +++ b/changelog/0.20.0.md @@ -0,0 +1,38 @@ +- `tf`: widen the load gate to all `.f.ts`/`.f.js` plus vanilla + `proof.{ts,js,mts,mjs}`; `v.proof !== undefined` is the sole gate, enabling + co-located white-box proofs + [#893](https://github.com/functionalscript/functionalscript/pull/893) +- `tf`: discover proofs by an exported `proof` property instead of + `Module.default`; convert all 81 proof files + [#889](https://github.com/functionalscript/functionalscript/pull/889) +- `text`: extract the shared streaming code-point decoder skeleton and the + `errorMask` constant from `utf8`/`utf16` into a new `fs/text/code_point` + [#860](https://github.com/functionalscript/functionalscript/pull/860) +- DJS serializer: factor out `buildSerialize(refLookup)` so both serializers + share the value→string core, and remove the in-place mutation from `addRef` + and the ref-counter flag + [#832](https://github.com/functionalscript/functionalscript/pull/832) +- `effects`: add the `foldStep` / `forEachStep` combinators — sequential + state-threading and void-accumulator siblings of `all` + [#885](https://github.com/functionalscript/functionalscript/pull/885) +- `tf`: rename all `test.f.ts` / `test.f.js` → `proof.f.ts` / `proof.f.js` + (80 files) [#883](https://github.com/functionalscript/functionalscript/pull/883) +- `tf`: fix `sandbox` timing accuracy — `p instanceof Promise ? await p : p` + instead of the `awaitPromise` boxing handler, so spurious microtasks no longer + inflate durations + [#883](https://github.com/functionalscript/functionalscript/pull/883) +- `tf`: async test function support — `registerModule` and `sandbox` now await + async test functions; adds the `Await` effect type and `awaitPromise` + [#882](https://github.com/functionalscript/functionalscript/pull/882) +- `io`: `effectRun` now calls `process.exit` internally, fixing `fjs t` always + exiting 0 regardless of test failures + [#882](https://github.com/functionalscript/functionalscript/pull/882) +- `tf`: move `isTest` to `dev/module.f.ts`, consolidating the predicate used by + both `loadFile` and `runModuleMap` + [#882](https://github.com/functionalscript/functionalscript/pull/882) +- `tf`: prefix scenario temporary files with `_` so git ignores them, and add + `fjs` as a scenario runner alongside node/bun/deno/playwright + [#882](https://github.com/functionalscript/functionalscript/pull/882) +- `io`: extract the `wrapInlineTest(register)` factory shared by + `bunTestContext` and `playwrightTestContext`. Behaviour-preserving + [#880](https://github.com/functionalscript/functionalscript/pull/880) diff --git a/changelog/0.21.0.md b/changelog/0.21.0.md new file mode 100644 index 000000000..3dffdea9a --- /dev/null +++ b/changelog/0.21.0.md @@ -0,0 +1,12 @@ +- **breaking** `tf`: rename `fs/dev/tf` → `fs/emergent-testing`; the public + exports and the external-runner entry import change accordingly + [#923](https://github.com/functionalscript/functionalscript/pull/923) +- `asserts`: extract `assert`, `assertEq`, `todo`, and `Assert` from + `fs/dev/module.f.ts` into a standalone `fs/asserts/module.f.ts` + [#923](https://github.com/functionalscript/functionalscript/pull/923) +- `types/nullable`: add `fromUndefined(v)` — names the JS-host ↔ + FunctionalScript `undefined`→`null` boundary in one helper + [#919](https://github.com/functionalscript/functionalscript/pull/919) +- `effects/node`: add `errorExit(s)` — the canonical "write an error line to + stderr, yield exit code 1" `NodeOp` program; replaces seven inline copies + [#917](https://github.com/functionalscript/functionalscript/pull/917) diff --git a/changelog/0.22.0.md b/changelog/0.22.0.md new file mode 100644 index 000000000..9d621a5e4 --- /dev/null +++ b/changelog/0.22.0.md @@ -0,0 +1,5 @@ +- **breaking** `emergent_testing`: rename `fs/emergent-testing` → + `fs/emergent_testing`, matching the snake_case module-naming convention + [#924](https://github.com/functionalscript/functionalscript/pull/924) +- `asserts`: add the missing `./fs/asserts/module.f.ts` entry to `deno.json` + exports [#924](https://github.com/functionalscript/functionalscript/pull/924) diff --git a/changelog/0.23.0.md b/changelog/0.23.0.md new file mode 100644 index 000000000..5809c2dbd --- /dev/null +++ b/changelog/0.23.0.md @@ -0,0 +1,7 @@ +- **breaking** `io`: encapsulate `io` behind the entry points — `effectRun` is + renamed to `run`, and the new `runEffect(p)` resolves the exit code without + calling `process.exit` + [#942](https://github.com/functionalscript/functionalscript/pull/942) +- **breaking** `function/compare`: add generic `min` / `max` next to `cmp` and + retire the duplicated pairs in `function/operator` and `types/bigint` + [#940](https://github.com/functionalscript/functionalscript/pull/940) diff --git a/changelog/0.24.0.md b/changelog/0.24.0.md new file mode 100644 index 000000000..1d7eb2b7c --- /dev/null +++ b/changelog/0.24.0.md @@ -0,0 +1,8 @@ +- **breaking** `effects`: hoist `fs/types/effects` → `fs/effects` and fold + `fs/io` into `fs/effects/node/module.ts`; callers use the runner's `run(p)` / + `runEffect(p)` entry points + [#943](https://github.com/functionalscript/functionalscript/pull/943) +- **breaking** `emergent_testing`: remove `fs/emergent_testing/module.ts`; the + external-runner entry is now the self-contained + `fs/emergent_testing/all.test.ts` + [#943](https://github.com/functionalscript/functionalscript/pull/943) diff --git a/changelog/0.25.0.md b/changelog/0.25.0.md new file mode 100644 index 000000000..9f0bfe3ed --- /dev/null +++ b/changelog/0.25.0.md @@ -0,0 +1,50 @@ +- `ci`: auto-detect Rust by checking for `Cargo.toml` at the repo root, removing + the manual `rust: boolean` flag from `Setup` + [#969](https://github.com/functionalscript/functionalscript/pull/969) +- `ci`: split `npm test` into explicit steps (`npx tsc`, `npm test`, + `node --test`, `npm run cov`); add the `cov` script and remove `fst` + [#969](https://github.com/functionalscript/functionalscript/pull/969) +- `bnf`: hoist the `commaJoin0Plus` delimited-list combinator into + `fs/bnf/module.f.ts` and collapse three byte-identical local copies onto it + [#964](https://github.com/functionalscript/functionalscript/pull/964) +- `types/rtti/ts`: add `README.md` documenting the TS2589 depth-overflow problem + for recursive `Ts`, the `any` fast-path and `WithOut` solutions, and the + three remaining `as any` casts + [#961](https://github.com/functionalscript/functionalscript/pull/961) +- `types/rtti/ts`: use a unique symbol key for `WithOut`'s phantom field instead + of the string `$out`, so `WithOut` is valid for any `Out` + [#960](https://github.com/functionalscript/functionalscript/pull/960) +- `types/rtti/ts`: add the `WithOut` phantom type and `$out` branch to + `Ts` — a pre-computed output type short-circuits the schema walk, fixing + TS2589 for recursive struct schemas + [#959](https://github.com/functionalscript/functionalscript/pull/959) +- `json/schema`: redesign the `unknown` rtti schema using `WithOut`, splitting it + into `unknownConst` and `unknownThunk` so `Ts` is the single + source of truth + [#959](https://github.com/functionalscript/functionalscript/pull/959) +- `types/rtti`: remove unnecessary `as any` from all `verror` / `prependPath` + returns in `validate`, `parse`, and `common`; document the root cause of the + remaining casts + [#959](https://github.com/functionalscript/functionalscript/pull/959) +- `json/schema`: add `toJsonSchema(rtti)` — converts any rtti `Type` to a JSON + Schema draft 2020-12 object + [#957](https://github.com/functionalscript/functionalscript/pull/957) +- `crypto/sha2`: collapse `bigSigma` / `smallSigma` into one `sigma(third)` + factory parameterised by the third XOR operand. No API change + [#954](https://github.com/functionalscript/functionalscript/pull/954) +- `json/rpc`: add a pure JSON-RPC 2.0 layer — rtti schemas for the envelopes, a + `decodeRequest` decoder, and a pure `dispatch(handlers)(value)` + [#950](https://github.com/functionalscript/functionalscript/pull/950) +- `json`: add rtti schemas (`primitive`, `unknown`, `object`, `array`) and derive + `Primitive` and `Unknown` from them via `Ts<>` + [#950](https://github.com/functionalscript/functionalscript/pull/950) +- `types/rtti`: decouple rtti from djs — `Primitive`, `Unknown`, `Array`, and + `Object` are now defined locally + [#950](https://github.com/functionalscript/functionalscript/pull/950) +- `types/rtti/ts`: `Ts` fast-path — `unknown extends T ? Unknown` + short-circuits when `T` is `any`, preventing TS2589 distribution + [#950](https://github.com/functionalscript/functionalscript/pull/950) +- `crypto/vdf`: add a Sloth verifiable delay function over a fixed 3072-bit safe + prime; extends `types/prime_field` with `reduce` / `quadRes` and a standalone + `modSqrt` helper + [#937](https://github.com/functionalscript/functionalscript/pull/937) diff --git a/changelog/0.26.0.md b/changelog/0.26.0.md new file mode 100644 index 000000000..a46855d57 --- /dev/null +++ b/changelog/0.26.0.md @@ -0,0 +1,12 @@ +- `fjs`: add `fjs ci` / `fjs i` as first-class commands for the standard CI + workflow generator + [#975](https://github.com/functionalscript/functionalscript/pull/975) +- `cli`: change `Command.handler` to take `NodeProgramOptions` instead of + `readonly string[]`; `dispatch` forwards the full options with `args` trimmed + [#973](https://github.com/functionalscript/functionalscript/pull/973) +- `fjs`: `fjs r` now looks up `main` instead of `default` on the imported module + [#972](https://github.com/functionalscript/functionalscript/pull/972) +- `cli`: add `fs/cli/module.f.ts` — `Command` / `Commands` types and a `dispatch` + function with auto-generated help; replaces the `switch`-based dispatch in + `fjs` and `cas` + [#971](https://github.com/functionalscript/functionalscript/pull/971) diff --git a/changelog/0.28.0.md b/changelog/0.28.0.md new file mode 100644 index 000000000..be0767c53 --- /dev/null +++ b/changelog/0.28.0.md @@ -0,0 +1,3 @@ +- abandon JSR publishing: remove `deno.json`, `fs/dev/index/`, `fs/dev/version/`, + the `index` script, and every `deno publish` step + [#984](https://github.com/functionalscript/functionalscript/pull/984) diff --git a/changelog/0.29.0.md b/changelog/0.29.0.md new file mode 100644 index 000000000..a37c5debc --- /dev/null +++ b/changelog/0.29.0.md @@ -0,0 +1,3 @@ +- add `bun.lock` and `deno.lock` to source control and pin exact devDependency + versions, so CI installs are reproducible via `--frozen` + [#985](https://github.com/functionalscript/functionalscript/pull/985) diff --git a/changelog/0.29.1.md b/changelog/0.29.1.md new file mode 100644 index 000000000..fb814a5f7 --- /dev/null +++ b/changelog/0.29.1.md @@ -0,0 +1,5 @@ +- `package`: relax the npm `engines.node` requirement from `>=24` to `>=22` + [#987](https://github.com/functionalscript/functionalscript/pull/987) +- `types/prime_field`: make `quadRes(0n)` return `true`, compute Euler's + exponent from `p - 1`, and document the `p === 2n` behavior + [#986](https://github.com/functionalscript/functionalscript/pull/986) diff --git a/changelog/0.3.0.md b/changelog/0.3.0.md new file mode 100644 index 000000000..e1230ab8a --- /dev/null +++ b/changelog/0.3.0.md @@ -0,0 +1,4 @@ +- Switching to TypeScript file + [#330](https://github.com/functionalscript/functionalscript/pull/330) +- DJS: add serializer + [#326](https://github.com/functionalscript/functionalscript/pull/326) diff --git a/changelog/0.3.12.md b/changelog/0.3.12.md new file mode 100644 index 000000000..6b8d387a6 --- /dev/null +++ b/changelog/0.3.12.md @@ -0,0 +1,2 @@ +- BNF types and the `RangeMapOp` interface + [#355](https://github.com/functionalscript/functionalscript/pull/355) diff --git a/changelog/0.3.13.md b/changelog/0.3.13.md new file mode 100644 index 000000000..e022eea24 --- /dev/null +++ b/changelog/0.3.13.md @@ -0,0 +1,2 @@ +- First LL(1) parser + [#356](https://github.com/functionalscript/functionalscript/pull/356) diff --git a/changelog/0.3.5.md b/changelog/0.3.5.md new file mode 100644 index 000000000..02212f7a4 --- /dev/null +++ b/changelog/0.3.5.md @@ -0,0 +1,4 @@ +- Fix for Node <= v20 + [#341](https://github.com/functionalscript/functionalscript/pull/341) +- A main module + [#340](https://github.com/functionalscript/functionalscript/pull/340) diff --git a/changelog/0.3.6.md b/changelog/0.3.6.md new file mode 100644 index 000000000..0bc527e63 --- /dev/null +++ b/changelog/0.3.6.md @@ -0,0 +1,2 @@ +- Export `html.Node` + [#342](https://github.com/functionalscript/functionalscript/pull/342) diff --git a/changelog/0.3.7.md b/changelog/0.3.7.md new file mode 100644 index 000000000..f2a70376e --- /dev/null +++ b/changelog/0.3.7.md @@ -0,0 +1 @@ +- Monoid [#343](https://github.com/functionalscript/functionalscript/pull/343) diff --git a/changelog/0.3.8.md b/changelog/0.3.8.md new file mode 100644 index 000000000..f2e7c0eb4 --- /dev/null +++ b/changelog/0.3.8.md @@ -0,0 +1,2 @@ +- SHA2 that works on bit vectors + [#345](https://github.com/functionalscript/functionalscript/pull/345) diff --git a/changelog/0.3.9.md b/changelog/0.3.9.md new file mode 100644 index 000000000..85c1fc6bb --- /dev/null +++ b/changelog/0.3.9.md @@ -0,0 +1,2 @@ +- Improved `types/bigint/log2` algorithm + [#346](https://github.com/functionalscript/functionalscript/pull/346) diff --git a/changelog/0.30.0.md b/changelog/0.30.0.md new file mode 100644 index 000000000..0abadde97 --- /dev/null +++ b/changelog/0.30.0.md @@ -0,0 +1,4 @@ +- `ci`: **BREAKING CHANGE:** split generated workflows into lightweight platform + jobs and canonical Ubuntu ARM jobs, set read-only workflow permissions, and + expand Rust checks to release tests and release Clippy + [#997](https://github.com/functionalscript/functionalscript/pull/997) diff --git a/changelog/0.31.0.md b/changelog/0.31.0.md new file mode 100644 index 000000000..cc776fae8 --- /dev/null +++ b/changelog/0.31.0.md @@ -0,0 +1,88 @@ +- `cas/mcp`: unify `cas_add`/`cas_add_url` and `cas_get`/`cas_get_meta` into + three tools — `cas_add` gains `type:'url'`, `cas_get` gains `content?: + boolean` and always returns metadata + [#1106](https://github.com/functionalscript/functionalscript/pull/1106) +- `cas/mcp`: add `cas_add_url` and `cas_get_meta` to avoid token-heavy binary + transfers; `casMcpHandlers` accepts an optional `toUrl` resolver + [#1102](https://github.com/functionalscript/functionalscript/pull/1102) +- `cas/mcp`: smart text/binary encoding — `cas_add` accepts an optional `type` + (`'text'` default or `'base64'`); `cas_get` returns + `{ content, type, mime_type }` after two-phase MIME detection + [#1104](https://github.com/functionalscript/functionalscript/pull/1104) +- `base_n`: extract a shared `Vec ↔ string` bit-codec factory, + `baseN(bits, alphabet, normalize?)`, and rewrite `base64` and `cbase32` + through it while each keeps its own padding + [#1097](https://github.com/functionalscript/functionalscript/pull/1097) +- `cli`: `Command.handler` now also accepts a nested `Commands` array, and + `dispatch` recurses into it — subcommand groups such as `fjs cas mcp` need no + custom dispatch + [#1093](https://github.com/functionalscript/functionalscript/pull/1093) +- `cas/mcp`: switch content encoding to standard RFC 4648 base64; hashes stay + cBase32 for canonical identity + [#1081](https://github.com/functionalscript/functionalscript/pull/1081) +- `json`: `stringify` now skips object properties with `undefined` values, + matching `JSON.stringify` + [#1080](https://github.com/functionalscript/functionalscript/pull/1080) +- `base64`: add `fs/base64/module.f.ts` with RFC 4648 `encode` / `decode` for + byte-aligned `Vec` values, returning `null` on malformed input + [#1079](https://github.com/functionalscript/functionalscript/pull/1079) +- `mcp`: add a stdio transport for JSON-RPC / MCP servers — `stdioTransport` + drives the read→parse→dispatch→write loop as a recursive effect over a new + byte-level `read` effect + [#1072](https://github.com/functionalscript/functionalscript/pull/1072) +- `json/parser`: reject trailing commas, matching strict `JSON.parse` (it + previously accepted `[1,]` and `{"a":1,}`) + [#1072](https://github.com/functionalscript/functionalscript/pull/1072) +- `html`: replace the four raw hex code points in `escapeCharCode` with the + named constants from `fs/text/ascii`. Pure refactor + [#1064](https://github.com/functionalscript/functionalscript/pull/1064) +- `djs/serializer`: hoist the "value is referenced more than once" predicate into + a single module-scope `sharedRef(refs)(v)` helper. Pure refactor + [#1057](https://github.com/functionalscript/functionalscript/pull/1057) +- `types/object`: introduce `StringMap` — one conditional type covering + both infinite and finite key sets — plus `definedEntries`; applied across 17 + sites in 11 files + [#1055](https://github.com/functionalscript/functionalscript/pull/1055) +- `effects/node`: add `readUtf8File` / `writeUtf8File` next to the + `readFile` / `writeFile` effects, and migrate the open-coded UTF-8 sandwiches + in `djs/transpiler`, `djs`, and `ci` + [#1052](https://github.com/functionalscript/functionalscript/pull/1052) +- `effects/node`: drop the private `Io` indirection from the node effect runner + — the handler table is inlined into a module-level `asyncRun`. Pure refactor + [#1051](https://github.com/functionalscript/functionalscript/pull/1051) +- `fjs`: add a `proof.f.ts` covering the CLI command handlers via the virtual + Node-effect interpreter + [#1047](https://github.com/functionalscript/functionalscript/pull/1047) +- `effects/node/virtual`: add proofs for the `await` handler, the `fetch` + not-found branch, and the `import_` invalid-path branch + [#1046](https://github.com/functionalscript/functionalscript/pull/1046) +- `asn.1`: extract a private generic `decodeAll(step)` and rewrite + `decodeObjectIdentifier` and `decodeSequence` through it. Pure refactor + [#1041](https://github.com/functionalscript/functionalscript/pull/1041) +- `types/bigfloat`: factor the abs/sign/`multiply` envelope of `round53` and + `decToBin` into a private `withSign` combinator. Pure refactor + [#1022](https://github.com/functionalscript/functionalscript/pull/1022) +- `types/bigfloat`: collapse the `increaseMantissa` / `decreaseMantissa` mirror + into a single `normalizeMantissa` factory. Pure refactor + [#1021](https://github.com/functionalscript/functionalscript/pull/1021) +- `text/utf8`: define the UTF-8 tag/payload-mask constants and the + `contByte` / `contPayload` helpers once at module scope. Pure refactor + [#1020](https://github.com/functionalscript/functionalscript/pull/1020) +- `types/bigint`: export `divUp8` / `roundUp8` (bits → bytes, rounding up) and + reuse them in `crypto/sign` and `asn.1` + [#1018](https://github.com/functionalscript/functionalscript/pull/1018) +- `types/sorted_list`: export `intersect` and `dropTail`; `types/sorted_set` + delegates `intersect` to them, mirroring `union` + [#1017](https://github.com/functionalscript/functionalscript/pull/1017) +- `cas`: drop the private 2-char `split` helper and reuse `splitAt(2)` from + `fs/types/string` for the shard path + [#1014](https://github.com/functionalscript/functionalscript/pull/1014) +- `types/bigint`: add shift-based `divUpE2(e)` / `roundUpE2(e)`, retype + `divUp` / `roundUp`, and migrate `asn.1` and `crypto/sign` onto them + [#1012](https://github.com/functionalscript/functionalscript/pull/1012) +- `effects/memory`: add typed `create` / `read` / `write` memory operations, a + `Map`-backed Node interpreter, and virtual-memory composition + [#1008](https://github.com/functionalscript/functionalscript/pull/1008) +- `json/rpc`: add JSON-RPC spec links to the JSDoc and destructure the + `decodeRequest` result in `dispatch` + [#1002](https://github.com/functionalscript/functionalscript/pull/1002) diff --git a/changelog/0.31.1.md b/changelog/0.31.1.md new file mode 100644 index 000000000..128018ef7 --- /dev/null +++ b/changelog/0.31.1.md @@ -0,0 +1,3 @@ +- `effects/node`: normalize the home directory path on Windows using `toPosix`, + so `home` always uses forward slashes + [#1108](https://github.com/functionalscript/functionalscript/pull/1108) diff --git a/changelog/0.32.0.md b/changelog/0.32.0.md new file mode 100644 index 000000000..459de0e5d --- /dev/null +++ b/changelog/0.32.0.md @@ -0,0 +1,2 @@ +- **BREAKING CHANGE:** the MCP server as a top-level CLI command + [#1115](https://github.com/functionalscript/functionalscript/pull/1115) diff --git a/changelog/0.32.1.md b/changelog/0.32.1.md new file mode 100644 index 000000000..b80af9f37 --- /dev/null +++ b/changelog/0.32.1.md @@ -0,0 +1,11 @@ +- `effects/node`: limit `ReadFile` to Bun's `bigint` size constraint + (131,072 bytes) for cross-runtime compatibility; add `maxLength` and + `maxLengthBytes` constants + [#1121](https://github.com/functionalscript/functionalscript/pull/1121) +- `mcp`: extract the declarative tool-registry pattern into reusable builders + (`ToolEntry`, `toolEntry`, `fromRegistry`, `errorResult`), removing ~100 lines + of dispatch boilerplate per MCP server + [#1119](https://github.com/functionalscript/functionalscript/pull/1119) +- `cas/mcp`: refactor tool definitions from a hardcoded array plus `switch` to a + data-driven registry, so adding a tool is additive + [#1118](https://github.com/functionalscript/functionalscript/pull/1118) diff --git a/changelog/0.32.2.md b/changelog/0.32.2.md new file mode 100644 index 000000000..35213ec08 --- /dev/null +++ b/changelog/0.32.2.md @@ -0,0 +1,4 @@ +- `cas/mcp`: restrict `cas_add` with `type: 'url'` to paths under + `~/cas_upload/`, rejecting `..` — MCP clients can no longer exfiltrate + arbitrary files + [#1122](https://github.com/functionalscript/functionalscript/pull/1122) diff --git a/changelog/0.32.3.md b/changelog/0.32.3.md new file mode 100644 index 000000000..85f2a13f6 --- /dev/null +++ b/changelog/0.32.3.md @@ -0,0 +1,5 @@ +- `cas/mcp`: temporary fix for large files — `cas_get` no longer crashes on + files larger than `readFile`'s size limit + [#1124](https://github.com/functionalscript/functionalscript/pull/1124) +- `fs/cas/mcp`: clearer setup instructions for Claude CLI and Codex in the + README [#1123](https://github.com/functionalscript/functionalscript/pull/1123) diff --git a/changelog/0.32.4.md b/changelog/0.32.4.md new file mode 100644 index 000000000..8ef3bc6ae --- /dev/null +++ b/changelog/0.32.4.md @@ -0,0 +1,4 @@ +- `cas`: add `cas upload ` — a streaming move-hash-move pipeline that + hashes in 128 KiB chunks without loading the file into memory, then renames + the staged file to its sharded CAS location + [#1127](https://github.com/functionalscript/functionalscript/pull/1127) diff --git a/changelog/0.33.0.md b/changelog/0.33.0.md new file mode 100644 index 000000000..f9891696b --- /dev/null +++ b/changelog/0.33.0.md @@ -0,0 +1,9 @@ +- Remove `kvStore` + [#1143](https://github.com/functionalscript/functionalscript/pull/1143) +- `types/bigint`: drop the power-of-two `divUpE2` / `roundUpE2` helpers — + `divUp8` / `roundUp8` are now derived from `divUp(8n)` / `roundUp(8n)` + [#1131](https://github.com/functionalscript/functionalscript/pull/1131) +- `effects/node/virtual`: change the `Entity` file type from `Vec` to + `readonly Vec[]` so the virtual filesystem can store files larger than + `maxLengthBytes` as chunks + [#1130](https://github.com/functionalscript/functionalscript/pull/1130) diff --git a/changelog/0.34.0.md b/changelog/0.34.0.md new file mode 100644 index 000000000..60da1d485 --- /dev/null +++ b/changelog/0.34.0.md @@ -0,0 +1,33 @@ +- `text` / `mime`: separate text-ness from well-formedness in the detector — new + `isTextCodePoint` excludes control characters, so valid-but-control blobs are + no longer mislabelled as `text/plain` + [#1183](https://github.com/functionalscript/functionalscript/pull/1183) +- **BREAKING CHANGES:** `text`: move the Unicode code-point predicates into + `fs/text/code_point/module.f.ts`; `isValidCodePoint` is no longer exported + from `fs/text/utf8/module.f.ts` + [#1182](https://github.com/functionalscript/functionalscript/pull/1182) +- `cas/mcp`: make metadata-only `cas_get` size-independent — the read stream is + folded through the new `fs/mime` `detectStream` state machine instead of being + drained into one `Vec` + [#1181](https://github.com/functionalscript/functionalscript/pull/1181) +- **BREAKING CHANGE:** `bnf`: split the backends out of `fs/bnf/data`, leaving it + as the pure serializable IR — LL(1) moves to `fs/bnf/ll1` and recursive descent + to `fs/bnf/descent` + [#1179](https://github.com/functionalscript/functionalscript/pull/1179) +- `cas`: extract `casAddFile` — streams a file through `cas.write()` and returns + the content hash; the CLI `cas add` and MCP `cas_add` both delegate to it + [#1158](https://github.com/functionalscript/functionalscript/pull/1158) +- `cas`: move the CLI command handlers into `fs/cas/cli/module.f.ts`, mirroring + `fs/cas/mcp/`; `fs/cas/module.f.ts` keeps only shared types and primitives + [#1157](https://github.com/functionalscript/functionalscript/pull/1157) +- `fs/html`: replace `escapeCharCode`'s four-arm `switch` with an `escapeTable` + lookup and a single fallback — the escape set is now data + [#1145](https://github.com/functionalscript/functionalscript/pull/1145) +- `cas`: reimplement `casUpload` on top of `fileCas.write()`, inheriting lease + GC, dedup-on-publish, and `stat` size verification; the source is deleted only + after a successful write + [#1153](https://github.com/functionalscript/functionalscript/pull/1153) +- `cas`: implement the lock-free staging upload — `fileCas.write` streams each + chunk to a leased `_stage/` file while hashing, then publishes by `rename`. + Adds the `createExclusive`, `writeBytes`, and `stat` effects + [#1149](https://github.com/functionalscript/functionalscript/pull/1149) diff --git a/changelog/0.35.0.md b/changelog/0.35.0.md new file mode 100644 index 000000000..73868c991 --- /dev/null +++ b/changelog/0.35.0.md @@ -0,0 +1,22 @@ +- `mcp/stdio`: bound the internal-error fallback — a caller-controlled `id` can + push even the `-32603` response past `maxLength`, so `writeResponse` retries + once more with a fixed `id: null` + [#1201](https://github.com/functionalscript/functionalscript/pull/1201) +- `cas/mcp`: `cas_add` now returns a clean `isError` result instead of crashing + the server when inline content is malformed or exceeds the 128 KiB limit + [#1198](https://github.com/functionalscript/functionalscript/pull/1198) +- `README`: update Getting Started for the full `fjs` CLI (`test`, `compile`, + `run`, `cas`, `mcp`, `ci`); add CAS and MCP Server sections + [#1198](https://github.com/functionalscript/functionalscript/pull/1198) +- `text`: add `tryUtf8`, the `Nullable`-returning sibling of `utf8` — reports + `null` instead of throwing when a string's UTF-8 encoding would exceed + `maxLength`; `utf8` is derived from it + [#1196](https://github.com/functionalscript/functionalscript/pull/1196) +- `types/bit_vec` / `base64`: enforce `maxLength` when folding a list into a + `Vec`; add `tryU8ListToVec`, plus `unwrap` / `mapUnwrap` in `types/nullable` + to derive each throwing variant from its `try*` counterpart + [#1195](https://github.com/functionalscript/functionalscript/pull/1195) +- `types/bit_vec` / `base_n`: make many-into-one bit-vector concatenation + O(n log n) — the binary-counter accumulator is extracted into a shared + `unpackListToVec`, used by `listToVec`, `u8ListToVec`, and `stringToVec` + [#1192](https://github.com/functionalscript/functionalscript/pull/1192) diff --git a/changelog/0.35.1.md b/changelog/0.35.1.md new file mode 100644 index 000000000..f73a4cecd --- /dev/null +++ b/changelog/0.35.1.md @@ -0,0 +1,4 @@ +- `base_n`: fix `vecToString`'s O(n²) blowup on large inputs (used by + `base64.encode` and `cbase32`) — a balanced recursive split replaces the + per-chunk `popFront`, giving true O(n log n) + [#1202](https://github.com/functionalscript/functionalscript/pull/1202) diff --git a/changelog/0.35.2.md b/changelog/0.35.2.md new file mode 100644 index 000000000..8d2551dff --- /dev/null +++ b/changelog/0.35.2.md @@ -0,0 +1,4 @@ +- `crypto/sha2`: fix `append`'s O(n²) block-extraction loop — rewritten as a + fold over `chunkList`, with the config-invariant partial applications hoisted. + A 320,000-byte input drops from 3444 ms to 116 ms + [#1203](https://github.com/functionalscript/functionalscript/pull/1203) diff --git a/changelog/0.36.0.md b/changelog/0.36.0.md new file mode 100644 index 000000000..44424c146 --- /dev/null +++ b/changelog/0.36.0.md @@ -0,0 +1,23 @@ +- `cas/mcp`: **BREAKING CHANGE:** remove `type:'url'` from `cas_add` — no + purely-TypeScript check closes every symlink/TOCTOU variant on a + client-supplied path. Large content goes through the `cas` CLI instead + [#1236](https://github.com/functionalscript/functionalscript/pull/1236) +- `fsc`: use `assertEq` instead of a hand-written `if/throw` in a proof case — + an inline `if/throw` is itself a permanently-uncovered branch. Documented as + an `AGENTS.md` testing rule + [#1234](https://github.com/functionalscript/functionalscript/pull/1234) +- `base64`: fix `encode` silently producing a string for an over-`maxLength` + vector — the explicit padding step is dropped, since `baseN`'s `vecToString` + already left-pads a trailing partial chunk + [#1229](https://github.com/functionalscript/functionalscript/pull/1229) +- `fs/effects`: add the `okStep` / `mapOk` step adapters — collapses the + hand-written "error passes through, ok continues" check that recurred at five + `Effect>` call sites + [#1228](https://github.com/functionalscript/functionalscript/pull/1228) +- `js/tokenizer`: reject unescaped control characters in string literals, as + RFC 8259 §7 requires — fixed once in the shared scanner, so `fs/json`, + `fs/djs`, and `fs/js` all match `JSON.parse` + [#1218](https://github.com/functionalscript/functionalscript/pull/1218) +- `path`: export `isProperPrefix` from `fs/path/module.f.ts` — moves the pure + segment-based containment predicate out of the virtual FS `rename` handler + [#1210](https://github.com/functionalscript/functionalscript/pull/1210) diff --git a/changelog/0.37.0.md b/changelog/0.37.0.md new file mode 100644 index 000000000..3b51f8c07 --- /dev/null +++ b/changelog/0.37.0.md @@ -0,0 +1,19 @@ +- `fs/media/revision`: add the `vnd.fjs.revision` dialect — a BLOB format for + one step in the evolution of a mutable object over the immutable CAS store. + Pure format only, wired into `fs/media`'s `detect` and `cas_get` + [#1265](https://github.com/functionalscript/functionalscript/pull/1265) +- `text/utf8`: dedup the lead-byte classifier in `utf8ByteToCodePointOp` — both + dispatch copies become one `restart(prefix)` helper. Pure refactor + [#1258](https://github.com/functionalscript/functionalscript/pull/1258) +- `fs/`: **BREAKING CHANGE:** regroup top-level directories by concern — + `base64`/`base128`/`cbase32` → `fs/basen/`, `types/monoid` → `fs/common/`, + `json`/`html` → `fs/media/`, and the `fjs` CLI moves to the package root + [#1251](https://github.com/functionalscript/functionalscript/pull/1251) +- `cas/mcp`: **BREAKING CHANGE:** align the `cas_get` response with the MCP + resource-contents shape — `mime_type` → `mimeType`, `url` → `uri`, and the + inline payload moves from `content` to `text` / `blob` + [#1248](https://github.com/functionalscript/functionalscript/pull/1248) +- `nanvm-lib`: fix `BigInt` `Sub` returning the wrong sign when both operands + share a sign and `|lhs| < |rhs|` — `Add` and `Sub` now share one + `add_signed` dispatch parameterized by the effective right-hand sign + [#1220](https://github.com/functionalscript/functionalscript/pull/1220) diff --git a/changelog/0.38.0.md b/changelog/0.38.0.md new file mode 100644 index 000000000..28cae0339 --- /dev/null +++ b/changelog/0.38.0.md @@ -0,0 +1,20 @@ +- `fs/` → `fjs/`: **BREAKING CHANGE:** rename the top-level source directory, so + every published import path changes (`functionalscript/fs/…` → + `functionalscript/fjs/…`). `fs` collided with Node's built-in `fs` module + [#1316](https://github.com/functionalscript/functionalscript/pull/1316) +- `fs/media/revision`, `fs/cas/evo`: **BREAKING CHANGES:** make `snapshot` and + `generation` required in `revisionSchema`, so a revision blob is interpretable + in isolation; `addRevision` now resolves and writes both fields explicitly + [#1314](https://github.com/functionalscript/functionalscript/pull/1314) +- `fs/types/range`, `fs/bnf`: **BREAKING CHANGE:** `contains(a, b)` takes two + positional arguments instead of a `Range` tuple; `eof` becomes + `oneEncode(mask)`, and the redundant `max` constant is removed + [#1308](https://github.com/functionalscript/functionalscript/pull/1308) +- `bnf/descent`: fix `RangeError: Maximum call stack size exceeded` on + realistic-size input — the matcher is now an explicit-stack machine with + unchanged semantics and O(1) JS call-stack depth + [#1303](https://github.com/functionalscript/functionalscript/pull/1303) +- `types/uint8array`: `listToVec` now throws the descriptive + `"the array is too big"` on overflow instead of a generic `assert` failure, + matching its sibling `toVec` + [#1286](https://github.com/functionalscript/functionalscript/pull/1286) diff --git a/changelog/0.39.0.md b/changelog/0.39.0.md new file mode 100644 index 000000000..a1d40c9f8 --- /dev/null +++ b/changelog/0.39.0.md @@ -0,0 +1,51 @@ +- `fjs/cas/evo`: **BREAKING CHANGES:** add `revision(hash)` and the + `evo_revision` MCP tool — one revision, decoded, validated, and with hashes + canonicalized. `AddRevision` is renamed `RevisionData` and gains an optional + `generation` field, so a read value can be added back unchanged + [#1379](https://github.com/functionalscript/functionalscript/pull/1379) +- `fjs/effects`: add `mapStep` and the matching `Eff.map` — the functor map of + the effect monad, for the `step(e, x => pure(f(x)))` idiom. Neither widens the + operation set, since a pure projection issues no commands + [#1374](https://github.com/functionalscript/functionalscript/pull/1374) +- `fjs/effects`: **BREAKING CHANGES:** make `foldStep` and `forEachStep` step + variants — `foldStep(items, init, f)` / `forEachStep(items, f)`, with `items` + an `Effect>`, so the effect leads as in `step` and `historyStep` + [#1373](https://github.com/functionalscript/functionalscript/pull/1373) +- `fjs/types/list`: add `tryFold` and the `Accumulator` type, the + `try*`/`Nullable` sibling of `fold`; `bit_vec`'s early-exit fold driver moves + onto it [#1370](https://github.com/functionalscript/functionalscript/pull/1370) +- `fjs/effects`: **BREAKING CHANGES:** give `Do` named fields — + `{ command, payload, continuation }` replaces the numeric keys `0` / `1` / `2` + [#1368](https://github.com/functionalscript/functionalscript/pull/1368) +- `fjs/effects`: **BREAKING CHANGES:** remove `decode` and `Decoded`; + `typeof e === 'function'` already discriminates. Add + `runPure(e): Option` for callers that only want a pure effect's value + [#1368](https://github.com/functionalscript/functionalscript/pull/1368) +- `fjs/effects`: **BREAKING CHANGES:** replace `Frame` / `frameStep` with + `History`, `history`, and `historyStep` — a flat, newest-first tuple + instead of a nested chain, so `historyStep` composes at any depth + [#1367](https://github.com/functionalscript/functionalscript/pull/1367) +- `fjs/effects`: **BREAKING CHANGES:** remove the `lazy` constructor — `Pure`'s + thunk is a discriminator, not a suspension, so `lazy` was the identity + function. Use `pure(v)`, or a `Do` node for work deferred to a runner + [#1360](https://github.com/functionalscript/functionalscript/pull/1360) +- `fjs/effects/eff`: `Eff.step(f)` now also passes every prior value in the + chain to `f`, most recent first (`f(t, ...history)`), via a new `P` type + parameter on `Eff` that accumulates one element per `.step` call + [#1360](https://github.com/functionalscript/functionalscript/pull/1360) +- `fjs/effects`: add `frameStep` and `Frame` — `frameStep` captures the + call it makes as `{ result, param }` instead of discarding the parameter + [#1361](https://github.com/functionalscript/functionalscript/pull/1361) +- `fjs/effects`: **BREAKING CHANGE:** an `Effect` is now the raw value — a + `Pure` thunk or a `Do` node — instead of a `{ value, step }` wrapper. + Composition moves to the external `step(e, f)`; `eff(value)` is added for + method chaining + [#1354](https://github.com/functionalscript/functionalscript/pull/1354) +- `fjs/ci`: **BREAKING CHANGE:** drop the trailing `git reset --hard && git + clean -fdx` step from the generated jobs (a no-op on ephemeral runners) and + remove the `clean` helper from `fjs/ci/common/module.f.ts` + [#1353](https://github.com/functionalscript/functionalscript/pull/1353) +- `fjs/ci`: generated CI guards against stale committed generated files — the + Node 26 job runs `npm run ci-update` after `npm ci` and fails when the + committed tree no longer matches the generator's output + [#1346](https://github.com/functionalscript/functionalscript/pull/1346) diff --git a/changelog/0.4.0.md b/changelog/0.4.0.md new file mode 100644 index 000000000..200a2229a --- /dev/null +++ b/changelog/0.4.0.md @@ -0,0 +1,2 @@ +- COM and CommonJS modules are retired + [#367](https://github.com/functionalscript/functionalscript/pull/367) diff --git a/changelog/0.4.1.md b/changelog/0.4.1.md new file mode 100644 index 000000000..493d0907d --- /dev/null +++ b/changelog/0.4.1.md @@ -0,0 +1,2 @@ +- Faster `types/big_int/log2` algorithm + [#365](https://github.com/functionalscript/functionalscript/pull/365) diff --git a/changelog/0.4.2.md b/changelog/0.4.2.md new file mode 100644 index 000000000..db640d636 --- /dev/null +++ b/changelog/0.4.2.md @@ -0,0 +1,2 @@ +- Faster `types/big_int/log2` algorithm for WebKit (Bun and Safari) + [#368](https://github.com/functionalscript/functionalscript/pull/368) diff --git a/changelog/0.4.3.md b/changelog/0.4.3.md new file mode 100644 index 000000000..a7f2576be --- /dev/null +++ b/changelog/0.4.3.md @@ -0,0 +1,2 @@ +- Implementation of HMAC + [#371](https://github.com/functionalscript/functionalscript/pull/371) diff --git a/changelog/0.40.0.md b/changelog/0.40.0.md new file mode 100644 index 000000000..34cbe5f2f --- /dev/null +++ b/changelog/0.40.0.md @@ -0,0 +1,42 @@ +- **BREAKING CHANGES:** remove the Playwright integration, which ran proofs in a + Node worker rather than in a browser: no `@playwright/test` dependency, no + `playwright` CI job, engine, test context, or scenario runner + [#1414](https://github.com/functionalscript/functionalscript/pull/1414) +- **BREAKING CHANGES:** `fjs/bnf/descent`: match results are now the record + `{ ast, success, idx, failure? }` instead of a tuple. `failure` is present only + on a failed match and holds the furthest position a terminal was rejected at + plus the terminals expected there — a failed result's own index rewinds and + cannot locate an error + [#1412](https://github.com/functionalscript/functionalscript/pull/1412) +- **BREAKING CHANGES:** `@playwright/test` moves to `1.59.1` to match the pinned + Nixpkgs snapshot, which now provides the `playwright` CI job's browsers — the + job runs in a generated Nix flake instead of installing them + [#1409](https://github.com/functionalscript/functionalscript/pull/1409) +- `fjs/ci`: generate one self-contained `nix/generated//flake.nix` per + canonical Node job, pinning an exact Nixpkgs commit; `npm run ci-update` + writes them without running Nix + [#1398](https://github.com/functionalscript/functionalscript/pull/1398) +- **BREAKING CHANGES:** `range_map`'s exported `get` and `fromRange` take the + map/default-value first and the queried number/range last. Add + `fjs/types/range_set`, a boolean-valued `range_map` wrapper + [#1402](https://github.com/functionalscript/functionalscript/pull/1402) +- **BREAKING CHANGES:** decouple the FJS MCP server from CAS: generic MCP + moves `fjs/mcp/` → `fjs/protocol/mcp/`, JSON-RPC moves + `fjs/media/json/rpc/` → `fjs/protocol/json_rpc/`, and the CAS tool registry + moves `fjs/cas/mcp/` → `fjs/mcp/cas/` (with `fjs/cas/evo/mcp/` → + `fjs/mcp/evo/`); the server's new composition root lives at `fjs/mcp/` + [#1401](https://github.com/functionalscript/functionalscript/pull/1401) +- `fjs/media/nix`: add a minimal checked Nix eDSL and deterministic chunk serializer + [#1397](https://github.com/functionalscript/functionalscript/pull/1397) +- `fjs/effects/node`: **BREAKING CHANGES:** detect Deno as the new `'deno'` + `Engine` variant and make external tests on Node 22–25 use the inline + `expectFailure` compatibility strategy + [#1393](https://github.com/functionalscript/functionalscript/pull/1393) +- `package.json`: drop `npm-check-updates` from `npm run update` entirely — it + now only reinstalls/relocks; `package.json` devDependency bumps are manual + for now + [#1392](https://github.com/functionalscript/functionalscript/pull/1392) +- `package.json`: pin `@playwright/test` exactly (`=1.62.0`) and exclude it from + `npm run update`'s `npm-check-updates` pass, so the pinned test runner version + survives routine dependency updates + [#1391](https://github.com/functionalscript/functionalscript/pull/1391) diff --git a/changelog/0.41.0.md b/changelog/0.41.0.md new file mode 100644 index 000000000..12de3d2b7 --- /dev/null +++ b/changelog/0.41.0.md @@ -0,0 +1,8 @@ +- `fjs/effects`: `match` resolves a command's handler with an own-property + lookup, so a `command` naming an `Object.prototype` member (`constructor`, + `toString`, …) throws instead of dispatching to the inherited function + [#1421](https://github.com/functionalscript/functionalscript/pull/1421) +- **BREAKING CHANGES:** `Evo.list` and the `evo_list` MCP tool take an optional + `archived?: true` filter and list active subjects by default — those with at + least one current head that is not archived — instead of every subject + [#1415](https://github.com/functionalscript/functionalscript/pull/1415) diff --git a/changelog/0.42.0.md b/changelog/0.42.0.md new file mode 100644 index 000000000..48b9d471a --- /dev/null +++ b/changelog/0.42.0.md @@ -0,0 +1,31 @@ +- `fjs/media/json`: `stringSerialize` escapes in FunctionalScript instead of + calling the host's `JSON.stringify`, matching it exactly down to `\uXXXX` for + unpaired surrogates; `fjs/text/utf16` gains `codePointToString` + [#1438](https://github.com/functionalscript/functionalscript/pull/1438) +- `fjs/djs`: the parser no longer spends a call-stack frame per container — + the same lazy `drop(1)` pop that #1435 fixed in `fjs/media/json` + [#1436](https://github.com/functionalscript/functionalscript/pull/1436) +- `fjs/media/json`: `parse` no longer overflows the call stack on documents + with ~5000 or more sibling containers; the parser stack is popped eagerly + instead of through a lazy `drop(1)` chain + [#1435](https://github.com/functionalscript/functionalscript/pull/1435) +- **BREAKING CHANGES:** `fjs/media/json` no longer exports `parseNative`. Parse + JSON with the total `parse` — `unwrap(parse(text))` — and narrow the result + with an rtti schema instead of an `as` cast + [#1433](https://github.com/functionalscript/functionalscript/pull/1433) +- `nanvm-lib`: add native-JS multiplication proofs matching the Rust coercion + cases [#1429](https://github.com/functionalscript/functionalscript/pull/1429) +- **BREAKING CHANGES:** `fjs/media` `detect` takes the dialects to recognize — + `detect(dialects)(bytes)`. `dialectEntry(schema, extraValidate?)` builds an + entry, `fjs/media/revision` exports `revisionDialect`, and no dialect is + hardcoded any more + [#1428](https://github.com/functionalscript/functionalscript/pull/1428) +- **BREAKING CHANGES:** `fjs/media/json` `parse` is now the total + `(text: string) => Result` built on this module's own + tokenizer and parser; the throwing `JSON.parse` export is renamed + `parseNative` + [#1428](https://github.com/functionalscript/functionalscript/pull/1428) +- Test and coverage tooling recognizes authored `.f.mjs` FunctionalScript + modules: proof discovery loads them, and `npm run cov`, `deno task cov`, and + the generated Deno CI step include `module.f.mjs` alongside `module.f.ts` + [#1422](https://github.com/functionalscript/functionalscript/pull/1422) diff --git a/changelog/0.43.0.md b/changelog/0.43.0.md new file mode 100644 index 000000000..a47bb2447 --- /dev/null +++ b/changelog/0.43.0.md @@ -0,0 +1,4 @@ +- **BREAKING CHANGES:** `fjs/types/object`: `StringMap` takes one type + argument, the open-key-set record; a finite key set is `RequiredMap` or + `OptionalMap`. `Map` is removed — it was `StringMap` + [#1442](https://github.com/functionalscript/functionalscript/pull/1442) diff --git a/changelog/0.43.1.md b/changelog/0.43.1.md new file mode 100644 index 000000000..285137509 --- /dev/null +++ b/changelog/0.43.1.md @@ -0,0 +1,3 @@ +- `vnd.fjs.revision` gains optional flat subject-to-content lock maps; Evo + validates and canonicalizes their hashes, and revision JSON is serialized + canonically for stable CAS addresses [#1447](https://github.com/functionalscript/functionalscript/pull/1447) diff --git a/changelog/0.44.0.md b/changelog/0.44.0.md new file mode 100644 index 000000000..57cd81e5c --- /dev/null +++ b/changelog/0.44.0.md @@ -0,0 +1,798 @@ +- **BREAKING CHANGES:** `fjs/ci/deno` no longer exports `coverageInclude`. + The Deno CI job runs `deno task cov`, so `deno.json` owns the coverage + filter, matching how the Node jobs leave `npm run cov` to `package.json` + [#1512](https://github.com/functionalscript/functionalscript/pull/1512) +- `npm run cov` names its test entrypoint instead of relying on + `node --test` default discovery, which silently reported no tests on some + Node versions. The dead `.f.ts` extension is dropped from the Node and + Deno coverage filters + [#1512](https://github.com/functionalscript/functionalscript/pull/1512) +- **BREAKING CHANGES:** `fjs/djs/examples/input.f.ts` and + `fjs/djs/examples/m.f.ts` migrate to `.f.mjs`. Being `.mjs` they now + ship in the tarball, which `.f.ts` did not + [#1505](https://github.com/functionalscript/functionalscript/pull/1505) +- **BREAKING CHANGES:** `fjs/types/nominal/proof.f.ts` migrates to + `.f.mjs`. Its two `unique symbol` brands move to `types.ts`, exported + as `_SymbolKeyBranded` and `_SymbolIntersectionBranded` + [#1505](https://github.com/functionalscript/functionalscript/pull/1505) +- **BREAKING CHANGES:** `fjs/types/ts/proof.f.ts` migrates to `.f.mjs`. + Its `declare const` index-signature block moves to `types.ts`, + non-exported, so no public type changes + [#1505](https://github.com/functionalscript/functionalscript/pull/1505) +- **BREAKING CHANGES:** `fjs/emergent_testing/example.f.ts` migrates + from authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) — the + four typed consts become JSDoc `@type` annotations + [#1505](https://github.com/functionalscript/functionalscript/pull/1505) +- **BREAKING CHANGES:** `fjs/types/rtti/validate/proof.f.ts` migrates to + `.f.mjs` — 23 compile-time round-trips stay function-local as JSDoc + `@typedef`s and are not emitted + [#1505](https://github.com/functionalscript/functionalscript/pull/1505) +- **BREAKING CHANGES:** `fjs/types/rtti/parse/proof.f.ts` migrates to + `.f.mjs` — compile-time round-trips stay function-local as JSDoc + `@typedef`s and are not emitted + [#1505](https://github.com/functionalscript/functionalscript/pull/1505) +- **BREAKING CHANGES:** `fjs/emergent_testing/proof.f.ts` migrates to + `.f.mjs`. Six module-local types become `_`-prefixed `@typedef`s, as a + JSDoc `@typedef` has no non-exported form + [#1505](https://github.com/functionalscript/functionalscript/pull/1505) +- **BREAKING CHANGES:** `fjs/effects/node/proof.f.ts` migrates to + `.f.mjs` — explicit generic instantiations become checked `@type` + declarations, as JSDoc has no call-site form + [#1505](https://github.com/functionalscript/functionalscript/pull/1505) +- **BREAKING CHANGES:** `fjs/js/tokenizer/proof.f.ts` migrates to + `.f.mjs` — typed consts become JSDoc `@type` annotations + [#1505](https://github.com/functionalscript/functionalscript/pull/1505) +- **BREAKING CHANGES:** `fjs/media/json/parser/proof.f.ts` migrates to + `.f.mjs` — the typed const becomes a JSDoc `@type` annotation + [#1505](https://github.com/functionalscript/functionalscript/pull/1505) +- **BREAKING CHANGES:** `todo/proof.f.ts` migrates to `.f.mjs`. The + `TemplateType` alias is renamed `_TemplateType`: it was never exported, + but a JSDoc `@typedef` has no non-exported form + [#1505](https://github.com/functionalscript/functionalscript/pull/1505) +- **BREAKING CHANGES:** `fjs/media/json/tokenizer/proof.f.ts` migrates + from authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) — the + typed `tokenizeString` const becomes a JSDoc `@type` annotation, and + the `JsonToken` type import becomes an `@import` + [#1504](https://github.com/functionalscript/functionalscript/pull/1504) +- **BREAKING CHANGES:** `fjs/media/json/proof.f.ts` migrates from + authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) — two nested + `as unknown as null` double-casts become nested inline `@type` casts + [#1504](https://github.com/functionalscript/functionalscript/pull/1504) +- **BREAKING CHANGES:** `fjs/effects/proof.f.ts` and + `fjs/effects/eff/proof.f.ts` migrate from authored TypeScript to + JSDoc-typed JavaScript (`.f.mjs`) — explicit generic instantiations + (`match(...)`, `do_('add')`, `pure([])`, `okStep(...)`, + `error(...)`) become inline `@type` casts, per convention; + `assertPure`'s generic function becomes a `@template`/`@param` block; + the local `AddOp`/`AnyOp` types are renamed `_AddOp`/`_AnyOp` (neither + was previously exported, but a JSDoc `@typedef` has no non-exported + form). `fjs/effects/eff/proof.f.mjs` updates its import of + `assertPure` accordingly + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/text/utf8/proof.f.ts` migrates from + authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) — no type + annotations to convert + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/text/utf16/proof.f.ts` migrates from + authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/ci/proof.f.ts` migrates from authored + TypeScript to JSDoc-typed JavaScript (`.f.mjs`) + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/types/btree/remove/proof.f.ts` migrates + from authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/types/btree/set/proof.f.ts` migrates from + authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/cli/proof.f.ts` migrates from authored + TypeScript to JSDoc-typed JavaScript (`.f.mjs`) + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/ci/nix/proof.f.ts` migrates from authored + TypeScript to JSDoc-typed JavaScript (`.f.mjs`) + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/types/range_map/proof.f.ts` migrates from + authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/types/list/proof.f.ts` migrates from + authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/types/btree/find/proof.f.ts` migrates from + authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/types/btree/proof.f.ts` migrates from + authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/types/byte_set/proof.f.ts` migrates from + authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/effects/memory/proof.f.ts` migrates from + authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) — the local + `MemoryState` type is renamed `_MemoryState` (it was never exported, but + a JSDoc `@typedef` has no non-exported form) + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/types/sorted_set/proof.f.ts` migrates from + authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/text/proof.f.ts` migrates from authored + TypeScript to JSDoc-typed JavaScript (`.f.mjs`) + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/types/sorted_list/proof.f.ts` migrates from + authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/website/proof.f.ts` migrates from authored + TypeScript to JSDoc-typed JavaScript (`.f.mjs`) — no type annotations + to convert + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/types/bit_vec/proof.f.ts` migrates from + authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/types/bigint/proof.f.ts` migrates from + authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) — the local + `Benchmark` type is renamed `_Benchmark` (it was never exported, but + a JSDoc `@typedef` has no non-exported form) + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/fsc/proof.f.ts` migrates from authored + TypeScript to JSDoc-typed JavaScript (`.f.mjs`) + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/dev/update/proof.f.ts` migrates from + authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/djs/ast/proof.f.ts` migrates from authored + TypeScript to JSDoc-typed JavaScript (`.f.mjs`) — no type annotations + to convert + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/crypto/sha2/proof.f.ts` migrates from + authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/crypto/pow/proof.f.ts` migrates from + authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/text/code_point/proof.f.ts` migrates from + authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/types/array/proof.f.ts` migrates from + authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/types/function/operator/proof.f.ts` migrates + from authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/common/monoid/proof.f.ts` migrates from + authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/text/sgr/proof.f.ts` migrates from authored + TypeScript to JSDoc-typed JavaScript (`.f.mjs`) + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/text/ascii/proof.f.ts` migrates from authored + TypeScript to JSDoc-typed JavaScript (`.f.mjs`) — no type annotations to + convert + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/module.ts` (the `fjs` CLI entry point) migrates + to `fjs/module.mjs`, per the `module.ts -> module.mjs` stage-1 mapping. + `package.json`'s `bin.fjs` now points directly at the authored `.mjs` + (dropping the compiled-`.js` indirection, since `.mjs` already ships in + the npm package) and its `test`/`start`/`ci-update`/`dev-update`/ + `index-html` scripts, and `deno.json`'s `fjs` task, are updated + accordingly + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/effects/node/module.ts` (the Node.js effect + runner — `runEffect`, `run`) migrates from authored TypeScript to + JSDoc-typed JavaScript, per the `module.ts -> module.mjs` stage-1 + mapping — the local `Server`, `Readable`, `IncomingMessage`, + `ServerResponse`, `RequestListener`, `EffectToPromise`, and + `FrameworkRegister` types are renamed `_Server`, `_Readable`, + `_IncomingMessage`, `_ServerResponse`, `_RequestListener`, + `_EffectToPromise`, `_FrameworkRegister` (none were previously + exported, but a JSDoc `@typedef` has no non-exported form; the + `_`-prefix also avoids a same-name collision with the differently-shaped + public `Server`/`IncomingMessage`/`ServerResponse`/`RequestListener` + types in the sibling `fjs/effects/node/types.ts`). + Importers must use the `.mjs` specifier. Updates `fjs/module.ts` and + `fjs/emergent_testing/all.test.ts` accordingly. Also fixes two stale + `fjs/mcp/module.f.ts` / `fjs/protocol/mcp/module.f.ts` doc-comment + references (left over from earlier commits in this PR) to their + current `.f.mjs` paths + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/effects/node/memory/module.ts` and `proof` + migrate from authored TypeScript to JSDoc-typed JavaScript, per the + `module.ts -> module.mjs` stage-1 mapping — no local complex types to + split (`MemoryOperationMap`/`Uuid` are only used internally). + Importers must use the `.mjs` specifier. Updates + `fjs/effects/node/module.ts` accordingly + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/effects/module.ts` (`asyncRun`) and + `fjs/types/result/module.ts` (`tryCatch`, `asyncTryCatch`) migrate + from authored TypeScript to JSDoc-typed JavaScript, per the + `module.ts -> module.mjs` stage-1 mapping (these are plain `.ts` + implementation modules, not `.f.ts`). Importers must use the `.mjs` + specifier. Updates `fjs/effects/node/module.ts`, + `fjs/effects/node/memory/module.ts`, and + `fjs/effects/node/memory/proof.ts` accordingly + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/module` and `proof` (the top-level + FunctionalScript compiler entry point and command dispatcher) migrate + from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript + (`.f.mjs`) — no local complex types to split. Importers must use the + `.f.mjs` specifier. Updates `fjs/module.ts`'s import accordingly + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/mcp/cas/module` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — the local + `Meta` type is renamed `_Meta` (it was never exported, but a JSDoc + `@typedef` has no non-exported form). Importers must use the `.f.mjs` + specifier. Updates `fjs/mcp/module.f.ts` accordingly + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/mcp/evo/module` and `proof` migrate from + authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — + no local types to split (`evoToolRegistry` is the only export beyond + the four rtti schema consts). Importers must use the `.f.mjs` + specifier. Updates `fjs/mcp/module.f.ts` accordingly + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/protocol/mcp/module` and `proof` migrate + from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), + moving `Implementation`, `ServerCapabilities`, `InitializeParams`, + `InitializeResult`, `TextContent`, `BlobResource`, `EmbeddedResource`, + `ContentItem`, `Tool`, `ToolsListParams`, `ToolsListResult`, + `ToolsCallParams`, `ToolsCallResult`, `McpHandlers`, `ToolEntry`, + `Handle`, `Uninitialized`, `Initializing`, `InitializedState`, + `McpSessionState`, and `McpConfig` into a sibling `types.ts` — + importers must use the `.f.mjs` specifier for the runtime values and + the `types.ts` specifier for the types. Updates `fjs/mcp/evo/module.f.ts`, + `fjs/mcp/evo/proof.f.ts`, `fjs/mcp/module.f.ts`, `fjs/mcp/cas/module.f.ts`, + and `fjs/mcp/proof.f.ts` accordingly + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/media/json/schema/module` and `proof` + migrate from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript + (`.f.mjs`) — `Unknown` stays as a JSDoc typedef in the module (no + separate `types.ts`, no external importers of the type); the local + `UnknownConst` type is renamed `_UnknownConst` (it was never exported, + but a JSDoc `@typedef` has no non-exported form). Importers must use + the `.f.mjs` specifier. Updates `fjs/protocol/mcp/module.f.ts` + accordingly + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/mcp/module` and `proof` migrate from + authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — + no local complex types to split (`casMcpHandlers`, `casConfig`, and + `casMcpServer` are the only exports). Importers must use the `.f.mjs` + specifier. Updates `fjs/module.f.ts` accordingly + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/djs/module` and `proof` migrate from + authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — + `Object`, `Array`, `Primitive`, and `Unknown` no longer re-export from + the module; importers must use `fjs/djs/types.ts` directly (this + completes the extraction started when those types moved out of + `fjs/djs/module.f.ts` earlier in this PR). Updates + `fjs/types/rtti/validate/proof.f.ts`, `fjs/types/rtti/parse/proof.f.ts`, + `fjs/media/json/schema/module.f.ts`, and `fjs/module.f.ts` accordingly + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/djs/transpiler/module` and `proof` migrate + from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) + — `ParseContext` and `djsResult` stay as JSDoc typedefs in the module + (no separate `types.ts`, no external importers of the types). Importers + must use the `.f.mjs` specifier. Updates `fjs/djs/module.f.ts` + accordingly + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/djs/parser/module` and `proof` migrate from + authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), + moving `ParseError` into a sibling `types.ts` — importers must use the + `.f.mjs` specifier for the runtime value and the `types.ts` specifier + for the type. Updates `fjs/djs/transpiler/module.f.ts` accordingly + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/djs/tokenizer/module` and `proof` migrate + from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), + moving `DjsToken` and `DjsTokenWithMetadata` into a sibling `types.ts` + — importers must use the `.f.mjs` specifier for the runtime values and + the `types.ts` specifier for the types. Updates + `fjs/djs/parser/module.f.ts`, `fjs/djs/parser/proof.f.ts`, and + `fjs/djs/transpiler/module.f.ts` accordingly + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/djs/serializer/module` and `proof` migrate + from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) + — `MapEntries`, `RefCounter`, `Refs`, `GetConstsState`, and `RefLookup` + stay as `_`-prefixed JSDoc typedefs in the module (no separate + `types.ts`, no external importers of the types). Importers must use the + `.f.mjs` specifier. Updates `fjs/djs/module.f.ts`, + `fjs/djs/tokenizer/module.f.ts`, and six proof files + (`fjs/djs/ast`, `fjs/djs/parser`, `fjs/djs/tokenizer`, + `fjs/djs/transpiler`, `fjs/js/tokenizer`, `fjs/media/json/tokenizer`) + accordingly + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/protocol/json_rpc/module`'s `id` schema const + is renamed to `_id` — it crosses into the sibling `types.ts` (as + `typeof _id`) but was never meant to be a public runtime export, so the + `_` prefix marks it private-by-convention like the equivalent case in + `fjs/media/revision/module`'s `_lock`. `fjs/media/module`'s CHANGELOG + entry below is corrected: it no longer claims `fjs/media/proof.f.ts` + stays TypeScript, since this PR migrates it (see the next entry). Also + adds the required `@module` header to four `types.ts` files added + earlier in this PR that were missing one (`fjs/cas/evo/types.ts`, + `fjs/media/types.ts`, `fjs/media/revision/types.ts`, + `fjs/protocol/json_rpc/types.ts`) + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/media/proof.f.ts` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — no local + types to split + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/djs/ast/module` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), moving + `AstModule`, `AstConst`, `AstModuleRef`, `AstArray`, `AstObject`, and + `AstBody` into a sibling `types.ts` — importers must use the `.f.mjs` + specifier for the runtime value and the `types.ts` specifier for the + types. `fjs/djs`'s own recursive `Primitive`/`Object`/`Array`/`Unknown` + types move out of `fjs/djs/module.f.ts` into a new sibling + `fjs/djs/types.ts` (hand-authored, following the pattern + `fjs/media/json/types.ts` established), with `fjs/djs/module.f.ts` + re-exporting them — `fjs/djs/module.f.ts` itself stays TypeScript for + now, since it still depends on `fjs/djs/serializer` and + `fjs/djs/transpiler`, neither yet migrated. Updates + `fjs/djs/ast/proof.f.ts`, `fjs/djs/parser/module.f.ts`, and + `fjs/djs/transpiler/module.f.ts` accordingly + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/cas/evo/module` and `proof` migrate from + authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), + moving `Hash`, `Subject`, `RevisionData`, `SubjectState`, `Cache`, and + `Evo` into a sibling `types.ts` — importers must use the `.f.mjs` + specifier for the runtime values and the `types.ts` specifier for the + types. Updates `fjs/mcp/evo/module`, `fjs/mcp/evo/proof.f.ts`, + `fjs/mcp/module`, `fjs/mcp/cas/module`, and `fjs/mcp/proof.f.ts` + accordingly + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/protocol/mcp/stdio/module` and `proof` migrate + from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — + `Step` stays as a JSDoc typedef in the module (no separate `types.ts`, no + external importers of the type). Importers must use the `.f.mjs` + specifier. Updates `fjs/mcp/module` and `fjs/mcp/proof.f.ts` accordingly + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/media/revision/module` and `proof` migrate + from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), + moving `LockMap`, `Revision`, and `RevisionError` into a sibling + `types.ts` — importers must use the `.f.mjs` specifier for the runtime + values and the `types.ts` specifier for the types. Updates + `fjs/cas/evo/module`, `fjs/cas/evo/proof.f.ts`, `fjs/mcp/cas/module`, + `fjs/mcp/proof.f.ts`, and `fjs/media/proof.f.ts` accordingly + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/protocol/json_rpc/module` and `proof` migrate + from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), + moving `Id`, `Request`, `RpcError`, `Response`, `Handler`, and `Handlers` + into a sibling `types.ts` — importers must use the `.f.mjs` specifier for + the runtime values and the `types.ts` specifier for the types. Updates + `fjs/protocol/mcp/module`, `fjs/protocol/mcp/stdio/module`, + `fjs/protocol/mcp/stdio/proof.f.ts`, and `fjs/mcp/proof.f.ts` accordingly + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/media/module` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), moving + `DialectEntry` into a sibling `types.ts` — importers must use the + `.f.mjs` specifier for the runtime value and the `types.ts` specifier + for the type. Updates `fjs/media/revision/module` and + `fjs/mcp/cas/module` accordingly + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/fsm/module` and `proof` migrate from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — `Grammar` stays + as a JSDoc typedef in the module (no separate `types.ts`, no external + importers of the type). Importers must use the `.f.mjs` specifier + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- **BREAKING CHANGES:** `fjs/dev/package_json/module` and `proof` migrate + from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — + `PackageJson` and `JsonTextError` stay as JSDoc typedefs in the module + (no separate `types.ts`, no external importers of the types). Importers + must use the `.f.mjs` specifier + [#1503](https://github.com/functionalscript/functionalscript/pull/1503) +- `nanvm-lib` operator behaviour is described once, as data, in + `fjs/nanvm/module.f.mjs`: the JavaScript proof and the generated + Rust tests both read it, so a case is written once instead of twice + [#1489](https://github.com/functionalscript/functionalscript/pull/1489) +- **BREAKING CHANGES:** `fjs/bnf/proof` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — no local + types to split. Importers must use the `.f.mjs` specifier + [#1501](https://github.com/functionalscript/functionalscript/pull/1501) +- **BREAKING CHANGES:** `fjs/media/json/module` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), moving + `Entry`, `_Entries`, and `_MapEntries` into the sibling `types.ts` — + importers must use the `.f.mjs` specifier for the runtime value and + the `types.ts` specifier for the types. This pulls in four more + files that depend on it directly or transitively: `fjs/bnf/testlib`, + `fjs/bnf/data/proof`, `fjs/bnf/descent/proof`, and `fjs/bnf/ll1/proof` + all migrate to `.f.mjs` as well, with no local types to split + [#1501](https://github.com/functionalscript/functionalscript/pull/1501) +- **BREAKING CHANGES:** `fjs/media/json/parser` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) under the + stage-1 TypeScript-to-mjs migration, splitting `_JsonObject`, + `_JsonArray`, `_JsonStack`, `_StateParse`, and `_JsonState` into a + sibling `types.ts` — importers must use the `.f.mjs` specifier for the + runtime value and the `types.ts` specifier for the types. `proof.f.ts` + stays TypeScript for now (it depends on `fjs/media/json/module.f.ts`, + still unmigrated) + [#1499](https://github.com/functionalscript/functionalscript/pull/1499) +- **BREAKING CHANGES:** the JSON rtti schemas `primitive`, `unknown`, + `object`, and `array` move from `fjs/media/json/module.f.ts` to a new + JSDoc-typed `fjs/media/json/rtti/module.f.mjs`, and the `Primitive`, + `Unknown`, `Object`, and `Array` types to a sibling + `fjs/media/json/types.ts` — importers must use the `rtti/module.f.mjs` + specifier for the schemas and the `types.ts` specifier for the types. + `fjs/media/json/module.f.ts` stays TypeScript and no longer re-exports + either + [#1498](https://github.com/functionalscript/functionalscript/pull/1498) +- **BREAKING CHANGES:** `fjs/fsc/json.f.ts` and `fjs/fsc/bnf.f.ts` migrate + from authored TypeScript to JSDoc-typed JavaScript (`.f.mjs`) — no + local types to split, both use only `Rule`/`TerminalRange` from + `fjs/bnf/types.ts`. Importers must use the `.f.mjs` specifier + [#1494](https://github.com/functionalscript/functionalscript/pull/1494) +- **BREAKING CHANGES:** `fjs/media/json/tokenizer` migrates from + authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), + splitting `JsonToken` and the internal `_ScanState`/`_ScanInput` + types into a sibling `types.ts` — importers must use the `.f.mjs` + specifier for runtime values and the `types.ts` specifier for types. + `proof.f.ts` stays TypeScript for now (it depends on + `djs/serializer/module.f.ts`, still unmigrated) + [#1494](https://github.com/functionalscript/functionalscript/pull/1494) +- **BREAKING CHANGES:** `fjs/js/tokenizer/module.f.ts` migrates from + authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), + splitting `StringToken`, `NumberToken`, `BigIntToken`, `ErrorToken`, + `WhitespaceToken`, `NewLineToken`, `IdToken`, `CommentToken`, + `EofToken`, `JsToken`, `TokenMetadata`, `JsTokenWithMetadata`, and a + large set of internal state-machine types into a sibling `types.ts` — + importers must use the `.f.mjs` specifier for runtime values and the + `types.ts` specifier for types. `proof.f.ts` stays TypeScript for now + (it depends on `djs/serializer/module.f.ts`, still unmigrated) + [#1494](https://github.com/functionalscript/functionalscript/pull/1494) +- **BREAKING CHANGES:** `fjs/emergent_testing/module.f.ts` migrates from + authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), + splitting `TestFn`, `TestEntry`, `TestSet`, `Path`, `Reporter`, and the + internal `_TestState`/`_TestAndPath` types into a sibling `types.ts` — + importers must use the `.f.mjs` specifier for runtime values and the + `types.ts` specifier for types. `proof.f.ts` stays TypeScript for now + (it depends on `media/json/module.f.ts`, still unmigrated) + [#1494](https://github.com/functionalscript/functionalscript/pull/1494) +- **BREAKING CHANGES:** `fjs/cas/cli` migrates from authored TypeScript + (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — no local types to + split. `proof.f.ts` migrates alongside it. Importers must use the + `.f.mjs` specifier + [#1494](https://github.com/functionalscript/functionalscript/pull/1494) +- **BREAKING CHANGES:** `fjs/cas` migrates from authored TypeScript + (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting `Cas`, + `FileCas`, and `FileCasOperation` into a sibling `types.ts` — + importers must use the `.f.mjs` specifier for runtime values and the + `types.ts` specifier for types. `proof.f.ts` migrates alongside it + [#1494](https://github.com/functionalscript/functionalscript/pull/1494) +- **BREAKING CHANGES:** `fjs/dev` migrates from authored TypeScript + (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting `Module`, + `ModuleMap`, and `LoadModuleOperations` into a sibling `types.ts` — + importers must use the `.f.mjs` specifier for runtime values and the + `types.ts` specifier for types. `proof.f.ts` migrates alongside it + [#1494](https://github.com/functionalscript/functionalscript/pull/1494) +- **BREAKING CHANGES:** `fjs/effects/node/virtual` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting + `Dir`, `State`, and `JsModule` into a sibling `types.ts`, and narrowing + the previously-exported `Entity` to the internal `_Entity` — importers + must use the `.f.mjs` specifier for runtime values and the `types.ts` + specifier for types. `proof.f.ts` migrates alongside it + [#1494](https://github.com/functionalscript/functionalscript/pull/1494) +- **BREAKING CHANGES:** `fjs/media/type` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting + `DetectState`, `DetectMeta`, and the internal `_Signature`/`_MagicState`/ + `_Utf8Detect` types into a sibling `types.ts` — importers must use the + `.f.mjs` specifier for runtime values and the `types.ts` specifier for + types. `proof.f.ts` migrates alongside it + [#1493](https://github.com/functionalscript/functionalscript/pull/1493) +- **BREAKING CHANGES:** `fjs/ci/module.f.ts` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting + the `Setup` type into a sibling `types.ts` — importers must use the + `.f.mjs` specifier for runtime values and the `types.ts` specifier + for types. `proof.f.ts` stays TypeScript for now + [#1493](https://github.com/functionalscript/functionalscript/pull/1493) +- **BREAKING CHANGES:** `fjs/ci/node` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — no local + types to split. `proof.f.ts` migrates alongside it. Importers must + use the `.f.mjs` specifier + [#1493](https://github.com/functionalscript/functionalscript/pull/1493) +- **BREAKING CHANGES:** `fjs/ci/nix` migrates from authored TypeScript + (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting the + `NixJob` type into a sibling `types.ts` — importers must use the + `.f.mjs` specifier for runtime values and the `types.ts` specifier + for types. `proof.f.ts` stays TypeScript for now + [#1493](https://github.com/functionalscript/functionalscript/pull/1493) +- **BREAKING CHANGES:** `fjs/cli` migrates from authored TypeScript + (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting its + type-level API into a sibling `types.ts` — importers must use the + `.f.mjs` specifier for runtime values and the `types.ts` specifier + for types. `proof.f.ts` stays TypeScript for now + [#1491](https://github.com/functionalscript/functionalscript/pull/1491) +- **BREAKING CHANGES:** `fjs/website` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — importers + must use the `.f.mjs` specifier. `proof.f.ts` stays TypeScript for + now + [#1491](https://github.com/functionalscript/functionalscript/pull/1491) +- **BREAKING CHANGES:** `fjs/dev/update` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — importers + must use the `.f.mjs` specifier. `proof.f.ts` stays TypeScript for + now + [#1491](https://github.com/functionalscript/functionalscript/pull/1491) +- **BREAKING CHANGES:** `fjs/text/sgr` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting + its type-level API into a sibling `types.ts` — importers must use + the `.f.mjs` specifier for runtime values and the `types.ts` + specifier for types. `proof.f.ts` stays TypeScript for now + [#1488](https://github.com/functionalscript/functionalscript/pull/1488) +- **BREAKING CHANGES:** `fjs/effects/node/module.f.ts` migrates from + authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), + splitting its type-level API into a sibling `types.ts` — importers + must use the `.f.mjs` specifier for runtime values and the + `types.ts` specifier for types. Updates 26 dependents across the + repo; `proof.f.ts` stays TypeScript for now + [#1488](https://github.com/functionalscript/functionalscript/pull/1488) +- **BREAKING CHANGES:** `fjs/effects/eff` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting + the `Eff` type into a sibling `types.ts` — importers must use the + `.f.mjs` specifier for runtime values and the `types.ts` specifier + for types. `proof.f.ts` stays TypeScript for now + [#1488](https://github.com/functionalscript/functionalscript/pull/1488) +- **BREAKING CHANGES:** `fjs/effects/mock` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting + its type-level API into a sibling `types.ts` — importers must use + the `.f.mjs` specifier for runtime values and the `types.ts` + specifier for types + [#1488](https://github.com/functionalscript/functionalscript/pull/1488) +- **BREAKING CHANGES:** `fjs/effects/memory` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting + its type-level API into a sibling `types.ts` — importers must use + the `.f.mjs` specifier for runtime values and the `types.ts` + specifier for types. `proof.f.ts` stays TypeScript for now + [#1488](https://github.com/functionalscript/functionalscript/pull/1488) +- **BREAKING CHANGES:** `fjs/effects/list` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting + its type-level API into a sibling `types.ts` — importers must use + the `.f.mjs` specifier for runtime values and the `types.ts` + specifier for types + [#1487](https://github.com/functionalscript/functionalscript/pull/1487) +- **BREAKING CHANGES:** `fjs/effects/module.f.ts` migrates from + authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), + splitting its type-level API into a sibling `types.ts` — importers + must use the `.f.mjs` specifier for runtime values and the + `types.ts` specifier for types. Updates all 30+ dependents across + the repo; `proof.f.ts` stays TypeScript for now + [#1487](https://github.com/functionalscript/functionalscript/pull/1487) +- **BREAKING CHANGES:** `fjs/bnf/descent` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting + its type-level API into a sibling `types.ts` — importers must use + the `.f.mjs` specifier for runtime values and the `types.ts` + specifier for types. `proof.f.ts` stays TypeScript for now + [#1487](https://github.com/functionalscript/functionalscript/pull/1487) +- **BREAKING CHANGES:** `fjs/bnf/ll1` migrates from authored TypeScript + (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting its + type-level API into a sibling `types.ts` — importers must use the + `.f.mjs` specifier for runtime values and the `types.ts` specifier + for types. `proof.f.ts` stays TypeScript for now + [#1487](https://github.com/functionalscript/functionalscript/pull/1487) +- **BREAKING CHANGES:** `fjs/bnf/data` migrates from authored TypeScript + (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting its + type-level API into a sibling `types.ts` — importers must use the + `.f.mjs` specifier for runtime values and the `types.ts` specifier + for types. `proof.f.ts` stays TypeScript for now + [#1487](https://github.com/functionalscript/functionalscript/pull/1487) +- **BREAKING CHANGES:** `fjs/bnf/token_symbol` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting + the `Encoding` type into a sibling `types.ts` — importers must use + the `.f.mjs` specifier for runtime values and the `types.ts` + specifier for types + [#1486](https://github.com/functionalscript/functionalscript/pull/1486) +- **BREAKING CHANGES:** `fjs/crypto/vdf` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting + the `Sloth` type into a sibling `types.ts` — importers must use the + `.f.mjs` specifier for runtime values and the `types.ts` specifier + for types + [#1486](https://github.com/functionalscript/functionalscript/pull/1486) +- **BREAKING CHANGES:** `fjs/bnf/module.f.ts` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting + its type-level API into a sibling `types.ts` — importers must use the + `.f.mjs` specifier for runtime values and the `types.ts` specifier + for types. `proof.f.ts` and `testlib.f.ts` stay TypeScript for now + [#1485](https://github.com/functionalscript/functionalscript/pull/1485) +- **BREAKING CHANGES:** `fjs/media/nix` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting + the `Expression` type (and its private helper types) into a sibling + `types.ts` — importers must use the `.f.mjs` specifier for runtime + values and the `types.ts` specifier for types + [#1485](https://github.com/functionalscript/functionalscript/pull/1485) +- **BREAKING CHANGES:** `fjs/ci/rust` migrates from authored TypeScript + (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — importers must use + the `.f.mjs` specifier + [#1485](https://github.com/functionalscript/functionalscript/pull/1485) +- **BREAKING CHANGES:** `fjs/ci/deno` migrates from authored TypeScript + (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — importers must use + the `.f.mjs` specifier + [#1485](https://github.com/functionalscript/functionalscript/pull/1485) +- **BREAKING CHANGES:** `fjs/ci/bun` migrates from authored TypeScript + (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) — importers must use + the `.f.mjs` specifier + [#1485](https://github.com/functionalscript/functionalscript/pull/1485) +- **BREAKING CHANGES:** `fjs/ci/common` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting + its type-level API (`Os`, `Architecture`, `Image`, `Step`, `Job`, + `Jobs`, `GitHubAction`, `StepType`, `MetaStep`) into a sibling + `types.ts` — importers must use the `.f.mjs` specifier for runtime + values and the `types.ts` specifier for types + [#1485](https://github.com/functionalscript/functionalscript/pull/1485) +- **BREAKING CHANGES:** `fjs/types/rtti/parse/module.f.ts` migrates from + authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), + splitting its `Result`/`Parse` types into a sibling `types.ts` — + importers must use the `.f.mjs` specifier for runtime values and the + `types.ts` specifier for types. `proof.f.ts` stays TypeScript for + now: it has a type-only dependency on the not-yet-migrated `fjs/djs` + [#1485](https://github.com/functionalscript/functionalscript/pull/1485) +- **BREAKING CHANGES:** `fjs/types/rtti/validate/module.f.ts` migrates + from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript + (`.f.mjs`) — importers must use the `.f.mjs` specifier for runtime + values and `fjs/types/rtti/common/types.ts` for the re-exported + types. `proof.f.ts` stays TypeScript for now: it has a type-only + dependency on the not-yet-migrated `fjs/djs` + [#1485](https://github.com/functionalscript/functionalscript/pull/1485) +- **BREAKING CHANGES:** `fjs/types/rtti/common` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting + its type-level API into a sibling `types.ts` — importers must use the + `.f.mjs` specifier for runtime values and the `types.ts` specifier + for types + [#1485](https://github.com/functionalscript/functionalscript/pull/1485) +- **BREAKING CHANGES:** `fjs/types/rtti/ts` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting + its `Ts` type-transformer API into a sibling `types.ts` — importers + must use the `.f.mjs` specifier for the `printer` runtime value and + the `types.ts` specifier for types + [#1485](https://github.com/functionalscript/functionalscript/pull/1485) +- **BREAKING CHANGES:** `fjs/types/rtti` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting + its type-level API into a sibling `types.ts` — importers must use the + `.f.mjs` specifier for runtime values and the `types.ts` specifier + for types + [#1485](https://github.com/functionalscript/functionalscript/pull/1485) +- **BREAKING CHANGES:** `fjs/crypto/sign` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting + the `All` type into a sibling `types.ts` — importers must use the + `.f.mjs` specifier for runtime values and the `types.ts` specifier + for the type + [#1485](https://github.com/functionalscript/functionalscript/pull/1485) +- **BREAKING CHANGES:** `fjs/media/html` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting + the `Element`/`Node` types into a sibling `types.ts` — importers must + use the `.f.mjs` specifier for runtime values and the `types.ts` + specifier for types + [#1485](https://github.com/functionalscript/functionalscript/pull/1485) +- **BREAKING CHANGES:** `fjs/sul` migrates from authored TypeScript + (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`), splitting the + `EncodeState`/`Encode` types into a sibling `types.ts` — importers + must use the `.f.mjs` specifier for runtime values and the `types.ts` + specifier for types + [#1485](https://github.com/functionalscript/functionalscript/pull/1485) +- **BREAKING CHANGES:** `fjs/types/object`, `fjs/sul/level/literal`, + `fjs/sul/id`, `fjs/sul/level/hash`, `fjs/types/string_set`, and the + `module.f.ts` of `fjs/types/sorted_set` and `fjs/types/byte_set` + migrate to `.f.mjs`, splitting their public types into a sibling + `types.ts` — importers must use the `.f.mjs` specifier for runtime + values and the `types.ts` specifier for types + [#1484](https://github.com/functionalscript/functionalscript/pull/1484) +- **BREAKING CHANGES:** `fjs/crypto/hmac`, `fjs/path`, and + `fjs/media/json/serializer` migrate from authored TypeScript + (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) under the stage-1 + TypeScript-to-mjs migration — importers must use the `.f.mjs` + specifier + [#1484](https://github.com/functionalscript/functionalscript/pull/1484) +- **BREAKING CHANGES:** every public type exported by an authored `.f.mjs` + module moves to a sibling `types.ts` (31 modules, including `asserts`, + `types/list`, `types/bit_vec`, `types/result`, `text`, `crypto/sha2`) — + importers of these types must use the `types.ts` specifier. The runtime-empty + `fjs/types/option/module.f.mjs` becomes `fjs/types/option/types.ts` + [#1483](https://github.com/functionalscript/functionalscript/pull/1483) +- `fjs/types/nullable/proof.f.ts`, `fjs/types/range/proof.f.ts`, + `fjs/types/function/proof.f.ts`, `fjs/types/result/proof.f.ts`, and + `fjs/types/function/compare/proof.f.ts` migrate to `proof.f.mjs` under + the stage-1 TypeScript-to-mjs migration; no other module imports a proof + file, so this is not a breaking change + [#1480](https://github.com/functionalscript/functionalscript/pull/1480) +- **BREAKING CHANGES:** `fjs/text/utf8`, `fjs/text` (top module), and + `fjs/types/uint8array` migrate from authored TypeScript (`.f.ts`) to + JSDoc-typed JavaScript (`.f.mjs`) under the stage-1 TypeScript-to-mjs + migration — importers must use the `.f.mjs` specifier + [#1480](https://github.com/functionalscript/functionalscript/pull/1480) +- **BREAKING CHANGES:** `fjs/ci/config`, `fjs/text/ascii`, and `fjs/fsc` + migrate from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript + (`.f.mjs`) under the stage-1 TypeScript-to-mjs migration — importers + must use the `.f.mjs` specifier + [#1479](https://github.com/functionalscript/functionalscript/pull/1479) +- **BREAKING CHANGES:** `fjs/types/patricia_trie`, `fjs/types/sorted_list`, + `fjs/types/range_map`, `fjs/types/range_set`, `fjs/crypto/pow`, + `fjs/types/bigfloat`, `fjs/types/prime_field`, and `fjs/crypto/secp` + migrate from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript + (`.f.mjs`) under the stage-1 TypeScript-to-mjs migration — importers + must use the `.f.mjs` specifier + [#1478](https://github.com/functionalscript/functionalscript/pull/1478) +- **BREAKING CHANGES:** `fjs/types/number` and `fjs/types/nibble_set` migrate + from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) + under the stage-1 TypeScript-to-mjs migration — importers must use the + `.f.mjs` specifier + [#1477](https://github.com/functionalscript/functionalscript/pull/1477) +- **BREAKING CHANGES:** `fjs/types/map` migrates from authored TypeScript + (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) under the stage-1 + TypeScript-to-mjs migration — importers must use the `.f.mjs` specifier + [#1476](https://github.com/functionalscript/functionalscript/pull/1476) +- **BREAKING CHANGES:** `fjs/types/btree` migrates from authored TypeScript + (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) under the stage-1 + TypeScript-to-mjs migration — importers must use the `.f.mjs` specifier + [#1475](https://github.com/functionalscript/functionalscript/pull/1475) +- **BREAKING CHANGES:** `fjs/crypto/sha2` migrates from authored TypeScript + (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) under the stage-1 + TypeScript-to-mjs migration — importers must use the `.f.mjs` specifier + [#1472](https://github.com/functionalscript/functionalscript/pull/1472) +- **BREAKING CHANGES:** `fjs/types/btree/set` and `fjs/types/btree/remove` + migrate from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript + (`.f.mjs`) under the stage-1 TypeScript-to-mjs migration — importers must use + the `.f.mjs` specifier + [#1471](https://github.com/functionalscript/functionalscript/pull/1471) +- **BREAKING CHANGES:** `fjs/types/btree/find` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) under the + stage-1 TypeScript-to-mjs migration — importers must use the `.f.mjs` + specifier; implementation-only typedefs (`FirstLeaf1`, `FirstBranch3`, + `FirstLeaf2`, `FirstBranch5`, `PathItem3`, `PathItem5`) are renamed to + their private `_`-prefixed forms + [#1470](https://github.com/functionalscript/functionalscript/pull/1470) +- **BREAKING CHANGES:** `fjs/types/btree/types` migrates from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) under the + stage-1 TypeScript-to-mjs migration — importers must use the `.f.mjs` + specifier + [#1469](https://github.com/functionalscript/functionalscript/pull/1469) +- **BREAKING CHANGES:** `fjs/text/utf16` migrates from authored TypeScript + (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) under the stage-1 + TypeScript-to-mjs migration — importers must use the `.f.mjs` specifier; + implementation-only typedefs in `fjs/bnf/data` are renamed to their private + `_`-prefixed forms to match the established convention + [#1468](https://github.com/functionalscript/functionalscript/pull/1468) +- **BREAKING CHANGES:** `fjs/types/range` and `fjs/text/code_point` migrate from + authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) under the + stage-1 TypeScript-to-mjs migration — importers must use the `.f.mjs` + specifier + [#1464](https://github.com/functionalscript/functionalscript/pull/1464) +- **BREAKING CHANGES:** `fjs/basen`, `fjs/basen/base64`, and `fjs/basen/cbase32` + migrate from authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript + (`.f.mjs`) under the stage-1 TypeScript-to-mjs migration — importers must use + the `.f.mjs` specifier + [#1464](https://github.com/functionalscript/functionalscript/pull/1464) +- **BREAKING CHANGES:** the `fjs/base_n` module moves to `fjs/basen`, next to the + encodings built on it — importers must use the `fjs/basen/module.f.mjs` + specifier + [#1464](https://github.com/functionalscript/functionalscript/pull/1464) +- **BREAKING CHANGES:** `fjs/asn.1` migrates from authored TypeScript (`.f.ts`) + to JSDoc-typed JavaScript (`.f.mjs`) under the stage-1 TypeScript-to-mjs + migration — importers must use the `.f.mjs` specifier + [#1464](https://github.com/functionalscript/functionalscript/pull/1464) +- **BREAKING CHANGES:** `fjs/basen/base128` migrates from authored TypeScript + (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) under the stage-1 + TypeScript-to-mjs migration — importers must use the `.f.mjs` specifier + [#1463](https://github.com/functionalscript/functionalscript/pull/1463) +- **BREAKING CHANGES:** Implementation-only JSDoc typedefs in the migrated + `fjs/types/array` and `fjs/types/bit_vec` modules are renamed to their private + `_`-prefixed forms. Public declarations keep the same expanded types + [#1462](https://github.com/functionalscript/functionalscript/pull/1462) +- **BREAKING CHANGES:** `fjs/types/bit_vec` migrates from authored TypeScript + (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) under the stage-1 + TypeScript-to-mjs migration — importers must use the `.f.mjs` specifier + [#1460](https://github.com/functionalscript/functionalscript/pull/1460) +- **BREAKING CHANGES:** `fjs/types/list`, `fjs/types/result`, + `fjs/common/monoid`, `fjs/types/bigint`, and `fjs/types/nominal` migrate from + authored TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) under the + stage-1 TypeScript-to-mjs migration — importers must use the `.f.mjs` + specifier + [#1458](https://github.com/functionalscript/functionalscript/pull/1458) +- **BREAKING CHANGES:** `fjs/types/function/compare` and + `fjs/types/function/operator` migrate from authored TypeScript (`.f.ts`) to + JSDoc-typed JavaScript (`.f.mjs`) under the stage-1 TypeScript-to-mjs + migration — importers must use the `.f.mjs` specifier + [#1456](https://github.com/functionalscript/functionalscript/pull/1456) +- **BREAKING CHANGES:** `fjs/types/array`, `fjs/types/function`, + `fjs/types/nullable`, and `fjs/types/option` migrate from authored + TypeScript (`.f.ts`) to JSDoc-typed JavaScript (`.f.mjs`) under the stage-1 + TypeScript-to-mjs migration — importers must use the `.f.mjs` specifier; + `fjs/types/array`'s fixed-arity type exports (`Array1`..`Array16`, + `Index1`..`Index16`, `Tuple2`, `Tuple3`, `isArray2`) are replaced by the + generic `Tuple`, `Index`, and `isTuple(n)` + [#1454](https://github.com/functionalscript/functionalscript/pull/1454) +- `ci`: generated workflows invoke the CLI by full command name (`fjs test`, + `functionalscript@ test`) instead of the `t` alias + [#1450](https://github.com/functionalscript/functionalscript/pull/1450) diff --git a/changelog/0.5.0.md b/changelog/0.5.0.md new file mode 100644 index 000000000..968da5593 --- /dev/null +++ b/changelog/0.5.0.md @@ -0,0 +1,2 @@ +- `fsc` added as an executable into the npm package + [#396](https://github.com/functionalscript/functionalscript/pull/396) diff --git a/changelog/0.6.0.md b/changelog/0.6.0.md new file mode 100644 index 000000000..74585355f --- /dev/null +++ b/changelog/0.6.0.md @@ -0,0 +1,3 @@ +- The FunctionalScript JSR package includes `module.ts` files + [#423](https://github.com/functionalscript/functionalscript/pull/423) +- Dropped support for Node 16, Node 18 and Deno 1 diff --git a/changelog/0.6.10.md b/changelog/0.6.10.md new file mode 100644 index 000000000..2d80944e0 --- /dev/null +++ b/changelog/0.6.10.md @@ -0,0 +1,6 @@ +- Trailing comma and identifier properties + [#484](https://github.com/functionalscript/functionalscript/pull/484) +- Property names as identifiers + [#466](https://github.com/functionalscript/functionalscript/pull/466) +- Add the file name and symbol position to parser and transpiler errors + [#493](https://github.com/functionalscript/functionalscript/pull/493) diff --git a/changelog/0.6.11.md b/changelog/0.6.11.md new file mode 100644 index 000000000..5f20e81de --- /dev/null +++ b/changelog/0.6.11.md @@ -0,0 +1 @@ +- Support for Deno Test and Coverage diff --git a/changelog/0.6.2.md b/changelog/0.6.2.md new file mode 100644 index 000000000..bcccfe3db --- /dev/null +++ b/changelog/0.6.2.md @@ -0,0 +1,2 @@ +- Tests can run from a directory + [#425](https://github.com/functionalscript/functionalscript/pull/425) diff --git a/changelog/0.6.7.md b/changelog/0.6.7.md new file mode 100644 index 000000000..94040b2bc --- /dev/null +++ b/changelog/0.6.7.md @@ -0,0 +1,2 @@ +- `fsc` can parse json + [#434](https://github.com/functionalscript/functionalscript/pull/434) diff --git a/changelog/0.6.8.md b/changelog/0.6.8.md new file mode 100644 index 000000000..e809a0fad --- /dev/null +++ b/changelog/0.6.8.md @@ -0,0 +1,2 @@ +- `fsc` can serialize as tree + [#442](https://github.com/functionalscript/functionalscript/pull/442) diff --git a/changelog/0.6.9.md b/changelog/0.6.9.md new file mode 100644 index 000000000..28c527f8d --- /dev/null +++ b/changelog/0.6.9.md @@ -0,0 +1 @@ +- Import, const, comments, `undefined`, and `bigint` diff --git a/changelog/0.7.0.md b/changelog/0.7.0.md new file mode 100644 index 000000000..8b44856d3 --- /dev/null +++ b/changelog/0.7.0.md @@ -0,0 +1,2 @@ +- New automatic test runner for `Node.js`, `Deno`, and `Bun` + [#518](https://github.com/functionalscript/functionalscript/pull/518) diff --git a/changelog/0.8.0.md b/changelog/0.8.0.md new file mode 100644 index 000000000..50bfdc4f3 --- /dev/null +++ b/changelog/0.8.0.md @@ -0,0 +1,3 @@ +- Switch to the MIT License + [#557](https://github.com/functionalscript/functionalscript/pull/557), + [#559](https://github.com/functionalscript/functionalscript/pull/559) diff --git a/changelog/0.8.1.md b/changelog/0.8.1.md new file mode 100644 index 000000000..c9842e7ea --- /dev/null +++ b/changelog/0.8.1.md @@ -0,0 +1,10 @@ +- 64-bit SHA2 padding is fixed + [#595](https://github.com/functionalscript/functionalscript/pull/595) +- A compact version of Bit Vector + [#575](https://github.com/functionalscript/functionalscript/pull/575) +- Running tests in browsers + [#572](https://github.com/functionalscript/functionalscript/pull/572) +- Generating a GitHub CI file + [#569](https://github.com/functionalscript/functionalscript/pull/569) +- New `Nominal` type that prohibits `<` operations in TypeScript + [#567](https://github.com/functionalscript/functionalscript/pull/567) diff --git a/changelog/0.9.0.md b/changelog/0.9.0.md new file mode 100644 index 000000000..a1ff88300 --- /dev/null +++ b/changelog/0.9.0.md @@ -0,0 +1,8 @@ +- Replace legacy `fsc`/`fst` usage with the `fjs` CLI + [#619](https://github.com/functionalscript/functionalscript/pull/619) +- Add the `fjs` CLI + [#618](https://github.com/functionalscript/functionalscript/pull/618) +- Move the prime field module from `crypto/` to `types/` + [#602](https://github.com/functionalscript/functionalscript/pull/602) +- Digital signatures + [#599](https://github.com/functionalscript/functionalscript/pull/599) diff --git a/changelog/0.9.2.md b/changelog/0.9.2.md new file mode 100644 index 000000000..02d99fe15 --- /dev/null +++ b/changelog/0.9.2.md @@ -0,0 +1,26 @@ +- Effect: Node: add `Dirent` to the `readdir` result + [#676](https://github.com/functionalscript/functionalscript/pull/676) +- Effect: move `IO` related functions to `./io` + [#675](https://github.com/functionalscript/functionalscript/pull/675) +- Effect: remove one type parameter from operations + [#674](https://github.com/functionalscript/functionalscript/pull/674) +- CAS: read/write/list implementation + [#673](https://github.com/functionalscript/functionalscript/pull/673) +- Effect: `readdir` without the recursive flag + [#671](https://github.com/functionalscript/functionalscript/pull/671) +- Connect IO and Effect + [#670](https://github.com/functionalscript/functionalscript/pull/670) +- Effect: generating the website using Effects + [#666](https://github.com/functionalscript/functionalscript/pull/666) +- Effect: Node: stderr + [#665](https://github.com/functionalscript/functionalscript/pull/665) +- Effect: `flatMap` => `pipe` + [#664](https://github.com/functionalscript/functionalscript/pull/664) +- Effect: Node: `readdir` + [#663](https://github.com/functionalscript/functionalscript/pull/663) +- Effect: Mock [#658](https://github.com/functionalscript/functionalscript/pull/658) +- Effect: `map` and `flatMap` + [#657](https://github.com/functionalscript/functionalscript/pull/657) +- Effect: bind [#656](https://github.com/functionalscript/functionalscript/pull/656) +- Effect: `do_` and other helpers + [#654](https://github.com/functionalscript/functionalscript/pull/654) diff --git a/changelog/0.9.3.md b/changelog/0.9.3.md new file mode 100644 index 000000000..a23f2505b --- /dev/null +++ b/changelog/0.9.3.md @@ -0,0 +1,9 @@ +- Base128: bug fix + [#688](https://github.com/functionalscript/functionalscript/pull/688) +- Effect: `fetch` [#684](https://github.com/functionalscript/functionalscript/pull/684) +- ASN.1: unsupported tags. New module: Base128 + [#682](https://github.com/functionalscript/functionalscript/pull/682) +- ASN.1: integer, boolean, sequence, set + [#679](https://github.com/functionalscript/functionalscript/pull/679) +- ASN.1: basic encoding/decoding + [#678](https://github.com/functionalscript/functionalscript/pull/678) diff --git a/changelog/README.md b/changelog/README.md new file mode 100644 index 000000000..840afdd28 --- /dev/null +++ b/changelog/README.md @@ -0,0 +1,52 @@ +# Changelog + +All notable changes to this project are documented in this directory. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## Layout + +``` +changelog/ + README.md this file + unreleased/ + .md entries not released yet, one file per pull request + .md one file per released version +``` + +A pull request adds `changelog/unreleased/.md` named by its own number, so +two pull requests can never conflict on the same lines. A pull request with +several entries puts them all in its one file. Releasing concatenates +`changelog/unreleased/*.md` in descending pull-request-number order into +`changelog/.md` and deletes the entry files; `unreleased/.gitkeep` +keeps the empty directory in Git. + +Entries are therefore ordered by pull-request number, not by merge order — a +pull request opened earlier can merge after one opened later. The deviation is +accepted: pull-request order is deterministic and conflict-free. + +An entry file holds only Markdown list items — the version or pull-request +number is the file name, never a heading inside the file. Entries stay in a +small Markdown subset: paragraphs, list items, inline code, bold, and links. +That subset is a convention rather than an accident, so the changelog can be +rendered on the website by a self-hosted parser. A `.md` file that is +empty retrofits a released section that recorded no entries. + +## Versioning + +While the package is pre-1.0, the minor position carries the meaning the major +one will carry after 1.0: `0.Y` is bumped **only** by a release containing +`**BREAKING CHANGES:**`, and every other release — new features included — is a +patch bump. So `0.Y` is the API-compatibility boundary, which is also the +boundary `^0.Y.Z` and `~0.Y.Z` ranges already enforce: a patch upgrade is always +safe, and crossing `0.Y` always means reading the entries of the versions +crossed. Releases through `0.41.0` predate this convention and used a minor bump +for feature-only releases as well. + +## Entries + +New entries are at most a few lines and link only to their pull request. A few +older entries predate that convention and have no PR link — they are kept as +history. The full rules are in +[AGENTS.md §8.3](../AGENTS.md#83-changelog). diff --git a/changelog/unreleased/.gitkeep b/changelog/unreleased/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/changelog/unreleased/1514.md b/changelog/unreleased/1514.md new file mode 100644 index 000000000..902321b80 --- /dev/null +++ b/changelog/unreleased/1514.md @@ -0,0 +1,5 @@ +- `fjs/protocol/json_rpc` `dispatch` looks up handlers by own property. + An `Object.prototype` method name arriving as `method` no longer throws + or emits a malformed response; it answers `-32601` like any other + unknown method + [#1514](https://github.com/functionalscript/functionalscript/pull/1514) diff --git a/changelog/unreleased/1516.md b/changelog/unreleased/1516.md new file mode 100644 index 000000000..7d500fd5f --- /dev/null +++ b/changelog/unreleased/1516.md @@ -0,0 +1,5 @@ +- **BREAKING CHANGES:** BNF EOF is the semantic symbol `-1`, not `2^24 - 1`: + `fullRange` is `0 .. 2^24 - 2`, and the parser backends synthesize one + logical EOF after the physical input. Serialized ranges that ended at the + old EOF must be regenerated + [#1516](https://github.com/functionalscript/functionalscript/pull/1516) diff --git a/changelog/unreleased/1519.md b/changelog/unreleased/1519.md new file mode 100644 index 000000000..3cefcaf2e --- /dev/null +++ b/changelog/unreleased/1519.md @@ -0,0 +1,4 @@ +- `fjs/types/result` exports `okThen`, the pure `Result` bind — `mapOk`'s + monad sibling and the pure twin of `fjs/effects`' `okStep`. Its two error + types are unioned, so a chain that widens its error needs no rewrapping + [#1519](https://github.com/functionalscript/functionalscript/pull/1519) diff --git a/changelog/unreleased/1520.md b/changelog/unreleased/1520.md new file mode 100644 index 000000000..1f25b5a75 --- /dev/null +++ b/changelog/unreleased/1520.md @@ -0,0 +1,9 @@ +- **BREAKING CHANGES:** the npm package ships no `.js` files: the empty + `types.js` stubs and compiled test files are gone. Import types only with + fully erased `import type`, and use `fjs/emergent_testing/all.test.mjs` as + the external-runner entry + [#1520](https://github.com/functionalscript/functionalscript/pull/1520) +- The `fjs/emergent_testing/scenarios` fixtures, which never ran in CI, are + deleted; `fjs/emergent_testing/scenarios.md` records how to recreate them. + `types.ts` is now the only authored TypeScript + [#1520](https://github.com/functionalscript/functionalscript/pull/1520) diff --git a/changelog/unreleased/1522.md b/changelog/unreleased/1522.md new file mode 100644 index 000000000..b85cfc94d --- /dev/null +++ b/changelog/unreleased/1522.md @@ -0,0 +1,5 @@ +- `fjs/text/ascii` owns the hex-digit codec: `hexDigitValue`, + `hexDigitCodePoint`, and the `a-f` / `A-F` ranges. The JSON serializer and + both tokenizers use it instead of rederiving the offsets; the DJS tokenizer + no longer decodes a non-hex code point to a garbage digit + [#1522](https://github.com/functionalscript/functionalscript/pull/1522) diff --git a/changelog/unreleased/1525.md b/changelog/unreleased/1525.md new file mode 100644 index 000000000..fb1f0c15d --- /dev/null +++ b/changelog/unreleased/1525.md @@ -0,0 +1,4 @@ +- `fjs/djs/parser`'s `proof` covers `endObject`'s defensive non-object-top + guard directly, the same way it already covers `pushKey` and `endArray`'s + equivalent unreachable branches + [#1525](https://github.com/functionalscript/functionalscript/pull/1525) diff --git a/changelog/unreleased/1526.md b/changelog/unreleased/1526.md new file mode 100644 index 000000000..e00ebfa9e --- /dev/null +++ b/changelog/unreleased/1526.md @@ -0,0 +1,9 @@ +- Emitted declarations keep their documentation headers: 24 modules lost + `@module` to declaration emit and 4 never had one; all 127 module + declarations now carry it, and every `types.ts` / `proof.*` prose header + now leads its emitted declaration + [#1526](https://github.com/functionalscript/functionalscript/pull/1526) +- `fjs/media/json/schema`'s emitted declaration is exact: an explicit `@type` + naming the recursive schema by `typeof` replaces the `@type {const}` cast + that collapsed `not` to `/*elided*/ any` and five sibling fields to `any` + [#1526](https://github.com/functionalscript/functionalscript/pull/1526) diff --git a/changelog/unreleased/1527.md b/changelog/unreleased/1527.md new file mode 100644 index 000000000..deb6a3d08 --- /dev/null +++ b/changelog/unreleased/1527.md @@ -0,0 +1,4 @@ +- `types/bigfloat`: `decToBin` no longer returns a 54-bit mantissa when + rounding carries out of the top bit; the result is always the 53-bit + IEEE-754 significand + [#1527](https://github.com/functionalscript/functionalscript/pull/1527) diff --git a/changelog/unreleased/1530.md b/changelog/unreleased/1530.md new file mode 100644 index 000000000..fd6d96b32 --- /dev/null +++ b/changelog/unreleased/1530.md @@ -0,0 +1,6 @@ +- **BREAKING CHANGES:** the last documented public typedefs authored in `.mjs` + move to sibling `types.ts` files — `ParseContext`/`djsResult` to + `fjs/djs/transpiler/types.ts` and `Step` to + `fjs/protocol/mcp/stdio/types.ts` — so their documentation survives + declaration emit; importers must use the `types.ts` specifier for these types + [#1530](https://github.com/functionalscript/functionalscript/pull/1530) diff --git a/changelog/unreleased/1531.md b/changelog/unreleased/1531.md new file mode 100644 index 000000000..fb0bab254 --- /dev/null +++ b/changelog/unreleased/1531.md @@ -0,0 +1,6 @@ +- **BREAKING CHANGES:** `fjs/bnf/ll1`'s matcher runs as an explicit-stack + machine over a cursor into the shared input, so long or deeply nested input + no longer overflows the JS call stack and matching is no longer quadratic. + The `MatchRule` type described the recursive matcher and is removed; match + results are unchanged + [#1531](https://github.com/functionalscript/functionalscript/pull/1531) diff --git a/changelog/unreleased/1533.md b/changelog/unreleased/1533.md new file mode 100644 index 000000000..7e3b9236f --- /dev/null +++ b/changelog/unreleased/1533.md @@ -0,0 +1,5 @@ +- `media/type`: the magic-byte signatures are declared once. `detect` now folds + its bytes through the same eliminator the streaming detector uses, instead of + matching a second, hand-mirrored copy of the same table, so a `Vec` of + sub-byte length reads the way `detectStream` already read it + [#1533](https://github.com/functionalscript/functionalscript/pull/1533) diff --git a/changelog/unreleased/1534.md b/changelog/unreleased/1534.md new file mode 100644 index 000000000..386706af2 --- /dev/null +++ b/changelog/unreleased/1534.md @@ -0,0 +1,5 @@ +- `fjs/cas`, `fjs/cas/evo` and `fjs/emergent_testing` compose through the raw + `step` / `mapStep` / `historyStep` combinators instead of the fluent `Eff` + wrapper, which keeps its module but now has no consumers. Behavior is + unchanged + [#1534](https://github.com/functionalscript/functionalscript/pull/1534) diff --git a/changelog/unreleased/1536.md b/changelog/unreleased/1536.md new file mode 100644 index 000000000..506585770 --- /dev/null +++ b/changelog/unreleased/1536.md @@ -0,0 +1,5 @@ +- `media/json/parser`: `endArray`/`endObject` no longer branch on `state.top` + and `tokenToValue` drops its defensive default arm — the parser's state + machine already guarantees these invariants, so the dead branches are gone + instead of tested + [#1536](https://github.com/functionalscript/functionalscript/pull/1536) diff --git a/changelog/unreleased/1537.md b/changelog/unreleased/1537.md new file mode 100644 index 000000000..a6877e8a8 --- /dev/null +++ b/changelog/unreleased/1537.md @@ -0,0 +1,5 @@ +- `text/code_point`: new `eofFlush` factory builds the end-of-input step + `decoder` takes. The UTF-8 and UTF-16 decoders derive their eof ops from it + instead of each writing the flush out, so "leftover state becomes exactly one + error unit" is stated once + [#1537](https://github.com/functionalscript/functionalscript/pull/1537) diff --git a/changelog/unreleased/1538.md b/changelog/unreleased/1538.md new file mode 100644 index 000000000..f4550c72a --- /dev/null +++ b/changelog/unreleased/1538.md @@ -0,0 +1,3 @@ +- `types/object`: new `structurallySame`, plus `assertStructurallySame` in + `fjs/asserts` — structural comparison for proofs + [#1538](https://github.com/functionalscript/functionalscript/pull/1538) diff --git a/changelog/unreleased/1539.md b/changelog/unreleased/1539.md new file mode 100644 index 000000000..505663e58 --- /dev/null +++ b/changelog/unreleased/1539.md @@ -0,0 +1,4 @@ +- RTTI: new `fjs/types/rtti/data` module — a function-free, serializable, + canonical data form for schemas with `toData`, `cmp`, `equal`, `subset`, and a + data-driven `validate` + [#1539](https://github.com/functionalscript/functionalscript/pull/1539). diff --git a/changelog/unreleased/1540.md b/changelog/unreleased/1540.md new file mode 100644 index 000000000..86295e006 --- /dev/null +++ b/changelog/unreleased/1540.md @@ -0,0 +1,7 @@ +- `text/utf16`: `u16` now rejects non-integers, so a fractional word is + reported invalid (`0xFFFFFFFF`) instead of being misclassified by the + surrogate/BMP range checks — which only partition the integers in + `0x0000`–`0xFFFF`. That closes the only path into + `utf16ByteToCodePointOp`'s trailing fallback arm, which is removed along + with its `isHighSurrogate` recheck + [#1540](https://github.com/functionalscript/functionalscript/pull/1540) diff --git a/changelog/unreleased/1541.md b/changelog/unreleased/1541.md new file mode 100644 index 000000000..f339c596d --- /dev/null +++ b/changelog/unreleased/1541.md @@ -0,0 +1,5 @@ +- `basen/base64`: `decode` drops an overflow check in its padded branch that + could never trigger — `head`'s length is always a multiple of 6, so the + largest value `stringToVec` can return without overflowing already lands + at or under `maxLength` once the trimmed last chunk is added back + [#1541](https://github.com/functionalscript/functionalscript/pull/1541) diff --git a/changelog/unreleased/1542.md b/changelog/unreleased/1542.md new file mode 100644 index 000000000..cdb8ad7b6 --- /dev/null +++ b/changelog/unreleased/1542.md @@ -0,0 +1,12 @@ +- `media/json/schema`: `toJsonSchema` supports recursive schemas — it converts + through `fjs/types/rtti/data` (new `dataToJsonSchema`) and emits named + recursion as `$defs`/`$ref`; output is canonical, so `anyOf` members and + object keys follow the data form's normalized order, and a non-empty tuple + prefix emits `minItems` + [#1542](https://github.com/functionalscript/functionalscript/pull/1542). +- `types/rtti/data`: rule and property lookups are own-property only, so a + name shadowing an `Object.prototype` member (`toString`, …) is a missing + definition for `validate`/`subset` and an ordinary extra key when validating + values; `subset` and `toData`'s coverage collapse now terminate on unions + mixing rest-based and property-based object recursion + [#1542](https://github.com/functionalscript/functionalscript/pull/1542). diff --git a/changelog/unreleased/1543.md b/changelog/unreleased/1543.md new file mode 100644 index 000000000..88ab2e16e --- /dev/null +++ b/changelog/unreleased/1543.md @@ -0,0 +1,3 @@ +- `types/uint8array`: `toVec` attempts the conversion instead of precomputing a + byte-count bound; behavior and error message unchanged + [#1543](https://github.com/functionalscript/functionalscript/pull/1543) diff --git a/changelog/unreleased/1544.md b/changelog/unreleased/1544.md new file mode 100644 index 000000000..59d349d35 --- /dev/null +++ b/changelog/unreleased/1544.md @@ -0,0 +1,4 @@ +- `djs/serializer`: `stringify`'s `constSerialize` drops a defensive throw for + a `refs` lookup that can never miss — `consts` only ever holds values + `getConstants` already found an entry for + [#1544](https://github.com/functionalscript/functionalscript/pull/1544) diff --git a/changelog/unreleased/1545.md b/changelog/unreleased/1545.md new file mode 100644 index 000000000..00269e1e3 --- /dev/null +++ b/changelog/unreleased/1545.md @@ -0,0 +1,4 @@ +- Every module-level `@import` tag lives in its module's leading JSDoc block + (125 files swept), so emitted declaration headers list their type imports + in one place + [#1545](https://github.com/functionalscript/functionalscript/pull/1545) diff --git a/changelog/unreleased/1546.md b/changelog/unreleased/1546.md new file mode 100644 index 000000000..5f931fc1e --- /dev/null +++ b/changelog/unreleased/1546.md @@ -0,0 +1,3 @@ +- `types/sorted_list`: the two merge tail policies are now named `keepTail` and + `dropTail` instead of sharing one shadowed name; internal only + [#1546](https://github.com/functionalscript/functionalscript/pull/1546) diff --git a/changelog/unreleased/1547.md b/changelog/unreleased/1547.md new file mode 100644 index 000000000..f5425b3bc --- /dev/null +++ b/changelog/unreleased/1547.md @@ -0,0 +1,16 @@ +- `types/rtti/ts`: the runtime printer supports recursive schemas — it + converts through `fjs/types/rtti/data` (new `dataToTs`), so a recursive + schema prints as `type = ` definitions plus an entry + expression instead of overflowing the stack; output is the data form's + canonical form, a struct key admitting `undefined` prints optional + (mirroring `Ts<>`), and a rule name that cannot name a type alias (reserved + word — strict-mode ones included, predefined type name, non-identifier) + gets a generated identifier + [#1547](https://github.com/functionalscript/functionalscript/pull/1547). +- **BREAKING CHANGES:** `types/ts`: a `Printer.struct` field (`StructField`) + takes an optional third element marking the key optional (`"key"?: type`). + Callers and contextually-typed implementations are unaffected; an external + `Printer` implementation annotating the parameter as + `readonly (readonly [string, string])[]` must widen it to + `readonly StructField[]` + [#1547](https://github.com/functionalscript/functionalscript/pull/1547). diff --git a/changelog/unreleased/1548.md b/changelog/unreleased/1548.md new file mode 100644 index 000000000..c860af121 --- /dev/null +++ b/changelog/unreleased/1548.md @@ -0,0 +1,8 @@ +- `types/bit_vec`: `tryListToVec`/`tryU8ListToVec` reuse the shared balanced + fold, at the same cost as the accumulator they replace + [#1548](https://github.com/functionalscript/functionalscript/pull/1548) +- `common/monoid`: `fold` reduces as a balanced tree instead of a left fold — + `bigint.product` drops from O(n²) to O(n log n), `string.concat` pays a little + for the one combinator, `number.sum` may round differently. New + `foldAbsorbing` stops at the first element reaching an absorbing value + [#1548](https://github.com/functionalscript/functionalscript/pull/1548) diff --git a/todo/changelog-directory.md b/todo/changelog-directory.md deleted file mode 100644 index cb59b4360..000000000 --- a/todo/changelog-directory.md +++ /dev/null @@ -1,63 +0,0 @@ -# Replace `CHANGELOG.md` with a `changelog/` directory - -**Priority:** P2 -**Status:** open - -## Problem - -Every PR adds its entry at the top of `## Unreleased` in `CHANGELOG.md`, so any -two concurrent PRs conflict on the same lines. The file is also over 2000 lines -and keeps growing. - -## Proposal - -Replace the single file with a directory: - -``` -changelog/ - README.md <- the current CHANGELOG preamble: versioning convention, - entry-style rules - unreleased/ - .md <- one file per changelog-worthy PR, named by PR number - .md <- retrofitted released sections, one file per release -``` - -- A PR adds `changelog/unreleased/.md` instead of editing a shared file — - PR numbers are unique, so concurrent PRs can never conflict. A PR with - several entries puts them all in its one file. The `**BREAKING CHANGES:**` - marker keeps its meaning; at release time it is found by scanning - `changelog/unreleased/`. -- Entry ordering: filenames sort by PR number descending. Today's file is in - *merge* order, which this does not reproduce exactly — a PR opened earlier - can merge after one opened later. That deviation is accepted: PR-number - order is deterministic and conflict-free, and exact merge order can be - recovered later by generating from Git history - ([changelog-from-git-history.md](./changelog-from-git-history.md)). -- Releasing: concatenate `unreleased/*.md` (descending) into - `changelog/.md` and delete the entry files. Git does not store - empty directories, so `unreleased/` needs a permanent file (`.gitkeep` or a - one-line `README.md`). -- Retrofit: released sections move as one file per version - (`changelog/0.44.0.md`, …). Splitting history per PR would be churn with no - benefit — conflicts only ever happen in `unreleased` — and pre-convention - entries have no PR number to name a file by. -- Entries stay in the Markdown subset they already use (paragraphs, list - items, inline code, bold, PR links). Publishing the changelog on the website - ([changelog-website.md](./changelog-website.md)) needs to render entries with - a small self-hosted parser, so the subset is the convention, not an accident. - -## Tasks - -- [ ] Create `changelog/README.md` from the `CHANGELOG.md` preamble -- [ ] Retrofit released sections as `changelog/.md` -- [ ] Create `changelog/unreleased/` with its permanent file and move any - unreleased entries into per-PR files -- [ ] Delete `CHANGELOG.md`, or leave a short stub pointing at `changelog/` -- [ ] Update `AGENTS.md` §8.3 (entry workflow) and §8.4 (release step) and - `CONTRIBUTING.md` to describe the directory - -## Related - -- [changelog-website.md](./changelog-website.md) — consumes this structure -- [changelog-from-git-history.md](./changelog-from-git-history.md) — may - eventually replace this structure diff --git a/todo/changelog-from-git-history.md b/todo/changelog-from-git-history.md index 9e8709848..e03704886 100644 --- a/todo/changelog-from-git-history.md +++ b/todo/changelog-from-git-history.md @@ -5,7 +5,7 @@ ## Problem -Even as per-PR files ([changelog-directory.md](./changelog-directory.md)), +Even as per-PR files ([changelog/README.md](../changelog/README.md)), changelog entries are authored by hand while the same information — commits, diffs, PR links — already exists in Git history. It may be possible to remove the `changelog/` directory and derive the release history directly: @@ -42,7 +42,7 @@ versioning comes from. ## Related -- [changelog-directory.md](./changelog-directory.md) — the structure this - would replace +- [changelog/README.md](../changelog/README.md) — the structure this would + replace - [changelog-website.md](./changelog-website.md) — the consumer that must not care which source feeds it diff --git a/todo/changelog-website.md b/todo/changelog-website.md index 0c68ece1d..4a72a7c53 100644 --- a/todo/changelog-website.md +++ b/todo/changelog-website.md @@ -1,8 +1,7 @@ # Publish the changelog on the website **Priority:** P4 -**Status:** blocked -**Blocked by:** [Replace `CHANGELOG.md` with a `changelog/` directory](./changelog-directory.md) +**Status:** open ## Problem @@ -29,5 +28,5 @@ format. The BNF machinery is a natural fit for the parser. ## Related -- [changelog-directory.md](./changelog-directory.md) — defines the structure - and the Markdown subset this consumes +- [changelog/README.md](../changelog/README.md) — defines the structure and the + Markdown subset this consumes diff --git a/todo/migrate-typescript-to-mjs.md b/todo/migrate-typescript-to-mjs.md index 023ddcd77..dfd786057 100644 --- a/todo/migrate-typescript-to-mjs.md +++ b/todo/migrate-typescript-to-mjs.md @@ -1019,7 +1019,7 @@ person can re-check rather than re-derive. Counts are as of `fjs/emergent_testing/todo/205.md` is deleted with the suite. - [x] **Sweep the remaining stale prose.** Done. The measured set was 88 mentions across 42 `.md` files naming an `X.f.ts` whose `X.f.mjs` now - exists (resolving each mention against the tree, excluding `CHANGELOG.md`, + exists (resolving each mention against the tree, excluding the changelog, whose history is correctly left alone); that measurement now returns **9**, and all 9 are the rename arrows (`module.f.ts -> module.f.mjs`) and completed `[x]` items in this file and `fjs/fsc/README.md`, where the @@ -1027,7 +1027,7 @@ person can re-check rather than re-derive. Counts are as of Two other rulers get quoted for this and are easy to mix up, so name the one you mean. A **path-like mention** is one module-path token ending in - the old extension; a **line** may hold several. Whole tree, `CHANGELOG.md` + the old extension; a **line** may hold several. Whole tree, the changelog excluded: | ruler | `main` | after the sweep |