FunctionalScriptCLIPRsReleasesPlaygroundGitHub ↗

root / changelog / 0.55.0

← Previous: 0.54.0 · Next: 0.56.0 →
  • compiler: accepts String(x) and String(); String is a reserved global conversion name, so bindings named String must be renamed, while property names such as { String: 1 }.String stay valid. (#2763)
  • compiler: accepts untagged template literals; each ${e} lowers to String(e) and the chunks join with +. Chunks admit the common string escapes, an escaped backtick and \${; tagged templates and other escapes are refused. (#2823)
  • js/tokenizer: emits template chunk tokens with a cooked value and the exact source, over the template grammar ebnf/lib/js adds. (#2823)
  • text/marked: new module for marked text: runs [text, kind?] with a kind of keyword, literal, string, number, comment, operator or identifier, none on punctuation; run constructors, Chunk helpers and a tagged form. (#2726, #2729, #2753, #2760, #2818)
  • media/json/serializer, media/datajs/serializer: leaf serializers answer lists of marked chunks, [[text, kind]], instead of plain strings, and the wrappers, LeafSerializer and compiler/serializer's Document are typed on List<Chunk>; join chunks with text/marked.chunksText. (#2729)
  • compiler/serializer, media/datajs: the chunks trySerialize and tryModuleSerialize answer split a keyword from its surroundings; the joined text is unchanged. (#2753)
  • media/datajs, compiler/serializer, edag/rust: add the marked entry points tryMarked, tryJsonMarked, tryModuleMarked, expExprTagged, scopeTagged and useLinesTagged; media/rust adds u64WordItems and utf16Units, and edag/rust/unmarked is new. (#2758, #2760)
  • media/nix: nix and nixToString return a Result whose error names the first rule the expression breaks; unwrap(nixToString(e)) replaces unwrapNullable(fromUndefined(nixToString(e))). _Chunks is removed. (#2745)
  • crypto/sign: add verify; crypto/secp adds isPublicKey, SEC 1 §3.2.2.1 key validation for curves with a prime n and n² > p + 1 + 2√p. sign reduces r modulo q and refuses a zero r or s. (#2686)
  • text/ascii: add hexDigitsValue; hexDigitValue answers null for a non-integer instead of a fraction. (#2787)
  • text/utf8: add stringToU8List and u8ListToString, the one owner of byte-list UTF-8 encoding and decoding; text/percent.utf8String and effects/common.utf8ListToString are removed in their favour. (#2746)
  • types/number: add isInteger (types/number/is_integer), exactly Number.isInteger, and isSafeInteger (types/number/is_safe_integer); the entry helper moves to types/object/entry, keeping the js/entry path. (#2757, #2771)
  • js/array_index, git/bytes, types/function/operator, types/function, types/nominal, types/result, js/keywords, website/demo/examples: module.f.mjs becomes module.f.js; update direct imports. (#2766, #2771, #2812)
  • effects/node: add plainTextResponse(status, message), the frame every plain-text answer shares; export runNodeEffect from module.mjs. web's response takes a Headers value instead of a content type and a length. (#2749, #2781)
  • ebnf/railroad: toDiagrams takes an Alphabet before the rule set, toDiagrams(alphabet)(ruleSet); codePoints is the former labelling and tokens(encoding, categories) labels token grammars, drawing a category as its own piece. (#2799)
  • website/demo: TextDemoOptions and BitGroupDemoOptions require intro; media/json/demo.roundTrip returns Result<string, string>. website/style exports railroadBoxMarker and railroadLabelMarker. (#2696, #2800)
  • website: demos are highlighted by their producers, open with a lead, show refusals in a Refused: box and offer copy buttons; new crypto/sign and compiler/parser/grammar demos. (#2696, #2726, #2758, #2760, #2787, #2788, #2789, #2800)
  • website: a /prs/ page lists open pull requests with CI summaries, loaded on Refresh, with optional GitHub login. (#2779, #2782, #2794)
  • website: Contents and Issues move to a left sidebar on root and directory pages; at narrow widths a bar above the breadcrumb opens them as a drawer. website/page exports directoryLayout. (#2807)
  • nanvm-lib: BigInt's + and - and Numeric::bitwise_not return a Result and throw RangeError for a result longer than MAX_WORDS words; vm::unstable::number_text(f64) spells a number as Number::toString does. (#2752, #2832)
  • nanvm-effects-node: answers stat, access, rename, rmdir, readBytes, createExclusive, writeExclusive, catch, the file handle operations and, except on wasm32-unknown-unknown, sandbox, now and randomInt. (#2767, #2768, #2770, #2796, #2815)
  • nanvm-effects-node: writeFile and writeBytes sync so a deferred close error is reported; open refuses a FIFO with ERR_NOT_A_FILE; randomInt is not cryptographically secure; test stays notImplemented; numbers spell as in Node. (#2784, #2796, #2815, #2817, #2832)
  • nanvm: the Rust crates move to nanvm/lib, nanvm/harness and nanvm/effects-node; Cargo package names are unchanged. (#2810)
  • package.json: engines.node is exactly 26.10.0, the one Node this release is tested with; .node-version and the lockfile match. Older tools require an older release. (#2804, #2756)
  • ci: one exact prerelease toolset: Node 22 and 24 jobs, flakes and Engine are removed, programs receive one host-selected testContext, Intel macOS installs its tools directly, and Nixpkgs moves to 2efa67fd. (#2751, #2804, #2811)
  • Tested toolset: Node 26.10.0, Deno 2.8.3, Bun 1.4.2, Rust 1.99.0, TypeScript (typescript-go) 7.0.2, Wasmtime 45.0.2, Wasmer 7.1.0. (#2804)
Support FunctionalScript: GitHub Sponsors ↗ · Open Collective ↗ · Patreon ↗