Skip to content

Commit 8ee74e2

Browse files
authored
Documentation work (#93)
* start work on more docs md pages * created colls/tables datatype cheatsheet * did collections dts * readme work * ran npm audit fix * minor tweaks to DATATYPES.md * bnunch of tsdoc for create-table related types * tsdoc for DataAPILoggingDefaults * update examples to use @next version of astra-db-ts * documented list-tables
1 parent 60e616f commit 8ee74e2

28 files changed

+1594
-416
lines changed

README.md

Lines changed: 43 additions & 144 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,16 @@
55
> **Warning**
66
> This README is still under construction; parts of it may be incomplete or outdated.
77
8-
*This README targets v2.0.0+, which introduces a whole new API. Click [here](https://github.com/datastax/astra-db-ts/tree/v1.x?tab=readme-ov-file#datastaxastra-db-ts) for the pre-existing client readme.*
8+
*This README targets v2.0.0+, which expands on the previous 1.x API. Click [here](https://github.com/datastax/astra-db-ts/tree/v1.x?tab=readme-ov-file#datastaxastra-db-ts) for the pre-existing client readme.*
99

1010
## Table of contents
1111
- [Quickstart](#quickstart)
1212
- [Collections](#collections)
1313
- [Tables](#tables)
1414
- [High-level architecture](#high-level-architecture)
15-
- [Getting the most out of the typing](#getting-the-most-out-of-the-typing)
16-
- [Working with Dates](#working-with-dates)
17-
- [Working with ObjectIds and UUIDs](#working-with-objectids-and-uuids)
18-
- [Monitoring/logging](#monitoringlogging)
19-
- [Non-astra support](#non-astra-support)
15+
- [Options hierarchy](#options-hierarchy)
16+
- [Datatypes](#datatypes)
17+
[Non-astra support](#non-astra-support)
2018
- [Non-standard environment support](#non-standard-environment-support)
2119
- [HTTP/2 with minification](#http2-with-minification)
2220
- [Browser support](#browser-support)
@@ -70,9 +68,9 @@ interface Dream extends VectorDoc {
7068

7169
// Let's see what we've got
7270
const cursor = collection.find({})
73-
.sort({ vector: vector([0, 0.2, 0.4]) }) // Performing a vector search
74-
.includeSimilarity(true) // The found doc is inferred to have `$similarity` as a property now
75-
.limit(2);
71+
.sort({ vector: vector([0, 0.2, 0.4]) }) // Performing a vector search
72+
.includeSimilarity(true) // The found doc is inferred to have `$similarity` as a property now
73+
.limit(2);
7674

7775
// This would print:
7876
// - Surfers' paradise: 0.98238194
@@ -113,11 +111,11 @@ const mkDreamsTable = async () => await db.createTable('dreams', {
113111

114112
// Infer the TS-equivalent type from the table definition (like zod or arktype). Equivalent to:
115113
//
116-
// interface TableSchema extends Row<'id'> {
117-
// id: number, -- A primary key component, so it's required
118-
// summary?: string | null, -- Not a primary key, so it's optional and may return as null when found
119-
// tags?: Set<string>, -- Sets/maps/lists are optional to insert, but will actually be returned as empty collections instead of null
120-
// vector?: DataAPIVector | null, -- Vectors, however, may be null.
114+
// interface TableSchema {
115+
// id: number, -- A primary key component, so it's required
116+
// summary?: string | null, -- Not a primary key, so it's optional and may return as null when found
117+
// tags?: Set<string>, -- Sets/maps/lists are optional to insert, but will actually be returned as empty collections instead of null
118+
// vector?: DataAPIVector | null, -- Vectors, however, may be null.
121119
// }
122120
type Dream = InferTableSchema<typeof mkDreamsTable>;
123121

@@ -181,7 +179,23 @@ type Dream = InferTableSchema<typeof mkDreamsTable>;
181179

182180
`astra-db-ts`'s abstractions for working at the data and admin layers are structured as depicted by this diagram:
183181

184-
![Class hierarchy diagram](etc/imgs/class-hierarchy.png)
182+
```mermaid
183+
flowchart TD
184+
DataAPIClient -->|".db(endpoint)"| Db
185+
DataAPIClient -->|".admin()"| AstraAdmin
186+
187+
Db --->|".collection(name)
188+
.createCollection(name)"| Collection
189+
190+
Db --->|".table(name)
191+
.createTable(name)"| Table
192+
193+
AstraAdmin -->|".dbAdmin(endpoint)
194+
.dbAdmin(id, region)"| DbAdmin
195+
196+
Db -->|".admin()"| DbAdmin
197+
DbAdmin -->|".db()"| Db
198+
```
185199

186200
Here's a small admin-oriented example:
187201

@@ -204,139 +218,23 @@ const admin = client.admin();
204218
})();
205219
```
206220

207-
## Getting the most out of the typing
208-
209-
`astra-db-ts` is a typescript-first library, performing minimal runtime type-checking. As such, it provides
210-
a rich set of types to help you write type-safe code.
211-
212-
Here are some examples of how you can properly leverage types to make your code more robust:
213-
214-
```typescript
215-
// First of all:
216-
// I *highly* recommend writing your query objects & filter objects and such inline with the methods
217-
// to get the best possible type-checking and autocomplete
218-
219-
import { DataAPIClient, StrictFilter, StrictSort, UUID } from '@datastax/astra-db-ts';
220-
221-
const client = new DataAPIClient('*TOKEN*');
222-
const db = client.db('*ENDPOINT*', { namespace: '*NAMESPACE*' });
223-
224-
// You can strictly type your collections for proper type-checking
225-
interface Person {
226-
_id: UUID,
227-
name: string,
228-
interests: {
229-
favoriteBand?: string,
230-
friend?: UUID,
231-
}
232-
}
233-
234-
(async () => {
235-
// Create your collections with a defaultId type to enforce the type of the _id field
236-
// (Otherwise it'll default to a string UUID that wouldn't be deserialized as a UUID by the client)
237-
const collection = await db.createCollection<Person>('my_collection', { defaultId: { type: 'uuidv7' } });
238-
239-
// Now it'll raise type-errors if you try to insert a document with the wrong shape
240-
await collection.insertOne({
241-
_id: new UUID('e7f1f3a0-7e3d-11eb-9439-0242ac130002'),
242-
name: 'John',
243-
interests: {
244-
favoriteBand: 'Nightwish',
245-
},
246-
// @ts-expect-error - 'eyeColor' does not exist in type MaybeId<Person>
247-
eyeColor: 'blue',
248-
});
249-
})();
250-
```
251-
252-
## Working with Dates
253-
254-
Native JS `Date` objects can be used anywhere in documents to represent dates and times.
221+
### Options hierarchy
255222

256-
Document fields stored using the `{ $date: number }` will also be returned as Date objects when read.
223+
Like the client hierarchy, the options for each class also exist in a hierarchy.
257224

258-
```typescript
259-
import { DataAPIClient } from '@datastax/astra-db-ts';
260-
261-
// Reference an untyped collections
262-
const client = new DataAPIClient('*TOKEN*');
263-
const db = client.db('*ENDPOINT*', { namespace: '*NAMESPACE*' });
225+
The general options for parent classes are deeply merged with the options for child classes.
264226

265-
(async () => {
266-
const collection = await db.createCollection('dates_test');
267-
268-
// Insert documents with some dates
269-
await collection.insertOne({ dateOfBirth: new Date(1394104654000) });
270-
await collection.insertOne({ dateOfBirth: new Date('1863-05-28') });
271-
272-
// Update a document with a date and setting lastModified to now
273-
await collection.updateOne(
274-
{
275-
dateOfBirth: new Date('1863-05-28'),
276-
},
277-
{
278-
$set: { message: 'Happy Birthday!' },
279-
$currentDate: { lastModified: true },
280-
},
281-
);
282-
283-
// Will print *around* `new Date()` (i.e. when server processed the request)
284-
const found = await collection.findOne({ dateOfBirth: { $lt: new Date('1900-01-01') } });
285-
console.log(found?.lastModified);
286-
287-
// Cleanup (if desired)
288-
await collection.drop();
289-
})();
227+
```mermaid
228+
graph TD
229+
DataAPIClientOptions --> AdminOptions
230+
DataAPIClientOptions --> DbOptions
231+
DbOptions --> CollectionOptions
232+
DbOptions --> TableOptions
290233
```
291234

292-
## Working with ObjectIds and UUIDs
293-
294-
`astra-db-ts` exports an `ObjectId` and `UUID` class for working with these types in the database.
295-
296-
Note that these are custom classes, and *not* the ones from the `bson` package. Make sure you're using the right one!
235+
## Datatypes
297236

298-
```typescript
299-
import { DataAPIClient, ObjectId, UUID } from '@datastax/astra-db-ts';
300-
301-
interface Person {
302-
_id: ObjectId | UUID,
303-
name: string,
304-
friendId?: ObjectId | UUID,
305-
}
306-
307-
// Connect to the db
308-
const client = new DataAPIClient('*TOKEN*');
309-
const db = client.db('*ENDPOINT*', { namespace: '*NAMESPACE*' });
310-
311-
(async () => {
312-
// Create a collections with a UUIDv7 as the default ID
313-
const collection = await db.createCollection<Person>('ids_test', { defaultId: { type: 'uuidv7' } });
314-
315-
// You can manually set whatever ID you want
316-
await collection.insertOne({ _id: new ObjectId("65fd9b52d7fabba03349d013"), name: 'John' });
317-
318-
// Or use the default ID
319-
await collection.insertOne({ name: 'Jane' });
320-
321-
// Let's give Jane a friend with a UUIDv4
322-
const friendId = UUID.v4();
323-
324-
await collection.insertOne({ name: 'Alice', _id: friendId });
325-
326-
await collection.updateOne(
327-
{ name: 'Jane' },
328-
{ $set: { friendId } },
329-
);
330-
331-
// And let's get Jane as a document
332-
// (Prints "Jane", the generated UUIDv4, and true)
333-
const jane = await collection.findOne({ name: 'Jane' });
334-
console.log(jane?.name, jane?.friendId?.toString(), friendId.equals(jane?.friendId));
335-
336-
// Cleanup (if desired)
337-
await collection.drop();
338-
})();
339-
```
237+
See [DATATYPES.md](etc/docs/DATATYPES.md) for a full list of supported datatypes and their TypeScript equivalents.
340238

341239
## Non-astra support
342240

@@ -354,8 +252,9 @@ const db = client.db('*ENDPOINT*');
354252

355253
// You'll also need to pass it to db.admin() when not using Astra for typing purposes
356254
// If the environment does not match, an error will be thrown as a reminder
357-
const dbAdmin: DataAPIDbAdmin = db.admin({ environment: 'dse' });
358-
dbAdmin.createNamespace(...);
255+
// `environment: 'dse'` makes the return type be `DataAPIDbAdmin`
256+
const dbAdmin = db.admin({ environment: 'dse' });
257+
dbAdmin.createNamespace('...');
359258
```
360259

361260
The `TokenProvider` class is an extensible concept to allow you to create or even refresh your tokens

0 commit comments

Comments
 (0)