1.0.0 • Published 3 years ago
localstorm v1.0.0
localstorm
Object/Relation Mapper for LocalStorage.
Installation
npm install localstormModel
Model is an ORM (Object-Relation Mapper) for localStorage, providing simple interfaces like ActiveRecord.
NOTE:
Modelis NOT the best efficient accessor forlocalStorage, BUT provides the best small and easy way to managelocalStorageand automatically map the object to yourModelclass.
How to use
class Player extends Model {}
let player = new Player({name: 'otiai10', age: 31});
player.name // 'otiai10'
player.age // 31
player._id // undefined, because not saved yet
player.save();
player._id // 1, because it's saved to localStorageMore complicated models with relations? See schema!
Methods
new
- static
- an alias for
constructor
let player = Player.new({name: 'otiai20', age: 43});
player.name // 'otiai10'
player.age // 31
player._id // undefined, because not saved yetsave
let player = new Player({name: 'otiai20'});
player.save();
player._id // 2find
- static
let player = Player.find(2);
player.name // 'otiai10'update
player.update({name: 'otiai22'});
Player.find(player._id).name // 'otiai22'delete
player.delete();
Player.find(player._id) // undefinedcreate
- static
- an alias for
newandsave
let player = Player.create({name: 'otiai99', age: 99});
player._id // 3
// Is equivalent to
Player.new({name: 'otiai99'}).save();all
- static
- returns everything as a dictionary
const dict = Player.all(); // Object
dict[1].name // 'otiai10'
dict[1] instanceof Player // truelist
- static
- returns everything as an array
const players = Player.list(); // [Player]
players.length // 2
// Is equivalent to
Player.filter(() => true);filter
- static
- returns filtered array by filterFunc
const players = Player.filter(p => p.age < 40);
players.length // 1useStorage
- static
- replace storage with anything which satisfies Storage interface
Model.useStorage(window.sessionStorage);
// For example, you can embed any extra operation for getItem/setItem/removeItem
const storage = new MyStorageWithEffortAsyncPushing();
Model.useStorage(storage);Properties
schema
- static
- optional, default
undefined - can define validations for each props of this model
- no validations, if
schemais not set
class Player extends Model {
static schema = {
name: Model.Types.string.isRequired,
age: Model.Types.number, // optional
location: Model.Types.shape({
address: Model.Types.string,
visible: Model.Types.bool.isRequired,
}),
}
}with relations
class Team extends Model {
static schema = {
name: Model.Types.string.isRequired,
leader: Model.Types.reference(Player),
members: Model.Types.arrayOf(Model.Types.reference(Player)),
}
}nextID
- static
- optional, default
timestampID - replace it if you want to change algorythm of generating next id
Player.nextID = () => Date.now();
Player.create({name: 'otiai2017'})._id // 1488061388247
Player.create({name: 'otiai1986'})._id // 1488061388928Types
Types API provides followings:
- Validation data type of
Modelwhen it's saved. - Resolving relationship of
Models.
Examples
import {Model, Types} from "localstorm";
class User extends Model {
protected static schema = {
name: Types.string.isRequired,
age: Types.number,
langs: Types.arrayOf(Types.string),
}
}
class Team extends Model {
protected static schema = {
name: Types.string.isRequired,
active: Types.bool.isRequired,
address: Types.shape({
country: Types.string,
street: Types.string,
postcode: Types.number,
}),
leader: Types.reference(User, {eager: true}),
members: Types.arrayOf(Types.reference(User)),
roles: Types.dictOf(Types.reference(User)),
}
}1.0.0
3 years ago