Socket
Socket
Sign inDemoInstall

@cranq/document-utils

Package Overview
Dependencies
Maintainers
5
Versions
11
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@cranq/document-utils - npm Package Compare versions

Comparing version 1.0.4 to 2.0.0

dist/access/appendCollectionMutable.d.ts

4

dist/access/appendCollection.d.ts

@@ -1,4 +0,2 @@

import { NodeGenerator } from "@cranq/tree-utils";
import { Document } from "../types/Document";
import { DocumentStore } from "../types/DocumentStore";
export declare function appendCollection<C extends string, S extends DocumentStore<C, any>, D extends Document>(store: S, collectionId: C, documents: Record<string, D | NodeGenerator<D> | undefined>): void;
export declare function appendCollection<DS extends DocumentStore<any>, C extends keyof DS & string>(store: DS, collectionId: C, documents: DS[C]): DS;

@@ -1,4 +0,3 @@

import { Document } from "../types/Document";
import { DocumentGenerator } from "../types/DocumentGenerator";
import { DocumentStore } from "../types/DocumentStore";
export declare function appendDocument<C extends string, S extends DocumentStore<C, any>, D extends Document>(store: S, collectionId: C, documentId: string | number, document: Partial<D | DocumentGenerator<D>>): void;
export declare function appendDocument<DS extends DocumentStore<any>, C extends keyof DS & string, D extends DS[C][string]>(store: DS, collectionId: C, documentId: string | number, document: Partial<DocumentGenerator<D>>): DS;

@@ -1,3 +0,2 @@

import { Document } from "../types/Document";
import { DocumentStore } from "../types/DocumentStore";
export declare function getDocument<C extends string, S extends DocumentStore<C, any>, D extends Document>(store: S, collectionId: C, documentId: string | number): D | undefined;
export declare function getDocument<DS extends DocumentStore<any>, C extends keyof DS & string>(store: DS, collectionId: C, documentId: string): DS[C][string] | undefined;
import { DocumentStore } from "../types/DocumentStore";
import { Field } from "../types/Field";
export declare function getField<C extends string, S extends DocumentStore<C, any>, F extends Field>(store: S, collectionId: C, documentId: string | number, fieldId: string): F | undefined;
export declare function getField<DS extends DocumentStore<any>, C extends keyof DS & string, F extends keyof DS[C][string] & string>(store: DS, collectionId: C, documentId: string, fieldId: F): DS[C][string][F] | undefined;
import { NodeGenerator } from "@cranq/tree-utils";
import { Document } from "../types/Document";
import { DocumentStore } from "../types/DocumentStore";
export declare function setDocument<C extends string, S extends DocumentStore<C, any>, D extends Document>(store: S, collectionId: C, documentId: string | number, document: D | NodeGenerator<D> | undefined): void;
export declare function setDocument<DS extends DocumentStore<any>, C extends keyof DS & string, D extends DS[C][string]>(store: DS, collectionId: C, documentId: string, document: D | NodeGenerator<D> | undefined): DS;
import { NodeGenerator } from "@cranq/tree-utils";
import { DocumentStore } from "../types/DocumentStore";
import { Field } from "../types/Field";
export declare function setField<C extends string, S extends DocumentStore<C, any>, F extends Field>(store: S, collectionId: C, documentId: string | number, fieldId: string, value: F | NodeGenerator<F> | undefined): void;
export declare function setField<DS extends DocumentStore<any>, C extends keyof DS & string, D extends DS[C][string], F extends keyof D & string>(store: DS, collectionId: C, documentId: string | number, fieldId: F, value: D[F] | NodeGenerator<D[F]> | undefined): DS;
export * from "./access/appendCollection";
export * from "./access/appendCollectionI";
export * from "./access/appendCollectionMutable";
export * from "./access/appendDocument";
export * from "./access/appendDocumentI";
export * from "./access/appendDocumentMutable";
export * from "./access/getDeepDocument";
export * from "./access/getDocument";
export * from "./access/getField";
export * from "./access/resolveTrail";
export * from "./access/setDeepDocument";
export * from "./access/setDeepDocumentMutable";
export * from "./access/setDocument";
export * from "./access/setDocumentI";
export * from "./access/setDocumentMutable";
export * from "./access/setField";
export * from "./access/setFieldI";
export * from "./transform/expandDocumentSubgraph";
export * from "./transform/expandReferenceSubgraph";
export * from "./transform/extractDocumentSubgraph";
export * from "./transform/extractReferenceSubgraph";
export * from "./transform/flattenDeepDocument";
export * from "./types/DeepDocument";
export * from "./types/DeepField";
export * from "./access/setFieldMutable";
export * from "./restore/restoreDocument";
export * from "./restore/restoreField";
export * from "./restore/restoreReference";
export * from "./restore/types/RestoreDocument";
export * from "./restore/types/RestoreField";
export * from "./traverse/traverseDocumentReferences";
export * from "./traverse/traverseFieldReferences";
export * from "./truncate/truncateDocument";
export * from "./truncate/truncateField";
export * from "./truncate/truncateSubDocument";
export * from "./truncate/types/TruncateDocument";
export * from "./truncate/types/TruncateField";
export * from "./types/Document";

