@cranq/document-utils
Advanced tools
Comparing version 1.0.4 to 2.0.0
@@ -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": { |
229
README.md
@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
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
254165
97
3927
230