npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

remath

v2.0.3

Published

A reactive spreadsheet-like library

Downloads

11

Readme

Remath

A reactive spreadsheet-like math library.

Uses mobx for reactivity, Numeral.js to format values, and mathjs to parse and evaluate the math.

Example Usage


import Remath from 'remath';

var sheet = new Remath();

// Add a cell to the sheet
var a = sheet.addCell('a');

// Set the formula
a.setFormula('10');

// This anonymous function will run once, immediately, then any time the value of 'a' changes
sheet.autorun(() => {
  console.log('The value of a = ', a.value);
});

a.setFormula('5');
// => The value of a = 5

// Let's add another cell to the sheet, this one will be dependent on the value of 'a'
sheet.addCell('b', {formula: 'a + 5'});

sheet.autorun(() => {
  console.log('The value of b = ', b.value);
  // => The value of b = 10
})

a.setFormula('10');
// => The value of b = 15
// The autorun function is called again, because the value of b depends on the value of a.

API

Instantiation

var sheet = new Remath();

.onAlert( callback({type: 'type of error', message: 'error message'}) )

Registers a function to be called when the end user inputs data incorrectly.

eg: The user enters an invalid formula. Or the user enters a symbol that starts with a number.

The callbacks are called with an object with type and message keys.

.addCell(symbol: String, options: Object)

sheet.addCell('gamma')

Adds a cell to the sheet. symbol is required, must be unique, can't have spaces, and can't start with a number

The onAlert callbacks will be called when there is an error.

options object is optional.

symbol: String options: CellOptions

CellOptions { name: String formula: String displayFormat: String => any string that works with numeral.js }

.removeCell(symbol)

sheet.removeCell('alpha')

Removes a cell from the sheet.

.find(symbol)

sheet.find('gamma')

Returns the cell if it can be found. Calls the onAlert callbacks if the symbol or id can't be found

Cell

Public API

Instantiation

var cell = new Cell(symbol: String, parentClass: Remath, options: Object);

.displayFormat

A string that works with the numeral.js api. Determines what the .displayValue() method will return. Can be updated by simply assigning it. This will trigger reactions.

cell.displayValue = '+0,0'

For example.

cell.displayFormat = '$0,0.00';
cell.setFormula('100000');
cell.displayValue()
// returns '$100,000.00'

.isDependent()

Returns a bool. True if this cell is dependent on other cells. False if not.

.displayValue()

Returns a string that represents the cells value ported through numeral.js

.setFormula()

Sets the formula. Takes a string that can reference any other symbols in the sheet. Will call the alert callbacks if the formula references a symbol that doesn't exist or is of a wrong type, and will not set the new formula.

.updateSymbol(symbol)

Updates the cells symbol and traverses the entire sheet to find references to the cell and changes the symbol there as well.

.customProps.set(key, value)

Allows user to set a custom reactive property on the cell. This could be used for meta-data that needs to be stored on the cell.

.customProps.get(key)

Returns the value of the custom property. If the value is referenced in a reactive function (like autorun), then the function will be run again if the custom prop changes.

Private API

._dependents is an Object{String: Cell}

This is an object that holds the dependencies for a cell. It is replaced every time the formula is set.

._removeAllDependents()

Removes all the dependencies on other cells. This should only be called when a new formula is being set that has no dependencies

._addDependency(symbol: String)

Adds a dependency to another cell, if that symbol can be found and is not already a dependency

._scope()

Returns an object with keys as symbols and values as the cells current value. used to pass into the mathjs eval method

Error Handling

The remath library assumes it is accepting input from end users. End users can input formulas, symbols, names, etc. In general, any exception that is caused by an end user will be caught and any callbacks registered by the Remath.onAlert method will be called. On the other hand, if the library is implemented incorrectly by the developer, the exception will not be caught.

A general rule of thumb is that an error in any public method will call the alert callbacks, and private methods will throw errors. This allows the public methods to catch the errors before they escape the library.

Running locally

clone the repo

git clone https://github.com/trevorhanus/remath

install node modules

npm install

run the tests

npm run test