Comparing version 2.0.3 to 2.1.0
import { Adapter } from '../Low.js'; | ||
export declare class JSONFile<T> implements Adapter<T> { | ||
private filename; | ||
private writer; | ||
private adapter; | ||
constructor(filename: string); | ||
read(): Promise<T | null>; | ||
write(obj: unknown): Promise<void>; | ||
write(obj: T): Promise<void>; | ||
} |
@@ -1,24 +0,18 @@ | ||
import fs from 'fs'; | ||
import { Writer } from 'steno'; | ||
import { TextFile } from './TextFile.js'; | ||
export class JSONFile { | ||
constructor(filename) { | ||
this.filename = filename; | ||
this.writer = new Writer(filename); | ||
this.adapter = new TextFile(filename); | ||
} | ||
async read() { | ||
let data; | ||
try { | ||
data = await fs.promises.readFile(this.filename, 'utf-8'); | ||
const data = await this.adapter.read(); | ||
if (data === null) { | ||
return null; | ||
} | ||
catch (e) { | ||
if (e.code === 'ENOENT') { | ||
return null; | ||
} | ||
throw e; | ||
else { | ||
return JSON.parse(data); | ||
} | ||
return JSON.parse(data); | ||
} | ||
write(obj) { | ||
return this.writer.write(JSON.stringify(obj, null, 2)); | ||
return this.adapter.write(JSON.stringify(obj, null, 2)); | ||
} | ||
} |
import { SyncAdapter } from '../LowSync.js'; | ||
export declare class JSONFileSync<T> implements SyncAdapter<T> { | ||
private tempFilename; | ||
filename: string; | ||
private adapter; | ||
constructor(filename: string); | ||
@@ -6,0 +5,0 @@ read(): T | null; |
@@ -1,25 +0,18 @@ | ||
import fs from 'fs'; | ||
import path from 'path'; | ||
import { TextFileSync } from './TextFileSync.js'; | ||
export class JSONFileSync { | ||
constructor(filename) { | ||
this.filename = filename; | ||
this.tempFilename = path.join(path.dirname(filename), `.${path.basename(filename)}.tmp`); | ||
this.adapter = new TextFileSync(filename); | ||
} | ||
read() { | ||
let data; | ||
try { | ||
data = fs.readFileSync(this.filename, 'utf-8'); | ||
const data = this.adapter.read(); | ||
if (data === null) { | ||
return null; | ||
} | ||
catch (e) { | ||
if (e.code === 'ENOENT') { | ||
return null; | ||
} | ||
throw e; | ||
else { | ||
return JSON.parse(data); | ||
} | ||
return JSON.parse(data); | ||
} | ||
write(obj) { | ||
fs.writeFileSync(this.tempFilename, JSON.stringify(obj, null, 2)); | ||
fs.renameSync(this.tempFilename, this.filename); | ||
this.adapter.write(JSON.stringify(obj, null, 2)); | ||
} | ||
} |
@@ -6,3 +6,5 @@ export * from './adapters/JSONFile.js'; | ||
export * from './adapters/MemorySync.js'; | ||
export * from './adapters/TextFile.js'; | ||
export * from './adapters/TextFileSync.js'; | ||
export * from './Low.js'; | ||
export * from './LowSync.js'; |
@@ -6,3 +6,5 @@ export * from './adapters/JSONFile.js'; | ||
export * from './adapters/MemorySync.js'; | ||
export * from './adapters/TextFile.js'; | ||
export * from './adapters/TextFileSync.js'; | ||
export * from './Low.js'; | ||
export * from './LowSync.js'; |
{ | ||
"name": "lowdb", | ||
"version": "2.0.3", | ||
"version": "2.1.0", | ||
"description": "Tiny local JSON database for Node, Electron and the browser", | ||
@@ -5,0 +5,0 @@ "type": "module", |
@@ -21,3 +21,3 @@ # lowdb [![](http://img.shields.io/npm/dm/lowdb.svg?style=flat)](https://www.npmjs.org/package/lowdb) [![Node.js CI](https://github.com/typicode/lowdb/actions/workflows/node.js.yml/badge.svg)](https://github.com/typicode/lowdb/actions/workflows/node.js.yml) | ||
To help with OSS funding, lowdb v2 is released under Parity license for a limited time. It'll be released under MIT license once the __goal of 100 [sponsors](https://github.com/sponsors/typicode)__ is reached (currently at 55) or in five months. | ||
To help with OSS funding, lowdb v2 is released under Parity license for a limited time. It'll be released under MIT license once the __goal of 100 [sponsors](https://github.com/sponsors/typicode)__ is reached (currently at 57) or in five months. | ||
@@ -98,2 +98,3 @@ Meanwhile, lowdb v2 can be freely used in Open Source projects. Sponsors can use it in any type of project. | ||
} | ||
const adapter = new JSONFile<Data>('db.json') | ||
const db = new Low<Data>(adapter) | ||
@@ -223,2 +224,6 @@ | ||
#### `TextFile` `TextFileSync` | ||
Adapters for reading and writing text. Useful for creating custom adapters. | ||
### Third-party adapters | ||
@@ -230,3 +235,3 @@ | ||
You may want to create an adapter to write `db.data` to YAML, XML, ... or encrypt data. | ||
You may want to create an adapter to write `db.data` to YAML, XML, encrypt data, a remote storage, ... | ||
@@ -242,4 +247,4 @@ An adapter is a simple class that just needs to expose two methods: | ||
class SyncAdapter { | ||
read() { /* ... */ } // data | ||
write(data) { /* ... */ } // void | ||
read() { /* ... */ } // should return data | ||
write(data) { /* ... */ } // should return nothing | ||
} | ||
@@ -275,2 +280,37 @@ ``` | ||
#### Custom serialization | ||
To create an adapter for another format than JSON, you can use `TextFile` or `TextFileSync`. | ||
For example: | ||
```js | ||
import { Adapter, Low, TextFile } from 'Low.js' | ||
import YAML from 'yaml' | ||
export class YAMLFile { | ||
private adapter | ||
constructor(filename: string) { | ||
this.adapter = new TextFile(filename) | ||
} | ||
async read() { | ||
const data = await this.adapter.read() | ||
if (data === null) { | ||
return null | ||
} else { | ||
return YAML.parse(data) | ||
} | ||
} | ||
write(obj) { | ||
return this.adapter.write(YAML.stringify(obj)) | ||
} | ||
} | ||
const adapter = new YAMLFile('file.yaml') | ||
const db = new Low(adapter) | ||
``` | ||
## Limits | ||
@@ -277,0 +317,0 @@ |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
23924
28
261
323