Project Transfer Notice: Please check jstorm
localstorm has been officially transferred to the jstorm. This transfer aims to ensure the continuous development and improvement of the project to support more usecases.
To use jstorm
with localStorage
, you can simply try:
import { Model } from "jstorm/browser/local";
// Then, all the same with localstorm ;)
Object/Relation Mapper for LocalStorage.
npm install localstorm
Model
is an ORM (Object-Relation Mapper) for localStorage
, providing simple interfaces like ActiveRecord
.
NOTE:
Model
is NOT the best efficient accessor forlocalStorage
, BUT provides the best small and easy way to managelocalStorage
and automatically map the object to yourModel
class.
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 localStorage
More complicated models with relations? See schema
!
- 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 yet
let player = new Player({name: 'otiai20'});
player.save();
player._id // 2
- static
let player = Player.find(2);
player.name // 'otiai10'
player.update({name: 'otiai22'});
Player.find(player._id).name // 'otiai22'
player.delete();
Player.find(player._id) // undefined
- static
- an alias for
new
andsave
let player = Player.create({name: 'otiai99', age: 99});
player._id // 3
// Is equivalent to
Player.new({name: 'otiai99'}).save();
- static
- returns everything as a dictionary
const dict = Player.all(); // Object
dict[1].name // 'otiai10'
dict[1] instanceof Player // true
- static
- returns everything as an array
const players = Player.list(); // [Player]
players.length // 2
// Is equivalent to
Player.filter(() => true);
- static
- returns filtered array by filterFunc
const players = Player.filter(p => p.age < 40);
players.length // 1
- 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);
- static
- optional, default
undefined
- can define validations for each props of this model
- no validations, if
schema
is 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)),
}
}
- 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 // 1488061388928
Types
API provides followings:
- Validation data type of
Model
when it's saved. - Resolving relationship of
Model
s.
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)),
}
}