ZachBray/FunScript
50.4
Weak · 23 September 2026
29.4k
lines of production code
JavaScript
with F#
5
measurements over time
What this system is
FunScript is an F\# to JavaScript compiler that enables F\# code to run in the browser. It provides a core compilation engine alongside specialized libraries for reactive programming, data access, and TypeScript interop. The system also includes a build infrastructure and example projects demonstrating its capabilities.
How it got here
2012 — Build system overhaul and cleanup
9 changes.
The project underwent a significant infrastructure overhaul, introducing FAKE and Paket for build automation and dependency management while removing obsolete code and test files. This period focused on modernizing the repository's tooling and cleaning up legacy components like FunJS and xUnit integration.
2014–2015 — Initial compiler and library implementation
7 changes.
This period marks the foundational development of the FunScript project, introducing the core F\# to JavaScript compiler, essential type providers, and reactive extensions. The work established the basic infrastructure, including AST definitions, runtime mappings, and NuGet packaging, while simultaneously providing example applications and comprehensive unit tests to verify the new functionality.
Features
Add FunScript.Data package with JavaScript runtime implementations
The FunScript.Data package is introduced, providing JavaScript runtime implementations for the Apiary, JSON, and World Bank type providers. This change adds new source files (ApiaryProvider.fs, JsonProvider.fs, WorldBankProvider.fs, and Utils.fs) that map F\# type provider operations to JavaScript equivalents, enabling these data access features to function correctly in a browser environment.
src/data · high confidence
Added FunScript examples for Canvas, Hokusai, and EasyGettingStarted
Added new example projects demonstrating FunScript capabilities: a Canvas-based drawing example, a Hokusai fractal renderer, and an EasyGettingStarted suite featuring a Brainfuck interpreter, a maze game, and jQuery Mobile demos. The Brainfuck example includes a new App.config with assembly binding redirects for FSharp.Core and System.Reactive, while the Hokusai example generates a Julia set fractal on an HTML5 canvas. The EasyGettingStarted folder provides multiple entry points for beginners, including HTML canvas manipulation, DOM element creation, and mobile UI patterns using jQuery Mobile.
examples · high confidence
Added FunScript.Rx interop for reactive streams
Introduced a new FunScript.Rx module that bridges F\# reactive extensions to JavaScript via FunScript. The change adds a comprehensive set of observable operators (such as map, filter, merge, and scan) and event handling utilities, enabling users to write reactive code in F\# that compiles to JavaScript. The implementation relies on FSharp.Control.Reactive and maps standard F\# observable operations to their RxJS equivalents.
src/extra/FunScript.Rx · high confidence
Added NuGet package templates for FunScript components
The build system now includes NuGet package templates (data, Rx, and core Interop) that define how FunScript assemblies are packaged for distribution. These templates specify the DLLs, XML documentation, and PDB files included in the respective NuGet packages, enabling consistent packaging of the library components.
build · high confidence
Initial implementation of the FunScript compiler core and core library modules
The codebase introduces the foundational components for the FunScript F\# to JavaScript compiler. This includes the Abstract Syntax Tree (AST) definitions for JavaScript expressions and statements, the main compiler entry point, and a comprehensive set of core library modules (Async, Dictionaries, Events, Maps, LanguagePrimitives, etc.) that provide the runtime support and F\#-to-JS mappings. Additionally, assembly metadata files are added for the interop and main FunScript libraries.
src/main · high confidence
Introduce FunScript.TypeScript type provider and compiler infrastructure
Added the core components for the FunScript.TypeScript type provider, including AST definitions (AST.fs), a TypeScript definition file parser (Parser.fs), and a type generator (TypeGenerator.fs) that converts TypeScript declarations into F\# assemblies. The change also introduces a new command-line compiler (Program.fs) for generating bindings from .d.ts files, supported by an App.config with assembly binding redirects for FSharp.Core and System.Reactive, a paket.references file for dependencies, and a NuSpec template for packaging.
src/extra/FunScript.TypeScript · high confidence
Repository infrastructure and build system overhaul
The repository introduces a comprehensive build automation system using FAKE and Paket, replacing the previous manual or simpler build processes. This includes new solution files (FunScript.sln, FunScript.Libraries.sln) that organize the project into distinct components (Main, Data, TypeScript, Rx, and Tests) and integrate with a .paket directory for dependency management. A new build.fsx script and associated shell/Windows batch files (build.sh, build.cmd) automate the build, test, and package creation steps. Additionally, the repository adds a .gitattributes file to standardize line endings and diff behavior for various file types, updates the .gitignore to exclude build artifacts and IDE-specific files, and adds a LICENSE.txt file establishing the Apache 2.0 license for the project.
(repo-wide) · high confidence
Removals
Removed F\# PowerPack LINQ community package files
The XML documentation files for the F\# PowerPack LINQ Community package (FSharp.PowerPack.Linq.xml) for both .NET 2.0 and .NET 4.0 targets have been deleted, along with the PowerShell install script (install.ps1) that previously added binding redirects. This removes the community-maintained LINQ extensions and their associated tooling from the repository.
packages/FSPowerPack.Linq.Community.2.0.0.1 · high confidence
Removed FunJS compiler implementation files
Deleted the FunJS compiler implementation files, including AST, Arithmetic, CommonOperators, Comparison, Compiler, ExpressionReplacer, InternalCompiler, Options, PrimitiveTypes, RecordTypes, ReflectedDefinitions, ReturnStrategies, Tuples, and UnionTypes. This removes the core logic for compiling F\# code to JavaScript, including support for primitive types, records, unions, tuples, and various operators.
FunJS · high confidence
Removed obsolete TypeScript type provider implementation
The legacy TypeScript type provider implementation, including the AST definitions, parser, and provided types, has been removed from the FunJS.TypeScript module. This change eliminates the previous codebase for generating types from TypeScript definitions, likely as part of a broader refactor to a new type provider architecture.
FunJS.TypeScript · high confidence
Removed xUnit testing framework and FsUnit integration
The xUnit testing framework (version 1.9.1) and the associated FsUnit.xUnit package have been removed from the project. This includes the deletion of the FsUnit sample code, XML documentation files for both .NET 2.0 and 4.0 targets, and the PowerShell installation script. This change eliminates the ability to write and run tests using the xUnit runner and FsUnit matchers within this specific package context.
packages/FsUnit.xUnit.1.1.0.1, packages/xunit.1.9.1 · high confidence
Behavioural changes
Removed FunJS.Core.GenericConstants module
The FunJS.Core.GenericConstants module, which previously defined Zero and One constants, has been removed from the codebase.
FunJS/Core · high confidence
Removed obsolete NuGet packages configuration
The NuGet packages configuration file (repositories.config) has been removed. This file previously defined a local package source pointing to the FunJS.Tests directory, which is no longer needed.
packages · high confidence
Test coverage
Added comprehensive test coverage for FunScript; Removed obsolete test files from FunJS.Tests.
Dependencies
Migrated example projects to Paket for dependency management
The FunScript example projects (including Canvas, Hokusai, Mandelbrot, Mario, MovieDatabase, NoisyChannel, PacMan, SimpleAsync, Tutorial, and Twitter) have been updated to use Paket for managing NuGet package dependencies. This change replaces the previous NuGet-based dependency resolution with Paket, as evidenced by the addition of 'paket.references' files and the inclusion of '\<Paket\>True\</Paket\>' markers in the .fsproj files. This ensures consistent and reliable package resolution across the examples.
(dependencies) · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings — which rule fired, in which file, on which line, and how to fix it — are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.
Score
- CAI 54 → 50 (-3.3)
- Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 98 → 94 (-3.8)
- Architecture 96 → 96 (+0.1)
- Maturity 31 → 31 (+0.0)
- Readiness 52 → 36 (-16.2)
- Security 95 → 95 (+0.0)
- Domain Modelling 100 (new)
Resolved (21)
- Dependency hygiene not measured — no packages were read
- Duplicated block (10 lines × 2) (src/main/FunScript/Core/list.fs)
- Duplicated block (10 lines × 3) (src/main/FunScript/Core/list.fs)
- Duplicated block (5 lines × 2) (examples/NoisyChannel/page.fs)
- Duplicated block (5 lines × 2) (src/main/FunScript/Core/Events.fs)
- Duplicated block (5 lines × 2) (src/main/FunScript/Core/Map.fs)
- Duplicated block (6 lines × 2) (src/main/FunScript/Core/Set.fs)
- Duplicated block (7 lines × 2) (src/main/FunScript/Comparison.fs)
- Duplicated block (8 lines × 2) (src/main/FunScript/Core/Map.fs)
- Duplicated block (9 lines × 2) (examples/Brainfuck/FunScript.Brainfuck.Logic/Program.fs)
- Duplicated block (9 lines × 2) (src/main/FunScript/Core/Set.fs)
- Duplicated block (9 lines × 2) (src/main/FunScript/Core/list.fs)
- Low: security finding (details withheld)
- Low: security finding (details withheld)
- Low: security finding (details withheld)
- Low: security finding (details withheld)
- No exposed public API
- Test reliability not included
- XML-doc coverage: FunScript.Brainfuck.Website (examples/Brainfuck/FunScript.Brainfuck.Website/FunScript.Brainfuck.Website.csproj)
- complexity unreadable for .fs, .rb — churn × complexity hotspots could not be measured
- …and 1 more
New (38)
- Documentation: no installation or build instructions (README.md)
- Duplicated block (10 lines × 3) (src/main/FunScript/Core/Array.fs)
- Duplicated block (10–11 lines × 2) (src/main/FunScript/Core/Set.fs)
- Duplicated block (10–11 lines × 3) (src/main/FunScript/Core/Array.fs)
- Duplicated block (11–12 lines × 2) (examples/Brainfuck/FunScript.Brainfuck.Logic/Program.fs)
- Duplicated block (18 lines × 2) (src/main/FunScript/Core/Seq.fs)
- Duplicated block (31 lines × 2) (src/main/FunScript/Core/Seq.fs)
- Duplicated block (5 lines × 2) (examples/NoisyChannel/page.fs)
- Duplicated block (5 lines × 2) (src/main/FunScript/Core/Map.fs)
- Duplicated block (5 lines × 2) (src/main/FunScript/Core/Seq.fs)
- Duplicated block (5 lines × 2) (src/main/FunScript/Core/Set.fs)
- Duplicated block (5 lines × 2) (src/main/FunScript/UnionTypes.fs)
- Duplicated block (7 lines × 2) (src/main/FunScript/Comparison.fs)
- Duplicated block (8 lines × 2) (src/main/FunScript/Core/Seq.fs)
- Duplicated block (8–9 lines × 2) (src/main/FunScript/Core/Map.fs)
- Duplicated block (9 lines × 4) (src/data/FunScript.Data/AssemblyInfo.fs)
- FileTooLong: Core/Set.fs (src/main/FunScript/Core/Set.fs)
- FileTooLong: FunScript.TypeScript/TypeGenerator.fs (src/extra/FunScript.TypeScript/TypeGenerator.fs)
- FileTooLong: live/moviedatabase.js (src/docs/static/live/moviedatabase.js)
- FileTooLong: live/worldbank.js (src/docs/static/live/worldbank.js)
- …and 18 more
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
ZachBray/FunScript was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 23 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 941d28b40752cdc81a22f7e42ae21e9844c86fdb — the exact code this score is about.
- Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-955b9cee9818.