@binaris/shift-db
Advanced tools
Sorry, the diff of this file is not supported yet
| DEBUG: loaded | ||
| DEBUG: start before | ||
| DEBUG: tmpdir /var/folders/k7/8lqpw3ws3ybd5_rm_1jvzlj00000gn/T/test-state-ZB8J5q | ||
| DEBUG: listening on undefined | ||
| DEBUG: started { ctx: | ||
| { dbDir: | ||
| '/var/folders/k7/8lqpw3ws3ybd5_rm_1jvzlj00000gn/T/test-state-ZB8J5q', | ||
| client: DBHandler { ctx: [Object], client: [DBClient] } } } |
| >>> @binaris/shift-db | ||
| rm -rf dist/ && tsc |
| export {}; | ||
| //# sourceMappingURL=db.d.ts.map |
| {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../../src/test/component/db.ts"],"names":[],"mappings":""} |
| "use strict"; | ||
| var __importDefault = (this && this.__importDefault) || function (mod) { | ||
| return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
| }; | ||
| var __importStar = (this && this.__importStar) || function (mod) { | ||
| if (mod && mod.__esModule) return mod; | ||
| var result = {}; | ||
| if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; | ||
| result["default"] = mod; | ||
| return result; | ||
| }; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| const ava_1 = __importDefault(require("ava")); | ||
| const shift_leveldb_server_1 = require("@binaris/shift-leveldb-server"); | ||
| const shift_interfaces_koa_server_1 = require("@binaris/shift-interfaces-koa-server"); | ||
| const __1 = require("../.."); | ||
| const fs_1 = require("fs"); | ||
| const rmfr_1 = __importDefault(require("rmfr")); | ||
| const os_1 = require("os"); | ||
| const util_1 = require("util"); | ||
| const path = __importStar(require("path")); | ||
| const koa_1 = __importDefault(require("koa")); | ||
| const koa_router_1 = __importDefault(require("koa-router")); | ||
| const http_1 = require("http"); | ||
| const test = ava_1.default; | ||
| async function listenOn(app) { | ||
| return new Promise((resolve, reject) => { | ||
| const server = http_1.createServer(app.callback()) | ||
| .listen(undefined, 'localhost', () => resolve(server)); | ||
| server.once('error', reject); | ||
| }); | ||
| } | ||
| process.env.APP_ID = 'testing'; | ||
| process.env.API_KEY = '1234'; | ||
| test.beforeEach(async (t) => { | ||
| const dbDir = await util_1.promisify(fs_1.mkdtemp)(path.join(os_1.tmpdir(), 'test-state-'), 'utf8'); | ||
| const db = new shift_leveldb_server_1.DB(`${dbDir}/root.db`); | ||
| const dbRouter = new shift_interfaces_koa_server_1.DBRouter(db, true); | ||
| const router = new koa_router_1.default(); | ||
| router.use('/v1', dbRouter.koaRouter.routes(), dbRouter.koaRouter.allowedMethods()); | ||
| const app = new koa_1.default(); | ||
| app.use(router.routes()); | ||
| app.use(router.allowedMethods()); | ||
| const server = await listenOn(app); | ||
| const port = server.address().port; | ||
| const url = `http://localhost:${port}`; | ||
| process.env.DB_BASE_URL = url; | ||
| // Instantiate DBHandler with proper URL set up. | ||
| const client = new __1.DBHandler({ timeoutMs: 1000 }); | ||
| t.context = { | ||
| dbDir, | ||
| client, | ||
| }; | ||
| }); | ||
| test.afterEach(async (t) => { | ||
| await rmfr_1.default(t.context.dbDir); | ||
| }); | ||
| test('DB.get returns undefined when no key exists', async (t) => { | ||
| const { client } = t.context; | ||
| const value = await client.get('test'); | ||
| t.assert(value === undefined); | ||
| }); | ||
| test('DB.create creates a new document and returns true', async (t) => { | ||
| const { client } = t.context; | ||
| const ret = await client.create('test', { a: 1 }); | ||
| const value = await client.get('test'); | ||
| t.deepEqual(value, { a: 1 }); | ||
| t.true(ret); | ||
| }); | ||
| test('DB.create returns false if key already exists', async (t) => { | ||
| const { client } = t.context; | ||
| await client.create('test', { a: 1 }); | ||
| t.false(await client.create('test', { a: 2 })); | ||
| }); | ||
| test('DB.create throws TypeError when value forced undefined', async (t) => { | ||
| const { client } = t.context; | ||
| await t.throwsAsync(client.create('test', undefined), { | ||
| instanceOf: TypeError, | ||
| message: /undefined/, | ||
| }); | ||
| }); | ||
| test('DB.create throws TypeError when value is a function', async (t) => { | ||
| const { client } = t.context; | ||
| await t.throwsAsync(client.create('test', () => 17), { | ||
| instanceOf: TypeError, | ||
| message: /function/, | ||
| }); | ||
| }); | ||
| test('DB.create throws TypeError when value is a bigint', async (t) => { | ||
| const { client } = t.context; | ||
| await t.throwsAsync(client.create('test', BigInt(17)), { | ||
| instanceOf: TypeError, | ||
| message: /bigint/, | ||
| }); | ||
| }); | ||
| test('DB.create accepts arbitrary JSONables', async (t) => { | ||
| const { client } = t.context; | ||
| await client.create('test_string', 'hey'); | ||
| await client.create('test_number', 7); | ||
| await client.create('test_boolean', true); | ||
| await client.create('test_object', { a: [7] }); | ||
| await client.create('test_object', [{ a: 7 }]); | ||
| t.pass(); | ||
| }); | ||
| test('DB.remove returns false when no key exists', async (t) => { | ||
| const { client } = t.context; | ||
| t.false(await client.remove('test')); | ||
| }); | ||
| test('DB.remove returns false when key was already deleted', async (t) => { | ||
| const { client } = t.context; | ||
| await client.create('test', { a: 1 }); | ||
| await client.remove('test'); | ||
| t.false(await client.remove('test')); | ||
| }); | ||
| test('DB.remove removes existing key from DB and returns true', async (t) => { | ||
| const { client } = t.context; | ||
| await client.create('test', { a: 1 }); | ||
| t.true(await client.remove('test')); | ||
| t.is(await client.get('test'), undefined); | ||
| }); | ||
| test('DB.remove removes the key', async (t) => { | ||
| const { client } = t.context; | ||
| await client.create('test', { a: 1 }); | ||
| t.true(await client.remove('test')); | ||
| const value = await client.get('test'); | ||
| t.assert(value === undefined); | ||
| }); | ||
| test('DB.update creates a new document if key does not exist, returns it, sets version to 1', async (t) => { | ||
| const { client } = t.context; | ||
| const next = await client.update('test', (prev) => (Object.assign({}, prev, { a: 1 }))); | ||
| const value = await client.get('test'); | ||
| t.deepEqual(value, { a: 1 }); | ||
| t.deepEqual(next, value); | ||
| }); | ||
| test('DB.update updates an existing document, returns it, and increments version', async (t) => { | ||
| const { client } = t.context; | ||
| await client.create('test', { b: 2 }); | ||
| const next = await client.update('test', (prev) => (Object.assign({}, prev, { a: 1 }))); | ||
| const value = await client.get('test'); | ||
| t.deepEqual(value, { a: 1, b: 2 }); | ||
| t.deepEqual(next, value); | ||
| }); | ||
| test('DB.update does nothing if document not updated', async (t) => { | ||
| const { client } = t.context; | ||
| await client.create('test', { b: 2 }); | ||
| const next = await client.update('test', (prev) => (Object.assign({}, prev))); | ||
| const value = await client.get('test'); | ||
| t.deepEqual(value, { b: 2 }); | ||
| t.deepEqual(next, value); | ||
| // TODO(ariels): Verify no update on an ongoing poll. | ||
| }); | ||
| // TODO(ariels): Retrieve poll tests from old db/src/db.ts. | ||
| test('DB.create works after remove', async (t) => { | ||
| const { client } = t.context; | ||
| await client.create('test', 7); | ||
| await client.remove('test'); | ||
| t.true(await client.create('test', 8)); | ||
| const value = await client.get('test'); | ||
| t.assert(value === 8); | ||
| }); | ||
| // TODO(ariels): DB.update works after remove but increments version and includes tombstone\'s patches' | ||
| test('DB.update throws TypeError if updater returned undefined', async (t) => { | ||
| const { client } = t.context; | ||
| await t.throwsAsync(client.update('test', () => undefined), TypeError); | ||
| }); | ||
| test('CLIENT.update throws TypeError if trying to modify returned object', async (t) => { | ||
| const { client } = t.context; | ||
| await client.create('test', { a: 1, b: { c: 2, d: [5] } }); | ||
| await t.throwsAsync(client.update('test', (obj) => { | ||
| obj.a = 2; | ||
| return obj; | ||
| }), TypeError); | ||
| await t.throwsAsync(client.update('test', (obj) => { | ||
| obj.b.c = 3; | ||
| return obj; | ||
| }), TypeError); | ||
| await t.throwsAsync(client.update('test', (obj) => { | ||
| obj.b.d[0] = 6; | ||
| return obj; | ||
| }), TypeError); | ||
| }); | ||
| //# sourceMappingURL=db.js.map |
| {"version":3,"file":"db.js","sourceRoot":"","sources":["../../../src/test/component/db.ts"],"names":[],"mappings":"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"} |
| { | ||
| "files": { | ||
| "db-client/package.json": "de9cb18da4b3516fe0b763d547d9258bb65b38f0", | ||
| "db-client/src/index.ts": "bdfd33ff816857efe5a383c2c6854faa84d12190", | ||
| "db-client/src/test/component/db.ts": "d35a3788e8d1d3d6a42f0abd50efd9567b12bd96", | ||
| "db-client/tsconfig.json": "383425b283005db5d0677d2116cb9b66f739985a", | ||
| "common/config/rush/shrinkwrap.yaml": "186870aead95700ad5d3b6e82e261de5621bf26b" | ||
| }, | ||
| "arguments": "rm -rf dist/ && tsc " | ||
| } |
Sorry, the diff of this file is not supported yet
+170
| import { DBClient, Options } from '@binaris/shift-interfaces-node-client'; | ||
| import { | ||
| ClientContext, UpdateOptions, Version, VersionedMaybeObject, Serializable | ||
| } from '@binaris/shift-interfaces-node-client/interfaces'; | ||
| import deepFreeze, { DeepReadonly } from 'deep-freeze'; | ||
| import { merge } from 'ramda'; | ||
| import * as process from 'process'; | ||
| export interface Versioned<T extends Serializable | undefined> { | ||
| version: Version; | ||
| value: T; | ||
| } | ||
| const defaultOptions: Options = { | ||
| timeoutMs: 2000, | ||
| }; | ||
| // bigint not currently allowed. | ||
| const allowedTypes = new Set(['object', 'boolean', 'number', 'string']); | ||
| function checkValue(value: Serializable) { | ||
| if (!allowedTypes.has(typeof value)) { | ||
| throw new TypeError(`Non-JSONable value of type ${typeof value} at top level`); | ||
| } | ||
| } | ||
| // Generates successive promises to sleep in order to back off. (Not | ||
| // an async iterator, so you can generate the promise to back off, | ||
| // then try something, and then back off for the remainder of the | ||
| // generated time.) | ||
| function* backoff() { | ||
| let delayMs = 20; | ||
| for (;;) { | ||
| yield new Promise((res) => setTimeout(res, delayMs)); | ||
| delayMs *= 1.2; | ||
| } | ||
| } | ||
| export class DBHandler { | ||
| private readonly client: DBClient; | ||
| private readonly ctx: ClientContext = { | ||
| auth: { | ||
| v1: { | ||
| // TODO(ariels): Update with prefixes from binaris/spice#616. | ||
| appId: process.env.APP_ID!, | ||
| apiKey: process.env.API_KEY!, | ||
| }, | ||
| }, | ||
| }; | ||
| constructor(options?: Options) { | ||
| this.client = new DBClient(`${process.env.DB_BASE_URL!}/v1`, merge(defaultOptions, options)); | ||
| } | ||
| public async get<T extends Serializable = any>(key: string): Promise<T | undefined> { | ||
| return (await this.client.get(this.ctx, key)) as T; | ||
| } | ||
| public async create(key: string, value: Serializable): Promise<boolean> { | ||
| checkValue(value); | ||
| return await this.client.create(this.ctx, key, value); | ||
| } | ||
| public async remove(key: string): Promise<boolean> { | ||
| return await this.client.remove(this.ctx, key); | ||
| } | ||
| // TODO(ariels): Support operationId for streaming. | ||
| public async update<T extends Serializable = any>( | ||
| key: string, updater: (state?: DeepReadonly<T>) => T, _options?: UpdateOptions, | ||
| ): Promise<DeepReadonly<T>> { | ||
| for (const delay of backoff()) { | ||
| const { value, version } = await this.getWithVersion(key); | ||
| // deepFreeze doesn't like some values (like undefined), trick | ||
| // it by referring to value in an object. | ||
| const newValue = updater(deepFreeze({ value: value as T }).value); | ||
| checkValue(newValue); | ||
| if (await this.setIfVersion(key, newValue, version)) return deepFreeze(newValue); | ||
| await delay; | ||
| } | ||
| throw Error('Timed out'); // backoff() is currently infinite but | ||
| // won't stay that way. Needed for | ||
| // TypeScript. | ||
| } | ||
| private getWithVersion(key: string): Promise<VersionedMaybeObject> { | ||
| return this.client.getWithVersion(this.ctx, key); | ||
| } | ||
| public async startPolling<T extends Serializable = any>(_key: string): Promise<Versioned<T | undefined>> { | ||
| throw new Error('Unimplemented'); | ||
| } | ||
| public async find(): Promise<any[]> { | ||
| throw new Error('Unimplemented'); | ||
| } | ||
| private async setIfVersion( | ||
| key: string, | ||
| value: Serializable, | ||
| version: Version | ||
| ): Promise<boolean> { | ||
| return await this.client.setIfVersion(this.ctx, key, version, value); | ||
| } | ||
| } | ||
| const db = new DBHandler(); | ||
| /** | ||
| * Gets a single document. | ||
| * @return - value or undefined if key doesn’t exist. | ||
| */ | ||
| export async function get<T extends Serializable = any>(key: string): Promise<T | undefined> { | ||
| return await db.get(key); | ||
| } | ||
| /** | ||
| * Creates a document for given key. | ||
| * @param value - Cannot be undefined, must be an object | ||
| * @return - true if document was created, false if key already exists. | ||
| */ | ||
| export async function create(key: string, value: Serializable): Promise<boolean> { | ||
| return await db.create(key, value); | ||
| } | ||
| /** | ||
| * Removes a single document. | ||
| * @return - true if document was deleted, false if key doesn’t exist. | ||
| */ | ||
| export async function remove(key: string): Promise<boolean> { | ||
| return await db.remove(key); | ||
| } | ||
| /** | ||
| * Updates a single document. | ||
| * @param updater - Function that gets the previous value and returns the next value to update the DB with. | ||
| * Cannot return undefined, receives undefined in case key doesn’t already exist in the DB. | ||
| * @return - The new value returned from updater | ||
| */ | ||
| export async function update<T extends Serializable = any>( | ||
| key: string, updater: (state?: DeepReadonly<T>) => T, options?: UpdateOptions, | ||
| ): Promise<DeepReadonly<T>> { | ||
| return await db.update(key, updater, options); | ||
| } | ||
| // Available only on backend, needs to pass a function. | ||
| /** | ||
| * Find documents matching query. | ||
| * @param query - a query constructed with Q methods. | ||
| * @return - an array of documents | ||
| */ | ||
| export async function find(): Promise<any[]> { | ||
| throw new Error('Unimplemented'); | ||
| } | ||
| /** | ||
| * Polls on updates to specified keys since specified versions. | ||
| */ | ||
| export async function poll(): Promise<any> { | ||
| throw new Error('Unimplemented'); | ||
| } | ||
| poll.__shiftjs__ = { exposed: true }; | ||
| /** | ||
| * Gets a initial document in an intent to for poll on it. | ||
| */ | ||
| export async function startPolling<T extends Serializable = any>(_key: string): Promise<Versioned<T | undefined>> { | ||
| throw new Error('Unimplemented'); | ||
| } | ||
| startPolling.__shiftjs__ = { exposed: true }; |
Sorry, the diff of this file is not supported yet
| import anyTest, { TestInterface } from 'ava'; | ||
| import { DB } from '@binaris/shift-leveldb-server'; | ||
| import { DBRouter } from '@binaris/shift-interfaces-koa-server'; | ||
| import { DBHandler } from '../..'; | ||
| import { mkdtemp } from 'fs'; | ||
| import rmrf from 'rmfr'; | ||
| import { tmpdir } from 'os'; | ||
| import { promisify } from 'util'; | ||
| import * as path from 'path'; | ||
| import { AddressInfo } from 'net'; | ||
| import Koa from 'koa'; | ||
| import KoaRouter from 'koa-router'; | ||
| import { createServer, Server } from 'http'; | ||
| interface Context { | ||
| dbDir: string; | ||
| client: DBHandler; | ||
| } | ||
| const test = anyTest as TestInterface<Context>; | ||
| async function listenOn(app: Koa): Promise<Server> { | ||
| return new Promise((resolve, reject) => { | ||
| const server = createServer(app.callback()) | ||
| .listen(undefined, 'localhost', () => resolve(server)); | ||
| server.once('error', reject); | ||
| }); | ||
| } | ||
| process.env.APP_ID = 'testing'; | ||
| process.env.API_KEY = '1234'; | ||
| test.beforeEach(async (t) => { | ||
| const dbDir = await promisify(mkdtemp)(path.join(tmpdir(), 'test-state-'), 'utf8'); | ||
| const db = new DB(`${dbDir}/root.db`); | ||
| const dbRouter = new DBRouter(db, true); | ||
| const router = new KoaRouter(); | ||
| router.use('/v1', dbRouter.koaRouter.routes(), dbRouter.koaRouter.allowedMethods()); | ||
| const app = new Koa(); | ||
| app.use(router.routes()); | ||
| app.use(router.allowedMethods()); | ||
| const server = await listenOn(app); | ||
| const port = (server.address() as unknown as AddressInfo).port; | ||
| const url = `http://localhost:${port}`; | ||
| process.env.DB_BASE_URL = url; | ||
| // Instantiate DBHandler with proper URL set up. | ||
| const client = new DBHandler({ timeoutMs: 1000 }); | ||
| t.context = { | ||
| dbDir, | ||
| client, | ||
| }; | ||
| }); | ||
| test.afterEach(async (t) => { | ||
| await rmrf(t.context.dbDir); | ||
| }); | ||
| test('DB.get returns undefined when no key exists', async (t) => { | ||
| const { client } = t.context; | ||
| const value = await client.get('test'); | ||
| t.assert(value === undefined); | ||
| }); | ||
| test('DB.create creates a new document and returns true', async (t) => { | ||
| const { client } = t.context; | ||
| const ret = await client.create('test', { a: 1 }); | ||
| const value = await client.get('test'); | ||
| t.deepEqual(value, { a: 1 }); | ||
| t.true(ret); | ||
| }); | ||
| test('DB.create returns false if key already exists', async (t) => { | ||
| const { client } = t.context; | ||
| await client.create('test', { a: 1 }); | ||
| t.false(await client.create('test', { a: 2 })); | ||
| }); | ||
| test('DB.create throws TypeError when value forced undefined', async (t) => { | ||
| const { client } = t.context; | ||
| await t.throwsAsync(client.create('test', undefined as any), { | ||
| instanceOf: TypeError, | ||
| message: /undefined/, | ||
| }); | ||
| }); | ||
| test('DB.create throws TypeError when value is a function', async (t) => { | ||
| const { client } = t.context; | ||
| await t.throwsAsync(client.create('test', () => 17), { | ||
| instanceOf: TypeError, | ||
| message: /function/, | ||
| }); | ||
| }); | ||
| test('DB.create throws TypeError when value is a bigint', async (t) => { | ||
| const { client } = t.context; | ||
| await t.throwsAsync(client.create('test', BigInt(17)), { | ||
| instanceOf: TypeError, | ||
| message: /bigint/, | ||
| }); | ||
| }); | ||
| test('DB.create accepts arbitrary JSONables', async (t) => { | ||
| const { client } = t.context; | ||
| await client.create('test_string', 'hey'); | ||
| await client.create('test_number', 7); | ||
| await client.create('test_boolean', true); | ||
| await client.create('test_object', { a: [7] }); | ||
| await client.create('test_object', [{ a: 7 }]); | ||
| t.pass(); | ||
| }); | ||
| test('DB.remove returns false when no key exists', async (t) => { | ||
| const { client } = t.context; | ||
| t.false(await client.remove('test')); | ||
| }); | ||
| test('DB.remove returns false when key was already deleted', async (t) => { | ||
| const { client } = t.context; | ||
| await client.create('test', { a: 1 }); | ||
| await client.remove('test'); | ||
| t.false(await client.remove('test')); | ||
| }); | ||
| test('DB.remove removes existing key from DB and returns true', async (t) => { | ||
| const { client } = t.context; | ||
| await client.create('test', { a: 1 }); | ||
| t.true(await client.remove('test')); | ||
| t.is(await client.get('test'), undefined); | ||
| }); | ||
| test('DB.remove removes the key', async (t) => { | ||
| const { client } = t.context; | ||
| await client.create('test', { a: 1 }); | ||
| t.true(await client.remove('test')); | ||
| const value = await client.get('test'); | ||
| t.assert(value === undefined); | ||
| }); | ||
| test('DB.update creates a new document if key does not exist, returns it, sets version to 1', async (t) => { | ||
| const { client } = t.context; | ||
| const next = await client.update('test', (prev) => ({ ...prev, a: 1 })); | ||
| const value = await client.get('test'); | ||
| t.deepEqual(value, { a: 1 }); | ||
| t.deepEqual(next, value); | ||
| }); | ||
| test('DB.update updates an existing document, returns it, and increments version', async (t) => { | ||
| const { client } = t.context; | ||
| await client.create('test', { b: 2 }); | ||
| const next = await client.update('test', (prev) => ({ ...prev, a: 1 })); | ||
| const value = await client.get('test'); | ||
| t.deepEqual(value, { a: 1, b: 2 }); | ||
| t.deepEqual(next, value); | ||
| }); | ||
| test('DB.update does nothing if document not updated', async (t) => { | ||
| const { client } = t.context; | ||
| await client.create('test', { b: 2 }); | ||
| const next = await client.update('test', (prev) => ({ ...prev })); | ||
| const value = await client.get('test'); | ||
| t.deepEqual(value, { b: 2 }); | ||
| t.deepEqual(next, value); | ||
| // TODO(ariels): Verify no update on an ongoing poll. | ||
| }); | ||
| // TODO(ariels): Retrieve poll tests from old db/src/db.ts. | ||
| test('DB.create works after remove', async (t) => { | ||
| const { client } = t.context; | ||
| await client.create('test', 7); | ||
| await client.remove('test'); | ||
| t.true(await client.create('test', 8)); | ||
| const value = await client.get('test'); | ||
| t.assert(value === 8); | ||
| }); | ||
| // TODO(ariels): DB.update works after remove but increments version and includes tombstone\'s patches' | ||
| test('DB.update throws TypeError if updater returned undefined', async (t) => { | ||
| const { client } = t.context; | ||
| await t.throwsAsync(client.update('test', () => undefined as any), TypeError); | ||
| }); | ||
| test('CLIENT.update throws TypeError if trying to modify returned object', async (t) => { | ||
| const { client } = t.context; | ||
| await client.create('test', { a: 1, b: { c: 2, d: [5] } }); | ||
| await t.throwsAsync(client.update('test', (obj) => { | ||
| (obj as any).a = 2; | ||
| return obj; | ||
| }), TypeError); | ||
| await t.throwsAsync(client.update('test', (obj) => { | ||
| (obj as any).b.c = 3; | ||
| return obj; | ||
| }), TypeError); | ||
| await t.throwsAsync(client.update('test', (obj) => { | ||
| (obj as any).b.d[0] = 6; | ||
| return obj; | ||
| }), TypeError); | ||
| }); |
Sorry, the diff of this file is not supported yet
| { | ||
| "extends": "../common/tsconfig.json", | ||
| "compilerOptions": { | ||
| "outDir": "dist", | ||
| } | ||
| } |
Sorry, the diff of this file is not supported yet
+23
-7
@@ -1,5 +0,21 @@ | ||
| /// <reference types="deep-freeze" /> | ||
| import { Q, Serializable, Document, DeepReadonly, UpdateOptions, KeyedPatches, KeyedVersions, Versioned } from './db'; | ||
| export { Serializable, Q, Document, DeepReadonly, UpdateOptions, Versioned }; | ||
| export { ValueError } from './errors'; | ||
| import { Options } from '@binaris/shift-interfaces-node-client'; | ||
| import { UpdateOptions, Version, Serializable } from '@binaris/shift-interfaces-node-client/interfaces'; | ||
| import { DeepReadonly } from 'deep-freeze'; | ||
| export interface Versioned<T extends Serializable | undefined> { | ||
| version: Version; | ||
| value: T; | ||
| } | ||
| export declare class DBHandler { | ||
| private readonly client; | ||
| private readonly ctx; | ||
| constructor(options?: Options); | ||
| get<T extends Serializable = any>(key: string): Promise<T | undefined>; | ||
| create(key: string, value: Serializable): Promise<boolean>; | ||
| remove(key: string): Promise<boolean>; | ||
| update<T extends Serializable = any>(key: string, updater: (state?: DeepReadonly<T>) => T, _options?: UpdateOptions): Promise<DeepReadonly<T>>; | ||
| private getWithVersion; | ||
| startPolling<T extends Serializable = any>(_key: string): Promise<Versioned<T | undefined>>; | ||
| find(): Promise<any[]>; | ||
| private setIfVersion; | ||
| } | ||
| /** | ||
@@ -33,7 +49,7 @@ * Gets a single document. | ||
| */ | ||
| export declare function find(query: Q.Query): Promise<Document[]>; | ||
| export declare function find(): Promise<any[]>; | ||
| /** | ||
| * Polls on updates to specified keys since specified versions. | ||
| */ | ||
| export declare function poll(keysToVersions: KeyedVersions): Promise<KeyedPatches>; | ||
| export declare function poll(): Promise<any>; | ||
| export declare namespace poll { | ||
@@ -47,3 +63,3 @@ var __shiftjs__: { | ||
| */ | ||
| export declare function startPolling<T extends Serializable = any>(key: string): Promise<Versioned<T | undefined>>; | ||
| export declare function startPolling<T extends Serializable = any>(_key: string): Promise<Versioned<T | undefined>>; | ||
| export declare namespace startPolling { | ||
@@ -50,0 +66,0 @@ var __shiftjs__: { |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,OAAO,EAEL,CAAC,EACD,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,aAAa,EACb,SAAS,EACV,MAAM,MAAM,CAAC;AAEd,OAAO,EAAE,YAAY,EAAE,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAStC;;;GAGG;AACH,wBAAsB,GAAG,CAAC,CAAC,SAAS,YAAY,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAE3F;AAED;;;;GAIG;AACH,wBAAsB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAE/E;AAED;;;GAGG;AACH,wBAAsB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE1D;AAED;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,CAAC,SAAS,YAAY,GAAG,GAAG,EACvD,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,GAC5E,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAE1B;AAED;;;;GAIG;AACH,wBAAsB,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAE9D;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,cAAc,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAE/E;yBAFqB,IAAI;;;;;AAK1B;;GAEG;AACH,wBAAsB,YAAY,CAAC,CAAC,SAAS,YAAY,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAa/G;yBAbqB,YAAY"} | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,OAAO,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EACU,aAAa,EAAE,OAAO,EAAwB,YAAY,EAC1E,MAAM,kDAAkD,CAAC;AAC1D,OAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIvD,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,YAAY,GAAG,SAAS;IAC3D,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,CAAC,CAAC;CACV;AA2BD,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAQlB;gBAEU,OAAO,CAAC,EAAE,OAAO;IAIhB,GAAG,CAAC,CAAC,SAAS,YAAY,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAItE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAK1D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKrC,MAAM,CAAC,CAAC,SAAS,YAAY,GAAG,GAAG,EAC9C,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,EAAE,aAAa,GAC7E,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAe3B,OAAO,CAAC,cAAc;IAIT,YAAY,CAAC,CAAC,SAAS,YAAY,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAI3F,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAIrB,YAAY;CAO3B;AAID;;;GAGG;AACH,wBAAsB,GAAG,CAAC,CAAC,SAAS,YAAY,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAE3F;AAED;;;;GAIG;AACH,wBAAsB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAE/E;AAED;;;GAGG;AACH,wBAAsB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE1D;AAED;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,CAAC,SAAS,YAAY,GAAG,GAAG,EACvD,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,GAC5E,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAE1B;AAGD;;;;GAIG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAE3C;AAED;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,CAEzC;yBAFqB,IAAI;;;;;AAK1B;;GAEG;AACH,wBAAsB,YAAY,CAAC,CAAC,SAAS,YAAY,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAEhH;yBAFqB,YAAY"} |
+95
-25
| "use strict"; | ||
| var __importDefault = (this && this.__importDefault) || function (mod) { | ||
| return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
| }; | ||
| var __importStar = (this && this.__importStar) || function (mod) { | ||
| if (mod && mod.__esModule) return mod; | ||
| var result = {}; | ||
| if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; | ||
| result["default"] = mod; | ||
| return result; | ||
| }; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| const db_1 = require("./db"); | ||
| exports.Q = db_1.Q; | ||
| var errors_1 = require("./errors"); | ||
| exports.ValueError = errors_1.ValueError; | ||
| const dbPath = process.env.SHIFT_DB_PATH; | ||
| if (!dbPath) { | ||
| throw new Error('SHIFT_DB_PATH env var not defined'); | ||
| const shift_interfaces_node_client_1 = require("@binaris/shift-interfaces-node-client"); | ||
| const deep_freeze_1 = __importDefault(require("deep-freeze")); | ||
| const ramda_1 = require("ramda"); | ||
| const process = __importStar(require("process")); | ||
| const defaultOptions = { | ||
| timeoutMs: 2000, | ||
| }; | ||
| // bigint not currently allowed. | ||
| const allowedTypes = new Set(['object', 'boolean', 'number', 'string']); | ||
| function checkValue(value) { | ||
| if (!allowedTypes.has(typeof value)) { | ||
| throw new TypeError(`Non-JSONable value of type ${typeof value} at top level`); | ||
| } | ||
| } | ||
| const db = new db_1.DB(dbPath); | ||
| // Generates successive promises to sleep in order to back off. (Not | ||
| // an async iterator, so you can generate the promise to back off, | ||
| // then try something, and then back off for the remainder of the | ||
| // generated time.) | ||
| function* backoff() { | ||
| let delayMs = 20; | ||
| for (;;) { | ||
| yield new Promise((res) => setTimeout(res, delayMs)); | ||
| delayMs *= 1.2; | ||
| } | ||
| } | ||
| class DBHandler { | ||
| constructor(options) { | ||
| this.ctx = { | ||
| auth: { | ||
| v1: { | ||
| // TODO(ariels): Update with prefixes from binaris/spice#616. | ||
| appId: process.env.APP_ID, | ||
| apiKey: process.env.API_KEY, | ||
| }, | ||
| }, | ||
| }; | ||
| this.client = new shift_interfaces_node_client_1.DBClient(`${process.env.DB_BASE_URL}/v1`, ramda_1.merge(defaultOptions, options)); | ||
| } | ||
| async get(key) { | ||
| return (await this.client.get(this.ctx, key)); | ||
| } | ||
| async create(key, value) { | ||
| checkValue(value); | ||
| return await this.client.create(this.ctx, key, value); | ||
| } | ||
| async remove(key) { | ||
| return await this.client.remove(this.ctx, key); | ||
| } | ||
| // TODO(ariels): Support operationId for streaming. | ||
| async update(key, updater, _options) { | ||
| for (const delay of backoff()) { | ||
| const { value, version } = await this.getWithVersion(key); | ||
| // deepFreeze doesn't like some values (like undefined), trick | ||
| // it by referring to value in an object. | ||
| const newValue = updater(deep_freeze_1.default({ value: value }).value); | ||
| checkValue(newValue); | ||
| if (await this.setIfVersion(key, newValue, version)) | ||
| return deep_freeze_1.default(newValue); | ||
| await delay; | ||
| } | ||
| throw Error('Timed out'); // backoff() is currently infinite but | ||
| // won't stay that way. Needed for | ||
| // TypeScript. | ||
| } | ||
| getWithVersion(key) { | ||
| return this.client.getWithVersion(this.ctx, key); | ||
| } | ||
| async startPolling(_key) { | ||
| throw new Error('Unimplemented'); | ||
| } | ||
| async find() { | ||
| throw new Error('Unimplemented'); | ||
| } | ||
| async setIfVersion(key, value, version) { | ||
| return await this.client.setIfVersion(this.ctx, key, version, value); | ||
| } | ||
| } | ||
| exports.DBHandler = DBHandler; | ||
| const db = new DBHandler(); | ||
| /** | ||
@@ -47,2 +127,3 @@ * Gets a single document. | ||
| exports.update = update; | ||
| // Available only on backend, needs to pass a function. | ||
| /** | ||
@@ -53,4 +134,4 @@ * Find documents matching query. | ||
| */ | ||
| async function find(query) { | ||
| return await db.find(query); | ||
| async function find() { | ||
| throw new Error('Unimplemented'); | ||
| } | ||
@@ -61,4 +142,4 @@ exports.find = find; | ||
| */ | ||
| async function poll(keysToVersions) { | ||
| return await db.poll(keysToVersions); | ||
| async function poll() { | ||
| throw new Error('Unimplemented'); | ||
| } | ||
@@ -70,15 +151,4 @@ exports.poll = poll; | ||
| */ | ||
| async function startPolling(key) { | ||
| const doc = await db.getWithMeta(key); | ||
| if (doc === undefined) { | ||
| return { | ||
| // Once a document is created its version is bound to be greater than this. | ||
| version: { major: 0, minor: 0 }, | ||
| value: undefined, | ||
| }; | ||
| } | ||
| return { | ||
| version: doc.version, | ||
| value: doc.value, | ||
| }; | ||
| async function startPolling(_key) { | ||
| throw new Error('Unimplemented'); | ||
| } | ||
@@ -85,0 +155,0 @@ exports.startPolling = startPolling; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,6BAUc;AAES,YAVrB,MAAC,CAUqB;AACxB,mCAAsC;AAA7B,8BAAA,UAAU,CAAA;AAEnB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;AACzC,IAAI,CAAC,MAAM,EAAE;IACX,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;CACtD;AAED,MAAM,EAAE,GAAG,IAAI,OAAE,CAAC,MAAM,CAAC,CAAC;AAE1B;;;GAGG;AACI,KAAK,UAAU,GAAG,CAA+B,GAAW;IACjE,OAAO,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAFD,kBAEC;AAED;;;;GAIG;AACI,KAAK,UAAU,MAAM,CAAC,GAAW,EAAE,KAAmB;IAC3D,OAAO,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACrC,CAAC;AAFD,wBAEC;AAED;;;GAGG;AACI,KAAK,UAAU,MAAM,CAAC,GAAW;IACtC,OAAO,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC;AAFD,wBAEC;AAED;;;;;GAKG;AACI,KAAK,UAAU,MAAM,CAC1B,GAAW,EAAE,OAAuC,EAAE,OAAuB;IAE7E,OAAO,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC;AAJD,wBAIC;AAED;;;;GAIG;AACI,KAAK,UAAU,IAAI,CAAC,KAAc;IACvC,OAAO,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAFD,oBAEC;AAED;;GAEG;AACI,KAAK,UAAU,IAAI,CAAC,cAA6B;IACtD,OAAO,MAAM,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AACvC,CAAC;AAFD,oBAEC;AACD,IAAI,CAAC,WAAW,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAErC;;GAEG;AACI,KAAK,UAAU,YAAY,CAA+B,GAAW;IAC1E,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,WAAW,CAAI,GAAG,CAAC,CAAC;IACzC,IAAI,GAAG,KAAK,SAAS,EAAE;QACrB,OAAO;YACL,2EAA2E;YAC3E,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;YAC/B,KAAK,EAAE,SAAS;SACjB,CAAC;KACH;IACD,OAAO;QACL,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,KAAK,EAAE,GAAG,CAAC,KAAK;KACjB,CAAC;AACJ,CAAC;AAbD,oCAaC;AACD,YAAY,CAAC,WAAW,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} |
+26
-21
| { | ||
| "name": "@binaris/shift-db", | ||
| "version": "0.3.1", | ||
| "files": [ | ||
| "dist" | ||
| ], | ||
| "description": "", | ||
| "version": "0.4.0-dbnu", | ||
| "description": "(Backend) client for accessing ShiftJS DBs.", | ||
| "main": "dist/index.js", | ||
| "files": "dist/", | ||
| "types": "dist/index.d.ts", | ||
@@ -13,27 +11,34 @@ "scripts": { | ||
| "lint": "tslint -c ../common/tslint.yml -p .", | ||
| "test": "ava -v dist/test/*.js" | ||
| "test": "ava dist/test/component/*.js" | ||
| }, | ||
| "keywords": [ | ||
| "binaris", | ||
| "shift", | ||
| "shiftjs", | ||
| "db", | ||
| "client", | ||
| "db-client", | ||
| "shift-db" | ||
| ], | ||
| "author": "", | ||
| "license": "MIT", | ||
| "dependencies": { | ||
| "@binaris/shift-interfaces-node-client": "^0.3.0", | ||
| "@types/deep-freeze": "^0.1.1", | ||
| "@types/leveldown": "^4.0.0", | ||
| "@types/levelup": "^3.1.1", | ||
| "async-mutex": "^0.1.3", | ||
| "deep-freeze": "^0.0.1", | ||
| "fast-json-patch": "^2.2.0", | ||
| "leveldown": "^5.1.1", | ||
| "levelup": "^4.1.0", | ||
| "@binaris/shift-interfaces-node-client": "0.4.0-nudb.1", | ||
| "@types/deep-freeze": "^0.1.2", | ||
| "deep-freeze": "0.0.1", | ||
| "ramda": "^0.26.1" | ||
| }, | ||
| "devDependencies": { | ||
| "@types/node": "^10.14.9", | ||
| "@types/ramda": "^0.26.18", | ||
| "@binaris/shift-interfaces-koa-server": "0.4.0-nudb.1", | ||
| "@binaris/shift-leveldb-server": "0.0.1-dbnu", | ||
| "@types/koa": "~2.0.49", | ||
| "@types/koa-router": "~7.0.42", | ||
| "@types/node": "^12.7.2", | ||
| "@types/ramda": "^0.26.19", | ||
| "@types/rmfr": "^2.0.0", | ||
| "ava": "^2.2.0", | ||
| "rmfr": "^2.0.0", | ||
| "tslint": "^5.18.0", | ||
| "typescript": "^3.5.3" | ||
| "ava": "^2.3.0", | ||
| "koa": "~2.8.1", | ||
| "koa-router": "~7.4.0", | ||
| "rmfr": "^2.0.0" | ||
| } | ||
| } |
-171
| { | ||
| "name": "@binaris/shift-db", | ||
| "entries": [ | ||
| { | ||
| "version": "0.3.1", | ||
| "tag": "@binaris/shift-db_v0.3.1", | ||
| "date": "Mon, 12 Aug 2019 13:45:13 GMT", | ||
| "comments": { | ||
| "patch": [ | ||
| { | ||
| "comment": "Update client version" | ||
| } | ||
| ] | ||
| } | ||
| }, | ||
| { | ||
| "version": "0.3.0", | ||
| "tag": "@binaris/shift-db_v0.3.0", | ||
| "date": "Tue, 06 Aug 2019 12:22:25 GMT", | ||
| "comments": { | ||
| "patch": [ | ||
| { | ||
| "comment": "Use exported types from client package" | ||
| } | ||
| ], | ||
| "minor": [ | ||
| { | ||
| "comment": "Disallow all non-JSONable types at top level of values" | ||
| } | ||
| ] | ||
| } | ||
| }, | ||
| { | ||
| "version": "0.2.2", | ||
| "tag": "@binaris/shift-db_v0.2.2", | ||
| "date": "Thu, 01 Aug 2019 12:37:42 GMT", | ||
| "comments": { | ||
| "patch": [ | ||
| { | ||
| "comment": "Release packages publicly" | ||
| } | ||
| ], | ||
| "dependency": [ | ||
| { | ||
| "comment": "Updating dependency \"@binaris/shift-interfaces\" from `0.1.1` to `0.1.2`" | ||
| } | ||
| ] | ||
| } | ||
| }, | ||
| { | ||
| "version": "0.2.1", | ||
| "tag": "@binaris/shift-db_v0.2.1", | ||
| "date": "Mon, 29 Jul 2019 06:11:31 GMT", | ||
| "comments": { | ||
| "patch": [ | ||
| { | ||
| "comment": "Rename getVersioned to startPolling" | ||
| }, | ||
| { | ||
| "comment": "Change return types of exposed subscription functions" | ||
| }, | ||
| { | ||
| "comment": "Fix version comparison" | ||
| } | ||
| ], | ||
| "dependency": [ | ||
| { | ||
| "comment": "Updating dependency \"@binaris/shift-interfaces\" from `0.1.0` to `0.1.1`" | ||
| } | ||
| ] | ||
| } | ||
| }, | ||
| { | ||
| "version": "0.2.0", | ||
| "tag": "@binaris/shift-db_v0.2.0", | ||
| "date": "Thu, 18 Jul 2019 12:48:13 GMT", | ||
| "comments": { | ||
| "patch": [ | ||
| { | ||
| "comment": "Change db.update API and Serializable type" | ||
| }, | ||
| { | ||
| "comment": "Refactor exportable interfaces into shift-interfaces." | ||
| }, | ||
| { | ||
| "comment": "Change db.get() return type" | ||
| }, | ||
| { | ||
| "comment": "Export getVersioned() and poll()" | ||
| }, | ||
| { | ||
| "comment": "Properly export types" | ||
| } | ||
| ], | ||
| "minor": [ | ||
| { | ||
| "comment": "Implement subscription functions" | ||
| } | ||
| ], | ||
| "dependency": [ | ||
| { | ||
| "comment": "Updating dependency \"@binaris/shift-interfaces\" from `0.0.1` to `0.1.0`" | ||
| } | ||
| ] | ||
| } | ||
| }, | ||
| { | ||
| "version": "0.1.2", | ||
| "tag": "@binaris/shift-db_v0.1.2", | ||
| "date": "Wed, 10 Jul 2019 12:29:59 GMT", | ||
| "comments": { | ||
| "patch": [ | ||
| { | ||
| "comment": "Implement query language" | ||
| } | ||
| ] | ||
| } | ||
| }, | ||
| { | ||
| "version": "0.1.1", | ||
| "tag": "@binaris/shift-db_v0.1.1", | ||
| "date": "Tue, 09 Jul 2019 13:02:12 GMT", | ||
| "comments": { | ||
| "patch": [ | ||
| { | ||
| "comment": "Downgrade AVA dependency" | ||
| } | ||
| ] | ||
| } | ||
| }, | ||
| { | ||
| "version": "0.1.0", | ||
| "tag": "@binaris/shift-db_v0.1.0", | ||
| "date": "Tue, 09 Jul 2019 07:46:16 GMT", | ||
| "comments": { | ||
| "minor": [ | ||
| { | ||
| "comment": "Accept any JSONable as DB value" | ||
| } | ||
| ] | ||
| } | ||
| }, | ||
| { | ||
| "version": "0.0.2", | ||
| "tag": "@binaris/shift-db_v0.0.2", | ||
| "date": "Tue, 09 Jul 2019 07:26:14 GMT", | ||
| "comments": { | ||
| "patch": [ | ||
| { | ||
| "comment": "Add linting" | ||
| }, | ||
| { | ||
| "comment": "Limit distributed files" | ||
| } | ||
| ] | ||
| } | ||
| }, | ||
| { | ||
| "version": "0.0.1", | ||
| "tag": "@binaris/shift-db_v0.0.1", | ||
| "date": "Thu, 20 Jun 2019 15:03:42 GMT", | ||
| "comments": { | ||
| "patch": [ | ||
| { | ||
| "comment": "Initial version" | ||
| } | ||
| ] | ||
| } | ||
| } | ||
| ] | ||
| } |
-89
| # Change Log - @binaris/shift-db | ||
| This log was last generated on Mon, 12 Aug 2019 13:45:13 GMT and should not be manually modified. | ||
| ## 0.3.1 | ||
| Mon, 12 Aug 2019 13:45:13 GMT | ||
| ### Patches | ||
| - Update client version | ||
| ## 0.3.0 | ||
| Tue, 06 Aug 2019 12:22:25 GMT | ||
| ### Minor changes | ||
| - Disallow all non-JSONable types at top level of values | ||
| ### Patches | ||
| - Use exported types from client package | ||
| ## 0.2.2 | ||
| Thu, 01 Aug 2019 12:37:42 GMT | ||
| ### Patches | ||
| - Release packages publicly | ||
| ## 0.2.1 | ||
| Mon, 29 Jul 2019 06:11:31 GMT | ||
| ### Patches | ||
| - Rename getVersioned to startPolling | ||
| - Change return types of exposed subscription functions | ||
| - Fix version comparison | ||
| ## 0.2.0 | ||
| Thu, 18 Jul 2019 12:48:13 GMT | ||
| ### Minor changes | ||
| - Implement subscription functions | ||
| ### Patches | ||
| - Change db.update API and Serializable type | ||
| - Refactor exportable interfaces into shift-interfaces. | ||
| - Change db.get() return type | ||
| - Export getVersioned() and poll() | ||
| - Properly export types | ||
| ## 0.1.2 | ||
| Wed, 10 Jul 2019 12:29:59 GMT | ||
| ### Patches | ||
| - Implement query language | ||
| ## 0.1.1 | ||
| Tue, 09 Jul 2019 13:02:12 GMT | ||
| ### Patches | ||
| - Downgrade AVA dependency | ||
| ## 0.1.0 | ||
| Tue, 09 Jul 2019 07:46:16 GMT | ||
| ### Minor changes | ||
| - Accept any JSONable as DB value | ||
| ## 0.0.2 | ||
| Tue, 09 Jul 2019 07:26:14 GMT | ||
| ### Patches | ||
| - Add linting | ||
| - Limit distributed files | ||
| ## 0.0.1 | ||
| Thu, 20 Jun 2019 15:03:42 GMT | ||
| ### Patches | ||
| - Initial version | ||
-87
| /// <reference types="node" /> | ||
| import { EventEmitter } from 'events'; | ||
| import { DeepReadonly } from 'deep-freeze'; | ||
| import { LevelUp } from 'levelup'; | ||
| import { Mutex } from 'async-mutex'; | ||
| import { UpdateOptions, Version, Patch } from '@binaris/shift-interfaces-node-client/interfaces'; | ||
| import * as Q from './query'; | ||
| export { Q, DeepReadonly, UpdateOptions, }; | ||
| export interface Versioned<T> { | ||
| version: Version; | ||
| value: T; | ||
| } | ||
| export declare type KeyedPatches = Array<[string, Patch[]]>; | ||
| export declare type Serializable = {} | null; | ||
| export declare function incrVersion({ major, minor }: Version, amount?: number): Version; | ||
| export declare function decrVersion(version: Version, amount?: number): Version; | ||
| export declare function isGreaterVersion(a: Version, b: Version): boolean; | ||
| export declare type KeyedVersions = Array<[string, Version]>; | ||
| interface StoredDocument<T> extends Versioned<T> { | ||
| /** | ||
| * Stores changes made to the document, meant to be used internally by poll(). | ||
| */ | ||
| readonly patches: ReadonlyArray<Patch>; | ||
| readonly updatedAt: number; | ||
| } | ||
| /** | ||
| * The result of a remove operation on a document - meant to be periodically pruned. | ||
| */ | ||
| declare type Tombstone = StoredDocument<undefined>; | ||
| export interface PollOptions { | ||
| readBlockTimeMs: number; | ||
| } | ||
| export interface Document { | ||
| key: string; | ||
| value: Serializable; | ||
| } | ||
| export declare class DB extends EventEmitter { | ||
| protected readonly dbPath: string; | ||
| protected readonly writeLock: Mutex; | ||
| protected readonly db: LevelUp; | ||
| constructor(dbPath: string); | ||
| protected put(key: string, prev: StoredDocument<any> | undefined, value: any, options?: UpdateOptions): Promise<void>; | ||
| /** | ||
| * Gets a single document. | ||
| * @return - value or undefined if key doesn’t exist. | ||
| */ | ||
| get<T extends Serializable = any>(key: string): Promise<T | undefined>; | ||
| /** | ||
| * Gets a single document with its version. | ||
| * @return - { version, value } or undefined if key doesn’t exist. | ||
| */ | ||
| getWithMeta<T extends Serializable = any>(key: string): Promise<StoredDocument<T> | Tombstone | undefined>; | ||
| /** | ||
| * Creates a document for given key. | ||
| * @param value - Cannot be undefined, must be an object | ||
| * @return - true if document was created, false if key already exists. | ||
| */ | ||
| create(key: string, value: Serializable): Promise<boolean>; | ||
| /** | ||
| * Removes a single document. | ||
| * @return - true if document was deleted, false if key doesn’t exist. | ||
| */ | ||
| remove(key: string): Promise<boolean>; | ||
| /** | ||
| * Updates a single document. | ||
| * @param updater - Function that gets the previous value and returns the next value to update the DB with. | ||
| * Cannot return undefined, receives undefined in case key doesn’t already exist in the DB. | ||
| * @return - The new value returned from updater | ||
| */ | ||
| update<T extends Serializable = any>(key: string, updater: (state?: DeepReadonly<T>) => T, options?: UpdateOptions): Promise<DeepReadonly<T>>; | ||
| /** | ||
| * Polls on updates to specified keys since specified versions. | ||
| * @see KeyedVersions | ||
| * @see KeyedPatches | ||
| */ | ||
| poll(keysToVersions: KeyedVersions, opts?: Partial<PollOptions>): Promise<KeyedPatches>; | ||
| /** | ||
| * Find documents matching query. | ||
| * @param query - a query constructed with Q methods. | ||
| * @return - an array of documents | ||
| */ | ||
| find(query: Q.Query): Promise<Document[]>; | ||
| } | ||
| export declare function buildComparator({ path: p, direction }: Q.Order): (a: any, b: any) => number; | ||
| export declare function wrappedMatch(doc: Document, filter: Q.Filter): boolean; | ||
| export declare function match(doc: Document, filter: Q.Filter): boolean; | ||
| //# sourceMappingURL=db.d.ts.map |
| {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"} |
-282
| "use strict"; | ||
| var __importDefault = (this && this.__importDefault) || function (mod) { | ||
| return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
| }; | ||
| var __importStar = (this && this.__importStar) || function (mod) { | ||
| if (mod && mod.__esModule) return mod; | ||
| var result = {}; | ||
| if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; | ||
| result["default"] = mod; | ||
| return result; | ||
| }; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| const events_1 = require("events"); | ||
| const ramda_1 = require("ramda"); | ||
| const deep_freeze_1 = __importDefault(require("deep-freeze")); | ||
| const fast_json_patch_1 = require("fast-json-patch"); | ||
| const levelup_1 = __importDefault(require("levelup")); | ||
| const leveldown_1 = __importDefault(require("leveldown")); | ||
| const async_mutex_1 = require("async-mutex"); | ||
| const errors_1 = require("./errors"); | ||
| const Q = __importStar(require("./query")); | ||
| exports.Q = Q; | ||
| const utils_1 = require("./utils"); | ||
| const NUM_PATCHES_TO_KEEP = 20; | ||
| const DEFAULT_READ_BLOCK_TIME_MS = 50000; | ||
| function incrVersion({ major, minor }, amount = 1) { | ||
| return { major, minor: minor + amount }; | ||
| } | ||
| exports.incrVersion = incrVersion; | ||
| function decrVersion(version, amount = 1) { | ||
| return incrVersion(version, -amount); | ||
| } | ||
| exports.decrVersion = decrVersion; | ||
| function isGreaterVersion(a, b) { | ||
| return a.major > b.major || a.major === b.major && a.minor > b.minor; | ||
| } | ||
| exports.isGreaterVersion = isGreaterVersion; | ||
| // bigint not currently allowed. | ||
| const allowedTypes = new Set(['object', 'boolean', 'number', 'string']); | ||
| function checkValue(value) { | ||
| if (!allowedTypes.has(typeof value)) { | ||
| throw new TypeError(`Non-JSONable value of type ${typeof value} at top level`); | ||
| } | ||
| } | ||
| class DB extends events_1.EventEmitter { | ||
| constructor(dbPath) { | ||
| super(); | ||
| this.dbPath = dbPath; | ||
| this.writeLock = new async_mutex_1.Mutex(); | ||
| this.db = new levelup_1.default(new leveldown_1.default(dbPath)); | ||
| } | ||
| async put(key, prev, value, options) { | ||
| const prevValue = prev === undefined ? undefined : prev.value; | ||
| const version = prev === undefined || prev.value === undefined ? | ||
| { major: utils_1.hrnano(), minor: 1 } : incrVersion(prev.version); | ||
| const patches = prev ? prev.patches : []; | ||
| const ops = fast_json_patch_1.compare({ root: prevValue }, { root: value }); | ||
| if (ops.length > 0) { | ||
| const patch = Object.assign({ version, ops }, options); | ||
| await this.db.put(key, JSON.stringify({ | ||
| version, | ||
| value, | ||
| patches: patches.slice(-NUM_PATCHES_TO_KEEP).concat(patch), | ||
| updatedAt: utils_1.hrnano(), | ||
| })); | ||
| this.emit('patch', key, patch); | ||
| } | ||
| } | ||
| /** | ||
| * Gets a single document. | ||
| * @return - value or undefined if key doesn’t exist. | ||
| */ | ||
| async get(key) { | ||
| const versioned = await this.getWithMeta(key); | ||
| if (versioned === undefined) { | ||
| return undefined; | ||
| } | ||
| return versioned.value; | ||
| } | ||
| /** | ||
| * Gets a single document with its version. | ||
| * @return - { version, value } or undefined if key doesn’t exist. | ||
| */ | ||
| async getWithMeta(key) { | ||
| try { | ||
| const val = await this.db.get(key); | ||
| return JSON.parse(val.toString()); | ||
| } | ||
| catch (err) { | ||
| if (err.name === 'NotFoundError') { | ||
| return undefined; | ||
| } | ||
| throw err; | ||
| } | ||
| } | ||
| /** | ||
| * Creates a document for given key. | ||
| * @param value - Cannot be undefined, must be an object | ||
| * @return - true if document was created, false if key already exists. | ||
| */ | ||
| async create(key, value) { | ||
| checkValue(value); | ||
| return await this.writeLock.runExclusive(async () => { | ||
| const prev = await this.getWithMeta(key); | ||
| if (prev !== undefined && prev.value !== undefined) { | ||
| return false; | ||
| } | ||
| await this.put(key, prev, value); | ||
| return true; | ||
| }); | ||
| } | ||
| /** | ||
| * Removes a single document. | ||
| * @return - true if document was deleted, false if key doesn’t exist. | ||
| */ | ||
| async remove(key) { | ||
| return await this.writeLock.runExclusive(async () => { | ||
| const prev = await this.getWithMeta(key); | ||
| if (prev === undefined || prev.value === undefined) { | ||
| return false; | ||
| } | ||
| // TODO: Schedule periodic DB vacuum and delete old tombstones | ||
| await this.put(key, prev, undefined); | ||
| return true; | ||
| }); | ||
| } | ||
| /** | ||
| * Updates a single document. | ||
| * @param updater - Function that gets the previous value and returns the next value to update the DB with. | ||
| * Cannot return undefined, receives undefined in case key doesn’t already exist in the DB. | ||
| * @return - The new value returned from updater | ||
| */ | ||
| async update(key, updater, options) { | ||
| return await this.writeLock.runExclusive(async () => { | ||
| const prev = await this.getWithMeta(key); | ||
| const frozen = deep_freeze_1.default({ value: prev && prev.value }); | ||
| // We could have made updater return DeepReadonly<T> but that would make writing updaters very hard. | ||
| // We decided to work around the type system to prevent the case that a user tries to modify the return | ||
| // value and gets a TypeError. | ||
| const nextValue = updater(frozen.value); | ||
| checkValue(nextValue); | ||
| await this.put(key, prev, nextValue, options); | ||
| return nextValue; | ||
| }); | ||
| } | ||
| /** | ||
| * Polls on updates to specified keys since specified versions. | ||
| * @see KeyedVersions | ||
| * @see KeyedPatches | ||
| */ | ||
| async poll(keysToVersions, opts = {}) { | ||
| const keysToVersionsMap = new Map(keysToVersions); | ||
| const { promise, resolve } = utils_1.deferred(); | ||
| // Make sure we don't miss any live updates in case the initial scan (below) comes back empty. | ||
| const patchHandler = (key, patch) => { | ||
| const subscribedVersion = keysToVersionsMap.get(key); | ||
| if (subscribedVersion !== undefined && isGreaterVersion(patch.version, subscribedVersion)) { | ||
| resolve([[key, [patch]]]); | ||
| } | ||
| }; | ||
| this.on('patch', patchHandler); | ||
| try { | ||
| // Scan the DB for matching patches | ||
| const keyedPatchesOrUndef = await Promise.all(keysToVersions.map(async ([key, version]) => { | ||
| const doc = await this.getWithMeta(key); | ||
| if (doc === undefined) { | ||
| return undefined; | ||
| } | ||
| const patches = doc.patches.filter((patch) => isGreaterVersion(patch.version, version)); | ||
| if (patches.length === 0) { | ||
| return undefined; | ||
| } | ||
| return ramda_1.pair(key, patches); | ||
| })); | ||
| const keyedPatches = keyedPatchesOrUndef.filter((patch) => patch !== undefined); | ||
| if (keyedPatches.length > 0) { | ||
| return keyedPatches; | ||
| } | ||
| try { | ||
| return await utils_1.withTimeout(promise, opts.readBlockTimeMs || DEFAULT_READ_BLOCK_TIME_MS); | ||
| } | ||
| catch (err) { | ||
| if (err.name === 'TimeoutError') { | ||
| return []; | ||
| } | ||
| throw err; | ||
| } | ||
| } | ||
| finally { | ||
| this.off('patch', patchHandler); | ||
| } | ||
| } | ||
| /** | ||
| * Find documents matching query. | ||
| * @param query - a query constructed with Q methods. | ||
| * @return - an array of documents | ||
| */ | ||
| async find(query) { | ||
| const { filter, limit, skip, orderBy } = query.getParts(); | ||
| const results = []; | ||
| await new Promise((resolve, reject) => { | ||
| const it = this.db.iterator({ | ||
| keyAsBuffer: false, | ||
| valueAsBuffer: false, | ||
| }); | ||
| const next = (err, key, rawValue) => { | ||
| if (err) { | ||
| return reject(err); | ||
| } | ||
| if (!key) { | ||
| // Iteration complete | ||
| return it.end(resolve); | ||
| } | ||
| const { value } = JSON.parse(rawValue); | ||
| if (value !== undefined /* Not a tombstone */ && wrappedMatch({ key, value }, filter)) { | ||
| results.push({ key, value }); | ||
| } | ||
| return it.next(next); | ||
| }; | ||
| it.next(next); | ||
| }); | ||
| const sortedResults = orderBy ? ramda_1.sortWith(orderBy.map(buildComparator), results) : results; | ||
| return sortedResults.slice(skip, limit === undefined ? undefined : (skip || 0) + limit); | ||
| } | ||
| } | ||
| exports.DB = DB; | ||
| function buildComparator({ path: p, direction }) { | ||
| return direction === Q.ASC ? ramda_1.ascend(ramda_1.path(p)) : ramda_1.descend(ramda_1.path(p)); | ||
| } | ||
| exports.buildComparator = buildComparator; | ||
| function wrappedMatch(doc, filter) { | ||
| const isMatch = match(doc, filter); | ||
| if (isMatch === undefined) { | ||
| throw new errors_1.ValueError(`Got an unsupported filter operator: ${filter.operator}`); | ||
| } | ||
| return isMatch; | ||
| } | ||
| exports.wrappedMatch = wrappedMatch; | ||
| function match(doc, filter) { | ||
| switch (filter.operator) { | ||
| case 'and': | ||
| return filter.filters.every((f) => wrappedMatch(doc, f)); | ||
| case 'or': | ||
| return filter.filters.some((f) => wrappedMatch(doc, f)); | ||
| case 'not': | ||
| return !wrappedMatch(doc, filter.filter); | ||
| } | ||
| const value = ramda_1.path(filter.path, doc); | ||
| switch (filter.operator) { | ||
| case 'eq': | ||
| return value === filter.value; | ||
| case 'ne': | ||
| return value !== filter.value; | ||
| case 'gt': | ||
| return typeof value === typeof filter.value && value > filter.value; | ||
| case 'gte': | ||
| return typeof value === typeof filter.value && value >= filter.value; | ||
| case 'lt': | ||
| return typeof value === typeof filter.value && value < filter.value; | ||
| case 'lte': | ||
| return typeof value === typeof filter.value && value <= filter.value; | ||
| case 'exists': | ||
| return value !== undefined; | ||
| case 'isNull': | ||
| return value === null; | ||
| case 'matches': | ||
| if (typeof value !== 'string') { | ||
| return false; | ||
| } | ||
| const regexp = new RegExp(filter.pattern, filter.caseInsensitive ? 'i' : undefined); | ||
| return regexp.test(value); | ||
| case 'startsWith': | ||
| if (typeof value !== 'string') { | ||
| return false; | ||
| } | ||
| return value.startsWith(filter.value); | ||
| // We don't add a default case here to let typescript catch when new operators are added and not implemented here. | ||
| // (see wrappedMatch) | ||
| } | ||
| } | ||
| exports.match = match; | ||
| //# sourceMappingURL=db.js.map |
| {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"} |
| export declare class ValueError extends Error { | ||
| readonly name = "ValueError"; | ||
| } | ||
| export declare class IllegalArgumentError extends Error { | ||
| readonly name = "IllegalArgumentError"; | ||
| } | ||
| //# sourceMappingURL=errors.d.ts.map |
| {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,UAAW,SAAQ,KAAK;IACnC,SAAgB,IAAI,gBAAgB;CACrC;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,SAAgB,IAAI,0BAA0B;CAC/C"} |
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| class ValueError extends Error { | ||
| constructor() { | ||
| super(...arguments); | ||
| this.name = 'ValueError'; | ||
| } | ||
| } | ||
| exports.ValueError = ValueError; | ||
| class IllegalArgumentError extends Error { | ||
| constructor() { | ||
| super(...arguments); | ||
| this.name = 'IllegalArgumentError'; | ||
| } | ||
| } | ||
| exports.IllegalArgumentError = IllegalArgumentError; | ||
| //# sourceMappingURL=errors.js.map |
| {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;AAAA,MAAa,UAAW,SAAQ,KAAK;IAArC;;QACkB,SAAI,GAAG,YAAY,CAAC;IACtC,CAAC;CAAA;AAFD,gCAEC;AAED,MAAa,oBAAqB,SAAQ,KAAK;IAA/C;;QACkB,SAAI,GAAG,sBAAsB,CAAC;IAChD,CAAC;CAAA;AAFD,oDAEC"} |
-179
| import * as dbi from '@binaris/shift-interfaces-node-client/interfaces'; | ||
| declare type Key = string | number; | ||
| declare const filterSymbol: unique symbol; | ||
| export declare type Marked<T extends {}> = T & { | ||
| [filterSymbol]: true; | ||
| }; | ||
| export declare type EqFilter = Marked<dbi.EqFilter>; | ||
| export declare type NeFilter = Marked<dbi.NeFilter>; | ||
| export declare type GtFilter = Marked<dbi.GtFilter>; | ||
| export declare type GteFilter = Marked<dbi.GteFilter>; | ||
| export declare type LtFilter = Marked<dbi.LtFilter>; | ||
| export declare type LteFilter = Marked<dbi.LteFilter>; | ||
| export declare type ExistsFilter = Marked<dbi.ExistsFilter>; | ||
| export declare type IsNullFilter = Marked<dbi.IsNullFilter>; | ||
| export declare type MatchesFilter = Marked<dbi.MatchesFilter>; | ||
| export declare type StartsWithFilter = Marked<dbi.StartsWithFilter>; | ||
| export declare type Equatable = dbi.Equatable; | ||
| export declare type Comparable = dbi.Comparable; | ||
| export declare type Direction = dbi.Direction; | ||
| export declare type Order = dbi.Order; | ||
| export declare const ASC = dbi.Direction.ASC; | ||
| export declare const DESC = dbi.Direction.DESC; | ||
| interface AndFilter extends Marked<dbi.AndFilter> { | ||
| readonly filters: Filter[]; | ||
| } | ||
| interface OrFilter extends Marked<dbi.OrFilter> { | ||
| readonly filters: Filter[]; | ||
| } | ||
| interface NotFilter extends Marked<dbi.NotFilter> { | ||
| readonly filter: Filter; | ||
| } | ||
| export declare type Filter = EqFilter | NeFilter | GtFilter | GteFilter | LtFilter | LteFilter | ExistsFilter | IsNullFilter | MatchesFilter | StartsWithFilter | AndFilter | OrFilter | NotFilter; | ||
| declare class Path { | ||
| protected readonly parts: string[]; | ||
| constructor(parts: string[]); | ||
| static proxied(parts: string[]): PathProxy; | ||
| /** | ||
| * Returns a subpath at given key. | ||
| * @param key - object key or array index | ||
| * @return - subpath of document | ||
| */ | ||
| field(k: Key): PathProxy; | ||
| /** | ||
| * Returns a subpath at given key. | ||
| * Has a template parameter for improved type safety when using typescript. | ||
| * @param key - object key or array index | ||
| * @return - subpath of document | ||
| */ | ||
| typedField<T>(k: Key): Doc<T>; | ||
| /** | ||
| * Equals | ||
| * @param x - value for comparison | ||
| * @return - a filter | ||
| */ | ||
| eq(x: Equatable): EqFilter; | ||
| /** | ||
| * Not equals | ||
| * @param x - value for comparison | ||
| * @return - a filter | ||
| */ | ||
| ne(x: Equatable): NeFilter; | ||
| /** | ||
| * Greater than | ||
| * @param x - value for comparison | ||
| * @return - a filter | ||
| */ | ||
| gt(x: Comparable): GtFilter; | ||
| /** | ||
| * Greater than or equals | ||
| * @param x - value for comparison | ||
| * @return - a filter | ||
| */ | ||
| gte(x: Comparable): GteFilter; | ||
| /** | ||
| * Less than | ||
| * @param x - value for comparison | ||
| * @return - a filter | ||
| */ | ||
| lt(x: Comparable): LtFilter; | ||
| /** | ||
| * Less than or equals | ||
| * @param x - value for comparison | ||
| * @return - a filter | ||
| */ | ||
| lte(x: Comparable): LteFilter; | ||
| /** | ||
| * Does path exist? | ||
| * @return - a filter | ||
| */ | ||
| exists(): ExistsFilter; | ||
| /** | ||
| * Is value at path null? | ||
| * @return - a filter | ||
| */ | ||
| isNull(): IsNullFilter; | ||
| /** | ||
| * String matches pattern. | ||
| * @param pattern regular expression | ||
| * @param caseInsensitive should the check be case insensitive? | ||
| * @return - a filter | ||
| */ | ||
| matches(pattern: string, caseInsensitive?: boolean): MatchesFilter; | ||
| /** | ||
| * String matches pattern. | ||
| * @param pattern - regular expression, if the RegExp object has the 'i' flag, perform a case insensitive match. | ||
| * @return - a filter | ||
| */ | ||
| matches(pattern: RegExp): MatchesFilter; | ||
| /** | ||
| * String starts with prefix | ||
| * @return - a filter | ||
| */ | ||
| startsWith(prefix: string): StartsWithFilter; | ||
| /** | ||
| * Casts to a specific doc type. Use for typed paths with typescript. | ||
| * @return - a filter | ||
| */ | ||
| as<T>(): Doc<T>; | ||
| } | ||
| declare type PathProxy = Path & Record<Key, Path>; | ||
| interface CastablePath { | ||
| as<T>(): Doc<T>; | ||
| } | ||
| interface EquatablePath<T extends Equatable> extends CastablePath { | ||
| eq(x: T): EqFilter; | ||
| ne(x: T): NeFilter; | ||
| } | ||
| interface ComparablePath<T extends Comparable> extends EquatablePath<T> { | ||
| gt(x: T): GtFilter; | ||
| gte(x: T): GteFilter; | ||
| lt(x: T): LtFilter; | ||
| lte(x: T): LteFilter; | ||
| } | ||
| interface StringPath extends ComparablePath<string> { | ||
| matches(pattern: string, caseInsensitive?: boolean): MatchesFilter; | ||
| matches(pattern: RegExp): MatchesFilter; | ||
| startsWith(prefix: string): StartsWithFilter; | ||
| } | ||
| declare type NumberPath = ComparablePath<number>; | ||
| declare type DatePath = ComparablePath<Date>; | ||
| declare type BooleanPath = EquatablePath<boolean>; | ||
| interface NullPath extends CastablePath { | ||
| isNull(): IsNullFilter; | ||
| } | ||
| interface MaybePath extends CastablePath { | ||
| exists(): Filter; | ||
| } | ||
| declare type Doc<T> = T extends Record<string, unknown> ? Required<{ | ||
| [P in keyof T]: Doc<T[P]> & MaybePath; | ||
| }> : T extends Array<infer U> ? { | ||
| [idx: number]: Doc<U> & MaybePath; | ||
| } : T extends null ? NullPath : T extends number ? NumberPath : T extends string ? StringPath : T extends boolean ? BooleanPath : T extends Date ? DatePath : never; | ||
| export declare function typedValue<T>(): Doc<T>; | ||
| export declare const key: StringPath; | ||
| export declare const value: PathProxy; | ||
| declare type NonEmptyArray<T> = [T, ...T[]]; | ||
| export declare function all(...filters: NonEmptyArray<Filter>): AndFilter; | ||
| export declare function any(...filters: NonEmptyArray<Filter>): OrFilter; | ||
| export declare function not(f: Filter): NotFilter; | ||
| export interface QueryData extends dbi.Query { | ||
| filter: Filter; | ||
| } | ||
| export declare class Query { | ||
| protected readonly _filter: Filter; | ||
| protected readonly _limit?: number | undefined; | ||
| protected readonly _skip?: number | undefined; | ||
| protected readonly _orderBy?: dbi.Order[] | undefined; | ||
| protected constructor(_filter: Filter, _limit?: number | undefined, _skip?: number | undefined, _orderBy?: dbi.Order[] | undefined); | ||
| filter(f: Filter): Query; | ||
| limit(l: number): Query; | ||
| skip(s: number): Query; | ||
| orderBy(path: Path | Doc<any>, order?: Direction): Query; | ||
| static fromFilter(f: Filter): Query; | ||
| toJSON(): QueryData; | ||
| getParts(): QueryData; | ||
| } | ||
| export declare const filter: typeof Query.fromFilter; | ||
| export {}; | ||
| //# sourceMappingURL=query.d.ts.map |
| {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"} |
-283
| "use strict"; | ||
| var __importStar = (this && this.__importStar) || function (mod) { | ||
| if (mod && mod.__esModule) return mod; | ||
| var result = {}; | ||
| if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; | ||
| result["default"] = mod; | ||
| return result; | ||
| }; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| const ramda_1 = require("ramda"); | ||
| const errors_1 = require("./errors"); | ||
| const dbi = __importStar(require("@binaris/shift-interfaces-node-client/interfaces")); | ||
| const filterSymbol = Symbol('shiftjs/filter'); | ||
| exports.ASC = dbi.Direction.ASC; | ||
| exports.DESC = dbi.Direction.DESC; | ||
| const proxyHandler = { | ||
| get(obj, prop) { | ||
| // Known properties such as `field` and `eq` are used as defined, unknown properties are used as fields. | ||
| return prop in obj ? obj[prop] : obj.field(prop); | ||
| }, | ||
| }; | ||
| class Path { | ||
| constructor(parts) { | ||
| this.parts = parts; | ||
| } | ||
| static proxied(parts) { | ||
| return new Proxy(new this(parts), proxyHandler); | ||
| } | ||
| /** | ||
| * Returns a subpath at given key. | ||
| * @param key - object key or array index | ||
| * @return - subpath of document | ||
| */ | ||
| field(k) { | ||
| // When using proxy, paths will be converted to string, field() replicates this behavior | ||
| return Path.proxied([...this.parts, k.toString()]); | ||
| } | ||
| /** | ||
| * Returns a subpath at given key. | ||
| * Has a template parameter for improved type safety when using typescript. | ||
| * @param key - object key or array index | ||
| * @return - subpath of document | ||
| */ | ||
| typedField(k) { | ||
| return this.field(k); | ||
| } | ||
| /** | ||
| * Equals | ||
| * @param x - value for comparison | ||
| * @return - a filter | ||
| */ | ||
| eq(x) { | ||
| return { | ||
| [filterSymbol]: true, | ||
| operator: 'eq', | ||
| path: this.parts, | ||
| value: x, | ||
| }; | ||
| } | ||
| /** | ||
| * Not equals | ||
| * @param x - value for comparison | ||
| * @return - a filter | ||
| */ | ||
| ne(x) { | ||
| return { | ||
| [filterSymbol]: true, | ||
| operator: 'ne', | ||
| path: this.parts, | ||
| value: x, | ||
| }; | ||
| } | ||
| /** | ||
| * Greater than | ||
| * @param x - value for comparison | ||
| * @return - a filter | ||
| */ | ||
| gt(x) { | ||
| return { | ||
| [filterSymbol]: true, | ||
| operator: 'gt', | ||
| path: this.parts, | ||
| value: x, | ||
| }; | ||
| } | ||
| /** | ||
| * Greater than or equals | ||
| * @param x - value for comparison | ||
| * @return - a filter | ||
| */ | ||
| gte(x) { | ||
| return { | ||
| [filterSymbol]: true, | ||
| operator: 'gte', | ||
| path: this.parts, | ||
| value: x, | ||
| }; | ||
| } | ||
| /** | ||
| * Less than | ||
| * @param x - value for comparison | ||
| * @return - a filter | ||
| */ | ||
| lt(x) { | ||
| return { | ||
| [filterSymbol]: true, | ||
| operator: 'lt', | ||
| path: this.parts, | ||
| value: x, | ||
| }; | ||
| } | ||
| /** | ||
| * Less than or equals | ||
| * @param x - value for comparison | ||
| * @return - a filter | ||
| */ | ||
| lte(x) { | ||
| return { | ||
| [filterSymbol]: true, | ||
| operator: 'lte', | ||
| path: this.parts, | ||
| value: x, | ||
| }; | ||
| } | ||
| /** | ||
| * Does path exist? | ||
| * @return - a filter | ||
| */ | ||
| exists() { | ||
| return { | ||
| [filterSymbol]: true, | ||
| operator: 'exists', | ||
| path: this.parts, | ||
| }; | ||
| } | ||
| /** | ||
| * Is value at path null? | ||
| * @return - a filter | ||
| */ | ||
| isNull() { | ||
| return { | ||
| [filterSymbol]: true, | ||
| operator: 'isNull', | ||
| path: this.parts, | ||
| }; | ||
| } | ||
| matches(pattern, caseInsensitive = false) { | ||
| if (typeof pattern === 'string') { | ||
| return { | ||
| [filterSymbol]: true, | ||
| operator: 'matches', | ||
| path: this.parts, | ||
| pattern, | ||
| caseInsensitive, | ||
| }; | ||
| } | ||
| else if (pattern instanceof RegExp) { | ||
| if (/[^i]/.test(pattern.flags)) { | ||
| throw new TypeError('Only /i RegExp flag supported'); | ||
| } | ||
| return { | ||
| [filterSymbol]: true, | ||
| operator: 'matches', | ||
| path: this.parts, | ||
| pattern: pattern.source, | ||
| caseInsensitive: pattern.flags.includes('i'), | ||
| }; | ||
| } | ||
| throw new TypeError('Expected pattern to be a RegExp or string'); | ||
| } | ||
| /** | ||
| * String starts with prefix | ||
| * @return - a filter | ||
| */ | ||
| startsWith(prefix) { | ||
| return { | ||
| [filterSymbol]: true, | ||
| operator: 'startsWith', | ||
| path: this.parts, | ||
| value: prefix, | ||
| }; | ||
| } | ||
| /** | ||
| * Casts to a specific doc type. Use for typed paths with typescript. | ||
| * @return - a filter | ||
| */ | ||
| as() { | ||
| return Path.proxied(this.parts); | ||
| } | ||
| } | ||
| function typedValue() { | ||
| return Path.proxied(['value']); | ||
| } | ||
| exports.typedValue = typedValue; | ||
| exports.key = Path.proxied(['key']); | ||
| exports.value = Path.proxied(['value']); | ||
| function checkFilters(...filters) { | ||
| if (filters.length === 0) { | ||
| throw new errors_1.IllegalArgumentError('Expected at least 1 filter'); | ||
| } | ||
| for (const f of filters) { | ||
| if (!f[filterSymbol]) { | ||
| throw new TypeError('Given filter is invalid'); | ||
| } | ||
| } | ||
| } | ||
| function all(...filters) { | ||
| checkFilters(...filters); | ||
| return { | ||
| [filterSymbol]: true, | ||
| operator: 'and', | ||
| filters, | ||
| }; | ||
| } | ||
| exports.all = all; | ||
| function any(...filters) { | ||
| checkFilters(...filters); | ||
| return { | ||
| [filterSymbol]: true, | ||
| operator: 'or', | ||
| filters, | ||
| }; | ||
| } | ||
| exports.any = any; | ||
| function not(f) { | ||
| checkFilters(f); | ||
| return { | ||
| [filterSymbol]: true, | ||
| operator: 'not', | ||
| filter: f, | ||
| }; | ||
| } | ||
| exports.not = not; | ||
| class Query { | ||
| constructor(_filter, _limit, _skip, _orderBy) { | ||
| this._filter = _filter; | ||
| this._limit = _limit; | ||
| this._skip = _skip; | ||
| this._orderBy = _orderBy; | ||
| } | ||
| filter(f) { | ||
| return new Query(all(this._filter, f), this._limit, this._skip, this._orderBy); | ||
| } | ||
| limit(l) { | ||
| if (l < 1) { | ||
| throw new errors_1.IllegalArgumentError(`Given limit (${l}) is less than 1`); | ||
| } | ||
| if (this._limit !== undefined && l > this._limit) { | ||
| throw new errors_1.IllegalArgumentError(`Given limit (${l}) is greater than current limit (${this._limit})`); | ||
| } | ||
| return new Query(this._filter, l, this._skip, this._orderBy); | ||
| } | ||
| skip(s) { | ||
| return new Query(this._filter, this._limit, s, this._orderBy); | ||
| } | ||
| orderBy(path, order = exports.ASC) { | ||
| const { parts } = path; | ||
| for (const { path: p } of (this._orderBy || [])) { | ||
| if (ramda_1.equals(p, parts)) { | ||
| throw new errors_1.IllegalArgumentError(`Query already ordered by path: ${p}`); | ||
| } | ||
| } | ||
| return new Query(this._filter, this._limit, this._skip, [...(this._orderBy || []), { path: parts, direction: order }]); | ||
| } | ||
| static fromFilter(f) { | ||
| checkFilters(f); | ||
| return new this(f); | ||
| } | ||
| toJSON() { | ||
| return this.getParts(); | ||
| } | ||
| getParts() { | ||
| return { | ||
| filter: this._filter, | ||
| limit: this._limit, | ||
| skip: this._skip, | ||
| orderBy: this._orderBy, | ||
| }; | ||
| } | ||
| } | ||
| exports.Query = Query; | ||
| exports.filter = Query.fromFilter.bind(Query); | ||
| //# sourceMappingURL=query.js.map |
| {"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"} |
| export {}; | ||
| //# sourceMappingURL=db.find.spec.d.ts.map |
| {"version":3,"file":"db.find.spec.d.ts","sourceRoot":"","sources":["../../src/test/db.find.spec.ts"],"names":[],"mappings":""} |
| "use strict"; | ||
| var __importDefault = (this && this.__importDefault) || function (mod) { | ||
| return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
| }; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| const ava_1 = __importDefault(require("ava")); | ||
| const path_1 = __importDefault(require("path")); | ||
| const util_1 = require("util"); | ||
| const os_1 = require("os"); | ||
| const fs_1 = require("fs"); | ||
| const rmfr_1 = __importDefault(require("rmfr")); | ||
| const db_1 = require("../db"); | ||
| const test = ava_1.default; | ||
| test.beforeEach(async (t) => { | ||
| const dbDir = await util_1.promisify(fs_1.mkdtemp)(path_1.default.join(os_1.tmpdir(), 'test-state-'), 'utf8'); | ||
| t.context = { | ||
| dbDir, | ||
| db: new db_1.DB(`${dbDir}/root.db`), | ||
| }; | ||
| }); | ||
| test.afterEach(async (t) => { | ||
| await rmfr_1.default(t.context.dbDir); | ||
| }); | ||
| test('DB.find returns an empty list when no documents', async (t) => { | ||
| const { db } = t.context; | ||
| t.deepEqual(await db.find(db_1.Q.filter(db_1.Q.key.eq('abc'))), []); | ||
| }); | ||
| test('DB.find returns an list of documents', async (t) => { | ||
| const { db } = t.context; | ||
| await db.create('abc', { a: 1 }); | ||
| t.deepEqual(await db.find(db_1.Q.filter(db_1.Q.key.eq('abc'))), [{ key: 'abc', value: { a: 1 } }]); | ||
| }); | ||
| test('DB.find returns all matching documents', async (t) => { | ||
| const { db } = t.context; | ||
| await db.create('a', { a: 1 }); | ||
| await db.create('b', { a: 2 }); | ||
| await db.create('c', { a: 3 }); | ||
| t.deepEqual(await db.find(db_1.Q.filter(db_1.Q.value.a.gt(1))), [ | ||
| { key: 'b', value: { a: 2 } }, | ||
| { key: 'c', value: { a: 3 } }, | ||
| ]); | ||
| }); | ||
| test('DB.find applies limit', async (t) => { | ||
| const { db } = t.context; | ||
| await db.create('a', { a: 1 }); | ||
| await db.create('b', { a: 2 }); | ||
| await db.create('c', { a: 3 }); | ||
| t.deepEqual(await db.find(db_1.Q.filter(db_1.Q.value.a.gt(0)).limit(2)), [ | ||
| { key: 'a', value: { a: 1 } }, | ||
| { key: 'b', value: { a: 2 } }, | ||
| ]); | ||
| }); | ||
| test('DB.find applies skip', async (t) => { | ||
| const { db } = t.context; | ||
| await db.create('a', { a: 1 }); | ||
| await db.create('b', { a: 2 }); | ||
| await db.create('c', { a: 3 }); | ||
| t.deepEqual(await db.find(db_1.Q.filter(db_1.Q.value.a.gt(0)).skip(1)), [ | ||
| { key: 'b', value: { a: 2 } }, | ||
| { key: 'c', value: { a: 3 } }, | ||
| ]); | ||
| }); | ||
| test('DB.find applies orderBy', async (t) => { | ||
| const { db } = t.context; | ||
| await db.create('a', { a: 1, b: 6 }); | ||
| await db.create('b', { a: 2, b: 3 }); | ||
| await db.create('c', { a: 3, b: 7 }); | ||
| t.deepEqual(await db.find(db_1.Q.filter(db_1.Q.value.a.gt(0)) | ||
| .skip(1) | ||
| .limit(1) | ||
| .orderBy(db_1.Q.value.b)), [ | ||
| { key: 'a', value: { a: 1, b: 6 } }, | ||
| ]); | ||
| }); | ||
| test('DB.find ignores tombstones', async (t) => { | ||
| const { db } = t.context; | ||
| await db.create('a', { a: 1, b: 6 }); | ||
| await db.remove('a'); | ||
| t.deepEqual(await db.find(db_1.Q.filter(db_1.Q.key.eq('a'))), []); | ||
| }); | ||
| //# sourceMappingURL=db.find.spec.js.map |
| {"version":3,"file":"db.find.spec.js","sourceRoot":"","sources":["../../src/test/db.find.spec.ts"],"names":[],"mappings":"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"} |
| export {}; | ||
| //# sourceMappingURL=db.match.spec.d.ts.map |
| {"version":3,"file":"db.match.spec.d.ts","sourceRoot":"","sources":["../../src/test/db.match.spec.ts"],"names":[],"mappings":""} |
| "use strict"; | ||
| var __importDefault = (this && this.__importDefault) || function (mod) { | ||
| return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
| }; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| const ava_1 = __importDefault(require("ava")); | ||
| const db_1 = require("../db"); | ||
| ava_1.default('eq checks for strict equality', (t) => { | ||
| t.true(db_1.match({ key: 'abc', value: 3 }, db_1.Q.value.eq(3))); | ||
| t.false(db_1.match({ key: 'abc', value: 3 }, db_1.Q.value.eq(2))); | ||
| t.false(db_1.match({ key: 'abc', value: 3 }, db_1.Q.value.eq('3'))); | ||
| }); | ||
| ava_1.default('ne checks for strict equality', (t) => { | ||
| t.false(db_1.match({ key: 'abc', value: 3 }, db_1.Q.value.ne(3))); | ||
| t.true(db_1.match({ key: 'abc', value: 3 }, db_1.Q.value.ne(2))); | ||
| t.true(db_1.match({ key: 'abc', value: 3 }, db_1.Q.value.ne('3'))); | ||
| }); | ||
| ava_1.default('gt checks for same type', (t) => { | ||
| t.true(db_1.match({ key: 'abc', value: 3 }, db_1.Q.value.gt(2))); | ||
| t.false(db_1.match({ key: 'abc', value: 3 }, db_1.Q.value.gt('2'))); | ||
| t.true(db_1.match({ key: 'abc', value: 3 }, db_1.Q.key.gt('ab'))); | ||
| t.false(db_1.match({ key: 'abc', value: 3 }, db_1.Q.key.gt(2))); | ||
| }); | ||
| ava_1.default('lt checks for same type', (t) => { | ||
| t.true(db_1.match({ key: 'abc', value: 3 }, db_1.Q.value.lt(4))); | ||
| t.false(db_1.match({ key: 'abc', value: 3 }, db_1.Q.value.lt('4'))); | ||
| t.true(db_1.match({ key: 'abc', value: 3 }, db_1.Q.key.lt('abd'))); | ||
| t.false(db_1.match({ key: 'abc', value: 3 }, db_1.Q.key.lt(4))); | ||
| }); | ||
| ava_1.default('gte checks for same type', (t) => { | ||
| t.true(db_1.match({ key: 'abc', value: 3 }, db_1.Q.value.gte(2))); | ||
| t.true(db_1.match({ key: 'abc', value: 3 }, db_1.Q.value.gte(3))); | ||
| t.false(db_1.match({ key: 'abc', value: 3 }, db_1.Q.value.gte('2'))); | ||
| t.false(db_1.match({ key: 'abc', value: 3 }, db_1.Q.value.gte('3'))); | ||
| t.true(db_1.match({ key: 'abc', value: 3 }, db_1.Q.key.gte('ab'))); | ||
| t.true(db_1.match({ key: 'abc', value: 3 }, db_1.Q.key.gte('abc'))); | ||
| t.false(db_1.match({ key: 'abc', value: 3 }, db_1.Q.key.gte(2))); | ||
| }); | ||
| ava_1.default('lte checks for same type', (t) => { | ||
| t.true(db_1.match({ key: 'abc', value: 3 }, db_1.Q.value.lte(4))); | ||
| t.true(db_1.match({ key: 'abc', value: 3 }, db_1.Q.value.lte(3))); | ||
| t.false(db_1.match({ key: 'abc', value: 3 }, db_1.Q.value.lte('4'))); | ||
| t.false(db_1.match({ key: 'abc', value: 3 }, db_1.Q.value.lte('3'))); | ||
| t.true(db_1.match({ key: 'abc', value: 3 }, db_1.Q.key.lte('abd'))); | ||
| t.true(db_1.match({ key: 'abc', value: 3 }, db_1.Q.key.lte('abc'))); | ||
| t.false(db_1.match({ key: 'abc', value: 3 }, db_1.Q.key.lte(4))); | ||
| }); | ||
| ava_1.default('exists checks for undefined', (t) => { | ||
| t.true(db_1.match({ key: 'abc', value: null }, db_1.Q.value.exists())); | ||
| t.true(db_1.match({ key: 'abc', value: 0 }, db_1.Q.value.exists())); | ||
| t.true(db_1.match({ key: 'abc', value: 'a' }, db_1.Q.value.exists())); | ||
| t.false(db_1.match({ key: 'abc', value: {} }, db_1.Q.value.a.exists())); | ||
| }); | ||
| ava_1.default('isNull checks for null', (t) => { | ||
| t.true(db_1.match({ key: 'abc', value: null }, db_1.Q.value.isNull())); | ||
| t.false(db_1.match({ key: 'abc', value: 0 }, db_1.Q.value.isNull())); | ||
| t.false(db_1.match({ key: 'abc', value: 'a' }, db_1.Q.value.isNull())); | ||
| t.false(db_1.match({ key: 'abc', value: {} }, db_1.Q.value.a.isNull())); | ||
| }); | ||
| ava_1.default('matches matches string', (t) => { | ||
| t.false(db_1.match({ key: 'abc', value: null }, db_1.Q.value.matches(/abc/i))); | ||
| t.false(db_1.match({ key: 'abc', value: 0 }, db_1.Q.value.matches(/abc/i))); | ||
| t.true(db_1.match({ key: 'abc', value: 'abc' }, db_1.Q.value.matches(/abc/i))); | ||
| t.true(db_1.match({ key: 'abc', value: 'ABC' }, db_1.Q.value.matches(/abc/i))); | ||
| t.false(db_1.match({ key: 'abc', value: 'ABC' }, db_1.Q.value.matches(/abc/))); | ||
| }); | ||
| ava_1.default('startsWith matches string', (t) => { | ||
| t.false(db_1.match({ key: 'abc', value: null }, db_1.Q.value.startsWith('ab'))); | ||
| t.false(db_1.match({ key: 'abc', value: 0 }, db_1.Q.value.startsWith('ab'))); | ||
| t.true(db_1.match({ key: 'abc', value: 'abc' }, db_1.Q.value.startsWith('ab'))); | ||
| t.false(db_1.match({ key: 'abc', value: 'ABC' }, db_1.Q.value.startsWith('ab'))); | ||
| }); | ||
| ava_1.default('all applies all filters', (t) => { | ||
| t.true(db_1.match({ key: 'abc', value: 0 }, db_1.Q.all(db_1.Q.key.startsWith('ab'), db_1.Q.value.eq(0)))); | ||
| t.false(db_1.match({ key: 'abc', value: 0 }, db_1.Q.all(db_1.Q.key.startsWith('ab'), db_1.Q.value.eq(1)))); | ||
| t.false(db_1.match({ key: 'abc', value: 0 }, db_1.Q.all(db_1.Q.key.eq('ab'), db_1.Q.value.eq(0)))); | ||
| t.false(db_1.match({ key: 'abc', value: 0 }, db_1.Q.all(db_1.Q.key.eq('ab'), db_1.Q.value.eq(1)))); | ||
| }); | ||
| ava_1.default('any applies all filters', (t) => { | ||
| t.true(db_1.match({ key: 'abc', value: 0 }, db_1.Q.any(db_1.Q.key.startsWith('ab'), db_1.Q.value.eq(0)))); | ||
| t.true(db_1.match({ key: 'abc', value: 0 }, db_1.Q.any(db_1.Q.key.startsWith('ab'), db_1.Q.value.eq(1)))); | ||
| t.true(db_1.match({ key: 'abc', value: 0 }, db_1.Q.any(db_1.Q.key.eq('ab'), db_1.Q.value.eq(0)))); | ||
| t.false(db_1.match({ key: 'abc', value: 0 }, db_1.Q.any(db_1.Q.key.eq('ab'), db_1.Q.value.eq(1)))); | ||
| }); | ||
| ava_1.default('not negates a filter', (t) => { | ||
| t.true(db_1.match({ key: 'abc', value: 0 }, db_1.Q.not(db_1.Q.key.eq('ab')))); | ||
| t.false(db_1.match({ key: 'abc', value: 0 }, db_1.Q.not(db_1.Q.key.startsWith('ab')))); | ||
| }); | ||
| //# sourceMappingURL=db.match.spec.js.map |
| {"version":3,"file":"db.match.spec.js","sourceRoot":"","sources":["../../src/test/db.match.spec.ts"],"names":[],"mappings":"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"} |
| export {}; | ||
| //# sourceMappingURL=db.spec.d.ts.map |
| {"version":3,"file":"db.spec.d.ts","sourceRoot":"","sources":["../../src/test/db.spec.ts"],"names":[],"mappings":""} |
| "use strict"; | ||
| var __importDefault = (this && this.__importDefault) || function (mod) { | ||
| return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
| }; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| const ava_1 = __importDefault(require("ava")); | ||
| const ramda_1 = require("ramda"); | ||
| const path_1 = __importDefault(require("path")); | ||
| const util_1 = require("util"); | ||
| const os_1 = require("os"); | ||
| const fs_1 = require("fs"); | ||
| const rmfr_1 = __importDefault(require("rmfr")); | ||
| const db_1 = require("../db"); | ||
| const utils_1 = require("../utils"); | ||
| const test = ava_1.default; | ||
| test.beforeEach(async (t) => { | ||
| const dbDir = await util_1.promisify(fs_1.mkdtemp)(path_1.default.join(os_1.tmpdir(), 'test-state-'), 'utf8'); | ||
| t.context = { | ||
| dbDir, | ||
| db: new db_1.DB(`${dbDir}/root.db`), | ||
| }; | ||
| }); | ||
| test.afterEach(async (t) => { | ||
| await rmfr_1.default(t.context.dbDir); | ||
| }); | ||
| test('DB.get returns undefined when no key exists', async (t) => { | ||
| const { db } = t.context; | ||
| t.is(await db.get('test'), undefined); | ||
| }); | ||
| test('DB.create creates a new document, returns true, and sets version to 1', async (t) => { | ||
| const { db } = t.context; | ||
| const t0 = utils_1.hrnano(); | ||
| const ret = await db.create('test', { a: 1 }); | ||
| const doc = await db.getWithMeta('test'); | ||
| t.deepEqual(ramda_1.omit(['updatedAt', 'version'], doc), { | ||
| value: { a: 1 }, | ||
| patches: [ | ||
| { | ||
| version: doc.version, | ||
| ops: [{ op: 'replace', path: '/root', value: { a: 1 } }], | ||
| }, | ||
| ], | ||
| }); | ||
| t.true(doc.updatedAt >= t0); | ||
| t.true(doc.version.major >= t0); | ||
| t.is(doc.version.minor, 1); | ||
| t.true(ret); | ||
| }); | ||
| test('DB.create returns false if key already exists', async (t) => { | ||
| const { db } = t.context; | ||
| await db.create('test', { a: 1 }); | ||
| t.false(await db.create('test', { a: 2 })); | ||
| }); | ||
| test('DB.create throws TypeError when value undefined', async (t) => { | ||
| const { db } = t.context; | ||
| await t.throwsAsync(db.create('test', undefined), { | ||
| instanceOf: TypeError, | ||
| message: /undefined/, | ||
| }); | ||
| }); | ||
| test('DB.create throws TypeError when value is a function', async (t) => { | ||
| const { db } = t.context; | ||
| await t.throwsAsync(db.create('test', () => 17), { | ||
| instanceOf: TypeError, | ||
| message: /function/, | ||
| }); | ||
| }); | ||
| test('DB.create throws TypeError when value is a bigint', async (t) => { | ||
| const { db } = t.context; | ||
| await t.throwsAsync(db.create('test', BigInt(17)), { | ||
| instanceOf: TypeError, | ||
| message: /bigint/, | ||
| }); | ||
| }); | ||
| test('DB.create accepts arbitrary JSONables', async (t) => { | ||
| const { db } = t.context; | ||
| await db.create('test_string', 'hey'); | ||
| await db.create('test_number', 7); | ||
| await db.create('test_boolean', true); | ||
| await db.create('test_date', new Date()); | ||
| await db.create('test_object', { a: [7] }); | ||
| await db.create('test_object', [{ a: 7 }]); | ||
| t.pass(); | ||
| }); | ||
| test('DB.remove returns false when no key exists', async (t) => { | ||
| const { db } = t.context; | ||
| t.false(await db.remove('test')); | ||
| }); | ||
| test('DB.remove returns false when tombstone in key', async (t) => { | ||
| const { db } = t.context; | ||
| await db.create('test', { a: 1 }); | ||
| await db.remove('test'); | ||
| t.false(await db.remove('test')); | ||
| }); | ||
| test('DB.remove removes existing key from DB and returns true', async (t) => { | ||
| const { db } = t.context; | ||
| await db.create('test', { a: 1 }); | ||
| t.true(await db.remove('test')); | ||
| t.is(await db.get('test'), undefined); | ||
| }); | ||
| test('DB.remove sets a tombstone with an updatedAt attribute', async (t) => { | ||
| const { db } = t.context; | ||
| const t0 = utils_1.hrnano(); | ||
| await db.create('test', { a: 1 }); | ||
| t.true(await db.remove('test')); | ||
| const doc = await db.getWithMeta('test'); | ||
| t.is(doc.value, undefined); | ||
| t.true(doc.updatedAt >= t0); | ||
| }); | ||
| test('DB.update creates a new document if key does not exist, returns it, sets version to 1', async (t) => { | ||
| const { db } = t.context; | ||
| const t0 = utils_1.hrnano(); | ||
| const next = await db.update('test', (prev) => (Object.assign({}, prev, { a: 1 }))); | ||
| const { value, version } = (await db.getWithMeta('test')); | ||
| t.deepEqual(value, { a: 1 }); | ||
| t.deepEqual(next, value); | ||
| t.true(version.major >= t0); | ||
| t.is(version.minor, 1); | ||
| }); | ||
| test('DB.update updates an existing document, returns it, and increments version', async (t) => { | ||
| const { db } = t.context; | ||
| await db.create('test', { b: 2 }); | ||
| const { version: firstVersion } = (await db.getWithMeta('test')); | ||
| const next = await db.update('test', (prev) => (Object.assign({}, prev, { a: 1 }))); | ||
| const { value, version } = (await db.getWithMeta('test')); | ||
| t.deepEqual(value, { a: 1, b: 2 }); | ||
| t.deepEqual(next, value); | ||
| t.deepEqual(version, db_1.incrVersion(firstVersion)); | ||
| }); | ||
| test('DB.update does nothing if document not updated', async (t) => { | ||
| const { db } = t.context; | ||
| await db.create('test', { b: 2 }); | ||
| const { version: firstVersion } = (await db.getWithMeta('test')); | ||
| const next = await db.update('test', (prev) => (Object.assign({}, prev))); | ||
| const { value, version } = (await db.getWithMeta('test')); | ||
| t.deepEqual(value, { b: 2 }); | ||
| t.deepEqual(next, value); | ||
| t.deepEqual(version, firstVersion); | ||
| }); | ||
| test('DB.poll returns patches which match requested versions', async (t) => { | ||
| const { db } = t.context; | ||
| await db.create('test1', 'a'); | ||
| await db.create('test2', 'a'); | ||
| await db.create('test3', 'a'); | ||
| await db.create('test4', 'a'); | ||
| await db.create('test5', 'a'); | ||
| await db.update('test1', () => 'b'); | ||
| await db.update('test1', () => 'c'); | ||
| await db.update('test2', () => 'b'); | ||
| await db.update('test2', () => 'c'); | ||
| await db.update('test3', () => 'b'); | ||
| await db.remove('test3'); | ||
| const [major1, major2, major3, major4, major5,] = await Promise.all(ramda_1.range(1, 5 + 1).map(async (x) => (await db.getWithMeta(`test${x}`)).version.major)); | ||
| const keyedPatches = await db.poll([ | ||
| ['test1', { major: major1, minor: 1 }], | ||
| ['test2', { major: major2, minor: 2 }], | ||
| ['test3', { major: major3, minor: 1 }], | ||
| ['test4', { major: major4, minor: 1 }], | ||
| ['test5', { major: major5, minor: 0 }], | ||
| ]); | ||
| t.deepEqual(keyedPatches, [ | ||
| ['test1', [ | ||
| { version: { major: major1, minor: 2 }, ops: [{ op: 'replace', path: '/root', value: 'b' }] }, | ||
| { version: { major: major1, minor: 3 }, ops: [{ op: 'replace', path: '/root', value: 'c' }] }, | ||
| ]], | ||
| ['test2', [ | ||
| { version: { major: major2, minor: 3 }, ops: [{ op: 'replace', path: '/root', value: 'c' }] }, | ||
| ]], | ||
| ['test3', [ | ||
| { version: { major: major3, minor: 2 }, ops: [{ op: 'replace', path: '/root', value: 'b' }] }, | ||
| { version: { major: major3, minor: 3 }, ops: [{ op: 'remove', path: '/root' }] }, | ||
| ]], | ||
| ['test5', [ | ||
| { version: { major: major5, minor: 1 }, ops: [{ op: 'replace', path: '/root', value: 'a' }] }, | ||
| ]], | ||
| ]); | ||
| }); | ||
| test('DB.poll returns on update if no new patches stored', async (t) => { | ||
| const { db } = t.context; | ||
| await db.create('test1', 'a'); | ||
| const { version } = (await db.getWithMeta('test1')); | ||
| const [keyedPatches] = await Promise.all([ | ||
| db.poll([['test1', version]]), | ||
| db.update('test1', () => 'b'), | ||
| ]); | ||
| t.deepEqual(keyedPatches, [ | ||
| ['test1', [ | ||
| { version: db_1.incrVersion(version), ops: [{ op: 'replace', path: '/root', value: 'b' }] }, | ||
| ]], | ||
| ]); | ||
| }); | ||
| test('DB.poll returns on remove if no new patches stored', async (t) => { | ||
| const { db } = t.context; | ||
| await db.create('test1', 'a'); | ||
| const { version } = (await db.getWithMeta('test1')); | ||
| const [keyedPatches] = await Promise.all([ | ||
| db.poll([['test1', version]]), | ||
| db.remove('test1'), | ||
| ]); | ||
| t.deepEqual(keyedPatches, [ | ||
| ['test1', [ | ||
| { version: { major: version.major, minor: 2 }, ops: [{ op: 'remove', path: '/root' }] }, | ||
| ]], | ||
| ]); | ||
| }); | ||
| test('DB.poll returns on create if no new patches stored', async (t) => { | ||
| const { db } = t.context; | ||
| const [keyedPatches] = await Promise.all([ | ||
| db.poll([['test1', { major: 0, minor: 0 }]]), | ||
| db.create('test1', 'a'), | ||
| ]); | ||
| const { version } = (await db.getWithMeta('test1')); | ||
| t.deepEqual(keyedPatches, [ | ||
| ['test1', [ | ||
| { version, ops: [{ op: 'replace', path: '/root', value: 'a' }] }, | ||
| ]], | ||
| ]); | ||
| }); | ||
| test('DB.poll returns empty array when no patches emitted', async (t) => { | ||
| const { db } = t.context; | ||
| const patches = await db.poll([['test1', { major: 0, minor: 0 }]], { readBlockTimeMs: 100 }); | ||
| t.deepEqual(patches, []); | ||
| }); | ||
| test('DB.poll returns empty array when patches emitted on different key', async (t) => { | ||
| const { db } = t.context; | ||
| const [patches] = await Promise.all([ | ||
| db.poll([['test1', { major: 0, minor: 0 }]], { readBlockTimeMs: 100 }), | ||
| db.create('test2', 'a'), | ||
| ]); | ||
| t.deepEqual(patches, []); | ||
| }); | ||
| test('DB.poll returns empty array when patches emitted on old version', async (t) => { | ||
| const { db } = t.context; | ||
| const [patches] = await Promise.all([ | ||
| db.poll([['test1', { major: utils_1.hrnano() + 10000000000, minor: 0 }]], { readBlockTimeMs: 100 }), | ||
| db.create('test1', 'a'), | ||
| ]); | ||
| t.deepEqual(patches, []); | ||
| }); | ||
| test('DB.create works after remove', async (t) => { | ||
| const { db } = t.context; | ||
| await db.create('test', 7); | ||
| const { version: initialVersion } = (await db.getWithMeta('test')); | ||
| await db.remove('test'); | ||
| const t0 = utils_1.hrnano(); | ||
| t.true(await db.create('test', 8)); | ||
| const doc = await db.getWithMeta('test'); | ||
| t.deepEqual(ramda_1.omit(['updatedAt', 'version'], doc), { | ||
| value: 8, | ||
| patches: [ | ||
| { | ||
| version: initialVersion, | ||
| ops: [{ op: 'replace', path: '/root', value: 7 }], | ||
| }, | ||
| { | ||
| version: db_1.incrVersion(initialVersion), | ||
| ops: [{ op: 'remove', path: '/root' }], | ||
| }, | ||
| { | ||
| version: doc.version, | ||
| ops: [{ op: 'replace', path: '/root', value: 8 }], | ||
| }, | ||
| ], | ||
| }); | ||
| t.true(doc.updatedAt >= t0); | ||
| t.true(doc.version.major >= t0); | ||
| t.is(doc.version.minor, 1); | ||
| }); | ||
| test('DB.update works after remove but increments version and includes tombstone\'s patches', async (t) => { | ||
| const { db } = t.context; | ||
| await db.create('test', 7); | ||
| const { version: initialVersion } = (await db.getWithMeta('test')); | ||
| await db.remove('test'); | ||
| const t0 = utils_1.hrnano(); | ||
| const val = await db.update('test', () => 8); | ||
| t.is(val, 8); | ||
| const doc = await db.getWithMeta('test'); | ||
| t.deepEqual(ramda_1.omit(['updatedAt', 'version'], doc), { | ||
| value: 8, | ||
| patches: [ | ||
| { | ||
| version: initialVersion, | ||
| ops: [{ op: 'replace', path: '/root', value: 7 }], | ||
| }, | ||
| { | ||
| version: db_1.incrVersion(initialVersion), | ||
| ops: [{ op: 'remove', path: '/root' }], | ||
| }, | ||
| { | ||
| version: doc.version, | ||
| ops: [{ op: 'replace', path: '/root', value: 8 }], | ||
| }, | ||
| ], | ||
| }); | ||
| t.true(doc.updatedAt >= t0); | ||
| t.true(doc.version.major >= t0); | ||
| t.is(doc.version.minor, 1); | ||
| }); | ||
| test('DB.update throws TypeError if updater returned undefined', async (t) => { | ||
| const { db } = t.context; | ||
| await t.throwsAsync(db.update('test', () => undefined), TypeError); | ||
| }); | ||
| test('DB.update throws TypeError if trying to modify returned object', async (t) => { | ||
| const { db } = t.context; | ||
| await db.create('test', { a: 1, b: { c: 2, d: [5] } }); | ||
| await t.throwsAsync(db.update('test', (obj) => { | ||
| obj.a = 2; | ||
| return obj; | ||
| }), TypeError); | ||
| await t.throwsAsync(db.update('test', (obj) => { | ||
| obj.b.c = 3; | ||
| return obj; | ||
| }), TypeError); | ||
| await t.throwsAsync(db.update('test', (obj) => { | ||
| obj.b.d[0] = 6; | ||
| return obj; | ||
| }), TypeError); | ||
| }); | ||
| //# sourceMappingURL=db.spec.js.map |
| {"version":3,"file":"db.spec.js","sourceRoot":"","sources":["../../src/test/db.spec.ts"],"names":[],"mappings":"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"} |
| export {}; | ||
| //# sourceMappingURL=query.spec.d.ts.map |
| {"version":3,"file":"query.spec.d.ts","sourceRoot":"","sources":["../../src/test/query.spec.ts"],"names":[],"mappings":""} |
| "use strict"; | ||
| var __importDefault = (this && this.__importDefault) || function (mod) { | ||
| return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
| }; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| const ava_1 = __importDefault(require("ava")); | ||
| const errors_1 = require("../errors"); | ||
| const query_1 = require("../query"); | ||
| function stringifyThenParse(v) { | ||
| return JSON.parse(JSON.stringify(v)); | ||
| } | ||
| ava_1.default('key builds a filter on document key', (t) => { | ||
| t.deepEqual(stringifyThenParse(query_1.key.eq('abc')), { path: ['key'], operator: 'eq', value: 'abc' }); | ||
| }); | ||
| ava_1.default('value builds a filter on document value', (t) => { | ||
| t.deepEqual(stringifyThenParse(query_1.value.eq('abc')), { path: ['value'], operator: 'eq', value: 'abc' }); | ||
| }); | ||
| ava_1.default('value.field() builds a nested filter on document value', (t) => { | ||
| t.deepEqual(stringifyThenParse(query_1.value.field('a.b').eq('abc')), { path: ['value', 'a.b'], operator: 'eq', value: 'abc' }); | ||
| }); | ||
| ava_1.default('value.field(number) casts path to string', (t) => { | ||
| t.deepEqual(stringifyThenParse(query_1.value.field(7).eq('abc')), { path: ['value', '7'], operator: 'eq', value: 'abc' }); | ||
| }); | ||
| ava_1.default('value.field(reserved field) generates a path', (t) => { | ||
| t.deepEqual(stringifyThenParse(query_1.value.field('eq').eq('abc')), { path: ['value', 'eq'], operator: 'eq', value: 'abc' }); | ||
| }); | ||
| ava_1.default('value proxy builds a nested filter on document value', (t) => { | ||
| t.deepEqual(stringifyThenParse(query_1.value.x.eq('abc')), { path: ['value', 'x'], operator: 'eq', value: 'abc' }); | ||
| }); | ||
| ava_1.default('typedField builds a filter on document value', (t) => { | ||
| t.deepEqual(stringifyThenParse(query_1.value.typedField('a').eq('abc')), { path: ['value', 'a'], operator: 'eq', value: 'abc' }); | ||
| }); | ||
| ava_1.default('typedValue builds a filter on document value', (t) => { | ||
| t.deepEqual(stringifyThenParse(query_1.typedValue().eq('abc')), { path: ['value'], operator: 'eq', value: 'abc' }); | ||
| }); | ||
| ava_1.default('typedValue proxy builds a nested filter on document value', (t) => { | ||
| t.deepEqual(stringifyThenParse(query_1.typedValue().a.eq(6)), { path: ['value', 'a'], operator: 'eq', value: 6 }); | ||
| }); | ||
| ava_1.default('typedValue proxy builds an array filter on document value', (t) => { | ||
| t.deepEqual(stringifyThenParse(query_1.typedValue()[0].eq('abc')), { path: ['value', '0'], operator: 'eq', value: 'abc' }); | ||
| }); | ||
| ava_1.default('typedValue proxy builds a complex nested filter on document value', (t) => { | ||
| t.deepEqual(stringifyThenParse(query_1.typedValue().z[0].x[5].eq(true)), { path: ['value', 'z', '0', 'x', '5'], operator: 'eq', value: true }); | ||
| }); | ||
| ava_1.default('typedValue proxy supports optional fields', (t) => { | ||
| t.deepEqual(stringifyThenParse(query_1.typedValue().z.exists()), { path: ['value', 'z'], operator: 'exists' }); | ||
| t.deepEqual(stringifyThenParse(query_1.typedValue().z.eq(3)), { path: ['value', 'z'], operator: 'eq', value: 3 }); | ||
| }); | ||
| ava_1.default('typedValue proxy supports optional array values', (t) => { | ||
| t.deepEqual(stringifyThenParse(query_1.typedValue()[0].exists()), { path: ['value', '0'], operator: 'exists' }); | ||
| t.deepEqual(stringifyThenParse(query_1.typedValue()[0].eq(3)), { path: ['value', '0'], operator: 'eq', value: 3 }); | ||
| }); | ||
| ava_1.default('typedValue supports null', (t) => { | ||
| t.deepEqual(stringifyThenParse(query_1.typedValue().z.isNull()), { path: ['value', 'z'], operator: 'isNull' }); | ||
| t.deepEqual(stringifyThenParse(query_1.typedValue().z.as().isNull()), { path: ['value', 'z'], operator: 'isNull' }); | ||
| t.deepEqual(stringifyThenParse(query_1.typedValue().z.as().eq(3)), { path: ['value', 'z'], operator: 'eq', value: 3 }); | ||
| }); | ||
| ava_1.default('ne builds a gt filter', (t) => { | ||
| t.deepEqual(stringifyThenParse(query_1.typedValue().ne(false)), { path: ['value'], operator: 'ne', value: false }); | ||
| }); | ||
| ava_1.default('gt builds a gt filter', (t) => { | ||
| t.deepEqual(stringifyThenParse(query_1.typedValue().gt(7)), { path: ['value'], operator: 'gt', value: 7 }); | ||
| }); | ||
| ava_1.default('lt builds an lt filter', (t) => { | ||
| t.deepEqual(stringifyThenParse(query_1.typedValue().lt('abc')), { path: ['value'], operator: 'lt', value: 'abc' }); | ||
| }); | ||
| ava_1.default('gte builds a gte filter', (t) => { | ||
| t.deepEqual(stringifyThenParse(query_1.typedValue().gte(7)), { path: ['value'], operator: 'gte', value: 7 }); | ||
| }); | ||
| ava_1.default('lte builds an lte filter', (t) => { | ||
| t.deepEqual(stringifyThenParse(query_1.typedValue().lte('abc')), { path: ['value'], operator: 'lte', value: 'abc' }); | ||
| }); | ||
| ava_1.default('exists is available on non optional fields', (t) => { | ||
| const val = query_1.typedValue(); | ||
| t.deepEqual(stringifyThenParse(val.x.exists()), { path: ['value', 'x'], operator: 'exists' }); | ||
| t.deepEqual(stringifyThenParse(val.x.y.exists()), { path: ['value', 'x', 'y'], operator: 'exists' }); | ||
| }); | ||
| ava_1.default('matches builds a match filter', (t) => { | ||
| t.deepEqual(stringifyThenParse(query_1.typedValue().matches('abc')), { path: ['value'], operator: 'matches', pattern: 'abc', caseInsensitive: false }); | ||
| t.deepEqual(stringifyThenParse(query_1.typedValue().matches('abc', true)), { path: ['value'], operator: 'matches', pattern: 'abc', caseInsensitive: true }); | ||
| t.deepEqual(stringifyThenParse(query_1.typedValue().matches(/abc/)), { path: ['value'], operator: 'matches', pattern: 'abc', caseInsensitive: false }); | ||
| t.deepEqual(stringifyThenParse(query_1.typedValue().matches(/abc/i)), { path: ['value'], operator: 'matches', pattern: 'abc', caseInsensitive: true }); | ||
| }); | ||
| ava_1.default('matches throws when given unsupported flags', (t) => { | ||
| t.throws(() => query_1.key.matches(/abc/g)); | ||
| }); | ||
| ava_1.default('startsWith builds a startsWith filter', (t) => { | ||
| t.deepEqual(stringifyThenParse(query_1.typedValue().startsWith('abc')), { path: ['value'], operator: 'startsWith', value: 'abc' }); | ||
| }); | ||
| ava_1.default('all builds a valid filter', (t) => { | ||
| t.deepEqual(stringifyThenParse(query_1.all(query_1.key.startsWith('/games/'), query_1.value.x.eq(5))), { | ||
| operator: 'and', | ||
| filters: [ | ||
| { path: ['key'], operator: 'startsWith', value: '/games/' }, | ||
| { path: ['value', 'x'], operator: 'eq', value: 5 }, | ||
| ], | ||
| }); | ||
| }); | ||
| ava_1.default('all throws a TypeError if not given a filter', (t) => { | ||
| t.throws(() => query_1.all('a'), TypeError); | ||
| }); | ||
| ava_1.default('all throws an IllegalArgumentError if not given any arguemnts', (t) => { | ||
| t.throws(() => query_1.all(), errors_1.IllegalArgumentError); | ||
| }); | ||
| ava_1.default('any builds a valid filter', (t) => { | ||
| t.deepEqual(stringifyThenParse(query_1.any(query_1.key.startsWith('/games/'), query_1.value.y.gt(7))), { | ||
| operator: 'or', | ||
| filters: [ | ||
| { path: ['key'], operator: 'startsWith', value: '/games/' }, | ||
| { path: ['value', 'y'], operator: 'gt', value: 7 }, | ||
| ], | ||
| }); | ||
| }); | ||
| ava_1.default('any throws a TypeError if not given a filter', (t) => { | ||
| t.throws(() => query_1.any('a'), TypeError); | ||
| }); | ||
| ava_1.default('any throws an IllegalArgumentError if not given any arguemnts', (t) => { | ||
| t.throws(() => query_1.any(), errors_1.IllegalArgumentError); | ||
| }); | ||
| ava_1.default('not builds a valid filter', (t) => { | ||
| t.deepEqual(stringifyThenParse(query_1.not(query_1.key.startsWith('/games/'))), { | ||
| operator: 'not', | ||
| filter: { path: ['key'], operator: 'startsWith', value: '/games/' }, | ||
| }); | ||
| }); | ||
| ava_1.default('not throws a TypeError if not given a filter', (t) => { | ||
| t.throws(() => query_1.not('a'), TypeError); | ||
| }); | ||
| ava_1.default('filter builds a new query', (t) => { | ||
| t.deepEqual(stringifyThenParse(query_1.filter(query_1.key.startsWith('/games/'))), { | ||
| filter: { path: ['key'], operator: 'startsWith', value: '/games/' }, | ||
| }); | ||
| }); | ||
| ava_1.default('filter throws if not given a Filter', (t) => { | ||
| t.throws(() => query_1.filter('abc'), TypeError); | ||
| }); | ||
| ava_1.default('Query.filter combines filters with logical AND', (t) => { | ||
| t.deepEqual(stringifyThenParse(query_1.filter(query_1.key.startsWith('/games/')).filter(query_1.value.eq(7))), { | ||
| filter: { | ||
| operator: 'and', | ||
| filters: [ | ||
| { path: ['key'], operator: 'startsWith', value: '/games/' }, | ||
| { path: ['value'], operator: 'eq', value: 7 }, | ||
| ], | ||
| }, | ||
| }); | ||
| }); | ||
| ava_1.default('Query.filter throws if not given a Filter', (t) => { | ||
| const q = query_1.filter(query_1.key.eq('abc')); | ||
| t.throws(() => q.filter('abc'), TypeError); | ||
| }); | ||
| const baseQ = query_1.filter(query_1.key.startsWith('/games/')); | ||
| const limitQ = baseQ.limit(7); | ||
| ava_1.default('Query.limit sets a limit', (t) => { | ||
| t.deepEqual(stringifyThenParse(limitQ), { | ||
| filter: { path: ['key'], operator: 'startsWith', value: '/games/' }, | ||
| limit: 7, | ||
| }); | ||
| }); | ||
| ava_1.default('Query.limit overrides if current limit > new limit l', (t) => { | ||
| t.deepEqual(stringifyThenParse(limitQ.limit(6)), { | ||
| filter: { path: ['key'], operator: 'startsWith', value: '/games/' }, | ||
| limit: 6, | ||
| }); | ||
| }); | ||
| ava_1.default('Query.limit does nothing if current limit = new limit', (t) => { | ||
| t.deepEqual(stringifyThenParse(limitQ.limit(7)), { | ||
| filter: { path: ['key'], operator: 'startsWith', value: '/games/' }, | ||
| limit: 7, | ||
| }); | ||
| }); | ||
| ava_1.default('Query.limit throws an IllegalArgumentError if increasing current limit', (t) => { | ||
| t.throws(() => limitQ.limit(8), errors_1.IllegalArgumentError); | ||
| }); | ||
| ava_1.default('Query.limit throws an IllegalArgumentError if setting limit to a value less than 1', (t) => { | ||
| t.throws(() => limitQ.limit(0), errors_1.IllegalArgumentError); | ||
| }); | ||
| ava_1.default('Query.skip sets skip', (t) => { | ||
| t.deepEqual(stringifyThenParse(baseQ.skip(3)), { | ||
| filter: { path: ['key'], operator: 'startsWith', value: '/games/' }, | ||
| skip: 3, | ||
| }); | ||
| }); | ||
| ava_1.default('Query.orderBy sets order', (t) => { | ||
| t.deepEqual(stringifyThenParse(baseQ.orderBy(query_1.value.x)), { | ||
| filter: { path: ['key'], operator: 'startsWith', value: '/games/' }, | ||
| orderBy: [{ path: ['value', 'x'], direction: query_1.ASC }], | ||
| }); | ||
| }); | ||
| ava_1.default('Query.orderBy sets DESC order', (t) => { | ||
| t.deepEqual(stringifyThenParse(baseQ.orderBy(query_1.value.x, query_1.DESC)), { | ||
| filter: { path: ['key'], operator: 'startsWith', value: '/games/' }, | ||
| orderBy: [{ path: ['value', 'x'], direction: query_1.DESC }], | ||
| }); | ||
| }); | ||
| ava_1.default('Query.orderBy sets secondary order', (t) => { | ||
| t.deepEqual(stringifyThenParse(baseQ.orderBy(query_1.value.x).orderBy(query_1.key)), { | ||
| filter: { path: ['key'], operator: 'startsWith', value: '/games/' }, | ||
| orderBy: [{ path: ['value', 'x'], direction: query_1.ASC }, { path: ['key'], direction: query_1.ASC }], | ||
| }); | ||
| }); | ||
| ava_1.default('Query.orderBy throws an IllegalArgumentError when ordering by same path twice', (t) => { | ||
| t.throws(() => baseQ.orderBy(query_1.value.x).orderBy(query_1.value.x), errors_1.IllegalArgumentError); | ||
| }); | ||
| //# sourceMappingURL=query.spec.js.map |
| {"version":3,"file":"query.spec.js","sourceRoot":"","sources":["../../src/test/query.spec.ts"],"names":[],"mappings":"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"} |
| export declare class TimeoutError extends Error { | ||
| readonly name = "TimeoutError"; | ||
| } | ||
| export declare const withTimeout: <T>(promise: Promise<T>, timeout?: number) => Promise<T>; | ||
| export declare const noop: () => undefined; | ||
| export declare function deferred<T>(): { | ||
| promise: Promise<T>; | ||
| resolve: (value?: T | PromiseLike<T> | undefined) => void; | ||
| reject: (reason?: any) => void; | ||
| }; | ||
| export declare function hrnano(): number; | ||
| //# sourceMappingURL=utils.d.ts.map |
| {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,qBAAa,YAAa,SAAQ,KAAK;IACrC,SAAgB,IAAI,kBAAkB;CACvC;AAGD,eAAO,MAAM,WAAW,0DAcvB,CAAC;AAEF,eAAO,MAAM,IAAI,iBAAkB,CAAC;AAEpC,wBAAgB,QAAQ,CAAC,CAAC;;;;EAazB;AAID,wBAAgB,MAAM,WAGrB"} |
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| class TimeoutError extends Error { | ||
| constructor() { | ||
| super(...arguments); | ||
| this.name = 'TimeoutError'; | ||
| } | ||
| } | ||
| exports.TimeoutError = TimeoutError; | ||
| // Tests not included since this code is borrowed from a utility library | ||
| exports.withTimeout = async (promise, timeout = 5000) => { | ||
| let handle; | ||
| const timeoutPromise = new Promise((_, reject) => { | ||
| handle = setTimeout(() => reject(new TimeoutError('Timeout')), timeout); | ||
| }); | ||
| try { | ||
| return await Promise.race([ | ||
| promise, | ||
| timeoutPromise, | ||
| ]); | ||
| } | ||
| finally { | ||
| clearTimeout(handle); | ||
| } | ||
| }; | ||
| exports.noop = () => undefined; | ||
| function deferred() { | ||
| // resolve and reject have to be initialized to prevent typescript from complaining that they're uninitialized | ||
| let resolve = exports.noop; | ||
| let reject = exports.noop; | ||
| const promise = new Promise((_resolve, _reject) => { | ||
| resolve = _resolve; | ||
| reject = _reject; | ||
| }); | ||
| return { | ||
| promise, | ||
| resolve, | ||
| reject, | ||
| }; | ||
| } | ||
| exports.deferred = deferred; | ||
| const NS_PER_SEC = 1e9; | ||
| function hrnano() { | ||
| const [a, b] = process.hrtime(); | ||
| return a * NS_PER_SEC + b; | ||
| } | ||
| exports.hrnano = hrnano; | ||
| //# sourceMappingURL=utils.js.map |
| {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;AAAA,MAAa,YAAa,SAAQ,KAAK;IAAvC;;QACkB,SAAI,GAAG,cAAc,CAAC;IACxC,CAAC;CAAA;AAFD,oCAEC;AAED,wEAAwE;AAC3D,QAAA,WAAW,GAAG,KAAK,EAAK,OAAmB,EAAE,UAAkB,IAAI,EAAc,EAAE;IAC9F,IAAI,MAAkC,CAAC;IACvC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QAC/C,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,IAAI;QACF,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;YACxB,OAAO;YACP,cAAc;SACf,CAAe,CAAC;KAClB;YAAS;QACR,YAAY,CAAC,MAAO,CAAC,CAAC;KACvB;AACH,CAAC,CAAC;AAEW,QAAA,IAAI,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC;AAEpC,SAAgB,QAAQ;IACtB,8GAA8G;IAC9G,IAAI,OAAO,GAAqD,YAAI,CAAC;IACrE,IAAI,MAAM,GAA2B,YAAI,CAAC;IAC1C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE;QACnD,OAAO,GAAG,QAAQ,CAAC;QACnB,MAAM,GAAG,OAAO,CAAC;IACnB,CAAC,CAAC,CAAC;IACH,OAAO;QACL,OAAO;QACP,OAAO;QACP,MAAM;KACP,CAAC;AACJ,CAAC;AAbD,4BAaC;AAED,MAAM,UAAU,GAAG,GAAG,CAAC;AAEvB,SAAgB,MAAM;IACpB,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAChC,OAAO,CAAC,GAAG,UAAU,GAAG,CAAC,CAAC;AAC5B,CAAC;AAHD,wBAGC"} |
-21
| MIT License | ||
| Copyright (c) 2018-2019 Binaris, Inc. and its affiliates. | ||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||
| of this software and associated documentation files (the "Software"), to deal | ||
| in the Software without restriction, including without limitation the rights | ||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
| copies of the Software, and to permit persons to whom the Software is | ||
| furnished to do so, subject to the following conditions: | ||
| The above copyright notice and this permission notice shall be included in all | ||
| copies or substantial portions of the Software. | ||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
| SOFTWARE. |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 2 instances in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 3 instances in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Deprecated
MaintenanceThe maintainer of the package marked it as deprecated. This could indicate that a single version should not be used, or that the package is no longer maintained and any new vulnerabilities will not be fixed.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
4
-60%0
-100%43418
-70.09%11
57.14%20
-50%738
-61.26%15
275%4
Infinity%+ Added
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
Updated
Updated