solar-spa/.github/wiki/Contributing.md

91 lines
2.6 KiB
Markdown

# Contributing
## Prerequisites
- Node.js 18 or later
- pnpm 10 or later
- [Emscripten](https://emscripten.org/docs/getting_started/downloads.html) (only for recompiling the WASM module)
On macOS, Emscripten is available via Homebrew:
```sh
brew install emscripten
```
## Building from source
Clone the repository, install dependencies, and build the TypeScript:
```sh
git clone https://github.com/acamarata/solar-spa.git
cd solar-spa
pnpm install
pnpm run build:ts
```
To recompile the WASM module (requires Emscripten):
```sh
pnpm run build:wasm
```
Or build everything at once:
```sh
pnpm run build
```
## Running tests
```sh
pnpm test
```
This runs both the ESM test suite (`test.mjs`, 66 assertions) and the CJS smoke test (`test-cjs.cjs`). Tests cover multiple geographic locations, seasons, input validation, error handling, concurrent initialization, polar regions, boundary coordinates, and all SPA function codes.
## Type checking
```sh
pnpm run typecheck
```
## Project structure
```
src/
index.ts # Main implementation (TypeScript source)
types.ts # Type definitions and constants
spa.c # NREL SPA algorithm (do not modify)
spa.h # NREL SPA header (do not modify)
spa_wrapper.c # Flat wrapper for WASM boundary
wasm/
spa-module.js # Compiled WASM output (~60KB, inlined as base64)
dist/ # Generated by tsup (CJS + ESM + declarations)
index.cjs
index.mjs
index.d.ts # CJS declarations
index.d.mts # ESM declarations
test.mjs # ESM test suite
test-cjs.cjs # CJS smoke test
tsup.config.ts # Build configuration
tsconfig.json # TypeScript configuration
```
## Guidelines
- Do not modify `spa.c` or `spa.h`. These are the original NREL source files and should remain identical to the NREL distribution.
- Changes to `spa_wrapper.c` that add new output fields require corresponding changes in `src/index.ts` (the OFFSET map and `readResult` function) and `src/types.ts` (the result interfaces).
- Run `pnpm test` and `pnpm run typecheck` before submitting. All tests and type checks should pass.
- The test suite uses approximate comparisons (`approx` with a tolerance) because floating-point results vary slightly across platforms and Emscripten versions.
## Reporting bugs
Open an issue at [github.com/acamarata/solar-spa/issues](https://github.com/acamarata/solar-spa/issues). Include:
- Node.js version (`node --version`)
- The input parameters that produced the unexpected result
- Expected vs actual output
---
[Home](Home) · [Architecture](Architecture) · [API Reference](API-Reference)