@@ -23,7 +30,2 @@ export * from "./types/DocumentCollection";

export * from "./types/DocumentStore";
export * from "./types/Documentify";
export * from "./types/Field";
export * from "./types/Fieldify";
export * from "./types/Reference";
export * from "./types/Schema";
export * from "./types/SchemaStore";

@@ -1,4 +0,3 @@

import { Field } from "./Field";
export interface Document {
[fieldId: string]: Field;
}
export declare type Document<C extends string> = {
__collectionId: C;
};

@@ -0,4 +1,5 @@

import { TruncateDocument } from "../truncate/types/TruncateDocument";
import { Document } from "./Document";
export interface DocumentCollection<D extends Document> {
[documentId: string]: D;
export interface DocumentCollection<D extends Document<any>> {
[__documentId: string]: TruncateDocument<D>;
}

@@ -1,5 +0,4 @@

import { NodeGenerator } from "@cranq/tree-utils";
import { Document } from "./Document";
export declare type DocumentGenerator<D extends Document> = {
[field in keyof D]: D[field] | NodeGenerator<D[field]> | undefined;
export declare type DocumentGenerator<D extends Document<any>> = {
[F in keyof D]: D[F] | ((field: D[F]) => D[F]);
};

@@ -0,4 +1,5 @@

import { Document } from "./Document";
import { DocumentCollection } from "./DocumentCollection";
export declare type DocumentStore<C extends string, V extends DocumentCollection<any>> = {
[collectionId in C]: V;
export declare type DocumentStore<D extends Document<any>> = {
[collectionId in D["__collectionId"]]: DocumentCollection<D extends Document<collectionId> ? D : never>;
};

@@ -1,2 +0,4 @@

import { DeepDocument } from "./DeepDocument";
export declare type Reference = string | DeepDocument;
export declare type Reference<C extends string> = {
__collectionId: C;
__documentId: string;
};
{
"name": "@cranq/document-utils",
"version": "1.0.4",
"version": "2.0.0",
"description": "Document store manipulation utilities",

@@ -5,0 +5,0 @@ "scripts": {

@cranq/document-utils
=====================
=====================
Utilities for manipulating documents in a document store.
Terms
-----
### Document
A *document* is any record (JS object) that has a `__collectionId` property.
Documents may contain other documents, or *references* to documents.
Documents extend the `Document` type.
Example:
```typescript
type Dog = {
__collectionId: "dogs",
name: string;
owner: Person;
};
type Person = {
__collectionId: "people",
name: string;
}
const buddy: Dog = {
__collectionId: "dogs",
name: "Buddy",
owner: { // sub-document
__collectionId: "people",
name: "Jane Doe"
}
}
```
### Reference
A *reference* to a document identifies a document in a *document store*, and is
a record (JS object) with exactly two properties:
References are of the `Reference` type.
* `__collectionId` - same as the collection ID of the referenced document
* `__documentId` - identifies the referenced document in its collection
Example:
```typescript
const buddyRef: Reference<Dog> = {
__collectionId: "dogs",
__documentId: "buddy"
}
```
### Truncated document
A *truncated document* is a document with all its sub-documents replaced with
references.
Truncated documents satisfy the `TruncatedDocument<D>` type,
where `D extends Document`.
Example:
```typescript
const buddyTruncated: TruncateDocument<Dog> = {
__collectionId: "dogs",
name: "Buddy",
owner: { // reference to sub-document
__collectionId: "people",
__documentId: "jane-doe"
}
}
```
### Restored document
A *restored document* is a document restored from a truncated document.
Restored documents are ordinary documents, but their restored types can be
calculated using the `RestoreDocument` generic. `RestoreDocument<TR>`
will be the same as `D`, given that `TR = TruncateDocument<D>`.
### Document collection
A *document collection* is a dictionary (JS object) of truncated documents of
the same collection ID, indexed by their document IDs.
The type of a document collection is based on type of the documents it contains.
Eg: `DocumentCollection<D>`.
Example:
```typescript
const dogs: DocumentCollection<Dog> = {
"buddy": {
__collectionId: "dogs",
name: "Buddy",
owner: {
__collectionId: "people",
__documentId: "jane-doe"
}
}
}
```
### Document store
A *document store* is a dictionary (JS object) of document collections, indexed
by collection IDs.
The type of a document store is based on the types of all the documents it can
store. Eg: `DocumentStore<Dog | Person>`
Example:
```typescript
const documentStore: DocumentStore<Dog | Person> = {
"dogs": {
"buddy": {
__collectionId: "dogs",
name: "Buddy",
owner: {
__collectionId: "people",
__documentId: "jane-doe"
}
}
},
"people": {
"jane-doe": {
__collectionId: "people",
name: "Jane Doe"
}
}
}
```
Common usage
------------
### Retrieving (truncated) document from the store
Example:
```typescript
const buddyTruncated = getDocument(documentStore, "dogs", "buddy");
```
### Retrieving (deep) document from the store
Retrieving a deep document out of the store, when compared to `getDocument()`,
incurs some performance penalty proportional to the complexity of the document
being retrieved, as it needs to be assembled on the fly.
Example:
```typescript
const buddy = getDeepDocument(documentStore, "dogs", "buddy");
```
### Retrieving field from the store
Example:
```typescript
const buddyName = getField(documentStore, "dogs", "buddy", "name");
```
### Writing (truncated) document to the store
Example:
```typescript
documentStore = setDocument(documentStore, "dogs", "buddy", {
__collectionId: "dogs",
name: "Buddy",
owner: {
__collectionId: "people",
__documentId: "jane-doe"
}
})
```
A mutable version exists for `setDocument()`, with identical arguments,
and `void` return type: `setDocumentMutable()`.
### Appending (truncated) document in the store
Appending a document changes the value of specified field, leaving other fields
unaffected. Fields values may be specified either as a value, or as a function -
receiving current value and returning new value.
Example:
```typescript
documentStore = appendDocument(documentStore, "dogs", "buddy", {
name: "Fido"
})
documentStore = appendDocument(documentStore, "people", "jane.doe", {
name: (name) => `${name} Jr.`
})
```
A mutable version exists for `appendDocument()`, with identical arguments,
and `void` return type: `appendDocumentMutable()`.
### Writing (deep) document to the store
Writing a deep document into the store, when compared to `setDocument()`, incurs
some performance penalty proportional to the complexity of the document being
written, as it needs to be broken down on the fly.
Example:
```typescript
documentStore = setDeepDocument(documentStore, "dogs", "buddy", {
__collectionId: "dogs",
name: "Buddy",
owner: {
__collectionId: "people",
name: "Jane Doe"
}
})
```
A mutable version exists for `setDeepDocument()`, with identical arguments,
and `void` return type: `setDeepDocumentMutable()`.

@@ -1,11 +0,10 @@

import {appendNode, NodeGenerator} from "@cranq/tree-utils";
import {Document} from "../types/Document";
import {appendNodeI} from "@cranq/tree-utils";
import {DocumentStore} from "../types/DocumentStore";
export function appendCollection<C extends string, S extends DocumentStore<C, any>, D extends Document>(
store: S,
export function appendCollection<DS extends DocumentStore<any>, C extends keyof DS & string>(
store: DS,
collectionId: C,
documents: Record<string, D | NodeGenerator<D> | undefined>
): void {
appendNode(store, [collectionId], documents);
documents: DS[C]
): DS {
return appendNodeI(store, [collectionId], documents);
}

@@ -1,3 +0,2 @@

import {appendNode} from "@cranq/tree-utils";
import {Document} from "../types/Document";
import {appendNodeI, NodeGenerator} from "@cranq/tree-utils";
import {DocumentGenerator} from "../types/DocumentGenerator";

@@ -7,3 +6,3 @@ import {DocumentStore} from "../types/DocumentStore";

/**
* Appends document in the store with new field values.
* Appends document in the store with new field values immutably.
* @param store Document store container

@@ -14,11 +13,12 @@ * @param collectionId Identifies document collection

*/
export function appendDocument<C extends string, S extends DocumentStore<C, any>, D extends Document>(
store: S,
export function appendDocument<DS extends DocumentStore<any>, C extends keyof DS & string, D extends DS[C][string]>(
store: DS,
collectionId: C,
documentId: string | number,
document: Partial<D | DocumentGenerator<D>>
): void {
// FIXME: The type cast shouldn't be necessary.
// Some subtle TS issue is going on here.
appendNode(store, [collectionId, documentId], document as any);
document: Partial<DocumentGenerator<D>>
): DS {
return appendNodeI(
store,
[collectionId, documentId],
document as Record<any, NodeGenerator<D[keyof D]>>);
}

@@ -0,9 +1,30 @@

import {DocumentStore} from "../types/DocumentStore";
import {getDocument} from "./getDocument";
describe("getDocument()", () => {
const document = {};
const store = {
type FooDocument = {
__collectionId: "foo",
foo: string
}
type BarDocument = {
__collectionId: "bar",
bar: number,
foo: FooDocument
}
const documentStore: DocumentStore<FooDocument | BarDocument> = {
foo: {
1: document,
2: {}
"a": {
__collectionId: "foo",
foo: "a"
}
},
bar: {
"b": {
__collectionId: "bar",
bar: 1,
foo: {
__collectionId: "foo",
__documentId: "a"
}
}
}

@@ -13,5 +34,17 @@ };

it("should retrieve document", () => {
const result = getDocument(store, "foo", 1);
expect(result).toBe(document);
const result = getDocument(
documentStore, "foo", "a");
expect(result).toEqual({
__collectionId: "foo",
foo: "a"
});
});
describe("for absent document", () => {
it("should return undefined", () => {
const result = getDocument(
documentStore, "foo", "b");
expect(result).toBeUndefined();
});
});
});
import {getNode} from "@cranq/tree-utils";
import {Document} from "../types/Document";
import {DocumentStore} from "../types/DocumentStore";

@@ -11,8 +10,8 @@

*/
export function getDocument<C extends string, S extends DocumentStore<C, any>, D extends Document>(
store: S,
export function getDocument<DS extends DocumentStore<any>, C extends keyof DS & string>(
store: DS,
collectionId: C,
documentId: string | number
): D | undefined {
documentId: string
): DS[C][string] | undefined {
return getNode(store, [collectionId, documentId]);
}

@@ -0,14 +1,30 @@

import {DocumentStore} from "../types/DocumentStore";
import {getField} from "./getField";
describe("getField()", () => {
const store = {
type FooDocument = {
__collectionId: "foo",
foo: string
}
type BarDocument = {
__collectionId: "bar",
bar: number,
foo: FooDocument
}
const documentStore: DocumentStore<FooDocument | BarDocument> = {
foo: {
1: {
bar: "a",
baz: "b"
},
2: {
bar: "c",
baz: "d"
"a": {
__collectionId: "foo",
foo: "a"
}
},
bar: {
"b": {
__collectionId: "bar",
bar: 1,
foo: {
__collectionId: "foo",
__documentId: "a"
}
}
}

@@ -18,5 +34,5 @@ };

it("should retrieve field", () => {
const result = getField(store, "foo", 1, "bar");
const result = getField(documentStore, "foo", "a", "foo");
expect(result).toBe("a");
});
});
import {getNode} from "@cranq/tree-utils";
import {DocumentStore} from "../types/DocumentStore";
import {Field} from "../types/Field";

@@ -12,10 +11,9 @@ /**

*/
export function getField<C extends string, S extends DocumentStore<C, any>, F extends Field>(
store: S,
export function getField<DS extends DocumentStore<any>, C extends keyof DS & string, F extends keyof DS[C][string] & string>(
store: DS,
collectionId: C,
documentId: string | number,
fieldId: string
): F | undefined {
const path = [collectionId, documentId, fieldId];
return getNode(store, path);
documentId: string,
fieldId: F
): DS[C][string][F] | undefined {
return getNode(store, [collectionId, documentId, fieldId]);
}

@@ -1,7 +0,6 @@

import {NodeGenerator, setNode} from "@cranq/tree-utils";
import {Document} from "../types/Document";
import {NodeGenerator, setNodeI} from "@cranq/tree-utils";
import {DocumentStore} from "../types/DocumentStore";
/**
* Sets document in the store.
* Sets document in store immutably.
* @param store Document store container

@@ -12,9 +11,9 @@ * @param collectionId Identifies document collection

*/
export function setDocument<C extends string, S extends DocumentStore<C, any>, D extends Document>(
store: S,
export function setDocument<DS extends DocumentStore<any>, C extends keyof DS & string, D extends DS[C][string]>(
store: DS,
collectionId: C,
documentId: string | number,
documentId: string,
document: D | NodeGenerator<D> | undefined
): void {
setNode(store, [collectionId, documentId], document);
): DS {
return setNodeI(store, [collectionId, documentId], document);
}

@@ -1,7 +0,6 @@

import {NodeGenerator, setNode} from "@cranq/tree-utils";
import {NodeGenerator, setNodeI} from "@cranq/tree-utils";
import {DocumentStore} from "../types/DocumentStore";
import {Field} from "../types/Field";
/**
* Sets field value in the store.
* Sets field value in the store immutably.
* @param store Document store container

@@ -13,10 +12,10 @@ * @param collectionId Identifies document collection

*/
export function setField<C extends string, S extends DocumentStore<C, any>, F extends Field>(
store: S,
export function setField<DS extends DocumentStore<any>, C extends keyof DS & string, D extends DS[C][string], F extends keyof D & string>(
store: DS,
collectionId: C,
documentId: string | number,
fieldId: string,
value: F | NodeGenerator<F> | undefined
): void {
setNode(store, [collectionId, documentId, fieldId], value);
fieldId: F,
value: D[F] | NodeGenerator<D[F]> | undefined
): DS {
return setNodeI(store, [collectionId, documentId, fieldId], value);
}
export * from "./access/appendCollection";
export * from "./access/appendCollectionI";
export * from "./access/appendCollectionMutable";
export * from "./access/appendDocument";
export * from "./access/appendDocumentI";
export * from "./access/appendDocumentMutable";
export * from "./access/getDeepDocument";
export * from "./access/getDocument";
export * from "./access/getField";
export * from "./access/resolveTrail";
export * from "./access/setDeepDocument";
export * from "./access/setDeepDocumentMutable";
export * from "./access/setDocument";
export * from "./access/setDocumentI";
export * from "./access/setDocumentMutable";
export * from "./access/setField";
export * from "./access/setFieldI";
export * from "./transform/expandDocumentSubgraph";
export * from "./transform/expandReferenceSubgraph";
export * from "./transform/extractDocumentSubgraph";
export * from "./transform/extractReferenceSubgraph";
export * from "./transform/flattenDeepDocument";
export * from "./types/DeepDocument";
export * from "./types/DeepField";
export * from "./access/setFieldMutable";
export * from "./restore/restoreDocument";
export * from "./restore/restoreField";
export * from "./restore/restoreReference";
export * from "./restore/types/RestoreDocument";
export * from "./restore/types/RestoreField";
export * from "./traverse/traverseDocumentReferences";
export * from "./traverse/traverseFieldReferences";
export * from "./truncate/truncateDocument";
export * from "./truncate/truncateField";
export * from "./truncate/truncateSubDocument";
export * from "./truncate/types/TruncateDocument";
export * from "./truncate/types/TruncateField";
export * from "./types/Document";

@@ -23,7 +30,2 @@ export * from "./types/DocumentCollection";

export * from "./types/DocumentStore";
export * from "./types/Documentify";
export * from "./types/Field";
export * from "./types/Fieldify";
export * from "./types/Reference";
export * from "./types/Schema";
export * from "./types/SchemaStore";

@@ -1,5 +0,6 @@

import {Field} from "./Field";
export interface Document {
[fieldId: string]: Field;
/**
* Describes a kind of document.
*/
export type Document<C extends string> = {
__collectionId: C;
}

@@ -0,5 +1,9 @@

import {TruncateDocument} from "../truncate/types/TruncateDocument";
import {Document} from "./Document";
export interface DocumentCollection<D extends Document> {
[documentId: string]: D;
/**
* Describes a collection of a certain kind of document.
*/
export interface DocumentCollection<D extends Document<any>> {
[__documentId: string]: TruncateDocument<D>;
}

@@ -1,6 +0,5 @@

import {NodeGenerator} from "@cranq/tree-utils";
import {Document} from "./Document";
export type DocumentGenerator<D extends Document> = {
[field in keyof D]: D[field] | NodeGenerator<D[field]> | undefined;
};
export type DocumentGenerator<D extends Document<any>> = {
[F in keyof D]: D[F] | ((field: D[F]) => D[F]);
}

@@ -0,5 +1,10 @@

import {Document} from "./Document";
import {DocumentCollection} from "./DocumentCollection";
export type DocumentStore<C extends string, V extends DocumentCollection<any>> = {
[collectionId in C]: V;
/**
* Describes a set of document collections, based on a set of document types.
*/
export type DocumentStore<D extends Document<any>> = {
[collectionId in D["__collectionId"]]:
DocumentCollection<D extends Document<collectionId> ? D : never>;
}

@@ -1,6 +0,7 @@

import {DeepDocument} from "./DeepDocument";
/**
* Refers to (or is) a deep document.
* Identifies a document in the store.
*/
export type Reference = string | DeepDocument;
export type Reference<C extends string> = {
__collectionId: C;
__documentId: string;
};

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc