UNPKG

lowdb-node

Version:

Tiny local JSON database for Node, Electron and the browser

343 lines (321 loc) 13.5 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var fs = require('fs'); var path = require('path'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs); var path__default = /*#__PURE__*/_interopDefaultLegacy(path); /*! ***************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ function __classPrivateFieldGet$1(receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); } function __classPrivateFieldSet$1(receiver, state, value, kind, f) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; } var __classPrivateFieldSet = (undefined && undefined.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var __classPrivateFieldGet = (undefined && undefined.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _Writer_instances, _Writer_filename, _Writer_tempFilename, _Writer_locked, _Writer_prev, _Writer_next, _Writer_nextPromise, _Writer_nextData, _Writer_add, _Writer_write; // Returns a temporary file // Example: for /some/file will return /some/.file.tmp function getTempFilename(file) { return path__default["default"].join(path__default["default"].dirname(file), '.' + path__default["default"].basename(file) + '.tmp'); } class Writer { constructor(filename) { _Writer_instances.add(this); _Writer_filename.set(this, void 0); _Writer_tempFilename.set(this, void 0); _Writer_locked.set(this, false); _Writer_prev.set(this, null); _Writer_next.set(this, null); _Writer_nextPromise.set(this, null); _Writer_nextData.set(this, null // File is locked, add data for later ); __classPrivateFieldSet(this, _Writer_filename, filename, "f"); __classPrivateFieldSet(this, _Writer_tempFilename, getTempFilename(filename), "f"); } async write(data) { return __classPrivateFieldGet(this, _Writer_locked, "f") ? __classPrivateFieldGet(this, _Writer_instances, "m", _Writer_add).call(this, data) : __classPrivateFieldGet(this, _Writer_instances, "m", _Writer_write).call(this, data); } } _Writer_filename = new WeakMap(), _Writer_tempFilename = new WeakMap(), _Writer_locked = new WeakMap(), _Writer_prev = new WeakMap(), _Writer_next = new WeakMap(), _Writer_nextPromise = new WeakMap(), _Writer_nextData = new WeakMap(), _Writer_instances = new WeakSet(), _Writer_add = function _Writer_add(data) { // Only keep most recent data __classPrivateFieldSet(this, _Writer_nextData, data, "f"); // Create a singleton promise to resolve all next promises once next data is written __classPrivateFieldSet(this, _Writer_nextPromise, __classPrivateFieldGet(this, _Writer_nextPromise, "f") || new Promise((resolve, reject) => { __classPrivateFieldSet(this, _Writer_next, [resolve, reject], "f"); }), "f"); // Return a promise that will resolve at the same time as next promise return new Promise((resolve, reject) => { var _a; (_a = __classPrivateFieldGet(this, _Writer_nextPromise, "f")) === null || _a === void 0 ? void 0 : _a.then(resolve).catch(reject); }); }, _Writer_write = // File isn't locked, write data async function _Writer_write(data) { var _a, _b; // Lock file __classPrivateFieldSet(this, _Writer_locked, true, "f"); try { // Atomic write await fs__default["default"].promises.writeFile(__classPrivateFieldGet(this, _Writer_tempFilename, "f"), data, 'utf-8'); await fs__default["default"].promises.rename(__classPrivateFieldGet(this, _Writer_tempFilename, "f"), __classPrivateFieldGet(this, _Writer_filename, "f")); // Call resolve (_a = __classPrivateFieldGet(this, _Writer_prev, "f")) === null || _a === void 0 ? void 0 : _a[0](); } catch (err) { // Call reject (_b = __classPrivateFieldGet(this, _Writer_prev, "f")) === null || _b === void 0 ? void 0 : _b[1](err); throw err; } finally { // Unlock file __classPrivateFieldSet(this, _Writer_locked, false, "f"); __classPrivateFieldSet(this, _Writer_prev, __classPrivateFieldGet(this, _Writer_next, "f"), "f"); __classPrivateFieldSet(this, _Writer_next, __classPrivateFieldSet(this, _Writer_nextPromise, null, "f"), "f"); if (__classPrivateFieldGet(this, _Writer_nextData, "f") !== null) { const nextData = __classPrivateFieldGet(this, _Writer_nextData, "f"); __classPrivateFieldSet(this, _Writer_nextData, null, "f"); await this.write(nextData); } } }; var _TextFile_filename, _TextFile_writer; class TextFile { constructor(filename) { _TextFile_filename.set(this, void 0); _TextFile_writer.set(this, void 0); __classPrivateFieldSet$1(this, _TextFile_filename, filename, "f"); __classPrivateFieldSet$1(this, _TextFile_writer, new Writer(filename), "f"); } async read() { let data; try { data = await fs__default["default"].promises.readFile(__classPrivateFieldGet$1(this, _TextFile_filename, "f"), 'utf-8'); } catch (e) { if (e.code === 'ENOENT') { return null; } throw e; } return data; } write(str) { return __classPrivateFieldGet$1(this, _TextFile_writer, "f").write(str); } } _TextFile_filename = new WeakMap(), _TextFile_writer = new WeakMap(); var _JSONFile_adapter; class JSONFile { constructor(filename) { _JSONFile_adapter.set(this, void 0); __classPrivateFieldSet$1(this, _JSONFile_adapter, new TextFile(filename), "f"); } async read() { const data = await __classPrivateFieldGet$1(this, _JSONFile_adapter, "f").read(); if (data === null) { return null; } else { return JSON.parse(data); } } write(obj) { return __classPrivateFieldGet$1(this, _JSONFile_adapter, "f").write(JSON.stringify(obj, null, 2)); } } _JSONFile_adapter = new WeakMap(); var _TextFileSync_tempFilename, _TextFileSync_filename; class TextFileSync { constructor(filename) { _TextFileSync_tempFilename.set(this, void 0); _TextFileSync_filename.set(this, void 0); __classPrivateFieldSet$1(this, _TextFileSync_filename, filename, "f"); __classPrivateFieldSet$1(this, _TextFileSync_tempFilename, path__default["default"].join(path__default["default"].dirname(filename), `.${path__default["default"].basename(filename)}.tmp`), "f"); } read() { let data; try { data = fs__default["default"].readFileSync(__classPrivateFieldGet$1(this, _TextFileSync_filename, "f"), 'utf-8'); } catch (e) { if (e.code === 'ENOENT') { return null; } throw e; } return data; } write(str) { fs__default["default"].writeFileSync(__classPrivateFieldGet$1(this, _TextFileSync_tempFilename, "f"), str); fs__default["default"].renameSync(__classPrivateFieldGet$1(this, _TextFileSync_tempFilename, "f"), __classPrivateFieldGet$1(this, _TextFileSync_filename, "f")); } } _TextFileSync_tempFilename = new WeakMap(), _TextFileSync_filename = new WeakMap(); var _JSONFileSync_adapter; class JSONFileSync { constructor(filename) { _JSONFileSync_adapter.set(this, void 0); __classPrivateFieldSet$1(this, _JSONFileSync_adapter, new TextFileSync(filename), "f"); } read() { const data = __classPrivateFieldGet$1(this, _JSONFileSync_adapter, "f").read(); if (data === null) { return null; } else { return JSON.parse(data); } } write(obj) { __classPrivateFieldGet$1(this, _JSONFileSync_adapter, "f").write(JSON.stringify(obj, null, 2)); } } _JSONFileSync_adapter = new WeakMap(); var _LocalStorage_key; class LocalStorage { constructor(key) { _LocalStorage_key.set(this, void 0); __classPrivateFieldSet$1(this, _LocalStorage_key, key, "f"); } read() { const value = localStorage.getItem(__classPrivateFieldGet$1(this, _LocalStorage_key, "f")); if (value === null) { return null; } return JSON.parse(value); } write(obj) { localStorage.setItem(__classPrivateFieldGet$1(this, _LocalStorage_key, "f"), JSON.stringify(obj)); } } _LocalStorage_key = new WeakMap(); var _Memory_data; class Memory { constructor() { _Memory_data.set(this, null); } read() { return Promise.resolve(__classPrivateFieldGet$1(this, _Memory_data, "f")); } write(obj) { __classPrivateFieldSet$1(this, _Memory_data, obj, "f"); return Promise.resolve(); } } _Memory_data = new WeakMap(); var _MemorySync_data; class MemorySync { constructor() { _MemorySync_data.set(this, null); } read() { return __classPrivateFieldGet$1(this, _MemorySync_data, "f") || null; } write(obj) { __classPrivateFieldSet$1(this, _MemorySync_data, obj, "f"); } } _MemorySync_data = new WeakMap(); class MissingAdapterError extends Error { constructor() { super(); this.message = 'Missing Adapter'; } } class Low { constructor(adapter) { Object.defineProperty(this, "adapter", { enumerable: true, configurable: true, writable: true, value: void 0 }); Object.defineProperty(this, "data", { enumerable: true, configurable: true, writable: true, value: null }); if (adapter) { this.adapter = adapter; } else { throw new MissingAdapterError(); } } async read() { this.data = await this.adapter.read(); } async write() { if (this.data) { await this.adapter.write(this.data); } } } class LowSync { constructor(adapter) { Object.defineProperty(this, "adapter", { enumerable: true, configurable: true, writable: true, value: void 0 }); Object.defineProperty(this, "data", { enumerable: true, configurable: true, writable: true, value: null }); if (adapter) { this.adapter = adapter; } else { throw new MissingAdapterError(); } } read() { this.data = this.adapter.read(); } write() { if (this.data !== null) { this.adapter.write(this.data); } } } exports.JSONFile = JSONFile; exports.JSONFileSync = JSONFileSync; exports.LocalStorage = LocalStorage; exports.Low = Low; exports.LowSync = LowSync; exports.Memory = Memory; exports.MemorySync = MemorySync; exports.TextFile = TextFile; exports.TextFileSync = TextFileSync;