Универсальное хранилище для JavaScript-приложений. В браузере состояние сохраняется в localStorage, в Node.js в json-файле.
Две платформы. Один API.
$ npm i foxl-db --save
import { createStorage } from "foxl-db";
const db = createStorage({
path: "./db/foxldb.json", // путь до файла json
seed: {
foo: 42,
bar: {
baz: "42"
}
}
});
import { createStorage } from "foxl-db/web";
const db = createStorage({
path: "localstorage_key", // ключ в localStorage
seed: {
foo: 42,
bar: {
baz: "42"
}
}
});
// Получение
const foo = db.get("foo"); // 42
const bar = db.get("bar"); // { baz: "42" }
const baz = db.get("bar.baz"); // "42"
// Изменение
db.set("foo", 43);
db.set("bar.baz", "43");
Создает экземпляр хранилища. Описание полей params
:
path
- Обязательное поле. Ключ в localStorage для браузера или путь до каталога c БД для Node.js;save
- Опциональное поле. Еслиtrue
изменения будут сохраняться в хранилище, в противном случае, изменения не будут сохранены;seed
- Опциональное поле. Начальное состояние хранилища. Используется, если хранилище ранее не было инициализировано, т.е отсутствует запись по ключуpath
в localStorage в браузере или файлfoxldb.json
в каталогеpath
для Node.js.
Описание API экземпляра FoxlDB, созданного с помощью createStorage()
.
Возвращает значение поля.
const db = createStorage({
path: "./db",
seed: {
foo: 42,
bar: [1, 2, 3, 4]
}
});
db.get("foo"); // 42
db.get("bar"); // [1, 2, 3, 4]
db.get("baz"); // undefined
db.get("baz.bar"); // undefined
Изменяет поле в хранилище, если оно существует, если нет - создает с указанным значением.
Важно: Значение не будет изменено или создано, если родитель создаваемого свойства не объект.
const db = createStorage({
path: "./db",
seed: {
foo: 42
}
});
db.set("foo", 43); // Изменит значение "foo" на 43
console.log(db.get("foo")); // 43
db.set("foo.bar", 42); // Не будет применено, т.к родитель "foo" не объект
console.log(db.get("foo")); // 43
db.set("bar", false); // Создаст ключ "bar" со значением false
console.log(db.get("bar")); // false
db.set("posts", [{ id: 1, title: "Lorem" }]); // Создаст ключ "posts" с соответствующим значением
console.log(db.get("posts")); // [{ id: 1, title: "Lorem" }]
db.set("config.isDev", true); // Не будет создано, т.к родитель "config" не объект
db.set("config", { isDev: true }); // Создаст ключ "config" с соответствующим значением
console.log(db.get("config")); // { isDev: true }
db.set("config.isDev", false); // Изменит значение "config.isDev" на true
console.log(db.get("config")); // { isDev: false }
Лучшее решение, если необходимо изменить значение поля, используя текущее значение.
Функция reducer
будет вызвана с текущим значением, а возвращенный ей результат станет новым значением поля.
const db = createStorage({
path: "./db",
seed: {
config: { isDev: true, count: 0 },
numbers: [1, 2, 3, 4, 5]
}
});
// Вы можете изменять значение полей объектов
db.update("config", config => {
config.isDev = false;
return config;
});
console.log(db.get("config")); // { isDev: false, count: 0 }
db.update("numbers", numbers => numbers.map(number => number * 10));
console.log(db.get("numbers")); // [10, 20, 30, 40, 50]
// Если поле отсутствует, но может быть создано (родитель - объект), то оно будет создано
db.update("foo", () => 42);
console.log(db.get("foo")); // 42
Вы можете добавить функцию-наблюдателя за полем. Она будет вызвана при изменении поля методами set
, update
.
Данная функция (handler
) будет вызвана с двумя параметрами: nextValue
- новое значение, prevValue
- старое значение.
Важно: При вызове setState()
наблюдатели не будут вызваны, а так же произойдет отписка.
const db = createStorage({
path: "./db",
seed: {
value: 100
}
});
function valueWatcher(nextValue, prevValue) {
console.log(`Новое значение: ${nextValue}. Старое значение: ${prevValue}`);
}
db.watch("value", valueWatcher);
db.set("value", 150);
// Новое значение: 150. Старое значение: 100
db.update("value", val => val * 2);
// Новое значение: 300. Старое значение: 150
Позволяет создавать модель (FoxlModel
) для поля, предоставляя более удобный интерфейс взаимодействия с ним.
Для модели доступен вызов методов get
, set
, update
и watch
без указания path
.
Для выделения модели среди остальных переменных рекомендуется добавлять окончание $f
(например, user
=> user$f
).
const db = createStorage({
path: "./db",
seed: {
counter: 0
}
});
const counter$f = db.for("counter");
// Равнозначно: db.get("counter")
console.log(counter$f.get()); // 0
// Равнозначно: db.set("counter", 1)
counter$f.set(1); // Установка нового значения (1)
// Равнозначно: db.update("counter", value => value * 10)
counter$f.update(value => value * 10); // Установка нового значения (10)
// Равнозначно: db.watch("counter", ...)
counter$f.watch((next, prev) => {
console.log(`Было: ${prev}, стало: ${next}`);
});
Возвращает состояние экземпляра.
const db = createStorage({
path: "./db",
seed: {
counter: 0,
text: "Lorem",
foo: {
bar: [1, 2, 3, 4, 5],
baz: {
x: 10,
y: null
}
}
}
});
console.log(db.getState());
// {
// counter: 0,
// text: "Lorem",
// foo: {
// bar: [1,2,3,4,5],
// baz: {
// x: 10,
// y: null
// }
// }
// }
Устанавливает новое значение состояния.
Важно: Наблюдатели, добавленные методом watch
не будут вызваны, а так же их список будет очищен.
const db = createStorage({
path: "./db",
seed: {}
});
db.setState({ foo: 42 });
console.log(db.getState()); // { foo: 42 }