JavaScript Implementation#

Music-box provides a JavaScript implementation backed by the same MUSICA WebAssembly chemistry solver used by the Python package. It accepts the same music-box v1 JSON config format (see Configuration Files), making it suitable for Node.js scripts and browser applications where file I/O is unavailable.

Installation#

$ npm install @ncar/music-box

Quick Start#

Load a bundled example (Node.js or browser)#

Each example config is published with the package and can be imported directly as JSON:

import { MusicBox } from '@ncar/music-box';
import chapmanConfig from '@ncar/music-box/examples/chapman/my_config.json' with { type: 'json' };

const box = MusicBox.fromJson(chapmanConfig);
const results = await box.solve();
console.log(results);
// [{ 'time.s': 0, 'CONC.O3.mol m-3': 6.43e-6, ... }, ...]

Available examples: analytical, chapman, flow_tube, carbon_bond_5, ts1.

Node.js — load from a local file#

import { MusicBox } from '@ncar/music-box';

const box = await MusicBox.fromJsonFile('./examples/chapman/my_config.json');
const results = await box.solve();
console.log(results);
// [{ 'time.s': 0, 'CONC.O3.mol m-3': 6.43e-6, ... }, ...]

Node.js or Browser — inline config#

Conditions can be supplied inline as conditions.data arrays instead of CSV filepaths — see Configuration Files → Conditions for the full format and column naming reference.

import { MusicBox } from '@ncar/music-box';

const config = {
  'box model options': {
    'chemistry time step [min]': 1.0,
    'output time step [min]': 10.0,
    'simulation length [hr]': 1.0,
  },
  conditions: {
    data: [
      {
        headers: ['time.s', 'ENV.temperature.K', 'ENV.pressure.Pa',
                  'CONC.O3.mol m-3', 'CONC.O2.mol m-3'],
        rows: [[0.0, 217.6, 1394.3, 6.43e-6, 0.162]],
      },
      {
        headers: ['time.s', 'PHOTO.O2_1.s-1', 'PHOTO.O3_1.s-1'],
        rows: [
          [0,    1.47e-12, 4.25e-5],
          [3600, 1.12e-13, 1.33e-6],
        ],
      },
    ],
  },
  mechanism: { /* ... */ },
};

const box = MusicBox.fromJson(config);
const results = await box.solve();

API Reference#

For full API documentation — including all parameters, return types, and descriptions — see the JavaScript API Reference.

Development#

All npm commands are run from the repository root (where package.json lives):

$ npm install              # install dependencies
$ npm test                 # run all tests (unit + integration)
$ npm run test:unit        # unit tests only
$ npm run test:integration # integration tests only
$ npm run test:coverage    # tests with coverage report
$ npm run build            # build browser bundle → dist/music-box.bundle.js