extendable-record

Extendable (Inheritable) Immutable Records for Immutable Object Oriented Patterns


Keywords
immutable, immutablejs, object-oriented, oo, class, extend
License
MIT
Install
npm install extendable-record@1.0.0

Documentation

Version Build Status MIT license dependencies devDependency Status airbnb code style


Extends ImmutableJS Records enabling class inheritance

Dependencies

Getting Started

npm install extendable-record --save

Usage

import { ExtendableRecord } from  'extendable-record';

class BaseModel extends ExtendableRecord {
  isComplete() {
    return true;
  }
  isValid() {
    return true;
  }
}

// default properties describe the set of properties which can be
// set/read. Properties are exposed via getters, so you can use the syntax
// var model = new BaseModel();
// console.log(model.value);
BaseModel.defaultProperties = {
  value: null
};

class TextModel extends BaseModel {
  get length() {
    return this.value.length;
  }
  isComplete() {
    return this.value.length !== 0;
  }
  isValid() {
    return typeof this.value === 'string';
  }
  toLower() {
    return this.set('value', this.value.toLocaleLowerCase());
  }
}

// default properties extend and overwrite the properties of
// the parent. Here, TextModel instances will always default to '',
// but we do have the option of adding extra properties
TextModel.defaultProperties = {
  value: ''
};

class EmailModel extends TextModel {
  isValid() {
    return super.isValid() && /^[^@]+@[^\.]+\.(?:com|edu|biz)$/.test(this.value);
  }
}

class NumberModel extends BaseModel {
  isValid() {
    return typeof this.value === "number";
  }
  add(val) {
    return this.set('value', this.value + val);
  }
  toString() {
    return this.units ? `${this.value} ${this.units}` : this.value;
  }
}

NumberModel.defaultProperties = {
  value: 0,
  units: null
};



const bobsEmail = new EmailModel({value: 'bob@gmail.com'});
console.log(bobsEmail.isValid()); // true
console.log(bobsEmail.set('value', 'bobATgmailDOTcom').isValid()); // false
console.log(bobsEmail.isValid()); // true -- bobsEmail has not been mutated

const myBank = new NumberModel({units: 'dollars'});
console.log(myBank.toString()); // 0 dollars
const myBankAfterDreamOfWinningLotto = myBank.add(100000000);
console.log(myBankAfterDreamOfWinningLotto.toString()); // 100000000 dollars
console.log(myBank.toString()); // 0 dollars -- myBank was not mutated :(

Credits

  • ImmutableJS for underlying data structures
  • npm-starter
  • Airbnb for the work they've put into the javascript style guide and into the ESlint package.

License

MIT @ Joe Delgado